anchor.diff:    /// Stops calling the listener every time the status of the performance changes
     void removeStatusListener(PerformanceStatusListener listener);
   
  -  /// The current status of this animation
  +  /// The current status of this animation.
     PerformanceStatus get status;
  +
  +  /// The current direction of the animation.
  +  AnimationDirection get direction;
  +
  +  /// The direction used to select the current curve.
  +  ///
  +  /// The curve direction is only reset when we hit the beginning or the end of
  +  /// the timeline to avoid discontinuities in the value of any variables this
  +  /// performance is used to animate.
  +  AnimationDirection get curveDirection;
   
     /// The current progress of this animation (a value from 0.0 to 1.0).
     /// This is the value that is used to update any variables when using updateVariable().
  
positive.code:   /// Whether this animation is stopped at the end
    bool get isCompleted => status == PerformanceStatus.completed;
  }
  
  /// A timeline that can be reversed and used to update [Animatable]s.
  ///
  
negative.code:   /// Note: Setting this value stops the current animation.
    double get progress => _timeline.value.clamp(0.0, 1.0);
    void set progress(double t) {
      stop();
      _timeline.value = t.clamp(0.0, 1.0);
      _checkStatusChanged();
  