docs: function cubicBezierAtTime(t,p1x,p1y,p2x,p2y,duration) {
        var ax = 0,bx = 0,cx = 0,ay = 0,by = 0,cy = 0;
        function sampleCurveX(t) {return ((ax * t + bx) * t + cx) * t;}
        function sampleCurveY(t) {return ((ay * t + by) * t + cy) * t;}
        function sampleCurveDerivativeX(t) {return (3.0 * ax * t + 2.0 * bx) * t + cx;}
        function solveEpsilon(duration) {return 1.0 / (200.0 * duration);}
        function solve(x,epsilon) {return sampleCurveY(solveCurveX(x,epsilon));}
        function fabs(n) {if (n >= 0) {return n;}else {return 0 - n;}}
        function solveCurveX(x,epsilon) {
          var t0,t1,t2,x2,d2,i;
          for (t2 = x, i = 0; i < 8; i++) {x2 = sampleCurveX(t2) - x; if (fabs(x2) < epsilon) {return t2;} d2 = sampleCurveDerivativeX(t2); if (fabs(d2) < 1e-6) {break;} t2 = t2 - x2 / d2;}
          t0 = 0.0; t1 = 1.0; t2 = x; if (t2 < t0) {return t0;} if (t2 > t1) {return t1;}
          while (t0 < t1) {x2 = sampleCurveX(t2); if (fabs(x2 - x) < epsilon) {return t2;} if (x > x2) {t0 = t2;}else {t1 = t2;} t2 = (t1 - t0) * 0.5 + t0;}
          return t2; // Failure.
        }
        cx = 3.0 * p1x; bx = 3.0 * (p2x - p1x) - cx; ax = 1.0 - cx - bx; cy = 3.0 * p1y; by = 3.0 * (p2y - p1y) - cy; ay = 1.0 - cy - by;
        return solve(t, solveEpsilon(duration));
      }