{"version":3,"sources":["node_modules/dom-utils/lib/matches.js"," [synthetic:util/defineproperty] "," [synthetic:util/global] "," [synthetic:es6/symbol] "," [synthetic:es6/util/makeiterator] "," [synthetic:es6/util/arrayfromiterable] "," [synthetic:es6/util/arrayfromiterator] "," [synthetic:es6/util/inherits] ","node_modules/dom-utils/lib/parents.js","node_modules/dom-utils/lib/delegate.js","node_modules/dom-utils/lib/closest.js","lib/plugins/event-tracker.js","node_modules/dom-utils/lib/get-attributes.js","node_modules/dom-utils/lib/parse-url.js","lib/method-chain.js","lib/utilities.js","lib/provide.js","lib/constants.js","lib/usage.js","lib/plugins/clean-url-tracker.js","lib/plugins/impression-tracker.js","lib/event-emitter.js","lib/store.js","lib/session.js","lib/plugins/max-scroll-tracker.js","lib/plugins/media-query-tracker.js","lib/plugins/outbound-form-tracker.js","lib/plugins/outbound-link-tracker.js","lib/plugins/page-visibility-tracker.js","lib/plugins/social-widget-tracker.js","lib/plugins/url-change-tracker.js"],"names":["$jscomp.defineProperty","$jscomp.global","$jscomp.initSymbol","$jscomp.Symbol","$jscomp.symbolCounter_","$jscomp.SYMBOL_PREFIX","$jscomp.arrayIterator","$jscomp.initSymbolIterator","$jscomp.iteratorPrototype","proto","window","Element","prototype","nativeMatches","matches","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","element","test","nodeType","i","item","selector","call","nodes","parentNode","querySelectorAll","node","parents","list","push","delegate","eventType","callback","listener","event","delegateTarget","opts","composed","composedPath","target","parentElements","concat","parent","document","useCapture","ancestor","addEventListener","destroy","removeEventListener","getAttributes","attrs","map","attributes","length","attr","name","value","DEFAULT_PORT","a","createElement","cache","parseUrl","url","location","href","charAt","port","HTTP_PORT","HTTPS_PORT","host","replace","hash","hostname","origin","protocol","pathname","search","instances","constructor","MethodChain","context","methodName","originalMethodReference","isTask","get","methodChain","boundMethodChain","wrappedMethod","this.wrappedMethod","lastBoundMethod","$jscomp.arrayFromIterable","args","set","add","methodOverride","getOrCreateMethodChain","rebindMethodChain","remove","index","indexOf","splice","method","previousMethod","bind","filter","h","createFieldsObj","defaultFields","userFields","tracker","hitFilter","originalBuildHitTask","buildHitTask","model","assign","getAttributeFields","prefix","attributeFields","Object","keys","forEach","attribute","field","camelCase","slice","domReady","readyState","fn","debounce","wait","timeout","clearTimeout","setTimeout","withTimeout","called","queueMap","deferUntilPluginsLoaded","processQueue","ref","send","MethodChain.remove","trackingId","queue","ref.send","originalMethod","MethodChain.add","len","sources","source","key","hasOwnProperty","str","match","p1","toUpperCase","isObject","uuid","b","toString","Math","random","provide","pluginName","pluginConstructor","gaAlias","GoogleAnalyticsObject","q","gaDevIds","DEV_ID","gaplugins","plugins","CLEAN_URL_TRACKER","EVENT_TRACKER","IMPRESSION_TRACKER","MEDIA_QUERY_TRACKER","OUTBOUND_FORM_TRACKER","OUTBOUND_LINK_TRACKER","PAGE_VISIBILITY_TRACKER","SOCIAL_WIDGET_TRACKER","URL_CHANGE_TRACKER","MAX_SCROLL_TRACKER","PLUGIN_COUNT","trackUsage","plugin","VERSION","usageHex","parseInt","toAdd","usageBin","substr","CleanUrlTracker","defaultOpts","queryDimension","stripQuery","queryDimensionIndex","trackerGetOverride","buildHitTaskOverride","fieldsObj","page","cleanUrlFields","cleanedFieldsObj","indexFilename","parts","split","join","trailingSlash","isFilename","stripNonWhitelistedQueryParams","NULL_DIMENSION","urlFieldsFilter","userCleanedFieldsObj","returnValue","searchString","Array","isArray","queryParamsWhitelist","foundParams","kv","$jscomp.makeIterator","EventTracker","events","attributePrefix","handleEvents","delegates","getAttribute","type","hitType","transport","ImpressionTracker","IntersectionObserver","MutationObserver","defaultOptions","rootMargin","handleDomMutations","handleIntersectionChanges","handleDomElementAdded","handleDomElementRemoved","mutationObserver","items","elementMap","thresholdMap","elements","observeElements","ImpressionTracker.prototype","?.prototype","data","deriveDataFromElements","observer","threshold","id","getElementById","observe","body","childList","subtree","requestAnimationFrame","unobserveElements","itemsToKeep","itemsToRemove","some","itemInItems","itemToRemove","getItemFromElement","trackFirstImpressionOnly","dataToKeep","dataToRemove","unobserve","disconnect","unobserveAllElements","mutations","mutation","k","removedEl","removedNodes","walkNodeTree","j","addedEl","addedNodes","child","childNodes","records","record","intersectionRatio","intersectionRect","top","bottom","left","right","eventCategory","eventAction","eventLabel","nonInteraction","handleImpression","EventEmitter","registry_","on","getRegistry_","emit","isListening","browserSupportsLocalStorage","Store","defaults","key_","defaults_","cache_","$jscomp.inherits","getOrCreate","namespace","AUTOTRACK_PREFIX","storageListener","isSupported_","localStorage","setItem","removeItem","err","Store.isSupported_","parse","getItem","newData","JSON","stringify","clear","store","oldData","oldValue","newValue","Session","timeZone","Session.DEFAULT_TIMEOUT","sendHitTaskOverride","dateTimeFormatter","Intl","DateTimeFormat","Store.getOrCreate","defaultProps","hitTime","isExpired","getId","sessionData","oldHitTime","currentDate","Date","oldHitDate","MINUTES","datesAreDifferentInTimezone","format","sessionControl","sessionWillStart","sessionWillEnd","MaxScrollTracker","increaseThreshold","sessionTimeout","pagePath","getPagePath","handleScroll","trackerSetOverride","session","Session.getOrCreate","listenForMaxScrollChanges","getMaxScrollPercentageForCurrentPage","html","documentElement","scrollPercentage","min","max","round","pageYOffset","pageHeight","offsetHeight","scrollHeight","innerHeight","sessionId","maxScrollPercentage","stopListeningForMaxScrollChanges","increaseAmount","setMaxScrollPercentageForCurrentPage","eventValue","String","sendMaxScrollEvent","maxScrollMetricIndex","fields","lastPagePath","mediaMap","MediaQueryTracker","matchMedia","changeTemplate","changeTimeout","definitions","changeListeners","processMediaQueries","definition","dimensionIndex","mediaName","getMatchName","addChangeListeners","getMediaList","media","mql","handleChanges","addListener","removeListener","OutboundFormTracker","formSelector","shouldTrackOutboundForm","handleFormSubmits","form","action","navigator","sendBeacon","preventDefault","hitCallback","submit","parseUrlFn","OutboundLinkTracker","linkSelector","shouldTrackOutboundLink","handleLinkInteractions","link","metaKey","ctrlKey","shiftKey","altKey","which","clickHandler","defaultPrevented","oldHitCallback","PAGE_ID","PageVisibilityTracker","visibilityState","visibleThreshold","sendInitialPageview","lastPageState","visibleThresholdTimeout_","isInitialPageviewSent_","handleChange","handleWindowUnload","handleExternalStoreSet","VISIBLE","sendPageview","isPageLoad","time","state","pageId","pageLoadsMetricIndex","sendPageLoad","PageVisibilityTracker.prototype","HIDDEN","lastStoredChange","getAndValidateChangeData","change","sendPageVisibilityEvent","delta","deltaInSeconds","SECONDS$1","queueTime","visibleMetricIndex","PageVisibilityTracker_prototype$trackerSetOverride","SocialWidgetTracker","addWidgetListeners","addTwitterEventHandlers","handleTweetEvents","handleFollowEvents","handleLikeEvents","handleUnlikeEvents","SocialWidgetTracker.prototype","FB","Event","subscribe","addFacebookEventHandlers","twttr","ready","removeTwitterEventHandlers","unbind","region","socialNetwork","socialAction","socialTarget","screen_name","unsubscribe","removeFacebookEventHandlers","UrlChangeTracker","history","pushState","shouldTrackUrlChange","trackReplaceState","path","pushStateOverride","replaceStateOverride","handlePopState","UrlChangeTracker.prototype","handleUrlChange","historyDidUpdate","oldPath","newPath","title"],"mappings":"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","file":"","sourcesContent":["const proto = window.Element.prototype;\nconst nativeMatches = proto.matches ||\n      proto.matchesSelector ||\n      proto.webkitMatchesSelector ||\n      proto.mozMatchesSelector ||\n      proto.msMatchesSelector ||\n      proto.oMatchesSelector;\n\n\n/**\n * Tests if a DOM elements matches any of the test DOM elements or selectors.\n * @param {Element} element The DOM element to test.\n * @param {Element|string|Array<Element|string>} test A DOM element, a CSS\n *     selector, or an array of DOM elements or CSS selectors to match against.\n * @return {boolean} True of any part of the test matches.\n */\nexport default function matches(element, test) {\n  // Validate input.\n  if (element && element.nodeType == 1 && test) {\n    // if test is a string or DOM element test it.\n    if (typeof test == 'string' || test.nodeType == 1) {\n      return element == test ||\n          matchesSelector(element, /** @type {string} */ (test));\n    } else if ('length' in test) {\n      // if it has a length property iterate over the items\n      // and return true if any match.\n      for (let i = 0, item; item = test[i]; i++) {\n        if (element == item || matchesSelector(element, item)) return true;\n      }\n    }\n  }\n  // Still here? Return false\n  return false;\n}\n\n\n/**\n * Tests whether a DOM element matches a selector. This polyfills the native\n * Element.prototype.matches method across browsers.\n * @param {!Element} element The DOM element to test.\n * @param {string} selector The CSS selector to test element against.\n * @return {boolean} True if the selector matches.\n */\nfunction matchesSelector(element, selector) {\n  if (typeof selector != 'string') return false;\n  if (nativeMatches) return nativeMatches.call(element, selector);\n  const nodes = element.parentNode.querySelectorAll(selector);\n  for (let i = 0, node; node = nodes[i]; i++) {\n    if (node == element) return true;\n  }\n  return false;\n}\n",null,null,null,null,null,null,null,"/**\n * Returns an array of a DOM element's parent elements.\n * @param {!Element} element The DOM element whose parents to get.\n * @return {!Array} An array of all parent elemets, or an empty array if no\n *     parent elements are found.\n */\nexport default function parents(element) {\n  const list = [];\n  while (element && element.parentNode && element.parentNode.nodeType == 1) {\n    element = /** @type {!Element} */ (element.parentNode);\n    list.push(element);\n  }\n  return list;\n}\n","import closest from './closest';\nimport matches from './matches';\n\n/**\n * Delegates the handling of events for an element matching a selector to an\n * ancestor of the matching element.\n * @param {!Node} ancestor The ancestor element to add the listener to.\n * @param {string} eventType The event type to listen to.\n * @param {string} selector A CSS selector to match against child elements.\n * @param {!Function} callback A function to run any time the event happens.\n * @param {Object=} opts A configuration options object. The available options:\n *     - useCapture<boolean>: If true, bind to the event capture phase.\n *     - deep<boolean>: If true, delegate into shadow trees.\n * @return {Object} The delegate object. It contains a destroy method.\n */\nexport default function delegate(\n    ancestor, eventType, selector, callback, opts = {}) {\n  // Defines the event listener.\n  const listener = function(event) {\n    let delegateTarget;\n\n    // If opts.composed is true and the event originated from inside a Shadow\n    // tree, check the composed path nodes.\n    if (opts.composed && typeof event.composedPath == 'function') {\n      const composedPath = event.composedPath();\n      for (let i = 0, node; node = composedPath[i]; i++) {\n        if (node.nodeType == 1 && matches(node, selector)) {\n          delegateTarget = node;\n        }\n      }\n    } else {\n      // Otherwise check the parents.\n      delegateTarget = closest(event.target, selector, true);\n    }\n\n    if (delegateTarget) {\n      callback.call(delegateTarget, event, delegateTarget);\n    }\n  };\n\n  ancestor.addEventListener(eventType, listener, opts.useCapture);\n\n  return {\n    destroy: function() {\n      ancestor.removeEventListener(eventType, listener, opts.useCapture);\n    },\n  };\n}\n","import matches from './matches';\nimport parents from './parents';\n\n/**\n * Gets the closest parent element that matches the passed selector.\n * @param {Element} element The element whose parents to check.\n * @param {string} selector The CSS selector to match against.\n * @param {boolean=} shouldCheckSelf True if the selector should test against\n *     the passed element itself.\n * @return {Element|undefined} The matching element or undefined.\n */\nexport default function closest(element, selector, shouldCheckSelf = false) {\n  if (!(element && element.nodeType == 1 && selector)) return;\n  const parentElements =\n      (shouldCheckSelf ? [element] : []).concat(parents(element));\n\n  for (let i = 0, parent; parent = parentElements[i]; i++) {\n    if (matches(parent, selector)) return parent;\n  }\n}\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport {delegate} from 'dom-utils';\nimport provide from '../provide';\nimport {plugins, trackUsage} from '../usage';\nimport {assign, createFieldsObj, getAttributeFields} from '../utilities';\n\n\n/**\n * Class for the `eventTracker` analytics.js plugin.\n * @implements {EventTrackerPublicInterface}\n */\nclass EventTracker {\n  /**\n   * Registers declarative event tracking.\n   * @param {!Tracker} tracker Passed internally by analytics.js\n   * @param {?EventTrackerOpts} opts Passed by the require command.\n   */\n  constructor(tracker, opts) {\n    trackUsage(tracker, plugins.EVENT_TRACKER);\n\n    // Feature detects to prevent errors in unsupporting browsers.\n    if (!window.addEventListener) return;\n\n    /** @type {EventTrackerOpts} */\n    const defaultOpts = {\n      events: ['click'],\n      fieldsObj: {},\n      attributePrefix: 'ga-',\n      // hitFilter: undefined,\n    };\n\n    this.opts = /** @type {EventTrackerOpts} */ (assign(defaultOpts, opts));\n\n    this.tracker = tracker;\n\n    // Binds methods.\n    this.handleEvents = this.handleEvents.bind(this);\n\n    const selector = '[' + this.opts.attributePrefix + 'on]';\n\n    // Creates a mapping of events to their delegates\n    this.delegates = {};\n    this.opts.events.forEach((event) => {\n      this.delegates[event] = delegate(document, event, selector,\n          this.handleEvents, {composed: true, useCapture: true});\n    });\n  }\n\n  /**\n   * Handles all events on elements with event attributes.\n   * @param {Event} event The DOM click event.\n   * @param {Element} element The delegated DOM element target.\n   */\n  handleEvents(event, element) {\n    const prefix = this.opts.attributePrefix;\n    const events = element.getAttribute(prefix + 'on').split(/\\s*,\\s*/);\n\n    // Ensures the type matches one of the events specified on the element.\n    if (events.indexOf(event.type) < 0) return;\n\n    /** @type {FieldsObj} */\n    const defaultFields = {transport: 'beacon'};\n    const attributeFields = getAttributeFields(element, prefix);\n    const userFields = assign({}, this.opts.fieldsObj, attributeFields);\n    const hitType = attributeFields.hitType || 'event';\n\n    this.tracker.send(hitType, createFieldsObj(defaultFields,\n        userFields, this.tracker, this.opts.hitFilter, element, event));\n  }\n\n  /**\n   * Removes all event listeners and instance properties.\n   */\n  remove() {\n    Object.keys(this.delegates).forEach((key) => {\n      this.delegates[key].destroy();\n    });\n  }\n}\n\n\nprovide('eventTracker', EventTracker);\n","/**\n * Gets all attributes of an element as a plain JavaScriot object.\n * @param {Element} element The element whose attributes to get.\n * @return {!Object} An object whose keys are the attribute keys and whose\n *     values are the attribute values. If no attributes exist, an empty\n *     object is returned.\n */\nexport default function getAttributes(element) {\n  const attrs = {};\n\n  // Validate input.\n  if (!(element && element.nodeType == 1)) return attrs;\n\n  // Return an empty object if there are no attributes.\n  const map = element.attributes;\n  if (map.length === 0) return {};\n\n  for (let i = 0, attr; attr = map[i]; i++) {\n    attrs[attr.name] = attr.value;\n  }\n  return attrs;\n}\n","const HTTP_PORT = '80';\nconst HTTPS_PORT = '443';\nconst DEFAULT_PORT = RegExp(':(' + HTTP_PORT + '|' + HTTPS_PORT + ')$');\n\n\nconst a = document.createElement('a');\nconst cache = {};\n\n\n/**\n * Parses the given url and returns an object mimicing a `Location` object.\n * @param {string} url The url to parse.\n * @return {!Object} An object with the same properties as a `Location`.\n */\nexport default function parseUrl(url) {\n  // All falsy values (as well as \".\") should map to the current URL.\n  url = (!url || url == '.') ? location.href : url;\n\n  if (cache[url]) return cache[url];\n\n  a.href = url;\n\n  // When parsing file relative paths (e.g. `../index.html`), IE will correctly\n  // resolve the `href` property but will keep the `..` in the `path` property.\n  // It will also not include the `host` or `hostname` properties. Furthermore,\n  // IE will sometimes return no protocol or just a colon, especially for things\n  // like relative protocol URLs (e.g. \"//google.com\").\n  // To workaround all of these issues, we reparse with the full URL from the\n  // `href` property.\n  if (url.charAt(0) == '.' || url.charAt(0) == '/') return parseUrl(a.href);\n\n  // Don't include default ports.\n  let port = (a.port == HTTP_PORT || a.port == HTTPS_PORT) ? '' : a.port;\n\n  // PhantomJS sets the port to \"0\" when using the file: protocol.\n  port = port == '0' ? '' : port;\n\n  // Sometimes IE incorrectly includes a port for default ports\n  // (e.g. `:80` or `:443`) even when no port is specified in the URL.\n  // http://bit.ly/1rQNoMg\n  const host = a.host.replace(DEFAULT_PORT, '');\n\n  // Not all browser support `origin` so we have to build it.\n  const origin = a.origin ? a.origin : a.protocol + '//' + host;\n\n  // Sometimes IE doesn't include the leading slash for pathname.\n  // http://bit.ly/1rQNoMg\n  const pathname = a.pathname.charAt(0) == '/' ? a.pathname : '/' + a.pathname;\n\n  return cache[url] = {\n    hash: a.hash,\n    host: host,\n    hostname: a.hostname,\n    href: a.href,\n    origin: origin,\n    pathname: pathname,\n    port: port,\n    protocol: a.protocol,\n    search: a.search,\n  };\n}\n","/**\n * Copyright 2017 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/**\n * @fileoverview\n * The functions exported by this module make it easier (and safer) to override\n * foreign object methods (in a modular way) and respond to or modify their\n * invocation. The primary feature is the ability to override a method without\n * worrying if it's already been overridden somewhere else in the codebase. It\n * also allows for safe restoring of an overridden method by only fully\n * restoring a method once all overrides have been removed.\n */\n\n\nconst instances = [];\n\n\n/**\n * A class that wraps a foreign object method and emit events before and\n * after the original method is called.\n */\nexport default class MethodChain {\n  /**\n   * Adds the passed override method to the list of method chain overrides.\n   * @param {!Object} context The object containing the method to chain.\n   * @param {string} methodName The name of the method on the object.\n   * @param {!Function} methodOverride The override method to add.\n   */\n  static add(context, methodName, methodOverride) {\n    getOrCreateMethodChain(context, methodName).add(methodOverride);\n  }\n\n  /**\n   * Removes a method chain added via `add()`. If the override is the\n   * only override added, the original method is restored.\n   * @param {!Object} context The object containing the method to unchain.\n   * @param {string} methodName The name of the method on the object.\n   * @param {!Function} methodOverride The override method to remove.\n   */\n  static remove(context, methodName, methodOverride) {\n    getOrCreateMethodChain(context, methodName).remove(methodOverride);\n  }\n\n  /**\n   * Wraps a foreign object method and overrides it. Also stores a reference\n   * to the original method so it can be restored later.\n   * @param {!Object} context The object containing the method.\n   * @param {string} methodName The name of the method on the object.\n   */\n  constructor(context, methodName) {\n    this.context = context;\n    this.methodName = methodName;\n    this.isTask = /Task$/.test(methodName);\n\n    this.originalMethodReference = this.isTask ?\n        context.get(methodName) : context[methodName];\n\n    this.methodChain = [];\n    this.boundMethodChain = [];\n\n    // Wraps the original method.\n    this.wrappedMethod = (...args) => {\n      const lastBoundMethod =\n          this.boundMethodChain[this.boundMethodChain.length - 1];\n\n      return lastBoundMethod(...args);\n    };\n\n    // Override original method with the wrapped one.\n    if (this.isTask) {\n      context.set(methodName, this.wrappedMethod);\n    } else {\n      context[methodName] = this.wrappedMethod;\n    }\n  }\n\n  /**\n   * Adds a method to the method chain.\n   * @param {!Function} overrideMethod The override method to add.\n   */\n  add(overrideMethod) {\n    this.methodChain.push(overrideMethod);\n    this.rebindMethodChain();\n  }\n\n  /**\n   * Removes a method from the method chain and restores the prior order.\n   * @param {!Function} overrideMethod The override method to remove.\n   */\n  remove(overrideMethod) {\n    const index = this.methodChain.indexOf(overrideMethod);\n    if (index > -1) {\n      this.methodChain.splice(index, 1);\n      if (this.methodChain.length > 0) {\n        this.rebindMethodChain();\n      } else {\n        this.destroy();\n      }\n    }\n  }\n\n  /**\n   * Loops through the method chain array and recreates the bound method\n   * chain array. This is necessary any time a method is added or removed\n   * to ensure proper original method context and order.\n   */\n  rebindMethodChain() {\n    this.boundMethodChain = [];\n    for (let method, i = 0; method = this.methodChain[i]; i++) {\n      const previousMethod = this.boundMethodChain[i - 1] ||\n          this.originalMethodReference.bind(this.context);\n      this.boundMethodChain.push(method(previousMethod));\n    }\n  }\n\n  /**\n   * Calls super and destroys the instance if no registered handlers remain.\n   */\n  destroy() {\n    const index = instances.indexOf(this);\n    if (index > -1) {\n      instances.splice(index, 1);\n      if (this.isTask) {\n        this.context.set(this.methodName, this.originalMethodReference);\n      } else {\n        this.context[this.methodName] = this.originalMethodReference;\n      }\n    }\n  }\n}\n\n\n/**\n * Gets a MethodChain instance for the passed object and method. If the method\n * has already been wrapped via an existing MethodChain instance, that\n * instance is returned.\n * @param {!Object} context The object containing the method.\n * @param {string} methodName The name of the method on the object.\n * @return {!MethodChain}\n */\nfunction getOrCreateMethodChain(context, methodName) {\n  let methodChain = instances\n      .filter((h) => h.context == context && h.methodName == methodName)[0];\n\n  if (!methodChain) {\n    methodChain = new MethodChain(context, methodName);\n    instances.push(methodChain);\n  }\n  return methodChain;\n}\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport {getAttributes} from 'dom-utils';\nimport MethodChain from './method-chain';\n\n\n/**\n * Accepts default and user override fields and an optional tracker, hit\n * filter, and target element and returns a single object that can be used in\n * `ga('send', ...)` commands.\n * @param {FieldsObj} defaultFields The default fields to return.\n * @param {FieldsObj} userFields Fields set by the user to override the\n *     defaults.\n * @param {Tracker=} tracker The tracker object to apply the hit filter to.\n * @param {Function=} hitFilter A filter function that gets\n *     called with the tracker model right before the `buildHitTask`. It can\n *     be used to modify the model for the current hit only.\n * @param {Element=} target If the hit originated from an interaction\n *     with a DOM element, hitFilter is invoked with that element as the\n *     second argument.\n * @param {(Event|TwttrEvent)=} event If the hit originated via a DOM event,\n *     hitFilter is invoked with that event as the third argument.\n * @return {!FieldsObj} The final fields object.\n */\nexport function createFieldsObj(\n    defaultFields, userFields, tracker = undefined,\n    hitFilter = undefined, target = undefined, event = undefined) {\n  if (typeof hitFilter == 'function') {\n    const originalBuildHitTask = tracker.get('buildHitTask');\n    return {\n      buildHitTask: (/** @type {!Model} */ model) => {\n        model.set(defaultFields, null, true);\n        model.set(userFields, null, true);\n        hitFilter(model, target, event);\n        originalBuildHitTask(model);\n      },\n    };\n  } else {\n    return assign({}, defaultFields, userFields);\n  }\n}\n\n\n/**\n * Retrieves the attributes from an DOM element and returns a fields object\n * for all attributes matching the passed prefix string.\n * @param {Element} element The DOM element to get attributes from.\n * @param {string} prefix An attribute prefix. Only the attributes matching\n *     the prefix will be returned on the fields object.\n * @return {FieldsObj} An object of analytics.js fields and values\n */\nexport function getAttributeFields(element, prefix) {\n  const attributes = getAttributes(element);\n  const attributeFields = {};\n\n  Object.keys(attributes).forEach(function(attribute) {\n    // The `on` prefix is used for event handling but isn't a field.\n    if (attribute.indexOf(prefix) === 0 && attribute != prefix + 'on') {\n      let value = attributes[attribute];\n\n      // Detects Boolean value strings.\n      if (value == 'true') value = true;\n      if (value == 'false') value = false;\n\n      const field = camelCase(attribute.slice(prefix.length));\n      attributeFields[field] = value;\n    }\n  });\n\n  return attributeFields;\n}\n\n\n/**\n * Accepts a function to be invoked once the DOM is ready. If the DOM is\n * already ready, the callback is invoked immediately.\n * @param {!Function} callback The ready callback.\n */\nexport function domReady(callback) {\n  if (document.readyState == 'loading') {\n    document.addEventListener('DOMContentLoaded', function fn() {\n      document.removeEventListener('DOMContentLoaded', fn);\n      callback();\n    });\n  } else {\n    callback();\n  }\n}\n\n\n/**\n * Returns a function, that, as long as it continues to be called, will not\n * actually run. The function will only run after it stops being called for\n * `wait` milliseconds.\n * @param {!Function} fn The function to debounce.\n * @param {number} wait The debounce wait timeout in ms.\n * @return {!Function} The debounced function.\n */\nexport function debounce(fn, wait) {\n  let timeout;\n  return function(...args) {\n    clearTimeout(timeout);\n    timeout = setTimeout(() => fn(...args), wait);\n  };\n}\n\n\n/**\n * Accepts a function and returns a wrapped version of the function that is\n * expected to be called elsewhere in the system. If it's not called\n * elsewhere after the timeout period, it's called regardless. The wrapper\n * function also prevents the callback from being called more than once.\n * @param {!Function} callback The function to call.\n * @param {number=} wait How many milliseconds to wait before invoking\n *     the callback.\n * @return {!Function} The wrapped version of the passed function.\n */\nexport function withTimeout(callback, wait = 2000) {\n  let called = false;\n  const fn = function() {\n    if (!called) {\n      called = true;\n      callback();\n    }\n  };\n  setTimeout(fn, wait);\n  return fn;\n}\n\n// Maps trackers to queue by tracking ID.\nconst queueMap = {};\n\n/**\n * Queues a function for execution in the next call stack, or immediately\n * before any send commands are executed on the tracker. This allows\n * autotrack plugins to defer running commands until after all other plugins\n * are required but before any other hits are sent.\n * @param {!Tracker} tracker\n * @param {!Function} fn\n */\nexport function deferUntilPluginsLoaded(tracker, fn) {\n  const trackingId = tracker.get('trackingId');\n  const ref = queueMap[trackingId] = queueMap[trackingId] || {};\n\n  const processQueue = () => {\n    clearTimeout(ref.timeout);\n    if (ref.send) {\n      MethodChain.remove(tracker, 'send', ref.send);\n    }\n    delete queueMap[trackingId];\n\n    ref.queue.forEach((fn) => fn());\n  };\n\n  clearTimeout(ref.timeout);\n  ref.timeout = setTimeout(processQueue, 0);\n  ref.queue = ref.queue || [];\n  ref.queue.push(fn);\n\n  if (!ref.send) {\n    ref.send = (originalMethod) => {\n      return (...args) => {\n        processQueue();\n        originalMethod(...args);\n      };\n    };\n    MethodChain.add(tracker, 'send', ref.send);\n  }\n}\n\n\n/**\n * A small shim of Object.assign that aims for brevity over spec-compliant\n * handling all the edge cases.\n * @param {!Object} target The target object to assign to.\n * @param {...?Object} sources Additional objects who properties should be\n *     assigned to target. Non-objects are converted to objects.\n * @return {!Object} The modified target object.\n */\nexport const assign = Object.assign || function(target, ...sources) {\n  for (let i = 0, len = sources.length; i < len; i++) {\n    const source = Object(sources[i]);\n    for (let key in source) {\n      if (Object.prototype.hasOwnProperty.call(source, key)) {\n        target[key] = source[key];\n      }\n    }\n  }\n  return target;\n};\n\n\n/**\n * Accepts a string containing hyphen or underscore word separators and\n * converts it to camelCase.\n * @param {string} str The string to camelCase.\n * @return {string} The camelCased version of the string.\n */\nexport function camelCase(str) {\n  return str.replace(/[\\-\\_]+(\\w?)/g, function(match, p1) {\n    return p1.toUpperCase();\n  });\n}\n\n\n/**\n * Capitalizes the first letter of a string.\n * @param {string} str The input string.\n * @return {string} The capitalized string\n */\nexport function capitalize(str) {\n  return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n\n/**\n * Indicates whether the passed variable is a JavaScript object.\n * @param {*} value The input variable to test.\n * @return {boolean} Whether or not the test is an object.\n */\nexport function isObject(value) {\n  return typeof value == 'object' && value !== null;\n}\n\n\n/**\n * Accepts a value that may or may not be an array. If it is not an array,\n * it is returned as the first item in a single-item array.\n * @param {*} value The value to convert to an array if it is not.\n * @return {!Array} The array-ified value.\n */\nexport function toArray(value) {\n  return Array.isArray(value) ? value : [value];\n}\n\n\n/**\n * @return {number} The current date timestamp\n */\nexport function now() {\n  return +new Date();\n}\n\n\n/*eslint-disable */\n// https://gist.github.com/jed/982883\n/** @param {?=} a */\nexport const uuid = function b(a){return a?(a^Math.random()*16>>a/4).toString(16):([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,b)};\n/*eslint-enable */\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport {DEV_ID} from './constants';\nimport {capitalize} from './utilities';\n\n\n/**\n * Provides a plugin for use with analytics.js, accounting for the possibility\n * that the global command queue has been renamed or not yet defined.\n * @param {string} pluginName The plugin name identifier.\n * @param {Function} pluginConstructor The plugin constructor function.\n */\nexport default function provide(pluginName, pluginConstructor) {\n  const gaAlias = window.GoogleAnalyticsObject || 'ga';\n  window[gaAlias] = window[gaAlias] || function(...args) {\n    (window[gaAlias].q = window[gaAlias].q || []).push(args);\n  };\n\n  // Adds the autotrack dev ID if not already included.\n  window.gaDevIds = window.gaDevIds || [];\n  if (window.gaDevIds.indexOf(DEV_ID) < 0) {\n    window.gaDevIds.push(DEV_ID);\n  }\n\n  // Formally provides the plugin for use with analytics.js.\n  window[gaAlias]('provide', pluginName, pluginConstructor);\n\n  // Registers the plugin on the global gaplugins object.\n  window.gaplugins = window.gaplugins || {};\n  window.gaplugins[capitalize(pluginName)] = pluginConstructor;\n}\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nexport const VERSION = '2.4.1';\nexport const DEV_ID = 'i5iSjo';\n\nexport const VERSION_PARAM = '_av';\nexport const USAGE_PARAM = '_au';\n\nexport const NULL_DIMENSION = '(not set)';\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport {USAGE_PARAM, VERSION, VERSION_PARAM} from './constants';\n\n\nexport const plugins = {\n  CLEAN_URL_TRACKER: 1,\n  EVENT_TRACKER: 2,\n  IMPRESSION_TRACKER: 3,\n  MEDIA_QUERY_TRACKER: 4,\n  OUTBOUND_FORM_TRACKER: 5,\n  OUTBOUND_LINK_TRACKER: 6,\n  PAGE_VISIBILITY_TRACKER: 7,\n  SOCIAL_WIDGET_TRACKER: 8,\n  URL_CHANGE_TRACKER: 9,\n  MAX_SCROLL_TRACKER: 10,\n};\n\n\nconst PLUGIN_COUNT = Object.keys(plugins).length;\n\n\n/**\n * Tracks the usage of the passed plugin by encoding a value into a usage\n * string sent with all hits for the passed tracker.\n * @param {!Tracker} tracker The analytics.js tracker object.\n * @param {number} plugin The plugin enum.\n */\nexport function trackUsage(tracker, plugin) {\n  trackVersion(tracker);\n  trackPlugin(tracker, plugin);\n}\n\n\n/**\n * Converts a hexadecimal string to a binary string.\n * @param {string} hex A hexadecimal numeric string.\n * @return {string} a binary numeric string.\n */\nfunction convertHexToBin(hex) {\n  return parseInt(hex || '0', 16).toString(2);\n}\n\n\n/**\n * Converts a binary string to a hexadecimal string.\n * @param {string} bin A binary numeric string.\n * @return {string} a hexadecimal numeric string.\n */\nfunction convertBinToHex(bin) {\n  return parseInt(bin || '0', 2).toString(16);\n}\n\n\n/**\n * Adds leading zeros to a string if it's less than a minimum length.\n * @param {string} str A string to pad.\n * @param {number} len The minimum length of the string\n * @return {string} The padded string.\n */\nfunction padZeros(str, len) {\n  if (str.length < len) {\n    let toAdd = len - str.length;\n    while (toAdd) {\n      str = '0' + str;\n      toAdd--;\n    }\n  }\n  return str;\n}\n\n\n/**\n * Accepts a binary numeric string and flips the digit from 0 to 1 at the\n * specified index.\n * @param {string} str The binary numeric string.\n * @param {number} index The index to flip the bit.\n * @return {string} The new binary string with the bit flipped on\n */\nfunction flipBitOn(str, index) {\n  return str.substr(0, index) + 1 + str.substr(index + 1);\n}\n\n\n/**\n * Accepts a tracker and a plugin index and flips the bit at the specified\n * index on the tracker's usage parameter.\n * @param {Object} tracker An analytics.js tracker.\n * @param {number} pluginIndex The index of the plugin in the global list.\n */\nfunction trackPlugin(tracker, pluginIndex) {\n  const usageHex = tracker.get('&' + USAGE_PARAM);\n  let usageBin = padZeros(convertHexToBin(usageHex), PLUGIN_COUNT);\n\n  // Flip the bit of the plugin being tracked.\n  usageBin = flipBitOn(usageBin, PLUGIN_COUNT - pluginIndex);\n\n  // Stores the modified usage string back on the tracker.\n  tracker.set('&' + USAGE_PARAM, convertBinToHex(usageBin));\n}\n\n\n/**\n * Accepts a tracker and adds the current version to the version param.\n * @param {Object} tracker An analytics.js tracker.\n */\nfunction trackVersion(tracker) {\n  tracker.set('&' + VERSION_PARAM, VERSION);\n}\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport {parseUrl} from 'dom-utils';\nimport {NULL_DIMENSION} from '../constants';\nimport MethodChain from '../method-chain';\nimport provide from '../provide';\nimport {plugins, trackUsage} from '../usage';\nimport {assign} from '../utilities';\n\n\n/**\n * Class for the `cleanUrlTracker` analytics.js plugin.\n * @implements {CleanUrlTrackerPublicInterface}\n */\nclass CleanUrlTracker {\n  /**\n   * Registers clean URL tracking on a tracker object. The clean URL tracker\n   * removes query parameters from the page value reported to Google Analytics.\n   * It also helps to prevent tracking similar URLs, e.g. sometimes ending a\n   * URL with a slash and sometimes not.\n   * @param {!Tracker} tracker Passed internally by analytics.js\n   * @param {?CleanUrlTrackerOpts} opts Passed by the require command.\n   */\n  constructor(tracker, opts) {\n    trackUsage(tracker, plugins.CLEAN_URL_TRACKER);\n\n    /** @type {CleanUrlTrackerOpts} */\n    const defaultOpts = {\n      // stripQuery: undefined,\n      // queryParamsWhitelist: undefined,\n      // queryDimensionIndex: undefined,\n      // indexFilename: undefined,\n      // trailingSlash: undefined,\n      // urlFilter: undefined,\n    };\n    this.opts = /** @type {CleanUrlTrackerOpts} */ (assign(defaultOpts, opts));\n\n    this.tracker = tracker;\n\n    /** @type {string|null} */\n    this.queryDimension = this.opts.stripQuery &&\n        this.opts.queryDimensionIndex ?\n            `dimension${this.opts.queryDimensionIndex}` : null;\n\n    // Binds methods to `this`.\n    this.trackerGetOverride = this.trackerGetOverride.bind(this);\n    this.buildHitTaskOverride = this.buildHitTaskOverride.bind(this);\n\n    // Override built-in tracker method to watch for changes.\n    MethodChain.add(tracker, 'get', this.trackerGetOverride);\n    MethodChain.add(tracker, 'buildHitTask', this.buildHitTaskOverride);\n  }\n\n  /**\n   * Ensures reads of the tracker object by other plugins always see the\n   * \"cleaned\" versions of all URL fields.\n   * @param {function(string):*} originalMethod A reference to the overridden\n   *     method.\n   * @return {function(string):*}\n   */\n  trackerGetOverride(originalMethod) {\n    return (field) => {\n      if (field == 'page' || field == this.queryDimension) {\n        const fieldsObj = /** @type {!FieldsObj} */ ({\n          location: originalMethod('location'),\n          page: originalMethod('page'),\n        });\n        const cleanedFieldsObj = this.cleanUrlFields(fieldsObj);\n        return cleanedFieldsObj[field];\n      } else {\n        return originalMethod(field);\n      }\n    };\n  }\n\n  /**\n   * Cleans URL fields passed in a send command.\n   * @param {function(!Model)} originalMethod A reference to the\n   *     overridden method.\n   * @return {function(!Model)}\n   */\n  buildHitTaskOverride(originalMethod) {\n    return (model) => {\n      const cleanedFieldsObj = this.cleanUrlFields({\n        location: model.get('location'),\n        page: model.get('page'),\n      });\n      model.set(cleanedFieldsObj, null, true);\n      originalMethod(model);\n    };\n  }\n\n  /**\n   * Accepts of fields object containing URL fields and returns a new\n   * fields object with the URLs \"cleaned\" according to the tracker options.\n   * @param {!FieldsObj} fieldsObj\n   * @return {!FieldsObj}\n   */\n  cleanUrlFields(fieldsObj) {\n    const url = parseUrl(\n        /** @type {string} */ (fieldsObj.page || fieldsObj.location));\n\n    let pathname = url.pathname;\n\n    // If an index filename was provided, remove it if it appears at the end\n    // of the URL.\n    if (this.opts.indexFilename) {\n      const parts = pathname.split('/');\n      if (this.opts.indexFilename == parts[parts.length - 1]) {\n        parts[parts.length - 1] = '';\n        pathname = parts.join('/');\n      }\n    }\n\n    // Ensure the URL ends with or doesn't end with slash based on the\n    // `trailingSlash` option. Note that filename URLs should never contain\n    // a trailing slash.\n    if (this.opts.trailingSlash == 'remove') {\n        pathname = pathname.replace(/\\/+$/, '');\n    } else if (this.opts.trailingSlash == 'add') {\n      const isFilename = /\\.\\w+$/.test(pathname);\n      if (!isFilename && pathname.substr(-1) != '/') {\n        pathname = pathname + '/';\n      }\n    }\n\n    /** @type {!FieldsObj} */\n    const cleanedFieldsObj = {\n      page: pathname + (this.opts.stripQuery ?\n          this.stripNonWhitelistedQueryParams(url.search) : url.search),\n    };\n    if (fieldsObj.location) {\n      cleanedFieldsObj.location = fieldsObj.location;\n    }\n    if (this.queryDimension) {\n      cleanedFieldsObj[this.queryDimension] =\n          url.search.slice(1) || NULL_DIMENSION;\n    }\n\n    // Apply the `urlFieldsFilter()` option if passed.\n    if (typeof this.opts.urlFieldsFilter == 'function') {\n      /** @type {!FieldsObj} */\n      const userCleanedFieldsObj =\n          this.opts.urlFieldsFilter(cleanedFieldsObj, parseUrl);\n\n      // Ensure only the URL fields are returned.\n      const returnValue = {\n        page: userCleanedFieldsObj.page,\n        location: userCleanedFieldsObj.location,\n      };\n      if (this.queryDimension) {\n        returnValue[this.queryDimension] =\n            userCleanedFieldsObj[this.queryDimension];\n      }\n      return returnValue;\n    } else {\n      return cleanedFieldsObj;\n    }\n  }\n\n  /**\n   * Accpets a raw URL search string and returns a new search string containing\n   * only the site search params (if they exist).\n   * @param {string} searchString The URL search string (starting with '?').\n   * @return {string} The query string\n   */\n  stripNonWhitelistedQueryParams(searchString) {\n    if (Array.isArray(this.opts.queryParamsWhitelist)) {\n      const foundParams = [];\n      searchString.slice(1).split('&').forEach((kv) => {\n        const [key, value] = kv.split('=');\n        if (this.opts.queryParamsWhitelist.indexOf(key) > -1 && value) {\n          foundParams.push([key, value]);\n        }\n      });\n\n      return foundParams.length ?\n          '?' + foundParams.map((kv) => kv.join('=')).join('&') : '';\n    } else {\n      return '';\n    }\n  }\n\n  /**\n   * Restores all overridden tasks and methods.\n   */\n  remove() {\n    MethodChain.remove(this.tracker, 'get', this.trackerGetOverride);\n    MethodChain.remove(this.tracker, 'buildHitTask', this.buildHitTaskOverride);\n  }\n}\n\n\nprovide('cleanUrlTracker', CleanUrlTracker);\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport provide from '../provide';\nimport {plugins, trackUsage} from '../usage';\nimport {assign, createFieldsObj,\n        domReady, getAttributeFields} from '../utilities';\n\n\n/**\n * Class for the `impressionTracker` analytics.js plugin.\n * @implements {ImpressionTrackerPublicInterface}\n */\nclass ImpressionTracker {\n  /**\n   * Registers impression tracking.\n   * @param {!Tracker} tracker Passed internally by analytics.js\n   * @param {?ImpressionTrackerOpts} opts Passed by the require command.\n   */\n  constructor(tracker, opts) {\n    trackUsage(tracker, plugins.IMPRESSION_TRACKER);\n\n    // Feature detects to prevent errors in unsupporting browsers.\n    if (!(window.IntersectionObserver && window.MutationObserver)) return;\n\n    /** type {ImpressionTrackerOpts} */\n    const defaultOptions = {\n      // elements: undefined,\n      rootMargin: '0px',\n      fieldsObj: {},\n      attributePrefix: 'ga-',\n      // hitFilter: undefined,\n    };\n\n    this.opts = /** type {ImpressionTrackerOpts} */ (\n        assign(defaultOptions, opts));\n\n    this.tracker = tracker;\n\n    // Binds methods.\n    this.handleDomMutations = this.handleDomMutations.bind(this);\n    this.handleIntersectionChanges = this.handleIntersectionChanges.bind(this);\n    this.handleDomElementAdded = this.handleDomElementAdded.bind(this);\n    this.handleDomElementRemoved = this.handleDomElementRemoved.bind(this);\n\n    /** @type {MutationObserver} */\n    this.mutationObserver = null;\n\n    // The primary list of elements to observe. Each item contains the\n    // element ID, threshold, and whether it's currently in-view.\n    this.items = [];\n\n    // A map of element IDs in the `items` array to DOM elements in the\n    // document. The presence of a key indicates that the element ID is in the\n    // `items` array, and the presence of an element value indicates that the\n    // element is in the DOM.\n    this.elementMap = {};\n\n    // A map of threshold values. Each threshold is mapped to an\n    // IntersectionObserver instance specific to that threshold.\n    this.thresholdMap = {};\n\n    // Once the DOM is ready, start observing for changes (if present).\n    domReady(() => {\n      if (this.opts.elements) {\n        this.observeElements(this.opts.elements);\n      }\n    });\n  }\n\n  /**\n   * Starts observing the passed elements for impressions.\n   * @param {Array<!ImpressionTrackerElementsItem|string>} elements\n   */\n  observeElements(elements) {\n    const data = this.deriveDataFromElements(elements);\n\n    // Merge the new data with the data already on the plugin instance.\n    this.items = this.items.concat(data.items);\n    this.elementMap = assign({}, data.elementMap, this.elementMap);\n    this.thresholdMap = assign({}, data.thresholdMap, this.thresholdMap);\n\n    // Observe each new item.\n    data.items.forEach((item) => {\n      const observer = this.thresholdMap[item.threshold] =\n          (this.thresholdMap[item.threshold] || new IntersectionObserver(\n              this.handleIntersectionChanges, {\n                rootMargin: this.opts.rootMargin,\n                threshold: [+item.threshold],\n              }));\n\n      const element = this.elementMap[item.id] ||\n          (this.elementMap[item.id] = document.getElementById(item.id));\n\n      if (element) {\n        observer.observe(element);\n      }\n    });\n\n    if (!this.mutationObserver) {\n      this.mutationObserver = new MutationObserver(this.handleDomMutations);\n      this.mutationObserver.observe(document.body, {\n        childList: true,\n        subtree: true,\n      });\n    }\n\n    // TODO(philipwalton): Remove temporary hack to force a new frame\n    // immediately after adding observers.\n    // https://bugs.chromium.org/p/chromium/issues/detail?id=612323\n    requestAnimationFrame(() => {});\n  }\n\n  /**\n   * Stops observing the passed elements for impressions.\n   * @param {Array<!ImpressionTrackerElementsItem|string>} elements\n   * @return {undefined}\n   */\n  unobserveElements(elements) {\n    const itemsToKeep = [];\n    const itemsToRemove = [];\n\n    this.items.forEach((item) => {\n      const itemInItems = elements.some((element) => {\n        const itemToRemove = getItemFromElement(element);\n        return itemToRemove.id === item.id &&\n            itemToRemove.threshold === item.threshold &&\n            itemToRemove.trackFirstImpressionOnly ===\n                item.trackFirstImpressionOnly;\n      });\n      if (itemInItems) {\n        itemsToRemove.push(item);\n      } else {\n        itemsToKeep.push(item);\n      }\n    });\n\n    // If there are no items to keep, run the `unobserveAllElements` logic.\n    if (!itemsToKeep.length) {\n      this.unobserveAllElements();\n    } else {\n      const dataToKeep = this.deriveDataFromElements(itemsToKeep);\n      const dataToRemove = this.deriveDataFromElements(itemsToRemove);\n\n      this.items = dataToKeep.items;\n      this.elementMap = dataToKeep.elementMap;\n      this.thresholdMap = dataToKeep.thresholdMap;\n\n      // Unobserve removed elements.\n      itemsToRemove.forEach((item) => {\n        if (!dataToKeep.elementMap[item.id]) {\n          const observer = dataToRemove.thresholdMap[item.threshold];\n          const element = dataToRemove.elementMap[item.id];\n\n          if (element) {\n            observer.unobserve(element);\n          }\n\n          // Disconnect unneeded threshold observers.\n          if (!dataToKeep.thresholdMap[item.threshold]) {\n            dataToRemove.thresholdMap[item.threshold].disconnect();\n          }\n        }\n      });\n    }\n  }\n\n  /**\n   * Stops observing all currently observed elements.\n   */\n  unobserveAllElements() {\n    Object.keys(this.thresholdMap).forEach((key) => {\n      this.thresholdMap[key].disconnect();\n    });\n\n    this.mutationObserver.disconnect();\n    this.mutationObserver = null;\n\n    this.items = [];\n    this.elementMap = {};\n    this.thresholdMap = {};\n  }\n\n  /**\n   * Loops through each of the passed elements and creates a map of element IDs,\n   * threshold values, and a list of \"items\" (which contains each element's\n   * `threshold` and `trackFirstImpressionOnly` property).\n   * @param {Array} elements A list of elements to derive item data from.\n   * @return {Object} An object with the properties `items`, `elementMap`\n   *     and `threshold`.\n   */\n  deriveDataFromElements(elements) {\n    const items = [];\n    const thresholdMap = {};\n    const elementMap = {};\n\n    if (elements.length) {\n      elements.forEach((element) => {\n        const item = getItemFromElement(element);\n\n        items.push(item);\n        elementMap[item.id] = this.elementMap[item.id] || null;\n        thresholdMap[item.threshold] =\n            this.thresholdMap[item.threshold] || null;\n      });\n    }\n\n    return {items, elementMap, thresholdMap};\n  }\n\n  /**\n   * Handles nodes being added or removed from the DOM. This function is passed\n   * as the callback to `this.mutationObserver`.\n   * @param {Array} mutations A list of `MutationRecord` instances\n   */\n  handleDomMutations(mutations) {\n    for (let i = 0, mutation; mutation = mutations[i]; i++) {\n      // Handles removed elements.\n      for (let k = 0, removedEl; removedEl = mutation.removedNodes[k]; k++) {\n        this.walkNodeTree(removedEl, this.handleDomElementRemoved);\n      }\n      // Handles added elements.\n      for (let j = 0, addedEl; addedEl = mutation.addedNodes[j]; j++) {\n        this.walkNodeTree(addedEl, this.handleDomElementAdded);\n      }\n    }\n  }\n\n  /**\n   * Iterates through all descendents of a DOM node and invokes the passed\n   * callback if any of them match an elememt in `elementMap`.\n   * @param {Node} node The DOM node to walk.\n   * @param {Function} callback A function to be invoked if a match is found.\n   */\n  walkNodeTree(node, callback) {\n    if (node.nodeType == 1 && node.id in this.elementMap) {\n      callback(node.id);\n    }\n    for (let i = 0, child; child = node.childNodes[i]; i++) {\n      this.walkNodeTree(child, callback);\n    }\n  }\n\n  /**\n   * Handles intersection changes. This function is passed as the callback to\n   * `this.intersectionObserver`\n   * @param {Array} records A list of `IntersectionObserverEntry` records.\n   */\n  handleIntersectionChanges(records) {\n    const itemsToRemove = [];\n    for (let i = 0, record; record = records[i]; i++) {\n      for (let j = 0, item; item = this.items[j]; j++) {\n        if (record.target.id !== item.id) continue;\n\n        if (isTargetVisible(item.threshold, record)) {\n          this.handleImpression(item.id);\n\n          if (item.trackFirstImpressionOnly) {\n            itemsToRemove.push(item);\n          }\n        }\n      }\n    }\n    if (itemsToRemove.length) {\n      this.unobserveElements(itemsToRemove);\n    }\n  }\n\n  /**\n   * Sends a hit to Google Analytics with the impression data.\n   * @param {string} id The ID of the element making the impression.\n   */\n  handleImpression(id) {\n    const element = document.getElementById(id);\n\n    /** @type {FieldsObj} */\n    const defaultFields = {\n      transport: 'beacon',\n      eventCategory: 'Viewport',\n      eventAction: 'impression',\n      eventLabel: id,\n      nonInteraction: true,\n    };\n\n    /** @type {FieldsObj} */\n    const userFields = assign({}, this.opts.fieldsObj,\n        getAttributeFields(element, this.opts.attributePrefix));\n\n    this.tracker.send('event', createFieldsObj(defaultFields,\n        userFields, this.tracker, this.opts.hitFilter, element));\n  }\n\n  /**\n   * Handles an element in the items array being added to the DOM.\n   * @param {string} id The ID of the element that was added.\n   */\n  handleDomElementAdded(id) {\n    const element = this.elementMap[id] = document.getElementById(id);\n    this.items.forEach((item) => {\n      if (id == item.id) {\n        this.thresholdMap[item.threshold].observe(element);\n      }\n    });\n  }\n\n  /**\n   * Handles an element currently being observed for intersections being\n   * removed from the DOM.\n   * @param {string} id The ID of the element that was removed.\n   */\n  handleDomElementRemoved(id) {\n    const element = this.elementMap[id];\n    this.items.forEach((item) => {\n      if (id == item.id) {\n        this.thresholdMap[item.threshold].unobserve(element);\n      }\n    });\n\n    this.elementMap[id] = null;\n  }\n\n  /**\n   * Removes all listeners and observers.\n   * @private\n   */\n  remove() {\n    this.unobserveAllElements();\n  }\n}\n\n\nprovide('impressionTracker', ImpressionTracker);\n\n\n/**\n * Detects whether or not an intersection record represents a visible target\n * given a particular threshold.\n * @param {number} threshold The threshold the target is visible above.\n * @param {IntersectionObserverEntry} record The most recent record entry.\n * @return {boolean} True if the target is visible.\n */\nfunction isTargetVisible(threshold, record) {\n  if (threshold === 0) {\n    const i = record.intersectionRect;\n    return i.top > 0 || i.bottom > 0 || i.left > 0 || i.right > 0;\n  } else {\n    return record.intersectionRatio >= threshold;\n  }\n}\n\n\n/**\n * Creates an item by merging the passed element with the item defaults.\n * If the passed element is just a string, that string is treated as\n * the item ID.\n * @param {!ImpressionTrackerElementsItem|string} element The element to\n *     convert to an item.\n * @return {!ImpressionTrackerElementsItem} The item object.\n */\nfunction getItemFromElement(element) {\n  /** @type {ImpressionTrackerElementsItem} */\n  const defaultOpts = {\n    threshold: 0,\n    trackFirstImpressionOnly: true,\n  };\n\n  if (typeof element == 'string') {\n    element = /** @type {!ImpressionTrackerElementsItem} */ ({id: element});\n  }\n\n  return assign(defaultOpts, element);\n}\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/**\n * An simple reimplementation of the native Node.js EventEmitter class.\n * The goal of this implementation is to be as small as possible.\n */\nexport default class EventEmitter {\n  /**\n   * Creates the event registry.\n   */\n  constructor() {\n    this.registry_ = {};\n  }\n\n  /**\n   * Adds a handler function to the registry for the passed event.\n   * @param {string} event The event name.\n   * @param {!Function} fn The handler to be invoked when the passed\n   *     event is emitted.\n   */\n  on(event, fn) {\n    this.getRegistry_(event).push(fn);\n  }\n\n  /**\n   * Removes a handler function from the registry for the passed event.\n   * @param {string=} event The event name.\n   * @param {Function=} fn The handler to be removed.\n   */\n  off(event = undefined, fn = undefined) {\n    if (event && fn) {\n      const eventRegistry = this.getRegistry_(event);\n      const handlerIndex = eventRegistry.indexOf(fn);\n      if (handlerIndex > -1) {\n        eventRegistry.splice(handlerIndex, 1);\n      }\n    } else {\n      this.registry_ = {};\n    }\n  }\n\n  /**\n   * Runs all registered handlers for the passed event with the optional args.\n   * @param {string} event The event name.\n   * @param {...*} args The arguments to be passed to the handler.\n   */\n  emit(event, ...args) {\n    this.getRegistry_(event).forEach((fn) => fn(...args));\n  }\n\n  /**\n   * Returns the total number of event handlers currently registered.\n   * @return {number}\n   */\n  getEventCount() {\n    let eventCount = 0;\n    Object.keys(this.registry_).forEach((event) => {\n      eventCount += this.getRegistry_(event).length;\n    });\n    return eventCount;\n  }\n\n  /**\n   * Returns an array of handlers associated with the passed event name.\n   * If no handlers have been registered, an empty array is returned.\n   * @private\n   * @param {string} event The event name.\n   * @return {!Array} An array of handler functions.\n   */\n  getRegistry_(event) {\n    return this.registry_[event] = (this.registry_[event] || []);\n  }\n}\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport EventEmitter from './event-emitter';\nimport {assign} from './utilities';\n\n\nconst AUTOTRACK_PREFIX = 'autotrack';\nconst instances = {};\nlet isListening = false;\n\n\n/** @type {boolean|undefined} */\nlet browserSupportsLocalStorage;\n\n\n/**\n * A storage object to simplify interacting with localStorage.\n */\nexport default class Store extends EventEmitter {\n  /**\n   * Gets an existing instance for the passed arguements or creates a new\n   * instance if one doesn't exist.\n   * @param {string} trackingId The tracking ID for the GA property.\n   * @param {string} namespace A namespace unique to this store.\n   * @param {Object=} defaults An optional object of key/value defaults.\n   * @return {Store} The Store instance.\n   */\n  static getOrCreate(trackingId, namespace, defaults) {\n    const key = [AUTOTRACK_PREFIX, trackingId, namespace].join(':');\n\n    // Don't create multiple instances for the same tracking Id and namespace.\n    if (!instances[key]) {\n      instances[key] = new Store(key, defaults);\n      if (!isListening) initStorageListener();\n    }\n    return instances[key];\n  }\n\n  /**\n   * Returns true if the browser supports and can successfully write to\n   * localStorage. The results is cached so this method can be invoked many\n   * times with no extra performance cost.\n   * @private\n   * @return {boolean}\n   */\n  static isSupported_() {\n    if (browserSupportsLocalStorage != null) {\n      return browserSupportsLocalStorage;\n    }\n\n    try {\n      window.localStorage.setItem(AUTOTRACK_PREFIX, AUTOTRACK_PREFIX);\n      window.localStorage.removeItem(AUTOTRACK_PREFIX);\n      browserSupportsLocalStorage = true;\n    } catch (err) {\n      browserSupportsLocalStorage = false;\n    }\n    return browserSupportsLocalStorage;\n  }\n\n  /**\n   * Wraps the native localStorage method for each stubbing in tests.\n   * @private\n   * @param {string} key The store key.\n   * @return {string|null} The stored value.\n   */\n  static get_(key) {\n    return window.localStorage.getItem(key);\n  }\n\n  /**\n   * Wraps the native localStorage method for each stubbing in tests.\n   * @private\n   * @param {string} key The store key.\n   * @param {string} value The value to store.\n   */\n  static set_(key, value) {\n    window.localStorage.setItem(key, value);\n  }\n\n  /**\n   * Wraps the native localStorage method for each stubbing in tests.\n   * @private\n   * @param {string} key The store key.\n   */\n  static clear_(key) {\n    window.localStorage.removeItem(key);\n  }\n\n  /**\n   * @param {string} key A key unique to this store.\n   * @param {Object=} defaults An optional object of key/value defaults.\n   */\n  constructor(key, defaults = {}) {\n    super();\n    this.key_ = key;\n    this.defaults_ = defaults;\n\n    /** @type {?Object} */\n    this.cache_ = null; // Will be set after the first get.\n  }\n\n  /**\n   * Gets the data stored in localStorage for this store. If the cache is\n   * already populated, return it as is (since it's always kept up-to-date\n   * and in sync with activity in other windows via the `storage` event).\n   * TODO(philipwalton): Implement schema migrations if/when a new\n   * schema version is introduced.\n   * @return {!Object} The stored data merged with the defaults.\n   */\n  get() {\n    if (this.cache_) {\n      return this.cache_;\n    } else {\n      if (Store.isSupported_()) {\n        try {\n          this.cache_ = parse(Store.get_(this.key_));\n        } catch(err) {\n          // Do nothing.\n        }\n      }\n      return this.cache_ = assign({}, this.defaults_, this.cache_);\n    }\n  }\n\n  /**\n   * Saves the passed data object to localStorage,\n   * merging it with the existing data.\n   * @param {Object} newData The data to save.\n   */\n  set(newData) {\n    this.cache_ = assign({}, this.defaults_, this.cache_, newData);\n\n    if (Store.isSupported_()) {\n      try {\n        Store.set_(this.key_, JSON.stringify(this.cache_));\n      } catch(err) {\n        // Do nothing.\n      }\n    }\n  }\n\n  /**\n   * Clears the data in localStorage for the current store.\n   */\n  clear() {\n    this.cache_ = {};\n    if (Store.isSupported_()) {\n      try {\n        Store.clear_(this.key_);\n      } catch(err) {\n        // Do nothing.\n      }\n    }\n  }\n\n  /**\n   * Removes the store instance for the global instances map. If this is the\n   * last store instance, the storage listener is also removed.\n   * Note: this does not erase the stored data. Use `clear()` for that.\n   */\n  destroy() {\n    delete instances[this.key_];\n    if (!Object.keys(instances).length) {\n      removeStorageListener();\n    }\n  }\n}\n\n\n/**\n * Adds a single storage event listener and flips the global `isListening`\n * flag so multiple events aren't added.\n */\nfunction initStorageListener() {\n  window.addEventListener('storage', storageListener);\n  isListening = true;\n}\n\n\n/**\n * Removes the storage event listener and flips the global `isListening`\n * flag so it can be re-added later.\n */\nfunction removeStorageListener() {\n  window.removeEventListener('storage', storageListener);\n  isListening = false;\n}\n\n\n/**\n * The global storage event listener.\n * @param {!Event} event The DOM event.\n */\nfunction storageListener(event) {\n  const store = instances[event.key];\n  if (store) {\n    const oldData = assign({}, store.defaults_, parse(event.oldValue));\n    const newData = assign({}, store.defaults_, parse(event.newValue));\n\n    store.cache_ = newData;\n    store.emit('externalSet', newData, oldData);\n  }\n}\n\n\n/**\n * Parses a source string as JSON\n * @param {string|null} source\n * @return {!Object} The JSON object.\n */\nfunction parse(source) {\n  let data = {};\n  if (source) {\n    try {\n      data = /** @type {!Object} */ (JSON.parse(source));\n    } catch(err) {\n      // Do nothing.\n    }\n  }\n  return data;\n}\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport MethodChain from './method-chain';\nimport Store from './store';\nimport {now, uuid} from './utilities';\n\n\nconst SECONDS = 1000;\nconst MINUTES = 60 * SECONDS;\n\n\nconst instances = {};\n\n\n/**\n * A session management class that helps track session boundaries\n * across multiple open tabs/windows.\n */\nexport default class Session {\n  /**\n   * Gets an existing instance for the passed arguments or creates a new\n   * instance if one doesn't exist.\n   * @param {!Tracker} tracker An analytics.js tracker object.\n   * @param {number} timeout The session timeout (in minutes). This value\n   *     should match what's set in the \"Session settings\" section of the\n   *     Google Analytics admin.\n   * @param {string=} timeZone The optional IANA time zone of the view. This\n   *     value should match what's set in the \"View settings\" section of the\n   *     Google Analytics admin. (Note: this assumes all views for the property\n   *     use the same time zone. If that's not true, it's better not to use\n   *     this feature).\n   * @return {Session} The Session instance.\n   */\n  static getOrCreate(tracker, timeout, timeZone) {\n    // Don't create multiple instances for the same property.\n    const trackingId = tracker.get('trackingId');\n    if (instances[trackingId]) {\n      return instances[trackingId];\n    } else {\n      return instances[trackingId] = new Session(tracker, timeout, timeZone);\n    }\n  }\n\n  /**\n   * @param {!Tracker} tracker An analytics.js tracker object.\n   * @param {number} timeout The session timeout (in minutes). This value\n   *     should match what's set in the \"Session settings\" section of the\n   *     Google Analytics admin.\n   * @param {string=} timeZone The optional IANA time zone of the view. This\n   *     value should match what's set in the \"View settings\" section of the\n   *     Google Analytics admin. (Note: this assumes all views for the property\n   *     use the same time zone. If that's not true, it's better not to use\n   *     this feature).\n   */\n  constructor(tracker, timeout, timeZone) {\n    this.tracker = tracker;\n    this.timeout = timeout || Session.DEFAULT_TIMEOUT;\n    this.timeZone = timeZone;\n\n    // Binds methods.\n    this.sendHitTaskOverride = this.sendHitTaskOverride.bind(this);\n\n    // Overrides into the trackers sendHitTask method.\n    MethodChain.add(tracker, 'sendHitTask', this.sendHitTaskOverride);\n\n    // Some browser doesn't support various features of the\n    // `Intl.DateTimeFormat` API, so we have to try/catch it. Consequently,\n    // this allows us to assume the presence of `this.dateTimeFormatter` means\n    // it works in the current browser.\n    try {\n      this.dateTimeFormatter =\n          new Intl.DateTimeFormat('en-US', {timeZone: this.timeZone});\n    } catch(err) {\n      // Do nothing.\n    }\n\n    /** @type {SessionStoreData} */\n    const defaultProps = {\n      hitTime: 0,\n      isExpired: false,\n    };\n    this.store = Store.getOrCreate(\n        tracker.get('trackingId'), 'session', defaultProps);\n\n    // Ensure the session has an ID.\n    if (!this.store.get().id) {\n      this.store.set(/** @type {SessionStoreData} */ ({id: uuid()}));\n    }\n  }\n\n  /**\n   * Returns the ID of the current session.\n   * @return {string}\n   */\n  getId() {\n    return this.store.get().id;\n  }\n\n  /**\n   * Accepts a session ID and returns true if the specified session has\n   * evidentially expired. A session can expire for two reasons:\n   *   - More than 30 minutes has elapsed since the previous hit\n   *     was sent (The 30 minutes number is the Google Analytics default, but\n   *     it can be modified in GA admin \"Session settings\").\n   *   - A new day has started since the previous hit, in the\n   *     specified time zone (should correspond to the time zone of the\n   *     property's views).\n   *\n   * Note: since real session boundaries are determined at processing time,\n   * this is just a best guess rather than a source of truth.\n   *\n   * @param {string} id The ID of a session to check for expiry.\n   * @return {boolean} True if the session has not exp\n   */\n  isExpired(id = this.getId()) {\n    // If a session ID is passed and it doesn't match the current ID,\n    // assume it's from an expired session. If no ID is passed, assume the ID\n    // of the current session.\n    if (id != this.getId()) return true;\n\n    /** @type {SessionStoreData} */\n    const sessionData = this.store.get();\n\n    // `isExpired` will be `true` if the sessionControl field was set to\n    // 'end' on the previous hit.\n    if (sessionData.isExpired) return true;\n\n    const oldHitTime = sessionData.hitTime;\n\n    // Only consider a session expired if previous hit time data exists, and\n    // the previous hit time is greater than that session timeout period or\n    // the hits occurred on different days in the session timezone.\n    if (oldHitTime) {\n      const currentDate = new Date();\n      const oldHitDate = new Date(oldHitTime);\n      if (currentDate - oldHitDate > (this.timeout * MINUTES) ||\n          this.datesAreDifferentInTimezone(currentDate, oldHitDate)) {\n        return true;\n      }\n    }\n\n    // For all other cases return false.\n    return false;\n  }\n\n  /**\n   * Returns true if (and only if) the timezone date formatting is supported\n   * in the current browser and if the two dates are definitively not the\n   * same date in the session timezone. Anything short of this returns false.\n   * @param {!Date} d1\n   * @param {!Date} d2\n   * @return {boolean}\n   */\n  datesAreDifferentInTimezone(d1, d2) {\n    if (!this.dateTimeFormatter) {\n      return false;\n    } else {\n      return this.dateTimeFormatter.format(d1)\n          != this.dateTimeFormatter.format(d2);\n    }\n  }\n\n  /**\n   * Keeps track of when the previous hit was sent to determine if a session\n   * has expired. Also inspects the `sessionControl` field to handles\n   * expiration accordingly.\n   * @param {function(!Model)} originalMethod A reference to the overridden\n   *     method.\n   * @return {function(!Model)}\n   */\n  sendHitTaskOverride(originalMethod) {\n    return (model) => {\n      originalMethod(model);\n\n      const sessionControl = model.get('sessionControl');\n      const sessionWillStart = sessionControl == 'start' || this.isExpired();\n      const sessionWillEnd = sessionControl == 'end';\n\n      /** @type {SessionStoreData} */\n      const sessionData = this.store.get();\n      sessionData.hitTime = now();\n      if (sessionWillStart) {\n        sessionData.isExpired = false;\n        sessionData.id = uuid();\n      }\n      if (sessionWillEnd) {\n        sessionData.isExpired = true;\n      }\n      this.store.set(sessionData);\n    };\n  }\n\n  /**\n   * Restores the tracker's original `sendHitTask` to the state before\n   * session control was initialized and removes this instance from the global\n   * store.\n   */\n  destroy() {\n    MethodChain.remove(this.tracker, 'sendHitTask', this.sendHitTaskOverride);\n    this.store.destroy();\n    delete instances[this.tracker.get('trackingId')];\n  }\n}\n\n\nSession.DEFAULT_TIMEOUT = 30; // minutes\n","/**\n * Copyright 2017 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport {parseUrl} from 'dom-utils';\nimport MethodChain from '../method-chain';\nimport provide from '../provide';\nimport Session from '../session';\nimport Store from '../store';\nimport {plugins, trackUsage} from '../usage';\nimport {assign, createFieldsObj, debounce, isObject} from '../utilities';\n\n\n/**\n * Class for the `maxScrollQueryTracker` analytics.js plugin.\n * @implements {MaxScrollTrackerPublicInterface}\n */\nclass MaxScrollTracker {\n  /**\n   * Registers outbound link tracking on tracker object.\n   * @param {!Tracker} tracker Passed internally by analytics.js\n   * @param {?Object} opts Passed by the require command.\n   */\n  constructor(tracker, opts) {\n    trackUsage(tracker, plugins.MAX_SCROLL_TRACKER);\n\n    // Feature detects to prevent errors in unsupporting browsers.\n    if (!window.addEventListener) return;\n\n    /** @type {MaxScrollTrackerOpts} */\n    const defaultOpts = {\n      increaseThreshold: 20,\n      sessionTimeout: Session.DEFAULT_TIMEOUT,\n      // timeZone: undefined,\n      // maxScrollMetricIndex: undefined,\n      fieldsObj: {},\n      // hitFilter: undefined\n    };\n\n    this.opts = /** @type {MaxScrollTrackerOpts} */ (\n        assign(defaultOpts, opts));\n\n    this.tracker = tracker;\n    this.pagePath = this.getPagePath();\n\n    // Binds methods to `this`.\n    this.handleScroll = debounce(this.handleScroll.bind(this), 500);\n    this.trackerSetOverride = this.trackerSetOverride.bind(this);\n\n    // Creates the store and binds storage change events.\n    this.store = Store.getOrCreate(\n        tracker.get('trackingId'), 'plugins/max-scroll-tracker');\n\n    // Creates the session and binds session events.\n    this.session = Session.getOrCreate(\n        tracker, this.opts.sessionTimeout, this.opts.timeZone);\n\n    // Override the built-in tracker.set method to watch for changes.\n    MethodChain.add(tracker, 'set', this.trackerSetOverride);\n\n    this.listenForMaxScrollChanges();\n  }\n\n\n  /**\n   * Adds a scroll event listener if the max scroll percentage for the\n   * current page isn't already at 100%.\n   */\n  listenForMaxScrollChanges() {\n    const maxScrollPercentage = this.getMaxScrollPercentageForCurrentPage();\n    if (maxScrollPercentage < 100) {\n      window.addEventListener('scroll', this.handleScroll);\n    }\n  }\n\n\n  /**\n   * Removes an added scroll listener.\n   */\n  stopListeningForMaxScrollChanges() {\n    window.removeEventListener('scroll', this.handleScroll);\n  }\n\n\n  /**\n   * Handles the scroll event. If the current scroll percentage is greater\n   * that the stored scroll event by at least the specified increase threshold,\n   * send an event with the increase amount.\n   */\n  handleScroll() {\n    const pageHeight = getPageHeight();\n    const scrollPos = window.pageYOffset; // scrollY isn't supported in IE.\n    const windowHeight = window.innerHeight;\n\n    // Ensure scrollPercentage is an integer between 0 and 100.\n    const scrollPercentage = Math.min(100, Math.max(0,\n        Math.round(100 * (scrollPos / (pageHeight - windowHeight)))));\n\n    // If the max scroll data gets out of the sync with the session data\n    // (for whatever reason), clear it.\n    const sessionId = this.session.getId();\n    if (sessionId != this.store.get().sessionId) {\n      this.store.clear();\n      this.store.set({sessionId});\n    }\n\n    // If the session has expired, clear the stored data and don't send any\n    // events (since they'd start a new session). Note: this check is needed,\n    // in addition to the above check, to handle cases where the session IDs\n    // got out of sync, but the session didn't expire.\n    if (this.session.isExpired(this.store.get().sessionId)) {\n      this.store.clear();\n    } else {\n      const maxScrollPercentage = this.getMaxScrollPercentageForCurrentPage();\n\n      if (scrollPercentage > maxScrollPercentage) {\n        if (scrollPercentage == 100 || maxScrollPercentage == 100) {\n          this.stopListeningForMaxScrollChanges();\n        }\n        const increaseAmount = scrollPercentage - maxScrollPercentage;\n        if (scrollPercentage == 100 ||\n            increaseAmount >= this.opts.increaseThreshold) {\n          this.setMaxScrollPercentageForCurrentPage(scrollPercentage);\n          this.sendMaxScrollEvent(increaseAmount, scrollPercentage);\n        }\n      }\n    }\n  }\n\n  /**\n   * Detects changes to the tracker object and triggers an update if the page\n   * field has changed.\n   * @param {function((Object|string), (string|undefined))} originalMethod\n   *     A reference to the overridden method.\n   * @return {function((Object|string), (string|undefined))}\n   */\n  trackerSetOverride(originalMethod) {\n    return (field, value) => {\n      originalMethod(field, value);\n\n      /** @type {!FieldsObj} */\n      const fields = isObject(field) ? field : {[field]: value};\n      if (fields.page) {\n        const lastPagePath = this.pagePath;\n        this.pagePath = this.getPagePath();\n\n        if (this.pagePath != lastPagePath) {\n          // Since event listeners for the same function are never added twice,\n          // we don't need to worry about whether we're already listening. We\n          // can just add the event listener again.\n          this.listenForMaxScrollChanges();\n        }\n      }\n    };\n  }\n\n  /**\n   * Sends an event for the increased max scroll percentage amount.\n   * @param {number} increaseAmount\n   * @param {number} scrollPercentage\n   */\n  sendMaxScrollEvent(increaseAmount, scrollPercentage) {\n    /** @type {FieldsObj} */\n    const defaultFields = {\n      transport: 'beacon',\n      eventCategory: 'Max Scroll',\n      eventAction: 'increase',\n      eventValue: increaseAmount,\n      eventLabel: String(scrollPercentage),\n      nonInteraction: true,\n    };\n\n    // If a custom metric was specified, set it equal to the event value.\n    if (this.opts.maxScrollMetricIndex) {\n      defaultFields['metric' + this.opts.maxScrollMetricIndex] = increaseAmount;\n    }\n\n    this.tracker.send('event',\n        createFieldsObj(defaultFields, this.opts.fieldsObj,\n            this.tracker, this.opts.hitFilter));\n  }\n\n  /**\n   * Stores the current max scroll percentage for the current page.\n   * @param {number} maxScrollPercentage\n   */\n  setMaxScrollPercentageForCurrentPage(maxScrollPercentage) {\n    this.store.set({\n      [this.pagePath]: maxScrollPercentage,\n      sessionId: this.session.getId(),\n    });\n  }\n\n  /**\n   * Gets the stored max scroll percentage for the current page.\n   * @return {number}\n   */\n  getMaxScrollPercentageForCurrentPage() {\n    return this.store.get()[this.pagePath] || 0;\n  }\n\n  /**\n   * Gets the page path from the tracker object.\n   * @return {number}\n   */\n  getPagePath() {\n    const url = parseUrl(\n        this.tracker.get('page') || this.tracker.get('location'));\n    return url.pathname + url.search;\n  }\n\n  /**\n   * Removes all event listeners and restores overridden methods.\n   */\n  remove() {\n    this.session.destroy();\n    this.stopListeningForMaxScrollChanges();\n    MethodChain.remove(this.tracker, 'set', this.trackerSetOverride);\n  }\n}\n\n\nprovide('maxScrollTracker', MaxScrollTracker);\n\n\n/**\n * Gets the maximum height of the page including scrollable area.\n * @return {number}\n */\nfunction getPageHeight() {\n  const html = document.documentElement;\n  const body = document.body;\n  return Math.max(html.offsetHeight, html.scrollHeight,\n      body.offsetHeight, body.scrollHeight);\n}\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport {NULL_DIMENSION} from '../constants';\nimport provide from '../provide';\nimport {plugins, trackUsage} from '../usage';\nimport {assign, createFieldsObj,\n        debounce, isObject, toArray} from '../utilities';\n\n\n/**\n * Declares the MediaQueryList instance cache.\n */\nconst mediaMap = {};\n\n\n/**\n * Class for the `mediaQueryTracker` analytics.js plugin.\n * @implements {MediaQueryTrackerPublicInterface}\n */\nclass MediaQueryTracker {\n  /**\n   * Registers media query tracking.\n   * @param {!Tracker} tracker Passed internally by analytics.js\n   * @param {?Object} opts Passed by the require command.\n   */\n  constructor(tracker, opts) {\n    trackUsage(tracker, plugins.MEDIA_QUERY_TRACKER);\n\n    // Feature detects to prevent errors in unsupporting browsers.\n    if (!window.matchMedia) return;\n\n    /** @type {MediaQueryTrackerOpts} */\n    const defaultOpts = {\n      // definitions: unefined,\n      changeTemplate: this.changeTemplate,\n      changeTimeout: 1000,\n      fieldsObj: {},\n      // hitFilter: undefined,\n    };\n\n    this.opts = /** @type {MediaQueryTrackerOpts} */ (\n        assign(defaultOpts, opts));\n\n    // Exits early if media query data doesn't exist.\n    if (!isObject(this.opts.definitions)) return;\n\n    this.opts.definitions = toArray(this.opts.definitions);\n    this.tracker = tracker;\n    this.changeListeners = [];\n\n    this.processMediaQueries();\n  }\n\n  /**\n   * Loops through each media query definition, sets the custom dimenion data,\n   * and adds the change listeners.\n   */\n  processMediaQueries() {\n    this.opts.definitions.forEach((definition) => {\n      // Only processes definitions with a name and index.\n      if (definition.name && definition.dimensionIndex) {\n        const mediaName = this.getMatchName(definition);\n        this.tracker.set('dimension' + definition.dimensionIndex, mediaName);\n\n        this.addChangeListeners(definition);\n      }\n    });\n  }\n\n  /**\n   * Takes a definition object and return the name of the matching media item.\n   * If no match is found, the NULL_DIMENSION value is returned.\n   * @param {Object} definition A set of named media queries associated\n   *     with a single custom dimension.\n   * @return {string} The name of the matched media or NULL_DIMENSION.\n   */\n  getMatchName(definition) {\n    let match;\n\n    definition.items.forEach((item) => {\n      if (getMediaList(item.media).matches) {\n        match = item;\n      }\n    });\n    return match ? match.name : NULL_DIMENSION;\n  }\n\n  /**\n   * Adds change listeners to each media query in the definition list.\n   * Debounces the changes to prevent unnecessary hits from being sent.\n   * @param {Object} definition A set of named media queries associated\n   *     with a single custom dimension\n   */\n  addChangeListeners(definition) {\n    definition.items.forEach((item) => {\n      const mql = getMediaList(item.media);\n      const fn = debounce(() => {\n        this.handleChanges(definition);\n      }, this.opts.changeTimeout);\n\n      mql.addListener(fn);\n      this.changeListeners.push({mql, fn});\n    });\n  }\n\n  /**\n   * Handles changes to the matched media. When the new value differs from\n   * the old value, a change event is sent.\n   * @param {Object} definition A set of named media queries associated\n   *     with a single custom dimension\n   */\n  handleChanges(definition) {\n    const newValue = this.getMatchName(definition);\n    const oldValue = this.tracker.get('dimension' + definition.dimensionIndex);\n\n    if (newValue !== oldValue) {\n      this.tracker.set('dimension' + definition.dimensionIndex, newValue);\n\n      /** @type {FieldsObj} */\n      const defaultFields = {\n        transport: 'beacon',\n        eventCategory: definition.name,\n        eventAction: 'change',\n        eventLabel: this.opts.changeTemplate(oldValue, newValue),\n        nonInteraction: true,\n      };\n      this.tracker.send('event', createFieldsObj(defaultFields,\n          this.opts.fieldsObj, this.tracker, this.opts.hitFilter));\n    }\n  }\n\n  /**\n   * Removes all event listeners and instance properties.\n   */\n  remove() {\n    for (let i = 0, listener; listener = this.changeListeners[i]; i++) {\n      listener.mql.removeListener(listener.fn);\n    }\n  }\n\n  /**\n   * Sets the default formatting of the change event label.\n   * This can be overridden by setting the `changeTemplate` option.\n   * @param {string} oldValue The value of the media query prior to the change.\n   * @param {string} newValue The value of the media query after the change.\n   * @return {string} The formatted event label.\n   */\n  changeTemplate(oldValue, newValue) {\n    return oldValue + ' => ' + newValue;\n  }\n}\n\n\nprovide('mediaQueryTracker', MediaQueryTracker);\n\n\n/**\n * Accepts a media query and returns a MediaQueryList object.\n * Caches the values to avoid multiple unnecessary instances.\n * @param {string} media A media query value.\n * @return {MediaQueryList} The matched media.\n */\nfunction getMediaList(media) {\n  return mediaMap[media] || (mediaMap[media] = window.matchMedia(media));\n}\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport {delegate, parseUrl} from 'dom-utils';\nimport provide from '../provide';\nimport {plugins, trackUsage} from '../usage';\nimport {assign, createFieldsObj,\n        getAttributeFields, withTimeout} from '../utilities';\n\n\n/**\n * Class for the `outboundFormTracker` analytics.js plugin.\n * @implements {OutboundFormTrackerPublicInterface}\n */\nclass OutboundFormTracker {\n  /**\n   * Registers outbound form tracking.\n   * @param {!Tracker} tracker Passed internally by analytics.js\n   * @param {?Object} opts Passed by the require command.\n   */\n  constructor(tracker, opts) {\n    trackUsage(tracker, plugins.OUTBOUND_FORM_TRACKER);\n\n    // Feature detects to prevent errors in unsupporting browsers.\n    if (!window.addEventListener) return;\n\n    /** @type {OutboundFormTrackerOpts} */\n    const defaultOpts = {\n      formSelector: 'form',\n      shouldTrackOutboundForm: this.shouldTrackOutboundForm,\n      fieldsObj: {},\n      attributePrefix: 'ga-',\n      // hitFilter: undefined\n    };\n\n    this.opts = /** @type {OutboundFormTrackerOpts} */ (\n        assign(defaultOpts, opts));\n\n    this.tracker = tracker;\n\n    this.delegate = delegate(document, 'submit', this.opts.formSelector,\n        this.handleFormSubmits.bind(this), {composed: true, useCapture: true});\n  }\n\n  /**\n   * Handles all submits on form elements. A form submit is considered outbound\n   * if its action attribute starts with http and does not contain\n   * location.hostname.\n   * When the beacon transport method is not available, the event's default\n   * action is prevented and re-emitted after the hit is sent.\n   * @param {Event} event The DOM submit event.\n   * @param {Element} form The delegated event target.\n   */\n  handleFormSubmits(event, form) {\n    const action = parseUrl(form.action).href;\n\n    /** @type {FieldsObj} */\n    const defaultFields = {\n      transport: 'beacon',\n      eventCategory: 'Outbound Form',\n      eventAction: 'submit',\n      eventLabel: action,\n    };\n\n    if (this.opts.shouldTrackOutboundForm(form, parseUrl)) {\n      if (!navigator.sendBeacon) {\n        // Stops the submit and waits until the hit is complete (with timeout)\n        // for browsers that don't support beacon.\n        event.preventDefault();\n        defaultFields.hitCallback = withTimeout(function() {\n          form.submit();\n        });\n      }\n\n      const userFields = assign({}, this.opts.fieldsObj,\n          getAttributeFields(form, this.opts.attributePrefix));\n\n      this.tracker.send('event', createFieldsObj(\n          defaultFields, userFields,\n              this.tracker, this.opts.hitFilter, form, event));\n    }\n  }\n\n  /**\n   * Determines whether or not the tracker should send a hit when a form is\n   * submitted. By default, forms with an action attribute that starts with\n   * \"http\" and doesn't contain the current hostname are tracked.\n   * @param {Element} form The form that was submitted.\n   * @param {Function} parseUrlFn A cross-browser utility method for url\n   *     parsing (note: renamed to disambiguate when compiling).\n   * @return {boolean} Whether or not the form should be tracked.\n   */\n  shouldTrackOutboundForm(form, parseUrlFn) {\n    const url = parseUrlFn(form.action);\n    return url.hostname != location.hostname &&\n        url.protocol.slice(0, 4) == 'http';\n  }\n\n  /**\n   * Removes all event listeners and instance properties.\n   */\n  remove() {\n    this.delegate.destroy();\n  }\n}\n\n\nprovide('outboundFormTracker', OutboundFormTracker);\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport {delegate, parseUrl} from 'dom-utils';\nimport provide from '../provide';\nimport {plugins, trackUsage} from '../usage';\nimport {assign, createFieldsObj,\n        getAttributeFields, withTimeout} from '../utilities';\n\n\n/**\n * Class for the `outboundLinkTracker` analytics.js plugin.\n * @implements {OutboundLinkTrackerPublicInterface}\n */\nclass OutboundLinkTracker {\n  /**\n   * Registers outbound link tracking on a tracker object.\n   * @param {!Tracker} tracker Passed internally by analytics.js\n   * @param {?Object} opts Passed by the require command.\n   */\n  constructor(tracker, opts) {\n    trackUsage(tracker, plugins.OUTBOUND_LINK_TRACKER);\n\n    // Feature detects to prevent errors in unsupporting browsers.\n    if (!window.addEventListener) return;\n\n    /** @type {OutboundLinkTrackerOpts} */\n    const defaultOpts = {\n      events: ['click'],\n      linkSelector: 'a, area',\n      shouldTrackOutboundLink: this.shouldTrackOutboundLink,\n      fieldsObj: {},\n      attributePrefix: 'ga-',\n      // hitFilter: undefined,\n    };\n\n    this.opts = /** @type {OutboundLinkTrackerOpts} */ (\n        assign(defaultOpts, opts));\n\n    this.tracker = tracker;\n\n    // Binds methods.\n    this.handleLinkInteractions = this.handleLinkInteractions.bind(this);\n\n    // Creates a mapping of events to their delegates\n    this.delegates = {};\n    this.opts.events.forEach((event) => {\n      this.delegates[event] = delegate(document, event, this.opts.linkSelector,\n          this.handleLinkInteractions, {composed: true, useCapture: true});\n    });\n  }\n\n  /**\n   * Handles all interactions on link elements. A link is considered an outbound\n   * link if its hostname property does not match location.hostname. When the\n   * beacon transport method is not available, the links target is set to\n   * \"_blank\" to ensure the hit can be sent.\n   * @param {Event} event The DOM click event.\n   * @param {Element} link The delegated event target.\n   */\n  handleLinkInteractions(event, link) {\n    if (this.opts.shouldTrackOutboundLink(link, parseUrl)) {\n      const href = link.getAttribute('href') || link.getAttribute('xlink:href');\n      const url = parseUrl(href);\n\n      /** @type {FieldsObj} */\n      const defaultFields = {\n        transport: 'beacon',\n        eventCategory: 'Outbound Link',\n        eventAction: event.type,\n        eventLabel: url.href,\n      };\n\n      /** @type {FieldsObj} */\n      const userFields = assign({}, this.opts.fieldsObj,\n          getAttributeFields(link, this.opts.attributePrefix));\n\n      const fieldsObj = createFieldsObj(defaultFields, userFields,\n          this.tracker, this.opts.hitFilter, link, event);\n\n      if (!navigator.sendBeacon &&\n          linkClickWillUnloadCurrentPage(event, link)) {\n        // Adds a new event handler at the last minute to minimize the chances\n        // that another event handler for this click will run after this logic.\n        const clickHandler = () => {\n          window.removeEventListener('click', clickHandler);\n\n          // Checks to make sure another event handler hasn't already prevented\n          // the default action. If it has the custom redirect isn't needed.\n          if (!event.defaultPrevented) {\n            // Stops the click and waits until the hit is complete (with\n            // timeout) for browsers that don't support beacon.\n            event.preventDefault();\n\n            const oldHitCallback = fieldsObj.hitCallback;\n            fieldsObj.hitCallback = withTimeout(function() {\n              if (typeof oldHitCallback == 'function') oldHitCallback();\n              location.href = href;\n            });\n          }\n          this.tracker.send('event', fieldsObj);\n        };\n        window.addEventListener('click', clickHandler);\n      } else {\n        this.tracker.send('event', fieldsObj);\n      }\n    }\n  }\n\n  /**\n   * Determines whether or not the tracker should send a hit when a link is\n   * clicked. By default links with a hostname property not equal to the current\n   * hostname are tracked.\n   * @param {Element} link The link that was clicked on.\n   * @param {Function} parseUrlFn A cross-browser utility method for url\n   *     parsing (note: renamed to disambiguate when compiling).\n   * @return {boolean} Whether or not the link should be tracked.\n   */\n  shouldTrackOutboundLink(link, parseUrlFn) {\n    const href = link.getAttribute('href') || link.getAttribute('xlink:href');\n    const url = parseUrlFn(href);\n    return url.hostname != location.hostname &&\n        url.protocol.slice(0, 4) == 'http';\n  }\n\n  /**\n   * Removes all event listeners and instance properties.\n   */\n  remove() {\n    Object.keys(this.delegates).forEach((key) => {\n      this.delegates[key].destroy();\n    });\n  }\n}\n\n\nprovide('outboundLinkTracker', OutboundLinkTracker);\n\n\n/**\n * Determines if a link click event will cause the current page to upload.\n * Note: most link clicks *will* cause the current page to unload because they\n * initiate a page navigation. The most common reason a link click won't cause\n * the page to unload is if the clicked was to open the link in a new tab.\n * @param {Event} event The DOM event.\n * @param {Element} link The link element clicked on.\n * @return {boolean} True if the current page will be unloaded.\n */\nfunction linkClickWillUnloadCurrentPage(event, link) {\n  return !(\n      // The event type can be customized; we only care about clicks here.\n      event.type != 'click' ||\n      // Links with target=\"_blank\" set will open in a new window/tab.\n      link.target == '_blank' ||\n      // On mac, command clicking will open a link in a new tab. Control\n      // clicking does this on windows.\n      event.metaKey || event.ctrlKey ||\n      // Shift clicking in Chrome/Firefox opens the link in a new window\n      // In Safari it adds the URL to a favorites list.\n      event.shiftKey ||\n      // On Mac, clicking with the option key is used to download a resouce.\n      event.altKey ||\n      // Middle mouse button clicks (which == 2) are used to open a link\n      // in a new tab, and right clicks (which == 3) on Firefox trigger\n      // a click event.\n      event.which > 1);\n}\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport {NULL_DIMENSION} from '../constants';\nimport MethodChain from '../method-chain';\nimport provide from '../provide';\nimport Session from '../session';\nimport Store from '../store';\nimport {plugins, trackUsage} from '../usage';\nimport {assign, createFieldsObj, deferUntilPluginsLoaded,\n    isObject, now, uuid} from '../utilities';\n\n\nconst HIDDEN = 'hidden';\nconst VISIBLE = 'visible';\nconst PAGE_ID = uuid();\nconst SECONDS = 1000;\n\n\n/**\n * Class for the `pageVisibilityTracker` analytics.js plugin.\n * @implements {PageVisibilityTrackerPublicInterface}\n */\nclass PageVisibilityTracker {\n  /**\n   * Registers outbound link tracking on tracker object.\n   * @param {!Tracker} tracker Passed internally by analytics.js\n   * @param {?Object} opts Passed by the require command.\n   */\n  constructor(tracker, opts) {\n    trackUsage(tracker, plugins.PAGE_VISIBILITY_TRACKER);\n\n    // Feature detects to prevent errors in unsupporting browsers.\n    if (!document.visibilityState) return;\n\n    /** @type {PageVisibilityTrackerOpts} */\n    const defaultOpts = {\n      sessionTimeout: Session.DEFAULT_TIMEOUT,\n      visibleThreshold: 5 * SECONDS,\n      // timeZone: undefined,\n      sendInitialPageview: false,\n      // pageLoadsMetricIndex: undefined,\n      // visibleMetricIndex: undefined,\n      fieldsObj: {},\n      // hitFilter: undefined\n    };\n\n    this.opts = /** @type {PageVisibilityTrackerOpts} */ (\n        assign(defaultOpts, opts));\n\n    this.tracker = tracker;\n    this.lastPageState = document.visibilityState;\n    this.visibleThresholdTimeout_ = null;\n    this.isInitialPageviewSent_ = false;\n\n    // Binds methods to `this`.\n    this.trackerSetOverride = this.trackerSetOverride.bind(this);\n    this.handleChange = this.handleChange.bind(this);\n    this.handleWindowUnload = this.handleWindowUnload.bind(this);\n    this.handleExternalStoreSet = this.handleExternalStoreSet.bind(this);\n\n    // Creates the store and binds storage change events.\n    this.store = Store.getOrCreate(\n        tracker.get('trackingId'), 'plugins/page-visibility-tracker');\n    this.store.on('externalSet', this.handleExternalStoreSet);\n\n    // Creates the session and binds session events.\n    this.session = Session.getOrCreate(\n        tracker, this.opts.sessionTimeout, this.opts.timeZone);\n\n    // Override the built-in tracker.set method to watch for changes.\n    MethodChain.add(tracker, 'set', this.trackerSetOverride);\n\n    window.addEventListener('unload', this.handleWindowUnload);\n    document.addEventListener('visibilitychange', this.handleChange);\n\n    // Postpone sending any hits until the next call stack, which allows all\n    // autotrack plugins to be required sync before any hits are sent.\n    deferUntilPluginsLoaded(this.tracker, () => {\n      if (document.visibilityState == VISIBLE) {\n        if (this.opts.sendInitialPageview) {\n          this.sendPageview({isPageLoad: true});\n          this.isInitialPageviewSent_ = true;\n        }\n        this.store.set(/** @type {PageVisibilityStoreData} */ ({\n          time: now(),\n          state: VISIBLE,\n          pageId: PAGE_ID,\n          sessionId: this.session.getId(),\n        }));\n      } else {\n        if (this.opts.sendInitialPageview && this.opts.pageLoadsMetricIndex) {\n          this.sendPageLoad();\n        }\n      }\n    });\n  }\n\n  /**\n   * Inspects the last visibility state change data and determines if a\n   * visibility event needs to be tracked based on the current visibility\n   * state and whether or not the session has expired. If the session has\n   * expired, a change to `visible` will trigger an additional pageview.\n   * This method also sends as the event value (and optionally a custom metric)\n   * the elapsed time between this event and the previously reported change\n   * in the same session, allowing you to more accurately determine when users\n   * were actually looking at your page versus when it was in the background.\n   */\n  handleChange() {\n    if (!(document.visibilityState == VISIBLE ||\n        document.visibilityState == HIDDEN)) {\n      return;\n    }\n\n    const lastStoredChange = this.getAndValidateChangeData();\n\n    /** @type {PageVisibilityStoreData} */\n    const change = {\n      time: now(),\n      state: document.visibilityState,\n      pageId: PAGE_ID,\n      sessionId: this.session.getId(),\n    };\n\n    // If the visibilityState has changed to visible and the initial pageview\n    // has not been sent (and the `sendInitialPageview` option is `true`).\n    // Send the initial pageview now.\n    if (document.visibilityState == VISIBLE &&\n        this.opts.sendInitialPageview && !this.isInitialPageviewSent_) {\n      this.sendPageview();\n      this.isInitialPageviewSent_ = true;\n    }\n\n    // If the visibilityState has changed to hidden, clear any scheduled\n    // pageviews waiting for the visibleThreshold timeout.\n    if (document.visibilityState == HIDDEN && this.visibleThresholdTimeout_) {\n      clearTimeout(this.visibleThresholdTimeout_);\n    }\n\n    if (this.session.isExpired(lastStoredChange.sessionId)) {\n      this.store.clear();\n      if (this.lastPageState == HIDDEN &&\n          document.visibilityState == VISIBLE) {\n        // If the session has expired, changes from hidden to visible should\n        // be considered a new pageview rather than a visibility event.\n        // This behavior ensures all sessions contain a pageview so\n        // session-level page dimensions and metrics (e.g. ga:landingPagePath\n        // and ga:entrances) are correct.\n        // Also, in order to prevent false positives, we add a small timeout\n        // that is cleared if the visibilityState changes to hidden shortly\n        // after the change to visible. This can happen if a user is quickly\n        // switching through their open tabs but not actually interacting with\n        // and of them. It can also happen when a user goes to a tab just to\n        // immediately close it. Such cases should not be considered pageviews.\n        clearTimeout(this.visibleThresholdTimeout_);\n        this.visibleThresholdTimeout_ = setTimeout(() => {\n          this.store.set(change);\n          this.sendPageview({hitTime: change.time});\n        }, this.opts.visibleThreshold);\n      }\n    } else {\n      if (lastStoredChange.pageId == PAGE_ID &&\n          lastStoredChange.state == VISIBLE) {\n        this.sendPageVisibilityEvent(lastStoredChange);\n      }\n      this.store.set(change);\n    }\n\n    this.lastPageState = document.visibilityState;\n  }\n\n  /**\n   * Retroactively updates the stored change data in cases where it's known to\n   * be out of sync.\n   * This plugin keeps track of each visiblity change and stores the last one\n   * in localStorage. LocalStorage is used to handle situations where the user\n   * has multiple page open at the same time and we don't want to\n   * double-report page visibility in those cases.\n   * However, a problem can occur if a user closes a page when one or more\n   * visible pages are still open. In such cases it's impossible to know\n   * which of the remaining pages the user will interact with next.\n   * To solve this problem we wait for the next change on any page and then\n   * retroactively update the stored data to reflect the current page as being\n   * the page on which the last change event occured and measure visibility\n   * from that point.\n   * @return {!PageVisibilityStoreData}\n   */\n  getAndValidateChangeData() {\n    const lastStoredChange =\n        /** @type {PageVisibilityStoreData} */ (this.store.get());\n\n    if (this.lastPageState == VISIBLE &&\n        lastStoredChange.state == HIDDEN &&\n        lastStoredChange.pageId != PAGE_ID) {\n      lastStoredChange.state = VISIBLE;\n      lastStoredChange.pageId = PAGE_ID;\n      this.store.set(lastStoredChange);\n    }\n    return lastStoredChange;\n  }\n\n  /**\n   * Sends a Page Visibility event to track the time this page was in the\n   * visible state (assuming it was in that state long enough to meet the\n   * threshold).\n   * @param {!PageVisibilityStoreData} lastStoredChange\n   * @param {{hitTime: (number|undefined)}=} param1\n   *     - hitTime: A hit timestap used to help ensure original order in cases\n   *                where the send is delayed.\n   */\n  sendPageVisibilityEvent(lastStoredChange, {hitTime} = {}) {\n    const delta = this.getTimeSinceLastStoredChange(\n        lastStoredChange, {hitTime});\n\n    // If the detla is greater than the visibileThreshold, report it.\n    if (delta && delta >= this.opts.visibleThreshold) {\n      const deltaInSeconds = Math.round(delta / SECONDS);\n\n      /** @type {FieldsObj} */\n      const defaultFields = {\n        transport: 'beacon',\n        nonInteraction: true,\n        eventCategory: 'Page Visibility',\n        eventAction: 'track',\n        eventValue: deltaInSeconds,\n        eventLabel: NULL_DIMENSION,\n      };\n\n      if (hitTime) {\n        defaultFields.queueTime = now() - hitTime;\n      }\n\n      // If a custom metric was specified, set it equal to the event value.\n      if (this.opts.visibleMetricIndex) {\n        defaultFields['metric' + this.opts.visibleMetricIndex] = deltaInSeconds;\n      }\n\n      this.tracker.send('event',\n          createFieldsObj(defaultFields, this.opts.fieldsObj,\n              this.tracker, this.opts.hitFilter));\n    }\n  }\n\n  /**\n   * Sends a page load event.\n   */\n  sendPageLoad() {\n    /** @type {FieldsObj} */\n    const defaultFields = {\n      transport: 'beacon',\n      eventCategory: 'Page Visibility',\n      eventAction: 'page load',\n      eventLabel: NULL_DIMENSION,\n      ['metric' + this.opts.pageLoadsMetricIndex]: 1,\n      nonInteraction: true,\n    };\n    this.tracker.send('event',\n        createFieldsObj(defaultFields, this.opts.fieldsObj,\n            this.tracker, this.opts.hitFilter));\n  }\n\n  /**\n   * Sends a pageview, optionally calculating an offset if hitTime is passed.\n   * @param {{\n   *   hitTime: (number|undefined),\n   *   isPageLoad: (boolean|undefined)\n   * }=} param1\n   *     hitTime: The timestamp of the current hit.\n   *     isPageLoad: True if this pageview was also a page load.\n   */\n  sendPageview({hitTime, isPageLoad} = {}) {\n    /** @type {FieldsObj} */\n    const defaultFields = {transport: 'beacon'};\n    if (hitTime) {\n      defaultFields.queueTime = now() - hitTime;\n    }\n    if (isPageLoad && this.opts.pageLoadsMetricIndex) {\n      defaultFields['metric' + this.opts.pageLoadsMetricIndex] = 1;\n    }\n\n    this.tracker.send('pageview',\n        createFieldsObj(defaultFields, this.opts.fieldsObj,\n            this.tracker, this.opts.hitFilter));\n  }\n\n  /**\n   * Detects changes to the tracker object and triggers an update if the page\n   * field has changed.\n   * @param {function((Object|string), (string|undefined))} originalMethod\n   *     A reference to the overridden method.\n   * @return {function((Object|string), (string|undefined))}\n   */\n  trackerSetOverride(originalMethod) {\n    return (field, value) => {\n      /** @type {!FieldsObj} */\n      const fields = isObject(field) ? field : {[field]: value};\n      if (fields.page && fields.page !== this.tracker.get('page')) {\n        if (this.lastPageState == VISIBLE) {\n          this.handleChange();\n        }\n      }\n      originalMethod(field, value);\n    };\n  }\n\n  /**\n   * Calculates the time since the last visibility change event in the current\n   * session. If the session has expired the reported time is zero.\n   * @param {PageVisibilityStoreData} lastStoredChange\n   * @param {{hitTime: (number|undefined)}=} param1\n   *     hitTime: The time of the current hit (defaults to now).\n   * @return {number} The time (in ms) since the last change.\n   */\n  getTimeSinceLastStoredChange(lastStoredChange, {hitTime} = {}) {\n    return lastStoredChange.time ?\n        (hitTime || now()) - lastStoredChange.time : 0;\n  }\n\n  /**\n   * Handles responding to the `storage` event.\n   * The code on this page needs to be informed when other tabs or windows are\n   * updating the stored page visibility state data. This method checks to see\n   * if a hidden state is stored when there are still visible tabs open, which\n   * can happen if multiple windows are open at the same time.\n   * @param {PageVisibilityStoreData} newData\n   * @param {PageVisibilityStoreData} oldData\n   */\n  handleExternalStoreSet(newData, oldData) {\n    // If the change times are the same, then the previous write only\n    // updated the active page ID. It didn't enter a new state and thus no\n    // hits should be sent.\n    if (newData.time == oldData.time) return;\n\n    // Page Visibility events must be sent by the tracker on the page\n    // where the original event occurred. So if a change happens on another\n    // page, but this page is where the previous change event occurred, then\n    // this page is the one that needs to send the event (so all dimension\n    // data is correct).\n    if (oldData.pageId == PAGE_ID &&\n        oldData.state == VISIBLE &&\n        !this.session.isExpired(oldData.sessionId)) {\n      this.sendPageVisibilityEvent(oldData, {hitTime: newData.time});\n    }\n  }\n\n  /**\n   * Handles responding to the `unload` event.\n   * Since some browsers don't emit a `visibilitychange` event in all cases\n   * where a page might be unloaded, it's necessary to hook into the `unload`\n   * event to ensure the correct state is always stored.\n   */\n  handleWindowUnload() {\n    // If the stored visibility state isn't hidden when the unload event\n    // fires, it means the visibilitychange event didn't fire as the document\n    // was being unloaded, so we invoke it manually.\n    if (this.lastPageState != HIDDEN) {\n      this.handleChange();\n    }\n  }\n\n  /**\n   * Removes all event listeners and restores overridden methods.\n   */\n  remove() {\n    this.store.destroy();\n    this.session.destroy();\n    MethodChain.remove(this.tracker, 'set', this.trackerSetOverride);\n    window.removeEventListener('unload', this.handleWindowUnload);\n    document.removeEventListener('visibilitychange', this.handleChange);\n  }\n}\n\n\nprovide('pageVisibilityTracker', PageVisibilityTracker);\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport provide from '../provide';\nimport {plugins, trackUsage} from '../usage';\nimport {assign, createFieldsObj} from '../utilities';\n\n\n/**\n * Class for the `socialWidgetTracker` analytics.js plugin.\n * @implements {SocialWidgetTrackerPublicInterface}\n */\nclass SocialWidgetTracker {\n  /**\n   * Registers social tracking on tracker object.\n   * Supports both declarative social tracking via HTML attributes as well as\n   * tracking for social events when using official Twitter or Facebook widgets.\n   * @param {!Tracker} tracker Passed internally by analytics.js\n   * @param {?Object} opts Passed by the require command.\n   */\n  constructor(tracker, opts) {\n    trackUsage(tracker, plugins.SOCIAL_WIDGET_TRACKER);\n\n    // Feature detects to prevent errors in unsupporting browsers.\n    if (!window.addEventListener) return;\n\n    /** @type {SocialWidgetTrackerOpts} */\n    const defaultOpts = {\n      fieldsObj: {},\n      hitFilter: null,\n    };\n\n    this.opts = /** @type {SocialWidgetTrackerOpts} */ (\n        assign(defaultOpts, opts));\n\n    this.tracker = tracker;\n\n    // Binds methods to `this`.\n    this.addWidgetListeners = this.addWidgetListeners.bind(this);\n    this.addTwitterEventHandlers = this.addTwitterEventHandlers.bind(this);\n    this.handleTweetEvents = this.handleTweetEvents.bind(this);\n    this.handleFollowEvents = this.handleFollowEvents.bind(this);\n    this.handleLikeEvents = this.handleLikeEvents.bind(this);\n    this.handleUnlikeEvents = this.handleUnlikeEvents.bind(this);\n\n    if (document.readyState != 'complete') {\n      // Adds the widget listeners after the window's `load` event fires.\n      // If loading widgets using the officially recommended snippets, they\n      // will be available at `window.load`. If not users can call the\n      // `addWidgetListeners` method manually.\n      window.addEventListener('load', this.addWidgetListeners);\n    } else {\n      this.addWidgetListeners();\n    }\n  }\n\n\n  /**\n   * Invokes the methods to add Facebook and Twitter widget event listeners.\n   * Ensures the respective global namespaces are present before adding.\n   */\n  addWidgetListeners() {\n    if (window.FB) this.addFacebookEventHandlers();\n    if (window.twttr) this.addTwitterEventHandlers();\n  }\n\n  /**\n   * Adds event handlers for the \"tweet\" and \"follow\" events emitted by the\n   * official tweet and follow buttons. Note: this does not capture tweet or\n   * follow events emitted by other Twitter widgets (tweet, timeline, etc.).\n   */\n  addTwitterEventHandlers() {\n    try {\n      window.twttr.ready(() => {\n        window.twttr.events.bind('tweet', this.handleTweetEvents);\n        window.twttr.events.bind('follow', this.handleFollowEvents);\n      });\n    } catch(err) {\n      // Do nothing.\n    }\n  }\n\n  /**\n   * Removes event handlers for the \"tweet\" and \"follow\" events emitted by the\n   * official tweet and follow buttons.\n   */\n  removeTwitterEventHandlers() {\n    try {\n      window.twttr.ready(() => {\n        window.twttr.events.unbind('tweet', this.handleTweetEvents);\n        window.twttr.events.unbind('follow', this.handleFollowEvents);\n      });\n    } catch(err) {\n      // Do nothing.\n    }\n  }\n\n  /**\n   * Adds event handlers for the \"like\" and \"unlike\" events emitted by the\n   * official Facebook like button.\n   */\n  addFacebookEventHandlers() {\n    try {\n      window.FB.Event.subscribe('edge.create', this.handleLikeEvents);\n      window.FB.Event.subscribe('edge.remove', this.handleUnlikeEvents);\n    } catch(err) {\n      // Do nothing.\n    }\n  }\n\n  /**\n   * Removes event handlers for the \"like\" and \"unlike\" events emitted by the\n   * official Facebook like button.\n   */\n  removeFacebookEventHandlers() {\n    try {\n      window.FB.Event.unsubscribe('edge.create', this.handleLikeEvents);\n      window.FB.Event.unsubscribe('edge.remove', this.handleUnlikeEvents);\n    } catch(err) {\n      // Do nothing.\n    }\n  }\n\n  /**\n   * Handles `tweet` events emitted by the Twitter JS SDK.\n   * @param {TwttrEvent} event The Twitter event object passed to the handler.\n   */\n  handleTweetEvents(event) {\n    // Ignores tweets from widgets that aren't the tweet button.\n    if (event.region != 'tweet') return;\n\n    const url = event.data.url || event.target.getAttribute('data-url') ||\n        location.href;\n\n    /** @type {FieldsObj} */\n    const defaultFields = {\n      transport: 'beacon',\n      socialNetwork: 'Twitter',\n      socialAction: 'tweet',\n      socialTarget: url,\n    };\n    this.tracker.send('social',\n        createFieldsObj(defaultFields, this.opts.fieldsObj,\n            this.tracker, this.opts.hitFilter, event.target, event));\n  }\n\n  /**\n   * Handles `follow` events emitted by the Twitter JS SDK.\n   * @param {TwttrEvent} event The Twitter event object passed to the handler.\n   */\n  handleFollowEvents(event) {\n    // Ignore follows from widgets that aren't the follow button.\n    if (event.region != 'follow') return;\n\n    const screenName = event.data.screen_name ||\n        event.target.getAttribute('data-screen-name');\n\n    /** @type {FieldsObj} */\n    const defaultFields = {\n      transport: 'beacon',\n      socialNetwork: 'Twitter',\n      socialAction: 'follow',\n      socialTarget: screenName,\n    };\n    this.tracker.send('social',\n        createFieldsObj(defaultFields, this.opts.fieldsObj,\n            this.tracker, this.opts.hitFilter, event.target, event));\n  }\n\n  /**\n   * Handles `like` events emitted by the Facebook JS SDK.\n   * @param {string} url The URL corresponding to the like event.\n   */\n  handleLikeEvents(url) {\n    /** @type {FieldsObj} */\n    const defaultFields = {\n      transport: 'beacon',\n      socialNetwork: 'Facebook',\n      socialAction: 'like',\n      socialTarget: url,\n    };\n    this.tracker.send('social', createFieldsObj(defaultFields,\n        this.opts.fieldsObj, this.tracker, this.opts.hitFilter));\n  }\n\n  /**\n   * Handles `unlike` events emitted by the Facebook JS SDK.\n   * @param {string} url The URL corresponding to the unlike event.\n   */\n  handleUnlikeEvents(url) {\n    /** @type {FieldsObj} */\n    const defaultFields = {\n      transport: 'beacon',\n      socialNetwork: 'Facebook',\n      socialAction: 'unlike',\n      socialTarget: url,\n    };\n    this.tracker.send('social', createFieldsObj(defaultFields,\n        this.opts.fieldsObj, this.tracker, this.opts.hitFilter));\n  }\n\n  /**\n   * Removes all event listeners and instance properties.\n   */\n  remove() {\n    window.removeEventListener('load', this.addWidgetListeners);\n    this.removeFacebookEventHandlers();\n    this.removeTwitterEventHandlers();\n  }\n}\n\n\nprovide('socialWidgetTracker', SocialWidgetTracker);\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\nimport MethodChain from '../method-chain';\nimport provide from '../provide';\nimport {plugins, trackUsage} from '../usage';\nimport {assign, createFieldsObj} from '../utilities';\n\n\n/**\n * Class for the `urlChangeTracker` analytics.js plugin.\n * @implements {UrlChangeTrackerPublicInterface}\n */\nclass UrlChangeTracker {\n  /**\n   * Adds handler for the history API methods\n   * @param {!Tracker} tracker Passed internally by analytics.js\n   * @param {?Object} opts Passed by the require command.\n   */\n  constructor(tracker, opts) {\n    trackUsage(tracker, plugins.URL_CHANGE_TRACKER);\n\n    // Feature detects to prevent errors in unsupporting browsers.\n    if (!history.pushState || !window.addEventListener) return;\n\n    /** @type {UrlChangeTrackerOpts} */\n    const defaultOpts = {\n      shouldTrackUrlChange: this.shouldTrackUrlChange,\n      trackReplaceState: false,\n      fieldsObj: {},\n      hitFilter: null,\n    };\n\n    this.opts = /** @type {UrlChangeTrackerOpts} */ (assign(defaultOpts, opts));\n\n    this.tracker = tracker;\n\n    // Sets the initial page field.\n    // Don't set this on the tracker yet so campaign data can be retreived\n    // from the location field.\n    this.path = getPath();\n\n    // Binds methods.\n    this.pushStateOverride = this.pushStateOverride.bind(this);\n    this.replaceStateOverride = this.replaceStateOverride.bind(this);\n    this.handlePopState = this.handlePopState.bind(this);\n\n    // Watches for history changes.\n    MethodChain.add(history, 'pushState', this.pushStateOverride);\n    MethodChain.add(history, 'replaceState', this.replaceStateOverride);\n    window.addEventListener('popstate', this.handlePopState);\n  }\n\n  /**\n   * Handles invocations of the native `history.pushState` and calls\n   * `handleUrlChange()` indicating that the history updated.\n   * @param {!Function} originalMethod A reference to the overridden method.\n   * @return {!Function}\n   */\n  pushStateOverride(originalMethod) {\n    return (...args) => {\n      originalMethod(...args);\n      this.handleUrlChange(true);\n    };\n  }\n\n  /**\n   * Handles invocations of the native `history.replaceState` and calls\n   * `handleUrlChange()` indicating that history was replaced.\n   * @param {!Function} originalMethod A reference to the overridden method.\n   * @return {!Function}\n   */\n  replaceStateOverride(originalMethod) {\n    return (...args) => {\n      originalMethod(...args);\n      this.handleUrlChange(false);\n    };\n  }\n\n  /**\n   * Handles responding to the popstate event and calls\n   * `handleUrlChange()` indicating that history was updated.\n   */\n  handlePopState() {\n    this.handleUrlChange(true);\n  }\n\n  /**\n   * Updates the page and title fields on the tracker and sends a pageview\n   * if a new history entry was created.\n   * @param {boolean} historyDidUpdate True if the history was changed via\n   *     `pushState()` or the `popstate` event. False if the history was just\n   *     modified via `replaceState()`.\n   */\n  handleUrlChange(historyDidUpdate) {\n    // Calls the update logic asychronously to help ensure that app logic\n    // responding to the URL change happens prior to this.\n    setTimeout(() => {\n      const oldPath = this.path;\n      const newPath = getPath();\n\n      if (oldPath != newPath &&\n          this.opts.shouldTrackUrlChange.call(this, newPath, oldPath)) {\n        this.path = newPath;\n        this.tracker.set({\n          page: newPath,\n          title: document.title,\n        });\n\n        if (historyDidUpdate || this.opts.trackReplaceState) {\n          /** @type {FieldsObj} */\n          const defaultFields = {transport: 'beacon'};\n          this.tracker.send('pageview', createFieldsObj(defaultFields,\n              this.opts.fieldsObj, this.tracker, this.opts.hitFilter));\n        }\n      }\n    }, 0);\n  }\n\n  /**\n   * Determines whether or not the tracker should send a hit with the new page\n   * data. This default implementation can be overrided in the config options.\n   * @param {string} newPath The path after the URL change.\n   * @param {string} oldPath The path prior to the URL change.\n   * @return {boolean} Whether or not the URL change should be tracked.\n   */\n  shouldTrackUrlChange(newPath, oldPath) {\n    return !!(newPath && oldPath);\n  }\n\n  /**\n   * Removes all event listeners and restores overridden methods.\n   */\n  remove() {\n    MethodChain.remove(history, 'pushState', this.pushStateOverride);\n    MethodChain.remove(history, 'replaceState', this.replaceStateOverride);\n    window.removeEventListener('popstate', this.handlePopState);\n  }\n}\n\n\nprovide('urlChangeTracker', UrlChangeTracker);\n\n\n/**\n * @return {string} The path value of the current URL.\n */\nfunction getPath() {\n  return location.pathname + location.search;\n}\n"]}