code: def tangent_surface_single(obj, uv, normalize):
      
      # Tangent is the 1st derivative of the surface
      skl = obj.derivatives(uv[0], uv[1], 1)
  
      point = skl[0][0]
      vector_u = linalg.vector_normalize(skl[1][0]) if normalize else skl[1][0]
      vector_v = linalg.vector_normalize(skl[0][1]) if normalize else skl[0][1]
  
      return tuple(point), tuple(vector_u), tuple(vector_v)
docs: Evaluates the surface tangent vector at the given (u,v) parameter pair.
  
      The output returns a list containing the starting point (i.e., origin) of the vector and the vectors themselves.
  
      :param obj: input surface
      :type obj: abstract.Surface
      :param uv: (u,v) parameter pair
      :type uv: list or tuple
      :param normalize: if True, the returned tangent vector is converted to a unit vector
      :type normalize: bool
      :return: A list in the order of "surface point", "derivative w.r.t. u" and "derivative w.r.t. v"
      :rtype: list