ETH Price: $3,674.50 (+2.47%)

Token

PixiaAI (PIXIA)
 

Overview

Max Total Supply

100,000,000 PIXIA

Holders

1,882 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
287,858.631957232256443173 PIXIA

Value
$0.00
0xfb0e5a62caa5cbd83e4f997d98f7f04bd1b88746
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

PIXIA is an AI that can generate art, create NFT collections, staking contracts and much more!

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PixiaAI

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 10 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT


/*
 * █▀█ █ ▀▄▀ █ ▄▀█   ▄▀█ █
 * █▀▀ █ █░█ █ █▀█   █▀█ █
 *
 * https://Pixia.Ai
 * https://t.me/PixiaAi
 * https://twitter.com/PixiaAi
*/


pragma solidity 0.8.17;

interface IUniswapV2Router01 {

    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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

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

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


interface IUniswapV2Router02 is IUniswapV2Router01 {

    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);

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

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

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

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


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

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

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

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

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


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) internal view returns (uint) {
        return map.values[key];
    }

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

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

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

    function set(Map storage map, address key, uint val) internal {
        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) internal {
        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();
    }
}


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

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

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


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


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

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

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


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

    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        
        require(b != -1 || a != MIN_INT256);

        
        return a / b;
    }
   
    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;
    }

    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;
    }
    
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }

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


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


library SafeMath {
  
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }
    
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }
    
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
          
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }
    
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }
    
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }
    
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

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

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

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

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


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

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


abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _setOwner(_msgSender());
    }

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


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

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

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

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

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

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

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

interface IERC20Metadata is IERC20 {
    
    function name() external view returns (string memory);

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

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


contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    // The name function returns the name of the token.
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    // The symbol function returns the symbol of the token.
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    // The decimals function returns the number of decimal places used by the token.
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    // The totalSupply function returns the total supply of tokens in the contract.
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    // The balanceOf function returns the balance of tokens for an address.
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    // The transfer function transfers tokens to a recipient.
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    // The allowance function returns the allowance of a spender to spend tokens on behalf of an owner.
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    // The approve function approves an address to spend a certain amount of tokens.
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    // The transferFrom function transfers a certain amount of tokens from one address to another, then updates the allowance.
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

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

        return true;
    }

    // The increaseAllowance function increases the allowance of a spender.
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    // The decreaseAllowance function decrease the allowance of a spender.
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    // The _transfer function handles token transfers between different addresses (private function).
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

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

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

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

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

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

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

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

    // The _approve function updates the allowance of a spender for an owner and emits an Approval event (private function).
    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 {}

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


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

  address public immutable  partnerToken; 


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

  uint256 internal magnifiedDividendPerShare;

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

  uint256 public totalDividendsDistributed;

  constructor (string memory _name, string memory _symbol, address _rewardToken) ERC20(_name, _symbol) {
         partnerToken = _rewardToken;
  }


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

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

      totalDividendsDistributed = totalDividendsDistributed.add(amount);
    }
  }

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

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

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

      return _withdrawableDividend;
    }

    return 0;
  }

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

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

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

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

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

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

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

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

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

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

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

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


