contract HumanStandardToken is StandardToken {
    /* Approves and then calls the receiving contract */
    function approveAndCall(address _spender, uint256 _value, bytes memory _extraData) public returns (bool success) {
        approve(_spender, _value);
        (bool txOk, ) = _spender.call(abi.encodePacked(bytes4(keccak256("receiveApproval(address,uint256,bytes)")), msg.sender, _value, _extraData));
        require(txOk, '_spender.call(abi.encodePacked(bytes4(keccak256("receiveApproval(address,uint256,bytes)")), msg.sender, _value, _extraData))');
        return true;
    }
    function approveAndCustomCall(address _spender, uint256 _value, bytes memory _extraData, bytes4 _customFunction) public returns (bool success) {
        approve(_spender, _value);
        (bool txOk, ) = _spender.call(abi.encodePacked(_customFunction, msg.sender, _value, _extraData));
        require(txOk, "_spender.call(abi.encodePacked(_customFunction, msg.sender, _value, _extraData))");
        return true;
    }
}
function approveAndCall(address _spender, uint256 _value, bytes memory _extraData) public returns (bool success) {
    approve(_spender, _value);
    (bool txOk, ) = _spender.call(abi.encodePacked(bytes4(keccak256("receiveApproval(address,uint256,bytes)")), msg.sender, _value, _extraData));
    require(txOk, '_spender.call(abi.encodePacked(bytes4(keccak256("receiveApproval(address,uint256,bytes)")), msg.sender, _value, _extraData))');
    return true;
}

/* Approves and then calls the receiving contract */