contract ERC721 {
    // Required methods
    function approve(address _to, uint _tokenId) public;
    function balanceOf(address _owner) public view returns(uint balance);
    function implementsERC721() public pure returns(bool);
    function ownerOf(uint _tokenId) public view returns(address addr);
    function takeOwnership(uint _tokenId) public;
    function totalSupply() public view returns(uint total);
    function transferFrom(address _from, address _to, uint _tokenId) public;
    function transfer(address _to, uint _tokenId) public;

    //event Transfer(uint tokenId, address indexed from, address indexed to);
    event Approval(uint tokenId, address indexed owner, address indexed approved);
    
    // Optional
    // function name() public view returns (string name);
    // function symbol() public view returns (string symbol);
    // function tokenOfOwnerByIndex(address _owner, uint _index) external view returns (uint tokenId);
    // function tokenMetadata(uint _tokenId) public view returns (string infoUrl);
}
/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens
/// @author Dieter Shirley <dete@axiomzen.co> (https://github.com/dete)
function approve(address _to, uint _tokenId) public;

// Required methods