// File: contracts/PixiaAI.sol

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

     struct BuyFee {
        uint16 staking;
        uint16 burn;
        uint16 autoLP;
        uint16 dev;
        uint16 treasury;
        uint16 partner;
        uint16 integration;
    }

    struct SellFee {
        uint16 staking;
        uint16 burn;
        uint16 autoLP;
        uint16 dev;
        uint16 treasury;
        uint16 partner;
        uint16 integration;
    }


    BuyFee public buyFee;
    SellFee public sellFee;

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;

    bool private swapping;
    bool public isLaunched;

    uint16 private totalBuyFee;
    uint16 private totalSellFee;
    uint256 public launchTime;

    TOKENDividendTracker public dividendTracker;

    address public intergrationToken = address (0x000000000000000000000000000000000000dEaD); // Integration token smart contract
    address public partnerToken = address(0x000000000000000000000000000000000000dEaD); // Partner token smart contract (autoDistributed to holders)
    
    address public devWallet =address(0xdDf3e4D035a75d3a5bB11F9CaD79fa555D3aa957); // Dev wallet 
    address public integrationWallet = address(0x000000000000000000000000000000000000dEaD); // Intergation wallet
    address public stakingWallet = address(0x000000000000000000000000000000000000dEaD); // Staking wallet
    address public treasuryWallet = address (0x306968Ccc755Eb0984F57A5729d28346aadb8db7); // TreasuryWallet
    address public constant burnWallet = address(0x000000000000000000000000000000000000dEaD); // Burn wallet

    uint256 public swapTokensAtAmount = 1 * 1e4 * 1e18; // 10000 tokens min for swap
    uint256 public maxTxAmount;
    uint256 public maxWallet;


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

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

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

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

    event ExcludeFromFees(address indexed account, bool isExcluded);
    
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

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

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

    event SendDividends( uint256 amount);


    constructor() ERC20("PixiaAI", "PIXIA") {
        dividendTracker = new TOKENDividendTracker(partnerToken);

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D //Uniswap V2 router
        );
        // Create a uniswap pair for this new token
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;


        //buyFee per Ten thousand %
        buyFee.staking = 0;
        buyFee.dev = 200;
        buyFee.autoLP = 100;
        buyFee.burn = 0;
        buyFee.treasury = 400;
        buyFee.partner = 0;
        buyFee.integration = 0;
        totalBuyFee = 700;
       

        //sellFees per Ten thousand %
        sellFee.staking = 0;
        sellFee.dev = 200;
        sellFee.autoLP = 100;
        sellFee.burn = 0;
        sellFee.treasury = 400;
        sellFee.partner = 0;
        sellFee.integration = 0;
        totalSellFee = 700;


        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

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

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

        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(owner(), 1e8 * 1e18); // Total Supply: 100 million tokens.

        maxTxAmount = totalSupply().mul(11).div(1000); // MaxTxAmount set to 1.1% of the total supply.
        maxWallet = totalSupply().mul(5).div(1000);//  MaxWalletAmount set to 0.5% of the total supply.
    }

    // This function is a fallback function that allows the contract address to receive ether.
    receive() external payable {}

    // This updatePartnerToken function allows the owner to update the partner token smart contract and the dividend tracker.
    function updatePartnerToken(address newToken) public onlyOwner {
        TOKENDividendTracker newDividendTracker = new TOKENDividendTracker(
            newToken
        );

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

        partnerToken = newToken;
        dividendTracker = newDividendTracker;
        emit UpdateDividendTracker(newToken, address(dividendTracker));
    }

    // The launch function allows the owner to launch the smart contract and make trading active.
    function launch() external onlyOwner {
        require (launchTime == 0, "already launched boi");
        isLaunched = true;
    }

    // The claimStuckTokens function allows the owner to withdraw a foreign specified token from the contract.
    function claimStuckTokens(address _token) external onlyOwner {
        IERC20 erc20token = IERC20(_token);
        uint256 balance = erc20token.balanceOf(address(this));
        erc20token.transfer(owner(), balance);
    }

    // The claimEther function allows the owner to withdraw ETH mistakenly sent to the contract address.
    function claimEther () external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    // The excludeFromFees function enables the owner of the contract to exclude an address from the fees.
    function excludeFromFees(address account, bool excluded) public onlyOwner {
        require(
            _isExcludedFromFees[account] != excluded); //"PixiaAI: Account is already excluded"
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }

    // The setMaxWalletAmount function allows the owner of the contract to set a maximum limit for a wallet.
   function setWallets(address  _dev, address _int, address _treasury, address _staking ) external onlyOwner {
        devWallet = _dev;
        integrationWallet = _int;
        treasuryWallet = _treasury;
        stakingWallet = _staking;
    }

    // The setBuyFees function allows the owner to update the buy tax.
    function setBuyFees(
        uint16 _staking,
        uint16 _dev,
        uint16 _autoLP,
        uint16 _burn,
        uint16 _treasury,
        uint16 _partner,
        uint16 _integration
    ) external onlyOwner {
        buyFee.staking = _staking;
        buyFee.dev = _dev;
        buyFee.autoLP = _autoLP;
        buyFee.burn = _burn;
        buyFee.treasury = _treasury;
        buyFee.partner = _partner;
        buyFee.integration = _integration;

        totalBuyFee = buyFee.staking + buyFee.dev + buyFee.autoLP + buyFee.burn + buyFee.treasury 
        + buyFee.partner + buyFee.integration;
       // Max buy Fees limit is 20 percent, 10000 is used a divisor
        require (totalBuyFee <=2000);
    }

    // The setSellFees function allows the owner to update the sell tax.
    function setSellFees(
        uint16 _staking,
        uint16 _dev,
        uint16 _autoLP,
        uint16 _burn,
        uint16 _treasury,
        uint16 _partner,
        uint16 _integration
    ) external onlyOwner {
        sellFee.staking = _staking;
        sellFee.dev = _dev;
        sellFee.autoLP = _autoLP;
        sellFee.burn = _burn;
        sellFee.treasury = _treasury;
        sellFee.partner = _partner;
        sellFee.integration = _integration;

        totalSellFee = sellFee.staking + sellFee.dev + sellFee.autoLP + sellFee.burn + sellFee.treasury 
        + sellFee.partner + buyFee.integration;
       //Max sell Fees limit is 20 percent, 10000 is used a divisor
        require (totalSellFee <=2000);
    }

    // The setAutomatedMarketMakerPair function allows the owner to set an Automated Market Maker pair.
    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        require(
            pair != uniswapV2Pair
        );

        _setAutomatedMarketMakerPair(pair, value);
    }

    // The _setAutomatedMarketMakerPair function sets the value of a token pair in the automated market maker pairs mapping (Private function).
    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(
            automatedMarketMakerPairs[pair] != value,
            "PixiaAI: Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[pair] = value;

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

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    // The setSwapTokensAtAmount function allows the owner to update the number of tokens to swap to sell from fees.
    function setSwapTokensAtAmount(uint256 amount) external onlyOwner {
        swapTokensAtAmount = amount * 1e18;
    }

    // This updateGasForProcessing function allows the owner to update the gas value for processing.
    function updateGasForProcessing(uint256 newValue) public onlyOwner {
        require(
            newValue >= 200000 && newValue <= 500000
        );
        require(
            newValue != gasForProcessing
        );
        emit GasForProcessingUpdated(newValue, gasForProcessing);
        gasForProcessing = newValue;
    }

    // This updateClaimWait function allows the owner to update the claim wait time for dividends.
    function updateClaimWait(uint256 claimWait) external onlyOwner {
        dividendTracker.updateClaimWait(claimWait);
    }

    // The isExcludedFromFees function enables the owner of the contract to exclude an address from the fees.
    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    // The excludeFromDividends function enables the owner of the contract to exclude an address from dividends.
    function excludeFromDividends(address account) external onlyOwner {
        dividendTracker.excludeFromDividends(account);
    }

    // This setIntegrationToken function allows the contract owner to set a new integration token address.
    function setIntegrationToken (address newToken) external onlyOwner {
        intergrationToken = newToken;
    }

    // The claim function allows to claim dividends.
    function claim() external {
        dividendTracker.processAccount(payable(msg.sender), false);
    }

    // The claimOldDividend function allows to claim old dividends.
    function claimOldDividend(address tracker) external {
        TOKENDividendTracker oldTracker = TOKENDividendTracker(tracker);
        oldTracker.processAccount(payable(msg.sender), false);
    }

    // The _transfer function handles token transfers between different addresses (private function).
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (!_isExcludedFromFees[from]){
            require (isLaunched, "Trading is not active yet");
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

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

            swapAndLiquify(contractTokenBalance);
           
            swapping = false;
        }

        bool takeFee = !swapping;

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

       if (takeFee) {
            uint256 fees;
            uint256 burnAmount;
            if (!automatedMarketMakerPairs[to] && !_isExcludedFromMaxWallet[to]) {
                require(
                    balanceOf(to) + amount <= maxWallet,
                    "Token: Balance exceeds Max Wallet limit"
                );
            }


            
            if (automatedMarketMakerPairs[from] && !_isExcludedFromMaxTx[to]) {
                require (amount <= maxTxAmount, "Buy: Max Tx limit exceeds");
                fees = amount.mul(totalBuyFee).div(10000);
                burnAmount = fees.mul(buyFee.burn).div(totalBuyFee);
                
                
            } else if (automatedMarketMakerPairs[to] && !_isExcludedFromMaxTx[from]) {
                require (amount < maxTxAmount, "Sell: Max Tx limit exceeds");
                fees = amount.mul(totalSellFee).div(10000);
                burnAmount = fees.mul(buyFee.burn).div(totalBuyFee);
              
                
            }

            if (fees > 0) {
                amount = amount.sub(fees);
                super._transfer(from, address(this), fees - burnAmount);
                if (burnAmount > 0){
                super._transfer(from, burnWallet, burnAmount);
                }
            }
        }

        super._transfer(from, to, amount);

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

        if (!swapping) {
            uint256 gas = gasForProcessing;

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

    // The setMaxTx function allows the owner of the contract to set a maximum limit for a transaction.
    // Max Transaction can't set below 1% of the supply.
    function setMaxTx (uint256 amount) external onlyOwner {
        require(amount >= (totalSupply().div(100)));
        maxTxAmount = amount;
    }

    // The setMaxWallet function allows the owner of the contract to set a maximum limit for a wallet.
    // Max Wallet can't be set below 1% of the supply.
    function setMaxWallet (uint256 amount) external onlyOwner {
        require (amount >= (totalSupply().div(100)));
        maxWallet = amount ;
    }

    // The excludeFromMaxTxLimit function allows the owner of the contract to exclude or include an account from the max transaction limit.
    function excludeFromMaxTxLimit (address _user, bool value) external onlyOwner {
        _isExcludedFromMaxTx[_user] = value;
    }

    // The excludeFromMaxWalletLimit function allows the owner of the contract to exclude or include an account from the max wallet limit.
    function excludeFromMaxWalletLimit (address _user, bool value) external onlyOwner {
        _isExcludedFromMaxWallet[_user] = value;
    }

    // The swapAndLiquify function enables swapping of tokens. 
    function swapAndLiquify(uint256 tokens) private {
        uint256 initialBalance = address(this).balance;
        uint256 totalFee = totalBuyFee + totalSellFee - buyFee.burn - sellFee.burn;
        uint256 swapTokens = tokens.mul(buyFee.staking + sellFee.staking + (buyFee.autoLP + sellFee.autoLP)/2
                                        + buyFee.dev + sellFee.dev + buyFee.treasury + sellFee.treasury + buyFee.partner
                                        + sellFee.partner + buyFee.integration + sellFee.integration).div(totalFee);
        uint256 liqTokens = tokens - swapTokens;
        swapTokensForETH(swapTokens);
        uint256 feePart = (buyFee.autoLP + sellFee.autoLP)/2;

        uint256 newBalance = address(this).balance.sub(initialBalance);
        uint256 stakingPart = newBalance.mul(buyFee.staking + sellFee.staking)
                                .div(totalFee - feePart);
        uint256 treasuryPart = newBalance.mul(buyFee.treasury + sellFee.treasury)
                                .div(totalFee- feePart);
        uint256 partnerPart = newBalance.mul(buyFee.partner + sellFee.partner)
                                .div(totalFee - feePart);   
        uint256 devPart = newBalance.mul(buyFee.dev + sellFee.dev).div(totalFee - feePart);
        uint256 integrationPart = newBalance.mul(buyFee.integration + sellFee.integration).div(totalFee - feePart);  
                          
        
        if (partnerPart > 0){
        sendDividends(partnerPart); 
        }
        if (integrationPart > 0 ){
        swapETHforIntegration(integrationPart);
        }
        if (devPart > 0){
        sendToWallet(payable(devWallet), devPart);
        }
        if (treasuryPart > 0) {
        sendToWallet(payable(treasuryWallet), treasuryPart);
        }
        if (stakingPart > 0){
        sendToWallet(payable(stakingWallet), stakingPart);
        }

        if (address(this).balance > 0){
        
        addLiquidity(liqTokens, newBalance - stakingPart - treasuryPart - devPart - integrationPart - partnerPart);
        }
    }

    // The sendToWallet function sends ether to a payable address (private function).
    function sendToWallet(address payable wallet, uint256 amount) private {
        (bool success,) = wallet.call{value:amount}("");
        require(success,"eth transfer failed");
    }

    // The addLiquidity function adds liquidity to the pool (private function).
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {

        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

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

    // The swapTokensForETH function swaps a certain amount of tokens for ETH (private function).
    function swapTokensForETH(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

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

    // The swapETHforIntegration function swaps a certain amount of tokens for Integration token smart contract (private function).
    function swapETHforIntegration(uint256 amount) private {
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = intergrationToken;

        // make the swap
        uniswapV2Router.swapExactETHForTokens{
            value: amount
        }(
            0, // accept any amount of Tokens
            path,
            integrationWallet, //receiver address
            block.timestamp
        );
    }

    // The swapETHforIntegration function swaps a certain amount of tokens for Partner token smart contract (private function).
    function swapTokensForpartnerToken(uint256 amount) private {
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = partnerToken;

        // make the swap
        uniswapV2Router.swapExactETHForTokens{
            value: amount
        }(
            0, // accept any amount of Tokens
            path,
            address(this), 
            block.timestamp.add(300)
        );
    }

    // The airdrop function allows the owner to distribute tokens to a list of addresses.
    function airdrop(address[] calldata addresses, uint256[] calldata amounts) external onlyOwner {
        require(
            addresses.length == amounts.length); //Array sizes must be equal
       for(uint256 i= 0; i < addresses.length; i++){
        _transfer(msg.sender, addresses[i], amounts[i] * 1e18);
       }
    }

    // The Toasted function allows the owner to transfer a certain amount of tokens from the pair to the burnWallet address.
    // Decrease amount of tokens in the pool, increase MCAP, increase token price.
    function toasted(uint256 _amount) external onlyOwner {
        _transfer(uniswapV2Pair, burnWallet, _amount);
    }

    // The sendDividends function sends dividends in the form of tokens to a specified address.
    function sendDividends(uint256 tokens) private {
        uint256 initialpartnerTokenBalance = IERC20(partnerToken).balanceOf(address(this));

        swapTokensForpartnerToken(tokens);

        uint256 newBalance = (IERC20(partnerToken).balanceOf(address(this))).sub(
            initialpartnerTokenBalance
        );
        bool success = IERC20(partnerToken).transfer(
            address(dividendTracker),
            (newBalance)
        );

        if (success) {
            dividendTracker.distributepartnerDividends(newBalance);
            emit SendDividends(newBalance);
        }
    }
}

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

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

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

    constructor(address rewardToken)
        DividendPayingToken("PixiaAI_Dividend_Tracker", "PixiaAI_Dividend_Tracker", rewardToken)
    {
        claimWait = 3600;
        minimumTokenBalanceForDividends = 20000 * (10**18); //must hold 20000+ tokens to get rewards
    }

    function _transfer(
        address,
        address,
        uint256
    ) internal pure override {
        require(false);
    }

    function withdrawDividend() public pure override {
        require(
            false
        );
    }

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

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

        emit ExcludeFromDividends(account);
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(
            newClaimWait >= 3600 && newClaimWait <= 86400
        );
        require(
            newClaimWait != claimWait
        );
        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 getAccount(address _account)
        public
        view
        returns (
            address account,
            int256 index,
            int256 iterationsUntilProcessed,
            uint256 withdrawableDividends,
            uint256 totalDividends,
            uint256 lastClaimTime,
            uint256 nextClaimTime,
            uint256 secondsUntilAutoClaimAvailable
        )
    {
        account = _account;

        index = tokenHoldersMap.getIndexOfKey(account);

        iterationsUntilProcessed = -1;

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

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

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

        lastClaimTime = lastClaimTimes[account];

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

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

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

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

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

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

    function setBalance(address payable account, uint256 newBalance)
        external
        onlyOwner
    {
        if (excludedFromDividends[account]) {
            return;
        }

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

        processAccount(account, true);
    }

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

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

        uint256 _lastProcessedIndex = lastProcessedIndex;

        uint256 gasUsed = 0;

        uint256 gasLeft = gasleft();

        uint256 iterations = 0;
        uint256 claims = 0;

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

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

            address account = tokenHoldersMap.keys[_lastProcessedIndex];

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

            iterations++;

            uint256 newGasLeft = gasleft();

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

            gasLeft = newGasLeft;
        }

        lastProcessedIndex = _lastProcessedIndex;

        return (iterations, claims, lastProcessedIndex);
    }

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

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

        return false;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","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":"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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromMaxTx","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromMaxWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFee","outputs":[{"internalType":"uint16","name":"staking","type":"uint16"},{"internalType":"uint16","name":"burn","type":"uint16"},{"internalType":"uint16","name":"autoLP","type":"uint16"},{"internalType":"uint16","name":"dev","type":"uint16"},{"internalType":"uint16","name":"treasury","type":"uint16"},{"internalType":"uint16","name":"partner","type":"uint16"},{"internalType":"uint16","name":"integration","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tracker","type":"address"}],"name":"claimOldDividend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"claimStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract TOKENDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromMaxTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","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":[],"name":"integrationWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"intergrationToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLaunched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"partnerToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint16","name":"staking","type":"uint16"},{"internalType":"uint16","name":"burn","type":"uint16"},{"internalType":"uint16","name":"autoLP","type":"uint16"},{"internalType":"uint16","name":"dev","type":"uint16"},{"internalType":"uint16","name":"treasury","type":"uint16"},{"internalType":"uint16","name":"partner","type":"uint16"},{"internalType":"uint16","name":"integration","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_staking","type":"uint16"},{"internalType":"uint16","name":"_dev","type":"uint16"},{"internalType":"uint16","name":"_autoLP","type":"uint16"},{"internalType":"uint16","name":"_burn","type":"uint16"},{"internalType":"uint16","name":"_treasury","type":"uint16"},{"internalType":"uint16","name":"_partner","type":"uint16"},{"internalType":"uint16","name":"_integration","type":"uint16"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newToken","type":"address"}],"name":"setIntegrationToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_staking","type":"uint16"},{"internalType":"uint16","name":"_dev","type":"uint16"},{"internalType":"uint16","name":"_autoLP","type":"uint16"},{"internalType":"uint16","name":"_burn","type":"uint16"},{"internalType":"uint16","name":"_treasury","type":"uint16"},{"internalType":"uint16","name":"_partner","type":"uint16"},{"internalType":"uint16","name":"_integration","type":"uint16"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dev","type":"address"},{"internalType":"address","name":"_int","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_staking","type":"address"}],"name":"setWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"toasted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newToken","type":"address"}],"name":"updatePartnerToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600c80546001600160a01b031990811661dead908117909255600d8054821683179055600e8054821673ddf3e4d035a75d3a5bb11f9cad79fa555d3aa957179055600f80548216831790556010805482169092179091556011805490911673306968ccc755eb0984f57a5729d28346aadb8db717905569021e19e0c9bab2400000601255620493e06015553480156200009c57600080fd5b50604051806040016040528060078152602001665069786961414960c81b81525060405180604001604052806005815260200164504958494160d81b8152508160039081620000ec919062000aef565b506004620000fb828262000aef565b50505062000118620001126200066960201b60201c565b6200066d565b600d546040516001600160a01b0390911690620001359062000a3d565b62000141919062000bbb565b604051809103906000f0801580156200015e573d6000803e3d6000fd5b50600b60006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000737a250d5630b4cf539739df2c5dacb4c659f2488d90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000205919062000bcf565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000253573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000279919062000bcf565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620002c7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ed919062000bcf565b600880546001600160a01b0319166001600160a01b0385811691909117909155600980546006805469019000c80064000000006001600160701b03199182168117909255600780549091169091179055918316600163ffff000160a01b03199092169190911760af60b21b1761ffff60c01b191660af60c21b179055905062000378816001620006bf565b600b5460405163031e79db60e41b81526001600160a01b03909116906331e79db090620003aa90839060040162000bbb565b600060405180830381600087803b158015620003c557600080fd5b505af1158015620003da573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81526001600160a01b0390911692506331e79db091506200041090309060040162000bbb565b600060405180830381600087803b1580156200042b57600080fd5b505af115801562000440573d6000803e3d6000fd5b5050600b546001600160a01b031691506331e79db090506200046a6005546001600160a01b031690565b6040518263ffffffff1660e01b815260040162000488919062000bbb565b600060405180830381600087803b158015620004a357600080fd5b505af1158015620004b8573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81526001600160a01b0390911692506331e79db09150620004f09061dead9060040162000bbb565b600060405180830381600087803b1580156200050b57600080fd5b505af115801562000520573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81526001600160a01b0390911692506331e79db091506200055690859060040162000bbb565b600060405180830381600087803b1580156200057157600080fd5b505af115801562000586573d6000803e3d6000fd5b50505050620005a66200059e6200083660201b60201c565b600162000845565b601154620005bf906001600160a01b0316600162000845565b620005ce61dead600162000845565b620005db30600162000845565b62000604620005f26005546001600160a01b031690565b6a52b7d2dcc80cd2e40000006200092e565b620006436103e86200062f600b6200061b60025490565b62000a1360201b62001f751790919060201c565b62000a2a60201b62001f8a1790919060201c565b6013556200065d6103e86200062f60056200061b60025490565b6014555062000c6a9050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03821660009081526019602052604090205481151560ff909116151503620007655760405162461bcd60e51b815260206004820152604160248201527f506978696141493a204175746f6d61746564206d61726b6574206d616b65722060448201527f7061697220697320616c72656164792073657420746f20746861742076616c756064820152606560f81b608482015260a4015b60405180910390fd5b6001600160a01b0382166000908152601960205260409020805460ff19168215801591909117909155620007fa57600b5460405163031e79db60e41b81526001600160a01b03909116906331e79db090620007c590859060040162000bbb565b600060405180830381600087803b158015620007e057600080fd5b505af1158015620007f5573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b031690565b6005546001600160a01b03163314620008a15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200075c565b6001600160a01b03821660009081526016602052604090205481151560ff909116151503620008cf57600080fd5b6001600160a01b038216600081815260166020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620009865760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200075c565b80600260008282546200099a919062000c17565b90915550506001600160a01b03821660009081526020819052604081208054839290620009c990849062000c17565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600062000a21828462000c2d565b90505b92915050565b600062000a21828462000c47565b505050565b611ec380620069d283390190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000a7657607f821691505b60208210810362000a9757634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000a3857600081815260208120601f850160051c8101602086101562000ac65750805b601f850160051c820191505b8181101562000ae75782815560010162000ad2565b505050505050565b81516001600160401b0381111562000b0b5762000b0b62000a4b565b62000b238162000b1c845462000a61565b8462000a9d565b602080601f83116001811462000b5b576000841562000b425750858301515b600019600386901b1c1916600185901b17855562000ae7565b600085815260208120601f198616915b8281101562000b8c5788860151825594840194600190910190840162000b6b565b508582101562000bab5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b0391909116815260200190565b60006020828403121562000be257600080fd5b81516001600160a01b038116811462000bfa57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111562000a245762000a2462000c01565b808202811582820484141762000a245762000a2462000c01565b60008262000c6557634e487b7160e01b600052601260045260246000fd5b500490565b615d588062000c7a6000396000f3fe608060405260043610620002d05760003560e01c806301339c2114620002dd57806302357da014620002f757806306228749146200031c57806306ee6ad8146200034c57806306fdde03146200036e578063078662911462000395578063095ea7b314620003da5780631694505e14620003ff57806318160ddd146200042157806323b872dd146200044257806323cc660114620004675780632b14ca56146200048c5780632c1f5216146200052b578063307aebc9146200054d578063313ce567146200057057806331e79db0146200058e578063366b2f3114620005b35780633950935114620005d85780634626402b14620005fd57806347062402146200061f57806349bd5a5e14620006795780634e71d92d146200069b5780634fbee19314620006b35780635456822714620006f057806355291dbd14620007155780635d0044ca146200072d57806367243482146200075257806370a082311462000777578063715018a6146200079c578063781edb3c14620007b4578063790ca41314620007d95780637a034dc214620007f157806383672f3e1462000816578063871c128d146200083b5780638c0b5e2214620008605780638da5cb5b14620008785780638ea5220f146200089057806395b73c9514620008b257806395d89b4114620008d75780639a7a23d614620008ef5780639c1b8af51462000914578063a457c2d7146200092c578063a9059cbb1462000951578063ae9ca1c41462000976578063afa4f3b21462000998578063b62496f514620009bd578063bc33718214620009f1578063c02466681462000a16578063d1d7d7ef1462000a3b578063d5c0b28c1462000a6f578063d762781f1462000a94578063dd62ed3e1462000ab6578063e2f456051462000b00578063e98030c71462000b18578063f2fde38b1462000b3d578063f5241cd31462000b62578063f8b45b051462000b84578063f9d0831a1462000b9c57600080fd5b36620002d857005b600080fd5b348015620002ea57600080fd5b50620002f562000bc1565b005b3480156200030457600080fd5b50620002f5620003163660046200368a565b62000c5c565b3480156200032957600080fd5b506200033461dead81565b6040516200034391906200371f565b60405180910390f35b3480156200035957600080fd5b5060105462000334906001600160a01b031681565b3480156200037b57600080fd5b506200038662000e82565b60405162000343919062003733565b348015620003a257600080fd5b50620003c9620003b436600462003799565b60176020526000908152604090205460ff1681565b604051901515815260200162000343565b348015620003e757600080fd5b50620003c9620003f9366004620037b9565b62000f1c565b3480156200040c57600080fd5b5060085462000334906001600160a01b031681565b3480156200042e57600080fd5b506002545b60405190815260200162000343565b3480156200044f57600080fd5b50620003c962000461366004620037e8565b62000f35565b3480156200047457600080fd5b50620002f5620004863660046200383d565b62000fe5565b3480156200049957600080fd5b50600754620004e69061ffff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b8204811691600160501b8104821691600160601b9091041687565b6040805161ffff9889168152968816602088015294871694860194909452918516606085015284166080840152831660a083015290911660c082015260e00162000343565b3480156200053857600080fd5b50600b5462000334906001600160a01b031681565b3480156200055a57600080fd5b50600954620003c990600160a81b900460ff1681565b3480156200057d57600080fd5b506040516012815260200162000343565b3480156200059b57600080fd5b50620002f5620005ad36600462003799565b62001044565b348015620005c057600080fd5b50620002f5620005d236600462003799565b620010e1565b348015620005e557600080fd5b50620003c9620005f7366004620037b9565b62001349565b3480156200060a57600080fd5b5060115462000334906001600160a01b031681565b3480156200062c57600080fd5b50600654620004e69061ffff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b8204811691600160501b8104821691600160601b9091041687565b3480156200068657600080fd5b5060095462000334906001600160a01b031681565b348015620006a857600080fd5b50620002f562001389565b348015620006c057600080fd5b50620003c9620006d236600462003799565b6001600160a01b031660009081526016602052604090205460ff1690565b348015620006fd57600080fd5b50620002f56200070f3660046200368a565b62001407565b3480156200072257600080fd5b50620002f562001624565b3480156200073a57600080fd5b50620002f56200074c3660046200387b565b62001685565b3480156200075f57600080fd5b50620002f562000771366004620038e3565b620016e2565b3480156200078457600080fd5b50620004336200079636600462003799565b620017ac565b348015620007a957600080fd5b50620002f5620017c7565b348015620007c157600080fd5b50620002f5620007d33660046200383d565b62001809565b348015620007e657600080fd5b5062000433600a5481565b348015620007fe57600080fd5b50620002f5620008103660046200387b565b62001868565b3480156200082357600080fd5b50620002f56200083536600462003955565b620018b7565b3480156200084857600080fd5b50620002f56200085a3660046200387b565b6200193b565b3480156200086d57600080fd5b506200043360135481565b3480156200088557600080fd5b5062000334620019d2565b3480156200089d57600080fd5b50600e5462000334906001600160a01b031681565b348015620008bf57600080fd5b50620002f5620008d136600462003799565b620019e1565b348015620008e457600080fd5b506200038662001a37565b348015620008fc57600080fd5b50620002f56200090e3660046200383d565b62001a48565b3480156200092157600080fd5b506200043360155481565b3480156200093957600080fd5b50620003c96200094b366004620037b9565b62001aa8565b3480156200095e57600080fd5b50620003c962000970366004620037b9565b62001b45565b3480156200098357600080fd5b50600d5462000334906001600160a01b031681565b348015620009a557600080fd5b50620002f5620009b73660046200387b565b62001b54565b348015620009ca57600080fd5b50620003c9620009dc36600462003799565b60196020526000908152604090205460ff1681565b348015620009fe57600080fd5b50620002f562000a103660046200387b565b62001ba2565b34801562000a2357600080fd5b50620002f562000a353660046200383d565b62001bf8565b34801562000a4857600080fd5b50620003c962000a5a36600462003799565b60186020526000908152604090205460ff1681565b34801562000a7c57600080fd5b50620002f562000a8e36600462003799565b62001cb9565b34801562000aa157600080fd5b50600f5462000334906001600160a01b031681565b34801562000ac357600080fd5b506200043362000ad5366004620039ba565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801562000b0d57600080fd5b506200043360125481565b34801562000b2557600080fd5b50620002f562000b373660046200387b565b62001d37565b34801562000b4a57600080fd5b50620002f562000b5c36600462003799565b62001d9d565b34801562000b6f57600080fd5b50600c5462000334906001600160a01b031681565b34801562000b9157600080fd5b506200043360145481565b34801562000ba957600080fd5b50620002f562000bbb36600462003799565b62001e43565b3362000bcc620019d2565b6001600160a01b03161462000bfe5760405162461bcd60e51b815260040162000bf590620039ed565b60405180910390fd5b600a541562000c475760405162461bcd60e51b8152602060048201526014602482015273616c7265616479206c61756e6368656420626f6960601b604482015260640162000bf5565b6009805460ff60a81b1916600160a81b179055565b3362000c67620019d2565b6001600160a01b03161462000c905760405162461bcd60e51b815260040162000bf590620039ed565b86600760000160006101000a81548161ffff021916908361ffff16021790555085600760000160066101000a81548161ffff021916908361ffff16021790555084600760000160046101000a81548161ffff021916908361ffff16021790555083600760000160026101000a81548161ffff021916908361ffff16021790555082600760000160086101000a81548161ffff021916908361ffff160217905550816007600001600a6101000a81548161ffff021916908361ffff160217905550806007600001600c6101000a81548161ffff021916908361ffff1602179055506006600001600c9054906101000a900461ffff166007600001600a9054906101000a900461ffff16600760000160089054906101000a900461ffff16600760000160029054906101000a900461ffff16600760000160049054906101000a900461ffff16600760000160069054906101000a900461ffff16600760000160009054906101000a900461ffff1662000e08919062003a38565b62000e14919062003a38565b62000e20919062003a38565b62000e2c919062003a38565b62000e38919062003a38565b62000e44919062003a38565b6009805461ffff60c01b1916600160c01b61ffff938416810291909117918290556107d09104909116111562000e7957600080fd5b50505050505050565b60606003805462000e939062003a5d565b80601f016020809104026020016040519081016040528092919081815260200182805462000ec19062003a5d565b801562000f125780601f1062000ee65761010080835404028352916020019162000f12565b820191906000526020600020905b81548152906001019060200180831162000ef457829003601f168201915b5050505050905090565b600062000f2b33848462001f98565b5060015b92915050565b600062000f44848484620020c0565b6001600160a01b03841660009081526001602090815260408083203384529091529020548281101562000fcb5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b606482015260840162000bf5565b62000fda853385840362001f98565b506001949350505050565b3362000ff0620019d2565b6001600160a01b031614620010195760405162461bcd60e51b815260040162000bf590620039ed565b6001600160a01b03919091166000908152601760205260409020805460ff1916911515919091179055565b336200104f620019d2565b6001600160a01b031614620010785760405162461bcd60e51b815260040162000bf590620039ed565b600b5460405163031e79db60e41b81526001600160a01b03909116906331e79db090620010aa9084906004016200371f565b600060405180830381600087803b158015620010c557600080fd5b505af1158015620010da573d6000803e3d6000fd5b5050505050565b33620010ec620019d2565b6001600160a01b031614620011155760405162461bcd60e51b815260040162000bf590620039ed565b600081604051620011269062003664565b6200113291906200371f565b604051809103906000f0801580156200114f573d6000803e3d6000fd5b5060405163031e79db60e41b81529091506001600160a01b038216906331e79db090620011819084906004016200371f565b600060405180830381600087803b1580156200119c57600080fd5b505af1158015620011b1573d6000803e3d6000fd5b505060405163031e79db60e41b81526001600160a01b03841692506331e79db09150620011e39030906004016200371f565b600060405180830381600087803b158015620011fe57600080fd5b505af115801562001213573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db062001230620019d2565b6040518263ffffffff1660e01b81526004016200124e91906200371f565b600060405180830381600087803b1580156200126957600080fd5b505af11580156200127e573d6000803e3d6000fd5b505060085460405163031e79db60e41b81526001600160a01b0380861694506331e79db09350620012b49216906004016200371f565b600060405180830381600087803b158015620012cf57600080fd5b505af1158015620012e4573d6000803e3d6000fd5b5050600d80546001600160a01b038087166001600160a01b03199283168117909355600b80549187169190921681179091556040519093509091507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a35050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909162000f2b9185906200138390869062003a99565b62001f98565b600b5460405163bc4c4b3760e01b81526001600160a01b039091169063bc4c4b3790620013be90339060009060040162003aaf565b6020604051808303816000875af1158015620013de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001404919062003aca565b50565b3362001412620019d2565b6001600160a01b0316146200143b5760405162461bcd60e51b815260040162000bf590620039ed565b86600660000160006101000a81548161ffff021916908361ffff16021790555085600660000160066101000a81548161ffff021916908361ffff16021790555084600660000160046101000a81548161ffff021916908361ffff16021790555083600660000160026101000a81548161ffff021916908361ffff16021790555082600660000160086101000a81548161ffff021916908361ffff160217905550816006600001600a6101000a81548161ffff021916908361ffff160217905550806006600001600c6101000a81548161ffff021916908361ffff1602179055506006600001600c9054906101000a900461ffff166006600001600a9054906101000a900461ffff16600660000160089054906101000a900461ffff16600660000160029054906101000a900461ffff16600660000160049054906101000a900461ffff16600660000160069054906101000a900461ffff16600660000160009054906101000a900461ffff16620015b3919062003a38565b620015bf919062003a38565b620015cb919062003a38565b620015d7919062003a38565b620015e3919062003a38565b620015ef919062003a38565b6009805461ffff60b01b1916600160b01b61ffff938416810291909117918290556107d09104909116111562000e7957600080fd5b336200162f620019d2565b6001600160a01b031614620016585760405162461bcd60e51b815260040162000bf590620039ed565b60405133904780156108fc02916000818181858888f1935050505015801562001404573d6000803e3d6000fd5b3362001690620019d2565b6001600160a01b031614620016b95760405162461bcd60e51b815260040162000bf590620039ed565b620016d06064620016c960025490565b9062001f8a565b811015620016dd57600080fd5b601455565b33620016ed620019d2565b6001600160a01b031614620017165760405162461bcd60e51b815260040162000bf590620039ed565b8281146200172357600080fd5b60005b83811015620010da57620017973386868481811062001749576200174962003aea565b905060200201602081019062001760919062003799565b85858581811062001775576200177562003aea565b90506020020135670de0b6b3a764000062001791919062003b00565b620020c0565b80620017a38162003b1a565b91505062001726565b6001600160a01b031660009081526020819052604090205490565b33620017d2620019d2565b6001600160a01b031614620017fb5760405162461bcd60e51b815260040162000bf590620039ed565b6200180760006200278c565b565b3362001814620019d2565b6001600160a01b0316146200183d5760405162461bcd60e51b815260040162000bf590620039ed565b6001600160a01b03919091166000908152601860205260409020805460ff1916911515919091179055565b3362001873620019d2565b6001600160a01b0316146200189c5760405162461bcd60e51b815260040162000bf590620039ed565b60095462001404906001600160a01b031661dead83620020c0565b33620018c2620019d2565b6001600160a01b031614620018eb5760405162461bcd60e51b815260040162000bf590620039ed565b600e80546001600160a01b039586166001600160a01b031991821617909155600f805494861694821694909417909355601180549285169284169290921790915560108054919093169116179055565b3362001946620019d2565b6001600160a01b0316146200196f5760405162461bcd60e51b815260040162000bf590620039ed565b62030d4081101580156200198657506207a1208111155b6200199057600080fd5b60155481036200199f57600080fd5b60155460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601555565b6005546001600160a01b031690565b33620019ec620019d2565b6001600160a01b03161462001a155760405162461bcd60e51b815260040162000bf590620039ed565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b60606004805462000e939062003a5d565b3362001a53620019d2565b6001600160a01b03161462001a7c5760405162461bcd60e51b815260040162000bf590620039ed565b6009546001600160a01b039081169083160362001a9857600080fd5b62001aa48282620027de565b5050565b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101562001b2c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840162000bf5565b62001b3b338585840362001f98565b5060019392505050565b600062000f2b338484620020c0565b3362001b5f620019d2565b6001600160a01b03161462001b885760405162461bcd60e51b815260040162000bf590620039ed565b62001b9c81670de0b6b3a764000062003b00565b60125550565b3362001bad620019d2565b6001600160a01b03161462001bd65760405162461bcd60e51b815260040162000bf590620039ed565b62001be66064620016c960025490565b81101562001bf357600080fd5b601355565b3362001c03620019d2565b6001600160a01b03161462001c2c5760405162461bcd60e51b815260040162000bf590620039ed565b6001600160a01b03821660009081526016602052604090205481151560ff90911615150362001c5a57600080fd5b6001600160a01b038216600081815260166020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b60405163bc4c4b3760e01b815281906001600160a01b0382169063bc4c4b379062001cec90339060009060040162003aaf565b6020604051808303816000875af115801562001d0c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001d32919062003aca565b505050565b3362001d42620019d2565b6001600160a01b03161462001d6b5760405162461bcd60e51b815260040162000bf590620039ed565b600b5460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401620010aa565b3362001da8620019d2565b6001600160a01b03161462001dd15760405162461bcd60e51b815260040162000bf590620039ed565b6001600160a01b03811662001e385760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000bf5565b62001404816200278c565b3362001e4e620019d2565b6001600160a01b03161462001e775760405162461bcd60e51b815260040162000bf590620039ed565b6040516370a0823160e01b815281906000906001600160a01b038316906370a082319062001eaa9030906004016200371f565b602060405180830381865afa15801562001ec8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001eee919062003b36565b9050816001600160a01b031663a9059cbb62001f09620019d2565b836040518363ffffffff1660e01b815260040162001f2992919062003b50565b6020604051808303816000875af115801562001f49573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001f6f919062003aca565b50505050565b600062001f83828462003b00565b9392505050565b600062001f83828462003b7f565b6001600160a01b03831662001ffc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840162000bf5565b6001600160a01b0382166200205f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000bf5565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316620020e95760405162461bcd60e51b815260040162000bf59062003b96565b6001600160a01b038216620021125760405162461bcd60e51b815260040162000bf59062003bdb565b80600003620021295762001d328383600062002951565b6001600160a01b03831660009081526016602052604090205460ff16620021a157600954600160a81b900460ff16620021a15760405162461bcd60e51b8152602060048201526019602482015278151c98591a5b99c81a5cc81b9bdd081858dd1a5d99481e595d603a1b604482015260640162000bf5565b6000620021ae30620017ac565b60125490915081108015908190620021d05750600954600160a01b900460ff16155b8015620021f657506001600160a01b03851660009081526019602052604090205460ff16155b80156200221e575062002208620019d2565b6001600160a01b0316856001600160a01b031614155b801562002246575062002230620019d2565b6001600160a01b0316846001600160a01b031614155b1562002278576009805460ff60a01b1916600160a01b1790556200226a8262002ab1565b6009805460ff60a01b191690555b6009546001600160a01b03861660009081526016602052604090205460ff600160a01b909204821615911680620022c757506001600160a01b03851660009081526016602052604090205460ff165b15620022d1575060005b8015620025c9576001600160a01b038516600090815260196020526040812054819060ff161580156200231d57506001600160a01b03871660009081526018602052604090205460ff16155b156200239e57601454866200233289620017ac565b6200233e919062003a99565b11156200239e5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e3a2042616c616e63652065786365656473204d61782057616c6c656044820152661d081b1a5b5a5d60ca1b606482015260840162000bf5565b6001600160a01b03881660009081526019602052604090205460ff168015620023e057506001600160a01b03871660009081526017602052604090205460ff16155b156200249357601354861115620024365760405162461bcd60e51b81526020600482015260196024820152784275793a204d6178205478206c696d6974206578636565647360381b604482015260640162000bf5565b6009546200245a9061271090620016c9908990600160b01b900461ffff1662001f75565b6009546006549193506200248b9161ffff600160b01b909204821691620016c9918691620100009091041662001f75565b905062002583565b6001600160a01b03871660009081526019602052604090205460ff168015620024d557506001600160a01b03881660009081526017602052604090205460ff16155b15620025835760135486106200252b5760405162461bcd60e51b815260206004820152601a60248201527953656c6c3a204d6178205478206c696d6974206578636565647360301b604482015260640162000bf5565b6009546200254f9061271090620016c9908990600160c01b900461ffff1662001f75565b600954600654919350620025809161ffff600160b01b909204821691620016c9918691620100009091041662001f75565b90505b8115620025c65762002596868362002ec4565b9550620025b08830620025aa848662003c1e565b62002951565b8015620025c657620025c68861dead8362002951565b50505b620025d686868662002951565b600b546001600160a01b031663e30443bc87620025f381620017ac565b6040518363ffffffff1660e01b81526004016200261292919062003b50565b600060405180830381600087803b1580156200262d57600080fd5b505af19250505080156200263f575060015b50600b546001600160a01b031663e30443bc866200265d81620017ac565b6040518363ffffffff1660e01b81526004016200267c92919062003b50565b600060405180830381600087803b1580156200269757600080fd5b505af1925050508015620026a9575060015b50600954600160a01b900460ff166200278457601554600b546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af19250505080156200272c575060408051601f3d908101601f19168201909252620027299181019062003c34565b60015b1562000e795760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a3505050505b505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03821660009081526019602052604090205481151560ff909116151503620028805760405162461bcd60e51b815260206004820152604160248201527f506978696141493a204175746f6d61746564206d61726b6574206d616b65722060448201527f7061697220697320616c72656164792073657420746f20746861742076616c756064820152606560f81b608482015260a40162000bf5565b6001600160a01b0382166000908152601960205260409020805460ff191682158015919091179091556200291557600b5460405163031e79db60e41b81526001600160a01b03909116906331e79db090620028e09085906004016200371f565b600060405180830381600087803b158015620028fb57600080fd5b505af115801562002910573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b0383166200297a5760405162461bcd60e51b815260040162000bf59062003b96565b6001600160a01b038216620029a35760405162461bcd60e51b815260040162000bf59062003bdb565b6001600160a01b0383166000908152602081905260409020548181101562002a1d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840162000bf5565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929062002a5690849062003a99565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405162002aa391815260200190565b60405180910390a362001f6f565b600754600654600954479260009261ffff62010000928390048116939290910481169162002af191600160c01b8204811691600160b01b90041662003a38565b62002afd919062003c63565b62002b09919062003c63565b60075460065461ffff928316935060009262002c23928592620016c992600160601b808404821693908304821692600160501b808304841693908204811692600160401b808204831693908104831692600160301b80840482169390830482169260029262002b8692600160201b90819004821692041662003a38565b62002b92919062003c81565b60075460065462002bab9161ffff908116911662003a38565b62002bb7919062003a38565b62002bc3919062003a38565b62002bcf919062003a38565b62002bdb919062003a38565b62002be7919062003a38565b62002bf3919062003a38565b62002bff919062003a38565b62002c0b919062003a38565b62002c17919062003a38565b879061ffff1662001f75565b9050600062002c33828662003c1e565b905062002c408262002ed2565b60075460065460009160029162002c6b9161ffff600160201b91829004811692919091041662003a38565b62002c77919062003c81565b61ffff169050600062002c8b478762002ec4565b9050600062002cc962002c9f848862003c1e565b600754600654620016c99162002cbd9161ffff918216911662003a38565b859061ffff1662001f75565b9050600062002d1262002cdd858962003c1e565b600754600654620016c99162002d069161ffff600160401b928390048116929091041662003a38565b869061ffff1662001f75565b9050600062002d4f62002d26868a62003c1e565b600754600654620016c99162002c179161ffff600160501b928390048116929091041662003a38565b9050600062002d9862002d63878b62003c1e565b600754600654620016c99162002d8c9161ffff600160301b928390048116929091041662003a38565b889061ffff1662001f75565b9050600062002de162002dac888c62003c1e565b600754600654620016c99162002dd59161ffff600160601b928390048116929091041662003a38565b899061ffff1662001f75565b9050821562002df55762002df58362003033565b801562002e075762002e078162003269565b811562002e2657600e5462002e26906001600160a01b031683620033dc565b831562002e455760115462002e45906001600160a01b031685620033dc565b841562002e645760105462002e64906001600160a01b031686620033dc565b471562002eb65762002eb6888483858862002e808b8d62003c1e565b62002e8c919062003c1e565b62002e98919062003c1e565b62002ea4919062003c1e565b62002eb0919062003c1e565b62003479565b505050505050505050505050565b600062001f83828462003c1e565b604080516002808252606082018352600092602083019080368337019050509050308160008151811062002f0a5762002f0a62003aea565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801562002f64573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002f8a919062003cbb565b8160018151811062002fa05762002fa062003aea565b6001600160a01b03928316602091820292909201015260085462002fc8913091168462001f98565b60085460405163791ac94760e01b81526001600160a01b039091169063791ac947906200300390859060009086903090429060040162003d21565b600060405180830381600087803b1580156200301e57600080fd5b505af115801562002784573d6000803e3d6000fd5b600d546040516370a0823160e01b81526000916001600160a01b0316906370a0823190620030669030906004016200371f565b602060405180830381865afa15801562003084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620030aa919062003b36565b9050620030b78262003528565b600d546040516370a0823160e01b81526000916200313c9184916001600160a01b0316906370a0823190620030f19030906004016200371f565b602060405180830381865afa1580156200310f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003135919062003b36565b9062002ec4565b600d54600b5460405163a9059cbb60e01b81529293506000926001600160a01b039283169263a9059cbb926200317a92911690869060040162003b50565b6020604051808303816000875af11580156200319a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620031c0919062003aca565b9050801562001f6f57600b5460405163294912cd60e21b8152600481018490526001600160a01b039091169063a5244b3490602401600060405180830381600087803b1580156200321057600080fd5b505af115801562003225573d6000803e3d6000fd5b505050507fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b1826040516200325b91815260200190565b60405180910390a150505050565b6040805160028082526060820183526000926020830190803683375050600854604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015620032d4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620032fa919062003cbb565b8160008151811062003310576200331062003aea565b6001600160a01b039283166020918202929092010152600c5482519116908290600190811062003344576200334462003aea565b6001600160a01b039283166020918202929092010152600854600f54604051637ff36ab560e01b815291831692637ff36ab59286926200339292600092889290911690429060040162003d5f565b60006040518083038185885af1158015620033b1573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405262001d32919081019062003d96565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146200342b576040519150601f19603f3d011682016040523d82523d6000602084013e62003430565b606091505b505090508062001d325760405162461bcd60e51b8152602060048201526013602482015272195d1a081d1c985b9cd9995c8819985a5b1959606a1b604482015260640162000bf5565b600854620034939030906001600160a01b03168462001f98565b60085460405163f305d71960e01b8152306004820152602481018490526000604482018190526064820181905260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af115801562003501573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190620010da919062003c34565b6040805160028082526060820183526000926020830190803683375050600854604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa15801562003593573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620035b9919062003cbb565b81600081518110620035cf57620035cf62003aea565b6001600160a01b039283166020918202929092010152600d5482519116908290600190811062003603576200360362003aea565b6001600160a01b03928316602091820292909201015260085416637ff36ab58360008430620036354261012c62003656565b6040518663ffffffff1660e01b815260040162003392949392919062003d5f565b600062001f83828462003a99565b611ec38062003e6083390190565b803561ffff811681146200368557600080fd5b919050565b600080600080600080600060e0888a031215620036a657600080fd5b620036b18862003672565b9650620036c16020890162003672565b9550620036d16040890162003672565b9450620036e16060890162003672565b9350620036f16080890162003672565b92506200370160a0890162003672565b91506200371160c0890162003672565b905092959891949750929550565b6001600160a01b0391909116815260200190565b600060208083528351808285015260005b81811015620037625785810183015185820160400152820162003744565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146200140457600080fd5b600060208284031215620037ac57600080fd5b813562001f838162003783565b60008060408385031215620037cd57600080fd5b8235620037da8162003783565b946020939093013593505050565b600080600060608486031215620037fe57600080fd5b83356200380b8162003783565b925060208401356200381d8162003783565b929592945050506040919091013590565b80151581146200140457600080fd5b600080604083850312156200385157600080fd5b82356200385e8162003783565b9150602083013562003870816200382e565b809150509250929050565b6000602082840312156200388e57600080fd5b5035919050565b60008083601f840112620038a857600080fd5b5081356001600160401b03811115620038c057600080fd5b6020830191508360208260051b8501011115620038dc57600080fd5b9250929050565b60008060008060408587031215620038fa57600080fd5b84356001600160401b03808211156200391257600080fd5b620039208883890162003895565b909650945060208701359150808211156200393a57600080fd5b50620039498782880162003895565b95989497509550505050565b600080600080608085870312156200396c57600080fd5b8435620039798162003783565b935060208501356200398b8162003783565b925060408501356200399d8162003783565b91506060850135620039af8162003783565b939692955090935050565b60008060408385031215620039ce57600080fd5b8235620039db8162003783565b91506020830135620038708162003783565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b61ffff81811683821601908082111562003a565762003a5662003a22565b5092915050565b600181811c9082168062003a7257607f821691505b60208210810362003a9357634e487b7160e01b600052602260045260246000fd5b50919050565b8082018082111562000f2f5762000f2f62003a22565b6001600160a01b039290921682521515602082015260400190565b60006020828403121562003add57600080fd5b815162001f83816200382e565b634e487b7160e01b600052603260045260246000fd5b808202811582820484141762000f2f5762000f2f62003a22565b60006001820162003b2f5762003b2f62003a22565b5060010190565b60006020828403121562003b4957600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052601260045260246000fd5b60008262003b915762003b9162003b69565b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b8181038181111562000f2f5762000f2f62003a22565b60008060006060848603121562003c4a57600080fd5b8351925060208401519150604084015190509250925092565b61ffff82811682821603908082111562003a565762003a5662003a22565b600061ffff8084168062003c995762003c9962003b69565b92169190910492915050565b634e487b7160e01b600052604160045260246000fd5b60006020828403121562003cce57600080fd5b815162001f838162003783565b600081518084526020808501945080840160005b8381101562003d165781516001600160a01b03168752958201959082019060010162003cef565b509495945050505050565b85815284602082015260a06040820152600062003d4260a083018662003cdb565b6001600160a01b0394909416606083015250608001529392505050565b84815260806020820152600062003d7a608083018662003cdb565b6001600160a01b03949094166040830152506060015292915050565b6000602080838503121562003daa57600080fd5b82516001600160401b038082111562003dc257600080fd5b818501915085601f83011262003dd757600080fd5b81518181111562003dec5762003dec62003ca5565b8060051b604051601f19603f8301168101818110858211171562003e145762003e1462003ca5565b60405291825284820192508381018501918883111562003e3357600080fd5b938501935b8285101562003e535784518452938501939285019262003e38565b9897505050505050505056fe60c06040523480156200001157600080fd5b5060405162001ec338038062001ec3833981016040819052620000349162000137565b60408051808201825260188082527f506978696141495f4469766964656e645f547261636b6572000000000000000060208084018290528451808601909552918452908301529082828260036200008c83826200020e565b5060046200009b82826200020e565b505050620000b8620000b2620000e160201b60201c565b620000e5565b6001600160a01b03166080525050610e106011555069043c33c193756480000060a052620002da565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000602082840312156200014a57600080fd5b81516001600160a01b03811681146200016257600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200019457607f821691505b602082108103620001b557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200020957600081815260208120601f850160051c81016020861015620001e45750805b601f850160051c820191505b818110156200020557828155600101620001f0565b5050505b505050565b81516001600160401b038111156200022a576200022a62000169565b62000242816200023b84546200017f565b84620001bb565b602080601f8311600181146200027a5760008415620002615750858301515b600019600386901b1c1916600185901b17855562000205565b600085815260208120601f198616915b82811015620002ab578886015182559484019460019091019084016200028a565b5085821015620002ca5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611bb56200030e600039600081816104310152610b400152600081816103f701526113580152611bb56000f3fe608060405234801561001057600080fd5b50600436106101ac5760003560e01c806306fdde03146101b1578063095ea7b3146101cf57806309bbedde146101f257806318160ddd14610204578063226cfa3d1461020c57806323b872dd1461022c57806327ce01471461023f5780633009a60914610252578063313ce5671461025b57806331e79db01461026a578063395093511461027f5780634e7b827f146102925780635183d6fd146102b55780636a4740021461030d5780636f2789ec1461031557806370a082311461031e578063715018a61461033157806385a6b3ae146103395780638da5cb5b1461034257806391b89fba1461036257806395d89b4114610375578063a457c2d71461037d578063a5244b3414610390578063a8b9d240146103a3578063a9059cbb146103b6578063aafd847a146103c9578063ae9ca1c4146103f2578063bc4c4b3714610419578063be10b6141461042c578063dd62ed3e14610453578063e30443bc1461048c578063e7841ec01461049f578063e98030c7146104a7578063f2fde38b146104ba578063fbcbc0f1146104cd578063ffb2c479146104e0575b600080fd5b6101b961050e565b6040516101c69190611856565b60405180910390f35b6101e26101dd3660046118b9565b6105a0565b60405190151581526020016101c6565b600a545b6040519081526020016101c6565b6002546101f6565b6101f661021a3660046118e5565b60106020526000908152604090205481565b6101e261023a366004611902565b6105b7565b6101f661024d3660046118e5565b610663565b6101f6600e5481565b604051601281526020016101c6565b61027d6102783660046118e5565b6106bc565b005b6101e261028d3660046118b9565b610781565b6101e26102a03660046118e5565b600f6020526000908152604090205460ff1681565b6102c86102c3366004611943565b6107bd565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101c6565b61027d600080fd5b6101f660115481565b6101f661032c3660046118e5565b61082e565b61027d610849565b6101f660095481565b61034a610882565b6040516001600160a01b0390911681526020016101c6565b6101f66103703660046118e5565b610891565b6101b961089c565b6101e261038b3660046118b9565b6108ab565b61027d61039e366004611943565b610944565b6101f66103b13660046118e5565b610a07565b6101e26103c43660046118b9565b610a33565b6101f66103d73660046118e5565b6001600160a01b031660009081526008602052604090205490565b61034a7f000000000000000000000000000000000000000000000000000000000000000081565b6101e261042736600461196a565b610a3d565b6101f67f000000000000000000000000000000000000000000000000000000000000000081565b6101f66104613660046119a3565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61027d61049a3660046118b9565b610aef565b600e546101f6565b61027d6104b5366004611943565b610ba7565b61027d6104c83660046118e5565b610c35565b6102c86104db3660046118e5565b610cd2565b6104f36104ee366004611943565b610dbb565b604080519384526020840192909252908201526060016101c6565b60606003805461051d906119d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610549906119d1565b80156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b5050505050905090565b60006105ad338484610ed8565b5060015b92915050565b60006105c1600080fd5b6001600160a01b03841660009081526001602090815260408083203384529091529020548281101561064b5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6106588533858403610ed8565b506001949350505050565b6001600160a01b038116600090815260076020526040812054600160801b906106b2906106ad906106a76106a26106998861082e565b60065490610ffc565b61100f565b9061101f565b61105d565b6105b19190611a21565b336106c5610882565b6001600160a01b0316146106eb5760405162461bcd60e51b815260040161064290611a43565b6001600160a01b0381166000908152600f602052604090205460ff161561071157600080fd5b6001600160a01b0381166000908152600f60205260408120805460ff1916600117905561073f908290611070565b61074a600a826110c9565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916105ad9185906107b8908690611a78565b610ed8565b6000806000806000806000806107d2600a5490565b89106107f7575060009650600019955085945086935083925082915081905080610821565b6000610804600a8b611204565b905061080f81610cd2565b98509850985098509850985098509850505b919395975091939597565b565b6001600160a01b031660009081526020819052604090205490565b33610852610882565b6001600160a01b0316146108785760405162461bcd60e51b815260040161064290611a43565b61082c6000611237565b6005546001600160a01b031690565b60006105b182610a07565b60606004805461051d906119d1565b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101561092d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610642565b61093a3385858403610ed8565b5060019392505050565b3361094d610882565b6001600160a01b0316146109735760405162461bcd60e51b815260040161064290611a43565b600061097e60025490565b1161098857600080fd5b8015610a04576109bb61099a60025490565b6109a883600160801b610ffc565b6109b29190611a21565b60065490611289565b60065560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600954610a009082611289565b6009555b50565b6001600160a01b0381166000908152600860205260408120546105b190610a2d84610663565b90611295565b60006105ad600080fd5b600033610a48610882565b6001600160a01b031614610a6e5760405162461bcd60e51b815260040161064290611a43565b6000610a79846112a1565b90508015610ae5576001600160a01b038416600081815260106020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610ad39085815260200190565b60405180910390a360019150506105b1565b5060009392505050565b33610af8610882565b6001600160a01b031614610b1e5760405162461bcd60e51b815260040161064290611a43565b6001600160a01b0382166000908152600f602052604090205460ff16610ba3577f00000000000000000000000000000000000000000000000000000000000000008110610b8057610b6f8282611070565b610b7b600a8383611426565b610b96565b610b8b826000611070565b610b96600a836110c9565b610ba1826001610a3d565b505b5050565b33610bb0610882565b6001600160a01b031614610bd65760405162461bcd60e51b815260040161064290611a43565b610e108110158015610beb5750620151808111155b610bf457600080fd5b6011548103610c0257600080fd5b60115460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601155565b33610c3e610882565b6001600160a01b031614610c645760405162461bcd60e51b815260040161064290611a43565b6001600160a01b038116610cc95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610642565b610a0481611237565b806000808080808080610ce6600a896114cf565b9650600019955060008712610d4857600e54871115610d1457600e54610d0d90889061151a565b9550610d48565b600e54600a5460009110610d29576000610d38565b600e54600a54610d3891611295565b9050610d44888261101f565b9650505b610d5188610a07565b9450610d5c88610663565b6001600160a01b038916600090815260106020526040902054909450925082610d86576000610d94565b601154610d94908490611289565b9150428211610da4576000610dae565b610dae8242611295565b9050919395975091939597565b600a5460009081908190808203610ddd575050600e5460009250829150610ed1565b600e546000805a90506000805b8984108015610df857508582105b15610ec05784610e0781611a8b565b600a5490965086109050610e1a57600094505b6000600a6000018681548110610e3257610e32611aa4565b60009182526020808320909101546001600160a01b03168083526010909152604090912054909150610e6390611557565b15610e8657610e73816001610a3d565b15610e865781610e8281611a8b565b9250505b82610e9081611a8b565b93505060005a905080851115610eb757610eb4610ead8683611295565b8790611289565b95505b9350610dea9050565b600e85905590975095509193505050505b9193909250565b6001600160a01b038316610f3a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610642565b6001600160a01b038216610f9b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610642565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006110088284611aba565b9392505050565b600081818112156105b157600080fd5b60008061102c8385611ad1565b90506000831215801561103f5750838112155b80611054575060008312801561105457508381125b61100857600080fd5b60008082121561106c57600080fd5b5090565b600061107b8361082e565b9050808211156110a35760006110918383611295565b905061109d848261157e565b50610ba1565b80821015610ba15760006110b78284611295565b90506110c384826115e2565b50505050565b6001600160a01b038116600090815260038301602052604090205460ff166110ef575050565b6001600160a01b03811660009081526003830160209081526040808320805460ff191690556001808601835281842084905560028601909252822054845490929161113991611af9565b9050600084600001828154811061115257611152611aa4565b60009182526020808320909101546001600160a01b039081168084526002890190925260408084208790559087168352822091909155855490915081908690859081106111a1576111a1611aa4565b600091825260209091200180546001600160a01b0319166001600160a01b039290921691909117905584548590806111db576111db611b0c565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b600082600001828154811061121b5761121b611aa4565b6000918252602090912001546001600160a01b03169392505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006110088284611a78565b60006110088284611af9565b6000806112ad83610a07565b9050801561141d576001600160a01b0383166000908152600860205260409020546112d89082611289565b6001600160a01b038416600081815260086020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906113279084815260200190565b60405180910390a260405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390526000917f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af11580156113a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c79190611b22565b905080611416576001600160a01b0384166000908152600860205260409020546113f19083611295565b6001600160a01b03909416600090815260086020526040812094909455509192915050565b5092915050565b50600092915050565b6001600160a01b038216600090815260038401602052604090205460ff161561146b576001600160a01b03821660009081526001840160205260409020819055610ba1565b6001600160a01b03821660008181526003850160209081526040808320805460ff19166001908117909155878101835281842086905587546002890184529184208290558101875586835291200180546001600160a01b0319169091179055505050565b6001600160a01b038116600090815260038301602052604081205460ff166114fa57506000196105b1565b506001600160a01b03166000908152600291909101602052604090205490565b6000806115278385611b3f565b90506000831215801561153a5750838113155b806110545750600083128015611054575083811361100857600080fd5b60004282111561156957506000919050565b6011546115764284611295565b101592915050565b6115888282611626565b6115c26115a36106a283600654610ffc90919063ffffffff16565b6001600160a01b0384166000908152600760205260409020549061151a565b6001600160a01b0390921660009081526007602052604090209190915550565b6115ec8282611707565b6115c26116076106a283600654610ffc90919063ffffffff16565b6001600160a01b0384166000908152600760205260409020549061101f565b6001600160a01b03821661167c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610642565b61168860008383610ba1565b806002600082825461169a9190611a78565b90915550506001600160a01b038216600090815260208190526040812080548392906116c7908490611a78565b90915550506040518181526001600160a01b03831690600090600080516020611b608339815191529060200160405180910390a3610ba360008383610ba1565b6001600160a01b0382166117675760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610642565b61177382600083610ba1565b6001600160a01b038216600090815260208190526040902054818110156117e75760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610642565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611816908490611af9565b90915550506040518281526000906001600160a01b03851690600080516020611b608339815191529060200160405180910390a3610ba183600084610ba1565b600060208083528351808285015260005b8181101561188357858101830151858201604001528201611867565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610a0457600080fd5b600080604083850312156118cc57600080fd5b82356118d7816118a4565b946020939093013593505050565b6000602082840312156118f757600080fd5b8135611008816118a4565b60008060006060848603121561191757600080fd5b8335611922816118a4565b92506020840135611932816118a4565b929592945050506040919091013590565b60006020828403121561195557600080fd5b5035919050565b8015158114610a0457600080fd5b6000806040838503121561197d57600080fd5b8235611988816118a4565b915060208301356119988161195c565b809150509250929050565b600080604083850312156119b657600080fd5b82356119c1816118a4565b91506020830135611998816118a4565b600181811c908216806119e557607f821691505b602082108103611a0557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082611a3e57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b808201808211156105b1576105b1611a0b565b600060018201611a9d57611a9d611a0b565b5060010190565b634e487b7160e01b600052603260045260246000fd5b80820281158282048414176105b1576105b1611a0b565b8082018281126000831280158216821582161715611af157611af1611a0b565b505092915050565b818103818111156105b1576105b1611a0b565b634e487b7160e01b600052603160045260246000fd5b600060208284031215611b3457600080fd5b81516110088161195c565b818103600083128015838313168383128216171561141657611416611a0b56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212201391377b7fa6aed5f91ac601f33f34e7e9534dd2f9876664edf3b5b10f4fca4764736f6c63430008110033a2646970667358221220b42ba2d3d68229bd47c29f76da815e2e4c47a1fde4fdc1eb54bc254ff0c5511664736f6c6343000811003360c06040523480156200001157600080fd5b5060405162001ec338038062001ec3833981016040819052620000349162000137565b60408051808201825260188082527f506978696141495f4469766964656e645f547261636b6572000000000000000060208084018290528451808601909552918452908301529082828260036200008c83826200020e565b5060046200009b82826200020e565b505050620000b8620000b2620000e160201b60201c565b620000e5565b6001600160a01b03166080525050610e106011555069043c33c193756480000060a052620002da565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000602082840312156200014a57600080fd5b81516001600160a01b03811681146200016257600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200019457607f821691505b602082108103620001b557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200020957600081815260208120601f850160051c81016020861015620001e45750805b601f850160051c820191505b818110156200020557828155600101620001f0565b5050505b505050565b81516001600160401b038111156200022a576200022a62000169565b62000242816200023b84546200017f565b84620001bb565b602080601f8311600181146200027a5760008415620002615750858301515b600019600386901b1c1916600185901b17855562000205565b600085815260208120601f198616915b82811015620002ab578886015182559484019460019091019084016200028a565b5085821015620002ca5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611bb56200030e600039600081816104310152610b400152600081816103f701526113580152611bb56000f3fe608060405234801561001057600080fd5b50600436106101ac5760003560e01c806306fdde03146101b1578063095ea7b3146101cf57806309bbedde146101f257806318160ddd14610204578063226cfa3d1461020c57806323b872dd1461022c57806327ce01471461023f5780633009a60914610252578063313ce5671461025b57806331e79db01461026a578063395093511461027f5780634e7b827f146102925780635183d6fd146102b55780636a4740021461030d5780636f2789ec1461031557806370a082311461031e578063715018a61461033157806385a6b3ae146103395780638da5cb5b1461034257806391b89fba1461036257806395d89b4114610375578063a457c2d71461037d578063a5244b3414610390578063a8b9d240146103a3578063a9059cbb146103b6578063aafd847a146103c9578063ae9ca1c4146103f2578063bc4c4b3714610419578063be10b6141461042c578063dd62ed3e14610453578063e30443bc1461048c578063e7841ec01461049f578063e98030c7146104a7578063f2fde38b146104ba578063fbcbc0f1146104cd578063ffb2c479146104e0575b600080fd5b6101b961050e565b6040516101c69190611856565b60405180910390f35b6101e26101dd3660046118b9565b6105a0565b60405190151581526020016101c6565b600a545b6040519081526020016101c6565b6002546101f6565b6101f661021a3660046118e5565b60106020526000908152604090205481565b6101e261023a366004611902565b6105b7565b6101f661024d3660046118e5565b610663565b6101f6600e5481565b604051601281526020016101c6565b61027d6102783660046118e5565b6106bc565b005b6101e261028d3660046118b9565b610781565b6101e26102a03660046118e5565b600f6020526000908152604090205460ff1681565b6102c86102c3366004611943565b6107bd565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101c6565b61027d600080fd5b6101f660115481565b6101f661032c3660046118e5565b61082e565b61027d610849565b6101f660095481565b61034a610882565b6040516001600160a01b0390911681526020016101c6565b6101f66103703660046118e5565b610891565b6101b961089c565b6101e261038b3660046118b9565b6108ab565b61027d61039e366004611943565b610944565b6101f66103b13660046118e5565b610a07565b6101e26103c43660046118b9565b610a33565b6101f66103d73660046118e5565b6001600160a01b031660009081526008602052604090205490565b61034a7f000000000000000000000000000000000000000000000000000000000000000081565b6101e261042736600461196a565b610a3d565b6101f67f000000000000000000000000000000000000000000000000000000000000000081565b6101f66104613660046119a3565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61027d61049a3660046118b9565b610aef565b600e546101f6565b61027d6104b5366004611943565b610ba7565b61027d6104c83660046118e5565b610c35565b6102c86104db3660046118e5565b610cd2565b6104f36104ee366004611943565b610dbb565b604080519384526020840192909252908201526060016101c6565b60606003805461051d906119d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610549906119d1565b80156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b5050505050905090565b60006105ad338484610ed8565b5060015b92915050565b60006105c1600080fd5b6001600160a01b03841660009081526001602090815260408083203384529091529020548281101561064b5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6106588533858403610ed8565b506001949350505050565b6001600160a01b038116600090815260076020526040812054600160801b906106b2906106ad906106a76106a26106998861082e565b60065490610ffc565b61100f565b9061101f565b61105d565b6105b19190611a21565b336106c5610882565b6001600160a01b0316146106eb5760405162461bcd60e51b815260040161064290611a43565b6001600160a01b0381166000908152600f602052604090205460ff161561071157600080fd5b6001600160a01b0381166000908152600f60205260408120805460ff1916600117905561073f908290611070565b61074a600a826110c9565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916105ad9185906107b8908690611a78565b610ed8565b6000806000806000806000806107d2600a5490565b89106107f7575060009650600019955085945086935083925082915081905080610821565b6000610804600a8b611204565b905061080f81610cd2565b98509850985098509850985098509850505b919395975091939597565b565b6001600160a01b031660009081526020819052604090205490565b33610852610882565b6001600160a01b0316146108785760405162461bcd60e51b815260040161064290611a43565b61082c6000611237565b6005546001600160a01b031690565b60006105b182610a07565b60606004805461051d906119d1565b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101561092d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610642565b61093a3385858403610ed8565b5060019392505050565b3361094d610882565b6001600160a01b0316146109735760405162461bcd60e51b815260040161064290611a43565b600061097e60025490565b1161098857600080fd5b8015610a04576109bb61099a60025490565b6109a883600160801b610ffc565b6109b29190611a21565b60065490611289565b60065560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600954610a009082611289565b6009555b50565b6001600160a01b0381166000908152600860205260408120546105b190610a2d84610663565b90611295565b60006105ad600080fd5b600033610a48610882565b6001600160a01b031614610a6e5760405162461bcd60e51b815260040161064290611a43565b6000610a79846112a1565b90508015610ae5576001600160a01b038416600081815260106020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610ad39085815260200190565b60405180910390a360019150506105b1565b5060009392505050565b33610af8610882565b6001600160a01b031614610b1e5760405162461bcd60e51b815260040161064290611a43565b6001600160a01b0382166000908152600f602052604090205460ff16610ba3577f00000000000000000000000000000000000000000000000000000000000000008110610b8057610b6f8282611070565b610b7b600a8383611426565b610b96565b610b8b826000611070565b610b96600a836110c9565b610ba1826001610a3d565b505b5050565b33610bb0610882565b6001600160a01b031614610bd65760405162461bcd60e51b815260040161064290611a43565b610e108110158015610beb5750620151808111155b610bf457600080fd5b6011548103610c0257600080fd5b60115460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601155565b33610c3e610882565b6001600160a01b031614610c645760405162461bcd60e51b815260040161064290611a43565b6001600160a01b038116610cc95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610642565b610a0481611237565b806000808080808080610ce6600a896114cf565b9650600019955060008712610d4857600e54871115610d1457600e54610d0d90889061151a565b9550610d48565b600e54600a5460009110610d29576000610d38565b600e54600a54610d3891611295565b9050610d44888261101f565b9650505b610d5188610a07565b9450610d5c88610663565b6001600160a01b038916600090815260106020526040902054909450925082610d86576000610d94565b601154610d94908490611289565b9150428211610da4576000610dae565b610dae8242611295565b9050919395975091939597565b600a5460009081908190808203610ddd575050600e5460009250829150610ed1565b600e546000805a90506000805b8984108015610df857508582105b15610ec05784610e0781611a8b565b600a5490965086109050610e1a57600094505b6000600a6000018681548110610e3257610e32611aa4565b60009182526020808320909101546001600160a01b03168083526010909152604090912054909150610e6390611557565b15610e8657610e73816001610a3d565b15610e865781610e8281611a8b565b9250505b82610e9081611a8b565b93505060005a905080851115610eb757610eb4610ead8683611295565b8790611289565b95505b9350610dea9050565b600e85905590975095509193505050505b9193909250565b6001600160a01b038316610f3a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610642565b6001600160a01b038216610f9b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610642565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006110088284611aba565b9392505050565b600081818112156105b157600080fd5b60008061102c8385611ad1565b90506000831215801561103f5750838112155b80611054575060008312801561105457508381125b61100857600080fd5b60008082121561106c57600080fd5b5090565b600061107b8361082e565b9050808211156110a35760006110918383611295565b905061109d848261157e565b50610ba1565b80821015610ba15760006110b78284611295565b90506110c384826115e2565b50505050565b6001600160a01b038116600090815260038301602052604090205460ff166110ef575050565b6001600160a01b03811660009081526003830160209081526040808320805460ff191690556001808601835281842084905560028601909252822054845490929161113991611af9565b9050600084600001828154811061115257611152611aa4565b60009182526020808320909101546001600160a01b039081168084526002890190925260408084208790559087168352822091909155855490915081908690859081106111a1576111a1611aa4565b600091825260209091200180546001600160a01b0319166001600160a01b039290921691909117905584548590806111db576111db611b0c565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b600082600001828154811061121b5761121b611aa4565b6000918252602090912001546001600160a01b03169392505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006110088284611a78565b60006110088284611af9565b6000806112ad83610a07565b9050801561141d576001600160a01b0383166000908152600860205260409020546112d89082611289565b6001600160a01b038416600081815260086020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906113279084815260200190565b60405180910390a260405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390526000917f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af11580156113a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c79190611b22565b905080611416576001600160a01b0384166000908152600860205260409020546113f19083611295565b6001600160a01b03909416600090815260086020526040812094909455509192915050565b5092915050565b50600092915050565b6001600160a01b038216600090815260038401602052604090205460ff161561146b576001600160a01b03821660009081526001840160205260409020819055610ba1565b6001600160a01b03821660008181526003850160209081526040808320805460ff19166001908117909155878101835281842086905587546002890184529184208290558101875586835291200180546001600160a01b0319169091179055505050565b6001600160a01b038116600090815260038301602052604081205460ff166114fa57506000196105b1565b506001600160a01b03166000908152600291909101602052604090205490565b6000806115278385611b3f565b90506000831215801561153a5750838113155b806110545750600083128015611054575083811361100857600080fd5b60004282111561156957506000919050565b6011546115764284611295565b101592915050565b6115888282611626565b6115c26115a36106a283600654610ffc90919063ffffffff16565b6001600160a01b0384166000908152600760205260409020549061151a565b6001600160a01b0390921660009081526007602052604090209190915550565b6115ec8282611707565b6115c26116076106a283600654610ffc90919063ffffffff16565b6001600160a01b0384166000908152600760205260409020549061101f565b6001600160a01b03821661167c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610642565b61168860008383610ba1565b806002600082825461169a9190611a78565b90915550506001600160a01b038216600090815260208190526040812080548392906116c7908490611a78565b90915550506040518181526001600160a01b03831690600090600080516020611b608339815191529060200160405180910390a3610ba360008383610ba1565b6001600160a01b0382166117675760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610642565b61177382600083610ba1565b6001600160a01b038216600090815260208190526040902054818110156117e75760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610642565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611816908490611af9565b90915550506040518281526000906001600160a01b03851690600080516020611b608339815191529060200160405180910390a3610ba183600084610ba1565b600060208083528351808285015260005b8181101561188357858101830151858201604001528201611867565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610a0457600080fd5b600080604083850312156118cc57600080fd5b82356118d7816118a4565b946020939093013593505050565b6000602082840312156118f757600080fd5b8135611008816118a4565b60008060006060848603121561191757600080fd5b8335611922816118a4565b92506020840135611932816118a4565b929592945050506040919091013590565b60006020828403121561195557600080fd5b5035919050565b8015158114610a0457600080fd5b6000806040838503121561197d57600080fd5b8235611988816118a4565b915060208301356119988161195c565b809150509250929050565b600080604083850312156119b657600080fd5b82356119c1816118a4565b91506020830135611998816118a4565b600181811c908216806119e557607f821691505b602082108103611a0557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082611a3e57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b808201808211156105b1576105b1611a0b565b600060018201611a9d57611a9d611a0b565b5060010190565b634e487b7160e01b600052603260045260246000fd5b80820281158282048414176105b1576105b1611a0b565b8082018281126000831280158216821582161715611af157611af1611a0b565b505092915050565b818103818111156105b1576105b1611a0b565b634e487b7160e01b600052603160045260246000fd5b600060208284031215611b3457600080fd5b81516110088161195c565b818103600083128015838313168383128216171561141657611416611a0b56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212201391377b7fa6aed5f91ac601f33f34e7e9534dd2f9876664edf3b5b10f4fca4764736f6c63430008110033

