anchor.diff:  
       }
       killEvent(event);
  +  }
  +
  +  void moveImageTouch(TouchEvent event) {
  +    if (_lastTouch == null) {
  +      _lastTouch = event;
  +      killEvent(event);
  +      return;
  +    }
  +
  +    // move
  +    try {
  +      num dx = event.touches.first.client.x - _lastTouch.touches.first.client.x;
  +      num dy = event.touches.first.client.y - _lastTouch.touches.first.client.y;
  +
  +      imgOffsetX += dx;
  +      imgOffsetY += dy;
  +
  +      trimOffsetToBoundaries();
  +      emitCropResult();
  +      
  +    } catch (e) {
  +      // hmm ...
  +    }
  +    // scale
  +    if (_lastTouch.touches.length == 2 && event.touches.length == 2) {
  +      num distOrig = _lastTouch.touches[0].client.distanceTo(_lastTouch.touches[1].client);
  +      num distNow = event.touches[0].client.distanceTo(event.touches[1].client);
  +      double scale = distNow.toDouble() / distOrig.toDouble();
  +      Point<double> center = getCenter();
  +      zoom = zoom * scale;
  +      if (zoom > 5) zoom = 5.0;
  +      if (zoom < 1) zoom = 1.0;
  +      updateImage();
  +      centerTo(center);
  +    }
  +
  +    _lastTouch = event;
  +    killEvent(event);
  +  }
  +
  +  TouchEvent _lastTouch = null;
  +
  +  void touchStart(TouchEvent t) {
  +    _lastTouch = t;
  +  }
  +
  +  void touchEnd(TouchEvent t) {
  +    _lastTouch = null;
     }
   
     void trimOffsetToBoundaries() {
  
positive.code:   [style.width.px]="imgWidth"
    [style.height.px]="imgHeight"
    (dragstart)="killEvent(\$event)"
    (mousemove)="moveImage(\$event)"
  /><p class="text--center">
    <span class="btn icon margin--small--right" (mousedown)='zoomOut(\$event)'>zoom_out</span>
    <span class="btn icon" (mousedown)='zoomIn(\$event)'>zoom_in</span>
  
negative.code:     crop.emit(new Rectangle(left, top, width, height));
    }
  
    void moveImageMouse(MouseEvent event) {
      // if mouse down
      if (event.buttons == 1) {
  
  