úÎê (      !"#$%&' Safe-Inferredq_out = q_in^-1  return ||q|| q /= ||q|| quaternion multiply: qa * qb #quaternion multiply then normalize () ()None c = a (cross) b c = a (dot) b c = vec (dot) vec norm(x)  norm(a - b) vec_out = vec_in*scale_factor vec_out = scale (new_norm/norm(vec_in)) vec_in vec_out = vec_in/ norm(vec_in)  v_out = M*v  *+,-.     *+,-.None"vec_b = R_a2b * vec_a #vec_a = R_a2b^T * vec_b $#vec_b = q_a2b * vec_a * q_a2b^(-1)  vec_b = R(q_a2b) * vec_a  !"#$%&'  !"#$%&' ! "#$%&' !"#$%&'/      !"#$%&'()*+,spatial-math-0.1.6QuatXyz SpatialMath zipWithQuatinvnorm normalizeqmultqmult' zipWithXyzcrossdot normSquareddistancescale normalizeTo mult3x3ByXyzmult3x3TransposeByXyzEulerrotateXyzAboutXrotateXyzAboutYrotateXyzAboutZeuler321OfQuat quatOfDcm quatOfDcmB2A euler321OfDcmquatOfEuler321 dcmOfQuat dcmOfEuler321 dcmOfQuatB2A rotVecByDcmrotVecByDcmB2A rotVecByQuatrotVecByQuatB2A rotVecByEulerrotVecByEulerB2A $fNumQuat $fFunctorQuat $fFloatingXyz$fFractionalXyz$fNumXyz $fRandomXyz $fFunctorXyz