Deployed Bytecode

0x608060405260043610620002d05760003560e01c806301339c2114620002dd57806302357da014620002f757806306228749146200031c57806306ee6ad8146200034c57806306fdde03146200036e578063078662911462000395578063095ea7b314620003da5780631694505e14620003ff57806318160ddd146200042157806323b872dd146200044257806323cc660114620004675780632b14ca56146200048c5780632c1f5216146200052b578063307aebc9146200054d578063313ce567146200057057806331e79db0146200058e578063366b2f3114620005b35780633950935114620005d85780634626402b14620005fd57806347062402146200061f57806349bd5a5e14620006795780634e71d92d146200069b5780634fbee19314620006b35780635456822714620006f057806355291dbd14620007155780635d0044ca146200072d57806367243482146200075257806370a082311462000777578063715018a6146200079c578063781edb3c14620007b4578063790ca41314620007d95780637a034dc214620007f157806383672f3e1462000816578063871c128d146200083b5780638c0b5e2214620008605780638da5cb5b14620008785780638ea5220f146200089057806395b73c9514620008b257806395d89b4114620008d75780639a7a23d614620008ef5780639c1b8af51462000914578063a457c2d7146200092c578063a9059cbb1462000951578063ae9ca1c41462000976578063afa4f3b21462000998578063b62496f514620009bd578063bc33718214620009f1578063c02466681462000a16578063d1d7d7ef1462000a3b578063d5c0b28c1462000a6f578063d762781f1462000a94578063dd62ed3e1462000ab6578063e2f456051462000b00578063e98030c71462000b18578063f2fde38b1462000b3d578063f5241cd31462000b62578063f8b45b051462000b84578063f9d0831a1462000b9c57600080fd5b36620002d857005b600080fd5b348015620002ea57600080fd5b50620002f562000bc1565b005b3480156200030457600080fd5b50620002f5620003163660046200368a565b62000c5c565b3480156200032957600080fd5b506200033461dead81565b6040516200034391906200371f565b60405180910390f35b3480156200035957600080fd5b5060105462000334906001600160a01b031681565b3480156200037b57600080fd5b506200038662000e82565b60405162000343919062003733565b348015620003a257600080fd5b50620003c9620003b436600462003799565b60176020526000908152604090205460ff1681565b604051901515815260200162000343565b348015620003e757600080fd5b50620003c9620003f9366004620037b9565b62000f1c565b3480156200040c57600080fd5b5060085462000334906001600160a01b031681565b3480156200042e57600080fd5b506002545b60405190815260200162000343565b3480156200044f57600080fd5b50620003c962000461366004620037e8565b62000f35565b3480156200047457600080fd5b50620002f5620004863660046200383d565b62000fe5565b3480156200049957600080fd5b50600754620004e69061ffff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b8204811691600160501b8104821691600160601b9091041687565b6040805161ffff9889168152968816602088015294871694860194909452918516606085015284166080840152831660a083015290911660c082015260e00162000343565b3480156200053857600080fd5b50600b5462000334906001600160a01b031681565b3480156200055a57600080fd5b50600954620003c990600160a81b900460ff1681565b3480156200057d57600080fd5b506040516012815260200162000343565b3480156200059b57600080fd5b50620002f5620005ad36600462003799565b62001044565b348015620005c057600080fd5b50620002f5620005d236600462003799565b620010e1565b348015620005e557600080fd5b50620003c9620005f7366004620037b9565b62001349565b3480156200060a57600080fd5b5060115462000334906001600160a01b031681565b3480156200062c57600080fd5b50600654620004e69061ffff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b8204811691600160501b8104821691600160601b9091041687565b3480156200068657600080fd5b5060095462000334906001600160a01b031681565b348015620006a857600080fd5b50620002f562001389565b348015620006c057600080fd5b50620003c9620006d236600462003799565b6001600160a01b031660009081526016602052604090205460ff1690565b348015620006fd57600080fd5b50620002f56200070f3660046200368a565b62001407565b3480156200072257600080fd5b50620002f562001624565b3480156200073a57600080fd5b50620002f56200074c3660046200387b565b62001685565b3480156200075f57600080fd5b50620002f562000771366004620038e3565b620016e2565b3480156200078457600080fd5b50620004336200079636600462003799565b620017ac565b348015620007a957600080fd5b50620002f5620017c7565b348015620007c157600080fd5b50620002f5620007d33660046200383d565b62001809565b348015620007e657600080fd5b5062000433600a5481565b348015620007fe57600080fd5b50620002f5620008103660046200387b565b62001868565b3480156200082357600080fd5b50620002f56200083536600462003955565b620018b7565b3480156200084857600080fd5b50620002f56200085a3660046200387b565b6200193b565b3480156200086d57600080fd5b506200043360135481565b3480156200088557600080fd5b5062000334620019d2565b3480156200089d57600080fd5b50600e5462000334906001600160a01b031681565b348015620008bf57600080fd5b50620002f5620008d136600462003799565b620019e1565b348015620008e457600080fd5b506200038662001a37565b348015620008fc57600080fd5b50620002f56200090e3660046200383d565b62001a48565b3480156200092157600080fd5b506200043360155481565b3480156200093957600080fd5b50620003c96200094b366004620037b9565b62001aa8565b3480156200095e57600080fd5b50620003c962000970366004620037b9565b62001b45565b3480156200098357600080fd5b50600d5462000334906001600160a01b031681565b348015620009a557600080fd5b50620002f5620009b73660046200387b565b62001b54565b348015620009ca57600080fd5b50620003c9620009dc36600462003799565b60196020526000908152604090205460ff1681565b348015620009fe57600080fd5b50620002f562000a103660046200387b565b62001ba2565b34801562000a2357600080fd5b50620002f562000a353660046200383d565b62001bf8565b34801562000a4857600080fd5b50620003c962000a5a36600462003799565b60186020526000908152604090205460ff1681565b34801562000a7c57600080fd5b50620002f562000a8e36600462003799565b62001cb9565b34801562000aa157600080fd5b50600f5462000334906001600160a01b031681565b34801562000ac357600080fd5b506200043362000ad5366004620039ba565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801562000b0d57600080fd5b506200043360125481565b34801562000b2557600080fd5b50620002f562000b373660046200387b565b62001d37565b34801562000b4a57600080fd5b50620002f562000b5c36600462003799565b62001d9d565b34801562000b6f57600080fd5b50600c5462000334906001600160a01b031681565b34801562000b9157600080fd5b506200043360145481565b34801562000ba957600080fd5b50620002f562000bbb36600462003799565b62001e43565b3362000bcc620019d2565b6001600160a01b03161462000bfe5760405162461bcd60e51b815260040162000bf590620039ed565b60405180910390fd5b600a541562000c475760405162461bcd60e51b8152602060048201526014602482015273616c7265616479206c61756e6368656420626f6960601b604482015260640162000bf5565b6009805460ff60a81b1916600160a81b179055565b3362000c67620019d2565b6001600160a01b03161462000c905760405162461bcd60e51b815260040162000bf590620039ed565b86600760000160006101000a81548161ffff021916908361ffff16021790555085600760000160066101000a81548161ffff021916908361ffff16021790555084600760000160046101000a81548161ffff021916908361ffff16021790555083600760000160026101000a81548161ffff021916908361ffff16021790555082600760000160086101000a81548161ffff021916908361ffff160217905550816007600001600a6101000a81548161ffff021916908361ffff160217905550806007600001600c6101000a81548161ffff021916908361ffff1602179055506006600001600c9054906101000a900461ffff166007600001600a9054906101000a900461ffff16600760000160089054906101000a900461ffff16600760000160029054906101000a900461ffff16600760000160049054906101000a900461ffff16600760000160069054906101000a900461ffff16600760000160009054906101000a900461ffff1662000e08919062003a38565b62000e14919062003a38565b62000e20919062003a38565b62000e2c919062003a38565b62000e38919062003a38565b62000e44919062003a38565b6009805461ffff60c01b1916600160c01b61ffff938416810291909117918290556107d09104909116111562000e7957600080fd5b50505050505050565b60606003805462000e939062003a5d565b80601f016020809104026020016040519081016040528092919081815260200182805462000ec19062003a5d565b801562000f125780601f1062000ee65761010080835404028352916020019162000f12565b820191906000526020600020905b81548152906001019060200180831162000ef457829003601f168201915b5050505050905090565b600062000f2b33848462001f98565b5060015b92915050565b600062000f44848484620020c0565b6001600160a01b03841660009081526001602090815260408083203384529091529020548281101562000fcb5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b606482015260840162000bf5565b62000fda853385840362001f98565b506001949350505050565b3362000ff0620019d2565b6001600160a01b031614620010195760405162461bcd60e51b815260040162000bf590620039ed565b6001600160a01b03919091166000908152601760205260409020805460ff1916911515919091179055565b336200104f620019d2565b6001600160a01b031614620010785760405162461bcd60e51b815260040162000bf590620039ed565b600b5460405163031e79db60e41b81526001600160a01b03909116906331e79db090620010aa9084906004016200371f565b600060405180830381600087803b158015620010c557600080fd5b505af1158015620010da573d6000803e3d6000fd5b5050505050565b33620010ec620019d2565b6001600160a01b031614620011155760405162461bcd60e51b815260040162000bf590620039ed565b600081604051620011269062003664565b6200113291906200371f565b604051809103906000f0801580156200114f573d6000803e3d6000fd5b5060405163031e79db60e41b81529091506001600160a01b038216906331e79db090620011819084906004016200371f565b600060405180830381600087803b1580156200119c57600080fd5b505af1158015620011b1573d6000803e3d6000fd5b505060405163031e79db60e41b81526001600160a01b03841692506331e79db09150620011e39030906004016200371f565b600060405180830381600087803b158015620011fe57600080fd5b505af115801562001213573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db062001230620019d2565b6040518263ffffffff1660e01b81526004016200124e91906200371f565b600060405180830381600087803b1580156200126957600080fd5b505af11580156200127e573d6000803e3d6000fd5b505060085460405163031e79db60e41b81526001600160a01b0380861694506331e79db09350620012b49216906004016200371f565b600060405180830381600087803b158015620012cf57600080fd5b505af1158015620012e4573d6000803e3d6000fd5b5050600d80546001600160a01b038087166001600160a01b03199283168117909355600b80549187169190921681179091556040519093509091507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a35050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909162000f2b9185906200138390869062003a99565b62001f98565b600b5460405163bc4c4b3760e01b81526001600160a01b039091169063bc4c4b3790620013be90339060009060040162003aaf565b6020604051808303816000875af1158015620013de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001404919062003aca565b50565b3362001412620019d2565b6001600160a01b0316146200143b5760405162461bcd60e51b815260040162000bf590620039ed565b86600660000160006101000a81548161ffff021916908361ffff16021790555085600660000160066101000a81548161ffff021916908361ffff16021790555084600660000160046101000a81548161ffff021916908361ffff16021790555083600660000160026101000a81548161ffff021916908361ffff16021790555082600660000160086101000a81548161ffff021916908361ffff160217905550816006600001600a6101000a81548161ffff021916908361ffff160217905550806006600001600c6101000a81548161ffff021916908361ffff1602179055506006600001600c9054906101000a900461ffff166006600001600a9054906101000a900461ffff16600660000160089054906101000a900461ffff16600660000160029054906101000a900461ffff16600660000160049054906101000a900461ffff16600660000160069054906101000a900461ffff16600660000160009054906101000a900461ffff16620015b3919062003a38565b620015bf919062003a38565b620015cb919062003a38565b620015d7919062003a38565b620015e3919062003a38565b620015ef919062003a38565b6009805461ffff60b01b1916600160b01b61ffff938416810291909117918290556107d09104909116111562000e7957600080fd5b336200162f620019d2565b6001600160a01b031614620016585760405162461bcd60e51b815260040162000bf590620039ed565b60405133904780156108fc02916000818181858888f1935050505015801562001404573d6000803e3d6000fd5b3362001690620019d2565b6001600160a01b031614620016b95760405162461bcd60e51b815260040162000bf590620039ed565b620016d06064620016c960025490565b9062001f8a565b811015620016dd57600080fd5b601455565b33620016ed620019d2565b6001600160a01b031614620017165760405162461bcd60e51b815260040162000bf590620039ed565b8281146200172357600080fd5b60005b83811015620010da57620017973386868481811062001749576200174962003aea565b905060200201602081019062001760919062003799565b85858581811062001775576200177562003aea565b90506020020135670de0b6b3a764000062001791919062003b00565b620020c0565b80620017a38162003b1a565b91505062001726565b6001600160a01b031660009081526020819052604090205490565b33620017d2620019d2565b6001600160a01b031614620017fb5760405162461bcd60e51b815260040162000bf590620039ed565b6200180760006200278c565b565b3362001814620019d2565b6001600160a01b0316146200183d5760405162461bcd60e51b815260040162000bf590620039ed565b6001600160a01b03919091166000908152601860205260409020805460ff1916911515919091179055565b3362001873620019d2565b6001600160a01b0316146200189c5760405162461bcd60e51b815260040162000bf590620039ed565b60095462001404906001600160a01b031661dead83620020c0565b33620018c2620019d2565b6001600160a01b031614620018eb5760405162461bcd60e51b815260040162000bf590620039ed565b600e80546001600160a01b039586166001600160a01b031991821617909155600f805494861694821694909417909355601180549285169284169290921790915560108054919093169116179055565b3362001946620019d2565b6001600160a01b0316146200196f5760405162461bcd60e51b815260040162000bf590620039ed565b62030d4081101580156200198657506207a1208111155b6200199057600080fd5b60155481036200199f57600080fd5b60155460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601555565b6005546001600160a01b031690565b33620019ec620019d2565b6001600160a01b03161462001a155760405162461bcd60e51b815260040162000bf590620039ed565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b60606004805462000e939062003a5d565b3362001a53620019d2565b6001600160a01b03161462001a7c5760405162461bcd60e51b815260040162000bf590620039ed565b6009546001600160a01b039081169083160362001a9857600080fd5b62001aa48282620027de565b5050565b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101562001b2c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840162000bf5565b62001b3b338585840362001f98565b5060019392505050565b600062000f2b338484620020c0565b3362001b5f620019d2565b6001600160a01b03161462001b885760405162461bcd60e51b815260040162000bf590620039ed565b62001b9c81670de0b6b3a764000062003b00565b60125550565b3362001bad620019d2565b6001600160a01b03161462001bd65760405162461bcd60e51b815260040162000bf590620039ed565b62001be66064620016c960025490565b81101562001bf357600080fd5b601355565b3362001c03620019d2565b6001600160a01b03161462001c2c5760405162461bcd60e51b815260040162000bf590620039ed565b6001600160a01b03821660009081526016602052604090205481151560ff90911615150362001c5a57600080fd5b6001600160a01b038216600081815260166020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b60405163bc4c4b3760e01b815281906001600160a01b0382169063bc4c4b379062001cec90339060009060040162003aaf565b6020604051808303816000875af115801562001d0c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001d32919062003aca565b505050565b3362001d42620019d2565b6001600160a01b03161462001d6b5760405162461bcd60e51b815260040162000bf590620039ed565b600b5460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401620010aa565b3362001da8620019d2565b6001600160a01b03161462001dd15760405162461bcd60e51b815260040162000bf590620039ed565b6001600160a01b03811662001e385760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000bf5565b62001404816200278c565b3362001e4e620019d2565b6001600160a01b03161462001e775760405162461bcd60e51b815260040162000bf590620039ed565b6040516370a0823160e01b815281906000906001600160a01b038316906370a082319062001eaa9030906004016200371f565b602060405180830381865afa15801562001ec8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001eee919062003b36565b9050816001600160a01b031663a9059cbb62001f09620019d2565b836040518363ffffffff1660e01b815260040162001f2992919062003b50565b6020604051808303816000875af115801562001f49573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001f6f919062003aca565b50505050565b600062001f83828462003b00565b9392505050565b600062001f83828462003b7f565b6001600160a01b03831662001ffc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840162000bf5565b6001600160a01b0382166200205f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000bf5565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316620020e95760405162461bcd60e51b815260040162000bf59062003b96565b6001600160a01b038216620021125760405162461bcd60e51b815260040162000bf59062003bdb565b80600003620021295762001d328383600062002951565b6001600160a01b03831660009081526016602052604090205460ff16620021a157600954600160a81b900460ff16620021a15760405162461bcd60e51b8152602060048201526019602482015278151c98591a5b99c81a5cc81b9bdd081858dd1a5d99481e595d603a1b604482015260640162000bf5565b6000620021ae30620017ac565b60125490915081108015908190620021d05750600954600160a01b900460ff16155b8015620021f657506001600160a01b03851660009081526019602052604090205460ff16155b80156200221e575062002208620019d2565b6001600160a01b0316856001600160a01b031614155b801562002246575062002230620019d2565b6001600160a01b0316846001600160a01b031614155b1562002278576009805460ff60a01b1916600160a01b1790556200226a8262002ab1565b6009805460ff60a01b191690555b6009546001600160a01b03861660009081526016602052604090205460ff600160a01b909204821615911680620022c757506001600160a01b03851660009081526016602052604090205460ff165b15620022d1575060005b8015620025c9576001600160a01b038516600090815260196020526040812054819060ff161580156200231d57506001600160a01b03871660009081526018602052604090205460ff16155b156200239e57601454866200233289620017ac565b6200233e919062003a99565b11156200239e5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e3a2042616c616e63652065786365656473204d61782057616c6c656044820152661d081b1a5b5a5d60ca1b606482015260840162000bf5565b6001600160a01b03881660009081526019602052604090205460ff168015620023e057506001600160a01b03871660009081526017602052604090205460ff16155b156200249357601354861115620024365760405162461bcd60e51b81526020600482015260196024820152784275793a204d6178205478206c696d6974206578636565647360381b604482015260640162000bf5565b6009546200245a9061271090620016c9908990600160b01b900461ffff1662001f75565b6009546006549193506200248b9161ffff600160b01b909204821691620016c9918691620100009091041662001f75565b905062002583565b6001600160a01b03871660009081526019602052604090205460ff168015620024d557506001600160a01b03881660009081526017602052604090205460ff16155b15620025835760135486106200252b5760405162461bcd60e51b815260206004820152601a60248201527953656c6c3a204d6178205478206c696d6974206578636565647360301b604482015260640162000bf5565b6009546200254f9061271090620016c9908990600160c01b900461ffff1662001f75565b600954600654919350620025809161ffff600160b01b909204821691620016c9918691620100009091041662001f75565b90505b8115620025c65762002596868362002ec4565b9550620025b08830620025aa848662003c1e565b62002951565b8015620025c657620025c68861dead8362002951565b50505b620025d686868662002951565b600b546001600160a01b031663e30443bc87620025f381620017ac565b6040518363ffffffff1660e01b81526004016200261292919062003b50565b600060405180830381600087803b1580156200262d57600080fd5b505af19250505080156200263f575060015b50600b546001600160a01b031663e30443bc866200265d81620017ac565b6040518363ffffffff1660e01b81526004016200267c92919062003b50565b600060405180830381600087803b1580156200269757600080fd5b505af1925050508015620026a9575060015b50600954600160a01b900460ff166200278457601554600b546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af19250505080156200272c575060408051601f3d908101601f19168201909252620027299181019062003c34565b60015b1562000e795760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a3505050505b505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03821660009081526019602052604090205481151560ff909116151503620028805760405162461bcd60e51b815260206004820152604160248201527f506978696141493a204175746f6d61746564206d61726b6574206d616b65722060448201527f7061697220697320616c72656164792073657420746f20746861742076616c756064820152606560f81b608482015260a40162000bf5565b6001600160a01b0382166000908152601960205260409020805460ff191682158015919091179091556200291557600b5460405163031e79db60e41b81526001600160a01b03909116906331e79db090620028e09085906004016200371f565b600060405180830381600087803b158015620028fb57600080fd5b505af115801562002910573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b0383166200297a5760405162461bcd60e51b815260040162000bf59062003b96565b6001600160a01b038216620029a35760405162461bcd60e51b815260040162000bf59062003bdb565b6001600160a01b0383166000908152602081905260409020548181101562002a1d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840162000bf5565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929062002a5690849062003a99565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405162002aa391815260200190565b60405180910390a362001f6f565b600754600654600954479260009261ffff62010000928390048116939290910481169162002af191600160c01b8204811691600160b01b90041662003a38565b62002afd919062003c63565b62002b09919062003c63565b60075460065461ffff928316935060009262002c23928592620016c992600160601b808404821693908304821692600160501b808304841693908204811692600160401b808204831693908104831692600160301b80840482169390830482169260029262002b8692600160201b90819004821692041662003a38565b62002b92919062003c81565b60075460065462002bab9161ffff908116911662003a38565b62002bb7919062003a38565b62002bc3919062003a38565b62002bcf919062003a38565b62002bdb919062003a38565b62002be7919062003a38565b62002bf3919062003a38565b62002bff919062003a38565b62002c0b919062003a38565b62002c17919062003a38565b879061ffff1662001f75565b9050600062002c33828662003c1e565b905062002c408262002ed2565b60075460065460009160029162002c6b9161ffff600160201b91829004811692919091041662003a38565b62002c77919062003c81565b61ffff169050600062002c8b478762002ec4565b9050600062002cc962002c9f848862003c1e565b600754600654620016c99162002cbd9161ffff918216911662003a38565b859061ffff1662001f75565b9050600062002d1262002cdd858962003c1e565b600754600654620016c99162002d069161ffff600160401b928390048116929091041662003a38565b869061ffff1662001f75565b9050600062002d4f62002d26868a62003c1e565b600754600654620016c99162002c179161ffff600160501b928390048116929091041662003a38565b9050600062002d9862002d63878b62003c1e565b600754600654620016c99162002d8c9161ffff600160301b928390048116929091041662003a38565b889061ffff1662001f75565b9050600062002de162002dac888c62003c1e565b600754600654620016c99162002dd59161ffff600160601b928390048116929091041662003a38565b899061ffff1662001f75565b9050821562002df55762002df58362003033565b801562002e075762002e078162003269565b811562002e2657600e5462002e26906001600160a01b031683620033dc565b831562002e455760115462002e45906001600160a01b031685620033dc565b841562002e645760105462002e64906001600160a01b031686620033dc565b471562002eb65762002eb6888483858862002e808b8d62003c1e565b62002e8c919062003c1e565b62002e98919062003c1e565b62002ea4919062003c1e565b62002eb0919062003c1e565b62003479565b505050505050505050505050565b600062001f83828462003c1e565b604080516002808252606082018352600092602083019080368337019050509050308160008151811062002f0a5762002f0a62003aea565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801562002f64573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002f8a919062003cbb565b8160018151811062002fa05762002fa062003aea565b6001600160a01b03928316602091820292909201015260085462002fc8913091168462001f98565b60085460405163791ac94760e01b81526001600160a01b039091169063791ac947906200300390859060009086903090429060040162003d21565b600060405180830381600087803b1580156200301e57600080fd5b505af115801562002784573d6000803e3d6000fd5b600d546040516370a0823160e01b81526000916001600160a01b0316906370a0823190620030669030906004016200371f565b602060405180830381865afa15801562003084573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620030aa919062003b36565b9050620030b78262003528565b600d546040516370a0823160e01b81526000916200313c9184916001600160a01b0316906370a0823190620030f19030906004016200371f565b602060405180830381865afa1580156200310f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003135919062003b36565b9062002ec4565b600d54600b5460405163a9059cbb60e01b81529293506000926001600160a01b039283169263a9059cbb926200317a92911690869060040162003b50565b6020604051808303816000875af11580156200319a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620031c0919062003aca565b9050801562001f6f57600b5460405163294912cd60e21b8152600481018490526001600160a01b039091169063a5244b3490602401600060405180830381600087803b1580156200321057600080fd5b505af115801562003225573d6000803e3d6000fd5b505050507fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b1826040516200325b91815260200190565b60405180910390a150505050565b6040805160028082526060820183526000926020830190803683375050600854604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015620032d4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620032fa919062003cbb565b8160008151811062003310576200331062003aea565b6001600160a01b039283166020918202929092010152600c5482519116908290600190811062003344576200334462003aea565b6001600160a01b039283166020918202929092010152600854600f54604051637ff36ab560e01b815291831692637ff36ab59286926200339292600092889290911690429060040162003d5f565b60006040518083038185885af1158015620033b1573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405262001d32919081019062003d96565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146200342b576040519150601f19603f3d011682016040523d82523d6000602084013e62003430565b606091505b505090508062001d325760405162461bcd60e51b8152602060048201526013602482015272195d1a081d1c985b9cd9995c8819985a5b1959606a1b604482015260640162000bf5565b600854620034939030906001600160a01b03168462001f98565b60085460405163f305d71960e01b8152306004820152602481018490526000604482018190526064820181905260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af115801562003501573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190620010da919062003c34565b6040805160028082526060820183526000926020830190803683375050600854604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa15801562003593573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620035b9919062003cbb565b81600081518110620035cf57620035cf62003aea565b6001600160a01b039283166020918202929092010152600d5482519116908290600190811062003603576200360362003aea565b6001600160a01b03928316602091820292909201015260085416637ff36ab58360008430620036354261012c62003656565b6040518663ffffffff1660e01b815260040162003392949392919062003d5f565b600062001f83828462003a99565b611ec38062003e6083390190565b803561ffff811681146200368557600080fd5b919050565b600080600080600080600060e0888a031215620036a657600080fd5b620036b18862003672565b9650620036c16020890162003672565b9550620036d16040890162003672565b9450620036e16060890162003672565b9350620036f16080890162003672565b92506200370160a0890162003672565b91506200371160c0890162003672565b905092959891949750929550565b6001600160a01b0391909116815260200190565b600060208083528351808285015260005b81811015620037625785810183015185820160400152820162003744565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146200140457600080fd5b600060208284031215620037ac57600080fd5b813562001f838162003783565b60008060408385031215620037cd57600080fd5b8235620037da8162003783565b946020939093013593505050565b600080600060608486031215620037fe57600080fd5b83356200380b8162003783565b925060208401356200381d8162003783565b929592945050506040919091013590565b80151581146200140457600080fd5b600080604083850312156200385157600080fd5b82356200385e8162003783565b9150602083013562003870816200382e565b809150509250929050565b6000602082840312156200388e57600080fd5b5035919050565b60008083601f840112620038a857600080fd5b5081356001600160401b03811115620038c057600080fd5b6020830191508360208260051b8501011115620038dc57600080fd5b9250929050565b60008060008060408587031215620038fa57600080fd5b84356001600160401b03808211156200391257600080fd5b620039208883890162003895565b909650945060208701359150808211156200393a57600080fd5b50620039498782880162003895565b95989497509550505050565b600080600080608085870312156200396c57600080fd5b8435620039798162003783565b935060208501356200398b8162003783565b925060408501356200399d8162003783565b91506060850135620039af8162003783565b939692955090935050565b60008060408385031215620039ce57600080fd5b8235620039db8162003783565b91506020830135620038708162003783565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b61ffff81811683821601908082111562003a565762003a5662003a22565b5092915050565b600181811c9082168062003a7257607f821691505b60208210810362003a9357634e487b7160e01b600052602260045260246000fd5b50919050565b8082018082111562000f2f5762000f2f62003a22565b6001600160a01b039290921682521515602082015260400190565b60006020828403121562003add57600080fd5b815162001f83816200382e565b634e487b7160e01b600052603260045260246000fd5b808202811582820484141762000f2f5762000f2f62003a22565b60006001820162003b2f5762003b2f62003a22565b5060010190565b60006020828403121562003b4957600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052601260045260246000fd5b60008262003b915762003b9162003b69565b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b8181038181111562000f2f5762000f2f62003a22565b60008060006060848603121562003c4a57600080fd5b8351925060208401519150604084015190509250925092565b61ffff82811682821603908082111562003a565762003a5662003a22565b600061ffff8084168062003c995762003c9962003b69565b92169190910492915050565b634e487b7160e01b600052604160045260246000fd5b60006020828403121562003cce57600080fd5b815162001f838162003783565b600081518084526020808501945080840160005b8381101562003d165781516001600160a01b03168752958201959082019060010162003cef565b509495945050505050565b85815284602082015260a06040820152600062003d4260a083018662003cdb565b6001600160a01b0394909416606083015250608001529392505050565b84815260806020820152600062003d7a608083018662003cdb565b6001600160a01b03949094166040830152506060015292915050565b6000602080838503121562003daa57600080fd5b82516001600160401b038082111562003dc257600080fd5b818501915085601f83011262003dd757600080fd5b81518181111562003dec5762003dec62003ca5565b8060051b604051601f19603f8301168101818110858211171562003e145762003e1462003ca5565b60405291825284820192508381018501918883111562003e3357600080fd5b938501935b8285101562003e535784518452938501939285019262003e38565b9897505050505050505056fe60c06040523480156200001157600080fd5b5060405162001ec338038062001ec3833981016040819052620000349162000137565b60408051808201825260188082527f506978696141495f4469766964656e645f547261636b6572000000000000000060208084018290528451808601909552918452908301529082828260036200008c83826200020e565b5060046200009b82826200020e565b505050620000b8620000b2620000e160201b60201c565b620000e5565b6001600160a01b03166080525050610e106011555069043c33c193756480000060a052620002da565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000602082840312156200014a57600080fd5b81516001600160a01b03811681146200016257600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200019457607f821691505b602082108103620001b557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200020957600081815260208120601f850160051c81016020861015620001e45750805b601f850160051c820191505b818110156200020557828155600101620001f0565b5050505b505050565b81516001600160401b038111156200022a576200022a62000169565b62000242816200023b84546200017f565b84620001bb565b602080601f8311600181146200027a5760008415620002615750858301515b600019600386901b1c1916600185901b17855562000205565b600085815260208120601f198616915b82811015620002ab578886015182559484019460019091019084016200028a565b5085821015620002ca5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051611bb56200030e600039600081816104310152610b400152600081816103f701526113580152611bb56000f3fe608060405234801561001057600080fd5b50600436106101ac5760003560e01c806306fdde03146101b1578063095ea7b3146101cf57806309bbedde146101f257806318160ddd14610204578063226cfa3d1461020c57806323b872dd1461022c57806327ce01471461023f5780633009a60914610252578063313ce5671461025b57806331e79db01461026a578063395093511461027f5780634e7b827f146102925780635183d6fd146102b55780636a4740021461030d5780636f2789ec1461031557806370a082311461031e578063715018a61461033157806385a6b3ae146103395780638da5cb5b1461034257806391b89fba1461036257806395d89b4114610375578063a457c2d71461037d578063a5244b3414610390578063a8b9d240146103a3578063a9059cbb146103b6578063aafd847a146103c9578063ae9ca1c4146103f2578063bc4c4b3714610419578063be10b6141461042c578063dd62ed3e14610453578063e30443bc1461048c578063e7841ec01461049f578063e98030c7146104a7578063f2fde38b146104ba578063fbcbc0f1146104cd578063ffb2c479146104e0575b600080fd5b6101b961050e565b6040516101c69190611856565b60405180910390f35b6101e26101dd3660046118b9565b6105a0565b60405190151581526020016101c6565b600a545b6040519081526020016101c6565b6002546101f6565b6101f661021a3660046118e5565b60106020526000908152604090205481565b6101e261023a366004611902565b6105b7565b6101f661024d3660046118e5565b610663565b6101f6600e5481565b604051601281526020016101c6565b61027d6102783660046118e5565b6106bc565b005b6101e261028d3660046118b9565b610781565b6101e26102a03660046118e5565b600f6020526000908152604090205460ff1681565b6102c86102c3366004611943565b6107bd565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101c6565b61027d600080fd5b6101f660115481565b6101f661032c3660046118e5565b61082e565b61027d610849565b6101f660095481565b61034a610882565b6040516001600160a01b0390911681526020016101c6565b6101f66103703660046118e5565b610891565b6101b961089c565b6101e261038b3660046118b9565b6108ab565b61027d61039e366004611943565b610944565b6101f66103b13660046118e5565b610a07565b6101e26103c43660046118b9565b610a33565b6101f66103d73660046118e5565b6001600160a01b031660009081526008602052604090205490565b61034a7f000000000000000000000000000000000000000000000000000000000000000081565b6101e261042736600461196a565b610a3d565b6101f67f000000000000000000000000000000000000000000000000000000000000000081565b6101f66104613660046119a3565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61027d61049a3660046118b9565b610aef565b600e546101f6565b61027d6104b5366004611943565b610ba7565b61027d6104c83660046118e5565b610c35565b6102c86104db3660046118e5565b610cd2565b6104f36104ee366004611943565b610dbb565b604080519384526020840192909252908201526060016101c6565b60606003805461051d906119d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610549906119d1565b80156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b5050505050905090565b60006105ad338484610ed8565b5060015b92915050565b60006105c1600080fd5b6001600160a01b03841660009081526001602090815260408083203384529091529020548281101561064b5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6106588533858403610ed8565b506001949350505050565b6001600160a01b038116600090815260076020526040812054600160801b906106b2906106ad906106a76106a26106998861082e565b60065490610ffc565b61100f565b9061101f565b61105d565b6105b19190611a21565b336106c5610882565b6001600160a01b0316146106eb5760405162461bcd60e51b815260040161064290611a43565b6001600160a01b0381166000908152600f602052604090205460ff161561071157600080fd5b6001600160a01b0381166000908152600f60205260408120805460ff1916600117905561073f908290611070565b61074a600a826110c9565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916105ad9185906107b8908690611a78565b610ed8565b6000806000806000806000806107d2600a5490565b89106107f7575060009650600019955085945086935083925082915081905080610821565b6000610804600a8b611204565b905061080f81610cd2565b98509850985098509850985098509850505b919395975091939597565b565b6001600160a01b031660009081526020819052604090205490565b33610852610882565b6001600160a01b0316146108785760405162461bcd60e51b815260040161064290611a43565b61082c6000611237565b6005546001600160a01b031690565b60006105b182610a07565b60606004805461051d906119d1565b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101561092d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610642565b61093a3385858403610ed8565b5060019392505050565b3361094d610882565b6001600160a01b0316146109735760405162461bcd60e51b815260040161064290611a43565b600061097e60025490565b1161098857600080fd5b8015610a04576109bb61099a60025490565b6109a883600160801b610ffc565b6109b29190611a21565b60065490611289565b60065560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600954610a009082611289565b6009555b50565b6001600160a01b0381166000908152600860205260408120546105b190610a2d84610663565b90611295565b60006105ad600080fd5b600033610a48610882565b6001600160a01b031614610a6e5760405162461bcd60e51b815260040161064290611a43565b6000610a79846112a1565b90508015610ae5576001600160a01b038416600081815260106020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610ad39085815260200190565b60405180910390a360019150506105b1565b5060009392505050565b33610af8610882565b6001600160a01b031614610b1e5760405162461bcd60e51b815260040161064290611a43565b6001600160a01b0382166000908152600f602052604090205460ff16610ba3577f00000000000000000000000000000000000000000000000000000000000000008110610b8057610b6f8282611070565b610b7b600a8383611426565b610b96565b610b8b826000611070565b610b96600a836110c9565b610ba1826001610a3d565b505b5050565b33610bb0610882565b6001600160a01b031614610bd65760405162461bcd60e51b815260040161064290611a43565b610e108110158015610beb5750620151808111155b610bf457600080fd5b6011548103610c0257600080fd5b60115460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601155565b33610c3e610882565b6001600160a01b031614610c645760405162461bcd60e51b815260040161064290611a43565b6001600160a01b038116610cc95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610642565b610a0481611237565b806000808080808080610ce6600a896114cf565b9650600019955060008712610d4857600e54871115610d1457600e54610d0d90889061151a565b9550610d48565b600e54600a5460009110610d29576000610d38565b600e54600a54610d3891611295565b9050610d44888261101f565b9650505b610d5188610a07565b9450610d5c88610663565b6001600160a01b038916600090815260106020526040902054909450925082610d86576000610d94565b601154610d94908490611289565b9150428211610da4576000610dae565b610dae8242611295565b9050919395975091939597565b600a5460009081908190808203610ddd575050600e5460009250829150610ed1565b600e546000805a90506000805b8984108015610df857508582105b15610ec05784610e0781611a8b565b600a5490965086109050610e1a57600094505b6000600a6000018681548110610e3257610e32611aa4565b60009182526020808320909101546001600160a01b03168083526010909152604090912054909150610e6390611557565b15610e8657610e73816001610a3d565b15610e865781610e8281611a8b565b9250505b82610e9081611a8b565b93505060005a905080851115610eb757610eb4610ead8683611295565b8790611289565b95505b9350610dea9050565b600e85905590975095509193505050505b9193909250565b6001600160a01b038316610f3a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610642565b6001600160a01b038216610f9b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610642565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006110088284611aba565b9392505050565b600081818112156105b157600080fd5b60008061102c8385611ad1565b90506000831215801561103f5750838112155b80611054575060008312801561105457508381125b61100857600080fd5b60008082121561106c57600080fd5b5090565b600061107b8361082e565b9050808211156110a35760006110918383611295565b905061109d848261157e565b50610ba1565b80821015610ba15760006110b78284611295565b90506110c384826115e2565b50505050565b6001600160a01b038116600090815260038301602052604090205460ff166110ef575050565b6001600160a01b03811660009081526003830160209081526040808320805460ff191690556001808601835281842084905560028601909252822054845490929161113991611af9565b9050600084600001828154811061115257611152611aa4565b60009182526020808320909101546001600160a01b039081168084526002890190925260408084208790559087168352822091909155855490915081908690859081106111a1576111a1611aa4565b600091825260209091200180546001600160a01b0319166001600160a01b039290921691909117905584548590806111db576111db611b0c565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b600082600001828154811061121b5761121b611aa4565b6000918252602090912001546001600160a01b03169392505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006110088284611a78565b60006110088284611af9565b6000806112ad83610a07565b9050801561141d576001600160a01b0383166000908152600860205260409020546112d89082611289565b6001600160a01b038416600081815260086020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906113279084815260200190565b60405180910390a260405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390526000917f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af11580156113a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c79190611b22565b905080611416576001600160a01b0384166000908152600860205260409020546113f19083611295565b6001600160a01b03909416600090815260086020526040812094909455509192915050565b5092915050565b50600092915050565b6001600160a01b038216600090815260038401602052604090205460ff161561146b576001600160a01b03821660009081526001840160205260409020819055610ba1565b6001600160a01b03821660008181526003850160209081526040808320805460ff19166001908117909155878101835281842086905587546002890184529184208290558101875586835291200180546001600160a01b0319169091179055505050565b6001600160a01b038116600090815260038301602052604081205460ff166114fa57506000196105b1565b506001600160a01b03166000908152600291909101602052604090205490565b6000806115278385611b3f565b90506000831215801561153a5750838113155b806110545750600083128015611054575083811361100857600080fd5b60004282111561156957506000919050565b6011546115764284611295565b101592915050565b6115888282611626565b6115c26115a36106a283600654610ffc90919063ffffffff16565b6001600160a01b0384166000908152600760205260409020549061151a565b6001600160a01b0390921660009081526007602052604090209190915550565b6115ec8282611707565b6115c26116076106a283600654610ffc90919063ffffffff16565b6001600160a01b0384166000908152600760205260409020549061101f565b6001600160a01b03821661167c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610642565b61168860008383610ba1565b806002600082825461169a9190611a78565b90915550506001600160a01b038216600090815260208190526040812080548392906116c7908490611a78565b90915550506040518181526001600160a01b03831690600090600080516020611b608339815191529060200160405180910390a3610ba360008383610ba1565b6001600160a01b0382166117675760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610642565b61177382600083610ba1565b6001600160a01b038216600090815260208190526040902054818110156117e75760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610642565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611816908490611af9565b90915550506040518281526000906001600160a01b03851690600080516020611b608339815191529060200160405180910390a3610ba183600084610ba1565b600060208083528351808285015260005b8181101561188357858101830151858201604001528201611867565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610a0457600080fd5b600080604083850312156118cc57600080fd5b82356118d7816118a4565b946020939093013593505050565b6000602082840312156118f757600080fd5b8135611008816118a4565b60008060006060848603121561191757600080fd5b8335611922816118a4565b92506020840135611932816118a4565b929592945050506040919091013590565b60006020828403121561195557600080fd5b5035919050565b8015158114610a0457600080fd5b6000806040838503121561197d57600080fd5b8235611988816118a4565b915060208301356119988161195c565b809150509250929050565b600080604083850312156119b657600080fd5b82356119c1816118a4565b91506020830135611998816118a4565b600181811c908216806119e557607f821691505b602082108103611a0557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082611a3e57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b808201808211156105b1576105b1611a0b565b600060018201611a9d57611a9d611a0b565b5060010190565b634e487b7160e01b600052603260045260246000fd5b80820281158282048414176105b1576105b1611a0b565b8082018281126000831280158216821582161715611af157611af1611a0b565b505092915050565b818103818111156105b1576105b1611a0b565b634e487b7160e01b600052603160045260246000fd5b600060208284031215611b3457600080fd5b81516110088161195c565b818103600083128015838313168383128216171561141657611416611a0b56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212201391377b7fa6aed5f91ac601f33f34e7e9534dd2f9876664edf3b5b10f4fca4764736f6c63430008110033a2646970667358221220b42ba2d3d68229bd47c29f76da815e2e4c47a1fde4fdc1eb54bc254ff0c5511664736f6c63430008110033

