code: function(current) {
      var last = this._lastData;
  
      if (
        !last ||
        current.message !== last.message || // defined for captureMessage
        current.transaction !== last.transaction // defined for captureException/onerror
      )
        return false;
  
      // Stacktrace interface (i.e. from captureMessage)
      if (current.stacktrace || last.stacktrace) {
        return isSameStacktrace(current.stacktrace, last.stacktrace);
      } else if (current.exception || last.exception) {
        // Exception interface (i.e. from captureException/onerror)
        return isSameException(current.exception, last.exception);
      } else if (current.fingerprint || last.fingerprint) {
        return Boolean(current.fingerprint && last.fingerprint) &&
          JSON.stringify(current.fingerprint) === JSON.stringify(last.fingerprint)
      }
  
      return true;
    }
docs: Returns true if the in-process data payload matches the signature
  of the previously-sent data
  
  NOTE: This has to be done at this level because TraceKit can generate
  data from window.onerror WITHOUT an exception object (IE8, IE9,
  other old browsers). This can take the form of an "exception"
  data object with a single frame (derived from the onerror args).