ETH Price: $2,423.40 (+0.08%)

Token

Bucks (BUX)
 

Overview

Max Total Supply

10,000,000 BUX

Holders

48

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
0.000000001 BUX

Value
$0.00
0x0ac14bb1f643b1f332bef7b4d73e83c52fef1fe7
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:
BUX

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-10-23
*/

/**
Bucks $BUX

Token where you hold and get USDT rewards from 0/25 all $USDT rewards

Buy in on 0 tax and hold to get passive income from the people selling into the 25% reflections tax.

Website: bucks.lol
TG: @BucksERC
Twitter: twitter.com/bux_erc20

*/



// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
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;
    }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
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);
}

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
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 9;
    }

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

        /*
            _tokengeneration is an internal function in ERC20.sol that is only called here to generate the total supply first time,
            and CANNOT be called ever again
        */
    function _tokengeneration(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: new tokens 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);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

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

/**
 * @title SafeMathInt
 * @dev Math operations for int256 with overflow safety checks.
 */
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);
    }
}

/**
 * @title SafeMathUint
 * @dev Math operations with safety checks that revert on error
 */
library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return 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;
    }
}

interface IPair {
    function sync() external;
}

interface IFactory{
        function createPair(address tokenA, address tokenB) external returns (address pair);
        function getPair(address tokenA, address tokenB) external view returns (address pair);
}

interface IRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

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

/// @title Dividend-Paying Token Interface
/// @author Roger Wu (https://github.com/roger-wu)
/// @dev An interface for a dividend-paying token contract.
interface DividendPayingTokenInterface {
  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function dividendOf(address _owner) external view returns(uint256);
  
  function distributeDividends() external payable;
  
  /// @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);


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

contract DividendPayingToken is ERC20, DividendPayingTokenInterface, 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;

  IRouter public router;
  address public rewardToken;

  uint256 internal magnifiedDividendPerShare;

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

  uint256 public totalDividendsDistributed;

  constructor(string memory _name, string memory _symbol)  ERC20(_name, _symbol) {
      IRouter _router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
      router = _router;
      rewardToken = 0xdAC17F958D2ee523a2206206994597C13D831ec7; //usdt 0xdAC17F958D2ee523a2206206994597C13D831ec7;
  }

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

     function distributeDividends() public override payable {
      require(totalSupply() > 0);

      if (msg.value > 0) {
        magnifiedDividendPerShare = magnifiedDividendPerShare.add(
          (msg.value).mul(magnitude) / totalSupply()
        );
        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 _withdrawDividendOfUser(address payable user) internal returns (uint256) {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
            emit DividendWithdrawn(user, _withdrawableDividend);
            if(rewardToken != router.WETH()){
                (bool success) = swapBnbForCustomToken(user, _withdrawableDividend);
                if(!success) {
                    (bool secondSuccess,) = user.call{value: _withdrawableDividend, gas: 3000}("");
                    if(!secondSuccess) {
                        withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
                        return 0;
                    }       
                }
            }
            else{
                (bool success,) = user.call{value: _withdrawableDividend, gas: 3000}("");
                if(!success) {
                    withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
                    return 0;
                }
            }
            return _withdrawableDividend;
        }
        return 0;
    }
    
    function setRewardToken(address newToken) external onlyOwner{
        rewardToken = newToken;
    }
  
    function swapBnbForCustomToken(address user, uint256 amt) internal returns (bool) {
          address[] memory path = new address[](2);
          path[0] = router.WETH();
          path[1] = rewardToken;

          try router.swapExactETHForTokens{value: amt}(0, path, user, block.timestamp + 2){
            return true;
        } catch {
            return false;
        }
    }

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

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

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


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

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

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

    /// 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 _tokengeneration(address account, uint256 value) internal override {
      super._tokengeneration(account, value);

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

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

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

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

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

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

library Address {
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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

contract BUX is ERC20, Ownable {
    using Address for address payable;
    IRouter private  router;
    address private  pair;
    bool private swapping;
    bool private  swapEnabled = true;
    bool public tradingEnabled = false;
    uint256 private  startTradingBlock;
    BUX_DividendTracker public dividendTracker;
    
    address public constant deadWallet = 0x000000000000000000000000000000000000dEaD;
    address private marketingWallet = 0x9140E96E64736fc40aDaAe03bDAc75045F8C4189;
    uint256 private swapTokensAtAmount = 2e5 * 10**9;
    uint256 public maxWalletBalance = 2e5 * 10**9;
    uint256 private maxBuyAmount = 2e5 * 10**9;
    uint256 private maxSellAmount = 2e5 * 10**9;
   
    string private currentRewardToken;

    struct Taxes {
        uint256 rewards;
        uint256 marketing;
        uint256 liquidity;
    }

    Taxes public buyTaxes = Taxes(0, 25, 0);
    Taxes public sellTaxes = Taxes(25, 0, 0);

    uint256 public gasForProcessing = 300000;
    uint256 private antiBotBlocks = 0;
    uint256 private launchtax = 25;
    
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public automatedMarketMakerPairs;

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event SendDividends(uint256 tokensSwapped, uint256 amount);
    event ProcessedDividendTracker(
        uint256 iterations,
        uint256 claims,
        uint256 lastProcessedIndex,
        bool indexed automatic,
        uint256 gas,
        address indexed processor
    );

    constructor() ERC20("Bucks", "BUX") {
        dividendTracker = new  BUX_DividendTracker();
        IRouter _router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        address _pair = IFactory(_router.factory()).createPair(address(this), _router.WETH());
        router = _router;
        pair = _pair;

        _setAutomatedMarketMakerPair(_pair, true);

        dividendTracker.excludeFromDividends(address(dividendTracker), true);
        dividendTracker.excludeFromDividends(address(this), true);
        dividendTracker.excludeFromDividends(owner(), true);
        dividendTracker.excludeFromDividends(deadWallet, true);
        dividendTracker.excludeFromDividends(address(_router), true);

        excludeFromFees(owner(), true);
        excludeFromFees(marketingWallet, true);
        excludeFromFees(address(this), true);

        _tokengeneration(owner(), 10000000 * (10**9));
    }

    receive() external payable {}

    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 rescueERC20Tokens(address tokenAddress) external onlyOwner {
        require(tokenAddress != address(this), "Owner can't claim contract's balance of its own tokens");
        IERC20(tokenAddress).transfer(marketingWallet,IERC20(tokenAddress).balanceOf(address(this)));
    }

    function rescueETH() external {
        uint256 ETHbalance = address(this).balance;
        payable(marketingWallet).sendValue(ETHbalance);
    }

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

        emit ExcludeFromFees(account, excluded);
    }

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

    /// @dev "true" to exlcude, "false" to include
    function excludeFromDividends(address account, bool value) external onlyOwner {
        dividendTracker.excludeFromDividends(account, value);
    }

    function setMaxTx(uint256 maxBuy, uint256 maxSell, uint256 maxWallet) external onlyOwner {
        require(maxBuy >= 1e4, "Cannot set max Buy amount lower than 0.1%");
        require(maxSell >= 1e4, "Cannot set max Sell amount lower than 0.1%");
        require(maxWallet >= 1e4, "Cannot set maxWallet lower than 0.1%");
        maxBuyAmount = maxBuy * 10**decimals();
        maxSellAmount = maxSell * 10**decimals();
        maxWalletBalance = maxWallet * 10**decimals();
     }

     function removeTxLimit() external onlyOwner{
        maxBuyAmount = 1e7 * 10**decimals();
        maxSellAmount = 1e7 * 10**decimals();
        maxWalletBalance = 1e7 * 10**decimals();
     }
    
    function setMarketinWallet(address newWallet) external onlyOwner {
        require(newWallet != address(this), "Fee Address cannot be Contract Address");
        require(newWallet != address(0),"Fee Address cannot be zero address");
        marketingWallet = newWallet;
       excludeFromFees(newWallet, true);
    }

    function setSwapTokensAtAmount(uint256 amount) external onlyOwner {
        require(amount >= 1e2, "amount must be greater than or equal to 0.001%");
        swapTokensAtAmount = amount * 10**9;
    }

    function setBuyTaxes(uint256 _rewards, uint256 marketing, uint256 _liquidity) external onlyOwner{
        buyTaxes = Taxes(_rewards, marketing, _liquidity);
        require((_rewards + marketing +  _liquidity ) <= 40, "Must keep fees at 40% or less");
    }

    function setSellTaxes(uint256 _rewards, uint256 marketing, uint256 _liquidity) external onlyOwner{
        sellTaxes = Taxes(_rewards, marketing, _liquidity);
        require((_rewards + marketing +  _liquidity ) <= 40, "Must keep fees at 40% or less");
    }

    function setSwapEnabled(bool _enabled) external onlyOwner {
        swapEnabled = _enabled;
    }    

    function enableTradingEnabled() external onlyOwner {
        require(!tradingEnabled, "Trading is already enabled");
        tradingEnabled = true;
        startTradingBlock = block.number;
    }

    function setMinBalanceForDividends(uint256 amount) external onlyOwner {
        dividendTracker.setMinBalanceForDividends(amount);
    }

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

        if (value) {
            dividendTracker.excludeFromDividends(newPair, true);
        }

        emit SetAutomatedMarketMakerPair(newPair, value);
    }

    /// @notice Update the gasForProcessing needed to auto-distribute rewards
    /// @param newValue The new amount of gas needed
    /// @dev The amount should not be greater than 500k to avoid expensive transactions
    function setGasForProcessing(uint256 newValue) external 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;
    }