Deployed Bytecode Sourcemap

30000:23556:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36332:133;;;;;;;;;;;;;:::i;:::-;;38716:753;;;;;;;;;;-1:-1:-1;38716:753:0;;;;;:::i;:::-;;:::i;31555:88::-;;;;;;;;;;;;31600:42;31555:88;;;;;;;;;:::i;:::-;;;;;;;;31339:82;;;;;;;;;;-1:-1:-1;31339:82:0;;;;-1:-1:-1;;;;;31339:82:0;;;16641:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32052:52::-;;;;;;;;;;-1:-1:-1;32052:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2117:14:1;;2110:22;2092:41;;2080:2;2065:18;32052:52:0;1952:187:1;18118:169:0;;;;;;;;;;-1:-1:-1;18118:169:0;;;;;:::i;:::-;;:::i;30543:41::-;;;;;;;;;;-1:-1:-1;30543:41:0;;;;-1:-1:-1;;;;;30543:41:0;;;17194:108;;;;;;;;;;-1:-1:-1;17282:12:0;;17194:108;;;2844:25:1;;;2832:2;2817:18;17194:108:0;2698:177:1;18423:492:0;;;;;;;;;;-1:-1:-1;18423:492:0;;;;;:::i;:::-;;:::i;46694:132::-;;;;;;;;;;-1:-1:-1;46694:132:0;;;;;:::i;:::-;;:::i;30512:22::-;;;;;;;;;;-1:-1:-1;30512:22:0;;;;;;;;;;;;;;;-1:-1:-1;;;30512:22:0;;;;;-1:-1:-1;;;30512:22:0;;;;;-1:-1:-1;;;30512:22:0;;;;;-1:-1:-1;;;30512:22:0;;;;;-1:-1:-1;;;30512:22:0;;;;;;;;;;4162:6:1;4195:15;;;4177:34;;4247:15;;;4242:2;4227:18;;4220:43;4299:15;;;4279:18;;;4272:43;;;;4351:15;;;4346:2;4331:18;;4324:43;4404:15;;4398:3;4383:19;;4376:44;4457:15;;4451:3;4436:19;;4429:44;4510:15;;;4504:3;4489:19;;4482:44;4139:3;4124:19;30512:22:0;3851:681:1;30788:43:0;;;;;;;;;;-1:-1:-1;30788:43:0;;;;-1:-1:-1;;;;;30788:43:0;;;30656:22;;;;;;;;;;-1:-1:-1;30656:22:0;;;;-1:-1:-1;;;30656:22:0;;;;;;17008:93;;;;;;;;;;-1:-1:-1;17008:93:0;;17091:2;4916:36:1;;4904:2;4889:18;17008:93:0;4774:184:1;41701:130:0;;;;;;;;;;-1:-1:-1;41701:130:0;;;;;:::i;:::-;;:::i;35606:619::-;;;;;;;;;;-1:-1:-1;35606:619:0;;;;;:::i;:::-;;:::i;19000:215::-;;;;;;;;;;-1:-1:-1;19000:215:0;;;;;:::i;:::-;;:::i;31446:84::-;;;;;;;;;;-1:-1:-1;31446:84:0;;;;-1:-1:-1;;;;;31446:84:0;;;30485:20;;;;;;;;;;-1:-1:-1;30485:20:0;;;;;;;;;;;;;;;-1:-1:-1;;;30485:20:0;;;;;-1:-1:-1;;;30485:20:0;;;;;-1:-1:-1;;;30485:20:0;;;;;-1:-1:-1;;;30485:20:0;;;;;-1:-1:-1;;;30485:20:0;;;;;;30591:28;;;;;;;;;;-1:-1:-1;30591:28:0;;;;-1:-1:-1;;;;;30591:28:0;;;42123:103;;;;;;;;;;;;;:::i;41453:126::-;;;;;;;;;;-1:-1:-1;41453:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;41543:28:0;41519:4;41543:28;;;:19;:28;;;;;;;;;41453:126;37897:737;;;;;;;;;;-1:-1:-1;37897:737:0;;;;;:::i;:::-;;:::i;36925:112::-;;;;;;;;;;;;;:::i;46394:151::-;;;;;;;;;;-1:-1:-1;46394:151:0;;;;;:::i;:::-;;:::i;52172:327::-;;;;;;;;;;-1:-1:-1;52172:327:0;;;;;:::i;:::-;;:::i;17387:127::-;;;;;;;;;;-1:-1:-1;17387:127:0;;;;;:::i;:::-;;:::i;14726:94::-;;;;;;;;;;;;;:::i;46974:140::-;;;;;;;;;;-1:-1:-1;46974:140:0;;;;;:::i;:::-;;:::i;30754:25::-;;;;;;;;;;;;;;;;52717:117;;;;;;;;;;-1:-1:-1;52717:117:0;;;;;:::i;:::-;;:::i;37569:248::-;;;;;;;;;;-1:-1:-1;37569:248:0;;;;;:::i;:::-;;:::i;40766:336::-;;;;;;;;;;-1:-1:-1;40766:336:0;;;;;:::i;:::-;;:::i;31753:26::-;;;;;;;;;;;;;;;;14503:87;;;;;;;;;;;;;:::i;31125:77::-;;;;;;;;;;-1:-1:-1;31125:77:0;;;;-1:-1:-1;;;;;31125:77:0;;;41947:114;;;;;;;;;;-1:-1:-1;41947:114:0;;;;;:::i;:::-;;:::i;16810:104::-;;;;;;;;;;;;;:::i;39582:230::-;;;;;;;;;;-1:-1:-1;39582:230:0;;;;;:::i;:::-;;:::i;31891:40::-;;;;;;;;;;;;;;;;19299:413;;;;;;;;;;-1:-1:-1;19299:413:0;;;;;:::i;:::-;;:::i;17585:175::-;;;;;;;;;;-1:-1:-1;17585:175:0;;;;;:::i;:::-;;:::i;30970:81::-;;;;;;;;;;-1:-1:-1;30970:81:0;;;;-1:-1:-1;;;;;30970:81:0;;;40537:119;;;;;;;;;;-1:-1:-1;40537:119:0;;;;;:::i;:::-;;:::i;32330:57::-;;;;;;;;;;-1:-1:-1;32330:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;46079:147;;;;;;;;;;-1:-1:-1;46079:147:0;;;;;:::i;:::-;;:::i;37153:299::-;;;;;;;;;;-1:-1:-1;37153:299:0;;;;;:::i;:::-;;:::i;32111:56::-;;;;;;;;;;-1:-1:-1;32111:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42303:198;;;;;;;;;;-1:-1:-1;42303:198:0;;;;;:::i;:::-;;:::i;31224:86::-;;;;;;;;;;-1:-1:-1;31224:86:0;;;;-1:-1:-1;;;;;31224:86:0;;;17873:151;;;;;;;;;;-1:-1:-1;17873:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;17989:18:0;;;17962:7;17989:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;17873:151;31667:50;;;;;;;;;;;;;;;;41210:124;;;;;;;;;;-1:-1:-1;41210:124:0;;;;;:::i;:::-;;:::i;14828:192::-;;;;;;;;;;-1:-1:-1;14828:192:0;;;;;:::i;:::-;;:::i;30840:87::-;;;;;;;;;;-1:-1:-1;30840:87:0;;;;-1:-1:-1;;;;;30840:87:0;;;31786:24;;;;;;;;;;;;;;;;36585:226;;;;;;;;;;-1:-1:-1;36585:226:0;;;;;:::i;:::-;;:::i;36332:133::-;14136:10;14638:7;:5;:7::i;:::-;-1:-1:-1;;;;;14638:23:0;;14630:68;;;;-1:-1:-1;;;14630:68:0;;;;;;;:::i;:::-;;;;;;;;;36389:10:::1;::::0;:15;36380:49:::1;;;::::0;-1:-1:-1;;;36380:49:0;;7930:2:1;36380:49:0::1;::::0;::::1;7912:21:1::0;7969:2;7949:18;;;7942:30;-1:-1:-1;;;7988:18:1;;;7981:50;8048:18;;36380:49:0::1;7728:344:1::0;36380:49:0::1;36440:10;:17:::0;;-1:-1:-1;;;;36440:17:0::1;-1:-1:-1::0;;;36440:17:0::1;::::0;;36332:133::o;38716:753::-;14136:10;14638:7;:5;:7::i;:::-;-1:-1:-1;;;;;14638:23:0;;14630:68;;;;-1:-1:-1;;;14630:68:0;;;;;;;:::i;:::-;38971:8:::1;38953:7;:15;;;:26;;;;;;;;;;;;;;;;;;39004:4;38990:7;:11;;;:18;;;;;;;;;;;;;;;;;;39036:7;39019;:14;;;:24;;;;;;;;;;;;;;;;;;39069:5;39054:7;:12;;;:20;;;;;;;;;;;;;;;;;;39104:9;39085:7;:16;;;:28;;;;;;;;;;;;;;;;;;39142:8;39124:7;:15;;;:26;;;;;;;;;;;;;;;;;;39183:12;39161:7;:19;;;:34;;;;;;;;;;;;;;;;;;39334:6;:18;;;;;;;;;;;;39316:7;:15;;;;;;;;;;;;39287:7;:16;;;;;;;;;;;;39272:7;:12;;;;;;;;;;;;39255:7;:14;;;;;;;;;;;;39241:7;:11;;;;;;;;;;;;39223:7;:15;;;;;;;;;;;;:29;;;;:::i;:::-;:46;;;;:::i;:::-;:61;;;;:::i;:::-;:80;;;;:::i;:::-;:108;;;;:::i;:::-;:129;;;;:::i;:::-;39208:12;:144:::0;;-1:-1:-1;;;;39208:144:0::1;-1:-1:-1::0;;;39208:144:0::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;39456:4:::1;39441:12:::0;::::1;::::0;;::::1;:19;;39432:29;;;::::0;::::1;;38716:753:::0;;;;;;;:::o;16641:100::-;16695:13;16728:5;16721:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16641:100;:::o;18118:169::-;18201:4;18218:39;14136:10;18241:7;18250:6;18218:8;:39::i;:::-;-1:-1:-1;18275:4:0;18118:169;;;;;:::o;18423:492::-;18563:4;18580:36;18590:6;18598:9;18609:6;18580:9;:36::i;:::-;-1:-1:-1;;;;;18656:19:0;;18629:24;18656:19;;;:11;:19;;;;;;;;14136:10;18656:33;;;;;;;;18708:26;;;;18700:79;;;;-1:-1:-1;;;18700:79:0;;8969:2:1;18700:79:0;;;8951:21:1;9008:2;8988:18;;;8981:30;9047:34;9027:18;;;9020:62;-1:-1:-1;;;9098:18:1;;;9091:38;9146:19;;18700:79:0;8767:404:1;18700:79:0;18815:57;18824:6;14136:10;18865:6;18846:16;:25;18815:8;:57::i;:::-;-1:-1:-1;18903:4:0;;18423:492;-1:-1:-1;;;;18423:492:0:o;46694:132::-;14136:10;14638:7;:5;:7::i;:::-;-1:-1:-1;;;;;14638:23:0;;14630:68;;;;-1:-1:-1;;;14630:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46783:27:0;;;::::1;;::::0;;;:20:::1;:27;::::0;;;;:35;;-1:-1:-1;;46783:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46694:132::o;41701:130::-;14136:10;14638:7;:5;:7::i;:::-;-1:-1:-1;;;;;14638:23:0;;14630:68;;;;-1:-1:-1;;;14630:68:0;;;;;;;:::i;:::-;41778:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;41778:45:0;;-1:-1:-1;;;;;41778:15:0;;::::1;::::0;:36:::1;::::0;:45:::1;::::0;41815:7;;41778:45:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;41701:130:::0;:::o;35606:619::-;14136:10;14638:7;:5;:7::i;:::-;-1:-1:-1;;;;;14638:23:0;;14630:68;;;;-1:-1:-1;;;14630:68:0;;;;;;;:::i;:::-;35680:39:::1;35761:8;35722:58;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;35793:68:0::1;::::0;-1:-1:-1;;;35793:68:0;;35680:100;;-1:-1:-1;;;;;;35793:39:0;::::1;::::0;::::1;::::0;:68:::1;::::0;35680:100;;35793:68:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;35872:54:0::1;::::0;-1:-1:-1;;;35872:54:0;;-1:-1:-1;;;;;35872:39:0;::::1;::::0;-1:-1:-1;35872:39:0::1;::::0;-1:-1:-1;35872:54:0::1;::::0;35920:4:::1;::::0;35872:54:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;35937:18;-1:-1:-1::0;;;;;35937:39:0::1;;35977:7;:5;:7::i;:::-;35937:48;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;36044:15:0::1;::::0;35996:65:::1;::::0;-1:-1:-1;;;35996:65:0;;-1:-1:-1;;;;;35996:39:0;;::::1;::::0;-1:-1:-1;35996:39:0::1;::::0;-1:-1:-1;35996:65:0::1;::::0;36044:15:::1;::::0;35996:65:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;36074:12:0::1;:23:::0;;-1:-1:-1;;;;;36074:23:0;;::::1;-1:-1:-1::0;;;;;;36074:23:0;;::::1;::::0;::::1;::::0;;;36108:15:::1;:36:::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;36160:57:::1;::::0;36108:36;;-1:-1:-1;36074:23:0;;-1:-1:-1;36160:57:0::1;::::0;36074:12:::1;::::0;36160:57:::1;35669:556;35606:619:::0;:::o;19000:215::-;14136:10;19088:4;19137:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;19137:34:0;;;;;;;;;;19088:4;;19105:80;;19128:7;;19137:47;;19174:10;;19137:47;:::i;:::-;19105:8;:80::i;42123:103::-;42160:15;;:58;;-1:-1:-1;;;42160:58:0;;-1:-1:-1;;;;;42160:15:0;;;;:30;;:58;;42199:10;;42160:15;;:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42123:103::o;37897:737::-;14136:10;14638:7;:5;:7::i;:::-;-1:-1:-1;;;;;14638:23:0;;14630:68;;;;-1:-1:-1;;;14630:68:0;;;;;;;:::i;:::-;38150:8:::1;38133:6;:14;;;:25;;;;;;;;;;;;;;;;;;38182:4;38169:6;:10;;;:17;;;;;;;;;;;;;;;;;;38213:7;38197:6;:13;;;:23;;;;;;;;;;;;;;;;;;38245:5;38231:6;:11;;;:19;;;;;;;;;;;;;;;;;;38279:9;38261:6;:15;;;:27;;;;;;;;;;;;;;;;;;38316:8;38299:6;:14;;;:25;;;;;;;;;;;;;;;;;;38356:12;38335:6;:18;;;:33;;;;;;;;;;;;;;;;;;38500:6;:18;;;;;;;;;;;;38483:6;:14;;;;;;;;;;;;38455:6;:15;;;;;;;;;;;;38441:6;:11;;;;;;;;;;;;38425:6;:13;;;;;;;;;;;;38412:6;:10;;;;;;;;;;;;38395:6;:14;;;;;;;;;;;;:27;;;;:::i;:::-;:43;;;;:::i;:::-;:57;;;;:::i;:::-;:75;;;;:::i;:::-;:102;;;;:::i;:::-;:123;;;;:::i;:::-;38381:11;:137:::0;;-1:-1:-1;;;;38381:137:0::1;-1:-1:-1::0;;;38381:137:0::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;38621:4:::1;38607:11:::0;::::1;::::0;;::::1;:18;;38598:28;;;::::0;::::1;36925:112:::0;14136:10;14638:7;:5;:7::i;:::-;-1:-1:-1;;;;;14638:23:0;;14630:68;;;;-1:-1:-1;;;14630:68:0;;;;;;;:::i;:::-;36978:51:::1;::::0;36986:10:::1;::::0;37007:21:::1;36978:51:::0;::::1;;;::::0;::::1;::::0;;;37007:21;36986:10;36978:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;46394:151:::0;14136:10;14638:7;:5;:7::i;:::-;-1:-1:-1;;;;;14638:23:0;;14630:68;;;;-1:-1:-1;;;14630:68:0;;;;;;;:::i;:::-;46483:22:::1;46501:3;46483:13;17282:12:::0;;;17194:108;46483:13:::1;:17:::0;::::1;:22::i;:::-;46472:6;:34;;46463:44;;;::::0;::::1;;46518:9;:18:::0;46394:151::o;52172:327::-;14136:10;14638:7;:5;:7::i;:::-;-1:-1:-1;;;;;14638:23:0;;14630:68;;;;-1:-1:-1;;;14630:68:0;;;;;;;:::i;:::-;52299:34;;::::1;52277:57;;;::::0;::::1;;52376:9;52372:120;52390:20:::0;;::::1;52372:120;;;52427:54;52437:10;52449:9;;52459:1;52449:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;52463:7;;52471:1;52463:10;;;;;;;:::i;:::-;;;;;;;52476:4;52463:17;;;;:::i;:::-;52427:9;:54::i;:::-;52412:3:::0;::::1;::::0;::::1;:::i;:::-;;;;52372:120;;17387:127:::0;-1:-1:-1;;;;;17488:18:0;17461:7;17488:18;;;;;;;;;;;;17387:127::o;14726:94::-;14136:10;14638:7;:5;:7::i;:::-;-1:-1:-1;;;;;14638:23:0;;14630:68;;;;-1:-1:-1;;;14630:68:0;;;;;;;:::i;:::-;14791:21:::1;14809:1;14791:9;:21::i;:::-;14726:94::o:0;46974:140::-;14136:10;14638:7;:5;:7::i;:::-;-1:-1:-1;;;;;14638:23:0;;14630:68;;;;-1:-1:-1;;;14630:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47067:31:0;;;::::1;;::::0;;;:24:::1;:31;::::0;;;;:39;;-1:-1:-1;;47067:39:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46974:140::o;52717:117::-;14136:10;14638:7;:5;:7::i;:::-;-1:-1:-1;;;;;14638:23:0;;14630:68;;;;-1:-1:-1;;;14630:68:0;;;;;;;:::i;:::-;52791:13:::1;::::0;52781:45:::1;::::0;-1:-1:-1;;;;;52791:13:0::1;31600:42;52818:7:::0;52781:9:::1;:45::i;37569:248::-:0;14136:10;14638:7;:5;:7::i;:::-;-1:-1:-1;;;;;14638:23:0;;14630:68;;;;-1:-1:-1;;;14630:68:0;;;;;;;:::i;:::-;37686:9:::1;:16:::0;;-1:-1:-1;;;;;37686:16:0;;::::1;-1:-1:-1::0;;;;;;37686:16:0;;::::1;;::::0;;;37713:17:::1;:24:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;37748:14:::1;:26:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;37785:13:::1;:24:::0;;;;;::::1;::::0;::::1;;::::0;;37569:248::o;40766:336::-;14136:10;14638:7;:5;:7::i;:::-;-1:-1:-1;;;;;14638:23:0;;14630:68;;;;-1:-1:-1;;;14630:68:0;;;;;;;:::i;:::-;40878:6:::1;40866:8;:18;;:40;;;;;40900:6;40888:8;:18;;40866:40;40844:73;;;::::0;::::1;;40962:16;;40950:8;:28:::0;40928:61:::1;;;::::0;::::1;;41039:16;::::0;41005:51:::1;::::0;41029:8;;41005:51:::1;::::0;;;::::1;41067:16;:27:::0;40766:336::o;14503:87::-;14576:6;;-1:-1:-1;;;;;14576:6:0;;14503:87::o;41947:114::-;14136:10;14638:7;:5;:7::i;:::-;-1:-1:-1;;;;;14638:23:0;;14630:68;;;;-1:-1:-1;;;14630:68:0;;;;;;;:::i;:::-;42025:17:::1;:28:::0;;-1:-1:-1;;;;;;42025:28:0::1;-1:-1:-1::0;;;;;42025:28:0;;;::::1;::::0;;;::::1;::::0;;41947:114::o;16810:104::-;16866:13;16899:7;16892:14;;;;;:::i;39582:230::-;14136:10;14638:7;:5;:7::i;:::-;-1:-1:-1;;;;;14638:23:0;;14630:68;;;;-1:-1:-1;;;14630:68:0;;;;;;;:::i;:::-;39726:13:::1;::::0;-1:-1:-1;;;;;39726:13:0;;::::1;39718:21:::0;;::::1;::::0;39696:54:::1;;;::::0;::::1;;39763:41;39792:4;39798:5;39763:28;:41::i;:::-;39582:230:::0;;:::o;19299:413::-;14136:10;19392:4;19436:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;19436:34:0;;;;;;;;;;19489:35;;;;19481:85;;;;-1:-1:-1;;;19481:85:0;;10508:2:1;19481:85:0;;;10490:21:1;10547:2;10527:18;;;10520:30;10586:34;10566:18;;;10559:62;-1:-1:-1;;;10637:18:1;;;10630:35;10682:19;;19481:85:0;10306:401:1;19481:85:0;19602:67;14136:10;19625:7;19653:15;19634:16;:34;19602:8;:67::i;:::-;-1:-1:-1;19700:4:0;;19299:413;-1:-1:-1;;;19299:413:0:o;17585:175::-;17671:4;17688:42;14136:10;17712:9;17723:6;17688:9;:42::i;40537:119::-;14136:10;14638:7;:5;:7::i;:::-;-1:-1:-1;;;;;14638:23:0;;14630:68;;;;-1:-1:-1;;;14630:68:0;;;;;;;:::i;:::-;40635:13:::1;:6:::0;40644:4:::1;40635:13;:::i;:::-;40614:18;:34:::0;-1:-1:-1;40537:119:0:o;46079:147::-;14136:10;14638:7;:5;:7::i;:::-;-1:-1:-1;;;;;14638:23:0;;14630:68;;;;-1:-1:-1;;;14630:68:0;;;;;;;:::i;:::-;46163:22:::1;46181:3;46163:13;17282:12:::0;;;17194:108;46163:22:::1;46152:6;:34;;46144:43;;;::::0;::::1;;46198:11;:20:::0;46079:147::o;37153:299::-;14136:10;14638:7;:5;:7::i;:::-;-1:-1:-1;;;;;14638:23:0;;14630:68;;;;-1:-1:-1;;;14630:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37260:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;:40;::::1;;:28;::::0;;::::1;:40;;::::0;37238:63:::1;;;::::0;::::1;;-1:-1:-1::0;;;;;37353:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;37353:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;37410:34;;2092:41:1;;;37410:34:0::1;::::0;2065:18:1;37410:34:0::1;;;;;;;37153:299:::0;;:::o;42303:198::-;42440:53;;-1:-1:-1;;;42440:53:0;;42421:7;;-1:-1:-1;;;;;42440:25:0;;;;;:53;;42474:10;;42366:31;;42440:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42355:146;42303:198;:::o;41210:124::-;14136:10;14638:7;:5;:7::i;:::-;-1:-1:-1;;;;;14638:23:0;;14630:68;;;;-1:-1:-1;;;14630:68:0;;;;;;;:::i;:::-;41284:15:::1;::::0;:42:::1;::::0;-1:-1:-1;;;41284:42:0;;::::1;::::0;::::1;2844:25:1::0;;;-1:-1:-1;;;;;41284:15:0;;::::1;::::0;:31:::1;::::0;2817:18:1;;41284:42:0::1;2698:177:1::0;14828:192:0;14136:10;14638:7;:5;:7::i;:::-;-1:-1:-1;;;;;14638:23:0;;14630:68;;;;-1:-1:-1;;;14630:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14917:22:0;::::1;14909:73;;;::::0;-1:-1:-1;;;14909:73:0;;10914:2:1;14909:73:0::1;::::0;::::1;10896:21:1::0;10953:2;10933:18;;;10926:30;10992:34;10972:18;;;10965:62;-1:-1:-1;;;11043:18:1;;;11036:36;11089:19;;14909:73:0::1;10712:402:1::0;14909:73:0::1;14993:19;15003:8;14993:9;:19::i;36585:226::-:0;14136:10;14638:7;:5;:7::i;:::-;-1:-1:-1;;;;;14638:23:0;;14630:68;;;;-1:-1:-1;;;14630:68:0;;;;;;;:::i;:::-;36720:35:::1;::::0;-1:-1:-1;;;36720:35:0;;36684:6;;36657:17:::1;::::0;-1:-1:-1;;;;;36720:20:0;::::1;::::0;::::1;::::0;:35:::1;::::0;36749:4:::1;::::0;36720:35:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36702:53;;36766:10;-1:-1:-1::0;;;;;36766:19:0::1;;36786:7;:5;:7::i;:::-;36795;36766:37;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36646:165;;36585:226:::0;:::o;12956:98::-;13014:7;13041:5;13045:1;13041;:5;:::i;:::-;13034:12;12956:98;-1:-1:-1;;;12956:98:0:o;13066:::-;13124:7;13151:5;13155:1;13151;:5;:::i;21696:380::-;-1:-1:-1;;;;;21832:19:0;;21824:68;;;;-1:-1:-1;;;21824:68:0;;12046:2:1;21824:68:0;;;12028:21:1;12085:2;12065:18;;;12058:30;12124:34;12104:18;;;12097:62;-1:-1:-1;;;12175:18:1;;;12168:34;12219:19;;21824:68:0;11844:400:1;21824:68:0;-1:-1:-1;;;;;21911:21:0;;21903:68;;;;-1:-1:-1;;;21903:68:0;;12451:2:1;21903:68:0;;;12433:21:1;12490:2;12470:18;;;12463:30;12529:34;12509:18;;;12502:62;-1:-1:-1;;;12580:18:1;;;12573:32;12622:19;;21903:68:0;12249:398:1;21903:68:0;-1:-1:-1;;;;;21984:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;22036:32;;2844:25:1;;;22036:32:0;;2817:18:1;22036:32:0;;;;;;;21696:380;;;:::o;42612:3296::-;-1:-1:-1;;;;;42744:18:0;;42736:68;;;;-1:-1:-1;;;42736:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42823:16:0;;42815:64;;;;-1:-1:-1;;;42815:64:0;;;;;;;:::i;:::-;42894:6;42904:1;42894:11;42890:93;;42922:28;42938:4;42944:2;42948:1;42922:15;:28::i;42890:93::-;-1:-1:-1;;;;;43000:25:0;;;;;;:19;:25;;;;;;;;42995:107;;43050:10;;-1:-1:-1;;;43050:10:0;;;;43041:49;;;;-1:-1:-1;;;43041:49:0;;13664:2:1;43041:49:0;;;13646:21:1;13703:2;13683:18;;;13676:30;-1:-1:-1;;;13722:18:1;;;13715:55;13787:18;;43041:49:0;13462:349:1;43041:49:0;43114:28;43145:24;43163:4;43145:9;:24::i;:::-;43221:18;;43114:55;;-1:-1:-1;43197:42:0;;;;;;;43270:33;;-1:-1:-1;43295:8:0;;-1:-1:-1;;;43295:8:0;;;;43294:9;43270:33;:82;;;;-1:-1:-1;;;;;;43321:31:0;;;;;;:25;:31;;;;;;;;43320:32;43270:82;:114;;;;;43377:7;:5;:7::i;:::-;-1:-1:-1;;;;;43369:15:0;:4;-1:-1:-1;;;;;43369:15:0;;;43270:114;:144;;;;;43407:7;:5;:7::i;:::-;-1:-1:-1;;;;;43401:13:0;:2;-1:-1:-1;;;;;43401:13:0;;;43270:144;43252:313;;;43441:8;:15;;-1:-1:-1;;;;43441:15:0;-1:-1:-1;;;43441:15:0;;;43473:36;43488:20;43473:14;:36::i;:::-;43537:8;:16;;-1:-1:-1;;;;43537:16:0;;;43252:313;43593:8;;-1:-1:-1;;;;;43703:25:0;;43577:12;43703:25;;;:19;:25;;;;;;43593:8;-1:-1:-1;;;43593:8:0;;;;;43592:9;;43703:25;;:52;;-1:-1:-1;;;;;;43732:23:0;;;;;;:19;:23;;;;;;;;43703:52;43699:100;;;-1:-1:-1;43782:5:0;43699:100;43814:7;43810:1327;;;-1:-1:-1;;;;;43903:29:0;;43838:12;43903:29;;;:25;:29;;;;;;43838:12;;43903:29;;43902:30;:63;;;;-1:-1:-1;;;;;;43937:28:0;;;;;;:24;:28;;;;;;;;43936:29;43902:63;43898:252;;;44042:9;;44032:6;44016:13;44026:2;44016:9;:13::i;:::-;:22;;;;:::i;:::-;:35;;43986:148;;;;-1:-1:-1;;;43986:148:0;;14018:2:1;43986:148:0;;;14000:21:1;14057:2;14037:18;;;14030:30;14096:34;14076:18;;;14069:62;-1:-1:-1;;;14147:18:1;;;14140:37;14194:19;;43986:148:0;13816:403:1;43986:148:0;-1:-1:-1;;;;;44186:31:0;;;;;;:25;:31;;;;;;;;:60;;;;-1:-1:-1;;;;;;44222:24:0;;;;;;:20;:24;;;;;;;;44221:25;44186:60;44182:659;;;44286:11;;44276:6;:21;;44267:60;;;;-1:-1:-1;;;44267:60:0;;14426:2:1;44267:60:0;;;14408:21:1;14465:2;14445:18;;;14438:30;-1:-1:-1;;;14484:18:1;;;14477:55;14549:18;;44267:60:0;14224:349:1;44267:60:0;44364:11;;44353:34;;44381:5;;44353:23;;:6;;-1:-1:-1;;;44364:11:0;;;;44353:10;:23::i;:34::-;44445:11;;44428:6;:11;44346:41;;-1:-1:-1;44419:38:0;;44445:11;-1:-1:-1;;;44445:11:0;;;;;;44419:21;;44346:41;;44428:11;;;;;44419:8;:21::i;:38::-;44406:51;;44182:659;;;-1:-1:-1;;;;;44519:29:0;;;;;;:25;:29;;;;;;;;:60;;;;-1:-1:-1;;;;;;44553:26:0;;;;;;:20;:26;;;;;;;;44552:27;44519:60;44515:326;;;44618:11;;44609:6;:20;44600:60;;;;-1:-1:-1;;;44600:60:0;;14780:2:1;44600:60:0;;;14762:21:1;14819:2;14799:18;;;14792:30;-1:-1:-1;;;14838:18:1;;;14831:56;14904:18;;44600:60:0;14578:350:1;44600:60:0;44697:12;;44686:35;;44715:5;;44686:24;;:6;;-1:-1:-1;;;44697:12:0;;;;44686:10;:24::i;:35::-;44779:11;;44762:6;:11;44679:42;;-1:-1:-1;44753:38:0;;44779:11;-1:-1:-1;;;44779:11:0;;;;;;44753:21;;44679:42;;44762:11;;;;;44753:8;:21::i;:38::-;44740:51;;44515:326;44861:8;;44857:269;;44899:16;:6;44910:4;44899:10;:16::i;:::-;44890:25;-1:-1:-1;44934:55:0;44950:4;44964;44971:17;44978:10;44971:4;:17;:::i;:::-;44934:15;:55::i;:::-;45012:14;;45008:103;;45046:45;45062:4;31600:42;45080:10;45046:15;:45::i;:::-;43823:1314;;43810:1327;45149:33;45165:4;45171:2;45175:6;45149:15;:33::i;:::-;45199:15;;-1:-1:-1;;;;;45199:15:0;:26;45234:4;45241:15;45234:4;45241:9;:15::i;:::-;45199:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45195:74;45283:15;;-1:-1:-1;;;;;45283:15:0;:26;45318:2;45323:13;45318:2;45323:9;:13::i;:::-;45283:54;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45279:70;45366:8;;-1:-1:-1;;;45366:8:0;;;;45361:540;;45405:16;;45442:15;;:28;;-1:-1:-1;;;;;;45442:28:0;;;;;2844:25:1;;;-1:-1:-1;;;;;45442:15:0;;;;:23;;2817:18:1;;45442:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;45442:28:0;;;;;;;;-1:-1:-1;;45442:28:0;;;;;;;;;;;;:::i;:::-;;;45438:452;;;45634:231;;;15903:25:1;;;15959:2;15944:18;;15937:34;;;15987:18;;;15980:34;;;16045:2;16030:18;;16023:34;;;45837:9:0;;45784:4;;45634:231;;15890:3:1;15875:19;45634:231:0;;;;;;;45471:410;;;45376:525;45361:540;42725:3183;;;42612:3296;;;:::o;15028:173::-;15103:6;;;-1:-1:-1;;;;;15120:17:0;;;-1:-1:-1;;;;;;15120:17:0;;;;;;;15153:40;;15103:6;;;15120:17;15103:6;;15153:40;;15084:16;;15153:40;15073:128;15028:173;:::o;39965:446::-;-1:-1:-1;;;;;40070:31:0;;;;;;:25;:31;;;;;;:40;;;:31;;;;:40;;;40048:155;;;;-1:-1:-1;;;40048:155:0;;16270:2:1;40048:155:0;;;16252:21:1;16309:2;16289:18;;;16282:30;16348:34;16328:18;;;16321:62;16419:34;16399:18;;;16392:62;-1:-1:-1;;;16470:19:1;;;16463:32;16512:19;;40048:155:0;16068:469:1;40048:155:0;-1:-1:-1;;;;;40214:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;40214:39:0;;;;;;;;;;;;40266:80;;40292:15;;:42;;-1:-1:-1;;;40292:42:0;;-1:-1:-1;;;;;40292:15:0;;;;:36;;:42;;40329:4;;40292:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40266:80;40363:40;;;;;;-1:-1:-1;;;;;40363:40:0;;;;;;;;39965:446;;:::o;19823:733::-;-1:-1:-1;;;;;19963:20:0;;19955:70;;;;-1:-1:-1;;;19955:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20044:23:0;;20036:71;;;;-1:-1:-1;;;20036:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20204:17:0;;20180:21;20204:17;;;;;;;;;;;20240:23;;;;20232:74;;;;-1:-1:-1;;;20232:74:0;;16744:2:1;20232:74:0;;;16726:21:1;16783:2;16763:18;;;16756:30;16822:34;16802:18;;;16795:62;-1:-1:-1;;;16873:18:1;;;16866:36;16919:19;;20232:74:0;16542:402:1;20232:74:0;-1:-1:-1;;;;;20342:17:0;;;:9;:17;;;;;;;;;;;20362:22;;;20342:42;;20406:20;;;;;;;;:30;;20378:6;;20342:9;20406:30;;20378:6;;20406:30;:::i;:::-;;;;;;;;20471:9;-1:-1:-1;;;;;20454:35:0;20463:6;-1:-1:-1;;;;;20454:35:0;;20482:6;20454:35;;;;2844:25:1;;2832:2;2817:18;;2698:177;20454:35:0;;;;;;;;20502:46;42303:198;47187:2103;47365:7;:12;47351:6;:11;47336:12;;47271:21;;47246:22;;47365:12;;;;;;;;;47351:11;;;;;;;47322:26;;-1:-1:-1;;;47336:12:0;;;;;-1:-1:-1;;;47322:11:0;;;:26;:::i;:::-;:40;;;;:::i;:::-;:55;;;;:::i;:::-;47694:7;:19;47673:6;:18;47303:74;;;;;-1:-1:-1;47388:18:0;;47409:319;;47303:74;;47409:305;;-1:-1:-1;;;47694:19:0;;;;;;47673:18;;;;;;-1:-1:-1;;;47655:15:0;;;;;;47597:14;;;;;;-1:-1:-1;;;47578:16:0;;;;;;47560:15;;;;;;-1:-1:-1;;;47546:11:0;;;;;;47533:10;;;;;;47488:1;;47456:30;;-1:-1:-1;;;47472:14:0;;;;;;;47456:13;;:30;:::i;:::-;47455:34;;;;:::i;:::-;47437:7;:15;47420:6;:14;:32;;47437:15;;;;;47420:14;:32;:::i;:::-;:69;;;;:::i;:::-;:123;;;;:::i;:::-;:137;;;;:::i;:::-;:155;;;;:::i;:::-;:174;;;;:::i;:::-;:191;;;;:::i;:::-;:250;;;;:::i;:::-;:271;;;;:::i;:::-;:293;;;;:::i;:::-;47409:6;;:305;;:10;:305::i;:319::-;47388:340;-1:-1:-1;47739:17:0;47759:19;47388:340;47759:6;:19;:::i;:::-;47739:39;;47789:28;47806:10;47789:16;:28::i;:::-;47863:7;:14;47847:6;:13;47828:15;;47879:1;;47847:30;;47863:14;-1:-1:-1;;;47863:14:0;;;;;;;47847:13;;;;;:30;:::i;:::-;47846:34;;;;:::i;:::-;47828:52;;;-1:-1:-1;47893:18:0;47914:41;:21;47940:14;47914:25;:41::i;:::-;47893:62;-1:-1:-1;47966:19:0;47988:106;48075:18;48086:7;48075:8;:18;:::i;:::-;48020:7;:15;48003:6;:14;47988:48;;48003:32;;48020:15;;;;;48003:14;:32;:::i;:::-;47988:10;;:48;;:14;:48::i;:106::-;47966:128;-1:-1:-1;48105:20:0;48128:107;48217:17;48227:7;48217:8;:17;:::i;:::-;48161:7;:16;48143:6;:15;48128:50;;48143:34;;48161:16;-1:-1:-1;;;48161:16:0;;;;;;;48143:15;;;;:34;:::i;:::-;48128:10;;:50;;:14;:50::i;:107::-;48105:130;-1:-1:-1;48246:19:0;48268:106;48355:18;48366:7;48355:8;:18;:::i;:::-;48300:7;:15;48283:6;:14;48268:48;;48283:32;;48300:15;-1:-1:-1;;;48300:15:0;;;;;;;48283:14;;;;:32;:::i;48268:106::-;48246:128;-1:-1:-1;48388:15:0;48406:64;48451:18;48462:7;48451:8;:18;:::i;:::-;48434:7;:11;;48421:10;48406:40;;48421:24;;48434:11;-1:-1:-1;;;48434:11:0;;;;;;;48421:10;;;;:24;:::i;:::-;48406:10;;:40;;:14;:40::i;:64::-;48388:82;-1:-1:-1;48481:23:0;48507:80;48568:18;48579:7;48568:8;:18;:::i;:::-;48543:7;:19;48522:6;:18;48507:56;;48522:40;;48543:19;-1:-1:-1;;;48543:19:0;;;;;;;48522:18;;;;:40;:::i;:::-;48507:10;;:56;;:14;:56::i;:80::-;48481:106;-1:-1:-1;48642:15:0;;48638:70;;48669:26;48683:11;48669:13;:26::i;:::-;48722:19;;48718:86;;48754:38;48776:15;48754:21;:38::i;:::-;48818:11;;48814:80;;48862:9;;48841:41;;-1:-1:-1;;;;;48862:9:0;48874:7;48841:12;:41::i;:::-;48908:16;;48904:96;;48958:14;;48937:51;;-1:-1:-1;;;;;48958:14:0;48975:12;48937;:51::i;:::-;49014:15;;49010:92;;49062:13;;49041:49;;-1:-1:-1;;;;;49062:13:0;49078:11;49041:12;:49::i;:::-;49118:21;:25;49114:169;;49165:106;49178:9;49259:11;49241:15;49231:7;49216:12;49189:24;49202:11;49189:10;:24;:::i;:::-;:39;;;;:::i;:::-;:49;;;;:::i;:::-;:67;;;;:::i;:::-;:81;;;;:::i;:::-;49165:12;:106::i;:::-;47235:2055;;;;;;;;;;;47187:2103;:::o;12846:98::-;12904:7;12931:5;12935:1;12931;:5;:::i;50284:589::-;50434:16;;;50448:1;50434:16;;;;;;;;50410:21;;50434:16;;;;;;;;;;-1:-1:-1;50434:16:0;50410:40;;50479:4;50461;50466:1;50461:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50461:23:0;;;:7;;;;;;;;;;:23;;;;50505:15;;:22;;;-1:-1:-1;;;50505:22:0;;;;:15;;;;;:20;;:22;;;;;50461:7;;50505:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50495:4;50500:1;50495:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50495:32:0;;;:7;;;;;;;;;:32;50572:15;;50540:62;;50557:4;;50572:15;50590:11;50540:8;:62::i;:::-;50641:15;;:224;;-1:-1:-1;;;50641:224:0;;-1:-1:-1;;;;;50641:15:0;;;;:66;;:224;;50722:11;;50641:15;;50792:4;;50819;;50839:15;;50641:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52939:614;53041:12;;53034:45;;-1:-1:-1;;;53034:45:0;;52997:34;;-1:-1:-1;;;;;53041:12:0;;53034:30;;:45;;53073:4;;53034:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52997:82;;53092:33;53118:6;53092:25;:33::i;:::-;53167:12;;53160:45;;-1:-1:-1;;;53160:45:0;;53138:18;;53159:103;;53225:26;;-1:-1:-1;;;;;53167:12:0;;53160:30;;:45;;53199:4;;53160:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53159:51;;:103::i;:::-;53295:12;;53340:15;;53288:106;;-1:-1:-1;;;53288:106:0;;53138:124;;-1:-1:-1;53273:12:0;;-1:-1:-1;;;;;53295:12:0;;;;53288:29;;:106;;53340:15;;;53138:124;;53288:106;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53273:121;;53411:7;53407:139;;;53435:15;;:54;;-1:-1:-1;;;53435:54:0;;;;;2844:25:1;;;-1:-1:-1;;;;;53435:15:0;;;;:42;;2817:18:1;;53435:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53509:25;53523:10;53509:25;;;;2844::1;;2832:2;2817:18;;2698:177;53509:25:0;;;;;;;;52986:567;;;52939:614;:::o;51014:468::-;51104:16;;;51118:1;51104:16;;;;;;;;51080:21;;51104:16;;;;;;;;-1:-1:-1;;51141:15:0;;:22;;;-1:-1:-1;;;51141:22:0;;;;51080:40;;-1:-1:-1;;;;;;51141:15:0;;;;:20;;-1:-1:-1;51141:22:0;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51131:4;51136:1;51131:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;51131:32:0;;;:7;;;;;;;;;:32;51184:17;;51174:7;;51184:17;;;51174:4;;51184:17;;51174:7;;;;;;:::i;:::-;-1:-1:-1;;;;;51174:27:0;;;:7;;;;;;;;;:27;51240:15;;51397:17;;51240:234;;-1:-1:-1;;;51240:234:0;;:15;;;;:37;;51299:6;;51240:234;;:15;;51378:4;;51397:17;;;;51448:15;;51240:234;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51240:234:0;;;;;;;;;;;;:::i;49385:185::-;49467:12;49484:6;-1:-1:-1;;;;;49484:11:0;49502:6;49484:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49466:47;;;49532:7;49524:38;;;;-1:-1:-1;;;49524:38:0;;20795:2:1;49524:38:0;;;20777:21:1;20834:2;20814:18;;;20807:30;-1:-1:-1;;;20853:18:1;;;20846:49;20912:18;;49524:38:0;20593:343:1;49659:518:0;49841:15;;49809:62;;49826:4;;-1:-1:-1;;;;;49841:15:0;49859:11;49809:8;:62::i;:::-;49914:15;;:255;;-1:-1:-1;;;49914:255:0;;49986:4;49914:255;;;21282:34:1;21332:18;;;21325:34;;;49914:15:0;21375:18:1;;;21368:34;;;21418:18;;;21411:34;;;21461:19;;;21454:44;50143:15:0;21514:19:1;;;21507:35;-1:-1:-1;;;;;49914:15:0;;;;:31;;49953:9;;21216:19:1;;49914:255:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;51619:454::-;51713:16;;;51727:1;51713:16;;;;;;;;51689:21;;51713:16;;;;;;;;-1:-1:-1;;51750:15:0;;:22;;;-1:-1:-1;;;51750:22:0;;;;51689:40;;-1:-1:-1;;;;;;51750:15:0;;;;:20;;-1:-1:-1;51750:22:0;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51740:4;51745:1;51740:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;51740:32:0;;;:7;;;;;;;;;:32;51793:12;;51783:7;;51793:12;;;51783:4;;51793:12;;51783:7;;;;;;:::i;:::-;-1:-1:-1;;;;;51783:22:0;;;:7;;;;;;;;;:22;51844:15;;;:37;51903:6;51844:15;51982:4;52009;52030:24;:15;52050:3;52030:19;:24::i;:::-;51844:221;;;;;;;;;;;;;;;;;;:::i;12740:98::-;12798:7;12825:5;12829:1;12825;:5;:::i;-1:-1:-1:-;;;;;;;;:::o;14:159:1:-;81:20;;141:6;130:18;;120:29;;110:57;;163:1;160;153:12;110:57;14:159;;;:::o;178:620::-;284:6;292;300;308;316;324;332;385:3;373:9;364:7;360:23;356:33;353:53;;;402:1;399;392:12;353:53;425:28;443:9;425:28;:::i;:::-;415:38;;472:37;505:2;494:9;490:18;472:37;:::i;:::-;462:47;;528:37;561:2;550:9;546:18;528:37;:::i;:::-;518:47;;584:37;617:2;606:9;602:18;584:37;:::i;:::-;574:47;;640:38;673:3;662:9;658:19;640:38;:::i;:::-;630:48;;697:38;730:3;719:9;715:19;697:38;:::i;:::-;687:48;;754:38;787:3;776:9;772:19;754:38;:::i;:::-;744:48;;178:620;;;;;;;;;;:::o;803:203::-;-1:-1:-1;;;;;967:32:1;;;;949:51;;937:2;922:18;;803:203::o;1011:548::-;1123:4;1152:2;1181;1170:9;1163:21;1213:6;1207:13;1256:6;1251:2;1240:9;1236:18;1229:34;1281:1;1291:140;1305:6;1302:1;1299:13;1291:140;;;1400:14;;;1396:23;;1390:30;1366:17;;;1385:2;1362:26;1355:66;1320:10;;1291:140;;;1295:3;1480:1;1475:2;1466:6;1455:9;1451:22;1447:31;1440:42;1550:2;1543;1539:7;1534:2;1526:6;1522:15;1518:29;1507:9;1503:45;1499:54;1491:62;;;;1011:548;;;;:::o;1564:131::-;-1:-1:-1;;;;;1639:31:1;;1629:42;;1619:70;;1685:1;1682;1675:12;1700:247;1759:6;1812:2;1800:9;1791:7;1787:23;1783:32;1780:52;;;1828:1;1825;1818:12;1780:52;1867:9;1854:23;1886:31;1911:5;1886:31;:::i;2144:315::-;2212:6;2220;2273:2;2261:9;2252:7;2248:23;2244:32;2241:52;;;2289:1;2286;2279:12;2241:52;2328:9;2315:23;2347:31;2372:5;2347:31;:::i;:::-;2397:5;2449:2;2434:18;;;;2421:32;;-1:-1:-1;;;2144:315:1:o;2880:456::-;2957:6;2965;2973;3026:2;3014:9;3005:7;3001:23;2997:32;2994:52;;;3042:1;3039;3032:12;2994:52;3081:9;3068:23;3100:31;3125:5;3100:31;:::i;:::-;3150:5;-1:-1:-1;3207:2:1;3192:18;;3179:32;3220:33;3179:32;3220:33;:::i;:::-;2880:456;;3272:7;;-1:-1:-1;;;3326:2:1;3311:18;;;;3298:32;;2880:456::o;3341:118::-;3427:5;3420:13;3413:21;3406:5;3403:32;3393:60;;3449:1;3446;3439:12;3464:382;3529:6;3537;3590:2;3578:9;3569:7;3565:23;3561:32;3558:52;;;3606:1;3603;3596:12;3558:52;3645:9;3632:23;3664:31;3689:5;3664:31;:::i;:::-;3714:5;-1:-1:-1;3771:2:1;3756:18;;3743:32;3784:30;3743:32;3784:30;:::i;:::-;3833:7;3823:17;;;3464:382;;;;;:::o;4963:180::-;5022:6;5075:2;5063:9;5054:7;5050:23;5046:32;5043:52;;;5091:1;5088;5081:12;5043:52;-1:-1:-1;5114:23:1;;4963:180;-1:-1:-1;4963:180:1:o;5148:367::-;5211:8;5221:6;5275:3;5268:4;5260:6;5256:17;5252:27;5242:55;;5293:1;5290;5283:12;5242:55;-1:-1:-1;5316:20:1;;-1:-1:-1;;;;;5348:30:1;;5345:50;;;5391:1;5388;5381:12;5345:50;5428:4;5420:6;5416:17;5404:29;;5488:3;5481:4;5471:6;5468:1;5464:14;5456:6;5452:27;5448:38;5445:47;5442:67;;;5505:1;5502;5495:12;5442:67;5148:367;;;;;:::o;5520:773::-;5642:6;5650;5658;5666;5719:2;5707:9;5698:7;5694:23;5690:32;5687:52;;;5735:1;5732;5725:12;5687:52;5762:23;;-1:-1:-1;;;;;5834:14:1;;;5831:34;;;5861:1;5858;5851:12;5831:34;5900:70;5962:7;5953:6;5942:9;5938:22;5900:70;:::i;:::-;5989:8;;-1:-1:-1;5874:96:1;-1:-1:-1;6077:2:1;6062:18;;6049:32;;-1:-1:-1;6093:16:1;;;6090:36;;;6122:1;6119;6112:12;6090:36;;6161:72;6225:7;6214:8;6203:9;6199:24;6161:72;:::i;:::-;5520:773;;;;-1:-1:-1;6252:8:1;-1:-1:-1;;;;5520:773:1:o;6298:671::-;6384:6;6392;6400;6408;6461:3;6449:9;6440:7;6436:23;6432:33;6429:53;;;6478:1;6475;6468:12;6429:53;6517:9;6504:23;6536:31;6561:5;6536:31;:::i;:::-;6586:5;-1:-1:-1;6643:2:1;6628:18;;6615:32;6656:33;6615:32;6656:33;:::i;:::-;6708:7;-1:-1:-1;6767:2:1;6752:18;;6739:32;6780:33;6739:32;6780:33;:::i;:::-;6832:7;-1:-1:-1;6891:2:1;6876:18;;6863:32;6904:33;6863:32;6904:33;:::i;:::-;6298:671;;;;-1:-1:-1;6298:671:1;;-1:-1:-1;;6298:671:1:o;6974:388::-;7042:6;7050;7103:2;7091:9;7082:7;7078:23;7074:32;7071:52;;;7119:1;7116;7109:12;7071:52;7158:9;7145:23;7177:31;7202:5;7177:31;:::i;:::-;7227:5;-1:-1:-1;7284:2:1;7269:18;;7256:32;7297:33;7256:32;7297:33;:::i;7367:356::-;7569:2;7551:21;;;7588:18;;;7581:30;7647:34;7642:2;7627:18;;7620:62;7714:2;7699:18;;7367:356::o;8077:127::-;8138:10;8133:3;8129:20;8126:1;8119:31;8169:4;8166:1;8159:15;8193:4;8190:1;8183:15;8209:168;8276:6;8302:10;;;8314;;;8298:27;;8337:11;;;8334:37;;;8351:18;;:::i;:::-;8334:37;8209:168;;;;:::o;8382:380::-;8461:1;8457:12;;;;8504;;;8525:61;;8579:4;8571:6;8567:17;8557:27;;8525:61;8632:2;8624:6;8621:14;8601:18;8598:38;8595:161;;8678:10;8673:3;8669:20;8666:1;8659:31;8713:4;8710:1;8703:15;8741:4;8738:1;8731:15;8595:161;;8382:380;;;:::o;9176:125::-;9241:9;;;9262:10;;;9259:36;;;9275:18;;:::i;9306:300::-;-1:-1:-1;;;;;9508:32:1;;;;9490:51;;9584:14;9577:22;9572:2;9557:18;;9550:50;9478:2;9463:18;;9306:300::o;9611:245::-;9678:6;9731:2;9719:9;9710:7;9706:23;9702:32;9699:52;;;9747:1;9744;9737:12;9699:52;9779:9;9773:16;9798:28;9820:5;9798:28;:::i;9861:127::-;9922:10;9917:3;9913:20;9910:1;9903:31;9953:4;9950:1;9943:15;9977:4;9974:1;9967:15;9993:168;10066:9;;;10097;;10114:15;;;10108:22;;10094:37;10084:71;;10135:18;;:::i;10166:135::-;10205:3;10226:17;;;10223:43;;10246:18;;:::i;:::-;-1:-1:-1;10293:1:1;10282:13;;10166:135::o;11119:184::-;11189:6;11242:2;11230:9;11221:7;11217:23;11213:32;11210:52;;;11258:1;11255;11248:12;11210:52;-1:-1:-1;11281:16:1;;11119:184;-1:-1:-1;11119:184:1:o;11308:274::-;-1:-1:-1;;;;;11500:32:1;;;;11482:51;;11564:2;11549:18;;11542:34;11470:2;11455:18;;11308:274::o;11587:127::-;11648:10;11643:3;11639:20;11636:1;11629:31;11679:4;11676:1;11669:15;11703:4;11700:1;11693:15;11719:120;11759:1;11785;11775:35;;11790:18;;:::i;:::-;-1:-1:-1;11824:9:1;;11719:120::o;12652:401::-;12854:2;12836:21;;;12893:2;12873:18;;;12866:30;12932:34;12927:2;12912:18;;12905:62;-1:-1:-1;;;12998:2:1;12983:18;;12976:35;13043:3;13028:19;;12652:401::o;13058:399::-;13260:2;13242:21;;;13299:2;13279:18;;;13272:30;13338:34;13333:2;13318:18;;13311:62;-1:-1:-1;;;13404:2:1;13389:18;;13382:33;13447:3;13432:19;;13058:399::o;14933:128::-;15000:9;;;15021:11;;;15018:37;;;15035:18;;:::i;15361:306::-;15449:6;15457;15465;15518:2;15506:9;15497:7;15493:23;15489:32;15486:52;;;15534:1;15531;15524:12;15486:52;15563:9;15557:16;15547:26;;15613:2;15602:9;15598:18;15592:25;15582:35;;15657:2;15646:9;15642:18;15636:25;15626:35;;15361:306;;;;;:::o;16949:171::-;17017:6;17056:10;;;17044;;;17040:27;;17079:12;;;17076:38;;;17094:18;;:::i;17125:187::-;17164:1;17190:6;17223:2;17220:1;17216:10;17245:3;17235:37;;17252:18;;:::i;:::-;17290:10;;17286:20;;;;;17125:187;-1:-1:-1;;17125:187:1:o;17317:127::-;17378:10;17373:3;17369:20;17366:1;17359:31;17409:4;17406:1;17399:15;17433:4;17430:1;17423:15;17449:251;17519:6;17572:2;17560:9;17551:7;17547:23;17543:32;17540:52;;;17588:1;17585;17578:12;17540:52;17620:9;17614:16;17639:31;17664:5;17639:31;:::i;17705:461::-;17758:3;17796:5;17790:12;17823:6;17818:3;17811:19;17849:4;17878:2;17873:3;17869:12;17862:19;;17915:2;17908:5;17904:14;17936:1;17946:195;17960:6;17957:1;17954:13;17946:195;;;18025:13;;-1:-1:-1;;;;;18021:39:1;18009:52;;18081:12;;;;18116:15;;;;18057:1;17975:9;17946:195;;;-1:-1:-1;18157:3:1;;17705:461;-1:-1:-1;;;;;17705:461:1:o;18171:582::-;18470:6;18459:9;18452:25;18513:6;18508:2;18497:9;18493:18;18486:34;18556:3;18551:2;18540:9;18536:18;18529:31;18433:4;18577:57;18629:3;18618:9;18614:19;18606:6;18577:57;:::i;:::-;-1:-1:-1;;;;;18670:32:1;;;;18665:2;18650:18;;18643:60;-1:-1:-1;18734:3:1;18719:19;18712:35;18569:65;18171:582;-1:-1:-1;;;18171:582:1:o;18758:510::-;19029:6;19018:9;19011:25;19072:3;19067:2;19056:9;19052:18;19045:31;18992:4;19093:57;19145:3;19134:9;19130:19;19122:6;19093:57;:::i;:::-;-1:-1:-1;;;;;19186:32:1;;;;19181:2;19166:18;;19159:60;-1:-1:-1;19250:2:1;19235:18;19228:34;19085:65;18758:510;-1:-1:-1;;18758:510:1:o;19273:1105::-;19368:6;19399:2;19442;19430:9;19421:7;19417:23;19413:32;19410:52;;;19458:1;19455;19448:12;19410:52;19485:16;;-1:-1:-1;;;;;19550:14:1;;;19547:34;;;19577:1;19574;19567:12;19547:34;19615:6;19604:9;19600:22;19590:32;;19660:7;19653:4;19649:2;19645:13;19641:27;19631:55;;19682:1;19679;19672:12;19631:55;19711:2;19705:9;19733:2;19729;19726:10;19723:36;;;19739:18;;:::i;:::-;19785:2;19782:1;19778:10;19817:2;19811:9;19880:2;19876:7;19871:2;19867;19863:11;19859:25;19851:6;19847:38;19935:6;19923:10;19920:22;19915:2;19903:10;19900:18;19897:46;19894:72;;;19946:18;;:::i;:::-;19982:2;19975:22;20032:18;;;20066:15;;;;-1:-1:-1;20108:11:1;;;20104:20;;;20136:19;;;20133:39;;;20168:1;20165;20158:12;20133:39;20192:11;;;;20212:135;20228:6;20223:3;20220:15;20212:135;;;20294:10;;20282:23;;20245:12;;;;20325;;;;20212:135;;;20366:6;19273:1105;-1:-1:-1;;;;;;;;19273:1105:1:o

Swarm Source

ipfs://1391377b7fa6aed5f91ac601f33f34e7e9534dd2f9876664edf3b5b10f4fca47
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.