diff --git a/examples/mine_digger/lib/main.dart b/examples/mine_digger/lib/main.dart
index 6e04a8d8e2a97cf094a3d4d231f5c2b103b53ba0..6feb708cb25088a96b0ed312fccb50d80306444d 100644
--- a/examples/mine_digger/lib/main.dart
+++ b/examples/mine_digger/lib/main.dart
@@ -84,8 +84,8 @@ class MineDiggerState extends State<MineDigger> {
     }
   }
 
-  PointerEventListener _pointerDownHandlerFor(int posX, int posY) {
-    return (PointerInputEvent event) {
+  PointerDownEventListener _pointerDownHandlerFor(int posX, int posY) {
+    return (PointerDownEvent event) {
       if (event.buttons == 1) {
         probe(posX, posY);
       } else if (event.buttons == 2) {
@@ -190,7 +190,7 @@ class MineDiggerState extends State<MineDigger> {
     );
   }
 
-  void handleToolbarPointerDown(PointerInputEvent event) {
+  void handleToolbarPointerDown(PointerDownEvent event) {
     setState(() {
       resetGame();
     });
diff --git a/examples/rendering/lib/sector_layout.dart b/examples/rendering/lib/sector_layout.dart
index 326b60e6482aba277d6965dc12f48a8d6675465d..c0b3bf204a190c64928d9d244f96a74287fa81fa 100644
--- a/examples/rendering/lib/sector_layout.dart
+++ b/examples/rendering/lib/sector_layout.dart
@@ -518,10 +518,11 @@ class RenderSolidColor extends RenderDecoratedSector {
     deltaTheta = constraints.constrainDeltaTheta(desiredDeltaTheta);
   }
 
-  void handleEvent(InputEvent event, HitTestEntry entry) {
-    if (event.type == 'pointerdown')
+  void handleEvent(PointerEvent event, HitTestEntry entry) {
+    if (event is PointerDownEvent) {
       decoration = new BoxDecoration(backgroundColor: const Color(0xFFFF0000));
-    else if (event.type == 'pointerup')
+    } else if (event is PointerUpEvent) {
       decoration = new BoxDecoration(backgroundColor: backgroundColor);
+    }
   }
 }
diff --git a/examples/rendering/lib/solid_color_box.dart b/examples/rendering/lib/solid_color_box.dart
index 31928d821cc6409ef71eee195199529b82179ba1..d4dbcf098eeafea359949f57a78809a56ebff902 100644
--- a/examples/rendering/lib/solid_color_box.dart
+++ b/examples/rendering/lib/solid_color_box.dart
@@ -41,10 +41,11 @@ class RenderSolidColorBox extends RenderDecoratedBox {
     size = constraints.constrain(desiredSize);
   }
 
-  void handleEvent(InputEvent event, BoxHitTestEntry entry) {
-    if (event.type == 'pointerdown')
+  void handleEvent(PointerEvent event, BoxHitTestEntry entry) {
+    if (event is PointerDownEvent) {
       decoration = new BoxDecoration(backgroundColor: const Color(0xFFFF0000));
-    else if (event.type == 'pointerup')
+    } else if (event is PointerUpEvent) {
       decoration = new BoxDecoration(backgroundColor: backgroundColor);
+    }
   }
 }
diff --git a/examples/rendering/touch_demo.dart b/examples/rendering/touch_demo.dart
index 25e3d878a0b4c555f1843bb8cc44734b26a88b67..029d88dc1079cfd2783de356b4cae0d2d74a0a7d 100644
--- a/examples/rendering/touch_demo.dart
+++ b/examples/rendering/touch_demo.dart
@@ -23,8 +23,8 @@ class Dot {
 
   Dot({ Color color }) : _paint = new Paint()..color = color;
 
-  void update(PointerInputEvent event) {
-    position = new Point(event.x, event.y);
+  void update(PointerEvent event) {
+    position = event.position;
     radius = 5 + (95 * event.pressure);
   }
 
@@ -36,25 +36,20 @@ class Dot {
 class RenderTouchDemo extends RenderBox {
   final Map<int, Dot> dots = <int, Dot>{};
 
-  void handleEvent(InputEvent event, BoxHitTestEntry entry) {
-    if (event is PointerInputEvent) {
-      switch (event.type) {
-        case 'pointerdown':
-          Color color = kColors[event.pointer.remainder(kColors.length)];
-          dots[event.pointer] = new Dot(color: color)..update(event);
-          break;
-        case 'pointerup':
-          dots.remove(event.pointer);
-          break;
-        case 'pointercancel':
-          dots.clear();
-          break;
-        case 'pointermove':
-          dots[event.pointer].update(event);
-          break;
-      }
-      markNeedsPaint();
+  void handleEvent(PointerEvent event, BoxHitTestEntry entry) {
+    if (event is PointerDownEvent) {
+      Color color = kColors[event.pointer.remainder(kColors.length)];
+      dots[event.pointer] = new Dot(color: color)..update(event);
+    } else if (event is PointerUpEvent) {
+      dots.remove(event.pointer);
+    } else if (event is PointerCancelEvent) {
+      dots.clear();
+    } else if (event is PointerMoveEvent) {
+      dots[event.pointer].update(event);
+    } else {
+      return;
     }
+    markNeedsPaint();
   }
 
   void performLayout() {
diff --git a/examples/widgets/overlay_geometry.dart b/examples/widgets/overlay_geometry.dart
index d20386dbb4e02af826322207d2c6b34ba931f666..4bfb84813ae31b3d95bf0eddd4d111a077fe25e9 100644
--- a/examples/widgets/overlay_geometry.dart
+++ b/examples/widgets/overlay_geometry.dart
@@ -4,6 +4,7 @@
 
 import 'dart:ui' as ui;
 
+import 'package:flutter/gestures.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/rendering.dart';
 
@@ -121,9 +122,9 @@ class OverlayGeometryAppState extends State<OverlayGeometryApp> {
     });
   }
 
-  void handlePointerDown(GlobalKey target, PointerInputEvent event) {
+  void handlePointerDown(GlobalKey target, PointerDownEvent event) {
     setState(() {
-      markers[MarkerType.touch] = new Point(event.x, event.y);
+      markers[MarkerType.touch] = event.position;
       final RenderBox box = target.currentContext.findRenderObject();
       markers[MarkerType.topLeft] = box.localToGlobal(new Point(0.0, 0.0));
       final Size size = box.size;
@@ -139,7 +140,7 @@ class OverlayGeometryAppState extends State<OverlayGeometryApp> {
     CardModel cardModel = cardModels[index];
     return new Listener(
       key: cardModel.key,
-      onPointerDown: (PointerInputEvent e) { return handlePointerDown(cardModel.targetKey, e); },
+      onPointerDown: (PointerDownEvent event) { return handlePointerDown(cardModel.targetKey, event); },
       child: new Card(
         key: cardModel.targetKey,
         color: cardModel.color,
diff --git a/packages/flutter/lib/src/gestures/drag.dart b/packages/flutter/lib/src/gestures/drag.dart
index 285d0680917e8df275e062968d3538f8c9350ee7..f47c7786abc7f2948427dfe8a33d2ab935884299 100644
--- a/packages/flutter/lib/src/gestures/drag.dart
+++ b/packages/flutter/lib/src/gestures/drag.dart
@@ -2,8 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'dart:ui' as ui;
-
 import 'arena.dart';
 import 'recognizer.dart';
 import 'constants.dart';
@@ -16,21 +14,22 @@ enum DragState {
   accepted
 }
 
-typedef void GestureDragStartCallback(ui.Point globalPosition);
+typedef void GestureDragStartCallback(Point globalPosition);
 typedef void GestureDragUpdateCallback(double delta);
-typedef void GestureDragEndCallback(ui.Offset velocity);
+typedef void GestureDragEndCallback(Offset velocity);
 
-typedef void GesturePanStartCallback(ui.Point globalPosition);
-typedef void GesturePanUpdateCallback(ui.Offset delta);
-typedef void GesturePanEndCallback(ui.Offset velocity);
+typedef void GesturePanStartCallback(Point globalPosition);
+typedef void GesturePanUpdateCallback(Offset delta);
+typedef void GesturePanEndCallback(Offset velocity);
 
 typedef void _GesturePolymorphicUpdateCallback<T>(T delta);
 
-bool _isFlingGesture(GestureVelocity velocity) {
-  double velocitySquared = velocity.x * velocity.x + velocity.y * velocity.y;
-  return velocity.isValid &&
-    velocitySquared > kMinFlingVelocity * kMinFlingVelocity &&
-    velocitySquared < kMaxFlingVelocity * kMaxFlingVelocity;
+bool _isFlingGesture(Offset velocity) {
+  if (velocity == null)
+    return false;
+  double velocitySquared = velocity.dx * velocity.dx + velocity.dy * velocity.dy;
+  return velocitySquared > kMinFlingVelocity * kMinFlingVelocity
+      && velocitySquared < kMaxFlingVelocity * kMaxFlingVelocity;
 }
 
 abstract class _DragGestureRecognizer<T extends dynamic> extends OneSequenceGestureRecognizer {
@@ -42,16 +41,16 @@ abstract class _DragGestureRecognizer<T extends dynamic> extends OneSequenceGest
   GestureDragEndCallback onEnd;
 
   DragState _state = DragState.ready;
-  ui.Point _initialPosition;
+  Point _initialPosition;
   T _pendingDragDelta;
 
   T get _initialPendingDragDelta;
-  T _getDragDelta(PointerInputEvent event);
+  T _getDragDelta(PointerEvent event);
   bool get _hasSufficientPendingDragDeltaToAccept;
 
   Map<int, VelocityTracker> _velocityTrackers = new Map<int, VelocityTracker>();
 
-  void addPointer(PointerInputEvent event) {
+  void addPointer(PointerEvent event) {
     startTrackingPointer(event.pointer);
     _velocityTrackers[event.pointer] = new VelocityTracker();
     if (_state == DragState.ready) {
@@ -61,12 +60,12 @@ abstract class _DragGestureRecognizer<T extends dynamic> extends OneSequenceGest
     }
   }
 
-  void handleEvent(PointerInputEvent event) {
+  void handleEvent(PointerEvent event) {
     assert(_state != DragState.ready);
-    if (event.type == 'pointermove') {
+    if (event is PointerMoveEvent) {
       VelocityTracker tracker = _velocityTrackers[event.pointer];
       assert(tracker != null);
-      tracker.addPosition(event.timeStamp, event.x, event.y);
+      tracker.addPosition(event.timeStamp, event.position);
       T delta = _getDragDelta(event);
       if (_state == DragState.accepted) {
         if (onUpdate != null)
@@ -104,11 +103,10 @@ abstract class _DragGestureRecognizer<T extends dynamic> extends OneSequenceGest
       VelocityTracker tracker = _velocityTrackers[pointer];
       assert(tracker != null);
 
-      GestureVelocity gestureVelocity = tracker.getVelocity();
-      ui.Offset velocity = ui.Offset.zero;
-      if (_isFlingGesture(gestureVelocity))
-        velocity = new ui.Offset(gestureVelocity.x, gestureVelocity.y);
-      onEnd(velocity);
+      Offset velocity = tracker.getVelocity();
+      if (velocity != null && _isFlingGesture(velocity))
+        onEnd(velocity);
+      onEnd(Offset.zero);
     }
     _velocityTrackers.clear();
   }
@@ -128,7 +126,7 @@ class VerticalDragGestureRecognizer extends _DragGestureRecognizer<double> {
   }) : super(router: router, onStart: onStart, onUpdate: onUpdate, onEnd: onEnd);
 
   double get _initialPendingDragDelta => 0.0;
-  double _getDragDelta(PointerInputEvent event) => event.dy;
+  double _getDragDelta(PointerEvent event) => event.delta.dy;
   bool get _hasSufficientPendingDragDeltaToAccept => _pendingDragDelta.abs() > kTouchSlop;
 }
 
@@ -141,11 +139,11 @@ class HorizontalDragGestureRecognizer extends _DragGestureRecognizer<double> {
   }) : super(router: router, onStart: onStart, onUpdate: onUpdate, onEnd: onEnd);
 
   double get _initialPendingDragDelta => 0.0;
-  double _getDragDelta(PointerInputEvent event) => event.dx;
+  double _getDragDelta(PointerEvent event) => event.delta.dx;
   bool get _hasSufficientPendingDragDeltaToAccept => _pendingDragDelta.abs() > kTouchSlop;
 }
 
-class PanGestureRecognizer extends _DragGestureRecognizer<ui.Offset> {
+class PanGestureRecognizer extends _DragGestureRecognizer<Offset> {
   PanGestureRecognizer({
     PointerRouter router,
     GesturePanStartCallback onStart,
@@ -153,8 +151,8 @@ class PanGestureRecognizer extends _DragGestureRecognizer<ui.Offset> {
     GesturePanEndCallback onEnd
   }) : super(router: router, onStart: onStart, onUpdate: onUpdate, onEnd: onEnd);
 
-  ui.Offset get _initialPendingDragDelta => ui.Offset.zero;
-  ui.Offset _getDragDelta(PointerInputEvent event) => new ui.Offset(event.dx, event.dy);
+  Offset get _initialPendingDragDelta => Offset.zero;
+  Offset _getDragDelta(PointerEvent event) => event.delta;
   bool get _hasSufficientPendingDragDeltaToAccept {
     return _pendingDragDelta.distance > kPanSlop;
   }
diff --git a/packages/flutter/lib/src/gestures/events.dart b/packages/flutter/lib/src/gestures/events.dart
index a49119ff83c92fdc10c6dd1e9425ce6c12da6200..d101139f74eeb05a6f1efdeb842222ec81d8a91e 100644
--- a/packages/flutter/lib/src/gestures/events.dart
+++ b/packages/flutter/lib/src/gestures/events.dart
@@ -2,38 +2,37 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'dart:ui' as ui;
+import 'dart:ui' show Point, Offset;
 
-export 'dart:ui' show Point;
+export 'dart:ui' show Point, Offset;
 
-/// Base class for input events.
-class InputEvent {
-  const InputEvent({ this.type, this.timeStamp: const Duration() });
-  final String type;
-  final Duration timeStamp;
-}
+enum PointerDeviceKind { touch, stylus, invertedStylus, mouse }
 
-/// Input event representing a touch or button.
-class PointerInputEvent extends InputEvent {
+const int primaryMouseButton = 0x01;
+const int secondaryMouseButton = 0x02;
+const int primaryStylusButton = 0x02;
+const int middleMouseButton = 0x04;
+const int secondaryStylusButton = 0x04;
+const int backMouseButton = 0x08;
+const int forwardMouseButton = 0x10;
+int nthMouseButton(int number) => primaryMouseButton << (number - 1);
+int nthStylusButton(int number) => primaryStylusButton << (number - 1);
 
-  const PointerInputEvent({
-    String type,
-    Duration timeStamp: const Duration(),
+/// Base class for touch, stylus, or mouse events.
+abstract class PointerEvent {
+  const PointerEvent({
+    this.timeStamp: Duration.ZERO,
     this.pointer: 0,
-    this.kind,
-    this.x: 0.0,
-    this.y: 0.0,
-    this.dx: 0.0,
-    this.dy: 0.0,
+    this.kind: PointerDeviceKind.touch,
+    this.position: Point.origin,
+    this.delta: Offset.zero,
     this.buttons: 0,
     this.down: false,
-    this.primary: false,
     this.obscured: false,
-    this.pressure: 0.0,
-    this.pressureMin: 0.0,
-    this.pressureMax: 0.0,
+    this.pressure: 1.0,
+    this.pressureMin: 1.0,
+    this.pressureMax: 1.0,
     this.distance: 0.0,
-    this.distanceMin: 0.0,
     this.distanceMax: 0.0,
     this.radiusMajor: 0.0,
     this.radiusMinor: 0.0,
@@ -41,58 +40,357 @@ class PointerInputEvent extends InputEvent {
     this.radiusMax: 0.0,
     this.orientation: 0.0,
     this.tilt: 0.0
-  }) : super(type: type, timeStamp: timeStamp);
+  });
 
+  /// Time of event dispatch, relative to an arbitrary timeline.
+  final Duration timeStamp;
+
+  /// Unique identifier for the pointer, not reused.
   final int pointer;
-  final String kind;
-  final double x;
-  final double y;
-  final double dx;
-  final double dy;
+
+  /// The kind of input device for which the event was generated.
+  final PointerDeviceKind kind;
+
+  /// Coordinate of the position of the pointer, in logical pixels in the global
+  /// coordinate space.
+  final Point position;
+
+  /// Distance in logical pixels that the pointer moved since the last
+  /// PointerMoveEvent. Always 0.0 for down, up, and cancel events.
+  final Offset delta;
+
+  /// Bit field using the *Button constants (primaryMouseButton,
+  /// secondaryStylusButton, etc). For example, if this has the value 6 and the
+  /// [kind] is [PointerDeviceKind.invertedStylus], then this indicates an
+  /// upside-down stylus with both its primary and secondary buttons pressed.
   final int buttons;
+
+  // Set if the pointer is currently down. For touch and stylus pointers, this
+  // means the object (finger, pen) is in contact with the input surface. For
+  // mice, it means a button is pressed.
   final bool down;
-  final bool primary;
+
+  // Set if an application from a different security domain is in any way
+  // obscuring this application's window. (Aspirational; not currently
+  // implemented.)
   final bool obscured;
+
+  /// The pressure of the touch as a number ranging from 0.0, indicating a touch
+  /// with no discernible pressure, to 1.0, indicating a touch with "normal"
+  /// pressure, and possibly beyond, indicating a stronger touch. For devices
+  /// that do not detect pressure (e.g. mice), returns 1.0.
   final double pressure;
+
+  /// The minimum value that [pressure] can return for this pointer. For devices
+  /// that do not detect pressure (e.g. mice), returns 1.0. This will always be
+  /// a number less than or equal to 1.0.
   final double pressureMin;
+
+  /// The maximum value that [pressure] can return for this pointer. For devices
+  /// that do not detect pressure (e.g. mice), returns 1.0. This will always be
+  /// a greater than or equal to 1.0.
   final double pressureMax;
+
+  /// The distance of the detected object from the input surface (e.g. the
+  /// distance of a stylus or finger from a touch screen), in arbitrary units on
+  /// an arbitrary (not necessarily linear) scale. If the pointer is down, this
+  /// is 0.0 by definition.
   final double distance;
-  final double distanceMin;
+
+  /// The minimum value that a distance can return for this pointer (always 0.0).
+  final double distanceMin = 0.0;
+
+  /// The maximum value that a distance can return for this pointer. If this
+  /// input device cannot detect "hover touch" input events, then this will be
+  /// 0.0.
   final double distanceMax;
+
+  /// The radius of the contact ellipse along the major axis, in logical pixels.
   final double radiusMajor;
+
+  /// The radius of the contact ellipse along the minor axis, in logical pixels.
   final double radiusMinor;
+
+  /// The minimum value that could be reported for radiusMajor and radiusMinor
+  /// for this pointer, in logical pixels.
   final double radiusMin;
+
+  /// The minimum value that could be reported for radiusMajor and radiusMinor
+  /// for this pointer, in logical pixels.
   final double radiusMax;
+
+  /// For PointerDeviceKind.touch events:
+  ///
+  /// The angle of the contact ellipse, in radius in the range:
+  ///
+  ///    -pi/2 < orientation <= pi/2
+  ///
+  /// ...giving the angle of the major axis of the ellipse with the y-axis
+  /// (negative angles indicating an orientation along the top-left /
+  /// bottom-right diagonal, positive angles indicating an orientation along the
+  /// top-right / bottom-left diagonal, and zero indicating an orientation
+  /// parallel with the y-axis).
+  ///
+  /// For PointerDeviceKind.stylus and PointerDeviceKind.invertedStylus events:
+  ///
+  /// The angle of the stylus, in radians in the range:
+  ///
+  ///    -pi < orientation <= pi
+  ///
+  /// ...giving the angle of the axis of the stylus projected onto the input
+  /// surface, relative to the positive y-axis of that surface (thus 0.0
+  /// indicates the stylus, if projected onto that surface, would go from the
+  /// contact point vertically up in the positive y-axis direction, pi would
+  /// indicate that the stylus would go down in the negative y-axis direction;
+  /// pi/4 would indicate that the stylus goes up and to the right, -pi/2 would
+  /// indicate that the stylus goes to the left, etc).
   final double orientation;
-  final double tilt;
 
-  ui.Point get position => new ui.Point(x, y);
+  /// For PointerDeviceKind.stylus and PointerDeviceKind.invertedStylus events:
+  ///
+  /// The angle of the stylus, in radians in the range:
+  ///
+  ///    0 <= tilt <= pi/2
+  ///
+  /// ...giving the angle of the axis of the stylus, relative to the axis
+  /// perpendicular to the input surface (thus 0.0 indicates the stylus is
+  /// orthogonal to the plane of the input surface, while pi/2 indicates that
+  /// the stylus is flat on that surface).
+  final double tilt;
 
-  String toString() => 'PointerInputEvent(x: $x, y:$y)';
+  String toString() => '$runtimeType($position)';
 
   String toStringFull() {
-    return "PointerInputEvent(" +
-        "pointer: $pointer, " +
-        "kind: $kind, " +
-        "x: $x, " +
-        "y: $y, " +
-        "dx: $dx, " +
-        "dy: $dy, " +
-        "buttons: $buttons, " +
-        "down: $down, " +
-        "primary: $primary, " +
-        "obscured: $obscured, " +
-        "pressure: $pressure, " +
-        "pressureMin: $pressureMin, " +
-        "pressureMax: $pressureMax, " +
-        "distance: $distance, " +
-        "distanceMin: $distanceMin, " +
-        "distanceMax: $distanceMax, " +
-        "radiusMajor: $radiusMajor, " +
-        "radiusMinor: $radiusMinor, " +
-        "radiusMin: $radiusMin, " +
-        "radiusMax: $radiusMax, " +
-        "orientation: $orientation, " +
-        "tilt: $tilt)";
+    return '$runtimeType('
+             'timeStamp: $timeStamp, '
+             'pointer: $pointer, '
+             'kind: $kind, '
+             'position: $position, '
+             'delta: $delta, '
+             'buttons: $buttons, '
+             'down: $down, '
+             'obscured: $obscured, '
+             'pressure: $pressure, '
+             'pressureMin: $pressureMin, '
+             'pressureMax: $pressureMax, '
+             'distance: $distance, '
+             'distanceMin: $distanceMin, '
+             'distanceMax: $distanceMax, '
+             'radiusMajor: $radiusMajor, '
+             'radiusMinor: $radiusMinor, '
+             'radiusMin: $radiusMin, '
+             'radiusMax: $radiusMax, '
+             'orientation: $orientation, '
+             'tilt: $tilt'
+           ')';
   }
 }
+
+class PointerAddedEvent extends PointerEvent {
+  const PointerAddedEvent({
+    Duration timeStamp: Duration.ZERO,
+    int pointer: 0,
+    PointerDeviceKind kind: PointerDeviceKind.touch,
+    Point position: Point.origin,
+    bool obscured: false,
+    double pressureMin: 0.0,
+    double pressureMax: 0.0,
+    double distance: 0.0,
+    double distanceMax: 0.0,
+    double radiusMin: 0.0,
+    double radiusMax: 0.0,
+    double orientation: 0.0,
+    double tilt: 0.0
+  }) : super(
+    timeStamp: timeStamp,
+    pointer: pointer,
+    kind: kind,
+    position: position,
+    obscured: obscured,
+    pressureMin: pressureMin,
+    pressureMax: pressureMax,
+    distance: distance,
+    distanceMax: distanceMax,
+    radiusMin: radiusMin,
+    radiusMax: radiusMax,
+    orientation: orientation,
+    tilt: tilt
+  );
+}
+
+class PointerRemovedEvent extends PointerEvent {
+  const PointerRemovedEvent({
+    Duration timeStamp: Duration.ZERO,
+    int pointer: 0,
+    PointerDeviceKind kind: PointerDeviceKind.touch,
+    bool obscured: false,
+    double pressureMin: 0.0,
+    double pressureMax: 0.0,
+    double distanceMax: 0.0,
+    double radiusMin: 0.0,
+    double radiusMax: 0.0
+  }) : super(
+    timeStamp: timeStamp,
+    pointer: pointer,
+    kind: kind,
+    position: null,
+    obscured: obscured,
+    pressureMin: pressureMin,
+    pressureMax: pressureMax,
+    distanceMax: distanceMax,
+    radiusMin: radiusMin,
+    radiusMax: radiusMax
+  );
+}
+
+class PointerDownEvent extends PointerEvent {
+  const PointerDownEvent({
+    Duration timeStamp: Duration.ZERO,
+    int pointer: 0,
+    PointerDeviceKind kind: PointerDeviceKind.touch,
+    Point position: Point.origin,
+    int buttons: 0,
+    bool obscured: false,
+    double pressure: 0.0,
+    double pressureMin: 0.0,
+    double pressureMax: 0.0,
+    double distanceMax: 0.0,
+    double radiusMajor: 0.0,
+    double radiusMinor: 0.0,
+    double radiusMin: 0.0,
+    double radiusMax: 0.0,
+    double orientation: 0.0,
+    double tilt: 0.0
+  }) : super(
+    timeStamp: timeStamp,
+    pointer: pointer,
+    kind: kind,
+    position: position,
+    buttons: buttons,
+    down: true,
+    obscured: obscured,
+    pressure: pressure,
+    pressureMin: pressureMin,
+    pressureMax: pressureMax,
+    distance: 0.0,
+    distanceMax: distanceMax,
+    radiusMajor: radiusMajor,
+    radiusMinor: radiusMinor,
+    radiusMin: radiusMin,
+    radiusMax: radiusMax,
+    orientation: orientation,
+    tilt: tilt
+  );
+}
+
+class PointerMoveEvent extends PointerEvent {
+  const PointerMoveEvent({
+    Duration timeStamp: Duration.ZERO,
+    int pointer: 0,
+    PointerDeviceKind kind: PointerDeviceKind.touch,
+    Point position: Point.origin,
+    Offset delta: Offset.zero,
+    int buttons: 0,
+    bool down: false,
+    bool obscured: false,
+    double pressure: 0.0,
+    double pressureMin: 0.0,
+    double pressureMax: 0.0,
+    double distance: 0.0,
+    double distanceMax: 0.0,
+    double radiusMajor: 0.0,
+    double radiusMinor: 0.0,
+    double radiusMin: 0.0,
+    double radiusMax: 0.0,
+    double orientation: 0.0,
+    double tilt: 0.0
+  }) : super(
+    timeStamp: timeStamp,
+    pointer: pointer,
+    kind: kind,
+    position: position,
+    delta: delta,
+    buttons: buttons,
+    down: down,
+    obscured: obscured,
+    pressure: pressure,
+    pressureMin: pressureMin,
+    pressureMax: pressureMax,
+    distance: distance,
+    distanceMax: distanceMax,
+    radiusMajor: radiusMajor,
+    radiusMinor: radiusMinor,
+    radiusMin: radiusMin,
+    radiusMax: radiusMax,
+    orientation: orientation,
+    tilt: tilt
+  );
+}
+
+class PointerUpEvent extends PointerEvent {
+  const PointerUpEvent({
+    Duration timeStamp: Duration.ZERO,
+    int pointer: 0,
+    PointerDeviceKind kind: PointerDeviceKind.touch,
+    Point position: Point.origin,
+    int buttons: 0,
+    bool obscured: false,
+    double pressureMin: 0.0,
+    double pressureMax: 0.0,
+    double distance: 0.0,
+    double distanceMax: 0.0,
+    double radiusMin: 0.0,
+    double radiusMax: 0.0,
+    double orientation: 0.0,
+    double tilt: 0.0
+  }) : super(
+    timeStamp: timeStamp,
+    pointer: pointer,
+    kind: kind,
+    position: position,
+    buttons: buttons,
+    obscured: obscured,
+    pressureMin: pressureMin,
+    pressureMax: pressureMax,
+    distance: distance,
+    distanceMax: distanceMax,
+    radiusMin: radiusMin,
+    radiusMax: radiusMax,
+    orientation: orientation,
+    tilt: tilt
+  );
+}
+
+class PointerCancelEvent extends PointerEvent {
+  const PointerCancelEvent({
+    Duration timeStamp: Duration.ZERO,
+    int pointer: 0,
+    PointerDeviceKind kind: PointerDeviceKind.touch,
+    Point position: Point.origin,
+    int buttons: 0,
+    bool obscured: false,
+    double pressureMin: 0.0,
+    double pressureMax: 0.0,
+    double distance: 0.0,
+    double distanceMax: 0.0,
+    double radiusMin: 0.0,
+    double radiusMax: 0.0,
+    double orientation: 0.0,
+    double tilt: 0.0
+  }) : super(
+    timeStamp: timeStamp,
+    pointer: pointer,
+    kind: kind,
+    position: position,
+    buttons: buttons,
+    obscured: obscured,
+    pressureMin: pressureMin,
+    pressureMax: pressureMax,
+    distance: distance,
+    distanceMax: distanceMax,
+    radiusMin: radiusMin,
+    radiusMax: radiusMax,
+    orientation: orientation,
+    tilt: tilt
+  );
+}
diff --git a/packages/flutter/lib/src/gestures/long_press.dart b/packages/flutter/lib/src/gestures/long_press.dart
index 07b16e69701829868cfd3d88577eac5197e5452f..4832e6d8f1f261e8e884a31f72fc39ae3be1f295 100644
--- a/packages/flutter/lib/src/gestures/long_press.dart
+++ b/packages/flutter/lib/src/gestures/long_press.dart
@@ -18,11 +18,12 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer {
 
   void didExceedDeadline() {
     resolve(GestureDisposition.accepted);
-    onLongPress();
+    if (onLongPress != null)
+      onLongPress();
   }
 
-  void handlePrimaryPointer(PointerInputEvent event) {
-    if (event.type == 'pointerup')
+  void handlePrimaryPointer(PointerEvent event) {
+    if (event is PointerUpEvent)
       resolve(GestureDisposition.rejected);
   }
 }
diff --git a/packages/flutter/lib/src/gestures/lsq_solver.dart b/packages/flutter/lib/src/gestures/lsq_solver.dart
index 6aa73d4bfc8f292f9dfdc31645c2e507fb3a6f7a..f60ec5d5f6da71b19338cee5565c76fb2232def5 100644
--- a/packages/flutter/lib/src/gestures/lsq_solver.dart
+++ b/packages/flutter/lib/src/gestures/lsq_solver.dart
@@ -15,16 +15,22 @@ class _Vector {
   _Vector.fromVOL(List<double> values, int offset, int length)
   : _offset = offset, _length = length, _elements = values;
 
+  final int _offset;
+
   int get length => _length;
+  final int _length;
+
+  final List<double> _elements;
 
-  operator [](int i) => _elements[i + _offset];
-  operator []=(int i, double value) => _elements[i + _offset] = value;
+  double operator [](int i) => _elements[i + _offset];
+  void operator []=(int i, double value) {
+    _elements[i + _offset] = value;
+  }
 
-  operator *(_Vector a) {
+  double operator *(_Vector a) {
     double result = 0.0;
-    for (int i = 0; i < _length; i++) {
+    for (int i = 0; i < _length; i += 1)
       result += this[i] * a[i];
-    }
     return result;
   }
 
@@ -39,10 +45,6 @@ class _Vector {
     }
     return result;
   }
-
-  final int _offset;
-  final int _length;
-  final List<double> _elements;
 }
 
 class _Matrix {
@@ -51,6 +53,10 @@ class _Matrix {
     _columns = cols,
     _elements = new Float64List(rows * cols);
 
+  final int _rows;
+  final int _columns;
+  final List<double> _elements;
+
   double get(int row, int col) => _elements[row * _columns + col];
   void set(int row, int col, double value) {
     _elements[row * _columns + col] = value;
@@ -75,10 +81,6 @@ class _Matrix {
     }
     return result;
   }
-
-  final int _rows;
-  final int _columns;
-  final List<double> _elements;
 }
 
 class PolynomialFit {
@@ -110,11 +112,10 @@ class LeastSquaresSolver {
 
     // Expand the X vector to a matrix A, pre-multiplied by the weights.
     _Matrix a = new _Matrix(n, m);
-    for (int h = 0; h < m; h++) {
+    for (int h = 0; h < m; h += 1) {
       a.set(0, h, w[h]);
-      for (int i = 1; i < n; i++) {
+      for (int i = 1; i < n; i += 1)
         a.set(i, h, a.get(i - 1, h) * x[h]);
-      }
     }
 
     // Apply the Gram-Schmidt process to A to obtain its QR decomposition.
@@ -123,15 +124,13 @@ class LeastSquaresSolver {
     _Matrix q = new _Matrix(n, m);
     // Upper triangular matrix, row-major order.
     _Matrix r = new _Matrix(n, n);
-    for (int j = 0; j < n; j++) {
-      for (int h = 0; h < m; h++) {
+    for (int j = 0; j < n; j += 1) {
+      for (int h = 0; h < m; h += 1)
         q.set(j, h, a.get(j, h));
-      }
-      for (int i = 0; i < j; i++) {
+      for (int i = 0; i < j; i += 1) {
         double dot = q.getRow(j) * q.getRow(i);
-        for (int h = 0; h < m; h++) {
+        for (int h = 0; h < m; h += 1)
           q.set(j, h, q.get(j, h) - dot * q.get(i, h));
-        }
       }
 
       double norm = q.getRow(j).norm();
@@ -141,56 +140,50 @@ class LeastSquaresSolver {
       }
 
       double inverseNorm = 1.0 / norm;
-      for (int h = 0; h < m; h++) {
+      for (int h = 0; h < m; h += 1)
         q.set(j, h, q.get(j, h) * inverseNorm);
-      }
-      for (int i = 0; i < n; i++) {
+      for (int i = 0; i < n; i += 1)
         r.set(j, i, i < j ? 0.0 : q.getRow(j) * a.getRow(i));
-      }
     }
 
     // Solve R B = Qt W Y to find B.  This is easy because R is upper triangular.
     // We just work from bottom-right to top-left calculating B's coefficients.
     _Vector wy = new _Vector(m);
-    for (int h = 0; h < m; h++) {
+    for (int h = 0; h < m; h += 1)
       wy[h] = y[h] * w[h];
-    }
-    for (int i = n; i-- != 0;) {
+    for (int i = n - 1; i >= 0; i -= 1) {
       result.coefficients[i] = q.getRow(i) * wy;
-      for (int j = n - 1; j > i; j--) {
+      for (int j = n - 1; j > i; j -= 1)
         result.coefficients[i] -= r.get(i, j) * result.coefficients[j];
-      }
       result.coefficients[i] /= r.get(i, i);
     }
 
     // Calculate the coefficient of determination (confidence) as:
-    // 1 - (sumSquaredError / sumSquaredTotal)
-    // where sumSquaredError is the residual sum of squares (variance of the
+    //   1 - (sumSquaredError / sumSquaredTotal)
+    // ...where sumSquaredError is the residual sum of squares (variance of the
     // error), and sumSquaredTotal is the total sum of squares (variance of the
     // data) where each has been weighted.
     double yMean = 0.0;
-    for (int h = 0; h < m; h++) {
+    for (int h = 0; h < m; h += 1)
       yMean += y[h];
-    }
     yMean /= m;
 
     double sumSquaredError = 0.0;
     double sumSquaredTotal = 0.0;
-    for (int h = 0; h < m; h++) {
-      double err = y[h] - result.coefficients[0];
+    for (int h = 0; h < m; h += 1) {
       double term = 1.0;
-      for (int i = 1; i < n; i++) {
+      double err = y[h] - result.coefficients[0];
+      for (int i = 1; i < n; i += 1) {
         term *= x[h];
         err -= term * result.coefficients[i];
       }
       sumSquaredError += w[h] * w[h] * err * err;
-      double v = y[h] - yMean;
+      final double v = y[h] - yMean;
       sumSquaredTotal += w[h] * w[h] * v * v;
     }
 
-    result.confidence = sumSquaredTotal > 0.000001 ?
-      1.0 - (sumSquaredError / sumSquaredTotal) :
-      1.0;
+    result.confidence = sumSquaredTotal <= 0.000001 ? 1.0 :
+                          1.0 - (sumSquaredError / sumSquaredTotal);
 
     return result;
   }
diff --git a/packages/flutter/lib/src/gestures/multitap.dart b/packages/flutter/lib/src/gestures/multitap.dart
index ed9fdd137459735fffa4488dce92c5e6ea660cbb..282ffbd63b0792ad1c50e8e56841edebe27d9255 100644
--- a/packages/flutter/lib/src/gestures/multitap.dart
+++ b/packages/flutter/lib/src/gestures/multitap.dart
@@ -22,11 +22,9 @@ typedef void GestureMultiTapCancelCallback(int pointer);
 /// larger gesture.
 class _TapTracker {
 
-  _TapTracker({ PointerInputEvent event, this.entry })
+  _TapTracker({ PointerDownEvent event, this.entry })
     : pointer = event.pointer,
-      _initialPosition = event.position {
-    assert(event.type == 'pointerdown');
-  }
+      _initialPosition = event.position;
 
   final int pointer;
   final GestureArenaEntry entry;
@@ -48,7 +46,7 @@ class _TapTracker {
     }
   }
 
-  bool isWithinTolerance(PointerInputEvent event, double tolerance) {
+  bool isWithinTolerance(PointerEvent event, double tolerance) {
     Offset offset = event.position - _initialPosition;
     return offset.distance <= tolerance;
   }
@@ -92,7 +90,7 @@ class DoubleTapGestureRecognizer extends GestureRecognizer {
   _TapTracker _firstTap;
   final Map<int, _TapTracker> _trackers = new Map<int, _TapTracker>();
 
-  void addPointer(PointerInputEvent event) {
+  void addPointer(PointerEvent event) {
     // Ignore out-of-bounds second taps
     if (_firstTap != null &&
         !_firstTap.isWithinTolerance(event, kDoubleTapSlop))
@@ -106,23 +104,19 @@ class DoubleTapGestureRecognizer extends GestureRecognizer {
     tracker.startTrackingPointer(_router, handleEvent);
   }
 
-  void handleEvent(PointerInputEvent event) {
+  void handleEvent(PointerEvent event) {
     _TapTracker tracker = _trackers[event.pointer];
     assert(tracker != null);
-    switch (event.type) {
-      case 'pointerup':
-        if (_firstTap == null)
-          _registerFirstTap(tracker);
-        else
-          _registerSecondTap(tracker);
-        break;
-      case 'pointermove':
-        if (!tracker.isWithinTolerance(event, kDoubleTapTouchSlop))
-          _reject(tracker);
-        break;
-      case 'pointercancel':
+    if (event is PointerUpEvent) {
+      if (_firstTap == null)
+        _registerFirstTap(tracker);
+      else
+        _registerSecondTap(tracker);
+    } else if (event is PointerMoveEvent) {
+      if (!tracker.isWithinTolerance(event, kDoubleTapTouchSlop))
         _reject(tracker);
-        break;
+    } else if (event is PointerCancelEvent) {
+      _reject(tracker);
     }
   }
 
@@ -228,7 +222,7 @@ class _TapGesture extends _TapTracker {
 
   _TapGesture({
     MultiTapGestureRecognizer gestureRecognizer,
-    PointerInputEvent event,
+    PointerEvent event,
     Duration longTapDelay
   }) : gestureRecognizer = gestureRecognizer,
        _lastPosition = event.position,
@@ -250,16 +244,16 @@ class _TapGesture extends _TapTracker {
   Point _lastPosition;
   Point _finalPosition;
 
-  void handleEvent(PointerInputEvent event) {
+  void handleEvent(PointerEvent event) {
     assert(event.pointer == pointer);
-    if (event.type == 'pointermove') {
+    if (event is PointerMoveEvent) {
       if (!isWithinTolerance(event, kTouchSlop))
         cancel();
       else
         _lastPosition = event.position;
-    } else if (event.type == 'pointercancel') {
+    } else if (event is PointerCancelEvent) {
       cancel();
-    } else if (event.type == 'pointerup') {
+    } else if (event is PointerUpEvent) {
       stopTrackingPointer(gestureRecognizer.router, handleEvent);
       _finalPosition = event.position;
       _check();
@@ -326,7 +320,7 @@ class MultiTapGestureRecognizer extends GestureRecognizer {
 
   final Map<int, _TapGesture> _gestureMap = new Map<int, _TapGesture>();
 
-  void addPointer(PointerInputEvent event) {
+  void addPointer(PointerEvent event) {
     assert(!_gestureMap.containsKey(event.pointer));
     _gestureMap[event.pointer] = new _TapGesture(
       gestureRecognizer: this,
diff --git a/packages/flutter/lib/src/gestures/pointer_router.dart b/packages/flutter/lib/src/gestures/pointer_router.dart
index 4e8ab17d8275afe4965f6afa2a4ef6e2b35ccd49..23da474cf2b99debe9b6eeb2a7d68bd1fabae54b 100644
--- a/packages/flutter/lib/src/gestures/pointer_router.dart
+++ b/packages/flutter/lib/src/gestures/pointer_router.dart
@@ -4,16 +4,16 @@
 
 import 'events.dart';
 
-/// A callback that receives a [PointerInputEvent]
-typedef void PointerRoute(PointerInputEvent event);
+/// A callback that receives a [PointerEvent]
+typedef void PointerRoute(PointerEvent event);
 
-/// A routing table for [PointerInputEvent] events.
+/// A routing table for [PointerEvent] events.
 class PointerRouter {
   final Map<int, List<PointerRoute>> _routeMap = new Map<int, List<PointerRoute>>();
 
-  /// Adds a route to the routing table
+  /// Adds a route to the routing table.
   ///
-  /// Whenever this object routes a [PointerInputEvent] corresponding to
+  /// Whenever this object routes a [PointerEvent] corresponding to
   /// pointer, call route.
   void addRoute(int pointer, PointerRoute route) {
     List<PointerRoute> routes = _routeMap.putIfAbsent(pointer, () => new List<PointerRoute>());
@@ -21,9 +21,9 @@ class PointerRouter {
     routes.add(route);
   }
 
-  /// Removes a route from the routing table
+  /// Removes a route from the routing table.
   ///
-  /// No longer call route when routing a [PointerInputEvent] corresponding to
+  /// No longer call route when routing a [PointerEvent] corresponding to
   /// pointer. Requires that this route was previously added to the router.
   void removeRoute(int pointer, PointerRoute route) {
     assert(_routeMap.containsKey(pointer));
@@ -37,7 +37,7 @@ class PointerRouter {
   /// Call the routes registed for this pointer event.
   ///
   /// Calls the routes in the order in which they were added to the route.
-  void route(PointerInputEvent event) {
+  void route(PointerEvent event) {
     List<PointerRoute> routes = _routeMap[event.pointer];
     if (routes == null)
       return;
diff --git a/packages/flutter/lib/src/gestures/recognizer.dart b/packages/flutter/lib/src/gestures/recognizer.dart
index bfa1c6fb518619b449c8a49666f9891a25a6dd87..28893fa414ee14d0f915d1bc20368af03e507a4c 100644
--- a/packages/flutter/lib/src/gestures/recognizer.dart
+++ b/packages/flutter/lib/src/gestures/recognizer.dart
@@ -18,7 +18,7 @@ abstract class GestureRecognizer extends GestureArenaMember {
   /// considered for this gesture. (It's the GestureRecognizer's responsibility
   /// to then add itself to the global pointer router to receive subsequent
   /// events for this pointer.)
-  void addPointer(PointerInputEvent event);
+  void addPointer(PointerDownEvent event);
 
   /// Release any resources used by the object. Called when the object is no
   /// longer needed (e.g. a gesture recogniser is being unregistered from a
@@ -34,10 +34,10 @@ abstract class OneSequenceGestureRecognizer extends GestureRecognizer {
 
   PointerRouter _router;
 
-  final List<GestureArenaEntry> _entries = new List<GestureArenaEntry>();
+  final List<GestureArenaEntry> _entries = <GestureArenaEntry>[];
   final Set<int> _trackedPointers = new Set<int>();
 
-  void handleEvent(PointerInputEvent event);
+  void handleEvent(PointerEvent event);
   void acceptGesture(int pointer) { }
   void rejectGesture(int pointer) { }
   void didStopTrackingLastPointer(int pointer);
@@ -71,8 +71,8 @@ abstract class OneSequenceGestureRecognizer extends GestureRecognizer {
       didStopTrackingLastPointer(pointer);
   }
 
-  void stopTrackingIfPointerNoLongerDown(PointerInputEvent event) {
-    if (event.type == 'pointerup' || event.type == 'pointercancel')
+  void stopTrackingIfPointerNoLongerDown(PointerEvent event) {
+    if (event is PointerUpEvent || event is PointerCancelEvent)
       stopTrackingPointer(event.pointer);
   }
 
@@ -95,7 +95,7 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni
   Point initialPosition;
   Timer _timer;
 
-  void addPointer(PointerInputEvent event) {
+  void addPointer(PointerDownEvent event) {
     startTrackingPointer(event.pointer);
     if (state == GestureRecognizerState.ready) {
       state = GestureRecognizerState.possible;
@@ -106,11 +106,11 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni
     }
   }
 
-  void handleEvent(PointerInputEvent event) {
+  void handleEvent(PointerEvent event) {
     assert(state != GestureRecognizerState.ready);
     if (state == GestureRecognizerState.possible && event.pointer == primaryPointer) {
       // TODO(abarth): Maybe factor the slop handling out into a separate class?
-      if (event.type == 'pointermove' && _getDistance(event) > kTouchSlop) {
+      if (event is PointerMoveEvent && _getDistance(event) > kTouchSlop) {
         resolve(GestureDisposition.rejected);
         stopTrackingPointer(primaryPointer);
       } else {
@@ -121,7 +121,7 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni
   }
 
   /// Override to provide behavior for the primary pointer when the gesture is still possible.
-  void handlePrimaryPointer(PointerInputEvent event);
+  void handlePrimaryPointer(PointerEvent event);
 
   /// Override to be notified with [deadline] is exceeded.
   ///
@@ -154,7 +154,7 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni
     }
   }
 
-  double _getDistance(PointerInputEvent event) {
+  double _getDistance(PointerEvent event) {
     Offset offset = event.position - initialPosition;
     return offset.distance;
   }
diff --git a/packages/flutter/lib/src/gestures/scale.dart b/packages/flutter/lib/src/gestures/scale.dart
index f79629d78edbbb45e915331a7712980db5277a51..45b96b8285a0c3d1405cb8c50f51c0552cdc0e30 100644
--- a/packages/flutter/lib/src/gestures/scale.dart
+++ b/packages/flutter/lib/src/gestures/scale.dart
@@ -2,8 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'dart:ui' as ui;
-
 import 'arena.dart';
 import 'recognizer.dart';
 import 'constants.dart';
@@ -16,8 +14,8 @@ enum ScaleState {
   started
 }
 
-typedef void GestureScaleStartCallback(ui.Point focalPoint);
-typedef void GestureScaleUpdateCallback(double scale, ui.Point focalPoint);
+typedef void GestureScaleStartCallback(Point focalPoint);
+typedef void GestureScaleUpdateCallback(double scale, Point focalPoint);
 typedef void GestureScaleEndCallback();
 
 class ScaleGestureRecognizer extends OneSequenceGestureRecognizer {
@@ -32,35 +30,31 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer {
 
   double _initialSpan;
   double _currentSpan;
-  Map<int, ui.Point> _pointerLocations;
+  Map<int, Point> _pointerLocations;
 
   double get _scaleFactor => _initialSpan > 0.0 ? _currentSpan / _initialSpan : 1.0;
 
-  void addPointer(PointerInputEvent event) {
+  void addPointer(PointerEvent event) {
     startTrackingPointer(event.pointer);
     if (_state == ScaleState.ready) {
       _state = ScaleState.possible;
       _initialSpan = 0.0;
       _currentSpan = 0.0;
-      _pointerLocations = new Map<int, ui.Point>();
+      _pointerLocations = new Map<int, Point>();
     }
   }
 
-  void handleEvent(PointerInputEvent event) {
+  void handleEvent(PointerEvent event) {
     assert(_state != ScaleState.ready);
     bool configChanged = false;
-    switch(event.type) {
-      case 'pointerup':
-        configChanged = true;
-        _pointerLocations.remove(event.pointer);
-        break;
-      case 'pointerdown':
-        configChanged = true;
-        _pointerLocations[event.pointer] = new ui.Point(event.x, event.y);
-        break;
-      case 'pointermove':
-        _pointerLocations[event.pointer] = new ui.Point(event.x, event.y);
-        break;
+    if (event is PointerMoveEvent) {
+      _pointerLocations[event.pointer] = event.position;
+    } else if (event is PointerDownEvent) {
+      configChanged = true;
+      _pointerLocations[event.pointer] = event.position;
+    } else if (event is PointerUpEvent) {
+      configChanged = true;
+      _pointerLocations.remove(event.pointer);
     }
 
     _update(configChanged);
@@ -72,10 +66,10 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer {
     int count = _pointerLocations.keys.length;
 
     // Compute the focal point
-    ui.Point focalPoint = ui.Point.origin;
+    Point focalPoint = Point.origin;
     for (int pointer in _pointerLocations.keys)
       focalPoint += _pointerLocations[pointer].toOffset();
-    focalPoint = new ui.Point(focalPoint.x / count, focalPoint.y / count);
+    focalPoint = new Point(focalPoint.x / count, focalPoint.y / count);
 
     // Span is the average deviation from focal point
     double totalDeviation = 0.0;
diff --git a/packages/flutter/lib/src/gestures/tap.dart b/packages/flutter/lib/src/gestures/tap.dart
index a63bfb5cf36bd15314724e42d2f52be5ca92c2cc..bd3a6a50373ddb94fa5f0349ccb92a1c26c5dafc 100644
--- a/packages/flutter/lib/src/gestures/tap.dart
+++ b/packages/flutter/lib/src/gestures/tap.dart
@@ -2,8 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'dart:ui' show Point, Offset;
-
 import 'arena.dart';
 import 'constants.dart';
 import 'events.dart';
@@ -36,8 +34,8 @@ class TapGestureRecognizer extends PrimaryPointerGestureRecognizer {
   bool _wonArena = false;
   Point _finalPosition;
 
-  void handlePrimaryPointer(PointerInputEvent event) {
-    if (event.type == 'pointerup') {
+  void handlePrimaryPointer(PointerEvent event) {
+    if (event is PointerUpEvent) {
       _finalPosition = event.position;
       _checkUp();
     }
diff --git a/packages/flutter/lib/src/gestures/velocity_tracker.dart b/packages/flutter/lib/src/gestures/velocity_tracker.dart
index 5c2555be1d718089d3c2c71ab7723e74f5cc3089..42d6d12d77af019a1975799d0284d36cabab2e4e 100644
--- a/packages/flutter/lib/src/gestures/velocity_tracker.dart
+++ b/packages/flutter/lib/src/gestures/velocity_tracker.dart
@@ -2,17 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'dart:ui' as ui;
+import 'dart:ui' show Point, Offset;
 
 import 'lsq_solver.dart';
 
-class GestureVelocity {
-  GestureVelocity({ this.isValid: false, this.x: 0.0, this.y : 0.0 });
-
-  final bool isValid;
-  final double x;
-  final double y;
-}
+export 'dart:ui' show Point, Offset;
 
 class _Estimator {
   int degree;
@@ -22,17 +16,16 @@ class _Estimator {
   double confidence;
 
   String toString() {
-    String result = "Estimator(degree: " + degree.toString();
-    result +=  ", time: " + time.toString();
-    result +=  ", confidence: " + confidence.toString();
-    result +=  ", xCoefficients: " + xCoefficients.toString();
-    result +=  ", yCoefficients: " + yCoefficients.toString();
-    return result;
+    return 'Estimator(degree: $degree, '
+                     'time: $time, '
+                     'confidence: $confidence, '
+                     'xCoefficients: $xCoefficients, '
+                     'yCoefficients: $yCoefficients)';
   }
 }
 
 abstract class _VelocityTrackerStrategy {
-  void addMovement(Duration timeStamp, double x, double y);
+  void addMovement(Duration timeStamp, Point position);
   bool getEstimator(_Estimator estimator);
   void clear();
 }
@@ -45,28 +38,46 @@ enum _Weighting {
 }
 
 class _Movement {
-  Duration eventTime = const Duration();
-  ui.Point position = ui.Point.origin;
+  Duration eventTime = Duration.ZERO;
+  Point position = Point.origin;
 }
 
+typedef double _WeightChooser(int index);
+
 class _LeastSquaresVelocityTrackerStrategy extends _VelocityTrackerStrategy {
   static const int kHistorySize = 20;
   static const int kHorizonMilliseconds = 100;
 
-  _LeastSquaresVelocityTrackerStrategy(this.degree, this.weighting)
-  : _index = 0, _movements = new List<_Movement>(kHistorySize);
+  _LeastSquaresVelocityTrackerStrategy(this.degree, _Weighting weighting)
+    : _index = 0, _movements = new List<_Movement>(kHistorySize) {
+    switch (weighting) {
+      case _Weighting.weightingNone:
+        _chooseWeight = null;
+        break;
+      case _Weighting.weightingDelta:
+        _chooseWeight = _weightDelta;
+        break;
+      case _Weighting.weightingCentral:
+        _chooseWeight = _weightCentral;
+        break;
+      case _Weighting.weightingRecent:
+        _chooseWeight = _weightRecent;
+        break;
+    }
+  }
 
   final int degree;
-  final _Weighting weighting;
   final List<_Movement> _movements;
+  _WeightChooser _chooseWeight;
   int _index;
 
-  void addMovement(Duration timeStamp, double x, double y) {
-    if (++_index == kHistorySize)
+  void addMovement(Duration timeStamp, Point position) {
+    _index += 1;
+    if (_index == kHistorySize)
       _index = 0;
     _Movement movement = _getMovement(_index);
     movement.eventTime = timeStamp;
-    movement.position = new ui.Point(x, y);
+    movement.position = position;
   }
 
   bool getEstimator(_Estimator estimator) {
@@ -85,16 +96,18 @@ class _LeastSquaresVelocityTrackerStrategy extends _VelocityTrackerStrategy {
       if (age > kHorizonMilliseconds)
         break;
 
-      ui.Point position = movement.position;
+      Point position = movement.position;
       x.add(position.x);
       y.add(position.y);
-      w.add(_chooseWeight(index));
+      w.add(_chooseWeight != null ? _chooseWeight(index) : 1.0);
       time.add(-age);
       index = (index == 0 ? kHistorySize : index) - 1;
-    } while (++m < kHistorySize);
 
-    if (m == 0)
-      return false;  // no data
+      m += 1;
+    } while (m < kHistorySize);
+
+    if (m == 0) // because we broke out of the loop above after age > kHorizonMilliseconds
+      return false; // no data
 
     // Calculate a least squares polynomial fit.
     int n = degree;
@@ -120,8 +133,8 @@ class _LeastSquaresVelocityTrackerStrategy extends _VelocityTrackerStrategy {
 
     // No velocity data available for this pointer, but we do have its current
     // position.
-    estimator.xCoefficients = [ x[0] ];
-    estimator.yCoefficients = [ y[0] ];
+    estimator.xCoefficients = <double>[ x[0] ];
+    estimator.yCoefficients = <double>[ y[0] ];
     estimator.time = newestMovement.eventTime;
     estimator.degree = 0;
     estimator.confidence = 1.0;
@@ -132,71 +145,61 @@ class _LeastSquaresVelocityTrackerStrategy extends _VelocityTrackerStrategy {
     _index = -1;
   }
 
-  double _chooseWeight(int index) {
-    switch (weighting) {
-      case _Weighting.weightingDelta:
-        // Weight points based on how much time elapsed between them and the next
-        // point so that points that "cover" a shorter time span are weighed less.
-        //   delta  0ms: 0.5
-        //   delta 10ms: 1.0
-        if (index == _index) {
-          return 1.0;
-        }
-        int nextIndex = (index + 1) % kHistorySize;
-        int deltaMilliseconds = (_movements[nextIndex].eventTime - _movements[index].eventTime).inMilliseconds;
-        if (deltaMilliseconds < 0)
-          return 0.5;
-        if (deltaMilliseconds < 10)
-          return 0.5 + deltaMilliseconds * 0.05;
-
-        return 1.0;
-
-      case _Weighting.weightingCentral:
-        // Weight points based on their age, weighing very recent and very old
-        // points less.
-        //   age  0ms: 0.5
-        //   age 10ms: 1.0
-        //   age 50ms: 1.0
-        //   age 60ms: 0.5
-        int ageMilliseconds = (_movements[_index].eventTime - _movements[index].eventTime).inMilliseconds;
-        if (ageMilliseconds < 0)
-          return 0.5;
-        if (ageMilliseconds < 10)
-          return 0.5 + ageMilliseconds * 0.05;
-        if (ageMilliseconds < 50)
-          return 1.0;
-        if (ageMilliseconds < 60)
-          return 0.5 + (60 - ageMilliseconds) * 0.05;
-
-        return 0.5;
+  double _weightDelta(int index) {
+    // Weight points based on how much time elapsed between them and the next
+    // point so that points that "cover" a shorter time span are weighed less.
+    //   delta  0ms: 0.5
+    //   delta 10ms: 1.0
+    if (index == _index)
+      return 1.0;
+    int nextIndex = (index + 1) % kHistorySize;
+    int deltaMilliseconds = (_movements[nextIndex].eventTime - _movements[index].eventTime).inMilliseconds;
+    if (deltaMilliseconds < 0)
+      return 0.5;
+    if (deltaMilliseconds < 10)
+      return 0.5 + deltaMilliseconds * 0.05;
+    return 1.0;
+  }
 
-      case _Weighting.weightingRecent:
-        // Weight points based on their age, weighing older points less.
-        //   age   0ms: 1.0
-        //   age  50ms: 1.0
-        //   age 100ms: 0.5
-        int ageMilliseconds = (_movements[_index].eventTime - _movements[index].eventTime).inMilliseconds;
-        if (ageMilliseconds < 50) {
-          return 1.0;
-        }
-        if (ageMilliseconds < 100) {
-          return 0.5 + (100 - ageMilliseconds) * 0.01;
-        }
-        return 0.5;
+  double _weightCentral(int index) {
+    // Weight points based on their age, weighing very recent and very old
+    // points less.
+    //   age  0ms: 0.5
+    //   age 10ms: 1.0
+    //   age 50ms: 1.0
+    //   age 60ms: 0.5
+    int ageMilliseconds = (_movements[_index].eventTime - _movements[index].eventTime).inMilliseconds;
+    if (ageMilliseconds < 0)
+      return 0.5;
+    if (ageMilliseconds < 10)
+      return 0.5 + ageMilliseconds * 0.05;
+    if (ageMilliseconds < 50)
+      return 1.0;
+    if (ageMilliseconds < 60)
+      return 0.5 + (60 - ageMilliseconds) * 0.05;
+    return 0.5;
+  }
 
-      case _Weighting.weightingNone:
-      default:
-        return 1.0;
-    }
+  double _weightRecent(int index) {
+    // Weight points based on their age, weighing older points less.
+    //   age   0ms: 1.0
+    //   age  50ms: 1.0
+    //   age 100ms: 0.5
+    int ageMilliseconds = (_movements[_index].eventTime - _movements[index].eventTime).inMilliseconds;
+    if (ageMilliseconds < 50)
+      return 1.0;
+    if (ageMilliseconds < 100)
+      return 0.5 + (100 - ageMilliseconds) * 0.01;
+    return 0.5;
   }
 
   _Movement _getMovement(int i) {
-      _Movement result = _movements[i];
-      if (result == null) {
-        result = new _Movement();
-        _movements[i] = result;
-      }
-      return result;
+    _Movement result = _movements[i];
+    if (result == null) {
+      result = new _Movement();
+      _movements[i] = result;
+    }
+    return result;
   }
 
 }
@@ -209,24 +212,22 @@ class VelocityTracker {
   Duration _lastTimeStamp = const Duration();
   _VelocityTrackerStrategy _strategy;
 
-  void addPosition(Duration timeStamp, double x, double y) {
+  void addPosition(Duration timeStamp, Point position) {
     if ((timeStamp - _lastTimeStamp).inMilliseconds >= kAssumePointerMoveStoppedTimeMs)
       _strategy.clear();
     _lastTimeStamp = timeStamp;
-    _strategy.addMovement(timeStamp, x, y);
+    _strategy.addMovement(timeStamp, position);
   }
 
-  GestureVelocity getVelocity() {
+  Offset getVelocity() {
     _Estimator estimator = new _Estimator();
     if (_strategy.getEstimator(estimator) && estimator.degree >= 1) {
-      // convert from pixels/ms to pixels/s
-      return new GestureVelocity(
-        isValid: true,
-        x: estimator.xCoefficients[1] * 1000,
-        y: estimator.yCoefficients[1] * 1000
+      return new Offset( // convert from pixels/ms to pixels/s
+        estimator.xCoefficients[1] * 1000,
+        estimator.yCoefficients[1] * 1000
       );
     }
-    return new GestureVelocity(isValid: false, x: 0.0, y: 0.0);
+    return null;
   }
 
   static _VelocityTrackerStrategy _createStrategy() {
diff --git a/packages/flutter/lib/src/material/slider.dart b/packages/flutter/lib/src/material/slider.dart
index 9090195c1e3e9698860fd660f85dc77b6ac2e3b9..08c4e360691141816fd3974dc6fe506fb9b4f811 100644
--- a/packages/flutter/lib/src/material/slider.dart
+++ b/packages/flutter/lib/src/material/slider.dart
@@ -148,8 +148,8 @@ class _RenderSlider extends RenderConstrainedBox {
 
   bool hitTestSelf(Point position) => true;
 
-  void handleEvent(InputEvent event, BoxHitTestEntry entry) {
-    if (event.type == 'pointerdown' && onChanged != null)
+  void handleEvent(PointerEvent event, BoxHitTestEntry entry) {
+    if (event is PointerDownEvent && onChanged != null)
       _drag.addPointer(event);
   }
 
diff --git a/packages/flutter/lib/src/material/switch.dart b/packages/flutter/lib/src/material/switch.dart
index fccf4dfc7e90649e2fd47eacf847a442f0ef74f6..6f3a43b3feffc4b2e417657129c9b1c879e542bf 100644
--- a/packages/flutter/lib/src/material/switch.dart
+++ b/packages/flutter/lib/src/material/switch.dart
@@ -164,8 +164,8 @@ class _RenderSwitch extends RenderToggleable {
     reaction.reverse();
   }
 
-  void handleEvent(InputEvent event, BoxHitTestEntry entry) {
-    if (event.type == 'pointerdown' && onChanged != null)
+  void handleEvent(PointerEvent event, BoxHitTestEntry entry) {
+    if (event is PointerDownEvent && onChanged != null)
       _drag.addPointer(event);
     super.handleEvent(event, entry);
   }
diff --git a/packages/flutter/lib/src/material/toggleable.dart b/packages/flutter/lib/src/material/toggleable.dart
index cf0e635256d1d5fcb2057622483ec0ded65c8f30..4c829a93ba1cec99aaee8218fef7ceec176fb2f3 100644
--- a/packages/flutter/lib/src/material/toggleable.dart
+++ b/packages/flutter/lib/src/material/toggleable.dart
@@ -122,8 +122,8 @@ abstract class RenderToggleable extends RenderConstrainedBox {
 
   bool hitTestSelf(Point position) => true;
 
-  void handleEvent(InputEvent event, BoxHitTestEntry entry) {
-    if (event.type == 'pointerdown' && isInteractive)
+  void handleEvent(PointerEvent event, BoxHitTestEntry entry) {
+    if (event is PointerDownEvent && isInteractive)
       _tap.addPointer(event);
   }
 
diff --git a/packages/flutter/lib/src/rendering/binding.dart b/packages/flutter/lib/src/rendering/binding.dart
index 5d85db0d6728f359be058e949d77221c3cae6049..158ac28d2f6d62cb109195ed1eaa9ab93e95ede8 100644
--- a/packages/flutter/lib/src/rendering/binding.dart
+++ b/packages/flutter/lib/src/rendering/binding.dart
@@ -7,8 +7,8 @@ import 'dart:ui' as ui;
 
 import 'package:flutter/gestures.dart';
 import 'package:flutter/scheduler.dart';
-import 'package:mojo/bindings.dart' as bindings;
-import 'package:mojo/core.dart' as core;
+import 'package:mojo/bindings.dart' as mojo_bindings;
+import 'package:mojo/core.dart' as mojo_core;
 import 'package:sky_services/pointer/pointer.mojom.dart';
 
 import 'box.dart';
@@ -17,119 +17,180 @@ import 'hit_test.dart';
 import 'object.dart';
 import 'view.dart';
 
-typedef void EventListener(InputEvent event);
 typedef void MetricListener(Size size);
 
-int _hammingWeight(int value) {
-  if (value == 0)
-    return 0;
-  int weight = 0;
-  for (int i = 0; i < value.bitLength; ++i) {
-    if (value & (1 << i) != 0)
-      ++weight;
+class _PointerState {
+  _PointerState(this.lastPosition);
+
+  int get pointer => _pointer; // the identifier used in PointerEvent objects
+  int _pointer;
+  static int _pointerCount = 0;
+  void startNewPointer() {
+    _pointerCount += 1;
+    _pointer = _pointerCount;
+  }
+  
+  bool get down => _down;
+  bool _down = false;
+  void setDown() {
+    assert(!_down);
+    _down = true;
+  }
+  void setUp() {
+    assert(_down);
+    _down = false;
   }
-  return weight;
-}
 
-/// State used in converting PointerPackets to PointerInputEvents
-class _PointerState {
-  _PointerState({ this.pointer, this.lastPosition });
-  int pointer;
   Point lastPosition;
 }
 
 class _PointerEventConverter {
-  // Map actual input pointer value to a unique value
-  // Since events are serialized we can just use a counter
-  static Map<int, _PointerState> _stateForPointer = new Map<int, _PointerState>();
-  static int _pointerCount = 0;
-
-  static List<PointerInputEvent> convertPointerPacket(PointerPacket packet) {
-    return packet.pointers.map(_convertPointer).toList();
-  }
-
-  static PointerInputEvent _convertPointer(Pointer pointer) {
-    Point position = new Point(pointer.x, pointer.y);
-
-    _PointerState state = _stateForPointer[pointer.pointer];
-    double dx = 0.0;
-    double dy = 0.0;
-    String eventType;
-    switch (pointer.type) {
-      case PointerType.DOWN:
-        eventType = 'pointerdown';
-        if (state == null) {
-          state = new _PointerState(lastPosition: position);
-          _stateForPointer[pointer.pointer] = state;
-        }
-        state.pointer = _pointerCount;
-        _pointerCount++;
-        break;
-      case PointerType.MOVE:
-        eventType = 'pointermove';
-        // state == null means the pointer is hovering
-        if (state != null) {
-          dx = position.x - state.lastPosition.x;
-          dy = position.y - state.lastPosition.y;
+  // map from platform pointer identifiers to PointerEvent pointer identifiers
+  static Map<int, _PointerState> _pointers = <int, _PointerState>{};
+
+  static Iterable<PointerEvent> expand(Iterable<Pointer> packet) sync* {
+    for (Pointer datum in packet) {
+      Point position = new Point(datum.x, datum.y);
+      Duration timeStamp = new Duration(microseconds: datum.timeStamp);
+      assert(_pointerKindMap.containsKey(datum.kind));
+      PointerDeviceKind kind = _pointerKindMap[datum.kind];
+      switch (datum.type) {
+        case PointerType.DOWN:
+          _PointerState state = _pointers.putIfAbsent(
+            datum.pointer,
+            () => new _PointerState(position)
+          );
+          state.startNewPointer();
+          state.setDown();
+          yield new PointerAddedEvent(
+            timeStamp: timeStamp,
+            pointer: state.pointer,
+            kind: kind,
+            position: position,
+            obscured: datum.obscured,
+            pressureMin: datum.pressureMin,
+            pressureMax: datum.pressureMax,
+            distance: datum.distance,
+            distanceMax: datum.distanceMax,
+            radiusMin: datum.radiusMin,
+            radiusMax: datum.radiusMax,
+            orientation: datum.orientation,
+            tilt: datum.tilt
+          );
+          yield new PointerDownEvent(
+            timeStamp: timeStamp,
+            pointer: state.pointer,
+            kind: kind,
+            position: position,
+            obscured: datum.obscured,
+            pressure: datum.pressure,
+            pressureMin: datum.pressureMin,
+            pressureMax: datum.pressureMax,
+            distanceMax: datum.distanceMax,
+            radiusMajor: datum.radiusMajor,
+            radiusMinor: datum.radiusMajor,
+            radiusMin: datum.radiusMin,
+            radiusMax: datum.radiusMax,
+            orientation: datum.orientation,
+            tilt: datum.tilt
+          );
+          break;
+        case PointerType.MOVE:
+          _PointerState state = _pointers[datum.pointer];
+          // If the service starts supporting hover pointers, then it must
+          // also start sending us ADDED and REMOVED data points.
+          // In the meantime, we only support "down" moves.
+          // See also: https://github.com/flutter/flutter/issues/720
+          assert(state != null);
+          assert(state.down);
+          Offset offset = position - state.lastPosition;
           state.lastPosition = position;
-        }
-        break;
-      case PointerType.UP:
-      case PointerType.CANCEL:
-        eventType = (pointer.type == PointerType.UP) ? 'pointerup' : 'pointercancel';
-        // state == null indicates spurious events
-        if (state != null) {
-          // Only remove the pointer state when the last button has been released.
-          if (_hammingWeight(pointer.buttons) <= 1)
-            _stateForPointer.remove(pointer.pointer);
-        }
-        break;
+          yield new PointerMoveEvent(
+            timeStamp: timeStamp,
+            pointer: state.pointer,
+            kind: kind,
+            position: position,
+            delta: offset,
+            down: state.down,
+            obscured: datum.obscured,
+            pressure: datum.pressure,
+            pressureMin: datum.pressureMin,
+            pressureMax: datum.pressureMax,
+            distance: datum.distance,
+            distanceMax: datum.distanceMax,
+            radiusMajor: datum.radiusMajor,
+            radiusMinor: datum.radiusMajor,
+            radiusMin: datum.radiusMin,
+            radiusMax: datum.radiusMax,
+            orientation: datum.orientation,
+            tilt: datum.tilt
+          );
+          break;
+        case PointerType.UP:
+        case PointerType.CANCEL:
+          _PointerState state = _pointers[datum.pointer];
+          assert(state != null);
+          assert(position == state.lastPosition);
+          state.setUp();
+          if (datum.type == PointerType.UP) {
+            yield new PointerUpEvent(
+              timeStamp: timeStamp,
+              pointer: state.pointer,
+              kind: kind,
+              position: position,
+              obscured: datum.obscured,
+              pressureMax: datum.pressureMax,
+              distance: datum.distance,
+              distanceMax: datum.distanceMax,
+              radiusMin: datum.radiusMin,
+              radiusMax: datum.radiusMax,
+              orientation: datum.orientation,
+              tilt: datum.tilt
+            );
+          } else {
+            yield new PointerCancelEvent(
+              timeStamp: timeStamp,
+              pointer: state.pointer,
+              kind: kind,
+              position: position,
+              obscured: datum.obscured,
+              pressureMin: datum.pressureMin,
+              pressureMax: datum.pressureMax,
+              distance: datum.distance,
+              distanceMax: datum.distanceMax,
+              radiusMin: datum.radiusMin,
+              radiusMax: datum.radiusMax,
+              orientation: datum.orientation,
+              tilt: datum.tilt
+            );
+          }
+          yield new PointerRemovedEvent(
+            timeStamp: timeStamp,
+            pointer: state.pointer,
+            kind: kind,
+            obscured: datum.obscured,
+            pressureMin: datum.pressureMin,
+            pressureMax: datum.pressureMax,
+            distanceMax: datum.distanceMax,
+            radiusMin: datum.radiusMin,
+            radiusMax: datum.radiusMax
+          );
+          _pointers.remove(datum.pointer);
+          break;
+        default:
+          // TODO(ianh): once https://github.com/flutter/flutter/issues/720 is
+          // done, add real support for PointerAddedEvent and PointerRemovedEvent
+          assert(false);
+      }
     }
-
-    int pointerIndex = (state == null) ? pointer.pointer : state.pointer;
-
-    return new PointerInputEvent(
-       type: eventType,
-       timeStamp: new Duration(microseconds: pointer.timeStamp),
-       pointer: pointerIndex,
-       kind: _mapPointerKindToString(pointer.kind),
-       x: pointer.x,
-       y: pointer.y,
-       dx: dx,
-       dy: dy,
-       buttons: pointer.buttons,
-       down: pointer.down,
-       primary: pointer.primary,
-       obscured: pointer.obscured,
-       pressure: pointer.pressure,
-       pressureMin: pointer.pressureMin,
-       pressureMax: pointer.pressureMax,
-       distance: pointer.distance,
-       distanceMin: pointer.distanceMin,
-       distanceMax: pointer.distanceMax,
-       radiusMajor: pointer.radiusMajor,
-       radiusMinor: pointer.radiusMinor,
-       radiusMin: pointer.radiusMin,
-       radiusMax: pointer.radiusMax,
-       orientation: pointer.orientation,
-       tilt: pointer.tilt
-     );
   }
 
-  static String _mapPointerKindToString(PointerKind kind) {
-    switch (kind) {
-      case PointerKind.TOUCH:
-        return 'touch';
-      case PointerKind.MOUSE:
-        return 'mouse';
-      case PointerKind.STYLUS:
-        return 'stylus';
-      case PointerKind.INVERTED_STYLUS:
-        return 'invertedStylus';
-    }
-    assert(false);
-    return '';
-  }
+  static const Map<PointerKind, PointerDeviceKind> _pointerKindMap = const <PointerKind, PointerDeviceKind>{
+    PointerKind.TOUCH: PointerDeviceKind.touch,
+    PointerKind.MOUSE: PointerDeviceKind.mouse,
+    PointerKind.STYLUS: PointerDeviceKind.stylus,
+    PointerKind.INVERTED_STYLUS: PointerDeviceKind.invertedStylus,
+  };
 }
 
 class BindingObserver {
@@ -202,53 +263,40 @@ class FlutterBinding extends HitTestTarget {
   }
 
   void _handlePointerPacket(ByteData serializedPacket) {
-    bindings.Message message = new bindings.Message(
-        serializedPacket,
-        <core.MojoHandle>[],
-        serializedPacket.lengthInBytes,
-        0);
-    PointerPacket packet = PointerPacket.deserialize(message);
-    for (PointerInputEvent event in _PointerEventConverter.convertPointerPacket(packet)) {
-      _handlePointerInputEvent(event);
-    }
+    final mojo_bindings.Message message = new mojo_bindings.Message(
+      serializedPacket,
+      <mojo_core.MojoHandle>[],
+      serializedPacket.lengthInBytes,
+      0
+    );
+    final PointerPacket packet = PointerPacket.deserialize(message);
+    for (PointerEvent event in _PointerEventConverter.expand(packet.pointers))
+      _handlePointerEvent(event);
   }
 
   /// A router that routes all pointer events received from the engine
   final PointerRouter pointerRouter = new PointerRouter();
 
   /// State for all pointers which are currently down.
-  /// We do not track the state of hovering pointers because we need
-  /// to hit-test them on each movement.
-  Map<int, HitTestResult> _resultForPointer = new Map<int, HitTestResult>();
-
-  void _handlePointerInputEvent(PointerInputEvent event) {
-    HitTestResult result = _resultForPointer[event.pointer];
-    switch (event.type) {
-      case 'pointerdown':
-        if (result == null) {
-          result = hitTest(new Point(event.x, event.y));
-          _resultForPointer[event.pointer] = result;
-        }
-        break;
-      case 'pointermove':
-        if (result == null) {
-          // The pointer is hovering, ignore it for now since we don't
-          // know what to do with it yet.
-          return;
-        }
-        break;
-      case 'pointerup':
-      case 'pointercancel':
-        if (result == null) {
-          // This seems to be a spurious event.  Ignore it.
-          return;
-        }
-        // Only remove the hit test result when the last button has been released.
-        if (_hammingWeight(event.buttons) <= 1)
-          _resultForPointer.remove(event.pointer);
-        break;
+  /// The state of hovering pointers is not tracked because that would require
+  /// hit-testing on every fram.e
+  Map<int, HitTestResult> _hitTests = <int, HitTestResult>{};
+
+  void _handlePointerEvent(PointerEvent event) {
+    if (event is PointerDownEvent) {
+      assert(!_hitTests.containsKey(event.pointer));
+      _hitTests[event.pointer] = hitTest(event.position);
+    } else if (event is! PointerUpEvent) {
+      assert(event.down == _hitTests.containsKey(event.pointer));
+      if (!event.down)
+        return; // we currently ignore add, remove, and hover move events
+    }
+    assert(_hitTests[event.pointer] != null);
+    dispatchEvent(event, _hitTests[event.pointer]);
+    if (event is PointerUpEvent) {
+      assert(_hitTests.containsKey(event.pointer));
+      _hitTests.remove(event.pointer);
     }
-    dispatchEvent(event, result);
   }
 
   /// Determine which [HitTestTarget] objects are located at a given position
@@ -260,20 +308,18 @@ class FlutterBinding extends HitTestTarget {
   }
 
   /// Dispatch the given event to the path of the given hit test result
-  void dispatchEvent(InputEvent event, HitTestResult result) {
+  void dispatchEvent(PointerEvent event, HitTestResult result) {
     assert(result != null);
     for (HitTestEntry entry in result.path)
       entry.target.handleEvent(event, entry);
   }
 
-  void handleEvent(InputEvent e, HitTestEntry entry) {
-    if (e is PointerInputEvent) {
-      PointerInputEvent event = e;
-      pointerRouter.route(event);
-      if (event.type == 'pointerdown')
-        GestureArena.instance.close(event.pointer);
-      else if (event.type == 'pointerup')
-        GestureArena.instance.sweep(event.pointer);
+  void handleEvent(PointerEvent event, HitTestEntry entry) {
+    pointerRouter.route(event);
+    if (event is PointerDownEvent) {
+      GestureArena.instance.close(event.pointer);
+    } else if (event is PointerUpEvent) {
+      GestureArena.instance.sweep(event.pointer);
     }
   }
 }
diff --git a/packages/flutter/lib/src/rendering/box.dart b/packages/flutter/lib/src/rendering/box.dart
index 0af049c108d53c0be3862fd84018428a7c6e5690..372b1231a523a0b9d49e84d2383fdba9ee443e1a 100644
--- a/packages/flutter/lib/src/rendering/box.dart
+++ b/packages/flutter/lib/src/rendering/box.dart
@@ -636,14 +636,15 @@ abstract class RenderBox extends RenderObject {
   Rect get paintBounds => Point.origin & size;
 
   int _debugActivePointers = 0;
-  void handleEvent(InputEvent event, HitTestEntry entry) {
+  void handleEvent(PointerEvent event, HitTestEntry entry) {
     super.handleEvent(event, entry);
     assert(() {
       if (debugPaintPointersEnabled) {
-        if (event.type == 'pointerdown')
+        if (event is PointerDownEvent) {
           _debugActivePointers += 1;
-        if (event.type == 'pointerup' || event.type == 'pointercancel')
+        } else if (event is PointerUpEvent || event is PointerCancelEvent) {
           _debugActivePointers -= 1;
+        }
         markNeedsPaint();
       }
       return true;
diff --git a/packages/flutter/lib/src/rendering/hit_test.dart b/packages/flutter/lib/src/rendering/hit_test.dart
index 5230983a4375e6e2b5cc7d31d164745f5530fb28..88aef26a3cb1968d1b8c5b5af5456b91d04770a1 100644
--- a/packages/flutter/lib/src/rendering/hit_test.dart
+++ b/packages/flutter/lib/src/rendering/hit_test.dart
@@ -7,7 +7,7 @@ import 'package:flutter/gestures.dart';
 /// An object that can handle events.
 abstract class HitTestTarget {
   /// Override this function to receive events.
-  void handleEvent(InputEvent event, HitTestEntry entry);
+  void handleEvent(PointerEvent event, HitTestEntry entry);
 }
 
 /// Data collected during a hit test about a specific [HitTestTarget].
diff --git a/packages/flutter/lib/src/rendering/object.dart b/packages/flutter/lib/src/rendering/object.dart
index cbcec3728c6c4c89e6c73ec57ccb9f3659afb269..9a229c7c42c69add9893a8e7140055407102ec36 100644
--- a/packages/flutter/lib/src/rendering/object.dart
+++ b/packages/flutter/lib/src/rendering/object.dart
@@ -1045,8 +1045,8 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget {
 
   // EVENTS
 
-  /// Override this function to handle events that hit this render object
-  void handleEvent(InputEvent event, HitTestEntry entry) { }
+  /// Override this function to handle pointer events that hit this render object.
+  void handleEvent(PointerEvent event, HitTestEntry entry) { }
 
 
   // HIT TESTING
diff --git a/packages/flutter/lib/src/rendering/proxy_box.dart b/packages/flutter/lib/src/rendering/proxy_box.dart
index cb87e58c6d3a2945b742368458619e7d9299e84b..20209d78aeb8c427a08c000da7ef70cd8df9e477 100644
--- a/packages/flutter/lib/src/rendering/proxy_box.dart
+++ b/packages/flutter/lib/src/rendering/proxy_box.dart
@@ -1072,7 +1072,10 @@ class RenderCustomPaint extends RenderProxyBox {
   }
 }
 
-typedef void PointerEventListener(PointerInputEvent event);
+typedef void PointerDownEventListener(PointerDownEvent event);
+typedef void PointerMoveEventListener(PointerMoveEvent event);
+typedef void PointerUpEventListener(PointerUpEvent event);
+typedef void PointerCancelEventListener(PointerCancelEvent event);
 
 enum HitTestBehavior {
   deferToChild,
@@ -1091,10 +1094,10 @@ class RenderPointerListener extends RenderProxyBox {
     RenderBox child
   }) : super(child);
 
-  PointerEventListener onPointerDown;
-  PointerEventListener onPointerMove;
-  PointerEventListener onPointerUp;
-  PointerEventListener onPointerCancel;
+  PointerDownEventListener onPointerDown;
+  PointerMoveEventListener onPointerMove;
+  PointerUpEventListener onPointerUp;
+  PointerCancelEventListener onPointerCancel;
   HitTestBehavior behavior;
 
   bool hitTest(HitTestResult result, { Point position }) {
@@ -1110,14 +1113,14 @@ class RenderPointerListener extends RenderProxyBox {
 
   bool hitTestSelf(Point position) => behavior == HitTestBehavior.opaque;
 
-  void handleEvent(InputEvent event, HitTestEntry entry) {
-    if (onPointerDown != null && event.type == 'pointerdown')
+  void handleEvent(PointerEvent event, HitTestEntry entry) {
+    if (onPointerDown != null && event is PointerDownEvent)
       return onPointerDown(event);
-    if (onPointerMove != null && event.type == 'pointermove')
+    if (onPointerMove != null && event == PointerMoveEvent)
       return onPointerMove(event);
-    if (onPointerUp != null && event.type == 'pointerup')
+    if (onPointerUp != null && event == PointerUpEvent)
       return onPointerUp(event);
-    if (onPointerCancel != null && event.type == 'pointercancel')
+    if (onPointerCancel != null && event == PointerCancelEvent)
       return onPointerCancel(event);
   }
 
diff --git a/packages/flutter/lib/src/widgets/basic.dart b/packages/flutter/lib/src/widgets/basic.dart
index ee46a0e60ff212f97cf6f75457866d671d666876..d4f047e9cf15164adba800fc722d3c0e8b5129b3 100644
--- a/packages/flutter/lib/src/widgets/basic.dart
+++ b/packages/flutter/lib/src/widgets/basic.dart
@@ -1299,10 +1299,10 @@ class Listener extends OneChildRenderObjectWidget {
     assert(behavior != null);
   }
 
-  final PointerEventListener onPointerDown;
-  final PointerEventListener onPointerMove;
-  final PointerEventListener onPointerUp;
-  final PointerEventListener onPointerCancel;
+  final PointerDownEventListener onPointerDown;
+  final PointerMoveEventListener onPointerMove;
+  final PointerUpEventListener onPointerUp;
+  final PointerCancelEventListener onPointerCancel;
   final HitTestBehavior behavior;
 
   RenderPointerListener createRenderObject() => new RenderPointerListener(
diff --git a/packages/flutter/lib/src/widgets/drag_target.dart b/packages/flutter/lib/src/widgets/drag_target.dart
index 817b7bf3e9ab04e973a1b7cb48fe9ca9aabc6fae..6c9e56e915cdaffad41c41d552bbb1dcf7d9aed4 100644
--- a/packages/flutter/lib/src/widgets/drag_target.dart
+++ b/packages/flutter/lib/src/widgets/drag_target.dart
@@ -135,7 +135,7 @@ class _DraggableState<T> extends State<DraggableBase<T>> implements GestureArena
   GestureRecognizer _recognizer;
   Map<int, GestureArenaEntry> _activePointers = <int, GestureArenaEntry>{};
 
-  void _routePointer(PointerInputEvent event) {
+  void _routePointer(PointerEvent event) {
     _activePointers[event.pointer] = GestureArena.instance.add(event.pointer, this);
     _recognizer.addPointer(event);
   }
@@ -284,18 +284,14 @@ class _DragAvatar<T> {
   Offset _lastOffset;
   OverlayEntry _entry;
 
-  void handleEvent(PointerInputEvent event) {
-    switch(event.type) {
-      case 'pointerup':
-        update(event.position);
-        finish(_DragEndKind.dropped);
-        break;
-      case 'pointercancel':
-        finish(_DragEndKind.canceled);
-        break;
-      case 'pointermove':
-        update(event.position);
-        break;
+  void handleEvent(PointerEvent event) {
+    if (event is PointerUpEvent) {
+      update(event.position);
+      finish(_DragEndKind.dropped);
+    } else if (event is PointerCancelEvent) {
+      finish(_DragEndKind.canceled);
+    } else if (event is PointerMoveEvent) {
+      update(event.position);
     }
   }
 
diff --git a/packages/flutter/lib/src/widgets/event_recorder.dart b/packages/flutter/lib/src/widgets/event_recorder.dart
index c5f82a2d3a9df7b9689b0b2d879318d92ccb436a..f22404318361a84342f61afbcab18d3a8f9d92f3 100644
--- a/packages/flutter/lib/src/widgets/event_recorder.dart
+++ b/packages/flutter/lib/src/widgets/event_recorder.dart
@@ -3,7 +3,6 @@
 // found in the LICENSE file.
 
 import 'package:flutter/gestures.dart';
-import 'package:flutter/rendering.dart';
 
 import 'basic.dart';
 import 'framework.dart';
@@ -13,7 +12,7 @@ enum EventRecorderMode {
   record
 }
 
-typedef void EventsReadyCallback(List<PointerInputEvent> events);
+typedef void EventsReadyCallback(Iterable<PointerEvent> events);
 
 /// EventRecorder is a utility widget that allows input events occurring
 /// on the child to be recorded. The widget is initially in the "stop" state
@@ -38,11 +37,7 @@ class EventRecorder extends StatefulComponent {
 
 class _EventRecorderState extends State<EventRecorder> {
 
-  List<PointerInputEvent> _events = new List<PointerInputEvent>();
-
-  void initState() {
-    super.initState();
-  }
+  final List<PointerEvent> _events = <PointerEvent>[];
 
   void didUpdateConfig(EventRecorder oldConfig) {
     if (oldConfig.mode == EventRecorderMode.record &&
@@ -52,10 +47,9 @@ class _EventRecorderState extends State<EventRecorder> {
     }
   }
 
-  void _recordEvent(PointerInputEvent event) {
-    if (config.mode == EventRecorderMode.record) {
+  void _recordEvent(PointerEvent event) {
+    if (config.mode == EventRecorderMode.record)
       _events.add(event);
-    }
   }
 
   Widget build(BuildContext context) {
diff --git a/packages/flutter/lib/src/widgets/gesture_detector.dart b/packages/flutter/lib/src/widgets/gesture_detector.dart
index e034096596429968b17702129f92be7b9f0c0907..ffef817e0767528d343039d92f503eb97efbb8df 100644
--- a/packages/flutter/lib/src/widgets/gesture_detector.dart
+++ b/packages/flutter/lib/src/widgets/gesture_detector.dart
@@ -210,7 +210,7 @@ class _GestureDetectorState extends State<GestureDetector> {
     return null;
   }
 
-  void _handlePointerDown(PointerInputEvent event) {
+  void _handlePointerDown(PointerDownEvent event) {
     if (_tap != null)
       _tap.addPointer(event);
     if (_doubleTap != null)
diff --git a/packages/flutter_test/lib/src/test_pointer.dart b/packages/flutter_test/lib/src/test_pointer.dart
index 49ed7679863219bb646409032eb69e857eb60267..ae254b4a0ed71221dc689d1031686da588728d90 100644
--- a/packages/flutter_test/lib/src/test_pointer.dart
+++ b/packages/flutter_test/lib/src/test_pointer.dart
@@ -2,8 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'dart:ui' as ui;
-
 import 'package:flutter/gestures.dart';
 
 export 'dart:ui' show Point;
@@ -13,57 +11,48 @@ class TestPointer {
 
   int pointer;
   bool isDown = false;
-  ui.Point location;
+  Point location;
 
-  PointerInputEvent down(ui.Point newLocation, { Duration timeStamp: const Duration() }) {
+  PointerDownEvent down(Point newLocation, { Duration timeStamp: const Duration() }) {
     assert(!isDown);
     isDown = true;
     location = newLocation;
-    return new PointerInputEvent(
-      type: 'pointerdown',
+      return new PointerDownEvent(
+      timeStamp: timeStamp,
       pointer: pointer,
-      x: location.x,
-      y: location.y,
-      timeStamp: timeStamp
+      position: location
     );
   }
 
-  PointerInputEvent move(ui.Point newLocation, { Duration timeStamp: const Duration() }) {
+  PointerMoveEvent move(Point newLocation, { Duration timeStamp: const Duration() }) {
     assert(isDown);
-    ui.Offset delta = newLocation - location;
+    Offset delta = newLocation - location;
     location = newLocation;
-    return new PointerInputEvent(
-      type: 'pointermove',
+    return new PointerMoveEvent(
+      timeStamp: timeStamp,
       pointer: pointer,
-      x: newLocation.x,
-      y: newLocation.y,
-      dx: delta.dx,
-      dy: delta.dy,
-      timeStamp: timeStamp
+      position: newLocation,
+      delta: delta
     );
   }
 
-  PointerInputEvent up({ Duration timeStamp: const Duration() }) {
+  PointerUpEvent up({ Duration timeStamp: const Duration() }) {
     assert(isDown);
     isDown = false;
-    return new PointerInputEvent(
-      type: 'pointerup',
+    return new PointerUpEvent(
+      timeStamp: timeStamp,
       pointer: pointer,
-      x: location.x,
-      y: location.y,
-      timeStamp: timeStamp
+      position: location
     );
   }
 
-  PointerInputEvent cancel({ Duration timeStamp: const Duration() }) {
+  PointerCancelEvent cancel({ Duration timeStamp: const Duration() }) {
     assert(isDown);
     isDown = false;
-    return new PointerInputEvent(
-      type: 'pointercancel',
+    return new PointerCancelEvent(
+      timeStamp: timeStamp,
       pointer: pointer,
-      x: location.x,
-      y: location.y,
-      timeStamp: timeStamp
+      position: location
     );
   }
 
diff --git a/packages/flutter_test/lib/src/widget_tester.dart b/packages/flutter_test/lib/src/widget_tester.dart
index 9baceaa94b651c1d77790ba04823b2bb0b5d53ee..612a94400bf333960c25a8f0dac859cc32e9644b 100644
--- a/packages/flutter_test/lib/src/widget_tester.dart
+++ b/packages/flutter_test/lib/src/widget_tester.dart
@@ -174,13 +174,13 @@ class WidgetTester {
     _dispatchEvent(p.up(), result);
   }
 
-  void dispatchEvent(InputEvent event, Point location) {
+  void dispatchEvent(PointerEvent event, Point location) {
     _dispatchEvent(event, _hitTest(location));
   }
 
   HitTestResult _hitTest(Point location) => WidgetFlutterBinding.instance.hitTest(location);
 
-  void _dispatchEvent(InputEvent event, HitTestResult result) {
+  void _dispatchEvent(PointerEvent event, HitTestResult result) {
     WidgetFlutterBinding.instance.dispatchEvent(event, result);
   }
 
diff --git a/packages/unit/benchmark/README.md b/packages/unit/benchmark/README.md
index c1346785f48a2f71596cf863b07fc87ce5748b2c..f676a21e04f97ab9a6d6a739e44c02dfb3e2ac45 100644
--- a/packages/unit/benchmark/README.md
+++ b/packages/unit/benchmark/README.md
@@ -1,16 +1,18 @@
 # Benchmarks
 
-This directory (and its sub-directories) contain benchmarks for Flutter.
-The reporting format for benchmarks is not standardized yet, so benchmarks
-here are typically run by hand. To run a benchmark:
+This directory (and its sub-directories) contain benchmarks for
+Flutter. The reporting format for benchmarks is not standardized yet,
+so benchmarks here are typically run by hand. To run a benchmark:
 
 1. Build `sky_shell` for Linux Release using the instructions in the
    [Engine repository](https://github.com/flutter/engine).
 
 2. Run `pub get` in the `packages/unit` directory.
 
-3. Run the benchmark:
+3. Run the benchmarks by running the following command from the root
+   of the flutter repository (replacing `stocks/layout_bench.dart`
+   with the path to whichever benchmark you want to run):
 
 ```
-/path/to/engine/src/out/Release/sky_shell packages/unit/benchmark/stocks/layout_bench.dart --package-root=packages/unit/package
+/path/to/engine/src/out/Release/sky_shell packages/unit/benchmark/stocks/layout_bench.dart --package-root=packages/unit/packages
 ```
diff --git a/packages/unit/benchmark/gestures/velocity_tracker_bench.dart b/packages/unit/benchmark/gestures/velocity_tracker_bench.dart
index 94c6a15ca3850e61de3cf6f49c39259acea5f216..e190c44b644da1eba9f8e824c1288cb1df8d0989 100644
--- a/packages/unit/benchmark/gestures/velocity_tracker_bench.dart
+++ b/packages/unit/benchmark/gestures/velocity_tracker_bench.dart
@@ -1,3 +1,7 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
 import 'package:flutter/gestures.dart';
 import 'package:test/test.dart';
 import 'velocity_tracker_data.dart';
@@ -7,36 +11,16 @@ const int kBatchSize = 1000;
 const int kBatchOffset = 50;
 const int kNumMarks = 130;
 
-List<PointerInputEvent> _eventFromMap(List<Map> intermediate) {
-  List<PointerInputEvent> events = new List<PointerInputEvent>();
-  for (Map entry in intermediate)
-    events.add(_eventFor(entry));
-  return events;
-}
-
-PointerInputEvent _eventFor(Map entry) {
-  PointerInputEvent result = new PointerInputEvent(
-    type: entry['type'],
-    timeStamp: entry['timeStamp'],
-    pointer: entry['pointer'],
-    x: entry['x'],
-    y: entry['y']
-  );
-  return result;
-}
-
 void main() {
-  List<PointerInputEvent> events = _eventFromMap(velocityEventData);
-
   test('Dart velocity tracker performance', () {
     VelocityTracker tracker = new VelocityTracker();
     Stopwatch watch = new Stopwatch();
     watch.start();
     for (int i = 0; i < kNumIters; i++) {
-      for (PointerInputEvent event in events) {
-        if (event.type == 'pointerdown' || event.type == 'pointermove')
-          tracker.addPosition(event.timeStamp, event.x, event.y);
-        if (event.type == 'pointerup')
+      for (PointerEvent event in velocityEventData) {
+        if (event is PointerDownEvent || event is PointerMoveEvent)
+          tracker.addPosition(event.timeStamp, event.position);
+        if (event is PointerUpEvent)
           tracker.getVelocity();
       }
     }
diff --git a/packages/unit/benchmark/gestures/velocity_tracker_data.dart b/packages/unit/benchmark/gestures/velocity_tracker_data.dart
index baa6c14166f9e5f92c8fa1a3115a609c55524820..9b5618565056776aa162a81a1b00ada433e1b6c3 100644
--- a/packages/unit/benchmark/gestures/velocity_tracker_data.dart
+++ b/packages/unit/benchmark/gestures/velocity_tracker_data.dart
@@ -1,2144 +1,1534 @@
-final List<Map> velocityEventData = [
-  {
-    "type":"pointerdown",
-    "timeStamp":216690896.0,
-    "pointer":1,
-    "x":270.0,
-    "y":538.2857055664062
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216690906.0,
-    "pointer":1,
-    "x":270.0,
-    "y":538.2857055664062
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216690951.0,
-    "pointer":1,
-    "x":270.0,
-    "y":530.8571166992188
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216690959.0,
-    "pointer":1,
-    "x":270.0,
-    "y":526.8571166992188
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216690967.0,
-    "pointer":1,
-    "x":270.0,
-    "y":521.4285888671875
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216690975.0,
-    "pointer":1,
-    "x":270.0,
-    "y":515.4285888671875
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216690983.0,
-    "pointer":1,
-    "x":270.0,
-    "y":506.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216690991.0,
-    "pointer":1,
-    "x":268.8571472167969,
-    "y":496.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216690998.0,
-    "pointer":1,
-    "x":267.4285583496094,
-    "y":483.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691006.0,
-    "pointer":1,
-    "x":266.28570556640625,
-    "y":469.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691014.0,
-    "pointer":1,
-    "x":265.4285583496094,
-    "y":456.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691021.0,
-    "pointer":1,
-    "x":264.28570556640625,
-    "y":443.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691029.0,
-    "pointer":1,
-    "x":264.0,
-    "y":431.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691036.0,
-    "pointer":1,
-    "x":263.4285583496094,
-    "y":421.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691044.0,
-    "pointer":1,
-    "x":263.4285583496094,
-    "y":412.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691052.0,
-    "pointer":1,
-    "x":263.4285583496094,
-    "y":404.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691060.0,
-    "pointer":1,
-    "x":263.4285583496094,
-    "y":396.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691068.0,
-    "pointer":1,
-    "x":264.5714416503906,
-    "y":390.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691075.0,
-    "pointer":1,
-    "x":265.1428527832031,
-    "y":384.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691083.0,
-    "pointer":1,
-    "x":266.0,
-    "y":380.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691091.0,
-    "pointer":1,
-    "x":266.5714416503906,
-    "y":376.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691098.0,
-    "pointer":1,
-    "x":267.1428527832031,
-    "y":373.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691106.0,
-    "pointer":1,
-    "x":267.71429443359375,
-    "y":370.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691114.0,
-    "pointer":1,
-    "x":268.28570556640625,
-    "y":367.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691121.0,
-    "pointer":1,
-    "x":268.5714416503906,
-    "y":366.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691130.0,
-    "pointer":1,
-    "x":268.8571472167969,
-    "y":364.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691137.0,
-    "pointer":1,
-    "x":269.1428527832031,
-    "y":363.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691145.0,
-    "pointer":1,
-    "x":269.1428527832031,
-    "y":362.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691153.0,
-    "pointer":1,
-    "x":269.4285583496094,
-    "y":362.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691168.0,
-    "pointer":1,
-    "x":268.5714416503906,
-    "y":365.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691176.0,
-    "pointer":1,
-    "x":267.1428527832031,
-    "y":370.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691183.0,
-    "pointer":1,
-    "x":265.4285583496094,
-    "y":376.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691191.0,
-    "pointer":1,
-    "x":263.1428527832031,
-    "y":385.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691199.0,
-    "pointer":1,
-    "x":261.4285583496094,
-    "y":396.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691207.0,
-    "pointer":1,
-    "x":259.71429443359375,
-    "y":408.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691215.0,
-    "pointer":1,
-    "x":258.28570556640625,
-    "y":419.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691222.0,
-    "pointer":1,
-    "x":257.4285583496094,
-    "y":428.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691230.0,
-    "pointer":1,
-    "x":256.28570556640625,
-    "y":436.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691238.0,
-    "pointer":1,
-    "x":255.7142791748047,
-    "y":442.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691245.0,
-    "pointer":1,
-    "x":255.14285278320312,
-    "y":447.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691253.0,
-    "pointer":1,
-    "x":254.85714721679688,
-    "y":453.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691261.0,
-    "pointer":1,
-    "x":254.57142639160156,
-    "y":458.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691268.0,
-    "pointer":1,
-    "x":254.2857208251953,
-    "y":463.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691276.0,
-    "pointer":1,
-    "x":254.2857208251953,
-    "y":470.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691284.0,
-    "pointer":1,
-    "x":254.2857208251953,
-    "y":477.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691292.0,
-    "pointer":1,
-    "x":255.7142791748047,
-    "y":487.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691300.0,
-    "pointer":1,
-    "x":256.8571472167969,
-    "y":498.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691307.0,
-    "pointer":1,
-    "x":258.28570556640625,
-    "y":507.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691315.0,
-    "pointer":1,
-    "x":259.4285583496094,
-    "y":516.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691323.0,
-    "pointer":1,
-    "x":260.28570556640625,
-    "y":521.7142944335938
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216691338.0,
-    "pointer":1,
-    "x":260.28570556640625,
-    "y":521.7142944335938
-  },
-  {
-    "type":"pointerdown",
-    "timeStamp":216691573.0,
-    "pointer":2,
-    "x":266.0,
-    "y":327.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691588.0,
-    "pointer":2,
-    "x":266.0,
-    "y":327.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691626.0,
-    "pointer":2,
-    "x":261.1428527832031,
-    "y":337.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691634.0,
-    "pointer":2,
-    "x":258.28570556640625,
-    "y":343.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691642.0,
-    "pointer":2,
-    "x":254.57142639160156,
-    "y":354.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691650.0,
-    "pointer":2,
-    "x":250.2857208251953,
-    "y":368.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691657.0,
-    "pointer":2,
-    "x":247.42857360839844,
-    "y":382.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691665.0,
-    "pointer":2,
-    "x":245.14285278320312,
-    "y":397.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691673.0,
-    "pointer":2,
-    "x":243.14285278320312,
-    "y":411.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691680.0,
-    "pointer":2,
-    "x":242.2857208251953,
-    "y":426.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691688.0,
-    "pointer":2,
-    "x":241.7142791748047,
-    "y":440.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691696.0,
-    "pointer":2,
-    "x":241.7142791748047,
-    "y":454.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691703.0,
-    "pointer":2,
-    "x":242.57142639160156,
-    "y":467.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691712.0,
-    "pointer":2,
-    "x":243.42857360839844,
-    "y":477.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691720.0,
-    "pointer":2,
-    "x":244.85714721679688,
-    "y":485.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691727.0,
-    "pointer":2,
-    "x":246.2857208251953,
-    "y":493.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691735.0,
-    "pointer":2,
-    "x":248.0,
-    "y":499.71429443359375
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216691750.0,
-    "pointer":2,
-    "x":248.0,
-    "y":499.71429443359375
-  },
-  {
-    "type":"pointerdown",
-    "timeStamp":216692255.0,
-    "pointer":3,
-    "x":249.42857360839844,
-    "y":351.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692270.0,
-    "pointer":3,
-    "x":249.42857360839844,
-    "y":351.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692309.0,
-    "pointer":3,
-    "x":246.2857208251953,
-    "y":361.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692317.0,
-    "pointer":3,
-    "x":244.0,
-    "y":368.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692325.0,
-    "pointer":3,
-    "x":241.42857360839844,
-    "y":377.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692333.0,
-    "pointer":3,
-    "x":237.7142791748047,
-    "y":391.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692340.0,
-    "pointer":3,
-    "x":235.14285278320312,
-    "y":406.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692348.0,
-    "pointer":3,
-    "x":232.57142639160156,
-    "y":421.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692356.0,
-    "pointer":3,
-    "x":230.2857208251953,
-    "y":436.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692363.0,
-    "pointer":3,
-    "x":228.2857208251953,
-    "y":451.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692371.0,
-    "pointer":3,
-    "x":227.42857360839844,
-    "y":466.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692378.0,
-    "pointer":3,
-    "x":226.2857208251953,
-    "y":479.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692387.0,
-    "pointer":3,
-    "x":225.7142791748047,
-    "y":491.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692395.0,
-    "pointer":3,
-    "x":225.14285278320312,
-    "y":501.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692402.0,
-    "pointer":3,
-    "x":224.85714721679688,
-    "y":509.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692410.0,
-    "pointer":3,
-    "x":224.57142639160156,
-    "y":514.8571166992188
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692418.0,
-    "pointer":3,
-    "x":224.2857208251953,
-    "y":519.4285888671875
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692425.0,
-    "pointer":3,
-    "x":224.0,
-    "y":523.4285888671875
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692433.0,
-    "pointer":3,
-    "x":224.0,
-    "y":527.1428833007812
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692441.0,
-    "pointer":3,
-    "x":224.0,
-    "y":530.5714111328125
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692448.0,
-    "pointer":3,
-    "x":224.0,
-    "y":533.1428833007812
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692456.0,
-    "pointer":3,
-    "x":224.0,
-    "y":535.4285888671875
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692464.0,
-    "pointer":3,
-    "x":223.7142791748047,
-    "y":536.8571166992188
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692472.0,
-    "pointer":3,
-    "x":223.7142791748047,
-    "y":538.2857055664062
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216692487.0,
-    "pointer":3,
-    "x":223.7142791748047,
-    "y":538.2857055664062
-  },
-  {
-    "type":"pointerdown",
-    "timeStamp":216692678.0,
-    "pointer":4,
-    "x":221.42857360839844,
-    "y":526.2857055664062
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692701.0,
-    "pointer":4,
-    "x":220.57142639160156,
-    "y":514.8571166992188
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692708.0,
-    "pointer":4,
-    "x":220.2857208251953,
-    "y":508.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692716.0,
-    "pointer":4,
-    "x":220.2857208251953,
-    "y":498.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692724.0,
-    "pointer":4,
-    "x":221.14285278320312,
-    "y":484.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692732.0,
-    "pointer":4,
-    "x":221.7142791748047,
-    "y":469.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692740.0,
-    "pointer":4,
-    "x":223.42857360839844,
-    "y":453.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692748.0,
-    "pointer":4,
-    "x":225.7142791748047,
-    "y":436.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692755.0,
-    "pointer":4,
-    "x":229.14285278320312,
-    "y":418.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692763.0,
-    "pointer":4,
-    "x":232.85714721679688,
-    "y":400.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692770.0,
-    "pointer":4,
-    "x":236.85714721679688,
-    "y":382.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692778.0,
-    "pointer":4,
-    "x":241.14285278320312,
-    "y":366.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692786.0,
-    "pointer":4,
-    "x":244.85714721679688,
-    "y":350.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692793.0,
-    "pointer":4,
-    "x":249.14285278320312,
-    "y":335.4285583496094
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216692809.0,
-    "pointer":4,
-    "x":249.14285278320312,
-    "y":335.4285583496094
-  },
-  {
-    "type":"pointerdown",
-    "timeStamp":216693222.0,
-    "pointer":5,
-    "x":224.0,
-    "y":545.4285888671875
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216693245.0,
-    "pointer":5,
-    "x":224.0,
-    "y":545.4285888671875
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216693275.0,
-    "pointer":5,
-    "x":222.85714721679688,
-    "y":535.1428833007812
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216693284.0,
-    "pointer":5,
-    "x":222.85714721679688,
-    "y":528.8571166992188
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216693291.0,
-    "pointer":5,
-    "x":222.2857208251953,
-    "y":518.5714111328125
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216693299.0,
-    "pointer":5,
-    "x":222.0,
-    "y":503.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216693307.0,
-    "pointer":5,
-    "x":222.0,
-    "y":485.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216693314.0,
-    "pointer":5,
-    "x":221.7142791748047,
-    "y":464.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216693322.0,
-    "pointer":5,
-    "x":222.2857208251953,
-    "y":440.28570556640625
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216693337.0,
-    "pointer":5,
-    "x":222.2857208251953,
-    "y":440.28570556640625
-  },
-  {
-    "type":"pointerdown",
-    "timeStamp":216693985.0,
-    "pointer":6,
-    "x":208.0,
-    "y":544.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694047.0,
-    "pointer":6,
-    "x":208.57142639160156,
-    "y":532.2857055664062
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694054.0,
-    "pointer":6,
-    "x":208.85714721679688,
-    "y":525.7142944335938
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694062.0,
-    "pointer":6,
-    "x":208.85714721679688,
-    "y":515.1428833007812
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694070.0,
-    "pointer":6,
-    "x":208.0,
-    "y":501.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694077.0,
-    "pointer":6,
-    "x":207.42857360839844,
-    "y":487.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694085.0,
-    "pointer":6,
-    "x":206.57142639160156,
-    "y":472.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694092.0,
-    "pointer":6,
-    "x":206.57142639160156,
-    "y":458.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694100.0,
-    "pointer":6,
-    "x":206.57142639160156,
-    "y":446.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694108.0,
-    "pointer":6,
-    "x":206.57142639160156,
-    "y":434.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694116.0,
-    "pointer":6,
-    "x":207.14285278320312,
-    "y":423.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694124.0,
-    "pointer":6,
-    "x":208.57142639160156,
-    "y":412.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694131.0,
-    "pointer":6,
-    "x":209.7142791748047,
-    "y":402.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694139.0,
-    "pointer":6,
-    "x":211.7142791748047,
-    "y":393.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694147.0,
-    "pointer":6,
-    "x":213.42857360839844,
-    "y":385.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694154.0,
-    "pointer":6,
-    "x":215.42857360839844,
-    "y":378.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694162.0,
-    "pointer":6,
-    "x":217.42857360839844,
-    "y":371.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694169.0,
-    "pointer":6,
-    "x":219.42857360839844,
-    "y":366.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694177.0,
-    "pointer":6,
-    "x":221.42857360839844,
-    "y":360.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694185.0,
-    "pointer":6,
-    "x":223.42857360839844,
-    "y":356.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694193.0,
-    "pointer":6,
-    "x":225.14285278320312,
-    "y":352.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694201.0,
-    "pointer":6,
-    "x":226.85714721679688,
-    "y":348.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694209.0,
-    "pointer":6,
-    "x":228.2857208251953,
-    "y":346.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694216.0,
-    "pointer":6,
-    "x":229.14285278320312,
-    "y":343.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694224.0,
-    "pointer":6,
-    "x":230.0,
-    "y":342.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694232.0,
-    "pointer":6,
-    "x":230.57142639160156,
-    "y":340.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694239.0,
-    "pointer":6,
-    "x":230.85714721679688,
-    "y":339.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694247.0,
-    "pointer":6,
-    "x":230.85714721679688,
-    "y":339.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694262.0,
-    "pointer":6,
-    "x":230.2857208251953,
-    "y":342.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694270.0,
-    "pointer":6,
-    "x":228.85714721679688,
-    "y":346.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694278.0,
-    "pointer":6,
-    "x":227.14285278320312,
-    "y":352.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694286.0,
-    "pointer":6,
-    "x":225.42857360839844,
-    "y":359.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694294.0,
-    "pointer":6,
-    "x":223.7142791748047,
-    "y":367.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694301.0,
-    "pointer":6,
-    "x":222.57142639160156,
-    "y":376.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694309.0,
-    "pointer":6,
-    "x":221.42857360839844,
-    "y":384.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694317.0,
-    "pointer":6,
-    "x":220.85714721679688,
-    "y":392.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694324.0,
-    "pointer":6,
-    "x":220.0,
-    "y":400.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694332.0,
-    "pointer":6,
-    "x":219.14285278320312,
-    "y":409.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694339.0,
-    "pointer":6,
-    "x":218.85714721679688,
-    "y":419.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694348.0,
-    "pointer":6,
-    "x":218.2857208251953,
-    "y":428.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694356.0,
-    "pointer":6,
-    "x":218.2857208251953,
-    "y":438.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694363.0,
-    "pointer":6,
-    "x":218.2857208251953,
-    "y":447.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694371.0,
-    "pointer":6,
-    "x":218.2857208251953,
-    "y":455.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694379.0,
-    "pointer":6,
-    "x":219.14285278320312,
-    "y":462.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694386.0,
-    "pointer":6,
-    "x":220.0,
-    "y":469.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694394.0,
-    "pointer":6,
-    "x":221.14285278320312,
-    "y":475.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694401.0,
-    "pointer":6,
-    "x":222.0,
-    "y":480.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694409.0,
-    "pointer":6,
-    "x":222.85714721679688,
-    "y":485.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694417.0,
-    "pointer":6,
-    "x":224.0,
-    "y":489.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694425.0,
-    "pointer":6,
-    "x":224.85714721679688,
-    "y":492.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694433.0,
-    "pointer":6,
-    "x":225.42857360839844,
-    "y":495.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694440.0,
-    "pointer":6,
-    "x":226.0,
-    "y":497.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694448.0,
-    "pointer":6,
-    "x":226.2857208251953,
-    "y":498.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694456.0,
-    "pointer":6,
-    "x":226.2857208251953,
-    "y":498.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694471.0,
-    "pointer":6,
-    "x":226.2857208251953,
-    "y":498.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694479.0,
-    "pointer":6,
-    "x":226.2857208251953,
-    "y":496.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694486.0,
-    "pointer":6,
-    "x":226.2857208251953,
-    "y":493.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694494.0,
-    "pointer":6,
-    "x":226.2857208251953,
-    "y":490.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694502.0,
-    "pointer":6,
-    "x":226.2857208251953,
-    "y":486.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694510.0,
-    "pointer":6,
-    "x":226.2857208251953,
-    "y":480.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694518.0,
-    "pointer":6,
-    "x":226.2857208251953,
-    "y":475.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694525.0,
-    "pointer":6,
-    "x":226.2857208251953,
-    "y":468.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694533.0,
-    "pointer":6,
-    "x":226.2857208251953,
-    "y":461.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694541.0,
-    "pointer":6,
-    "x":226.2857208251953,
-    "y":452.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694548.0,
-    "pointer":6,
-    "x":226.57142639160156,
-    "y":442.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694556.0,
-    "pointer":6,
-    "x":226.57142639160156,
-    "y":432.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694564.0,
-    "pointer":6,
-    "x":226.85714721679688,
-    "y":423.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694571.0,
-    "pointer":6,
-    "x":227.42857360839844,
-    "y":416.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694580.0,
-    "pointer":6,
-    "x":227.7142791748047,
-    "y":410.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694587.0,
-    "pointer":6,
-    "x":228.2857208251953,
-    "y":404.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694595.0,
-    "pointer":6,
-    "x":228.85714721679688,
-    "y":399.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694603.0,
-    "pointer":6,
-    "x":229.14285278320312,
-    "y":395.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694610.0,
-    "pointer":6,
-    "x":229.42857360839844,
-    "y":392.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694618.0,
-    "pointer":6,
-    "x":229.7142791748047,
-    "y":390.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694625.0,
-    "pointer":6,
-    "x":229.7142791748047,
-    "y":388.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694633.0,
-    "pointer":6,
-    "x":229.7142791748047,
-    "y":386.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694641.0,
-    "pointer":6,
-    "x":229.7142791748047,
-    "y":386.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694648.0,
-    "pointer":6,
-    "x":229.7142791748047,
-    "y":386.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694657.0,
-    "pointer":6,
-    "x":228.85714721679688,
-    "y":386.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694665.0,
-    "pointer":6,
-    "x":228.0,
-    "y":388.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694672.0,
-    "pointer":6,
-    "x":226.0,
-    "y":392.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694680.0,
-    "pointer":6,
-    "x":224.0,
-    "y":397.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694688.0,
-    "pointer":6,
-    "x":222.0,
-    "y":404.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694695.0,
-    "pointer":6,
-    "x":219.7142791748047,
-    "y":411.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694703.0,
-    "pointer":6,
-    "x":218.2857208251953,
-    "y":418.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694710.0,
-    "pointer":6,
-    "x":217.14285278320312,
-    "y":425.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694718.0,
-    "pointer":6,
-    "x":215.7142791748047,
-    "y":433.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694726.0,
-    "pointer":6,
-    "x":214.85714721679688,
-    "y":442.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694734.0,
-    "pointer":6,
-    "x":214.0,
-    "y":454.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694742.0,
-    "pointer":6,
-    "x":214.0,
-    "y":469.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694749.0,
-    "pointer":6,
-    "x":215.42857360839844,
-    "y":485.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694757.0,
-    "pointer":6,
-    "x":217.7142791748047,
-    "y":502.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694765.0,
-    "pointer":6,
-    "x":221.14285278320312,
-    "y":521.4285888671875
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694772.0,
-    "pointer":6,
-    "x":224.57142639160156,
-    "y":541.1428833007812
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694780.0,
-    "pointer":6,
-    "x":229.14285278320312,
-    "y":561.1428833007812
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694788.0,
-    "pointer":6,
-    "x":233.42857360839844,
-    "y":578.8571166992188
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216694802.0,
-    "pointer":6,
-    "x":233.42857360839844,
-    "y":578.8571166992188
-  },
-  {
-    "type":"pointerdown",
-    "timeStamp":216695344.0,
-    "pointer":7,
-    "x":253.42857360839844,
-    "y":310.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695352.0,
-    "pointer":7,
-    "x":253.42857360839844,
-    "y":310.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695359.0,
-    "pointer":7,
-    "x":252.85714721679688,
-    "y":318.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695367.0,
-    "pointer":7,
-    "x":251.14285278320312,
-    "y":322.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695375.0,
-    "pointer":7,
-    "x":248.85714721679688,
-    "y":327.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695382.0,
-    "pointer":7,
-    "x":246.0,
-    "y":334.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695390.0,
-    "pointer":7,
-    "x":242.57142639160156,
-    "y":344.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695397.0,
-    "pointer":7,
-    "x":238.85714721679688,
-    "y":357.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695406.0,
-    "pointer":7,
-    "x":235.7142791748047,
-    "y":371.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695414.0,
-    "pointer":7,
-    "x":232.2857208251953,
-    "y":386.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695421.0,
-    "pointer":7,
-    "x":229.42857360839844,
-    "y":402.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695429.0,
-    "pointer":7,
-    "x":227.42857360839844,
-    "y":416.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695437.0,
-    "pointer":7,
-    "x":226.2857208251953,
-    "y":431.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695444.0,
-    "pointer":7,
-    "x":226.2857208251953,
-    "y":446.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695452.0,
-    "pointer":7,
-    "x":227.7142791748047,
-    "y":460.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695459.0,
-    "pointer":7,
-    "x":230.0,
-    "y":475.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695467.0,
-    "pointer":7,
-    "x":232.2857208251953,
-    "y":489.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695475.0,
-    "pointer":7,
-    "x":235.7142791748047,
-    "y":504.0
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216695490.0,
-    "pointer":7,
-    "x":235.7142791748047,
-    "y":504.0
-  },
-  {
-    "type":"pointerdown",
-    "timeStamp":216695885.0,
-    "pointer":8,
-    "x":238.85714721679688,
-    "y":524.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695908.0,
-    "pointer":8,
-    "x":236.2857208251953,
-    "y":515.7142944335938
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695916.0,
-    "pointer":8,
-    "x":234.85714721679688,
-    "y":509.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695924.0,
-    "pointer":8,
-    "x":232.57142639160156,
-    "y":498.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695931.0,
-    "pointer":8,
-    "x":230.57142639160156,
-    "y":483.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695939.0,
-    "pointer":8,
-    "x":229.14285278320312,
-    "y":466.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695947.0,
-    "pointer":8,
-    "x":229.14285278320312,
-    "y":446.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695955.0,
-    "pointer":8,
-    "x":230.57142639160156,
-    "y":424.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695963.0,
-    "pointer":8,
-    "x":232.57142639160156,
-    "y":402.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695970.0,
-    "pointer":8,
-    "x":235.14285278320312,
-    "y":380.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695978.0,
-    "pointer":8,
-    "x":238.57142639160156,
-    "y":359.4285583496094
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216695993.0,
-    "pointer":8,
-    "x":238.57142639160156,
-    "y":359.4285583496094
-  },
-  {
-    "type":"pointerdown",
-    "timeStamp":216696429.0,
-    "pointer":9,
-    "x":238.2857208251953,
-    "y":568.5714111328125
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216696459.0,
-    "pointer":9,
-    "x":234.0,
-    "y":560.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216696467.0,
-    "pointer":9,
-    "x":231.42857360839844,
-    "y":553.1428833007812
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216696475.0,
-    "pointer":9,
-    "x":228.2857208251953,
-    "y":543.1428833007812
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216696483.0,
-    "pointer":9,
-    "x":225.42857360839844,
-    "y":528.8571166992188
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216696491.0,
-    "pointer":9,
-    "x":223.14285278320312,
-    "y":512.2857055664062
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216696498.0,
-    "pointer":9,
-    "x":222.0,
-    "y":495.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216696506.0,
-    "pointer":9,
-    "x":221.7142791748047,
-    "y":477.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216696514.0,
-    "pointer":9,
-    "x":221.7142791748047,
-    "y":458.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216696521.0,
-    "pointer":9,
-    "x":223.14285278320312,
-    "y":438.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216696529.0,
-    "pointer":9,
-    "x":224.2857208251953,
-    "y":416.28570556640625
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216696544.0,
-    "pointer":9,
-    "x":224.2857208251953,
-    "y":416.28570556640625
-  },
-  {
-    "type":"pointerdown",
-    "timeStamp":216696974.0,
-    "pointer":10,
-    "x":218.57142639160156,
-    "y":530.5714111328125
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697012.0,
-    "pointer":10,
-    "x":220.2857208251953,
-    "y":522.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697020.0,
-    "pointer":10,
-    "x":221.14285278320312,
-    "y":517.7142944335938
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697028.0,
-    "pointer":10,
-    "x":222.2857208251953,
-    "y":511.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697036.0,
-    "pointer":10,
-    "x":224.0,
-    "y":504.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697044.0,
-    "pointer":10,
-    "x":227.14285278320312,
-    "y":490.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697052.0,
-    "pointer":10,
-    "x":229.42857360839844,
-    "y":474.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697059.0,
-    "pointer":10,
-    "x":231.42857360839844,
-    "y":454.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697067.0,
-    "pointer":10,
-    "x":233.7142791748047,
-    "y":431.1428527832031
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216697082.0,
-    "pointer":10,
-    "x":233.7142791748047,
-    "y":431.1428527832031
-  },
-  {
-    "type":"pointerdown",
-    "timeStamp":216697435.0,
-    "pointer":11,
-    "x":257.1428527832031,
-    "y":285.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697465.0,
-    "pointer":11,
-    "x":251.7142791748047,
-    "y":296.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697473.0,
-    "pointer":11,
-    "x":248.2857208251953,
-    "y":304.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697481.0,
-    "pointer":11,
-    "x":244.57142639160156,
-    "y":314.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697489.0,
-    "pointer":11,
-    "x":240.2857208251953,
-    "y":329.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697497.0,
-    "pointer":11,
-    "x":236.85714721679688,
-    "y":345.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697505.0,
-    "pointer":11,
-    "x":233.7142791748047,
-    "y":361.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697512.0,
-    "pointer":11,
-    "x":231.14285278320312,
-    "y":378.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697520.0,
-    "pointer":11,
-    "x":229.42857360839844,
-    "y":395.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697528.0,
-    "pointer":11,
-    "x":229.42857360839844,
-    "y":412.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697535.0,
-    "pointer":11,
-    "x":230.85714721679688,
-    "y":430.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697543.0,
-    "pointer":11,
-    "x":233.42857360839844,
-    "y":449.71429443359375
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216697558.0,
-    "pointer":11,
-    "x":233.42857360839844,
-    "y":449.71429443359375
-  },
-  {
-    "type":"pointerdown",
-    "timeStamp":216697749.0,
-    "pointer":12,
-    "x":246.0,
-    "y":311.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697780.0,
-    "pointer":12,
-    "x":244.57142639160156,
-    "y":318.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697787.0,
-    "pointer":12,
-    "x":243.14285278320312,
-    "y":325.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697795.0,
-    "pointer":12,
-    "x":241.42857360839844,
-    "y":336.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697803.0,
-    "pointer":12,
-    "x":239.7142791748047,
-    "y":351.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697811.0,
-    "pointer":12,
-    "x":238.2857208251953,
-    "y":368.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697819.0,
-    "pointer":12,
-    "x":238.0,
-    "y":389.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697826.0,
-    "pointer":12,
-    "x":239.14285278320312,
-    "y":412.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697834.0,
-    "pointer":12,
-    "x":242.2857208251953,
-    "y":438.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697842.0,
-    "pointer":12,
-    "x":247.42857360839844,
-    "y":466.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697849.0,
-    "pointer":12,
-    "x":254.2857208251953,
-    "y":497.71429443359375
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216697864.0,
-    "pointer":12,
-    "x":254.2857208251953,
-    "y":497.71429443359375
-  },
-  {
-    "type":"pointerdown",
-    "timeStamp":216698321.0,
-    "pointer":13,
-    "x":250.0,
-    "y":306.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216698328.0,
-    "pointer":13,
-    "x":250.0,
-    "y":306.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216698344.0,
-    "pointer":13,
-    "x":249.14285278320312,
-    "y":314.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216698351.0,
-    "pointer":13,
-    "x":247.42857360839844,
-    "y":319.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216698359.0,
-    "pointer":13,
-    "x":245.14285278320312,
-    "y":326.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216698366.0,
-    "pointer":13,
-    "x":241.7142791748047,
-    "y":339.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216698374.0,
-    "pointer":13,
-    "x":238.57142639160156,
-    "y":355.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216698382.0,
-    "pointer":13,
-    "x":236.2857208251953,
-    "y":374.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216698390.0,
-    "pointer":13,
-    "x":235.14285278320312,
-    "y":396.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216698398.0,
-    "pointer":13,
-    "x":236.57142639160156,
-    "y":421.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216698406.0,
-    "pointer":13,
-    "x":241.14285278320312,
-    "y":451.4285583496094
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216698421.0,
-    "pointer":13,
-    "x":241.14285278320312,
-    "y":451.4285583496094
-  }
+import 'package:flutter/gestures.dart';
+
+final List<PointerEvent> velocityEventData = <PointerEvent>[
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216690896),
+    pointer: 1,
+    position: const Point(270.0, 538.2857055664062)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216690906),
+    pointer: 1,
+    position: const Point(270.0, 538.2857055664062)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216690951),
+    pointer: 1,
+    position: const Point(270.0, 530.8571166992188)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216690959),
+    pointer: 1,
+    position: const Point(270.0, 526.8571166992188)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216690967),
+    pointer: 1,
+    position: const Point(270.0, 521.4285888671875)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216690975),
+    pointer: 1,
+    position: const Point(270.0, 515.4285888671875)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216690983),
+    pointer: 1,
+    position: const Point(270.0, 506.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216690991),
+    pointer: 1,
+    position: const Point(268.8571472167969, 496.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216690998),
+    pointer: 1,
+    position: const Point(267.4285583496094, 483.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691006),
+    pointer: 1,
+    position: const Point(266.28570556640625, 469.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691014),
+    pointer: 1,
+    position: const Point(265.4285583496094, 456.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691021),
+    pointer: 1,
+    position: const Point(264.28570556640625, 443.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691029),
+    pointer: 1,
+    position: const Point(264.0, 431.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691036),
+    pointer: 1,
+    position: const Point(263.4285583496094, 421.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691044),
+    pointer: 1,
+    position: const Point(263.4285583496094, 412.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691052),
+    pointer: 1,
+    position: const Point(263.4285583496094, 404.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691060),
+    pointer: 1,
+    position: const Point(263.4285583496094, 396.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691068),
+    pointer: 1,
+    position: const Point(264.5714416503906, 390.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691075),
+    pointer: 1,
+    position: const Point(265.1428527832031, 384.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691083),
+    pointer: 1,
+    position: const Point(266.0, 380.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691091),
+    pointer: 1,
+    position: const Point(266.5714416503906, 376.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691098),
+    pointer: 1,
+    position: const Point(267.1428527832031, 373.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691106),
+    pointer: 1,
+    position: const Point(267.71429443359375, 370.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691114),
+    pointer: 1,
+    position: const Point(268.28570556640625, 367.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691121),
+    pointer: 1,
+    position: const Point(268.5714416503906, 366.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691130),
+    pointer: 1,
+    position: const Point(268.8571472167969, 364.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691137),
+    pointer: 1,
+    position: const Point(269.1428527832031, 363.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691145),
+    pointer: 1,
+    position: const Point(269.1428527832031, 362.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691153),
+    pointer: 1,
+    position: const Point(269.4285583496094, 362.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691168),
+    pointer: 1,
+    position: const Point(268.5714416503906, 365.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691176),
+    pointer: 1,
+    position: const Point(267.1428527832031, 370.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691183),
+    pointer: 1,
+    position: const Point(265.4285583496094, 376.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691191),
+    pointer: 1,
+    position: const Point(263.1428527832031, 385.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691199),
+    pointer: 1,
+    position: const Point(261.4285583496094, 396.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691207),
+    pointer: 1,
+    position: const Point(259.71429443359375, 408.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691215),
+    pointer: 1,
+    position: const Point(258.28570556640625, 419.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691222),
+    pointer: 1,
+    position: const Point(257.4285583496094, 428.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691230),
+    pointer: 1,
+    position: const Point(256.28570556640625, 436.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691238),
+    pointer: 1,
+    position: const Point(255.7142791748047, 442.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691245),
+    pointer: 1,
+    position: const Point(255.14285278320312, 447.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691253),
+    pointer: 1,
+    position: const Point(254.85714721679688, 453.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691261),
+    pointer: 1,
+    position: const Point(254.57142639160156, 458.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691268),
+    pointer: 1,
+    position: const Point(254.2857208251953, 463.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691276),
+    pointer: 1,
+    position: const Point(254.2857208251953, 470.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691284),
+    pointer: 1,
+    position: const Point(254.2857208251953, 477.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691292),
+    pointer: 1,
+    position: const Point(255.7142791748047, 487.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691300),
+    pointer: 1,
+    position: const Point(256.8571472167969, 498.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691307),
+    pointer: 1,
+    position: const Point(258.28570556640625, 507.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691315),
+    pointer: 1,
+    position: const Point(259.4285583496094, 516.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691323),
+    pointer: 1,
+    position: const Point(260.28570556640625, 521.7142944335938)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216691338),
+    pointer: 1,
+    position: const Point(260.28570556640625, 521.7142944335938)
+  ),
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216691573),
+    pointer: 2,
+    position: const Point(266.0, 327.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691588),
+    pointer: 2,
+    position: const Point(266.0, 327.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691626),
+    pointer: 2,
+    position: const Point(261.1428527832031, 337.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691634),
+    pointer: 2,
+    position: const Point(258.28570556640625, 343.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691642),
+    pointer: 2,
+    position: const Point(254.57142639160156, 354.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691650),
+    pointer: 2,
+    position: const Point(250.2857208251953, 368.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691657),
+    pointer: 2,
+    position: const Point(247.42857360839844, 382.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691665),
+    pointer: 2,
+    position: const Point(245.14285278320312, 397.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691673),
+    pointer: 2,
+    position: const Point(243.14285278320312, 411.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691680),
+    pointer: 2,
+    position: const Point(242.2857208251953, 426.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691688),
+    pointer: 2,
+    position: const Point(241.7142791748047, 440.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691696),
+    pointer: 2,
+    position: const Point(241.7142791748047, 454.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691703),
+    pointer: 2,
+    position: const Point(242.57142639160156, 467.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691712),
+    pointer: 2,
+    position: const Point(243.42857360839844, 477.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691720),
+    pointer: 2,
+    position: const Point(244.85714721679688, 485.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691727),
+    pointer: 2,
+    position: const Point(246.2857208251953, 493.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691735),
+    pointer: 2,
+    position: const Point(248.0, 499.71429443359375)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216691750),
+    pointer: 2,
+    position: const Point(248.0, 499.71429443359375)
+  ),
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216692255),
+    pointer: 3,
+    position: const Point(249.42857360839844, 351.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692270),
+    pointer: 3,
+    position: const Point(249.42857360839844, 351.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692309),
+    pointer: 3,
+    position: const Point(246.2857208251953, 361.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692317),
+    pointer: 3,
+    position: const Point(244.0, 368.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692325),
+    pointer: 3,
+    position: const Point(241.42857360839844, 377.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692333),
+    pointer: 3,
+    position: const Point(237.7142791748047, 391.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692340),
+    pointer: 3,
+    position: const Point(235.14285278320312, 406.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692348),
+    pointer: 3,
+    position: const Point(232.57142639160156, 421.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692356),
+    pointer: 3,
+    position: const Point(230.2857208251953, 436.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692363),
+    pointer: 3,
+    position: const Point(228.2857208251953, 451.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692371),
+    pointer: 3,
+    position: const Point(227.42857360839844, 466.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692378),
+    pointer: 3,
+    position: const Point(226.2857208251953, 479.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692387),
+    pointer: 3,
+    position: const Point(225.7142791748047, 491.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692395),
+    pointer: 3,
+    position: const Point(225.14285278320312, 501.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692402),
+    pointer: 3,
+    position: const Point(224.85714721679688, 509.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692410),
+    pointer: 3,
+    position: const Point(224.57142639160156, 514.8571166992188)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692418),
+    pointer: 3,
+    position: const Point(224.2857208251953, 519.4285888671875)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692425),
+    pointer: 3,
+    position: const Point(224.0, 523.4285888671875)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692433),
+    pointer: 3,
+    position: const Point(224.0, 527.1428833007812)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692441),
+    pointer: 3,
+    position: const Point(224.0, 530.5714111328125)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692448),
+    pointer: 3,
+    position: const Point(224.0, 533.1428833007812)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692456),
+    pointer: 3,
+    position: const Point(224.0, 535.4285888671875)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692464),
+    pointer: 3,
+    position: const Point(223.7142791748047, 536.8571166992188)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692472),
+    pointer: 3,
+    position: const Point(223.7142791748047, 538.2857055664062)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216692487),
+    pointer: 3,
+    position: const Point(223.7142791748047, 538.2857055664062)
+  ),
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216692678),
+    pointer: 4,
+    position: const Point(221.42857360839844, 526.2857055664062)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692701),
+    pointer: 4,
+    position: const Point(220.57142639160156, 514.8571166992188)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692708),
+    pointer: 4,
+    position: const Point(220.2857208251953, 508.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692716),
+    pointer: 4,
+    position: const Point(220.2857208251953, 498.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692724),
+    pointer: 4,
+    position: const Point(221.14285278320312, 484.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692732),
+    pointer: 4,
+    position: const Point(221.7142791748047, 469.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692740),
+    pointer: 4,
+    position: const Point(223.42857360839844, 453.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692748),
+    pointer: 4,
+    position: const Point(225.7142791748047, 436.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692755),
+    pointer: 4,
+    position: const Point(229.14285278320312, 418.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692763),
+    pointer: 4,
+    position: const Point(232.85714721679688, 400.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692770),
+    pointer: 4,
+    position: const Point(236.85714721679688, 382.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692778),
+    pointer: 4,
+    position: const Point(241.14285278320312, 366.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692786),
+    pointer: 4,
+    position: const Point(244.85714721679688, 350.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692793),
+    pointer: 4,
+    position: const Point(249.14285278320312, 335.4285583496094)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216692809),
+    pointer: 4,
+    position: const Point(249.14285278320312, 335.4285583496094)
+  ),
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216693222),
+    pointer: 5,
+    position: const Point(224.0, 545.4285888671875)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216693245),
+    pointer: 5,
+    position: const Point(224.0, 545.4285888671875)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216693275),
+    pointer: 5,
+    position: const Point(222.85714721679688, 535.1428833007812)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216693284),
+    pointer: 5,
+    position: const Point(222.85714721679688, 528.8571166992188)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216693291),
+    pointer: 5,
+    position: const Point(222.2857208251953, 518.5714111328125)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216693299),
+    pointer: 5,
+    position: const Point(222.0, 503.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216693307),
+    pointer: 5,
+    position: const Point(222.0, 485.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216693314),
+    pointer: 5,
+    position: const Point(221.7142791748047, 464.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216693322),
+    pointer: 5,
+    position: const Point(222.2857208251953, 440.28570556640625)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216693337),
+    pointer: 5,
+    position: const Point(222.2857208251953, 440.28570556640625)
+  ),
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216693985),
+    pointer: 6,
+    position: const Point(208.0, 544.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694047),
+    pointer: 6,
+    position: const Point(208.57142639160156, 532.2857055664062)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694054),
+    pointer: 6,
+    position: const Point(208.85714721679688, 525.7142944335938)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694062),
+    pointer: 6,
+    position: const Point(208.85714721679688, 515.1428833007812)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694070),
+    pointer: 6,
+    position: const Point(208.0, 501.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694077),
+    pointer: 6,
+    position: const Point(207.42857360839844, 487.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694085),
+    pointer: 6,
+    position: const Point(206.57142639160156, 472.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694092),
+    pointer: 6,
+    position: const Point(206.57142639160156, 458.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694100),
+    pointer: 6,
+    position: const Point(206.57142639160156, 446.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694108),
+    pointer: 6,
+    position: const Point(206.57142639160156, 434.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694116),
+    pointer: 6,
+    position: const Point(207.14285278320312, 423.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694124),
+    pointer: 6,
+    position: const Point(208.57142639160156, 412.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694131),
+    pointer: 6,
+    position: const Point(209.7142791748047, 402.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694139),
+    pointer: 6,
+    position: const Point(211.7142791748047, 393.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694147),
+    pointer: 6,
+    position: const Point(213.42857360839844, 385.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694154),
+    pointer: 6,
+    position: const Point(215.42857360839844, 378.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694162),
+    pointer: 6,
+    position: const Point(217.42857360839844, 371.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694169),
+    pointer: 6,
+    position: const Point(219.42857360839844, 366.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694177),
+    pointer: 6,
+    position: const Point(221.42857360839844, 360.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694185),
+    pointer: 6,
+    position: const Point(223.42857360839844, 356.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694193),
+    pointer: 6,
+    position: const Point(225.14285278320312, 352.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694201),
+    pointer: 6,
+    position: const Point(226.85714721679688, 348.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694209),
+    pointer: 6,
+    position: const Point(228.2857208251953, 346.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694216),
+    pointer: 6,
+    position: const Point(229.14285278320312, 343.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694224),
+    pointer: 6,
+    position: const Point(230.0, 342.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694232),
+    pointer: 6,
+    position: const Point(230.57142639160156, 340.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694239),
+    pointer: 6,
+    position: const Point(230.85714721679688, 339.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694247),
+    pointer: 6,
+    position: const Point(230.85714721679688, 339.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694262),
+    pointer: 6,
+    position: const Point(230.2857208251953, 342.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694270),
+    pointer: 6,
+    position: const Point(228.85714721679688, 346.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694278),
+    pointer: 6,
+    position: const Point(227.14285278320312, 352.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694286),
+    pointer: 6,
+    position: const Point(225.42857360839844, 359.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694294),
+    pointer: 6,
+    position: const Point(223.7142791748047, 367.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694301),
+    pointer: 6,
+    position: const Point(222.57142639160156, 376.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694309),
+    pointer: 6,
+    position: const Point(221.42857360839844, 384.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694317),
+    pointer: 6,
+    position: const Point(220.85714721679688, 392.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694324),
+    pointer: 6,
+    position: const Point(220.0, 400.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694332),
+    pointer: 6,
+    position: const Point(219.14285278320312, 409.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694339),
+    pointer: 6,
+    position: const Point(218.85714721679688, 419.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694348),
+    pointer: 6,
+    position: const Point(218.2857208251953, 428.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694356),
+    pointer: 6,
+    position: const Point(218.2857208251953, 438.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694363),
+    pointer: 6,
+    position: const Point(218.2857208251953, 447.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694371),
+    pointer: 6,
+    position: const Point(218.2857208251953, 455.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694379),
+    pointer: 6,
+    position: const Point(219.14285278320312, 462.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694386),
+    pointer: 6,
+    position: const Point(220.0, 469.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694394),
+    pointer: 6,
+    position: const Point(221.14285278320312, 475.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694401),
+    pointer: 6,
+    position: const Point(222.0, 480.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694409),
+    pointer: 6,
+    position: const Point(222.85714721679688, 485.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694417),
+    pointer: 6,
+    position: const Point(224.0, 489.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694425),
+    pointer: 6,
+    position: const Point(224.85714721679688, 492.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694433),
+    pointer: 6,
+    position: const Point(225.42857360839844, 495.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694440),
+    pointer: 6,
+    position: const Point(226.0, 497.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694448),
+    pointer: 6,
+    position: const Point(226.2857208251953, 498.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694456),
+    pointer: 6,
+    position: const Point(226.2857208251953, 498.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694471),
+    pointer: 6,
+    position: const Point(226.2857208251953, 498.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694479),
+    pointer: 6,
+    position: const Point(226.2857208251953, 496.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694486),
+    pointer: 6,
+    position: const Point(226.2857208251953, 493.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694494),
+    pointer: 6,
+    position: const Point(226.2857208251953, 490.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694502),
+    pointer: 6,
+    position: const Point(226.2857208251953, 486.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694510),
+    pointer: 6,
+    position: const Point(226.2857208251953, 480.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694518),
+    pointer: 6,
+    position: const Point(226.2857208251953, 475.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694525),
+    pointer: 6,
+    position: const Point(226.2857208251953, 468.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694533),
+    pointer: 6,
+    position: const Point(226.2857208251953, 461.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694541),
+    pointer: 6,
+    position: const Point(226.2857208251953, 452.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694548),
+    pointer: 6,
+    position: const Point(226.57142639160156, 442.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694556),
+    pointer: 6,
+    position: const Point(226.57142639160156, 432.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694564),
+    pointer: 6,
+    position: const Point(226.85714721679688, 423.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694571),
+    pointer: 6,
+    position: const Point(227.42857360839844, 416.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694580),
+    pointer: 6,
+    position: const Point(227.7142791748047, 410.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694587),
+    pointer: 6,
+    position: const Point(228.2857208251953, 404.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694595),
+    pointer: 6,
+    position: const Point(228.85714721679688, 399.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694603),
+    pointer: 6,
+    position: const Point(229.14285278320312, 395.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694610),
+    pointer: 6,
+    position: const Point(229.42857360839844, 392.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694618),
+    pointer: 6,
+    position: const Point(229.7142791748047, 390.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694625),
+    pointer: 6,
+    position: const Point(229.7142791748047, 388.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694633),
+    pointer: 6,
+    position: const Point(229.7142791748047, 386.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694641),
+    pointer: 6,
+    position: const Point(229.7142791748047, 386.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694648),
+    pointer: 6,
+    position: const Point(229.7142791748047, 386.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694657),
+    pointer: 6,
+    position: const Point(228.85714721679688, 386.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694665),
+    pointer: 6,
+    position: const Point(228.0, 388.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694672),
+    pointer: 6,
+    position: const Point(226.0, 392.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694680),
+    pointer: 6,
+    position: const Point(224.0, 397.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694688),
+    pointer: 6,
+    position: const Point(222.0, 404.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694695),
+    pointer: 6,
+    position: const Point(219.7142791748047, 411.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694703),
+    pointer: 6,
+    position: const Point(218.2857208251953, 418.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694710),
+    pointer: 6,
+    position: const Point(217.14285278320312, 425.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694718),
+    pointer: 6,
+    position: const Point(215.7142791748047, 433.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694726),
+    pointer: 6,
+    position: const Point(214.85714721679688, 442.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694734),
+    pointer: 6,
+    position: const Point(214.0, 454.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694742),
+    pointer: 6,
+    position: const Point(214.0, 469.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694749),
+    pointer: 6,
+    position: const Point(215.42857360839844, 485.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694757),
+    pointer: 6,
+    position: const Point(217.7142791748047, 502.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694765),
+    pointer: 6,
+    position: const Point(221.14285278320312, 521.4285888671875)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694772),
+    pointer: 6,
+    position: const Point(224.57142639160156, 541.1428833007812)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694780),
+    pointer: 6,
+    position: const Point(229.14285278320312, 561.1428833007812)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694788),
+    pointer: 6,
+    position: const Point(233.42857360839844, 578.8571166992188)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216694802),
+    pointer: 6,
+    position: const Point(233.42857360839844, 578.8571166992188)
+  ),
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216695344),
+    pointer: 7,
+    position: const Point(253.42857360839844, 310.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695352),
+    pointer: 7,
+    position: const Point(253.42857360839844, 310.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695359),
+    pointer: 7,
+    position: const Point(252.85714721679688, 318.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695367),
+    pointer: 7,
+    position: const Point(251.14285278320312, 322.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695375),
+    pointer: 7,
+    position: const Point(248.85714721679688, 327.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695382),
+    pointer: 7,
+    position: const Point(246.0, 334.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695390),
+    pointer: 7,
+    position: const Point(242.57142639160156, 344.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695397),
+    pointer: 7,
+    position: const Point(238.85714721679688, 357.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695406),
+    pointer: 7,
+    position: const Point(235.7142791748047, 371.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695414),
+    pointer: 7,
+    position: const Point(232.2857208251953, 386.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695421),
+    pointer: 7,
+    position: const Point(229.42857360839844, 402.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695429),
+    pointer: 7,
+    position: const Point(227.42857360839844, 416.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695437),
+    pointer: 7,
+    position: const Point(226.2857208251953, 431.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695444),
+    pointer: 7,
+    position: const Point(226.2857208251953, 446.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695452),
+    pointer: 7,
+    position: const Point(227.7142791748047, 460.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695459),
+    pointer: 7,
+    position: const Point(230.0, 475.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695467),
+    pointer: 7,
+    position: const Point(232.2857208251953, 489.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695475),
+    pointer: 7,
+    position: const Point(235.7142791748047, 504.0)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216695490),
+    pointer: 7,
+    position: const Point(235.7142791748047, 504.0)
+  ),
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216695885),
+    pointer: 8,
+    position: const Point(238.85714721679688, 524.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695908),
+    pointer: 8,
+    position: const Point(236.2857208251953, 515.7142944335938)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695916),
+    pointer: 8,
+    position: const Point(234.85714721679688, 509.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695924),
+    pointer: 8,
+    position: const Point(232.57142639160156, 498.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695931),
+    pointer: 8,
+    position: const Point(230.57142639160156, 483.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695939),
+    pointer: 8,
+    position: const Point(229.14285278320312, 466.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695947),
+    pointer: 8,
+    position: const Point(229.14285278320312, 446.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695955),
+    pointer: 8,
+    position: const Point(230.57142639160156, 424.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695963),
+    pointer: 8,
+    position: const Point(232.57142639160156, 402.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695970),
+    pointer: 8,
+    position: const Point(235.14285278320312, 380.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695978),
+    pointer: 8,
+    position: const Point(238.57142639160156, 359.4285583496094)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216695993),
+    pointer: 8,
+    position: const Point(238.57142639160156, 359.4285583496094)
+  ),
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216696429),
+    pointer: 9,
+    position: const Point(238.2857208251953, 568.5714111328125)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216696459),
+    pointer: 9,
+    position: const Point(234.0, 560.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216696467),
+    pointer: 9,
+    position: const Point(231.42857360839844, 553.1428833007812)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216696475),
+    pointer: 9,
+    position: const Point(228.2857208251953, 543.1428833007812)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216696483),
+    pointer: 9,
+    position: const Point(225.42857360839844, 528.8571166992188)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216696491),
+    pointer: 9,
+    position: const Point(223.14285278320312, 512.2857055664062)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216696498),
+    pointer: 9,
+    position: const Point(222.0, 495.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216696506),
+    pointer: 9,
+    position: const Point(221.7142791748047, 477.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216696514),
+    pointer: 9,
+    position: const Point(221.7142791748047, 458.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216696521),
+    pointer: 9,
+    position: const Point(223.14285278320312, 438.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216696529),
+    pointer: 9,
+    position: const Point(224.2857208251953, 416.28570556640625)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216696544),
+    pointer: 9,
+    position: const Point(224.2857208251953, 416.28570556640625)
+  ),
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216696974),
+    pointer: 10,
+    position: const Point(218.57142639160156, 530.5714111328125)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697012),
+    pointer: 10,
+    position: const Point(220.2857208251953, 522.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697020),
+    pointer: 10,
+    position: const Point(221.14285278320312, 517.7142944335938)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697028),
+    pointer: 10,
+    position: const Point(222.2857208251953, 511.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697036),
+    pointer: 10,
+    position: const Point(224.0, 504.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697044),
+    pointer: 10,
+    position: const Point(227.14285278320312, 490.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697052),
+    pointer: 10,
+    position: const Point(229.42857360839844, 474.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697059),
+    pointer: 10,
+    position: const Point(231.42857360839844, 454.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697067),
+    pointer: 10,
+    position: const Point(233.7142791748047, 431.1428527832031)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216697082),
+    pointer: 10,
+    position: const Point(233.7142791748047, 431.1428527832031)
+  ),
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216697435),
+    pointer: 11,
+    position: const Point(257.1428527832031, 285.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697465),
+    pointer: 11,
+    position: const Point(251.7142791748047, 296.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697473),
+    pointer: 11,
+    position: const Point(248.2857208251953, 304.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697481),
+    pointer: 11,
+    position: const Point(244.57142639160156, 314.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697489),
+    pointer: 11,
+    position: const Point(240.2857208251953, 329.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697497),
+    pointer: 11,
+    position: const Point(236.85714721679688, 345.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697505),
+    pointer: 11,
+    position: const Point(233.7142791748047, 361.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697512),
+    pointer: 11,
+    position: const Point(231.14285278320312, 378.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697520),
+    pointer: 11,
+    position: const Point(229.42857360839844, 395.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697528),
+    pointer: 11,
+    position: const Point(229.42857360839844, 412.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697535),
+    pointer: 11,
+    position: const Point(230.85714721679688, 430.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697543),
+    pointer: 11,
+    position: const Point(233.42857360839844, 449.71429443359375)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216697558),
+    pointer: 11,
+    position: const Point(233.42857360839844, 449.71429443359375)
+  ),
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216697749),
+    pointer: 12,
+    position: const Point(246.0, 311.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697780),
+    pointer: 12,
+    position: const Point(244.57142639160156, 318.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697787),
+    pointer: 12,
+    position: const Point(243.14285278320312, 325.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697795),
+    pointer: 12,
+    position: const Point(241.42857360839844, 336.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697803),
+    pointer: 12,
+    position: const Point(239.7142791748047, 351.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697811),
+    pointer: 12,
+    position: const Point(238.2857208251953, 368.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697819),
+    pointer: 12,
+    position: const Point(238.0, 389.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697826),
+    pointer: 12,
+    position: const Point(239.14285278320312, 412.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697834),
+    pointer: 12,
+    position: const Point(242.2857208251953, 438.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697842),
+    pointer: 12,
+    position: const Point(247.42857360839844, 466.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697849),
+    pointer: 12,
+    position: const Point(254.2857208251953, 497.71429443359375)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216697864),
+    pointer: 12,
+    position: const Point(254.2857208251953, 497.71429443359375)
+  ),
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216698321),
+    pointer: 13,
+    position: const Point(250.0, 306.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216698328),
+    pointer: 13,
+    position: const Point(250.0, 306.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216698344),
+    pointer: 13,
+    position: const Point(249.14285278320312, 314.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216698351),
+    pointer: 13,
+    position: const Point(247.42857360839844, 319.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216698359),
+    pointer: 13,
+    position: const Point(245.14285278320312, 326.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216698366),
+    pointer: 13,
+    position: const Point(241.7142791748047, 339.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216698374),
+    pointer: 13,
+    position: const Point(238.57142639160156, 355.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216698382),
+    pointer: 13,
+    position: const Point(236.2857208251953, 374.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216698390),
+    pointer: 13,
+    position: const Point(235.14285278320312, 396.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216698398),
+    pointer: 13,
+    position: const Point(236.57142639160156, 421.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216698406),
+    pointer: 13,
+    position: const Point(241.14285278320312, 451.4285583496094)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216698421),
+    pointer: 13,
+    position: const Point(241.14285278320312, 451.4285583496094)
+  ),
 ];
diff --git a/packages/unit/test/gestures/double_tap_test.dart b/packages/unit/test/gestures/double_tap_test.dart
index ea8758b96cbfce0269b1bd42d0a606c28f6b9088..6ca9994dcaaace041f5c8708863b48e1f2cab22a 100644
--- a/packages/unit/test/gestures/double_tap_test.dart
+++ b/packages/unit/test/gestures/double_tap_test.dart
@@ -16,85 +16,63 @@ class TestGestureArenaMember extends GestureArenaMember {
 void main() {
 
   // Down/up pair 1: normal tap sequence
-  final PointerInputEvent down1 = new PointerInputEvent(
+  const PointerDownEvent down1 = const PointerDownEvent(
     pointer: 1,
-    type: 'pointerdown',
-    x: 10.0,
-    y: 10.0
+    position: const Point(10.0, 10.0)
   );
 
-  final PointerInputEvent up1 = new PointerInputEvent(
+  const PointerUpEvent up1 = const PointerUpEvent(
     pointer: 1,
-    type: 'pointerup',
-    x: 11.0,
-    y: 9.0
+    position: const Point(11.0, 9.0)
   );
 
   // Down/up pair 2: normal tap sequence close to pair 1
-  final PointerInputEvent down2 = new PointerInputEvent(
+  const PointerDownEvent down2 = const PointerDownEvent(
     pointer: 2,
-    type: 'pointerdown',
-    x: 12.0,
-    y: 12.0
+    position: const Point(12.0, 12.0)
   );
 
-  final PointerInputEvent up2 = new PointerInputEvent(
+  const PointerUpEvent up2 = const PointerUpEvent(
     pointer: 2,
-    type: 'pointerup',
-    x: 13.0,
-    y: 11.0
+    position: const Point(13.0, 11.0)
   );
 
   // Down/up pair 3: normal tap sequence far away from pair 1
-  final PointerInputEvent down3 = new PointerInputEvent(
+  const PointerDownEvent down3 = const PointerDownEvent(
     pointer: 3,
-    type: 'pointerdown',
-    x: 130.0,
-    y: 130.0
+    position: const Point(130.0, 130.0)
   );
 
-  final PointerInputEvent up3 = new PointerInputEvent(
+  const PointerUpEvent up3 = const PointerUpEvent(
     pointer: 3,
-    type: 'pointerup',
-    x: 131.0,
-    y: 129.0
+    position: const Point(131.0, 129.0)
   );
 
   // Down/move/up sequence 4: intervening motion
-  final PointerInputEvent down4 = new PointerInputEvent(
+  const PointerDownEvent down4 = const PointerDownEvent(
     pointer: 4,
-    type: 'pointerdown',
-    x: 10.0,
-    y: 10.0
+    position: const Point(10.0, 10.0)
   );
 
-  final PointerInputEvent move4 = new PointerInputEvent(
+  const PointerMoveEvent move4 = const PointerMoveEvent(
     pointer: 4,
-    type: 'pointermove',
-    x: 25.0,
-    y: 25.0
+    position: const Point(25.0, 25.0)
   );
 
-  final PointerInputEvent up4 = new PointerInputEvent(
+  const PointerUpEvent up4 = const PointerUpEvent(
     pointer: 4,
-    type: 'pointerup',
-    x: 25.0,
-    y: 25.0
+    position: const Point(25.0, 25.0)
   );
 
   // Down/up pair 5: normal tap sequence identical to pair 1 with different pointer
-  final PointerInputEvent down5 = new PointerInputEvent(
+  const PointerDownEvent down5 = const PointerDownEvent(
     pointer: 5,
-    type: 'pointerdown',
-    x: 10.0,
-    y: 10.0
+    position: const Point(10.0, 10.0)
   );
 
-  final PointerInputEvent up5 = new PointerInputEvent(
+  const PointerUpEvent up5 = const PointerUpEvent(
     pointer: 5,
-    type: 'pointerup',
-    x: 11.0,
-    y: 9.0
+    position: const Point(11.0, 9.0)
   );
 
   test('Should recognize double tap', () {
@@ -546,7 +524,7 @@ void main() {
 
       expect(member.accepted, isFalse);
 
-      async.elapse(new Duration(milliseconds: 5000));
+      async.elapse(const Duration(milliseconds: 5000));
 
       expect(member.accepted, isTrue);
     });
diff --git a/packages/unit/test/gestures/long_press_test.dart b/packages/unit/test/gestures/long_press_test.dart
index 1871112d47107708d41a6115fbe4674b0701c956..3297ded93d849fb9c68d9e521957c47aff01d166 100644
--- a/packages/unit/test/gestures/long_press_test.dart
+++ b/packages/unit/test/gestures/long_press_test.dart
@@ -2,18 +2,14 @@ import 'package:quiver/testing/async.dart';
 import 'package:flutter/gestures.dart';
 import 'package:test/test.dart';
 
-final PointerInputEvent down = new PointerInputEvent(
+const PointerDownEvent down = const PointerDownEvent(
   pointer: 5,
-  type: 'pointerdown',
-  x: 10.0,
-  y: 10.0
+  position: const Point(10.0, 10.0)
 );
 
-final PointerInputEvent up = new PointerInputEvent(
+const PointerUpEvent up = const PointerUpEvent(
   pointer: 5,
-  type: 'pointerup',
-  x: 11.0,
-  y: 9.0
+  position: const Point(11.0, 9.0)
 );
 
 void main() {
@@ -32,9 +28,9 @@ void main() {
       expect(longPressRecognized, isFalse);
       router.route(down);
       expect(longPressRecognized, isFalse);
-      async.elapse(new Duration(milliseconds: 300));
+      async.elapse(const Duration(milliseconds: 300));
       expect(longPressRecognized, isFalse);
-      async.elapse(new Duration(milliseconds: 700));
+      async.elapse(const Duration(milliseconds: 700));
       expect(longPressRecognized, isTrue);
     });
 
@@ -56,11 +52,11 @@ void main() {
       expect(longPressRecognized, isFalse);
       router.route(down);
       expect(longPressRecognized, isFalse);
-      async.elapse(new Duration(milliseconds: 300));
+      async.elapse(const Duration(milliseconds: 300));
       expect(longPressRecognized, isFalse);
       router.route(up);
       expect(longPressRecognized, isFalse);
-      async.elapse(new Duration(seconds: 1));
+      async.elapse(const Duration(seconds: 1));
       expect(longPressRecognized, isFalse);
     });
 
@@ -91,10 +87,10 @@ void main() {
       router.route(down);
       expect(tapDownRecognized, isFalse);
       expect(longPressRecognized, isFalse);
-      async.elapse(new Duration(milliseconds: 300));
+      async.elapse(const Duration(milliseconds: 300));
       expect(tapDownRecognized, isTrue);
       expect(longPressRecognized, isFalse);
-      async.elapse(new Duration(milliseconds: 700));
+      async.elapse(const Duration(milliseconds: 700));
       expect(tapDownRecognized, isTrue);
       expect(longPressRecognized, isTrue);
     });
diff --git a/packages/unit/test/gestures/lsq_solver_test.dart b/packages/unit/test/gestures/lsq_solver_test.dart
index c322cf1439c9e7a9276d7629f6740c3f6aeeaa1b..54384c6acca1fbe3e4707cd90a7650db3c8d0de2 100644
--- a/packages/unit/test/gestures/lsq_solver_test.dart
+++ b/packages/unit/test/gestures/lsq_solver_test.dart
@@ -9,9 +9,9 @@ void main() {
   }
 
   test('Least-squares fit: linear polynomial to line', () {
-    List<double> x = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0];
-    List<double> y = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0];
-    List<double> w = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0];
+    List<double> x = <double>[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0];
+    List<double> y = <double>[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0];
+    List<double> w = <double>[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0];
 
     LeastSquaresSolver solver = new LeastSquaresSolver(x, y, w);
     PolynomialFit fit = solver.solve(1);
@@ -23,9 +23,9 @@ void main() {
   });
 
   test('Least-squares fit: linear polynomial to sloped line', () {
-    List<double> x = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0];
-    List<double> y = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0];
-    List<double> w = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0];
+    List<double> x = <double>[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0];
+    List<double> y = <double>[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0];
+    List<double> w = <double>[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0];
 
     LeastSquaresSolver solver = new LeastSquaresSolver(x, y, w);
     PolynomialFit fit = solver.solve(1);
@@ -37,9 +37,9 @@ void main() {
   });
 
   test('Least-squares fit: quadratic polynomial to line', () {
-    List<double> x = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0];
-    List<double> y = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0];
-    List<double> w = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0];
+    List<double> x = <double>[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0];
+    List<double> y = <double>[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0];
+    List<double> w = <double>[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0];
 
     LeastSquaresSolver solver = new LeastSquaresSolver(x, y, w);
     PolynomialFit fit = solver.solve(2);
@@ -52,9 +52,9 @@ void main() {
   });
 
   test('Least-squares fit: quadratic polynomial to sloped line', () {
-    List<double> x = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0];
-    List<double> y = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0];
-    List<double> w = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0];
+    List<double> x = <double>[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0];
+    List<double> y = <double>[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0];
+    List<double> w = <double>[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0];
 
     LeastSquaresSolver solver = new LeastSquaresSolver(x, y, w);
     PolynomialFit fit = solver.solve(2);
diff --git a/packages/unit/test/gestures/pointer_router_test.dart b/packages/unit/test/gestures/pointer_router_test.dart
index 994e9254f53ac261415067d66d17dc1bd378b937..8f66fff8366279e097fbad81719ff3c3ce98bc44 100644
--- a/packages/unit/test/gestures/pointer_router_test.dart
+++ b/packages/unit/test/gestures/pointer_router_test.dart
@@ -5,7 +5,7 @@ import 'package:test/test.dart';
 void main() {
   test('Should route pointers', () {
     bool callbackRan = false;
-    void callback(PointerInputEvent event) {
+    void callback(PointerEvent event) {
       callbackRan = true;
     }
 
diff --git a/packages/unit/test/gestures/scale_test.dart b/packages/unit/test/gestures/scale_test.dart
index 8ff5e422df08757c7fb79d82217ae3b0a0dc181c..4916aa7b776e663f982f1db2471ff90f3c1f5f29 100644
--- a/packages/unit/test/gestures/scale_test.dart
+++ b/packages/unit/test/gestures/scale_test.dart
@@ -1,5 +1,3 @@
-import 'dart:ui' as ui;
-
 import 'package:flutter_test/flutter_test.dart';
 import 'package:flutter/gestures.dart';
 import 'package:test/test.dart';
@@ -11,14 +9,14 @@ void main() {
     TapGestureRecognizer tap = new TapGestureRecognizer(router: router);
 
     bool didStartScale = false;
-    ui.Point updatedFocalPoint;
-    scale.onStart = (ui.Point focalPoint) {
+    Point updatedFocalPoint;
+    scale.onStart = (Point focalPoint) {
       didStartScale = true;
       updatedFocalPoint = focalPoint;
     };
 
     double updatedScale;
-    scale.onUpdate = (double scale, ui.Point focalPoint) {
+    scale.onUpdate = (double scale, Point focalPoint) {
       updatedScale = scale;
       updatedFocalPoint = focalPoint;
     };
@@ -35,7 +33,7 @@ void main() {
 
     TestPointer pointer1 = new TestPointer(1);
 
-    PointerInputEvent down = pointer1.down(new Point(10.0, 10.0));
+    PointerDownEvent down = pointer1.down(const Point(10.0, 10.0));
     scale.addPointer(down);
     tap.addPointer(down);
 
@@ -54,10 +52,10 @@ void main() {
     expect(didEndScale, isFalse);
     expect(didTap, isFalse);
 
-    router.route(pointer1.move(new Point(20.0, 30.0)));
+    router.route(pointer1.move(const Point(20.0, 30.0)));
     expect(didStartScale, isTrue);
     didStartScale = false;
-    expect(updatedFocalPoint, new ui.Point(20.0, 30.0));
+    expect(updatedFocalPoint, const Point(20.0, 30.0));
     updatedFocalPoint = null;
     expect(updatedScale, 1.0);
     updatedScale = null;
@@ -66,7 +64,7 @@ void main() {
 
     // Two-finger scaling
     TestPointer pointer2 = new TestPointer(2);
-    PointerInputEvent down2 = pointer2.down(new Point(10.0, 20.0));
+    PointerDownEvent down2 = pointer2.down(const Point(10.0, 20.0));
     scale.addPointer(down2);
     tap.addPointer(down2);
     GestureArena.instance.close(2);
@@ -79,10 +77,10 @@ void main() {
     expect(didStartScale, isFalse);
 
     // Zoom in
-    router.route(pointer2.move(new Point(0.0, 10.0)));
+    router.route(pointer2.move(const Point(0.0, 10.0)));
     expect(didStartScale, isTrue);
     didStartScale = false;
-    expect(updatedFocalPoint, new ui.Point(10.0, 20.0));
+    expect(updatedFocalPoint, const Point(10.0, 20.0));
     updatedFocalPoint = null;
     expect(updatedScale, 2.0);
     updatedScale = null;
@@ -90,8 +88,8 @@ void main() {
     expect(didTap, isFalse);
 
     // Zoom out
-    router.route(pointer2.move(new Point(15.0, 25.0)));
-    expect(updatedFocalPoint, new ui.Point(17.5, 27.5));
+    router.route(pointer2.move(const Point(15.0, 25.0)));
+    expect(updatedFocalPoint, const Point(17.5, 27.5));
     updatedFocalPoint = null;
     expect(updatedScale, 0.5);
     updatedScale = null;
@@ -99,7 +97,7 @@ void main() {
 
     // Three-finger scaling
     TestPointer pointer3 = new TestPointer(3);
-    PointerInputEvent down3 = pointer3.down(new Point(25.0, 35.0));
+    PointerDownEvent down3 = pointer3.down(const Point(25.0, 35.0));
     scale.addPointer(down3);
     tap.addPointer(down3);
     GestureArena.instance.close(3);
@@ -112,10 +110,10 @@ void main() {
     expect(didStartScale, isFalse);
 
     // Zoom in
-    router.route(pointer3.move(new Point(55.0, 65.0)));
+    router.route(pointer3.move(const Point(55.0, 65.0)));
     expect(didStartScale, isTrue);
     didStartScale = false;
-    expect(updatedFocalPoint, new ui.Point(30.0, 40.0));
+    expect(updatedFocalPoint, const Point(30.0, 40.0));
     updatedFocalPoint = null;
     expect(updatedScale, 5.0);
     updatedScale = null;
@@ -123,11 +121,11 @@ void main() {
     expect(didTap, isFalse);
 
     // Return to original positions but with different fingers
-    router.route(pointer1.move(new Point(25.0, 35.0)));
-    router.route(pointer2.move(new Point(20.0, 30.0)));
-    router.route(pointer3.move(new Point(15.0, 25.0)));
+    router.route(pointer1.move(const Point(25.0, 35.0)));
+    router.route(pointer2.move(const Point(20.0, 30.0)));
+    router.route(pointer3.move(const Point(15.0, 25.0)));
     expect(didStartScale, isFalse);
-    expect(updatedFocalPoint, new ui.Point(20.0, 30.0));
+    expect(updatedFocalPoint, const Point(20.0, 30.0));
     updatedFocalPoint = null;
     expect(updatedScale, 1.0);
     updatedScale = null;
@@ -143,10 +141,10 @@ void main() {
     expect(didTap, isFalse);
 
     // Continue scaling with two fingers
-    router.route(pointer3.move(new Point(10.0, 20.0)));
+    router.route(pointer3.move(const Point(10.0, 20.0)));
     expect(didStartScale, isTrue);
     didStartScale = false;
-    expect(updatedFocalPoint, new ui.Point(15.0, 25.0));
+    expect(updatedFocalPoint, const Point(15.0, 25.0));
     updatedFocalPoint = null;
     expect(updatedScale, 2.0);
     updatedScale = null;
@@ -160,10 +158,10 @@ void main() {
     expect(didTap, isFalse);
 
     // Continue panning with one finger
-    router.route(pointer3.move(new Point(0.0, 0.0)));
+    router.route(pointer3.move(const Point(0.0, 0.0)));
     expect(didStartScale, isTrue);
     didStartScale = false;
-    expect(updatedFocalPoint, new ui.Point(0.0, 0.0));
+    expect(updatedFocalPoint, const Point(0.0, 0.0));
     updatedFocalPoint = null;
     expect(updatedScale, 1.0);
     updatedScale = null;
diff --git a/packages/unit/test/gestures/scroll_test.dart b/packages/unit/test/gestures/scroll_test.dart
index b4d5c32f8c2e34c3630117b41b06fabd15facca2..5280438d819fbdf50026c1e1951381f4ae1dc6bd 100644
--- a/packages/unit/test/gestures/scroll_test.dart
+++ b/packages/unit/test/gestures/scroll_test.dart
@@ -1,5 +1,3 @@
-import 'dart:ui' as ui;
-
 import 'package:flutter_test/flutter_test.dart';
 import 'package:flutter/gestures.dart';
 import 'package:test/test.dart';
@@ -15,13 +13,13 @@ void main() {
       didStartPan = true;
     };
 
-    ui.Offset updatedScrollDelta;
-    pan.onUpdate = (ui.Offset offset) {
+    Offset updatedScrollDelta;
+    pan.onUpdate = (Offset offset) {
       updatedScrollDelta = offset;
     };
 
     bool didEndPan = false;
-    pan.onEnd = (ui.Offset velocity) {
+    pan.onEnd = (Offset velocity) {
       didEndPan = true;
     };
 
@@ -31,7 +29,7 @@ void main() {
     };
 
     TestPointer pointer = new TestPointer(5);
-    PointerInputEvent down = pointer.down(new Point(10.0, 10.0));
+    PointerDownEvent down = pointer.down(const Point(10.0, 10.0));
     pan.addPointer(down);
     tap.addPointer(down);
     GestureArena.instance.close(5);
@@ -46,17 +44,17 @@ void main() {
     expect(didEndPan, isFalse);
     expect(didTap, isFalse);
 
-    router.route(pointer.move(new Point(20.0, 20.0)));
+    router.route(pointer.move(const Point(20.0, 20.0)));
     expect(didStartPan, isTrue);
     didStartPan = false;
-    expect(updatedScrollDelta, new ui.Offset(10.0, 10.0));
+    expect(updatedScrollDelta, const Offset(10.0, 10.0));
     updatedScrollDelta = null;
     expect(didEndPan, isFalse);
     expect(didTap, isFalse);
 
-    router.route(pointer.move(new Point(20.0, 25.0)));
+    router.route(pointer.move(const Point(20.0, 25.0)));
     expect(didStartPan, isFalse);
-    expect(updatedScrollDelta, new ui.Offset(0.0, 5.0));
+    expect(updatedScrollDelta, const Offset(0.0, 5.0));
     updatedScrollDelta = null;
     expect(didEndPan, isFalse);
     expect(didTap, isFalse);
diff --git a/packages/unit/test/gestures/tap_test.dart b/packages/unit/test/gestures/tap_test.dart
index d1b8b7e054f8e265de1fb2e3de8801d36334a0a1..3722e2ad5975d372478982fd36233393cd8d2d04 100644
--- a/packages/unit/test/gestures/tap_test.dart
+++ b/packages/unit/test/gestures/tap_test.dart
@@ -10,55 +10,41 @@ class TestGestureArenaMember extends GestureArenaMember {
 void main() {
 
   // Down/up pair 1: normal tap sequence
-  final PointerInputEvent down1 = new PointerInputEvent(
+  const PointerDownEvent down1 = const PointerDownEvent(
     pointer: 1,
-    type: 'pointerdown',
-    x: 10.0,
-    y: 10.0
+    position: const Point(10.0, 10.0)
   );
 
-  final PointerInputEvent up1 = new PointerInputEvent(
+  const PointerUpEvent up1 = const PointerUpEvent(
     pointer: 1,
-    type: 'pointerup',
-    x: 11.0,
-    y: 9.0
+    position: const Point(11.0, 9.0)
   );
 
   // Down/up pair 2: normal tap sequence far away from pair 1
-  final PointerInputEvent down2 = new PointerInputEvent(
+  const PointerDownEvent down2 = const PointerDownEvent(
     pointer: 2,
-    type: 'pointerdown',
-    x: 30.0,
-    y: 30.0
+    position: const Point(30.0, 30.0)
   );
 
-  final PointerInputEvent up2 = new PointerInputEvent(
+  const PointerUpEvent up2 = const PointerUpEvent(
     pointer: 2,
-    type: 'pointerup',
-    x: 31.0,
-    y: 29.0
+    position: const Point(31.0, 29.0)
   );
 
   // Down/move/up sequence 3: intervening motion
-  final PointerInputEvent down3 = new PointerInputEvent(
+  const PointerDownEvent down3 = const PointerDownEvent(
     pointer: 3,
-    type: 'pointerdown',
-    x: 10.0,
-    y: 10.0
+    position: const Point(10.0, 10.0)
   );
 
-  final PointerInputEvent move3 = new PointerInputEvent(
+  const PointerMoveEvent move3 = const PointerMoveEvent(
     pointer: 3,
-    type: 'pointermove',
-    x: 25.0,
-    y: 25.0
+    position: const Point(25.0, 25.0)
   );
 
-  final PointerInputEvent up3 = new PointerInputEvent(
+  const PointerUpEvent up3 = const PointerUpEvent(
     pointer: 3,
-    type: 'pointerup',
-    x: 25.0,
-    y: 25.0
+    position: const Point(25.0, 25.0)
   );
 
   test('Should recognize tap', () {
diff --git a/packages/unit/test/gestures/velocity_tracker_data.dart b/packages/unit/test/gestures/velocity_tracker_data.dart
index baa6c14166f9e5f92c8fa1a3115a609c55524820..9f87bfcd5dff23a3cb7c5ede540c5e2c062fe6c1 100644
--- a/packages/unit/test/gestures/velocity_tracker_data.dart
+++ b/packages/unit/test/gestures/velocity_tracker_data.dart
@@ -1,2144 +1,1534 @@
-final List<Map> velocityEventData = [
-  {
-    "type":"pointerdown",
-    "timeStamp":216690896.0,
-    "pointer":1,
-    "x":270.0,
-    "y":538.2857055664062
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216690906.0,
-    "pointer":1,
-    "x":270.0,
-    "y":538.2857055664062
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216690951.0,
-    "pointer":1,
-    "x":270.0,
-    "y":530.8571166992188
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216690959.0,
-    "pointer":1,
-    "x":270.0,
-    "y":526.8571166992188
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216690967.0,
-    "pointer":1,
-    "x":270.0,
-    "y":521.4285888671875
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216690975.0,
-    "pointer":1,
-    "x":270.0,
-    "y":515.4285888671875
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216690983.0,
-    "pointer":1,
-    "x":270.0,
-    "y":506.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216690991.0,
-    "pointer":1,
-    "x":268.8571472167969,
-    "y":496.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216690998.0,
-    "pointer":1,
-    "x":267.4285583496094,
-    "y":483.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691006.0,
-    "pointer":1,
-    "x":266.28570556640625,
-    "y":469.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691014.0,
-    "pointer":1,
-    "x":265.4285583496094,
-    "y":456.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691021.0,
-    "pointer":1,
-    "x":264.28570556640625,
-    "y":443.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691029.0,
-    "pointer":1,
-    "x":264.0,
-    "y":431.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691036.0,
-    "pointer":1,
-    "x":263.4285583496094,
-    "y":421.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691044.0,
-    "pointer":1,
-    "x":263.4285583496094,
-    "y":412.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691052.0,
-    "pointer":1,
-    "x":263.4285583496094,
-    "y":404.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691060.0,
-    "pointer":1,
-    "x":263.4285583496094,
-    "y":396.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691068.0,
-    "pointer":1,
-    "x":264.5714416503906,
-    "y":390.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691075.0,
-    "pointer":1,
-    "x":265.1428527832031,
-    "y":384.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691083.0,
-    "pointer":1,
-    "x":266.0,
-    "y":380.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691091.0,
-    "pointer":1,
-    "x":266.5714416503906,
-    "y":376.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691098.0,
-    "pointer":1,
-    "x":267.1428527832031,
-    "y":373.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691106.0,
-    "pointer":1,
-    "x":267.71429443359375,
-    "y":370.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691114.0,
-    "pointer":1,
-    "x":268.28570556640625,
-    "y":367.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691121.0,
-    "pointer":1,
-    "x":268.5714416503906,
-    "y":366.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691130.0,
-    "pointer":1,
-    "x":268.8571472167969,
-    "y":364.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691137.0,
-    "pointer":1,
-    "x":269.1428527832031,
-    "y":363.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691145.0,
-    "pointer":1,
-    "x":269.1428527832031,
-    "y":362.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691153.0,
-    "pointer":1,
-    "x":269.4285583496094,
-    "y":362.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691168.0,
-    "pointer":1,
-    "x":268.5714416503906,
-    "y":365.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691176.0,
-    "pointer":1,
-    "x":267.1428527832031,
-    "y":370.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691183.0,
-    "pointer":1,
-    "x":265.4285583496094,
-    "y":376.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691191.0,
-    "pointer":1,
-    "x":263.1428527832031,
-    "y":385.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691199.0,
-    "pointer":1,
-    "x":261.4285583496094,
-    "y":396.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691207.0,
-    "pointer":1,
-    "x":259.71429443359375,
-    "y":408.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691215.0,
-    "pointer":1,
-    "x":258.28570556640625,
-    "y":419.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691222.0,
-    "pointer":1,
-    "x":257.4285583496094,
-    "y":428.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691230.0,
-    "pointer":1,
-    "x":256.28570556640625,
-    "y":436.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691238.0,
-    "pointer":1,
-    "x":255.7142791748047,
-    "y":442.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691245.0,
-    "pointer":1,
-    "x":255.14285278320312,
-    "y":447.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691253.0,
-    "pointer":1,
-    "x":254.85714721679688,
-    "y":453.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691261.0,
-    "pointer":1,
-    "x":254.57142639160156,
-    "y":458.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691268.0,
-    "pointer":1,
-    "x":254.2857208251953,
-    "y":463.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691276.0,
-    "pointer":1,
-    "x":254.2857208251953,
-    "y":470.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691284.0,
-    "pointer":1,
-    "x":254.2857208251953,
-    "y":477.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691292.0,
-    "pointer":1,
-    "x":255.7142791748047,
-    "y":487.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691300.0,
-    "pointer":1,
-    "x":256.8571472167969,
-    "y":498.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691307.0,
-    "pointer":1,
-    "x":258.28570556640625,
-    "y":507.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691315.0,
-    "pointer":1,
-    "x":259.4285583496094,
-    "y":516.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691323.0,
-    "pointer":1,
-    "x":260.28570556640625,
-    "y":521.7142944335938
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216691338.0,
-    "pointer":1,
-    "x":260.28570556640625,
-    "y":521.7142944335938
-  },
-  {
-    "type":"pointerdown",
-    "timeStamp":216691573.0,
-    "pointer":2,
-    "x":266.0,
-    "y":327.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691588.0,
-    "pointer":2,
-    "x":266.0,
-    "y":327.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691626.0,
-    "pointer":2,
-    "x":261.1428527832031,
-    "y":337.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691634.0,
-    "pointer":2,
-    "x":258.28570556640625,
-    "y":343.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691642.0,
-    "pointer":2,
-    "x":254.57142639160156,
-    "y":354.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691650.0,
-    "pointer":2,
-    "x":250.2857208251953,
-    "y":368.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691657.0,
-    "pointer":2,
-    "x":247.42857360839844,
-    "y":382.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691665.0,
-    "pointer":2,
-    "x":245.14285278320312,
-    "y":397.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691673.0,
-    "pointer":2,
-    "x":243.14285278320312,
-    "y":411.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691680.0,
-    "pointer":2,
-    "x":242.2857208251953,
-    "y":426.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691688.0,
-    "pointer":2,
-    "x":241.7142791748047,
-    "y":440.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691696.0,
-    "pointer":2,
-    "x":241.7142791748047,
-    "y":454.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691703.0,
-    "pointer":2,
-    "x":242.57142639160156,
-    "y":467.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691712.0,
-    "pointer":2,
-    "x":243.42857360839844,
-    "y":477.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691720.0,
-    "pointer":2,
-    "x":244.85714721679688,
-    "y":485.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691727.0,
-    "pointer":2,
-    "x":246.2857208251953,
-    "y":493.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216691735.0,
-    "pointer":2,
-    "x":248.0,
-    "y":499.71429443359375
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216691750.0,
-    "pointer":2,
-    "x":248.0,
-    "y":499.71429443359375
-  },
-  {
-    "type":"pointerdown",
-    "timeStamp":216692255.0,
-    "pointer":3,
-    "x":249.42857360839844,
-    "y":351.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692270.0,
-    "pointer":3,
-    "x":249.42857360839844,
-    "y":351.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692309.0,
-    "pointer":3,
-    "x":246.2857208251953,
-    "y":361.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692317.0,
-    "pointer":3,
-    "x":244.0,
-    "y":368.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692325.0,
-    "pointer":3,
-    "x":241.42857360839844,
-    "y":377.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692333.0,
-    "pointer":3,
-    "x":237.7142791748047,
-    "y":391.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692340.0,
-    "pointer":3,
-    "x":235.14285278320312,
-    "y":406.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692348.0,
-    "pointer":3,
-    "x":232.57142639160156,
-    "y":421.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692356.0,
-    "pointer":3,
-    "x":230.2857208251953,
-    "y":436.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692363.0,
-    "pointer":3,
-    "x":228.2857208251953,
-    "y":451.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692371.0,
-    "pointer":3,
-    "x":227.42857360839844,
-    "y":466.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692378.0,
-    "pointer":3,
-    "x":226.2857208251953,
-    "y":479.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692387.0,
-    "pointer":3,
-    "x":225.7142791748047,
-    "y":491.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692395.0,
-    "pointer":3,
-    "x":225.14285278320312,
-    "y":501.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692402.0,
-    "pointer":3,
-    "x":224.85714721679688,
-    "y":509.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692410.0,
-    "pointer":3,
-    "x":224.57142639160156,
-    "y":514.8571166992188
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692418.0,
-    "pointer":3,
-    "x":224.2857208251953,
-    "y":519.4285888671875
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692425.0,
-    "pointer":3,
-    "x":224.0,
-    "y":523.4285888671875
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692433.0,
-    "pointer":3,
-    "x":224.0,
-    "y":527.1428833007812
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692441.0,
-    "pointer":3,
-    "x":224.0,
-    "y":530.5714111328125
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692448.0,
-    "pointer":3,
-    "x":224.0,
-    "y":533.1428833007812
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692456.0,
-    "pointer":3,
-    "x":224.0,
-    "y":535.4285888671875
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692464.0,
-    "pointer":3,
-    "x":223.7142791748047,
-    "y":536.8571166992188
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692472.0,
-    "pointer":3,
-    "x":223.7142791748047,
-    "y":538.2857055664062
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216692487.0,
-    "pointer":3,
-    "x":223.7142791748047,
-    "y":538.2857055664062
-  },
-  {
-    "type":"pointerdown",
-    "timeStamp":216692678.0,
-    "pointer":4,
-    "x":221.42857360839844,
-    "y":526.2857055664062
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692701.0,
-    "pointer":4,
-    "x":220.57142639160156,
-    "y":514.8571166992188
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692708.0,
-    "pointer":4,
-    "x":220.2857208251953,
-    "y":508.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692716.0,
-    "pointer":4,
-    "x":220.2857208251953,
-    "y":498.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692724.0,
-    "pointer":4,
-    "x":221.14285278320312,
-    "y":484.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692732.0,
-    "pointer":4,
-    "x":221.7142791748047,
-    "y":469.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692740.0,
-    "pointer":4,
-    "x":223.42857360839844,
-    "y":453.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692748.0,
-    "pointer":4,
-    "x":225.7142791748047,
-    "y":436.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692755.0,
-    "pointer":4,
-    "x":229.14285278320312,
-    "y":418.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692763.0,
-    "pointer":4,
-    "x":232.85714721679688,
-    "y":400.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692770.0,
-    "pointer":4,
-    "x":236.85714721679688,
-    "y":382.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692778.0,
-    "pointer":4,
-    "x":241.14285278320312,
-    "y":366.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692786.0,
-    "pointer":4,
-    "x":244.85714721679688,
-    "y":350.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216692793.0,
-    "pointer":4,
-    "x":249.14285278320312,
-    "y":335.4285583496094
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216692809.0,
-    "pointer":4,
-    "x":249.14285278320312,
-    "y":335.4285583496094
-  },
-  {
-    "type":"pointerdown",
-    "timeStamp":216693222.0,
-    "pointer":5,
-    "x":224.0,
-    "y":545.4285888671875
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216693245.0,
-    "pointer":5,
-    "x":224.0,
-    "y":545.4285888671875
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216693275.0,
-    "pointer":5,
-    "x":222.85714721679688,
-    "y":535.1428833007812
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216693284.0,
-    "pointer":5,
-    "x":222.85714721679688,
-    "y":528.8571166992188
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216693291.0,
-    "pointer":5,
-    "x":222.2857208251953,
-    "y":518.5714111328125
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216693299.0,
-    "pointer":5,
-    "x":222.0,
-    "y":503.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216693307.0,
-    "pointer":5,
-    "x":222.0,
-    "y":485.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216693314.0,
-    "pointer":5,
-    "x":221.7142791748047,
-    "y":464.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216693322.0,
-    "pointer":5,
-    "x":222.2857208251953,
-    "y":440.28570556640625
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216693337.0,
-    "pointer":5,
-    "x":222.2857208251953,
-    "y":440.28570556640625
-  },
-  {
-    "type":"pointerdown",
-    "timeStamp":216693985.0,
-    "pointer":6,
-    "x":208.0,
-    "y":544.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694047.0,
-    "pointer":6,
-    "x":208.57142639160156,
-    "y":532.2857055664062
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694054.0,
-    "pointer":6,
-    "x":208.85714721679688,
-    "y":525.7142944335938
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694062.0,
-    "pointer":6,
-    "x":208.85714721679688,
-    "y":515.1428833007812
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694070.0,
-    "pointer":6,
-    "x":208.0,
-    "y":501.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694077.0,
-    "pointer":6,
-    "x":207.42857360839844,
-    "y":487.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694085.0,
-    "pointer":6,
-    "x":206.57142639160156,
-    "y":472.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694092.0,
-    "pointer":6,
-    "x":206.57142639160156,
-    "y":458.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694100.0,
-    "pointer":6,
-    "x":206.57142639160156,
-    "y":446.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694108.0,
-    "pointer":6,
-    "x":206.57142639160156,
-    "y":434.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694116.0,
-    "pointer":6,
-    "x":207.14285278320312,
-    "y":423.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694124.0,
-    "pointer":6,
-    "x":208.57142639160156,
-    "y":412.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694131.0,
-    "pointer":6,
-    "x":209.7142791748047,
-    "y":402.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694139.0,
-    "pointer":6,
-    "x":211.7142791748047,
-    "y":393.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694147.0,
-    "pointer":6,
-    "x":213.42857360839844,
-    "y":385.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694154.0,
-    "pointer":6,
-    "x":215.42857360839844,
-    "y":378.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694162.0,
-    "pointer":6,
-    "x":217.42857360839844,
-    "y":371.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694169.0,
-    "pointer":6,
-    "x":219.42857360839844,
-    "y":366.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694177.0,
-    "pointer":6,
-    "x":221.42857360839844,
-    "y":360.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694185.0,
-    "pointer":6,
-    "x":223.42857360839844,
-    "y":356.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694193.0,
-    "pointer":6,
-    "x":225.14285278320312,
-    "y":352.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694201.0,
-    "pointer":6,
-    "x":226.85714721679688,
-    "y":348.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694209.0,
-    "pointer":6,
-    "x":228.2857208251953,
-    "y":346.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694216.0,
-    "pointer":6,
-    "x":229.14285278320312,
-    "y":343.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694224.0,
-    "pointer":6,
-    "x":230.0,
-    "y":342.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694232.0,
-    "pointer":6,
-    "x":230.57142639160156,
-    "y":340.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694239.0,
-    "pointer":6,
-    "x":230.85714721679688,
-    "y":339.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694247.0,
-    "pointer":6,
-    "x":230.85714721679688,
-    "y":339.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694262.0,
-    "pointer":6,
-    "x":230.2857208251953,
-    "y":342.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694270.0,
-    "pointer":6,
-    "x":228.85714721679688,
-    "y":346.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694278.0,
-    "pointer":6,
-    "x":227.14285278320312,
-    "y":352.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694286.0,
-    "pointer":6,
-    "x":225.42857360839844,
-    "y":359.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694294.0,
-    "pointer":6,
-    "x":223.7142791748047,
-    "y":367.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694301.0,
-    "pointer":6,
-    "x":222.57142639160156,
-    "y":376.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694309.0,
-    "pointer":6,
-    "x":221.42857360839844,
-    "y":384.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694317.0,
-    "pointer":6,
-    "x":220.85714721679688,
-    "y":392.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694324.0,
-    "pointer":6,
-    "x":220.0,
-    "y":400.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694332.0,
-    "pointer":6,
-    "x":219.14285278320312,
-    "y":409.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694339.0,
-    "pointer":6,
-    "x":218.85714721679688,
-    "y":419.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694348.0,
-    "pointer":6,
-    "x":218.2857208251953,
-    "y":428.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694356.0,
-    "pointer":6,
-    "x":218.2857208251953,
-    "y":438.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694363.0,
-    "pointer":6,
-    "x":218.2857208251953,
-    "y":447.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694371.0,
-    "pointer":6,
-    "x":218.2857208251953,
-    "y":455.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694379.0,
-    "pointer":6,
-    "x":219.14285278320312,
-    "y":462.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694386.0,
-    "pointer":6,
-    "x":220.0,
-    "y":469.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694394.0,
-    "pointer":6,
-    "x":221.14285278320312,
-    "y":475.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694401.0,
-    "pointer":6,
-    "x":222.0,
-    "y":480.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694409.0,
-    "pointer":6,
-    "x":222.85714721679688,
-    "y":485.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694417.0,
-    "pointer":6,
-    "x":224.0,
-    "y":489.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694425.0,
-    "pointer":6,
-    "x":224.85714721679688,
-    "y":492.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694433.0,
-    "pointer":6,
-    "x":225.42857360839844,
-    "y":495.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694440.0,
-    "pointer":6,
-    "x":226.0,
-    "y":497.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694448.0,
-    "pointer":6,
-    "x":226.2857208251953,
-    "y":498.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694456.0,
-    "pointer":6,
-    "x":226.2857208251953,
-    "y":498.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694471.0,
-    "pointer":6,
-    "x":226.2857208251953,
-    "y":498.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694479.0,
-    "pointer":6,
-    "x":226.2857208251953,
-    "y":496.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694486.0,
-    "pointer":6,
-    "x":226.2857208251953,
-    "y":493.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694494.0,
-    "pointer":6,
-    "x":226.2857208251953,
-    "y":490.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694502.0,
-    "pointer":6,
-    "x":226.2857208251953,
-    "y":486.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694510.0,
-    "pointer":6,
-    "x":226.2857208251953,
-    "y":480.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694518.0,
-    "pointer":6,
-    "x":226.2857208251953,
-    "y":475.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694525.0,
-    "pointer":6,
-    "x":226.2857208251953,
-    "y":468.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694533.0,
-    "pointer":6,
-    "x":226.2857208251953,
-    "y":461.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694541.0,
-    "pointer":6,
-    "x":226.2857208251953,
-    "y":452.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694548.0,
-    "pointer":6,
-    "x":226.57142639160156,
-    "y":442.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694556.0,
-    "pointer":6,
-    "x":226.57142639160156,
-    "y":432.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694564.0,
-    "pointer":6,
-    "x":226.85714721679688,
-    "y":423.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694571.0,
-    "pointer":6,
-    "x":227.42857360839844,
-    "y":416.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694580.0,
-    "pointer":6,
-    "x":227.7142791748047,
-    "y":410.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694587.0,
-    "pointer":6,
-    "x":228.2857208251953,
-    "y":404.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694595.0,
-    "pointer":6,
-    "x":228.85714721679688,
-    "y":399.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694603.0,
-    "pointer":6,
-    "x":229.14285278320312,
-    "y":395.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694610.0,
-    "pointer":6,
-    "x":229.42857360839844,
-    "y":392.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694618.0,
-    "pointer":6,
-    "x":229.7142791748047,
-    "y":390.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694625.0,
-    "pointer":6,
-    "x":229.7142791748047,
-    "y":388.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694633.0,
-    "pointer":6,
-    "x":229.7142791748047,
-    "y":386.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694641.0,
-    "pointer":6,
-    "x":229.7142791748047,
-    "y":386.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694648.0,
-    "pointer":6,
-    "x":229.7142791748047,
-    "y":386.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694657.0,
-    "pointer":6,
-    "x":228.85714721679688,
-    "y":386.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694665.0,
-    "pointer":6,
-    "x":228.0,
-    "y":388.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694672.0,
-    "pointer":6,
-    "x":226.0,
-    "y":392.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694680.0,
-    "pointer":6,
-    "x":224.0,
-    "y":397.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694688.0,
-    "pointer":6,
-    "x":222.0,
-    "y":404.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694695.0,
-    "pointer":6,
-    "x":219.7142791748047,
-    "y":411.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694703.0,
-    "pointer":6,
-    "x":218.2857208251953,
-    "y":418.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694710.0,
-    "pointer":6,
-    "x":217.14285278320312,
-    "y":425.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694718.0,
-    "pointer":6,
-    "x":215.7142791748047,
-    "y":433.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694726.0,
-    "pointer":6,
-    "x":214.85714721679688,
-    "y":442.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694734.0,
-    "pointer":6,
-    "x":214.0,
-    "y":454.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694742.0,
-    "pointer":6,
-    "x":214.0,
-    "y":469.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694749.0,
-    "pointer":6,
-    "x":215.42857360839844,
-    "y":485.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694757.0,
-    "pointer":6,
-    "x":217.7142791748047,
-    "y":502.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694765.0,
-    "pointer":6,
-    "x":221.14285278320312,
-    "y":521.4285888671875
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694772.0,
-    "pointer":6,
-    "x":224.57142639160156,
-    "y":541.1428833007812
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694780.0,
-    "pointer":6,
-    "x":229.14285278320312,
-    "y":561.1428833007812
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216694788.0,
-    "pointer":6,
-    "x":233.42857360839844,
-    "y":578.8571166992188
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216694802.0,
-    "pointer":6,
-    "x":233.42857360839844,
-    "y":578.8571166992188
-  },
-  {
-    "type":"pointerdown",
-    "timeStamp":216695344.0,
-    "pointer":7,
-    "x":253.42857360839844,
-    "y":310.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695352.0,
-    "pointer":7,
-    "x":253.42857360839844,
-    "y":310.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695359.0,
-    "pointer":7,
-    "x":252.85714721679688,
-    "y":318.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695367.0,
-    "pointer":7,
-    "x":251.14285278320312,
-    "y":322.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695375.0,
-    "pointer":7,
-    "x":248.85714721679688,
-    "y":327.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695382.0,
-    "pointer":7,
-    "x":246.0,
-    "y":334.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695390.0,
-    "pointer":7,
-    "x":242.57142639160156,
-    "y":344.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695397.0,
-    "pointer":7,
-    "x":238.85714721679688,
-    "y":357.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695406.0,
-    "pointer":7,
-    "x":235.7142791748047,
-    "y":371.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695414.0,
-    "pointer":7,
-    "x":232.2857208251953,
-    "y":386.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695421.0,
-    "pointer":7,
-    "x":229.42857360839844,
-    "y":402.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695429.0,
-    "pointer":7,
-    "x":227.42857360839844,
-    "y":416.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695437.0,
-    "pointer":7,
-    "x":226.2857208251953,
-    "y":431.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695444.0,
-    "pointer":7,
-    "x":226.2857208251953,
-    "y":446.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695452.0,
-    "pointer":7,
-    "x":227.7142791748047,
-    "y":460.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695459.0,
-    "pointer":7,
-    "x":230.0,
-    "y":475.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695467.0,
-    "pointer":7,
-    "x":232.2857208251953,
-    "y":489.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695475.0,
-    "pointer":7,
-    "x":235.7142791748047,
-    "y":504.0
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216695490.0,
-    "pointer":7,
-    "x":235.7142791748047,
-    "y":504.0
-  },
-  {
-    "type":"pointerdown",
-    "timeStamp":216695885.0,
-    "pointer":8,
-    "x":238.85714721679688,
-    "y":524.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695908.0,
-    "pointer":8,
-    "x":236.2857208251953,
-    "y":515.7142944335938
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695916.0,
-    "pointer":8,
-    "x":234.85714721679688,
-    "y":509.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695924.0,
-    "pointer":8,
-    "x":232.57142639160156,
-    "y":498.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695931.0,
-    "pointer":8,
-    "x":230.57142639160156,
-    "y":483.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695939.0,
-    "pointer":8,
-    "x":229.14285278320312,
-    "y":466.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695947.0,
-    "pointer":8,
-    "x":229.14285278320312,
-    "y":446.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695955.0,
-    "pointer":8,
-    "x":230.57142639160156,
-    "y":424.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695963.0,
-    "pointer":8,
-    "x":232.57142639160156,
-    "y":402.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695970.0,
-    "pointer":8,
-    "x":235.14285278320312,
-    "y":380.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216695978.0,
-    "pointer":8,
-    "x":238.57142639160156,
-    "y":359.4285583496094
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216695993.0,
-    "pointer":8,
-    "x":238.57142639160156,
-    "y":359.4285583496094
-  },
-  {
-    "type":"pointerdown",
-    "timeStamp":216696429.0,
-    "pointer":9,
-    "x":238.2857208251953,
-    "y":568.5714111328125
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216696459.0,
-    "pointer":9,
-    "x":234.0,
-    "y":560.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216696467.0,
-    "pointer":9,
-    "x":231.42857360839844,
-    "y":553.1428833007812
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216696475.0,
-    "pointer":9,
-    "x":228.2857208251953,
-    "y":543.1428833007812
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216696483.0,
-    "pointer":9,
-    "x":225.42857360839844,
-    "y":528.8571166992188
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216696491.0,
-    "pointer":9,
-    "x":223.14285278320312,
-    "y":512.2857055664062
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216696498.0,
-    "pointer":9,
-    "x":222.0,
-    "y":495.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216696506.0,
-    "pointer":9,
-    "x":221.7142791748047,
-    "y":477.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216696514.0,
-    "pointer":9,
-    "x":221.7142791748047,
-    "y":458.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216696521.0,
-    "pointer":9,
-    "x":223.14285278320312,
-    "y":438.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216696529.0,
-    "pointer":9,
-    "x":224.2857208251953,
-    "y":416.28570556640625
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216696544.0,
-    "pointer":9,
-    "x":224.2857208251953,
-    "y":416.28570556640625
-  },
-  {
-    "type":"pointerdown",
-    "timeStamp":216696974.0,
-    "pointer":10,
-    "x":218.57142639160156,
-    "y":530.5714111328125
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697012.0,
-    "pointer":10,
-    "x":220.2857208251953,
-    "y":522.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697020.0,
-    "pointer":10,
-    "x":221.14285278320312,
-    "y":517.7142944335938
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697028.0,
-    "pointer":10,
-    "x":222.2857208251953,
-    "y":511.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697036.0,
-    "pointer":10,
-    "x":224.0,
-    "y":504.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697044.0,
-    "pointer":10,
-    "x":227.14285278320312,
-    "y":490.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697052.0,
-    "pointer":10,
-    "x":229.42857360839844,
-    "y":474.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697059.0,
-    "pointer":10,
-    "x":231.42857360839844,
-    "y":454.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697067.0,
-    "pointer":10,
-    "x":233.7142791748047,
-    "y":431.1428527832031
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216697082.0,
-    "pointer":10,
-    "x":233.7142791748047,
-    "y":431.1428527832031
-  },
-  {
-    "type":"pointerdown",
-    "timeStamp":216697435.0,
-    "pointer":11,
-    "x":257.1428527832031,
-    "y":285.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697465.0,
-    "pointer":11,
-    "x":251.7142791748047,
-    "y":296.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697473.0,
-    "pointer":11,
-    "x":248.2857208251953,
-    "y":304.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697481.0,
-    "pointer":11,
-    "x":244.57142639160156,
-    "y":314.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697489.0,
-    "pointer":11,
-    "x":240.2857208251953,
-    "y":329.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697497.0,
-    "pointer":11,
-    "x":236.85714721679688,
-    "y":345.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697505.0,
-    "pointer":11,
-    "x":233.7142791748047,
-    "y":361.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697512.0,
-    "pointer":11,
-    "x":231.14285278320312,
-    "y":378.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697520.0,
-    "pointer":11,
-    "x":229.42857360839844,
-    "y":395.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697528.0,
-    "pointer":11,
-    "x":229.42857360839844,
-    "y":412.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697535.0,
-    "pointer":11,
-    "x":230.85714721679688,
-    "y":430.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697543.0,
-    "pointer":11,
-    "x":233.42857360839844,
-    "y":449.71429443359375
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216697558.0,
-    "pointer":11,
-    "x":233.42857360839844,
-    "y":449.71429443359375
-  },
-  {
-    "type":"pointerdown",
-    "timeStamp":216697749.0,
-    "pointer":12,
-    "x":246.0,
-    "y":311.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697780.0,
-    "pointer":12,
-    "x":244.57142639160156,
-    "y":318.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697787.0,
-    "pointer":12,
-    "x":243.14285278320312,
-    "y":325.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697795.0,
-    "pointer":12,
-    "x":241.42857360839844,
-    "y":336.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697803.0,
-    "pointer":12,
-    "x":239.7142791748047,
-    "y":351.1428527832031
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697811.0,
-    "pointer":12,
-    "x":238.2857208251953,
-    "y":368.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697819.0,
-    "pointer":12,
-    "x":238.0,
-    "y":389.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697826.0,
-    "pointer":12,
-    "x":239.14285278320312,
-    "y":412.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697834.0,
-    "pointer":12,
-    "x":242.2857208251953,
-    "y":438.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697842.0,
-    "pointer":12,
-    "x":247.42857360839844,
-    "y":466.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216697849.0,
-    "pointer":12,
-    "x":254.2857208251953,
-    "y":497.71429443359375
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216697864.0,
-    "pointer":12,
-    "x":254.2857208251953,
-    "y":497.71429443359375
-  },
-  {
-    "type":"pointerdown",
-    "timeStamp":216698321.0,
-    "pointer":13,
-    "x":250.0,
-    "y":306.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216698328.0,
-    "pointer":13,
-    "x":250.0,
-    "y":306.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216698344.0,
-    "pointer":13,
-    "x":249.14285278320312,
-    "y":314.0
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216698351.0,
-    "pointer":13,
-    "x":247.42857360839844,
-    "y":319.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216698359.0,
-    "pointer":13,
-    "x":245.14285278320312,
-    "y":326.8571472167969
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216698366.0,
-    "pointer":13,
-    "x":241.7142791748047,
-    "y":339.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216698374.0,
-    "pointer":13,
-    "x":238.57142639160156,
-    "y":355.71429443359375
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216698382.0,
-    "pointer":13,
-    "x":236.2857208251953,
-    "y":374.28570556640625
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216698390.0,
-    "pointer":13,
-    "x":235.14285278320312,
-    "y":396.5714416503906
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216698398.0,
-    "pointer":13,
-    "x":236.57142639160156,
-    "y":421.4285583496094
-  },
-  {
-    "type":"pointermove",
-    "timeStamp":216698406.0,
-    "pointer":13,
-    "x":241.14285278320312,
-    "y":451.4285583496094
-  },
-  {
-    "type":"pointerup",
-    "timeStamp":216698421.0,
-    "pointer":13,
-    "x":241.14285278320312,
-    "y":451.4285583496094
-  }
+import 'package:flutter/gestures.dart';
+
+const List<PointerEvent> velocityEventData = const <PointerEvent>[
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216690896),
+    pointer: 1,
+    position: const Point(270.0, 538.2857055664062)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216690906),
+    pointer: 1,
+    position: const Point(270.0, 538.2857055664062)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216690951),
+    pointer: 1,
+    position: const Point(270.0, 530.8571166992188)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216690959),
+    pointer: 1,
+    position: const Point(270.0, 526.8571166992188)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216690967),
+    pointer: 1,
+    position: const Point(270.0, 521.4285888671875)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216690975),
+    pointer: 1,
+    position: const Point(270.0, 515.4285888671875)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216690983),
+    pointer: 1,
+    position: const Point(270.0, 506.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216690991),
+    pointer: 1,
+    position: const Point(268.8571472167969, 496.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216690998),
+    pointer: 1,
+    position: const Point(267.4285583496094, 483.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691006),
+    pointer: 1,
+    position: const Point(266.28570556640625, 469.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691014),
+    pointer: 1,
+    position: const Point(265.4285583496094, 456.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691021),
+    pointer: 1,
+    position: const Point(264.28570556640625, 443.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691029),
+    pointer: 1,
+    position: const Point(264.0, 431.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691036),
+    pointer: 1,
+    position: const Point(263.4285583496094, 421.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691044),
+    pointer: 1,
+    position: const Point(263.4285583496094, 412.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691052),
+    pointer: 1,
+    position: const Point(263.4285583496094, 404.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691060),
+    pointer: 1,
+    position: const Point(263.4285583496094, 396.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691068),
+    pointer: 1,
+    position: const Point(264.5714416503906, 390.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691075),
+    pointer: 1,
+    position: const Point(265.1428527832031, 384.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691083),
+    pointer: 1,
+    position: const Point(266.0, 380.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691091),
+    pointer: 1,
+    position: const Point(266.5714416503906, 376.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691098),
+    pointer: 1,
+    position: const Point(267.1428527832031, 373.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691106),
+    pointer: 1,
+    position: const Point(267.71429443359375, 370.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691114),
+    pointer: 1,
+    position: const Point(268.28570556640625, 367.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691121),
+    pointer: 1,
+    position: const Point(268.5714416503906, 366.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691130),
+    pointer: 1,
+    position: const Point(268.8571472167969, 364.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691137),
+    pointer: 1,
+    position: const Point(269.1428527832031, 363.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691145),
+    pointer: 1,
+    position: const Point(269.1428527832031, 362.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691153),
+    pointer: 1,
+    position: const Point(269.4285583496094, 362.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691168),
+    pointer: 1,
+    position: const Point(268.5714416503906, 365.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691176),
+    pointer: 1,
+    position: const Point(267.1428527832031, 370.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691183),
+    pointer: 1,
+    position: const Point(265.4285583496094, 376.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691191),
+    pointer: 1,
+    position: const Point(263.1428527832031, 385.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691199),
+    pointer: 1,
+    position: const Point(261.4285583496094, 396.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691207),
+    pointer: 1,
+    position: const Point(259.71429443359375, 408.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691215),
+    pointer: 1,
+    position: const Point(258.28570556640625, 419.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691222),
+    pointer: 1,
+    position: const Point(257.4285583496094, 428.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691230),
+    pointer: 1,
+    position: const Point(256.28570556640625, 436.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691238),
+    pointer: 1,
+    position: const Point(255.7142791748047, 442.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691245),
+    pointer: 1,
+    position: const Point(255.14285278320312, 447.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691253),
+    pointer: 1,
+    position: const Point(254.85714721679688, 453.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691261),
+    pointer: 1,
+    position: const Point(254.57142639160156, 458.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691268),
+    pointer: 1,
+    position: const Point(254.2857208251953, 463.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691276),
+    pointer: 1,
+    position: const Point(254.2857208251953, 470.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691284),
+    pointer: 1,
+    position: const Point(254.2857208251953, 477.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691292),
+    pointer: 1,
+    position: const Point(255.7142791748047, 487.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691300),
+    pointer: 1,
+    position: const Point(256.8571472167969, 498.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691307),
+    pointer: 1,
+    position: const Point(258.28570556640625, 507.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691315),
+    pointer: 1,
+    position: const Point(259.4285583496094, 516.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691323),
+    pointer: 1,
+    position: const Point(260.28570556640625, 521.7142944335938)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216691338),
+    pointer: 1,
+    position: const Point(260.28570556640625, 521.7142944335938)
+  ),
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216691573),
+    pointer: 2,
+    position: const Point(266.0, 327.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691588),
+    pointer: 2,
+    position: const Point(266.0, 327.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691626),
+    pointer: 2,
+    position: const Point(261.1428527832031, 337.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691634),
+    pointer: 2,
+    position: const Point(258.28570556640625, 343.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691642),
+    pointer: 2,
+    position: const Point(254.57142639160156, 354.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691650),
+    pointer: 2,
+    position: const Point(250.2857208251953, 368.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691657),
+    pointer: 2,
+    position: const Point(247.42857360839844, 382.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691665),
+    pointer: 2,
+    position: const Point(245.14285278320312, 397.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691673),
+    pointer: 2,
+    position: const Point(243.14285278320312, 411.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691680),
+    pointer: 2,
+    position: const Point(242.2857208251953, 426.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691688),
+    pointer: 2,
+    position: const Point(241.7142791748047, 440.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691696),
+    pointer: 2,
+    position: const Point(241.7142791748047, 454.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691703),
+    pointer: 2,
+    position: const Point(242.57142639160156, 467.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691712),
+    pointer: 2,
+    position: const Point(243.42857360839844, 477.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691720),
+    pointer: 2,
+    position: const Point(244.85714721679688, 485.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691727),
+    pointer: 2,
+    position: const Point(246.2857208251953, 493.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216691735),
+    pointer: 2,
+    position: const Point(248.0, 499.71429443359375)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216691750),
+    pointer: 2,
+    position: const Point(248.0, 499.71429443359375)
+  ),
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216692255),
+    pointer: 3,
+    position: const Point(249.42857360839844, 351.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692270),
+    pointer: 3,
+    position: const Point(249.42857360839844, 351.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692309),
+    pointer: 3,
+    position: const Point(246.2857208251953, 361.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692317),
+    pointer: 3,
+    position: const Point(244.0, 368.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692325),
+    pointer: 3,
+    position: const Point(241.42857360839844, 377.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692333),
+    pointer: 3,
+    position: const Point(237.7142791748047, 391.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692340),
+    pointer: 3,
+    position: const Point(235.14285278320312, 406.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692348),
+    pointer: 3,
+    position: const Point(232.57142639160156, 421.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692356),
+    pointer: 3,
+    position: const Point(230.2857208251953, 436.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692363),
+    pointer: 3,
+    position: const Point(228.2857208251953, 451.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692371),
+    pointer: 3,
+    position: const Point(227.42857360839844, 466.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692378),
+    pointer: 3,
+    position: const Point(226.2857208251953, 479.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692387),
+    pointer: 3,
+    position: const Point(225.7142791748047, 491.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692395),
+    pointer: 3,
+    position: const Point(225.14285278320312, 501.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692402),
+    pointer: 3,
+    position: const Point(224.85714721679688, 509.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692410),
+    pointer: 3,
+    position: const Point(224.57142639160156, 514.8571166992188)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692418),
+    pointer: 3,
+    position: const Point(224.2857208251953, 519.4285888671875)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692425),
+    pointer: 3,
+    position: const Point(224.0, 523.4285888671875)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692433),
+    pointer: 3,
+    position: const Point(224.0, 527.1428833007812)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692441),
+    pointer: 3,
+    position: const Point(224.0, 530.5714111328125)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692448),
+    pointer: 3,
+    position: const Point(224.0, 533.1428833007812)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692456),
+    pointer: 3,
+    position: const Point(224.0, 535.4285888671875)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692464),
+    pointer: 3,
+    position: const Point(223.7142791748047, 536.8571166992188)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692472),
+    pointer: 3,
+    position: const Point(223.7142791748047, 538.2857055664062)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216692487),
+    pointer: 3,
+    position: const Point(223.7142791748047, 538.2857055664062)
+  ),
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216692678),
+    pointer: 4,
+    position: const Point(221.42857360839844, 526.2857055664062)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692701),
+    pointer: 4,
+    position: const Point(220.57142639160156, 514.8571166992188)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692708),
+    pointer: 4,
+    position: const Point(220.2857208251953, 508.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692716),
+    pointer: 4,
+    position: const Point(220.2857208251953, 498.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692724),
+    pointer: 4,
+    position: const Point(221.14285278320312, 484.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692732),
+    pointer: 4,
+    position: const Point(221.7142791748047, 469.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692740),
+    pointer: 4,
+    position: const Point(223.42857360839844, 453.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692748),
+    pointer: 4,
+    position: const Point(225.7142791748047, 436.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692755),
+    pointer: 4,
+    position: const Point(229.14285278320312, 418.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692763),
+    pointer: 4,
+    position: const Point(232.85714721679688, 400.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692770),
+    pointer: 4,
+    position: const Point(236.85714721679688, 382.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692778),
+    pointer: 4,
+    position: const Point(241.14285278320312, 366.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692786),
+    pointer: 4,
+    position: const Point(244.85714721679688, 350.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216692793),
+    pointer: 4,
+    position: const Point(249.14285278320312, 335.4285583496094)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216692809),
+    pointer: 4,
+    position: const Point(249.14285278320312, 335.4285583496094)
+  ),
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216693222),
+    pointer: 5,
+    position: const Point(224.0, 545.4285888671875)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216693245),
+    pointer: 5,
+    position: const Point(224.0, 545.4285888671875)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216693275),
+    pointer: 5,
+    position: const Point(222.85714721679688, 535.1428833007812)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216693284),
+    pointer: 5,
+    position: const Point(222.85714721679688, 528.8571166992188)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216693291),
+    pointer: 5,
+    position: const Point(222.2857208251953, 518.5714111328125)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216693299),
+    pointer: 5,
+    position: const Point(222.0, 503.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216693307),
+    pointer: 5,
+    position: const Point(222.0, 485.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216693314),
+    pointer: 5,
+    position: const Point(221.7142791748047, 464.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216693322),
+    pointer: 5,
+    position: const Point(222.2857208251953, 440.28570556640625)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216693337),
+    pointer: 5,
+    position: const Point(222.2857208251953, 440.28570556640625)
+  ),
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216693985),
+    pointer: 6,
+    position: const Point(208.0, 544.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694047),
+    pointer: 6,
+    position: const Point(208.57142639160156, 532.2857055664062)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694054),
+    pointer: 6,
+    position: const Point(208.85714721679688, 525.7142944335938)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694062),
+    pointer: 6,
+    position: const Point(208.85714721679688, 515.1428833007812)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694070),
+    pointer: 6,
+    position: const Point(208.0, 501.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694077),
+    pointer: 6,
+    position: const Point(207.42857360839844, 487.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694085),
+    pointer: 6,
+    position: const Point(206.57142639160156, 472.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694092),
+    pointer: 6,
+    position: const Point(206.57142639160156, 458.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694100),
+    pointer: 6,
+    position: const Point(206.57142639160156, 446.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694108),
+    pointer: 6,
+    position: const Point(206.57142639160156, 434.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694116),
+    pointer: 6,
+    position: const Point(207.14285278320312, 423.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694124),
+    pointer: 6,
+    position: const Point(208.57142639160156, 412.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694131),
+    pointer: 6,
+    position: const Point(209.7142791748047, 402.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694139),
+    pointer: 6,
+    position: const Point(211.7142791748047, 393.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694147),
+    pointer: 6,
+    position: const Point(213.42857360839844, 385.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694154),
+    pointer: 6,
+    position: const Point(215.42857360839844, 378.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694162),
+    pointer: 6,
+    position: const Point(217.42857360839844, 371.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694169),
+    pointer: 6,
+    position: const Point(219.42857360839844, 366.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694177),
+    pointer: 6,
+    position: const Point(221.42857360839844, 360.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694185),
+    pointer: 6,
+    position: const Point(223.42857360839844, 356.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694193),
+    pointer: 6,
+    position: const Point(225.14285278320312, 352.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694201),
+    pointer: 6,
+    position: const Point(226.85714721679688, 348.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694209),
+    pointer: 6,
+    position: const Point(228.2857208251953, 346.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694216),
+    pointer: 6,
+    position: const Point(229.14285278320312, 343.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694224),
+    pointer: 6,
+    position: const Point(230.0, 342.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694232),
+    pointer: 6,
+    position: const Point(230.57142639160156, 340.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694239),
+    pointer: 6,
+    position: const Point(230.85714721679688, 339.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694247),
+    pointer: 6,
+    position: const Point(230.85714721679688, 339.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694262),
+    pointer: 6,
+    position: const Point(230.2857208251953, 342.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694270),
+    pointer: 6,
+    position: const Point(228.85714721679688, 346.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694278),
+    pointer: 6,
+    position: const Point(227.14285278320312, 352.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694286),
+    pointer: 6,
+    position: const Point(225.42857360839844, 359.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694294),
+    pointer: 6,
+    position: const Point(223.7142791748047, 367.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694301),
+    pointer: 6,
+    position: const Point(222.57142639160156, 376.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694309),
+    pointer: 6,
+    position: const Point(221.42857360839844, 384.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694317),
+    pointer: 6,
+    position: const Point(220.85714721679688, 392.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694324),
+    pointer: 6,
+    position: const Point(220.0, 400.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694332),
+    pointer: 6,
+    position: const Point(219.14285278320312, 409.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694339),
+    pointer: 6,
+    position: const Point(218.85714721679688, 419.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694348),
+    pointer: 6,
+    position: const Point(218.2857208251953, 428.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694356),
+    pointer: 6,
+    position: const Point(218.2857208251953, 438.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694363),
+    pointer: 6,
+    position: const Point(218.2857208251953, 447.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694371),
+    pointer: 6,
+    position: const Point(218.2857208251953, 455.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694379),
+    pointer: 6,
+    position: const Point(219.14285278320312, 462.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694386),
+    pointer: 6,
+    position: const Point(220.0, 469.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694394),
+    pointer: 6,
+    position: const Point(221.14285278320312, 475.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694401),
+    pointer: 6,
+    position: const Point(222.0, 480.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694409),
+    pointer: 6,
+    position: const Point(222.85714721679688, 485.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694417),
+    pointer: 6,
+    position: const Point(224.0, 489.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694425),
+    pointer: 6,
+    position: const Point(224.85714721679688, 492.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694433),
+    pointer: 6,
+    position: const Point(225.42857360839844, 495.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694440),
+    pointer: 6,
+    position: const Point(226.0, 497.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694448),
+    pointer: 6,
+    position: const Point(226.2857208251953, 498.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694456),
+    pointer: 6,
+    position: const Point(226.2857208251953, 498.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694471),
+    pointer: 6,
+    position: const Point(226.2857208251953, 498.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694479),
+    pointer: 6,
+    position: const Point(226.2857208251953, 496.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694486),
+    pointer: 6,
+    position: const Point(226.2857208251953, 493.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694494),
+    pointer: 6,
+    position: const Point(226.2857208251953, 490.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694502),
+    pointer: 6,
+    position: const Point(226.2857208251953, 486.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694510),
+    pointer: 6,
+    position: const Point(226.2857208251953, 480.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694518),
+    pointer: 6,
+    position: const Point(226.2857208251953, 475.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694525),
+    pointer: 6,
+    position: const Point(226.2857208251953, 468.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694533),
+    pointer: 6,
+    position: const Point(226.2857208251953, 461.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694541),
+    pointer: 6,
+    position: const Point(226.2857208251953, 452.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694548),
+    pointer: 6,
+    position: const Point(226.57142639160156, 442.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694556),
+    pointer: 6,
+    position: const Point(226.57142639160156, 432.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694564),
+    pointer: 6,
+    position: const Point(226.85714721679688, 423.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694571),
+    pointer: 6,
+    position: const Point(227.42857360839844, 416.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694580),
+    pointer: 6,
+    position: const Point(227.7142791748047, 410.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694587),
+    pointer: 6,
+    position: const Point(228.2857208251953, 404.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694595),
+    pointer: 6,
+    position: const Point(228.85714721679688, 399.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694603),
+    pointer: 6,
+    position: const Point(229.14285278320312, 395.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694610),
+    pointer: 6,
+    position: const Point(229.42857360839844, 392.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694618),
+    pointer: 6,
+    position: const Point(229.7142791748047, 390.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694625),
+    pointer: 6,
+    position: const Point(229.7142791748047, 388.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694633),
+    pointer: 6,
+    position: const Point(229.7142791748047, 386.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694641),
+    pointer: 6,
+    position: const Point(229.7142791748047, 386.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694648),
+    pointer: 6,
+    position: const Point(229.7142791748047, 386.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694657),
+    pointer: 6,
+    position: const Point(228.85714721679688, 386.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694665),
+    pointer: 6,
+    position: const Point(228.0, 388.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694672),
+    pointer: 6,
+    position: const Point(226.0, 392.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694680),
+    pointer: 6,
+    position: const Point(224.0, 397.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694688),
+    pointer: 6,
+    position: const Point(222.0, 404.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694695),
+    pointer: 6,
+    position: const Point(219.7142791748047, 411.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694703),
+    pointer: 6,
+    position: const Point(218.2857208251953, 418.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694710),
+    pointer: 6,
+    position: const Point(217.14285278320312, 425.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694718),
+    pointer: 6,
+    position: const Point(215.7142791748047, 433.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694726),
+    pointer: 6,
+    position: const Point(214.85714721679688, 442.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694734),
+    pointer: 6,
+    position: const Point(214.0, 454.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694742),
+    pointer: 6,
+    position: const Point(214.0, 469.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694749),
+    pointer: 6,
+    position: const Point(215.42857360839844, 485.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694757),
+    pointer: 6,
+    position: const Point(217.7142791748047, 502.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694765),
+    pointer: 6,
+    position: const Point(221.14285278320312, 521.4285888671875)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694772),
+    pointer: 6,
+    position: const Point(224.57142639160156, 541.1428833007812)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694780),
+    pointer: 6,
+    position: const Point(229.14285278320312, 561.1428833007812)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216694788),
+    pointer: 6,
+    position: const Point(233.42857360839844, 578.8571166992188)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216694802),
+    pointer: 6,
+    position: const Point(233.42857360839844, 578.8571166992188)
+  ),
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216695344),
+    pointer: 7,
+    position: const Point(253.42857360839844, 310.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695352),
+    pointer: 7,
+    position: const Point(253.42857360839844, 310.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695359),
+    pointer: 7,
+    position: const Point(252.85714721679688, 318.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695367),
+    pointer: 7,
+    position: const Point(251.14285278320312, 322.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695375),
+    pointer: 7,
+    position: const Point(248.85714721679688, 327.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695382),
+    pointer: 7,
+    position: const Point(246.0, 334.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695390),
+    pointer: 7,
+    position: const Point(242.57142639160156, 344.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695397),
+    pointer: 7,
+    position: const Point(238.85714721679688, 357.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695406),
+    pointer: 7,
+    position: const Point(235.7142791748047, 371.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695414),
+    pointer: 7,
+    position: const Point(232.2857208251953, 386.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695421),
+    pointer: 7,
+    position: const Point(229.42857360839844, 402.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695429),
+    pointer: 7,
+    position: const Point(227.42857360839844, 416.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695437),
+    pointer: 7,
+    position: const Point(226.2857208251953, 431.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695444),
+    pointer: 7,
+    position: const Point(226.2857208251953, 446.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695452),
+    pointer: 7,
+    position: const Point(227.7142791748047, 460.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695459),
+    pointer: 7,
+    position: const Point(230.0, 475.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695467),
+    pointer: 7,
+    position: const Point(232.2857208251953, 489.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695475),
+    pointer: 7,
+    position: const Point(235.7142791748047, 504.0)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216695490),
+    pointer: 7,
+    position: const Point(235.7142791748047, 504.0)
+  ),
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216695885),
+    pointer: 8,
+    position: const Point(238.85714721679688, 524.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695908),
+    pointer: 8,
+    position: const Point(236.2857208251953, 515.7142944335938)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695916),
+    pointer: 8,
+    position: const Point(234.85714721679688, 509.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695924),
+    pointer: 8,
+    position: const Point(232.57142639160156, 498.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695931),
+    pointer: 8,
+    position: const Point(230.57142639160156, 483.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695939),
+    pointer: 8,
+    position: const Point(229.14285278320312, 466.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695947),
+    pointer: 8,
+    position: const Point(229.14285278320312, 446.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695955),
+    pointer: 8,
+    position: const Point(230.57142639160156, 424.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695963),
+    pointer: 8,
+    position: const Point(232.57142639160156, 402.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695970),
+    pointer: 8,
+    position: const Point(235.14285278320312, 380.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216695978),
+    pointer: 8,
+    position: const Point(238.57142639160156, 359.4285583496094)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216695993),
+    pointer: 8,
+    position: const Point(238.57142639160156, 359.4285583496094)
+  ),
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216696429),
+    pointer: 9,
+    position: const Point(238.2857208251953, 568.5714111328125)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216696459),
+    pointer: 9,
+    position: const Point(234.0, 560.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216696467),
+    pointer: 9,
+    position: const Point(231.42857360839844, 553.1428833007812)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216696475),
+    pointer: 9,
+    position: const Point(228.2857208251953, 543.1428833007812)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216696483),
+    pointer: 9,
+    position: const Point(225.42857360839844, 528.8571166992188)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216696491),
+    pointer: 9,
+    position: const Point(223.14285278320312, 512.2857055664062)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216696498),
+    pointer: 9,
+    position: const Point(222.0, 495.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216696506),
+    pointer: 9,
+    position: const Point(221.7142791748047, 477.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216696514),
+    pointer: 9,
+    position: const Point(221.7142791748047, 458.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216696521),
+    pointer: 9,
+    position: const Point(223.14285278320312, 438.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216696529),
+    pointer: 9,
+    position: const Point(224.2857208251953, 416.28570556640625)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216696544),
+    pointer: 9,
+    position: const Point(224.2857208251953, 416.28570556640625)
+  ),
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216696974),
+    pointer: 10,
+    position: const Point(218.57142639160156, 530.5714111328125)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697012),
+    pointer: 10,
+    position: const Point(220.2857208251953, 522.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697020),
+    pointer: 10,
+    position: const Point(221.14285278320312, 517.7142944335938)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697028),
+    pointer: 10,
+    position: const Point(222.2857208251953, 511.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697036),
+    pointer: 10,
+    position: const Point(224.0, 504.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697044),
+    pointer: 10,
+    position: const Point(227.14285278320312, 490.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697052),
+    pointer: 10,
+    position: const Point(229.42857360839844, 474.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697059),
+    pointer: 10,
+    position: const Point(231.42857360839844, 454.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697067),
+    pointer: 10,
+    position: const Point(233.7142791748047, 431.1428527832031)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216697082),
+    pointer: 10,
+    position: const Point(233.7142791748047, 431.1428527832031)
+  ),
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216697435),
+    pointer: 11,
+    position: const Point(257.1428527832031, 285.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697465),
+    pointer: 11,
+    position: const Point(251.7142791748047, 296.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697473),
+    pointer: 11,
+    position: const Point(248.2857208251953, 304.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697481),
+    pointer: 11,
+    position: const Point(244.57142639160156, 314.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697489),
+    pointer: 11,
+    position: const Point(240.2857208251953, 329.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697497),
+    pointer: 11,
+    position: const Point(236.85714721679688, 345.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697505),
+    pointer: 11,
+    position: const Point(233.7142791748047, 361.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697512),
+    pointer: 11,
+    position: const Point(231.14285278320312, 378.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697520),
+    pointer: 11,
+    position: const Point(229.42857360839844, 395.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697528),
+    pointer: 11,
+    position: const Point(229.42857360839844, 412.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697535),
+    pointer: 11,
+    position: const Point(230.85714721679688, 430.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697543),
+    pointer: 11,
+    position: const Point(233.42857360839844, 449.71429443359375)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216697558),
+    pointer: 11,
+    position: const Point(233.42857360839844, 449.71429443359375)
+  ),
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216697749),
+    pointer: 12,
+    position: const Point(246.0, 311.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697780),
+    pointer: 12,
+    position: const Point(244.57142639160156, 318.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697787),
+    pointer: 12,
+    position: const Point(243.14285278320312, 325.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697795),
+    pointer: 12,
+    position: const Point(241.42857360839844, 336.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697803),
+    pointer: 12,
+    position: const Point(239.7142791748047, 351.1428527832031)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697811),
+    pointer: 12,
+    position: const Point(238.2857208251953, 368.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697819),
+    pointer: 12,
+    position: const Point(238.0, 389.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697826),
+    pointer: 12,
+    position: const Point(239.14285278320312, 412.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697834),
+    pointer: 12,
+    position: const Point(242.2857208251953, 438.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697842),
+    pointer: 12,
+    position: const Point(247.42857360839844, 466.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216697849),
+    pointer: 12,
+    position: const Point(254.2857208251953, 497.71429443359375)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216697864),
+    pointer: 12,
+    position: const Point(254.2857208251953, 497.71429443359375)
+  ),
+  const PointerDownEvent(
+    timeStamp: const Duration(milliseconds: 216698321),
+    pointer: 13,
+    position: const Point(250.0, 306.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216698328),
+    pointer: 13,
+    position: const Point(250.0, 306.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216698344),
+    pointer: 13,
+    position: const Point(249.14285278320312, 314.0)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216698351),
+    pointer: 13,
+    position: const Point(247.42857360839844, 319.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216698359),
+    pointer: 13,
+    position: const Point(245.14285278320312, 326.8571472167969)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216698366),
+    pointer: 13,
+    position: const Point(241.7142791748047, 339.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216698374),
+    pointer: 13,
+    position: const Point(238.57142639160156, 355.71429443359375)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216698382),
+    pointer: 13,
+    position: const Point(236.2857208251953, 374.28570556640625)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216698390),
+    pointer: 13,
+    position: const Point(235.14285278320312, 396.5714416503906)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216698398),
+    pointer: 13,
+    position: const Point(236.57142639160156, 421.4285583496094)
+  ),
+  const PointerMoveEvent(
+    timeStamp: const Duration(milliseconds: 216698406),
+    pointer: 13,
+    position: const Point(241.14285278320312, 451.4285583496094)
+  ),
+  const PointerUpEvent(
+    timeStamp: const Duration(milliseconds: 216698421),
+    pointer: 13,
+    position: const Point(241.14285278320312, 451.4285583496094)
+  ),
 ];
diff --git a/packages/unit/test/gestures/velocity_tracker_test.dart b/packages/unit/test/gestures/velocity_tracker_test.dart
index a14aa8d3eceb01845171920c53b69709eb3b1145..64548c5b896e5c7ded437af3753f7ee65f16695f 100644
--- a/packages/unit/test/gestures/velocity_tracker_test.dart
+++ b/packages/unit/test/gestures/velocity_tracker_test.dart
@@ -8,56 +8,38 @@ bool _withinTolerance(double actual, double expected) {
   return diff.abs() < kTolerance;
 }
 
-bool _checkVelocity(GestureVelocity actual, GestureVelocity expected) {
-  return (actual.isValid == expected.isValid) &&
-    _withinTolerance(actual.x, expected.x) &&
-    _withinTolerance(actual.y, expected.y);
-}
-
-List<PointerInputEvent> _eventFromMap(List<Map> intermediate) {
-  List<PointerInputEvent> events = new List<PointerInputEvent>();
-  for (Map entry in intermediate)
-    events.add(_eventFor(entry));
-  return events;
-}
-
-PointerInputEvent _eventFor(Map entry) {
-  PointerInputEvent result = new PointerInputEvent(
-    type: entry['type'],
-    timeStamp: new Duration(milliseconds: entry['timeStamp'].round()),
-    pointer: entry['pointer'],
-    x: entry['x'],
-    y: entry['y']
-  );
-  return result;
+bool _checkVelocity(Offset actual, Offset expected) {
+  return (actual != null)
+      && _withinTolerance(actual.dx, expected.dx)
+      && _withinTolerance(actual.dy, expected.dy);
 }
 
 void main() {
-  List<PointerInputEvent> events = _eventFromMap(velocityEventData);
-
-  List<GestureVelocity> expected = new List<GestureVelocity>(13);
-  expected[0] = new GestureVelocity(isValid: true, x: 219.5762939453125, y: 1304.6705322265625);
-  expected[1] = new GestureVelocity(isValid: true, x: 355.6900939941406, y: 967.1700439453125);
-  expected[2] = new GestureVelocity(isValid: true, x: 12.651158332824707, y: -36.9227180480957);
-  expected[3] = new GestureVelocity(isValid: true, x: 714.1383056640625, y: -2561.540283203125);
-  expected[4] = new GestureVelocity(isValid: true, x: -19.658065795898438, y: -2910.080322265625);
-  expected[5] = new GestureVelocity(isValid: true, x: 646.8700561523438, y: 2976.982421875);
-  expected[6] = new GestureVelocity(isValid: true, x: 396.6878967285156, y: 2106.204833984375);
-  expected[7] = new GestureVelocity(isValid: true, x: 298.3150634765625, y: -3660.821044921875);
-  expected[8] = new GestureVelocity(isValid: true, x: -1.7460877895355225, y: -3288.16162109375);
-  expected[9] = new GestureVelocity(isValid: true, x: 384.6415710449219, y: -2645.6484375);
-  expected[10] = new GestureVelocity(isValid: true, x: 176.3752899169922, y: 2711.24609375);
-  expected[11] = new GestureVelocity(isValid: true, x: 396.9254455566406, y: 4280.640625);
-  expected[12] = new GestureVelocity(isValid: true, x: -71.51288604736328, y: 3716.74560546875);
+  List<Offset> expected = const <Offset>[
+    const Offset(219.5762939453125, 1304.6705322265625),
+    const Offset(355.6900939941406, 967.1700439453125),
+    const Offset(12.651158332824707, -36.9227180480957),
+    const Offset(714.1383056640625, -2561.540283203125),
+    const Offset(-19.658065795898438, -2910.080322265625),
+    const Offset(646.8700561523438, 2976.982421875),
+    const Offset(396.6878967285156, 2106.204833984375),
+    const Offset(298.3150634765625, -3660.821044921875),
+    const Offset(-1.7460877895355225, -3288.16162109375),
+    const Offset(384.6415710449219, -2645.6484375),
+    const Offset(176.3752899169922, 2711.24609375),
+    const Offset(396.9254455566406, 4280.640625),
+    const Offset(-71.51288604736328, 3716.74560546875),
+  ];
 
   test('Velocity tracker gives expected results', () {
     VelocityTracker tracker = new VelocityTracker();
     int i = 0;
-    for (PointerInputEvent event in events) {
-      if (event.type == 'pointerdown' || event.type == 'pointermove')
-        tracker.addPosition(event.timeStamp, event.x, event.y);
-      if (event.type == 'pointerup') {
-        _checkVelocity(tracker.getVelocity(), expected[i++]);
+    for (PointerEvent event in velocityEventData) {
+      if (event is PointerDownEvent || event is PointerMoveEvent)
+        tracker.addPosition(event.timeStamp, event.position);
+      if (event is PointerUpEvent) {
+        _checkVelocity(tracker.getVelocity(), expected[i]);
+        i += 1;
       }
     }
   });