    /// @dev Update the dividendTracker claimWait
    function setClaimWait(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 getCurrentRewardToken() external view returns (string memory) {
        return dividendTracker.getCurrentRewardToken();
    }

    function dividendTokenBalanceOf(address account) public view returns (uint256) {
        return dividendTracker.balanceOf(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 getLastProcessedIndex() external view returns (uint256) {
        return dividendTracker.getLastProcessedIndex();
    }

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

    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 (!_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
                require(tradingEnabled, "Trading no active");
        }
       
        if (!automatedMarketMakerPairs[to] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
                require( balanceOf(to) + (amount) <= maxWalletBalance,"Balance is exceeding maxWalletBalance" );
        }
             
        if (automatedMarketMakerPairs[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
                require(amount <= maxBuyAmount, "You are exceeding maxBuyAmount");
        }
            
        if (!automatedMarketMakerPairs[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
                require(amount <= maxSellAmount, "You are exceeding maxSellAmount");
        }
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;
        uint256 swapTax = sellTaxes.rewards +
            sellTaxes.marketing +
            sellTaxes.liquidity ;

        if (
            canSwap &&
            !swapping &&
            swapEnabled &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;

            if (swapTax > 0) {
                swapAndLiquify(swapTokensAtAmount, swapTax);
            }

            swapping = false;
        }

        bool takeFee = !swapping;

        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
            if (takeFee) {
            bool useLaunchFee = block.number <= startTradingBlock + antiBotBlocks;
            uint256 swapAmt;
            
            if (automatedMarketMakerPairs[to] && !useLaunchFee) {
                swapAmt = (amount * swapTax) / 100;
            
            } else if (automatedMarketMakerPairs[from] && !useLaunchFee) {
                swapAmt =
                    (amount *
                        (buyTaxes.rewards +
                            buyTaxes.marketing +
                            buyTaxes.liquidity )) / 100;
            
            } else if (useLaunchFee) {
                swapAmt = (amount * launchtax) / 100; 
            }
            
            amount = amount - (swapAmt);
            super._transfer(from, address(this), swapAmt);
        }
        
        super._transfer(from, to, amount);
        
        try dividendTracker.setBalance(from, balanceOf(from)) {} catch {}
        try dividendTracker.setBalance(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 swapAndLiquify(uint256 tokens, uint256 swapTax) private {
        uint256 denominator = swapTax * 2;
        uint256 tokensToAddLiquidityWith = (tokens * sellTaxes.liquidity) / denominator;
        uint256 toSwap = tokens - tokensToAddLiquidityWith;
        uint256 initialBalance = address(this).balance;
        swapTokensForBNB(toSwap);
        uint256 deltaBalance = address(this).balance - initialBalance;
        uint256 unitBalance = deltaBalance / (denominator - sellTaxes.liquidity);
        uint256 bnbToAddLiquidityWith = unitBalance * sellTaxes.liquidity;
        if (bnbToAddLiquidityWith > 0) {
            addLiquidity(tokensToAddLiquidityWith, bnbToAddLiquidityWith);
        }
        uint256 marketingWalletAmt = unitBalance * 2 * sellTaxes.marketing;
        if (marketingWalletAmt > 0) {
            payable(marketingWallet).sendValue(marketingWalletAmt);
        }
        uint256 dividends = unitBalance * 2 * sellTaxes.rewards;
        if (dividends > 0) {
            (bool success, ) = address(dividendTracker).call{ value: dividends }("");
            if (success) emit SendDividends(tokens, dividends);
        }
    }

    function swapTokensForBNB(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        _approve(address(this), address(router), tokenAmount);
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

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

contract BUX_DividendTracker is Ownable, DividendPayingToken {
    using SafeMath for uint256;
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping(address => bool) public excludedFromDividends;

    mapping(address => uint256) public lastClaimTimes;

    uint256 public claimWait;
    uint256 public minimumTokenBalanceForDividends;

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

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

    constructor()
        DividendPayingToken("BUX_Dividend_Tracker", "BUX_Dividend_Tracker")
    {
        claimWait = 3600;
        minimumTokenBalanceForDividends = 1e3 * (10**decimals());
    }

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

    function setMinBalanceForDividends(uint256 amount) external onlyOwner {
        minimumTokenBalanceForDividends = amount * 10**decimals();
    }

    function excludeFromDividends(address account, bool value) external onlyOwner {
        require(excludedFromDividends[account] != value);
        excludedFromDividends[account] = value;
        if (value == true) {
            _setBalance(account, 0);
            tokenHoldersMap.remove(account);
        } else {
            _setBalance(account, balanceOf(account));
            tokenHoldersMap.set(account, balanceOf(account));
        }
        emit ExcludeFromDividends(account, value);
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(
            newClaimWait >= 3600 && newClaimWait <= 86400,
            "BUX_Dividend_Tracker: claimWait must be updated to between 1 and 24 hours"
        );
        require(
            newClaimWait != claimWait,
            "BUX_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;
    }

    function getCurrentRewardToken() external view returns (string memory) {
        return IERC20Metadata(rewardToken).name();
    }

    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 + (int256(processesUntilEndOfArray));
            }
        }

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

        lastClaimTime = lastClaimTimes[account];

        nextClaimTime = lastClaimTime > 0 ? lastClaimTime + (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 account, uint256 newBalance) public onlyOwner {
        if (excludedFromDividends[account]) {
            return;
        }

        if (newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);
            tokenHoldersMap.set(account, newBalance);
        } else {
            _setBalance(account, 0);
            tokenHoldersMap.remove(account);
        }

        processAccount(payable(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 + (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":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTaxes","outputs":[{"internalType":"uint256","name":"rewards","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract BUX_DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTradingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"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":"getCurrentRewardToken","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"rescueERC20Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTaxes","outputs":[{"internalType":"uint256","name":"rewards","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewards","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"_liquidity","type":"uint256"}],"name":"setBuyTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"setClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setMarketinWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxBuy","type":"uint256"},{"internalType":"uint256","name":"maxSell","type":"uint256"},{"internalType":"uint256","name":"maxWallet","type":"uint256"}],"name":"setMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMinBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewards","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"_liquidity","type":"uint256"}],"name":"setSellTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6007805461ffff60a81b1916600160a81b179055600a80546001600160a01b031916739140e96e64736fc40adaae03bdac75045f8c418917905565b5e620f48000600b819055600c819055600d819055600e5560006080819052601960a081905260c082905260108290556011819055601282905561014060405260e0819052610100829052610120829052601381905560148290556015829055620493e0601655601791909155601855348015620000b757600080fd5b50604051806040016040528060058152602001644275636b7360d81b81525060405180604001604052806003815260200162084aab60eb1b815250816003908162000103919062000ad4565b50600462000112828262000ad4565b505050600062000127620005fe60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350604051620001839062000a22565b604051809103906000f080158015620001a0573d6000803e3d6000fd5b50600960006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000737a250d5630b4cf539739df2c5dacb4c659f2488d90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000221573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000247919062000ba0565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000295573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bb919062000ba0565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000309573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200032f919062000ba0565b600680546001600160a01b038086166001600160a01b031992831617909255600780549284169290911691909117905590506200036e81600162000602565b60095460405162241fbd60e51b81526001600160a01b03909116600482018190526001602483015290630483f7a090604401600060405180830381600087803b158015620003bb57600080fd5b505af1158015620003d0573d6000803e3d6000fd5b505060095460405162241fbd60e51b8152306004820152600160248201526001600160a01b039091169250630483f7a09150604401600060405180830381600087803b1580156200042057600080fd5b505af115801562000435573d6000803e3d6000fd5b50506009546001600160a01b03169150630483f7a090506200045f6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260016024820152604401600060405180830381600087803b158015620004a857600080fd5b505af1158015620004bd573d6000803e3d6000fd5b505060095460405162241fbd60e51b815261dead6004820152600160248201526001600160a01b039091169250630483f7a09150604401600060405180830381600087803b1580156200050f57600080fd5b505af115801562000524573d6000803e3d6000fd5b505060095460405162241fbd60e51b81526001600160a01b038681166004830152600160248301529091169250630483f7a09150604401600060405180830381600087803b1580156200057657600080fd5b505af11580156200058b573d6000803e3d6000fd5b50505050620005ab620005a36200077060201b60201c565b60016200077f565b600a54620005c4906001600160a01b031660016200077f565b620005d13060016200077f565b620005f6620005e86005546001600160a01b031690565b662386f26fc10000620008bf565b505062000bed565b3390565b6001600160a01b0382166000908152601a602052604090205481151560ff9091161515036200069e5760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c7565000000000000000060648201526084015b60405180910390fd5b6001600160a01b0382166000908152601a60205260409020805460ff19168215801591909117909155620007345760095460405162241fbd60e51b81526001600160a01b0384811660048301526001602483015290911690630483f7a090604401600060405180830381600087803b1580156200071a57600080fd5b505af11580156200072f573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b031690565b6005546001600160a01b03163314620007db5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000695565b6001600160a01b03821660009081526019602052604090205481151560ff909116151503620008605760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015269276578636c756465642760b01b606482015260840162000695565b6001600160a01b038216600081815260196020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620009255760405162461bcd60e51b815260206004820152602560248201527f45524332303a206e657720746f6b656e7320746f20746865207a65726f206164604482015264647265737360d81b606482015260840162000695565b600254620009349082620009b6565b6002556001600160a01b0382166000908152602081905260409020546200095c9082620009b6565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b600080620009c5838562000bcb565b90508381101562000a195760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640162000695565b90505b92915050565b612c07806200404b83390190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000a5b57607f821691505b60208210810362000a7c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620009b157600081815260208120601f850160051c8101602086101562000aab5750805b601f850160051c820191505b8181101562000acc5782815560010162000ab7565b505050505050565b81516001600160401b0381111562000af05762000af062000a30565b62000b088162000b01845462000a46565b8462000a82565b602080601f83116001811462000b40576000841562000b275750858301515b600019600386901b1c1916600185901b17855562000acc565b600085815260208120601f198616915b8281101562000b715788860151825594840194600190910190840162000b50565b508582101562000b905787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000bb357600080fd5b81516001600160a01b038116811462000a1957600080fd5b8082018082111562000a1c57634e487b7160e01b600052601160045260246000fd5b61344e8062000bfd6000396000f3fe6080604052600436106102cd5760003560e01c806385141a7711610175578063afa4f3b2116100dc578063c492f04611610095578063e7841ec01161006f578063e7841ec014610900578063f27fd25414610915578063f2fde38b14610935578063f66895a31461095557600080fd5b8063c492f0461461087a578063dd62ed3e1461089a578063e01af92c146108e057600080fd5b8063afa4f3b2146107b4578063b62496f5146107d4578063b9640d8b14610804578063bbde77c114610824578063c02466681461083a578063c3e0f5cf1461085a57600080fd5b80639d7ceafb1161012e5780639d7ceafb146106ba578063a26579ad146106da578063a457c2d7146106ef578063a8b9d2401461070f578063a9059cbb1461072f578063ad56c13c1461074f57600080fd5b806385141a771461060c578063854c84dc14610622578063864701a5146106375780638da5cb5b1461067157806395d89b411461068f5780639c1b8af5146106a457600080fd5b806330bb4cff116102345780634fbee193116101ed5780636843cd84116101c75780636843cd8414610581578063700bb191146105a157806370a08231146105c1578063715018a6146105f757600080fd5b80634fbee193146105135780635960e46d1461054c57806364b0f6531461056c57600080fd5b806330bb4cff14610477578063313ce5671461048c57806339509351146104a85780634619d69f146104c85780634ada218b146104dd5780634e71d92d146104fe57600080fd5b80631275d00b116102865780631275d00b146103ab57806318160ddd146103cb5780631870517a146103ea57806320800a001461040a57806323b872dd1461041f5780632c1f52161461043f57600080fd5b80630483f7a0146102d957806306fdde03146102fb5780630861837514610326578063087332141461033b578063095ea7b31461035b5780630bc229441461038b57600080fd5b366102d457005b600080fd5b3480156102e557600080fd5b506102f96102f4366004612c6f565b610974565b005b34801561030757600080fd5b50610310610a12565b60405161031d9190612ccc565b60405180910390f35b34801561033257600080fd5b506102f9610aa4565b34801561034757600080fd5b506102f9610356366004612cff565b610b41565b34801561036757600080fd5b5061037b610376366004612d2b565b610bfc565b604051901515815260200161031d565b34801561039757600080fd5b506102f96103a6366004612d57565b610c13565b3480156103b757600080fd5b506102f96103c6366004612d70565b610c9f565b3480156103d757600080fd5b506002545b60405190815260200161031d565b3480156103f657600080fd5b506102f9610405366004612cff565b610dba565b34801561041657600080fd5b506102f9610e18565b34801561042b57600080fd5b5061037b61043a366004612d8d565b610e30565b34801561044b57600080fd5b5060095461045f906001600160a01b031681565b6040516001600160a01b03909116815260200161031d565b34801561048357600080fd5b506103dc610e99565b34801561049857600080fd5b506040516009815260200161031d565b3480156104b457600080fd5b5061037b6104c3366004612d2b565b610f0c565b3480156104d457600080fd5b506102f9610f42565b3480156104e957600080fd5b5060075461037b90600160b01b900460ff1681565b34801561050a57600080fd5b506102f9610fc2565b34801561051f57600080fd5b5061037b61052e366004612d70565b6001600160a01b031660009081526019602052604090205460ff1690565b34801561055857600080fd5b506102f9610567366004612d57565b611037565b34801561057857600080fd5b506103dc611179565b34801561058d57600080fd5b506103dc61059c366004612d70565b6111c3565b3480156105ad57600080fd5b506102f96105bc366004612d57565b611233565b3480156105cd57600080fd5b506103dc6105dc366004612d70565b6001600160a01b031660009081526020819052604090205490565b34801561060357600080fd5b506102f9611305565b34801561061857600080fd5b5061045f61dead81565b34801561062e57600080fd5b50610310611379565b34801561064357600080fd5b5060105460115460125461065692919083565b6040805193845260208401929092529082015260600161031d565b34801561067d57600080fd5b506005546001600160a01b031661045f565b34801561069b57600080fd5b506103106113eb565b3480156106b057600080fd5b506103dc60165481565b3480156106c657600080fd5b506102f96106d5366004612d57565b6113fa565b3480156106e657600080fd5b506103dc611455565b3480156106fb57600080fd5b5061037b61070a366004612d2b565b61149f565b34801561071b57600080fd5b506103dc61072a366004612d70565b6114ee565b34801561073b57600080fd5b5061037b61074a366004612d2b565b611521565b34801561075b57600080fd5b5061076f61076a366004612d70565b61152e565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161031d565b3480156107c057600080fd5b506102f96107cf366004612d57565b6115c9565b3480156107e057600080fd5b5061037b6107ef366004612d70565b601a6020526000908152604090205460ff1681565b34801561081057600080fd5b506102f961081f366004612cff565b61166f565b34801561083057600080fd5b506103dc600c5481565b34801561084657600080fd5b506102f9610855366004612c6f565b611810565b34801561086657600080fd5b506102f9610875366004612d70565b61191c565b34801561088657600080fd5b506102f9610895366004612dce565b611aa7565b3480156108a657600080fd5b506103dc6108b5366004612e54565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156108ec57600080fd5b506102f96108fb366004612e82565b611b83565b34801561090c57600080fd5b506103dc611bcb565b34801561092157600080fd5b5061076f610930366004612d57565b611c15565b34801561094157600080fd5b506102f9610950366004612d70565b611c57565b34801561096157600080fd5b5060135460145460155461065692919083565b6005546001600160a01b031633146109a75760405162461bcd60e51b815260040161099e90612e9f565b60405180910390fd5b60095460405162241fbd60e51b81526001600160a01b038481166004830152831515602483015290911690630483f7a0906044015b600060405180830381600087803b1580156109f657600080fd5b505af1158015610a0a573d6000803e3d6000fd5b505050505050565b606060038054610a2190612ed4565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4d90612ed4565b8015610a9a5780601f10610a6f57610100808354040283529160200191610a9a565b820191906000526020600020905b815481529060010190602001808311610a7d57829003601f168201915b5050505050905090565b6005546001600160a01b03163314610ace5760405162461bcd60e51b815260040161099e90612e9f565b600754600160b01b900460ff1615610b285760405162461bcd60e51b815260206004820152601a60248201527f54726164696e6720697320616c726561647920656e61626c6564000000000000604482015260640161099e565b6007805460ff60b01b1916600160b01b17905543600855565b6005546001600160a01b03163314610b6b5760405162461bcd60e51b815260040161099e90612e9f565b604080516060810182528481526020810184905201819052601383905560148290556015819055602881610b9f8486612f24565b610ba99190612f24565b1115610bf75760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420343025206f72206c657373000000604482015260640161099e565b505050565b6000610c09338484611d42565b5060015b92915050565b6005546001600160a01b03163314610c3d5760405162461bcd60e51b815260040161099e90612e9f565b60095460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c7906024015b600060405180830381600087803b158015610c8457600080fd5b505af1158015610c98573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03163314610cc95760405162461bcd60e51b815260040161099e90612e9f565b306001600160a01b03821603610d305760405162461bcd60e51b815260206004820152602660248201527f46656520416464726573732063616e6e6f7420626520436f6e7472616374204160448201526564647265737360d01b606482015260840161099e565b6001600160a01b038116610d915760405162461bcd60e51b815260206004820152602260248201527f46656520416464726573732063616e6e6f74206265207a65726f206164647265604482015261737360f01b606482015260840161099e565b600a80546001600160a01b0319166001600160a01b038316179055610db7816001611810565b50565b6005546001600160a01b03163314610de45760405162461bcd60e51b815260040161099e90612e9f565b604080516060810182528481526020810184905201819052601083905560118290556012819055602881610b9f8486612f24565b600a544790610db7906001600160a01b031682611e67565b6000610e3d848484611f80565b610e8f8433610e8a856040518060600160405280602881526020016133cc602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061273e565b611d42565b5060019392505050565b600954604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610ee3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f079190612f37565b905090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c09918590610e8a9086612778565b6005546001600160a01b03163314610f6c5760405162461bcd60e51b815260040161099e90612e9f565b610f786009600a613034565b610f859062989680613043565b600d55610f946009600a613034565b610fa19062989680613043565b600e55610fb06009600a613034565b610fbd9062989680613043565b600c55565b60095460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015611013573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db7919061305a565b6005546001600160a01b031633146110615760405162461bcd60e51b815260040161099e90612e9f565b62030d40811015801561107757506207a1208111155b6110e05760405162461bcd60e51b815260206004820152603460248201527f476173466f7250726f63657373696e67206d757374206265206265747765656e6044820152730203230302c30303020616e64203530302c3030360641b606482015260840161099e565b60165481036111465760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b606482015260840161099e565b60165460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601655565b600954604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610ee3573d6000803e3d6000fd5b6009546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa15801561120f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0d9190612f37565b6009546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa9190613077565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b0316331461132f5760405162461bcd60e51b815260040161099e90612e9f565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b60095460408051632153213760e21b815290516060926001600160a01b03169163854c84dc9160048083019260009291908290030181865afa1580156113c3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f0791908101906130bb565b606060048054610a2190612ed4565b6005546001600160a01b031633146114245760405162461bcd60e51b815260040161099e90612e9f565b600954604051639d7ceafb60e01b8152600481018390526001600160a01b0390911690639d7ceafb90602401610c6a565b60095460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015610ee3573d6000803e3d6000fd5b6000610c093384610e8a856040518060600160405280602581526020016133f4602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061273e565b6009546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d240906024016111f2565b6000610c09338484611f80565b60095460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa15801561158a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ae9190613168565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b031633146115f35760405162461bcd60e51b815260040161099e90612e9f565b606481101561165b5760405162461bcd60e51b815260206004820152602e60248201527f616d6f756e74206d7573742062652067726561746572207468616e206f72206560448201526d7175616c20746f20302e3030312560901b606482015260840161099e565b61166981633b9aca00613043565b600b5550565b6005546001600160a01b031633146116995760405162461bcd60e51b815260040161099e90612e9f565b6127108310156116fd5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782042757920616d6f756e74206c6f776572206044820152687468616e20302e312560b81b606482015260840161099e565b6127108210156117625760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782053656c6c20616d6f756e74206c6f776572604482015269207468616e20302e312560b01b606482015260840161099e565b6127108110156117c05760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e312560e01b606482015260840161099e565b6117cc6009600a613034565b6117d69084613043565b600d556117e56009600a613034565b6117ef9083613043565b600e556117fe6009600a613034565b6118089082613043565b600c55505050565b6005546001600160a01b0316331461183a5760405162461bcd60e51b815260040161099e90612e9f565b6001600160a01b03821660009081526019602052604090205481151560ff9091161515036118bd5760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015269276578636c756465642760b01b606482015260840161099e565b6001600160a01b038216600081815260196020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146119465760405162461bcd60e51b815260040161099e90612e9f565b306001600160a01b038216036119bd5760405162461bcd60e51b815260206004820152603660248201527f4f776e65722063616e277420636c61696d20636f6e747261637427732062616c604482015275616e6365206f6620697473206f776e20746f6b656e7360501b606482015260840161099e565b600a546040516370a0823160e01b81523060048201526001600160a01b038381169263a9059cbb9291169083906370a0823190602401602060405180830381865afa158015611a10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a349190612f37565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611a7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa3919061305a565b5050565b6005546001600160a01b03163314611ad15760405162461bcd60e51b815260040161099e90612e9f565b60005b82811015611b42578160196000868685818110611af357611af36131d2565b9050602002016020810190611b089190612d70565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611b3a816131e8565b915050611ad4565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051611b7693929190613201565b60405180910390a1505050565b6005546001600160a01b03163314611bad5760405162461bcd60e51b815260040161099e90612e9f565b60078054911515600160a81b0260ff60a81b19909216919091179055565b6009546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015610ee3573d6000803e3d6000fd5b600954604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd9060240161156c565b6005546001600160a01b03163314611c815760405162461bcd60e51b815260040161099e90612e9f565b6001600160a01b038116611ce65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161099e565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611da45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161099e565b6001600160a01b038216611e055760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161099e565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b80471015611eb75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161099e565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611f04576040519150601f19603f3d011682016040523d82523d6000602084013e611f09565b606091505b5050905080610bf75760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161099e565b6001600160a01b038316611fa65760405162461bcd60e51b815260040161099e9061325a565b6001600160a01b038216611fcc5760405162461bcd60e51b815260040161099e9061329f565b6001600160a01b03831660009081526019602052604090205460ff1615801561200e57506001600160a01b03821660009081526019602052604090205460ff16155b1561206057600754600160b01b900460ff166120605760405162461bcd60e51b815260206004820152601160248201527054726164696e67206e6f2061637469766560781b604482015260640161099e565b6001600160a01b0382166000908152601a602052604090205460ff161580156120a257506001600160a01b03831660009081526019602052604090205460ff16155b80156120c757506001600160a01b03821660009081526019602052604090205460ff16155b1561215557600c54816120ef846001600160a01b031660009081526020819052604090205490565b6120f99190612f24565b11156121555760405162461bcd60e51b815260206004820152602560248201527f42616c616e636520697320657863656564696e67206d617857616c6c657442616044820152646c616e636560d81b606482015260840161099e565b6001600160a01b0383166000908152601a602052604090205460ff16801561219657506001600160a01b03831660009081526019602052604090205460ff16155b80156121bb57506001600160a01b03821660009081526019602052604090205460ff16155b1561221257600d548111156122125760405162461bcd60e51b815260206004820152601e60248201527f596f752061726520657863656564696e67206d6178427579416d6f756e740000604482015260640161099e565b6001600160a01b0383166000908152601a602052604090205460ff1615801561225457506001600160a01b03831660009081526019602052604090205460ff16155b801561227957506001600160a01b03821660009081526019602052604090205460ff16155b156122d057600e548111156122d05760405162461bcd60e51b815260206004820152601f60248201527f596f752061726520657863656564696e67206d617853656c6c416d6f756e7400604482015260640161099e565b806000036122e457610bf7838360006127de565b30600090815260208190526040812054600b54601554601454601354939492851015936123119190612f24565b61231b9190612f24565b90508180156123345750600754600160a01b900460ff16155b80156123495750600754600160a81b900460ff165b801561236e57506001600160a01b0386166000908152601a602052604090205460ff16155b801561239357506001600160a01b03861660009081526019602052604090205460ff16155b80156123b857506001600160a01b03851660009081526019602052604090205460ff16155b156123f0576007805460ff60a01b1916600160a01b17905580156123e2576123e2600b54826128e7565b6007805460ff60a01b191690555b6007546001600160a01b03871660009081526019602052604090205460ff600160a01b90920482161591168061243e57506001600160a01b03861660009081526019602052604090205460ff165b15612447575060005b801561254257600060175460085461245f9190612f24565b6001600160a01b0388166000908152601a602052604081205443929092111592509060ff16801561248e575081155b156124b057606461249f8589613043565b6124a991906132e2565b9050612528565b6001600160a01b0389166000908152601a602052604090205460ff1680156124d6575081155b1561250557601254601154601054606492916124f191612f24565b6124fb9190612f24565b61249f9089613043565b81156125285760646018548861251b9190613043565b61252591906132e2565b90505b6125328188613304565b965061253f8930836127de565b50505b61254d8787876127de565b6009546001600160a01b031663e30443bc8861257e816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156125c457600080fd5b505af19250505080156125d5575060015b506009546001600160a01b031663e30443bc87612607816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561264d57600080fd5b505af192505050801561265e575060015b50600754600160a01b900460ff16612735576016546009546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af19250505080156126dd575060408051601f3d908101601f191682019092526126da91810190613077565b60015b156127335760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b50505050505050565b600081848411156127625760405162461bcd60e51b815260040161099e9190612ccc565b50600061276f8486613304565b95945050505050565b6000806127858385612f24565b9050838110156127d75760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161099e565b9392505050565b6001600160a01b0383166128045760405162461bcd60e51b815260040161099e9061325a565b6001600160a01b03821661282a5760405162461bcd60e51b815260040161099e9061329f565b612867816040518060600160405280602681526020016133a6602691396001600160a01b038616600090815260208190526040902054919061273e565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546128969082612778565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611e5a565b60006128f4826002613043565b90506000816013600201548561290a9190613043565b61291491906132e2565b905060006129228286613304565b90504761292e82612a7d565b600061293a8247613304565b60155490915060009061294d9087613304565b61295790836132e2565b60155490915060009061296a9083613043565b9050801561297c5761297c8682612ba1565b60145460009061298d846002613043565b6129979190613043565b905080156129b557600a546129b5906001600160a01b031682611e67565b6013546000906129c6856002613043565b6129d09190613043565b90508015612a70576009546040516000916001600160a01b03169083908381818185875af1925050503d8060008114612a25576040519150601f19603f3d011682016040523d82523d6000602084013e612a2a565b606091505b505090508015612a6e57604080518d8152602081018490527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3910160405180910390a15b505b5050505050505050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612ab257612ab26131d2565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2f9190613317565b81600181518110612b4257612b426131d2565b6001600160a01b039283166020918202929092010152600654612b689130911684611d42565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906109dc908590600090869030904290600401613334565b600654612bb99030906001600160a01b031684611d42565b60065460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015612c27573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610c989190613077565b6001600160a01b0381168114610db757600080fd5b8015158114610db757600080fd5b60008060408385031215612c8257600080fd5b8235612c8d81612c4c565b91506020830135612c9d81612c61565b809150509250929050565b60005b83811015612cc3578181015183820152602001612cab565b50506000910152565b6020815260008251806020840152612ceb816040850160208701612ca8565b601f01601f19169190910160400192915050565b600080600060608486031215612d1457600080fd5b505081359360208301359350604090920135919050565b60008060408385031215612d3e57600080fd5b8235612d4981612c4c565b946020939093013593505050565b600060208284031215612d6957600080fd5b5035919050565b600060208284031215612d8257600080fd5b81356127d781612c4c565b600080600060608486031215612da257600080fd5b8335612dad81612c4c565b92506020840135612dbd81612c4c565b929592945050506040919091013590565b600080600060408486031215612de357600080fd5b833567ffffffffffffffff80821115612dfb57600080fd5b818601915086601f830112612e0f57600080fd5b813581811115612e1e57600080fd5b8760208260051b8501011115612e3357600080fd5b60209283019550935050840135612e4981612c61565b809150509250925092565b60008060408385031215612e6757600080fd5b8235612e7281612c4c565b91506020830135612c9d81612c4c565b600060208284031215612e9457600080fd5b81356127d781612c61565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612ee857607f821691505b602082108103612f0857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610c0d57610c0d612f0e565b600060208284031215612f4957600080fd5b5051919050565b600181815b80851115612f8b578160001904821115612f7157612f71612f0e565b80851615612f7e57918102915b93841c9390800290612f55565b509250929050565b600082612fa257506001610c0d565b81612faf57506000610c0d565b8160018114612fc55760028114612fcf57612feb565b6001915050610c0d565b60ff841115612fe057612fe0612f0e565b50506001821b610c0d565b5060208310610133831016604e8410600b841016171561300e575081810a610c0d565b6130188383612f50565b806000190482111561302c5761302c612f0e565b029392505050565b60006127d760ff841683612f93565b8082028115828204841417610c0d57610c0d612f0e565b60006020828403121561306c57600080fd5b81516127d781612c61565b60008060006060848603121561308c57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156130cd57600080fd5b815167ffffffffffffffff808211156130e557600080fd5b818401915084601f8301126130f957600080fd5b81518181111561310b5761310b6130a5565b604051601f8201601f19908116603f01168101908382118183101715613133576131336130a5565b8160405282815287602084870101111561314c57600080fd5b61315d836020830160208801612ca8565b979650505050505050565b600080600080600080600080610100898b03121561318557600080fd5b885161319081612c4c565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b634e487b7160e01b600052603260045260246000fd5b6000600182016131fa576131fa612f0e565b5060010190565b6040808252810183905260008460608301825b8681101561324457823561322781612c4c565b6001600160a01b0316825260209283019290910190600101613214565b5080925050508215156020830152949350505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000826132ff57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610c0d57610c0d612f0e565b60006020828403121561332957600080fd5b81516127d781612c4c565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156133845784516001600160a01b03168352938301939183019160010161335f565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b4c9151647f94b7b5eba2aee41a2efc8613e651672d7dfe6a74b7908e4dbaa6b64736f6c6343000813003360806040523480156200001157600080fd5b5060408051808201825260148082527f4255585f4469766964656e645f547261636b65720000000000000000000000006020808401829052845180860190955291845290830152908181600362000069838262000201565b50600462000078828262000201565b50505060006200008d6200015860201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050600680546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d179091556007805490911673dac17f958d2ee523a2206206994597c13d831ec717905550610e1060135562000134600990565b6200014190600a620003e2565b6200014f906103e8620003fa565b60145562000414565b3390565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200018757607f821691505b602082108103620001a857634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001fc57600081815260208120601f850160051c81016020861015620001d75750805b601f850160051c820191505b81811015620001f857828155600101620001e3565b5050505b505050565b81516001600160401b038111156200021d576200021d6200015c565b62000235816200022e845462000172565b84620001ae565b602080601f8311600181146200026d5760008415620002545750858301515b600019600386901b1c1916600185901b178555620001f8565b600085815260208120601f198616915b828110156200029e578886015182559484019460019091019084016200027d565b5085821015620002bd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000324578160001904821115620003085762000308620002cd565b808516156200031657918102915b93841c9390800290620002e8565b509250929050565b6000826200033d57506001620003dc565b816200034c57506000620003dc565b8160018114620003655760028114620003705762000390565b6001915050620003dc565b60ff841115620003845762000384620002cd565b50506001821b620003dc565b5060208310610133831016604e8410600b8410161715620003b5575081810a620003dc565b620003c18383620002e3565b8060001904821115620003d857620003d8620002cd565b0290505b92915050565b6000620003f360ff8416836200032c565b9392505050565b8082028115828204841417620003dc57620003dc620002cd565b6127e380620004246000396000f3fe6080604052600436106102345760003560e01c80638aee81271161012e578063be10b614116100ab578063f2fde38b1161006f578063f2fde38b146106ed578063f7c618c11461070d578063f887ea401461072d578063fbcbc0f11461074d578063ffb2c4791461076d57600080fd5b8063be10b6141461063c578063dd62ed3e14610652578063e30443bc14610698578063e7841ec0146106b8578063e98030c7146106cd57600080fd5b8063a457c2d7116100f2578063a457c2d714610586578063a8b9d240146105a6578063a9059cbb146105c6578063aafd847a146105e6578063bc4c4b371461061c57600080fd5b80638aee8127146104df5780638da5cb5b146104ff57806391b89fba1461053157806395d89b41146105515780639d7ceafb1461056657600080fd5b80633009a609116101bc5780636f2789ec116101805780636f2789ec1461045357806370a0823114610469578063715018a61461049f578063854c84dc146104b457806385a6b3ae146104c957600080fd5b80633009a6091461036c578063313ce56714610382578063395093511461039e5780634e7b827f146103be5780635183d6fd146103ee57600080fd5b806309bbedde1161020357806309bbedde146102cb57806318160ddd146102ea578063226cfa3d146102ff57806323b872dd1461032c57806327ce01471461034c57600080fd5b806303c83302146102485780630483f7a01461025057806306fdde0314610270578063095ea7b31461029b57600080fd5b36610243576102416107a8565b005b600080fd5b6102416107a8565b34801561025c57600080fd5b5061024161026b366004612167565b61083b565b34801561027c57600080fd5b50610285610a5d565b60405161029291906121c0565b60405180910390f35b3480156102a757600080fd5b506102bb6102b63660046121f3565b610aef565b6040519015158152602001610292565b3480156102d757600080fd5b50600c545b604051908152602001610292565b3480156102f657600080fd5b506002546102dc565b34801561030b57600080fd5b506102dc61031a36600461221f565b60126020526000908152604090205481565b34801561033857600080fd5b506102bb61034736600461223c565b610b06565b34801561035857600080fd5b506102dc61036736600461221f565b610b6f565b34801561037857600080fd5b506102dc60105481565b34801561038e57600080fd5b5060405160098152602001610292565b3480156103aa57600080fd5b506102bb6103b93660046121f3565b610bcb565b3480156103ca57600080fd5b506102bb6103d936600461221f565b60116020526000908152604090205460ff1681565b3480156103fa57600080fd5b5061040e61040936600461227d565b610c01565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610292565b34801561045f57600080fd5b506102dc60135481565b34801561047557600080fd5b506102dc61048436600461221f565b6001600160a01b031660009081526020819052604090205490565b3480156104ab57600080fd5b50610241610d55565b3480156104c057600080fd5b50610285610dc9565b3480156104d557600080fd5b506102dc600b5481565b3480156104eb57600080fd5b506102416104fa36600461221f565b610e40565b34801561050b57600080fd5b506005546001600160a01b03165b6040516001600160a01b039091168152602001610292565b34801561053d57600080fd5b506102dc61054c36600461221f565b610e8c565b34801561055d57600080fd5b50610285610e97565b34801561057257600080fd5b5061024161058136600461227d565b610ea6565b34801561059257600080fd5b506102bb6105a13660046121f3565b610eec565b3480156105b257600080fd5b506102dc6105c136600461221f565b610f3b565b3480156105d257600080fd5b506102bb6105e13660046121f3565b610f67565b3480156105f257600080fd5b506102dc61060136600461221f565b6001600160a01b03166000908152600a602052604090205490565b34801561062857600080fd5b506102bb610637366004612167565b610f74565b34801561064857600080fd5b506102dc60145481565b34801561065e57600080fd5b506102dc61066d366004612296565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156106a457600080fd5b506102416106b33660046121f3565b611022565b3480156106c457600080fd5b506010546102dc565b3480156106d957600080fd5b506102416106e836600461227d565b61118c565b3480156106f957600080fd5b5061024161070836600461221f565b6112f9565b34801561071957600080fd5b50600754610519906001600160a01b031681565b34801561073957600080fd5b50600654610519906001600160a01b031681565b34801561075957600080fd5b5061040e61076836600461221f565b6113e4565b34801561077957600080fd5b5061078d61078836600461227d565b61154c565b60408051938452602084019290925290820152606001610292565b60006107b360025490565b116107bd57600080fd5b3415610839576107f06107cf60025490565b6107dd34600160801b611669565b6107e791906122e5565b600854906116f2565b60085560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600b5461083590346116f2565b600b555b565b6005546001600160a01b0316331461086e5760405162461bcd60e51b815260040161086590612307565b60405180910390fd5b6001600160a01b03821660009081526011602052604090205481151560ff90911615150361089b57600080fd5b6001600160a01b0382166000908152601160205260409020805460ff191682151590811790915560010361094b576108d4826000611751565b60405163131836e760e21b8152600c60048201526001600160a01b038316602482015273fc0860915c3666084015041fa7bfaf974eb9b27a90634c60db9c9060440160006040518083038186803b15801561092e57600080fd5b505af4158015610942573d6000803e3d6000fd5b50505050610a14565b6109738261096e846001600160a01b031660009081526020819052604090205490565b611751565b73fc0860915c3666084015041fa7bfaf974eb9b27a63bc2b405c600c846109af816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b039091166024830152604482015260640160006040518083038186803b1580156109fb57600080fd5b505af4158015610a0f573d6000803e3d6000fd5b505050505b816001600160a01b03167fa3c7c11b2e12c4144b09a7813f3393ba646392788638998c97be8da908cf04be82604051610a51911515815260200190565b60405180910390a25050565b606060038054610a6c9061233c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a989061233c565b8015610ae55780601f10610aba57610100808354040283529160200191610ae5565b820191906000526020600020905b815481529060010190602001808311610ac857829003601f168201915b5050505050905090565b6000610afc3384846117b6565b5060015b92915050565b6000610b138484846118da565b610b658433610b6085604051806060016040528060288152602001612761602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611935565b6117b6565b5060019392505050565b6001600160a01b03811660009081526009602090815260408083205491839052822054600854600160801b92610bc192610bbc92610bb691610bb19190611669565b61196f565b9061197f565b6119bd565b610b0091906122e5565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610afc918590610b6090866116f2565b600080600080600080600080600c73fc0860915c3666084015041fa7bfaf974eb9b27a63deb3d89690916040518263ffffffff1660e01b8152600401610c4991815260200190565b602060405180830381865af4158015610c66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8a9190612376565b8910610caf575060009650600019955085945086935083925082915081905080610d4a565b6040516368d54f3f60e11b8152600c6004820152602481018a905260009073fc0860915c3666084015041fa7bfaf974eb9b27a9063d1aa9e7e90604401602060405180830381865af4158015610d09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2d919061238f565b9050610d38816113e4565b98509850985098509850985098509850505b919395975091939597565b6005546001600160a01b03163314610d7f5760405162461bcd60e51b815260040161086590612307565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b600754604080516306fdde0360e01b815290516060926001600160a01b0316916306fdde039160048083019260009291908290030181865afa158015610e13573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3b91908101906123f3565b905090565b6005546001600160a01b03163314610e6a5760405162461bcd60e51b815260040161086590612307565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000610b0082610f3b565b606060048054610a6c9061233c565b6005546001600160a01b03163314610ed05760405162461bcd60e51b815260040161086590612307565b610edc6009600a61256b565b610ee6908261257a565b60145550565b6000610afc3384610b6085604051806060016040528060258152602001612789602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611935565b6001600160a01b0381166000908152600a6020526040812054610b0090610f6184610b6f565b906119d0565b6000610afc3384846118da565b6005546000906001600160a01b03163314610fa15760405162461bcd60e51b815260040161086590612307565b6000610fac84611a12565b90508015611018576001600160a01b038416600081815260126020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092906110069085815260200190565b60405180910390a36001915050610b00565b5060009392505050565b6005546001600160a01b0316331461104c5760405162461bcd60e51b815260040161086590612307565b6001600160a01b03821660009081526011602052604090205460ff166111885760145481106110fd5761107f8282611751565b604051632f0ad01760e21b8152600c60048201526001600160a01b03831660248201526044810182905273fc0860915c3666084015041fa7bfaf974eb9b27a9063bc2b405c9060640160006040518083038186803b1580156110e057600080fd5b505af41580156110f4573d6000803e3d6000fd5b5050505061117b565b611108826000611751565b60405163131836e760e21b8152600c60048201526001600160a01b038316602482015273fc0860915c3666084015041fa7bfaf974eb9b27a90634c60db9c9060440160006040518083038186803b15801561116257600080fd5b505af4158015611176573d6000803e3d6000fd5b505050505b611186826001610f74565b505b5050565b6005546001600160a01b031633146111b65760405162461bcd60e51b815260040161086590612307565b610e1081101580156111cb5750620151808111155b61124f5760405162461bcd60e51b815260206004820152604960248201527f4255585f4469766964656e645f547261636b65723a20636c61696d576169742060448201527f6d757374206265207570646174656420746f206265747765656e203120616e6460648201526820323420686f75727360b81b608482015260a401610865565b60135481036112c65760405162461bcd60e51b815260206004820152603b60248201527f4255585f4469766964656e645f547261636b65723a2043616e6e6f742075706460448201527f61746520636c61696d5761697420746f2073616d652076616c756500000000006064820152608401610865565b60135460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601355565b6005546001600160a01b031633146113235760405162461bcd60e51b815260040161086590612307565b6001600160a01b0381166113885760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610865565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6040516317e142d160e01b8152600c60048201526001600160a01b0382166024820152819060009081908190819081908190819073fc0860915c3666084015041fa7bfaf974eb9b27a906317e142d190604401602060405180830381865af4158015611454573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114789190612376565b96506000199550600087126114da576010548711156114a65760105461149f908890611ca8565b95506114da565b601054600c54600091106114bb5760006114ca565b601054600c546114ca916119d0565b90506114d68189612591565b9650505b6114e388610f3b565b94506114ee88610b6f565b6001600160a01b038916600090815260126020526040902054909450925082611518576000611525565b60135461152590846125b9565b915042821161153557600061153f565b61153f82426119d0565b9050919395975091939597565b600c546000908190819080820361156e57505060105460009250829150611662565b6010546000805a90506000805b898410801561158957508582105b156116515784611598816125cc565b600c54909650861090506115ab57600094505b6000600c60000186815481106115c3576115c36125e5565b60009182526020808320909101546001600160a01b031680835260129091526040909120549091506115f490611ce5565b1561161757611604816001610f74565b156116175781611613816125cc565b9250505b82611621816125cc565b93505060005a9050808511156116485761163b85826119d0565b61164590876125b9565b95505b935061157b9050565b601085905590975095509193505050505b9193909250565b60008260000361167b57506000610b00565b6000611687838561257a565b90508261169485836122e5565b146116eb5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610865565b9392505050565b6000806116ff83856125b9565b9050838110156116eb5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610865565b6001600160a01b0382166000908152602081905260409020548082111561179057600061177e83836119d0565b905061178a8482611d0c565b50611186565b808210156111865760006117a482846119d0565b90506117b08482611d70565b50505050565b6001600160a01b0383166118185760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610865565b6001600160a01b0382166118795760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610865565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602a60248201527f4255585f4469766964656e645f547261636b65723a204e6f207472616e7366656044820152691c9cc8185b1b1bddd95960b21b6064820152608401610865565b600081848411156119595760405162461bcd60e51b815260040161086591906121c0565b50600061196684866125fb565b95945050505050565b60008181811215610b0057600080fd5b60008061198c8385612591565b90506000831215801561199f5750838112155b806119b457506000831280156119b457508381125b6116eb57600080fd5b6000808212156119cc57600080fd5b5090565b60006116eb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611935565b600080611a1e83610f3b565b90508015611c9f576001600160a01b0383166000908152600a6020526040902054611a4990826116f2565b6001600160a01b0384166000818152600a6020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d90611a989084815260200190565b60405180910390a2600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611af3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b17919061238f565b6007546001600160a01b03908116911614611bf0576000611b388483611db4565b905080611bea576000846001600160a01b031683610bb890604051600060405180830381858888f193505050503d8060008114611b91576040519150601f19603f3d011682016040523d82523d6000602084013e611b96565b606091505b5050905080611be8576001600160a01b0385166000908152600a6020526040902054611bc290846119d0565b6001600160a01b039095166000908152600a602052604081209590955550929392505050565b505b50610b00565b6000836001600160a01b031682610bb890604051600060405180830381858888f193505050503d8060008114611c42576040519150601f19603f3d011682016040523d82523d6000602084013e611c47565b606091505b5050905080611c98576001600160a01b0384166000908152600a6020526040902054611c7390836119d0565b6001600160a01b039094166000908152600a6020526040812094909455509192915050565b5092915050565b50600092915050565b600080611cb5838561260e565b905060008312158015611cc85750838113155b806119b457506000831280156119b457508381136116eb57600080fd5b600042821115611cf757506000919050565b601354611d0442846119d0565b101592915050565b611d168282611f31565b611d50611d31610bb18360085461166990919063ffffffff16565b6001600160a01b03841660009081526009602052604090205490611ca8565b6001600160a01b0390921660009081526009602052604090209190915550565b611d7a828261202a565b611d50611d95610bb18360085461166990919063ffffffff16565b6001600160a01b0384166000908152600960205260409020549061197f565b604080516002808252606082018352600092839291906020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611e22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e46919061238f565b81600081518110611e5957611e596125e5565b6001600160a01b039283166020918202929092010152600754825191169082906001908110611e8a57611e8a6125e5565b6001600160a01b03928316602091820292909201015260065416637ff36ab58460008488611eb94260026125b9565b6040518663ffffffff1660e01b8152600401611ed8949392919061262e565b60006040518083038185885af193505050508015611f1857506040513d6000823e601f3d908101601f19168201604052611f159190810190612698565b60015b611f26576000915050610b00565b506001915050610b00565b6001600160a01b038216611f955760405162461bcd60e51b815260206004820152602560248201527f45524332303a206e657720746f6b656e7320746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610865565b611fa160008383611186565b600254611fae90826116f2565b6002556001600160a01b038216600090815260208190526040902054611fd490826116f2565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b03821661208a5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610865565b61209682600083611186565b6120d38160405180606001604052806022815260200161273f602291396001600160a01b0385166000908152602081905260409020549190611935565b6001600160a01b0383166000908152602081905260409020556002546120f990826119d0565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161201e565b6001600160a01b038116811461214f57600080fd5b50565b8035801515811461216257600080fd5b919050565b6000806040838503121561217a57600080fd5b82356121858161213a565b915061219360208401612152565b90509250929050565b60005b838110156121b757818101518382015260200161219f565b50506000910152565b60208152600082518060208401526121df81604085016020870161219c565b601f01601f19169190910160400192915050565b6000806040838503121561220657600080fd5b82356122118161213a565b946020939093013593505050565b60006020828403121561223157600080fd5b81356116eb8161213a565b60008060006060848603121561225157600080fd5b833561225c8161213a565b9250602084013561226c8161213a565b929592945050506040919091013590565b60006020828403121561228f57600080fd5b5035919050565b600080604083850312156122a957600080fd5b82356122b48161213a565b915060208301356122c48161213a565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b60008261230257634e487b7160e01b600052601260045260246000fd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061235057607f821691505b60208210810361237057634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561238857600080fd5b5051919050565b6000602082840312156123a157600080fd5b81516116eb8161213a565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156123eb576123eb6123ac565b604052919050565b60006020828403121561240557600080fd5b815167ffffffffffffffff8082111561241d57600080fd5b818401915084601f83011261243157600080fd5b815181811115612443576124436123ac565b612456601f8201601f19166020016123c2565b915080825285602082850101111561246d57600080fd5b61247e81602084016020860161219c565b50949350505050565b600181815b808511156124c25781600019048211156124a8576124a86122cf565b808516156124b557918102915b93841c939080029061248c565b509250929050565b6000826124d957506001610b00565b816124e657506000610b00565b81600181146124fc576002811461250657612522565b6001915050610b00565b60ff841115612517576125176122cf565b50506001821b610b00565b5060208310610133831016604e8410600b8410161715612545575081810a610b00565b61254f8383612487565b8060001904821115612563576125636122cf565b029392505050565b60006116eb60ff8416836124ca565b8082028115828204841417610b0057610b006122cf565b80820182811260008312801582168215821617156125b1576125b16122cf565b505092915050565b80820180821115610b0057610b006122cf565b6000600182016125de576125de6122cf565b5060010190565b634e487b7160e01b600052603260045260246000fd5b81810381811115610b0057610b006122cf565b8181036000831280158383131683831282161715611c9857611c986122cf565b600060808201868352602060808185015281875180845260a086019150828901935060005b818110156126785784516001600160a01b031683529383019391830191600101612653565b50506001600160a01b039690961660408501525050506060015292915050565b600060208083850312156126ab57600080fd5b825167ffffffffffffffff808211156126c357600080fd5b818501915085601f8301126126d757600080fd5b8151818111156126e9576126e96123ac565b8060051b91506126fa8483016123c2565b818152918301840191848101908884111561271457600080fd5b938501935b8385101561273257845182529385019390850190612719565b9897505050505050505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212204803c5b92d3ff621489f13626c24d1cedb461213a08f850ec5d687f0866a194364736f6c63430008130033

Deployed Bytecode

0x6080604052600436106102cd5760003560e01c806385141a7711610175578063afa4f3b2116100dc578063c492f04611610095578063e7841ec01161006f578063e7841ec014610900578063f27fd25414610915578063f2fde38b14610935578063f66895a31461095557600080fd5b8063c492f0461461087a578063dd62ed3e1461089a578063e01af92c146108e057600080fd5b8063afa4f3b2146107b4578063b62496f5146107d4578063b9640d8b14610804578063bbde77c114610824578063c02466681461083a578063c3e0f5cf1461085a57600080fd5b80639d7ceafb1161012e5780639d7ceafb146106ba578063a26579ad146106da578063a457c2d7146106ef578063a8b9d2401461070f578063a9059cbb1461072f578063ad56c13c1461074f57600080fd5b806385141a771461060c578063854c84dc14610622578063864701a5146106375780638da5cb5b1461067157806395d89b411461068f5780639c1b8af5146106a457600080fd5b806330bb4cff116102345780634fbee193116101ed5780636843cd84116101c75780636843cd8414610581578063700bb191146105a157806370a08231146105c1578063715018a6146105f757600080fd5b80634fbee193146105135780635960e46d1461054c57806364b0f6531461056c57600080fd5b806330bb4cff14610477578063313ce5671461048c57806339509351146104a85780634619d69f146104c85780634ada218b146104dd5780634e71d92d146104fe57600080fd5b80631275d00b116102865780631275d00b146103ab57806318160ddd146103cb5780631870517a146103ea57806320800a001461040a57806323b872dd1461041f5780632c1f52161461043f57600080fd5b80630483f7a0146102d957806306fdde03146102fb5780630861837514610326578063087332141461033b578063095ea7b31461035b5780630bc229441461038b57600080fd5b366102d457005b600080fd5b3480156102e557600080fd5b506102f96102f4366004612c6f565b610974565b005b34801561030757600080fd5b50610310610a12565b60405161031d9190612ccc565b60405180910390f35b34801561033257600080fd5b506102f9610aa4565b34801561034757600080fd5b506102f9610356366004612cff565b610b41565b34801561036757600080fd5b5061037b610376366004612d2b565b610bfc565b604051901515815260200161031d565b34801561039757600080fd5b506102f96103a6366004612d57565b610c13565b3480156103b757600080fd5b506102f96103c6366004612d70565b610c9f565b3480156103d757600080fd5b506002545b60405190815260200161031d565b3480156103f657600080fd5b506102f9610405366004612cff565b610dba565b34801561041657600080fd5b506102f9610e18565b34801561042b57600080fd5b5061037b61043a366004612d8d565b610e30565b34801561044b57600080fd5b5060095461045f906001600160a01b031681565b6040516001600160a01b03909116815260200161031d565b34801561048357600080fd5b506103dc610e99565b34801561049857600080fd5b506040516009815260200161031d565b3480156104b457600080fd5b5061037b6104c3366004612d2b565b610f0c565b3480156104d457600080fd5b506102f9610f42565b3480156104e957600080fd5b5060075461037b90600160b01b900460ff1681565b34801561050a57600080fd5b506102f9610fc2565b34801561051f57600080fd5b5061037b61052e366004612d70565b6001600160a01b031660009081526019602052604090205460ff1690565b34801561055857600080fd5b506102f9610567366004612d57565b611037565b34801561057857600080fd5b506103dc611179565b34801561058d57600080fd5b506103dc61059c366004612d70565b6111c3565b3480156105ad57600080fd5b506102f96105bc366004612d57565b611233565b3480156105cd57600080fd5b506103dc6105dc366004612d70565b6001600160a01b031660009081526020819052604090205490565b34801561060357600080fd5b506102f9611305565b34801561061857600080fd5b5061045f61dead81565b34801561062e57600080fd5b50610310611379565b34801561064357600080fd5b5060105460115460125461065692919083565b6040805193845260208401929092529082015260600161031d565b34801561067d57600080fd5b506005546001600160a01b031661045f565b34801561069b57600080fd5b506103106113eb565b3480156106b057600080fd5b506103dc60165481565b3480156106c657600080fd5b506102f96106d5366004612d57565b6113fa565b3480156106e657600080fd5b506103dc611455565b3480156106fb57600080fd5b5061037b61070a366004612d2b565b61149f565b34801561071b57600080fd5b506103dc61072a366004612d70565b6114ee565b34801561073b57600080fd5b5061037b61074a366004612d2b565b611521565b34801561075b57600080fd5b5061076f61076a366004612d70565b61152e565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161031d565b3480156107c057600080fd5b506102f96107cf366004612d57565b6115c9565b3480156107e057600080fd5b5061037b6107ef366004612d70565b601a6020526000908152604090205460ff1681565b34801561081057600080fd5b506102f961081f366004612cff565b61166f565b34801561083057600080fd5b506103dc600c5481565b34801561084657600080fd5b506102f9610855366004612c6f565b611810565b34801561086657600080fd5b506102f9610875366004612d70565b61191c565b34801561088657600080fd5b506102f9610895366004612dce565b611aa7565b3480156108a657600080fd5b506103dc6108b5366004612e54565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156108ec57600080fd5b506102f96108fb366004612e82565b611b83565b34801561090c57600080fd5b506103dc611bcb565b34801561092157600080fd5b5061076f610930366004612d57565b611c15565b34801561094157600080fd5b506102f9610950366004612d70565b611c57565b34801561096157600080fd5b5060135460145460155461065692919083565b6005546001600160a01b031633146109a75760405162461bcd60e51b815260040161099e90612e9f565b60405180910390fd5b60095460405162241fbd60e51b81526001600160a01b038481166004830152831515602483015290911690630483f7a0906044015b600060405180830381600087803b1580156109f657600080fd5b505af1158015610a0a573d6000803e3d6000fd5b505050505050565b606060038054610a2190612ed4565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4d90612ed4565b8015610a9a5780601f10610a6f57610100808354040283529160200191610a9a565b820191906000526020600020905b815481529060010190602001808311610a7d57829003601f168201915b5050505050905090565b6005546001600160a01b03163314610ace5760405162461bcd60e51b815260040161099e90612e9f565b600754600160b01b900460ff1615610b285760405162461bcd60e51b815260206004820152601a60248201527f54726164696e6720697320616c726561647920656e61626c6564000000000000604482015260640161099e565b6007805460ff60b01b1916600160b01b17905543600855565b6005546001600160a01b03163314610b6b5760405162461bcd60e51b815260040161099e90612e9f565b604080516060810182528481526020810184905201819052601383905560148290556015819055602881610b9f8486612f24565b610ba99190612f24565b1115610bf75760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420343025206f72206c657373000000604482015260640161099e565b505050565b6000610c09338484611d42565b5060015b92915050565b6005546001600160a01b03163314610c3d5760405162461bcd60e51b815260040161099e90612e9f565b60095460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c7906024015b600060405180830381600087803b158015610c8457600080fd5b505af1158015610c98573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03163314610cc95760405162461bcd60e51b815260040161099e90612e9f565b306001600160a01b03821603610d305760405162461bcd60e51b815260206004820152602660248201527f46656520416464726573732063616e6e6f7420626520436f6e7472616374204160448201526564647265737360d01b606482015260840161099e565b6001600160a01b038116610d915760405162461bcd60e51b815260206004820152602260248201527f46656520416464726573732063616e6e6f74206265207a65726f206164647265604482015261737360f01b606482015260840161099e565b600a80546001600160a01b0319166001600160a01b038316179055610db7816001611810565b50565b6005546001600160a01b03163314610de45760405162461bcd60e51b815260040161099e90612e9f565b604080516060810182528481526020810184905201819052601083905560118290556012819055602881610b9f8486612f24565b600a544790610db7906001600160a01b031682611e67565b6000610e3d848484611f80565b610e8f8433610e8a856040518060600160405280602881526020016133cc602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061273e565b611d42565b5060019392505050565b600954604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610ee3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f079190612f37565b905090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c09918590610e8a9086612778565b6005546001600160a01b03163314610f6c5760405162461bcd60e51b815260040161099e90612e9f565b610f786009600a613034565b610f859062989680613043565b600d55610f946009600a613034565b610fa19062989680613043565b600e55610fb06009600a613034565b610fbd9062989680613043565b600c55565b60095460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015611013573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db7919061305a565b6005546001600160a01b031633146110615760405162461bcd60e51b815260040161099e90612e9f565b62030d40811015801561107757506207a1208111155b6110e05760405162461bcd60e51b815260206004820152603460248201527f476173466f7250726f63657373696e67206d757374206265206265747765656e6044820152730203230302c30303020616e64203530302c3030360641b606482015260840161099e565b60165481036111465760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b606482015260840161099e565b60165460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601655565b600954604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610ee3573d6000803e3d6000fd5b6009546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa15801561120f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0d9190612f37565b6009546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa9190613077565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b0316331461132f5760405162461bcd60e51b815260040161099e90612e9f565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b60095460408051632153213760e21b815290516060926001600160a01b03169163854c84dc9160048083019260009291908290030181865afa1580156113c3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f0791908101906130bb565b606060048054610a2190612ed4565b6005546001600160a01b031633146114245760405162461bcd60e51b815260040161099e90612e9f565b600954604051639d7ceafb60e01b8152600481018390526001600160a01b0390911690639d7ceafb90602401610c6a565b60095460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015610ee3573d6000803e3d6000fd5b6000610c093384610e8a856040518060600160405280602581526020016133f4602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061273e565b6009546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d240906024016111f2565b6000610c09338484611f80565b60095460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa15801561158a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ae9190613168565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b031633146115f35760405162461bcd60e51b815260040161099e90612e9f565b606481101561165b5760405162461bcd60e51b815260206004820152602e60248201527f616d6f756e74206d7573742062652067726561746572207468616e206f72206560448201526d7175616c20746f20302e3030312560901b606482015260840161099e565b61166981633b9aca00613043565b600b5550565b6005546001600160a01b031633146116995760405162461bcd60e51b815260040161099e90612e9f565b6127108310156116fd5760405162461bcd60e51b815260206004820152602960248201527f43616e6e6f7420736574206d61782042757920616d6f756e74206c6f776572206044820152687468616e20302e312560b81b606482015260840161099e565b6127108210156117625760405162461bcd60e51b815260206004820152602a60248201527f43616e6e6f7420736574206d61782053656c6c20616d6f756e74206c6f776572604482015269207468616e20302e312560b01b606482015260840161099e565b6127108110156117c05760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e312560e01b606482015260840161099e565b6117cc6009600a613034565b6117d69084613043565b600d556117e56009600a613034565b6117ef9083613043565b600e556117fe6009600a613034565b6118089082613043565b600c55505050565b6005546001600160a01b0316331461183a5760405162461bcd60e51b815260040161099e90612e9f565b6001600160a01b03821660009081526019602052604090205481151560ff9091161515036118bd5760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015269276578636c756465642760b01b606482015260840161099e565b6001600160a01b038216600081815260196020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146119465760405162461bcd60e51b815260040161099e90612e9f565b306001600160a01b038216036119bd5760405162461bcd60e51b815260206004820152603660248201527f4f776e65722063616e277420636c61696d20636f6e747261637427732062616c604482015275616e6365206f6620697473206f776e20746f6b656e7360501b606482015260840161099e565b600a546040516370a0823160e01b81523060048201526001600160a01b038381169263a9059cbb9291169083906370a0823190602401602060405180830381865afa158015611a10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a349190612f37565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611a7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa3919061305a565b5050565b6005546001600160a01b03163314611ad15760405162461bcd60e51b815260040161099e90612e9f565b60005b82811015611b42578160196000868685818110611af357611af36131d2565b9050602002016020810190611b089190612d70565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611b3a816131e8565b915050611ad4565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051611b7693929190613201565b60405180910390a1505050565b6005546001600160a01b03163314611bad5760405162461bcd60e51b815260040161099e90612e9f565b60078054911515600160a81b0260ff60a81b19909216919091179055565b6009546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015610ee3573d6000803e3d6000fd5b600954604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd9060240161156c565b6005546001600160a01b03163314611c815760405162461bcd60e51b815260040161099e90612e9f565b6001600160a01b038116611ce65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161099e565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611da45760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161099e565b6001600160a01b038216611e055760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161099e565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b80471015611eb75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161099e565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611f04576040519150601f19603f3d011682016040523d82523d6000602084013e611f09565b606091505b5050905080610bf75760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161099e565b6001600160a01b038316611fa65760405162461bcd60e51b815260040161099e9061325a565b6001600160a01b038216611fcc5760405162461bcd60e51b815260040161099e9061329f565b6001600160a01b03831660009081526019602052604090205460ff1615801561200e57506001600160a01b03821660009081526019602052604090205460ff16155b1561206057600754600160b01b900460ff166120605760405162461bcd60e51b815260206004820152601160248201527054726164696e67206e6f2061637469766560781b604482015260640161099e565b6001600160a01b0382166000908152601a602052604090205460ff161580156120a257506001600160a01b03831660009081526019602052604090205460ff16155b80156120c757506001600160a01b03821660009081526019602052604090205460ff16155b1561215557600c54816120ef846001600160a01b031660009081526020819052604090205490565b6120f99190612f24565b11156121555760405162461bcd60e51b815260206004820152602560248201527f42616c616e636520697320657863656564696e67206d617857616c6c657442616044820152646c616e636560d81b606482015260840161099e565b6001600160a01b0383166000908152601a602052604090205460ff16801561219657506001600160a01b03831660009081526019602052604090205460ff16155b80156121bb57506001600160a01b03821660009081526019602052604090205460ff16155b1561221257600d548111156122125760405162461bcd60e51b815260206004820152601e60248201527f596f752061726520657863656564696e67206d6178427579416d6f756e740000604482015260640161099e565b6001600160a01b0383166000908152601a602052604090205460ff1615801561225457506001600160a01b03831660009081526019602052604090205460ff16155b801561227957506001600160a01b03821660009081526019602052604090205460ff16155b156122d057600e548111156122d05760405162461bcd60e51b815260206004820152601f60248201527f596f752061726520657863656564696e67206d617853656c6c416d6f756e7400604482015260640161099e565b806000036122e457610bf7838360006127de565b30600090815260208190526040812054600b54601554601454601354939492851015936123119190612f24565b61231b9190612f24565b90508180156123345750600754600160a01b900460ff16155b80156123495750600754600160a81b900460ff165b801561236e57506001600160a01b0386166000908152601a602052604090205460ff16155b801561239357506001600160a01b03861660009081526019602052604090205460ff16155b80156123b857506001600160a01b03851660009081526019602052604090205460ff16155b156123f0576007805460ff60a01b1916600160a01b17905580156123e2576123e2600b54826128e7565b6007805460ff60a01b191690555b6007546001600160a01b03871660009081526019602052604090205460ff600160a01b90920482161591168061243e57506001600160a01b03861660009081526019602052604090205460ff165b15612447575060005b801561254257600060175460085461245f9190612f24565b6001600160a01b0388166000908152601a602052604081205443929092111592509060ff16801561248e575081155b156124b057606461249f8589613043565b6124a991906132e2565b9050612528565b6001600160a01b0389166000908152601a602052604090205460ff1680156124d6575081155b1561250557601254601154601054606492916124f191612f24565b6124fb9190612f24565b61249f9089613043565b81156125285760646018548861251b9190613043565b61252591906132e2565b90505b6125328188613304565b965061253f8930836127de565b50505b61254d8787876127de565b6009546001600160a01b031663e30443bc8861257e816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156125c457600080fd5b505af19250505080156125d5575060015b506009546001600160a01b031663e30443bc87612607816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561264d57600080fd5b505af192505050801561265e575060015b50600754600160a01b900460ff16612735576016546009546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af19250505080156126dd575060408051601f3d908101601f191682019092526126da91810190613077565b60015b156127335760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b50505050505050565b600081848411156127625760405162461bcd60e51b815260040161099e9190612ccc565b50600061276f8486613304565b95945050505050565b6000806127858385612f24565b9050838110156127d75760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161099e565b9392505050565b6001600160a01b0383166128045760405162461bcd60e51b815260040161099e9061325a565b6001600160a01b03821661282a5760405162461bcd60e51b815260040161099e9061329f565b612867816040518060600160405280602681526020016133a6602691396001600160a01b038616600090815260208190526040902054919061273e565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546128969082612778565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611e5a565b60006128f4826002613043565b90506000816013600201548561290a9190613043565b61291491906132e2565b905060006129228286613304565b90504761292e82612a7d565b600061293a8247613304565b60155490915060009061294d9087613304565b61295790836132e2565b60155490915060009061296a9083613043565b9050801561297c5761297c8682612ba1565b60145460009061298d846002613043565b6129979190613043565b905080156129b557600a546129b5906001600160a01b031682611e67565b6013546000906129c6856002613043565b6129d09190613043565b90508015612a70576009546040516000916001600160a01b03169083908381818185875af1925050503d8060008114612a25576040519150601f19603f3d011682016040523d82523d6000602084013e612a2a565b606091505b505090508015612a6e57604080518d8152602081018490527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3910160405180910390a15b505b5050505050505050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612ab257612ab26131d2565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2f9190613317565b81600181518110612b4257612b426131d2565b6001600160a01b039283166020918202929092010152600654612b689130911684611d42565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906109dc908590600090869030904290600401613334565b600654612bb99030906001600160a01b031684611d42565b60065460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015612c27573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610c989190613077565b6001600160a01b0381168114610db757600080fd5b8015158114610db757600080fd5b60008060408385031215612c8257600080fd5b8235612c8d81612c4c565b91506020830135612c9d81612c61565b809150509250929050565b60005b83811015612cc3578181015183820152602001612cab565b50506000910152565b6020815260008251806020840152612ceb816040850160208701612ca8565b601f01601f19169190910160400192915050565b600080600060608486031215612d1457600080fd5b505081359360208301359350604090920135919050565b60008060408385031215612d3e57600080fd5b8235612d4981612c4c565b946020939093013593505050565b600060208284031215612d6957600080fd5b5035919050565b600060208284031215612d8257600080fd5b81356127d781612c4c565b600080600060608486031215612da257600080fd5b8335612dad81612c4c565b92506020840135612dbd81612c4c565b929592945050506040919091013590565b600080600060408486031215612de357600080fd5b833567ffffffffffffffff80821115612dfb57600080fd5b818601915086601f830112612e0f57600080fd5b813581811115612e1e57600080fd5b8760208260051b8501011115612e3357600080fd5b60209283019550935050840135612e4981612c61565b809150509250925092565b60008060408385031215612e6757600080fd5b8235612e7281612c4c565b91506020830135612c9d81612c4c565b600060208284031215612e9457600080fd5b81356127d781612c61565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612ee857607f821691505b602082108103612f0857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610c0d57610c0d612f0e565b600060208284031215612f4957600080fd5b5051919050565b600181815b80851115612f8b578160001904821115612f7157612f71612f0e565b80851615612f7e57918102915b93841c9390800290612f55565b509250929050565b600082612fa257506001610c0d565b81612faf57506000610c0d565b8160018114612fc55760028114612fcf57612feb565b6001915050610c0d565b60ff841115612fe057612fe0612f0e565b50506001821b610c0d565b5060208310610133831016604e8410600b841016171561300e575081810a610c0d565b6130188383612f50565b806000190482111561302c5761302c612f0e565b029392505050565b60006127d760ff841683612f93565b8082028115828204841417610c0d57610c0d612f0e565b60006020828403121561306c57600080fd5b81516127d781612c61565b60008060006060848603121561308c57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156130cd57600080fd5b815167ffffffffffffffff808211156130e557600080fd5b818401915084601f8301126130f957600080fd5b81518181111561310b5761310b6130a5565b604051601f8201601f19908116603f01168101908382118183101715613133576131336130a5565b8160405282815287602084870101111561314c57600080fd5b61315d836020830160208801612ca8565b979650505050505050565b600080600080600080600080610100898b03121561318557600080fd5b885161319081612c4c565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b634e487b7160e01b600052603260045260246000fd5b6000600182016131fa576131fa612f0e565b5060010190565b6040808252810183905260008460608301825b8681101561324457823561322781612c4c565b6001600160a01b0316825260209283019290910190600101613214565b5080925050508215156020830152949350505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000826132ff57634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610c0d57610c0d612f0e565b60006020828403121561332957600080fd5b81516127d781612c4c565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156133845784516001600160a01b03168352938301939183019160010161335f565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b4c9151647f94b7b5eba2aee41a2efc8613e651672d7dfe6a74b7908e4dbaa6b64736f6c63430008130033

Libraries Used

IterableMapping : 0xfc0860915c3666084015041fa7bfaf974eb9b27aUnverified

Deployed Bytecode Sourcemap

35278:15702:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39747:149;;;;;;;;;;-1:-1:-1;39747:149:0;;;;;:::i;:::-;;:::i;:::-;;4823:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41797:199;;;;;;;;;;;;;:::i;41416:262::-;;;;;;;;;;-1:-1:-1;41416:262:0;;;;;:::i;:::-;;:::i;6989:169::-;;;;;;;;;;-1:-1:-1;6989:169:0;;;;;:::i;:::-;;:::i;:::-;;;2122:14:1;;2115:22;2097:41;;2085:2;2070:18;6989:169:0;1957:187:1;43296:121:0;;;;;;;;;;-1:-1:-1;43296:121:0;;;;;:::i;:::-;;:::i;40608:321::-;;;;;;;;;;-1:-1:-1;40608:321:0;;;;;:::i;:::-;;:::i;5942:108::-;;;;;;;;;;-1:-1:-1;6030:12:0;;5942:108;;;2732:25:1;;;2720:2;2705:18;5942:108:0;2586:177:1;41148:260:0;;;;;;;;;;-1:-1:-1;41148:260:0;;;;;:::i;:::-;;:::i;38870:148::-;;;;;;;;;;;;;:::i;7640:355::-;;;;;;;;;;-1:-1:-1;7640:355:0;;;;;:::i;:::-;;:::i;35563:42::-;;;;;;;;;;-1:-1:-1;35563:42:0;;;;-1:-1:-1;;;;;35563:42:0;;;;;;-1:-1:-1;;;;;3429:32:1;;;3411:51;;3399:2;3384:18;35563:42:0;3229:239:1;43542:141:0;;;;;;;;;;;;;:::i;5785:92::-;;;;;;;;;;-1:-1:-1;5785:92:0;;5868:1;3615:36:1;;3603:2;3588:18;5785:92:0;3473:184:1;8404:218:0;;;;;;;;;;-1:-1:-1;8404:218:0;;;;;:::i;:::-;;:::i;40401:195::-;;;;;;;;;;;;;:::i;35481:34::-;;;;;;;;;;-1:-1:-1;35481:34:0;;;;-1:-1:-1;;;35481:34:0;;;;;;38465:103;;;;;;;;;;;;;:::i;43691:126::-;;;;;;;;;;-1:-1:-1;43691:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;43781:28:0;43757:4;43781:28;;;:19;:28;;;;;;;;;43691:126;42800:437;;;;;;;;;;-1:-1:-1;42800:437:0;;;;;:::i;:::-;;:::i;45142:142::-;;;;;;;;;;;;;:::i;44129:139::-;;;;;;;;;;-1:-1:-1;44129:139:0;;;;;:::i;:::-;;:::i;38083:374::-;;;;;;;;;;-1:-1:-1;38083:374:0;;;;;:::i;:::-;;:::i;6113:127::-;;;;;;;;;;-1:-1:-1;6113:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;6214:18:0;6187:7;6214:18;;;;;;;;;;;;6113:127;20783:148;;;;;;;;;;;;;:::i;35618:79::-;;;;;;;;;;;;35655:42;35618:79;;43985:136;;;;;;;;;;;;;:::i;36151:39::-;;;;;;;;;;-1:-1:-1;36151:39:0;;;;;;;;;;;;;;;;4072:25:1;;;4128:2;4113:18;;4106:34;;;;4156:18;;;4149:34;4060:2;4045:18;36151:39:0;3870:319:1;20141:79:0;;;;;;;;;;-1:-1:-1;20206:6:0;;-1:-1:-1;;;;;20206:6:0;20141:79;;5042:104;;;;;;;;;;;;;:::i;36246:40::-;;;;;;;;;;;;;;;;42004:138;;;;;;;;;;-1:-1:-1;42004:138:0;;;;;:::i;:::-;;:::i;43425:109::-;;;;;;;;;;;;;:::i;9125:269::-;;;;;;;;;;-1:-1:-1;9125:269:0;;;;;:::i;:::-;;:::i;43825:152::-;;;;;;;;;;-1:-1:-1;43825:152:0;;;;;:::i;:::-;;:::i;6453:175::-;;;;;;;;;;-1:-1:-1;6453:175:0;;;;;:::i;:::-;;:::i;44276:351::-;;;;;;;;;;-1:-1:-1;44276:351:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4551:32:1;;;4533:51;;4615:2;4600:18;;4593:34;;;;4643:18;;;4636:34;;;;4701:2;4686:18;;4679:34;;;;4744:3;4729:19;;4722:35;4571:3;4773:19;;4766:35;4832:3;4817:19;;4810:35;4876:3;4861:19;;4854:35;4520:3;4505:19;44276:351:0;4194:701:1;40937:203:0;;;;;;;;;;-1:-1:-1;40937:203:0;;;;;:::i;:::-;;:::i;36435:57::-;;;;;;;;;;-1:-1:-1;36435:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39904:488;;;;;;;;;;-1:-1:-1;39904:488:0;;;;;:::i;:::-;;:::i;35842:45::-;;;;;;;;;;;;;;;;39026:327;;;;;;;;;;-1:-1:-1;39026:327:0;;;;;:::i;:::-;;:::i;38576:286::-;;;;;;;;;;-1:-1:-1;38576:286:0;;;;;:::i;:::-;;:::i;39361:326::-;;;;;;;;;;-1:-1:-1;39361:326:0;;;;;:::i;:::-;;:::i;6691:151::-;;;;;;;;;;-1:-1:-1;6691:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;6807:18:0;;;6780:7;6807:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;6691:151;41686:99;;;;;;;;;;-1:-1:-1;41686:99:0;;;;;:::i;:::-;;:::i;45004:130::-;;;;;;;;;;;;;:::i;44635:361::-;;;;;;;;;;-1:-1:-1;44635:361:0;;;;;:::i;:::-;;:::i;21086:244::-;;;;;;;;;;-1:-1:-1;21086:244:0;;;;;:::i;:::-;;:::i;36197:40::-;;;;;;;;;;-1:-1:-1;36197:40:0;;;;;;;;;;;;39747:149;20353:6;;-1:-1:-1;;;;;20353:6:0;447:10;20353:22;20345:67;;;;-1:-1:-1;;;20345:67:0;;;;;;;:::i;:::-;;;;;;;;;39836:15:::1;::::0;:52:::1;::::0;-1:-1:-1;;;39836:52:0;;-1:-1:-1;;;;;6841:32:1;;;39836:52:0::1;::::0;::::1;6823:51:1::0;6917:14;;6910:22;6890:18;;;6883:50;39836:15:0;;::::1;::::0;:36:::1;::::0;6796:18:1;;39836:52:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;39747:149:::0;;:::o;4823:100::-;4877:13;4910:5;4903:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4823:100;:::o;41797:199::-;20353:6;;-1:-1:-1;;;;;20353:6:0;447:10;20353:22;20345:67;;;;-1:-1:-1;;;20345:67:0;;;;;;;:::i;:::-;41868:14:::1;::::0;-1:-1:-1;;;41868:14:0;::::1;;;41867:15;41859:54;;;::::0;-1:-1:-1;;;41859:54:0;;7531:2:1;41859:54:0::1;::::0;::::1;7513:21:1::0;7570:2;7550:18;;;7543:30;7609:28;7589:18;;;7582:56;7655:18;;41859:54:0::1;7329:350:1::0;41859:54:0::1;41924:14;:21:::0;;-1:-1:-1;;;;41924:21:0::1;-1:-1:-1::0;;;41924:21:0::1;::::0;;41976:12:::1;41956:17;:32:::0;41797:199::o;41416:262::-;20353:6;;-1:-1:-1;;;;;20353:6:0;447:10;20353:22;20345:67;;;;-1:-1:-1;;;20345:67:0;;;;;;;:::i;:::-;41536:38:::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;41524:9:::1;:50:::0;;;;;;;;;;;41634:2:::1;41563:10:::0;41594:20:::1;41552:9:::0;41542:8;41594:20:::1;:::i;:::-;:34;;;;:::i;:::-;41593:43;;41585:85;;;::::0;-1:-1:-1;;;41585:85:0;;8148:2:1;41585:85:0::1;::::0;::::1;8130:21:1::0;8187:2;8167:18;;;8160:30;8226:31;8206:18;;;8199:59;8275:18;;41585:85:0::1;7946:353:1::0;41585:85:0::1;41416:262:::0;;;:::o;6989:169::-;7072:4;7089:39;447:10;7112:7;7121:6;7089:8;:39::i;:::-;-1:-1:-1;7146:4:0;6989:169;;;;;:::o;43296:121::-;20353:6;;-1:-1:-1;;;;;20353:6:0;447:10;20353:22;20345:67;;;;-1:-1:-1;;;20345:67:0;;;;;;;:::i;:::-;43367:15:::1;::::0;:42:::1;::::0;-1:-1:-1;;;43367:42:0;;::::1;::::0;::::1;2732:25:1::0;;;-1:-1:-1;;;;;43367:15:0;;::::1;::::0;:31:::1;::::0;2705:18:1;;43367:42:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43296:121:::0;:::o;40608:321::-;20353:6;;-1:-1:-1;;;;;20353:6:0;447:10;20353:22;20345:67;;;;-1:-1:-1;;;20345:67:0;;;;;;;:::i;:::-;40713:4:::1;-1:-1:-1::0;;;;;40692:26:0;::::1;::::0;40684:77:::1;;;::::0;-1:-1:-1;;;40684:77:0;;8506:2:1;40684:77:0::1;::::0;::::1;8488:21:1::0;8545:2;8525:18;;;8518:30;8584:34;8564:18;;;8557:62;-1:-1:-1;;;8635:18:1;;;8628:36;8681:19;;40684:77:0::1;8304:402:1::0;40684:77:0::1;-1:-1:-1::0;;;;;40780:23:0;::::1;40772:69;;;::::0;-1:-1:-1;;;40772:69:0;;8913:2:1;40772:69:0::1;::::0;::::1;8895:21:1::0;8952:2;8932:18;;;8925:30;8991:34;8971:18;;;8964:62;-1:-1:-1;;;9042:18:1;;;9035:32;9084:19;;40772:69:0::1;8711:398:1::0;40772:69:0::1;40852:15;:27:::0;;-1:-1:-1;;;;;;40852:27:0::1;-1:-1:-1::0;;;;;40852:27:0;::::1;;::::0;;40889:32:::1;40852:27:::0;-1:-1:-1;40889:15:0::1;:32::i;:::-;40608:321:::0;:::o;41148:260::-;20353:6;;-1:-1:-1;;;;;20353:6:0;447:10;20353:22;20345:67;;;;-1:-1:-1;;;20345:67:0;;;;;;;:::i;:::-;41266:38:::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;41255:8:::1;:49:::0;;;;;;;;;;;41364:2:::1;41293:10:::0;41324:20:::1;41282:9:::0;41272:8;41324:20:::1;:::i;38870:148::-:0;38972:15;;38932:21;;38964:46;;-1:-1:-1;;;;;38972:15:0;38932:21;38964:34;:46::i;7640:355::-;7780:4;7797:36;7807:6;7815:9;7826:6;7797:9;:36::i;:::-;7844:121;7853:6;447:10;7875:89;7913:6;7875:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7875:19:0;;;;;;:11;:19;;;;;;;;447:10;7875:33;;;;;;;;;;:37;:89::i;:::-;7844:8;:121::i;:::-;-1:-1:-1;7983:4:0;7640:355;;;;;:::o;43542:141::-;43632:15;;:43;;;-1:-1:-1;;;43632:43:0;;;;43605:7;;-1:-1:-1;;;;;43632:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43625:50;;43542:141;:::o;8404:218::-;447:10;8492:4;8541:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;8541:34:0;;;;;;;;;;8492:4;;8509:83;;8532:7;;8541:50;;8580:10;8541:38;:50::i;40401:195::-;20353:6;;-1:-1:-1;;;;;20353:6:0;447:10;20353:22;20345:67;;;;-1:-1:-1;;;20345:67:0;;;;;;;:::i;:::-;40476:14:::1;5868:1:::0;40476:2:::1;:14;:::i;:::-;40470:20;::::0;:3:::1;:20;:::i;:::-;40455:12;:35:::0;40523:14:::1;5868:1:::0;40523:2:::1;:14;:::i;:::-;40517:20;::::0;:3:::1;:20;:::i;:::-;40501:13;:36:::0;40573:14:::1;5868:1:::0;40573:2:::1;:14;:::i;:::-;40567:20;::::0;:3:::1;:20;:::i;:::-;40548:16;:39:::0;40401:195::o;38465:103::-;38502:15;;:58;;-1:-1:-1;;;38502:58:0;;38541:10;38502:58;;;6823:51:1;38502:15:0;6890:18:1;;;6883:50;-1:-1:-1;;;;;38502:15:0;;;;:30;;6796:18:1;;38502:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;42800:437::-;20353:6;;-1:-1:-1;;;;;20353:6:0;447:10;20353:22;20345:67;;;;-1:-1:-1;;;20345:67:0;;;;;;;:::i;:::-;42898:6:::1;42886:8;:18;;:40;;;;;42920:6;42908:8;:18;;42886:40;42877:128;;;::::0;-1:-1:-1;;;42877:128:0;;11616:2:1;42877:128:0::1;::::0;::::1;11598:21:1::0;11655:2;11635:18;;;11628:30;11694:34;11674:18;;;11667:62;-1:-1:-1;;;11745:18:1;;;11738:50;11805:19;;42877:128:0::1;11414:416:1::0;42877:128:0::1;43036:16;;43024:8;:28:::0;43016:108:::1;;;::::0;-1:-1:-1;;;43016:108:0;;12037:2:1;43016:108:0::1;::::0;::::1;12019:21:1::0;12076:2;12056:18;;;12049:30;12115:34;12095:18;;;12088:62;-1:-1:-1;;;12166:18:1;;;12159:42;12218:19;;43016:108:0::1;11835:408:1::0;43016:108:0::1;43174:16;::::0;43140:51:::1;::::0;43164:8;;43140:51:::1;::::0;;;::::1;43202:16;:27:::0;42800:437::o;45142:142::-;45235:15;;:41;;;-1:-1:-1;;;45235:41:0;;;;45208:7;;-1:-1:-1;;;;;45235:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;44129:139;44226:15;;:34;;-1:-1:-1;;;44226:34:0;;-1:-1:-1;;;;;3429:32:1;;;44226:34:0;;;3411:51:1;44199:7:0;;44226:15;;:25;;3384:18:1;;44226:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;38083:374::-;38215:15;;:42;;-1:-1:-1;;;;;;38215:42:0;;;;;2732:25:1;;;38149:18:0;;;;;;-1:-1:-1;;;;;38215:15:0;;:37;;2705:18:1;;38215:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38273:176;;;12790:25:1;;;12846:2;12831:18;;12824:34;;;12874:18;;;12867:34;;;12932:2;12917:18;;12910:34;;;38148:109:0;;-1:-1:-1;38148:109:0;;-1:-1:-1;38148:109:0;-1:-1:-1;38429:9:0;;38391:5;;38273:176;;12777:3:1;12762:19;38273:176:0;;;;;;;38137:320;;;38083:374;:::o;20783:148::-;20353:6;;-1:-1:-1;;;;;20353:6:0;447:10;20353:22;20345:67;;;;-1:-1:-1;;;20345:67:0;;;;;;;:::i;:::-;20874:6:::1;::::0;20853:40:::1;::::0;20890:1:::1;::::0;-1:-1:-1;;;;;20874:6:0::1;::::0;20853:40:::1;::::0;20890:1;;20853:40:::1;20904:6;:19:::0;;-1:-1:-1;;;;;;20904:19:0::1;::::0;;20783:148::o;43985:136::-;44074:15;;:39;;;-1:-1:-1;;;44074:39:0;;;;44041:13;;-1:-1:-1;;;;;44074:15:0;;:37;;:39;;;;;:15;;:39;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44074:39:0;;;;;;;;;;;;:::i;5042:104::-;5098:13;5131:7;5124:14;;;;;:::i;42004:138::-;20353:6;;-1:-1:-1;;;;;20353:6:0;447:10;20353:22;20345:67;;;;-1:-1:-1;;;20345:67:0;;;;;;;:::i;:::-;42085:15:::1;::::0;:49:::1;::::0;-1:-1:-1;;;42085:49:0;;::::1;::::0;::::1;2732:25:1::0;;;-1:-1:-1;;;;;42085:15:0;;::::1;::::0;:41:::1;::::0;2705:18:1;;42085:49:0::1;2586:177:1::0;43425:109:0;43499:15;;:27;;;-1:-1:-1;;;43499:27:0;;;;43472:7;;-1:-1:-1;;;;;43499:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;;;;;9125:269;9218:4;9235:129;447:10;9258:7;9267:96;9306:15;9267:96;;;;;;;;;;;;;;;;;447:10;9267:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;9267:34:0;;;;;;;;;;;;:38;:96::i;43825:152::-;43922:15;;:47;;-1:-1:-1;;;43922:47:0;;-1:-1:-1;;;;;3429:32:1;;;43922:47:0;;;3411:51:1;43895:7:0;;43922:15;;:38;;3384:18:1;;43922:47:0;3229:239:1;6453:175:0;6539:4;6556:42;447:10;6580:9;6591:6;6556:9;:42::i;44276:351::-;44584:15;;:35;;-1:-1:-1;;;44584:35:0;;-1:-1:-1;;;;;3429:32:1;;;44584:35:0;;;3411:51:1;44390:7:0;;;;;;;;;;;;;;;;44584:15;;;:26;;3384:18:1;;44584:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44577:42;;;;;;;;;;;;;;;;44276:351;;;;;;;;;:::o;40937:203::-;20353:6;;-1:-1:-1;;;;;20353:6:0;447:10;20353:22;20345:67;;;;-1:-1:-1;;;20345:67:0;;;;;;;:::i;:::-;41032:3:::1;41022:6;:13;;41014:72;;;::::0;-1:-1:-1;;;41014:72:0;;14877:2:1;41014:72:0::1;::::0;::::1;14859:21:1::0;14916:2;14896:18;;;14889:30;14955:34;14935:18;;;14928:62;-1:-1:-1;;;15006:18:1;;;14999:44;15060:19;;41014:72:0::1;14675:410:1::0;41014:72:0::1;41118:14;:6:::0;41127:5:::1;41118:14;:::i;:::-;41097:18;:35:::0;-1:-1:-1;40937:203:0:o;39904:488::-;20353:6;;-1:-1:-1;;;;;20353:6:0;447:10;20353:22;20345:67;;;;-1:-1:-1;;;20345:67:0;;;;;;;:::i;:::-;40022:3:::1;40012:6;:13;;40004:67;;;::::0;-1:-1:-1;;;40004:67:0;;15292:2:1;40004:67:0::1;::::0;::::1;15274:21:1::0;15331:2;15311:18;;;15304:30;15370:34;15350:18;;;15343:62;-1:-1:-1;;;15421:18:1;;;15414:39;15470:19;;40004:67:0::1;15090:405:1::0;40004:67:0::1;40101:3;40090:7;:14;;40082:69;;;::::0;-1:-1:-1;;;40082:69:0;;15702:2:1;40082:69:0::1;::::0;::::1;15684:21:1::0;15741:2;15721:18;;;15714:30;15780:34;15760:18;;;15753:62;-1:-1:-1;;;15831:18:1;;;15824:40;15881:19;;40082:69:0::1;15500:406:1::0;40082:69:0::1;40183:3;40170:9;:16;;40162:65;;;::::0;-1:-1:-1;;;40162:65:0;;16113:2:1;40162:65:0::1;::::0;::::1;16095:21:1::0;16152:2;16132:18;;;16125:30;16191:34;16171:18;;;16164:62;-1:-1:-1;;;16242:18:1;;;16235:34;16286:19;;40162:65:0::1;15911:400:1::0;40162:65:0::1;40262:14;5868:1:::0;40262:2:::1;:14;:::i;:::-;40253:23;::::0;:6;:23:::1;:::i;:::-;40238:12;:38:::0;40313:14:::1;5868:1:::0;40313:2:::1;:14;:::i;:::-;40303:24;::::0;:7;:24:::1;:::i;:::-;40287:13;:40:::0;40369:14:::1;5868:1:::0;40369:2:::1;:14;:::i;:::-;40357:26;::::0;:9;:26:::1;:::i;:::-;40338:16;:45:::0;-1:-1:-1;;;39904:488:0:o;39026:327::-;20353:6;;-1:-1:-1;;;;;20353:6:0;447:10;20353:22;20345:67;;;;-1:-1:-1;;;20345:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39133:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;:40;::::1;;:28;::::0;;::::1;:40;;::::0;39111:132:::1;;;::::0;-1:-1:-1;;;39111:132:0;;16518:2:1;39111:132:0::1;::::0;::::1;16500:21:1::0;16557:2;16537:18;;;16530:30;16596:34;16576:18;;;16569:62;-1:-1:-1;;;16647:18:1;;;16640:40;16697:19;;39111:132:0::1;16316:406:1::0;39111:132:0::1;-1:-1:-1::0;;;;;39254:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;39254:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;39311:34;;2097:41:1;;;39311:34:0::1;::::0;2070:18:1;39311:34:0::1;;;;;;;39026:327:::0;;:::o;38576:286::-;20353:6;;-1:-1:-1;;;;;20353:6:0;447:10;20353:22;20345:67;;;;-1:-1:-1;;;20345:67:0;;;;;;;:::i;:::-;38687:4:::1;-1:-1:-1::0;;;;;38663:29:0;::::1;::::0;38655:96:::1;;;::::0;-1:-1:-1;;;38655:96:0;;16929:2:1;38655:96:0::1;::::0;::::1;16911:21:1::0;16968:2;16948:18;;;16941:30;17007:34;16987:18;;;16980:62;-1:-1:-1;;;17058:18:1;;;17051:52;17120:19;;38655:96:0::1;16727:418:1::0;38655:96:0::1;38792:15;::::0;38808:45:::1;::::0;-1:-1:-1;;;38808:45:0;;38847:4:::1;38808:45;::::0;::::1;3411:51:1::0;-1:-1:-1;;;;;38762:29:0;;::::1;::::0;::::1;::::0;38792:15;::::1;::::0;38762:29;;38808:30:::1;::::0;3384:18:1;;38808:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38762:92;::::0;-1:-1:-1;;;;;;38762:92:0::1;::::0;;;;;;-1:-1:-1;;;;;17342:32:1;;;38762:92:0::1;::::0;::::1;17324:51:1::0;17391:18;;;17384:34;17297:18;;38762:92:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38576:286:::0;:::o;39361:326::-;20353:6;;-1:-1:-1;;;;;20353:6:0;447:10;20353:22;20345:67;;;;-1:-1:-1;;;20345:67:0;;;;;;;:::i;:::-;39502:9:::1;39497:116;39517:19:::0;;::::1;39497:116;;;39593:8;39558:19;:32;39578:8;;39587:1;39578:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39558:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;39558:32:0;:43;;-1:-1:-1;;39558:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;39538:3;::::1;::::0;::::1;:::i;:::-;;;;39497:116;;;;39628:51;39660:8;;39670;39628:51;;;;;;;;:::i;:::-;;;;;;;;39361:326:::0;;;:::o;41686:99::-;20353:6;;-1:-1:-1;;;;;20353:6:0;447:10;20353:22;20345:67;;;;-1:-1:-1;;;20345:67:0;;;;;;;:::i;:::-;41755:11:::1;:22:::0;;;::::1;;-1:-1:-1::0;;;41755:22:0::1;-1:-1:-1::0;;;;41755:22:0;;::::1;::::0;;;::::1;::::0;;41686:99::o;45004:130::-;45087:15;;:39;;;-1:-1:-1;;;45087:39:0;;;;45060:7;;-1:-1:-1;;;;;45087:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;44635:361;44948:15;;:40;;-1:-1:-1;;;44948:40:0;;;;;2732:25:1;;;44754:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44948:15:0;;;;:33;;2705:18:1;;44948:40:0;2586:177:1;21086:244:0;20353:6;;-1:-1:-1;;;;;20353:6:0;447:10;20353:22;20345:67;;;;-1:-1:-1;;;20345:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21175:22:0;::::1;21167:73;;;::::0;-1:-1:-1;;;21167:73:0;;18702:2:1;21167:73:0::1;::::0;::::1;18684:21:1::0;18741:2;18721:18;;;18714:30;18780:34;18760:18;;;18753:62;-1:-1:-1;;;18831:18:1;;;18824:36;18877:19;;21167:73:0::1;18500:402:1::0;21167:73:0::1;21277:6;::::0;21256:38:::1;::::0;-1:-1:-1;;;;;21256:38:0;;::::1;::::0;21277:6:::1;::::0;21256:38:::1;::::0;21277:6:::1;::::0;21256:38:::1;21305:6;:17:::0;;-1:-1:-1;;;;;;21305:17:0::1;-1:-1:-1::0;;;;;21305:17:0;;;::::1;::::0;;;::::1;::::0;;21086:244::o;12251:380::-;-1:-1:-1;;;;;12387:19:0;;12379:68;;;;-1:-1:-1;;;12379:68:0;;19109:2:1;12379:68:0;;;19091:21:1;19148:2;19128:18;;;19121:30;19187:34;19167:18;;;19160:62;-1:-1:-1;;;19238:18:1;;;19231:34;19282:19;;12379:68:0;18907:400:1;12379:68:0;-1:-1:-1;;;;;12466:21:0;;12458:68;;;;-1:-1:-1;;;12458:68:0;;19514:2:1;12458:68:0;;;19496:21:1;19553:2;19533:18;;;19526:30;19592:34;19572:18;;;19565:62;-1:-1:-1;;;19643:18:1;;;19636:32;19685:19;;12458:68:0;19312:398:1;12458:68:0;-1:-1:-1;;;;;12539:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;12591:32;;2732:25:1;;;12591:32:0;;2705:18:1;12591:32:0;;;;;;;;12251:380;;;:::o;34952:319::-;35067:6;35042:21;:31;;35034:73;;;;-1:-1:-1;;;35034:73:0;;19917:2:1;35034:73:0;;;19899:21:1;19956:2;19936:18;;;19929:30;19995:31;19975:18;;;19968:59;20044:18;;35034:73:0;19715:353:1;35034:73:0;35121:12;35139:9;-1:-1:-1;;;;;35139:14:0;35162:6;35139:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35120:54;;;35193:7;35185:78;;;;-1:-1:-1;;;35185:78:0;;20485:2:1;35185:78:0;;;20467:21:1;20524:2;20504:18;;;20497:30;20563:34;20543:18;;;20536:62;20634:28;20614:18;;;20607:56;20680:19;;35185:78:0;20283:422:1;45292:3613:0;-1:-1:-1;;;;;45424:18:0;;45416:68;;;;-1:-1:-1;;;45416:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45503:16:0;;45495:64;;;;-1:-1:-1;;;45495:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45577:25:0;;;;;;:19;:25;;;;;;;;45576:26;:54;;;;-1:-1:-1;;;;;;45607:23:0;;;;;;:19;:23;;;;;;;;45606:24;45576:54;45572:135;;;45659:14;;-1:-1:-1;;;45659:14:0;;;;45651:44;;;;-1:-1:-1;;;45651:44:0;;21722:2:1;45651:44:0;;;21704:21:1;21761:2;21741:18;;;21734:30;-1:-1:-1;;;21780:18:1;;;21773:47;21837:18;;45651:44:0;21520:341:1;45651:44:0;-1:-1:-1;;;;;45731:29:0;;;;;;:25;:29;;;;;;;;45730:30;:60;;;;-1:-1:-1;;;;;;45765:25:0;;;;;;:19;:25;;;;;;;;45764:26;45730:60;:88;;;;-1:-1:-1;;;;;;45795:23:0;;;;;;:19;:23;;;;;;;;45794:24;45730:88;45726:220;;;45876:16;;45865:6;45848:13;45858:2;-1:-1:-1;;;;;6214:18:0;6187:7;6214:18;;;;;;;;;;;;6113:127;45848:13;:24;;;;:::i;:::-;:44;;45839:95;;;;-1:-1:-1;;;45839:95:0;;22068:2:1;45839:95:0;;;22050:21:1;22107:2;22087:18;;;22080:30;22146:34;22126:18;;;22119:62;-1:-1:-1;;;22197:18:1;;;22190:35;22242:19;;45839:95:0;21866:401:1;45839:95:0;-1:-1:-1;;;;;45975:31:0;;;;;;:25;:31;;;;;;;;:61;;;;-1:-1:-1;;;;;;46011:25:0;;;;;;:19;:25;;;;;;;;46010:26;45975:61;:89;;;;-1:-1:-1;;;;;;46041:23:0;;;;;;:19;:23;;;;;;;;46040:24;45975:89;45971:191;;;46103:12;;46093:6;:22;;46085:65;;;;-1:-1:-1;;;46085:65:0;;22474:2:1;46085:65:0;;;22456:21:1;22513:2;22493:18;;;22486:30;22552:32;22532:18;;;22525:60;22602:18;;46085:65:0;22272:354:1;46085:65:0;-1:-1:-1;;;;;46191:31:0;;;;;;:25;:31;;;;;;;;46190:32;:62;;;;-1:-1:-1;;;;;;46227:25:0;;;;;;:19;:25;;;;;;;;46226:26;46190:62;:90;;;;-1:-1:-1;;;;;;46257:23:0;;;;;;:19;:23;;;;;;;;46256:24;46190:90;46186:194;;;46319:13;;46309:6;:23;;46301:67;;;;-1:-1:-1;;;46301:67:0;;22833:2:1;46301:67:0;;;22815:21:1;22872:2;22852:18;;;22845:30;22911:33;22891:18;;;22884:61;22962:18;;46301:67:0;22631:355:1;46301:67:0;46394:6;46404:1;46394:11;46390:93;;46422:28;46438:4;46444:2;46448:1;46422:15;:28::i;46390:93::-;46544:4;46495:28;6214:18;;;;;;;;;;;46600;;46715:19;;46680;;46715:9;46647:17;6214:18;;46576:42;;;;;46647:52;;46680:19;46647:52;:::i;:::-;:87;;;;:::i;:::-;46629:105;;46766:7;:33;;;;-1:-1:-1;46791:8:0;;-1:-1:-1;;;46791:8:0;;;;46790:9;46766:33;:61;;;;-1:-1:-1;46816:11:0;;-1:-1:-1;;;46816:11:0;;;;46766:61;:110;;;;-1:-1:-1;;;;;;46845:31:0;;;;;;:25;:31;;;;;;;;46844:32;46766:110;:153;;;;-1:-1:-1;;;;;;46894:25:0;;;;;;:19;:25;;;;;;;;46893:26;46766:153;:194;;;;-1:-1:-1;;;;;;46937:23:0;;;;;;:19;:23;;;;;;;;46936:24;46766:194;46748:410;;;46987:8;:15;;-1:-1:-1;;;;46987:15:0;-1:-1:-1;;;46987:15:0;;;47023:11;;47019:95;;47055:43;47070:18;;47090:7;47055:14;:43::i;:::-;47130:8;:16;;-1:-1:-1;;;;47130:16:0;;;46748:410;47186:8;;-1:-1:-1;;;;;47211:25:0;;47170:12;47211:25;;;:19;:25;;;;;;47186:8;-1:-1:-1;;;47186:8:0;;;;;47185:9;;47211:25;;:52;;-1:-1:-1;;;;;;47240:23:0;;;;;;:19;:23;;;;;;;;47211:52;47207:100;;;-1:-1:-1;47290:5:0;47207:100;47325:7;47321:815;;;47349:17;47405:13;;47385:17;;:33;;;;:::i;:::-;-1:-1:-1;;;;;47481:29:0;;47433:15;47481:29;;;:25;:29;;;;;;47369:12;:49;;;;;;-1:-1:-1;47433:15:0;47481:29;;:46;;;;;47515:12;47514:13;47481:46;47477:532;;;47579:3;47559:16;47568:7;47559:6;:16;:::i;:::-;47558:24;;;;:::i;:::-;47548:34;;47477:532;;;-1:-1:-1;;;;;47622:31:0;;;;;;:25;:31;;;;;;;;:48;;;;;47658:12;47657:13;47622:48;47618:391;;;47856:18;;47806;;47856:8;47758:16;47880:3;;47856:18;47758:66;;;:::i;:::-;:116;;;;:::i;:::-;47723:153;;:6;:153;:::i;47618:391::-;47923:12;47919:90;;;47989:3;47976:9;;47967:6;:18;;;;:::i;:::-;47966:26;;;;:::i;:::-;47956:36;;47919:90;48046:18;48056:7;48046:6;:18;:::i;:::-;48037:27;;48079:45;48095:4;48109;48116:7;48079:15;:45::i;:::-;47334:802;;47321:815;48156:33;48172:4;48178:2;48182:6;48156:15;:33::i;:::-;48214:15;;-1:-1:-1;;;;;48214:15:0;:26;48241:4;48247:15;48241:4;-1:-1:-1;;;;;6214:18:0;6187:7;6214:18;;;;;;;;;;;;6113:127;48247:15;48214:49;;-1:-1:-1;;;;;;48214:49:0;;;;;;;-1:-1:-1;;;;;17342:32:1;;;48214:49:0;;;17324:51:1;17391:18;;;17384:34;17297:18;;48214:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48210:65;48289:15;;-1:-1:-1;;;;;48289:15:0;:26;48316:2;48320:13;48316:2;-1:-1:-1;;;;;6214:18:0;6187:7;6214:18;;;;;;;;;;;;6113:127;48320:13;48289:45;;-1:-1:-1;;;;;;48289:45:0;;;;;;;-1:-1:-1;;;;;17342:32:1;;;48289:45:0;;;17324:51:1;17391:18;;;17384:34;17297:18;;48289:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48285:61;48363:8;;-1:-1:-1;;;48363:8:0;;;;48358:540;;48402:16;;48439:15;;:28;;-1:-1:-1;;;;;;48439:28:0;;;;;2732:25:1;;;-1:-1:-1;;;;;48439:15:0;;;;:23;;2705:18:1;;48439:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;48439:28:0;;;;;;;;-1:-1:-1;;48439:28:0;;;;;;;;;;;;:::i;:::-;;;48435:452;;;48631:231;;;12790:25:1;;;12846:2;12831:18;;12824:34;;;12874:18;;;12867:34;;;12932:2;12917:18;;12910:34;;;48834:9:0;;48781:4;;48631:231;;12777:3:1;12762:19;48631:231:0;;;;;;;48468:410;;;48435:452;48373:525;48358:540;45405:3500;;;;45292:3613;;;:::o;13937:192::-;14023:7;14059:12;14051:6;;;;14043:29;;;;-1:-1:-1;;;14043:29:0;;;;;;;;:::i;:::-;-1:-1:-1;14083:9:0;14095:5;14099:1;14095;:5;:::i;:::-;14083:17;13937:192;-1:-1:-1;;;;;13937:192:0:o;13034:181::-;13092:7;;13124:5;13128:1;13124;:5;:::i;:::-;13112:17;;13153:1;13148;:6;;13140:46;;;;-1:-1:-1;;;13140:46:0;;23548:2:1;13140:46:0;;;23530:21:1;23587:2;23567:18;;;23560:30;23626:29;23606:18;;;23599:57;23673:18;;13140:46:0;23346:351:1;13140:46:0;13206:1;13034:181;-1:-1:-1;;;13034:181:0:o;9884:573::-;-1:-1:-1;;;;;10024:20:0;;10016:70;;;;-1:-1:-1;;;10016:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10105:23:0;;10097:71;;;;-1:-1:-1;;;10097:71:0;;;;;;;:::i;:::-;10261;10283:6;10261:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10261:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;10241:17:0;;;:9;:17;;;;;;;;;;;:91;;;;10366:20;;;;;;;:32;;10391:6;10366:24;:32::i;:::-;-1:-1:-1;;;;;10343:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;10414:35;2732:25:1;;;10343:20:0;;10414:35;;;;;;2705:18:1;10414:35:0;2586:177:1;48913:1175:0;48989:19;49011:11;:7;49021:1;49011:11;:::i;:::-;48989:33;;49033:32;49101:11;49078:9;:19;;;49069:6;:28;;;;:::i;:::-;49068:44;;;;:::i;:::-;49033:79;-1:-1:-1;49123:14:0;49140:33;49033:79;49140:6;:33;:::i;:::-;49123:50;-1:-1:-1;49209:21:0;49241:24;49123:50;49241:16;:24::i;:::-;49276:20;49299:38;49323:14;49299:21;:38;:::i;:::-;49400:19;;49276:61;;-1:-1:-1;49348:19:0;;49386:33;;:11;:33;:::i;:::-;49370:50;;:12;:50;:::i;:::-;49477:19;;49348:72;;-1:-1:-1;49431:29:0;;49463:33;;49348:72;49463:33;:::i;:::-;49431:65;-1:-1:-1;49511:25:0;;49507:119;;49553:61;49566:24;49592:21;49553:12;:61::i;:::-;49683:19;;49636:26;;49665:15;:11;49679:1;49665:15;:::i;:::-;:37;;;;:::i;:::-;49636:66;-1:-1:-1;49717:22:0;;49713:109;;49764:15;;49756:54;;-1:-1:-1;;;;;49764:15:0;49791:18;49756:34;:54::i;:::-;49870:9;:17;49832;;49852:15;:11;49866:1;49852:15;:::i;:::-;:35;;;;:::i;:::-;49832:55;-1:-1:-1;49902:13:0;;49898:183;;49959:15;;49951:53;;49933:12;;-1:-1:-1;;;;;49959:15:0;;49989:9;;49933:12;49951:53;49933:12;49951:53;49989:9;49959:15;49951:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49932:72;;;50023:7;50019:50;;;50037:32;;;23876:25:1;;;23932:2;23917:18;;23910:34;;;50037:32:0;;23849:18:1;50037:32:0;;;;;;;50019:50;49917:164;49898:183;48978:1110;;;;;;;;;48913:1175;;:::o;50096:472::-;50186:16;;;50200:1;50186:16;;;;;;;;50162:21;;50186:16;;;;;;;;;;-1:-1:-1;50186:16:0;50162:40;;50231:4;50213;50218:1;50213:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50213:23:0;;;:7;;;;;;;;;;:23;;;;50257:6;;:13;;;-1:-1:-1;;;50257:13:0;;;;:6;;;;;:11;;:13;;;;;50213:7;;50257:13;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50247:4;50252:1;50247:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50247:23:0;;;:7;;;;;;;;;:23;50313:6;;50281:53;;50298:4;;50313:6;50322:11;50281:8;:53::i;:::-;50345:6;;:215;;-1:-1:-1;;;50345:215:0;;-1:-1:-1;;;;;50345:6:0;;;;:57;;:215;;50417:11;;50345:6;;50487:4;;50514;;50534:15;;50345:215;;;:::i;50576:401::-;50689:6;;50657:53;;50674:4;;-1:-1:-1;;;;;50689:6:0;50698:11;50657:8;:53::i;:::-;50721:6;;:248;;-1:-1:-1;;;50721:248:0;;50786:4;50721:248;;;25537:34:1;25587:18;;;25580:34;;;50721:6:0;25630:18:1;;;25623:34;;;25673:18;;;25666:34;35655:42:0;25716:19:1;;;25709:44;50943:15:0;25769:19:1;;;25762:35;-1:-1:-1;;;;;50721:6:0;;;;:22;;50752:9;;25471:19:1;;50721:248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:118;236:5;229:13;222:21;215:5;212:32;202:60;;258:1;255;248:12;273:382;338:6;346;399:2;387:9;378:7;374:23;370:32;367:52;;;415:1;412;405:12;367:52;454:9;441:23;473:31;498:5;473:31;:::i;:::-;523:5;-1:-1:-1;580:2:1;565:18;;552:32;593:30;552:32;593:30;:::i;:::-;642:7;632:17;;;273:382;;;;;:::o;660:250::-;745:1;755:113;769:6;766:1;763:13;755:113;;;845:11;;;839:18;826:11;;;819:39;791:2;784:10;755:113;;;-1:-1:-1;;902:1:1;884:16;;877:27;660:250::o;915:396::-;1064:2;1053:9;1046:21;1027:4;1096:6;1090:13;1139:6;1134:2;1123:9;1119:18;1112:34;1155:79;1227:6;1222:2;1211:9;1207:18;1202:2;1194:6;1190:15;1155:79;:::i;:::-;1295:2;1274:15;-1:-1:-1;;1270:29:1;1255:45;;;;1302:2;1251:54;;915:396;-1:-1:-1;;915:396:1:o;1316:316::-;1393:6;1401;1409;1462:2;1450:9;1441:7;1437:23;1433:32;1430:52;;;1478:1;1475;1468:12;1430:52;-1:-1:-1;;1501:23:1;;;1571:2;1556:18;;1543:32;;-1:-1:-1;1622:2:1;1607:18;;;1594:32;;1316:316;-1:-1:-1;1316:316:1:o;1637:315::-;1705:6;1713;1766:2;1754:9;1745:7;1741:23;1737:32;1734:52;;;1782:1;1779;1772:12;1734:52;1821:9;1808:23;1840:31;1865:5;1840:31;:::i;:::-;1890:5;1942:2;1927:18;;;;1914:32;;-1:-1:-1;;;1637:315:1:o;2149:180::-;2208:6;2261:2;2249:9;2240:7;2236:23;2232:32;2229:52;;;2277:1;2274;2267:12;2229:52;-1:-1:-1;2300:23:1;;2149:180;-1:-1:-1;2149:180:1:o;2334:247::-;2393:6;2446:2;2434:9;2425:7;2421:23;2417:32;2414:52;;;2462:1;2459;2452:12;2414:52;2501:9;2488:23;2520:31;2545:5;2520:31;:::i;2768:456::-;2845:6;2853;2861;2914:2;2902:9;2893:7;2889:23;2885:32;2882:52;;;2930:1;2927;2920:12;2882:52;2969:9;2956:23;2988:31;3013:5;2988:31;:::i;:::-;3038:5;-1:-1:-1;3095:2:1;3080:18;;3067:32;3108:33;3067:32;3108:33;:::i;:::-;2768:456;;3160:7;;-1:-1:-1;;;3214:2:1;3199:18;;;;3186:32;;2768:456::o;4900:750::-;4992:6;5000;5008;5061:2;5049:9;5040:7;5036:23;5032:32;5029:52;;;5077:1;5074;5067:12;5029:52;5117:9;5104:23;5146:18;5187:2;5179:6;5176:14;5173:34;;;5203:1;5200;5193:12;5173:34;5241:6;5230:9;5226:22;5216:32;;5286:7;5279:4;5275:2;5271:13;5267:27;5257:55;;5308:1;5305;5298:12;5257:55;5348:2;5335:16;5374:2;5366:6;5363:14;5360:34;;;5390:1;5387;5380:12;5360:34;5445:7;5438:4;5428:6;5425:1;5421:14;5417:2;5413:23;5409:34;5406:47;5403:67;;;5466:1;5463;5456:12;5403:67;5497:4;5489:13;;;;-1:-1:-1;5521:6:1;-1:-1:-1;;5562:20:1;;5549:34;5592:28;5549:34;5592:28;:::i;:::-;5639:5;5629:15;;;4900:750;;;;;:::o;5655:388::-;5723:6;5731;5784:2;5772:9;5763:7;5759:23;5755:32;5752:52;;;5800:1;5797;5790:12;5752:52;5839:9;5826:23;5858:31;5883:5;5858:31;:::i;:::-;5908:5;-1:-1:-1;5965:2:1;5950:18;;5937:32;5978:33;5937:32;5978:33;:::i;6048:241::-;6104:6;6157:2;6145:9;6136:7;6132:23;6128:32;6125:52;;;6173:1;6170;6163:12;6125:52;6212:9;6199:23;6231:28;6253:5;6231:28;:::i;6294:356::-;6496:2;6478:21;;;6515:18;;;6508:30;6574:34;6569:2;6554:18;;6547:62;6641:2;6626:18;;6294:356::o;6944:380::-;7023:1;7019:12;;;;7066;;;7087:61;;7141:4;7133:6;7129:17;7119:27;;7087:61;7194:2;7186:6;7183:14;7163:18;7160:38;7157:161;;7240:10;7235:3;7231:20;7228:1;7221:31;7275:4;7272:1;7265:15;7303:4;7300:1;7293:15;7157:161;;6944:380;;;:::o;7684:127::-;7745:10;7740:3;7736:20;7733:1;7726:31;7776:4;7773:1;7766:15;7800:4;7797:1;7790:15;7816:125;7881:9;;;7902:10;;;7899:36;;;7915:18;;:::i;9114:184::-;9184:6;9237:2;9225:9;9216:7;9212:23;9208:32;9205:52;;;9253:1;9250;9243:12;9205:52;-1:-1:-1;9276:16:1;;9114:184;-1:-1:-1;9114:184:1:o;9303:422::-;9392:1;9435:5;9392:1;9449:270;9470:7;9460:8;9457:21;9449:270;;;9529:4;9525:1;9521:6;9517:17;9511:4;9508:27;9505:53;;;9538:18;;:::i;:::-;9588:7;9578:8;9574:22;9571:55;;;9608:16;;;;9571:55;9687:22;;;;9647:15;;;;9449:270;;;9453:3;9303:422;;;;;:::o;9730:806::-;9779:5;9809:8;9799:80;;-1:-1:-1;9850:1:1;9864:5;;9799:80;9898:4;9888:76;;-1:-1:-1;9935:1:1;9949:5;;9888:76;9980:4;9998:1;9993:59;;;;10066:1;10061:130;;;;9973:218;;9993:59;10023:1;10014:10;;10037:5;;;10061:130;10098:3;10088:8;10085:17;10082:43;;;10105:18;;:::i;:::-;-1:-1:-1;;10161:1:1;10147:16;;10176:5;;9973:218;;10275:2;10265:8;10262:16;10256:3;10250:4;10247:13;10243:36;10237:2;10227:8;10224:16;10219:2;10213:4;10210:12;10206:35;10203:77;10200:159;;;-1:-1:-1;10312:19:1;;;10344:5;;10200:159;10391:34;10416:8;10410:4;10391:34;:::i;:::-;10461:6;10457:1;10453:6;10449:19;10440:7;10437:32;10434:58;;;10472:18;;:::i;:::-;10510:20;;9730:806;-1:-1:-1;;;9730:806:1:o;10541:140::-;10599:5;10628:47;10669:4;10659:8;10655:19;10649:4;10628:47;:::i;10686:168::-;10759:9;;;10790;;10807:15;;;10801:22;;10787:37;10777:71;;10828:18;;:::i;11164:245::-;11231:6;11284:2;11272:9;11263:7;11259:23;11255:32;11252:52;;;11300:1;11297;11290:12;11252:52;11332:9;11326:16;11351:28;11373:5;11351:28;:::i;12248:306::-;12336:6;12344;12352;12405:2;12393:9;12384:7;12380:23;12376:32;12373:52;;;12421:1;12418;12411:12;12373:52;12450:9;12444:16;12434:26;;12500:2;12489:9;12485:18;12479:25;12469:35;;12544:2;12533:9;12529:18;12523:25;12513:35;;12248:306;;;;;:::o;12955:127::-;13016:10;13011:3;13007:20;13004:1;12997:31;13047:4;13044:1;13037:15;13071:4;13068:1;13061:15;13087:897;13167:6;13220:2;13208:9;13199:7;13195:23;13191:32;13188:52;;;13236:1;13233;13226:12;13188:52;13269:9;13263:16;13298:18;13339:2;13331:6;13328:14;13325:34;;;13355:1;13352;13345:12;13325:34;13393:6;13382:9;13378:22;13368:32;;13438:7;13431:4;13427:2;13423:13;13419:27;13409:55;;13460:1;13457;13450:12;13409:55;13489:2;13483:9;13511:2;13507;13504:10;13501:36;;;13517:18;;:::i;:::-;13592:2;13586:9;13560:2;13646:13;;-1:-1:-1;;13642:22:1;;;13666:2;13638:31;13634:40;13622:53;;;13690:18;;;13710:22;;;13687:46;13684:72;;;13736:18;;:::i;:::-;13776:10;13772:2;13765:22;13811:2;13803:6;13796:18;13851:7;13846:2;13841;13837;13833:11;13829:20;13826:33;13823:53;;;13872:1;13869;13862:12;13823:53;13885:68;13950:2;13945;13937:6;13933:15;13928:2;13924;13920:11;13885:68;:::i;:::-;13972:6;13087:897;-1:-1:-1;;;;;;;13087:897:1:o;13989:681::-;14120:6;14128;14136;14144;14152;14160;14168;14176;14229:3;14217:9;14208:7;14204:23;14200:33;14197:53;;;14246:1;14243;14236:12;14197:53;14278:9;14272:16;14297:31;14322:5;14297:31;:::i;:::-;14347:5;14337:15;;;14392:2;14381:9;14377:18;14371:25;14361:35;;14436:2;14425:9;14421:18;14415:25;14405:35;;14480:2;14469:9;14465:18;14459:25;14449:35;;14524:3;14513:9;14509:19;14503:26;14493:36;;14569:3;14558:9;14554:19;14548:26;14538:36;;14614:3;14603:9;14599:19;14593:26;14583:36;;14659:3;14648:9;14644:19;14638:26;14628:36;;13989:681;;;;;;;;;;;:::o;17429:127::-;17490:10;17485:3;17481:20;17478:1;17471:31;17521:4;17518:1;17511:15;17545:4;17542:1;17535:15;17561:135;17600:3;17621:17;;;17618:43;;17641:18;;:::i;:::-;-1:-1:-1;17688:1:1;17677:13;;17561:135::o;17701:794::-;17923:2;17935:21;;;17908:18;;17991:22;;;17875:4;18070:6;18044:2;18029:18;;17875:4;18104:304;18118:6;18115:1;18112:13;18104:304;;;18193:6;18180:20;18213:31;18238:5;18213:31;:::i;:::-;-1:-1:-1;;;;;18269:31:1;18257:44;;18324:4;18383:15;;;;18348:12;;;;18297:1;18133:9;18104:304;;;18108:3;18425;18417:11;;;;18480:6;18473:14;18466:22;18459:4;18448:9;18444:20;18437:52;17701:794;;;;;;:::o;20710:401::-;20912:2;20894:21;;;20951:2;20931:18;;;20924:30;20990:34;20985:2;20970:18;;20963:62;-1:-1:-1;;;21056:2:1;21041:18;;21034:35;21101:3;21086:19;;20710:401::o;21116:399::-;21318:2;21300:21;;;21357:2;21337:18;;;21330:30;21396:34;21391:2;21376:18;;21369:62;-1:-1:-1;;;21462:2:1;21447:18;;21440:33;21505:3;21490:19;;21116:399::o;22991:217::-;23031:1;23057;23047:132;;23101:10;23096:3;23092:20;23089:1;23082:31;23136:4;23133:1;23126:15;23164:4;23161:1;23154:15;23047:132;-1:-1:-1;23193:9:1;;22991:217::o;23213:128::-;23280:9;;;23301:11;;;23298:37;;;23315:18;;:::i;23955:251::-;24025:6;24078:2;24066:9;24057:7;24053:23;24049:32;24046:52;;;24094:1;24091;24084:12;24046:52;24126:9;24120:16;24145:31;24170:5;24145:31;:::i;24211:980::-;24473:4;24521:3;24510:9;24506:19;24552:6;24541:9;24534:25;24578:2;24616:6;24611:2;24600:9;24596:18;24589:34;24659:3;24654:2;24643:9;24639:18;24632:31;24683:6;24718;24712:13;24749:6;24741;24734:22;24787:3;24776:9;24772:19;24765:26;;24826:2;24818:6;24814:15;24800:29;;24847:1;24857:195;24871:6;24868:1;24865:13;24857:195;;;24936:13;;-1:-1:-1;;;;;24932:39:1;24920:52;;25027:15;;;;24992:12;;;;24968:1;24886:9;24857:195;;;-1:-1:-1;;;;;;;25108:32:1;;;;25103:2;25088:18;;25081:60;-1:-1:-1;;;25172:3:1;25157:19;25150:35;25069:3;24211:980;-1:-1:-1;;;24211:980:1:o

Swarm Source

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