code: def raw_sign(self, message, do_hash=True):
          
          if isinstance(message, str):
              msg = bytes(message, 'ascii')
          elif isinstance(message, bytes):
              msg = message
          else:
              raise TypeError("message must be either str or bytes!")
  
          sig_pt, rec_id = bitcoin_curve.sign(msg, self.key, do_hash)
  
          # Take care of large s:
          # Bitcoin deals with large s, by subtracting
          # s from the curve order. See:
          # https://bitcointalk.org/index.php?topic=285142.30;wap2
          if sig_pt.y >= (bitcoin_curve.n // 2):
              sig_pt = Point(sig_pt.x, bitcoin_curve.n - sig_pt.y)
              rec_id ^= 0x1
  
          return (sig_pt, rec_id)
docs: Signs message using this private key.
  
          Args:
              message (bytes): The message to be signed. If a string is
                  provided it is assumed the encoding is 'ascii' and
                  converted to bytes. If this is not the case, it is up
                  to the caller to convert the string to bytes
                  appropriately and pass in the bytes.
              do_hash (bool): True if the message should be hashed prior
                  to signing, False if not. This should always be left as
                  True except in special situations which require doing
                  the hash outside (e.g. handling Bitcoin bugs).
  
          Returns:
              ECPointAffine:
                  a raw point (r = pt.x, s = pt.y) which is
                  the signature.