contract StandardToken is Context, ERC20Interface {
    using SafeMath for uint256;

    mapping (address => uint256) public _balances;
    mapping (address => mapping (address => uint256)) public _allowances;
    uint256 public _totalSupply;

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

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

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

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

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

    function transferFrom(address _sender, address _recipient, uint256 _amount) public virtual override returns (bool) {
        _transfer(_sender, _recipient, _amount);
        _approve(_sender, _msgSender(), _allowances[_sender][_msgSender()].sub(_amount, "HNT: transfer amount exceeds allowance"));
        return true;
    }

    // check https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 for details
    function increaseAllowance(address _spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), _spender, _allowances[_msgSender()][_spender].add(addedValue));
        return true;
    }

    // check https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 for details
    function decreaseAllowance(address _spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), _spender, _allowances[_msgSender()][_spender].sub(subtractedValue, "HNT: decreased allowance below zero"));
        return true;
    }

    function _transfer(address _sender, address _recipient, uint256 _amount) internal virtual {
        require(_sender != address(0), "HNT: transfer from the zero address");
        require(_recipient != address(0), "HNT: transfer to the zero address");

        _beforeTokenTransfer(_sender, _recipient, _amount);

        _balances[_sender] = _balances[_sender].sub(_amount, "HNT: transfer amount exceeds balance");
        _balances[_recipient] = _balances[_recipient].add(_amount);
        emit Transfer(_sender, _recipient, _amount);
    }

  function _approve(address _owner, address _spender, uint256 _amount) internal virtual {
        require(_owner != address(0), "HNT: approve from the zero address");
        require(_spender != address(0), "HNT: approve to the zero address");

        _allowances[_owner][_spender] = _amount;
        emit Approval(_owner, _spender, _amount);
    }

    function _beforeTokenTransfer(address _sender, address _recipient, uint256 _amount) internal virtual { }
}
// contract StandardToken
function increaseAllowance(address _spender, uint256 addedValue) public virtual returns (bool) {
    _approve(_msgSender(), _spender, _allowances[_msgSender()][_spender].add(addedValue));
    return true;
}

// check https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 for details