tick = function(evt, scrollTimestamp) {
    var $this = $(this),
        data = $this.data(pluginName),
        scroller = data.scroller,
        distance = data.options.distance;

    // Do nothing if we haven't yet moved past the distance threshold.
    if (!data.selectionBox &&
        Math.abs(data.startPosition.pageX - evt.pageX) < distance &&
        Math.abs(data.startPosition.pageY - evt.pageY) < distance) {
      return;
    }

    data.lastPosition = data.curPosition;
    data.curPosition = {'pageX': evt.pageX, 'pageY': evt.pageY};

    if (!data.selectionBox) {
      // Trigger the selection 'start' event.
      $this.trigger(pluginName + 'start');

      // Create the selection box if we haven't created it yet.
      createSelectionBox.apply(this);

      // Compute the initial position and sizing of each selectable
      // object.
      initSelectablesOnGestureStart.apply(this);
    }

    // scroll the viewport if the mouse moves near the viewport boundaries.
    updateViewportScrolling.call(this, evt, scroller, scrollTimestamp);

    // update the selection box position and size.
    updateSelectionBox.call(this, evt);

    // mark elements as selected / deselected based on the current
    // selection box extent.
    markSelected.call(this, scroller);
  }
Updates the plugin state during a selection operation in response either to
mouse dragging by the user, or repeated scrolling updates because the
selection box is skimming the scrolling container viewport borders.

@param {!Event} evt The last mousemove event received.
@param {number?} scrollTimestamp The timestamp at which the last scrolling
    operation was performed. Undefined if this function is being invoked
    in response to mouse dragging.