{"version":3,"sources":["../webpack/bootstrap","../../../../node_modules/mixpanel-browser/dist/mixpanel.cjs.js","mixpanel-in-app-messaging.ts","index.ts","../../../../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/classCallCheck.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","window$1","Config","DEBUG","LIB_VERSION","window","loc","hostname","navigator","userAgent","document","location","referrer","screen","width","height","ArrayProto","Array","FuncProto","Function","ObjProto","slice","toString","windowConsole","console","navigator$1","document$1","windowOpera","opera","nativeBind","nativeForEach","forEach","nativeIndexOf","indexOf","nativeMap","map","nativeIsArray","isArray","breaker","_","trim","str","replace","console$1","log","isUndefined","apply","arguments","err","each","arg","error","args","concat","toArray","critical","log_func_with_prefix","func","prefix","console_with_prefix","context","_bound","isFunction","TypeError","this","ctor","self","result","bind_instance_methods","obj","iterator","undefined","length","escapeHTML","escaped","isString","extend","source","prop","f","test","x","isArguments","iterable","values","arr","callback","results","item","push","keys","identity","include","target","found","includes","needle","inherit","subclass","superclass","constructor","isObject","isEmptyObject","isDate","isNumber","isElement","nodeType","encodeDates","v","k","formatDate","timestamp","Date","now","pad","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","safewrap","e","safewrap_class","klass","functions","safewrap_instance_methods","strip_empty_properties","ret","truncate","val","JSONEncode","mixed_val","quote","string","escapable","meta","\b","\t","\n","\f","\r","\"","\\","lastIndex","a","charCodeAt","holder","gap","mind","partial","toJSON","isFinite","String","join","","JSONDecode","at","ch","text","escapee","/","b","SyntaxError","next","charAt","number","hex","uffff","parseInt","fromCharCode","white","array","word","base64Encode","data","h1","h2","h3","h4","bits","b64","ac","enc","tmp_arr","utf8Encode","start","end","stringl","utftext","c1","substring","UUID","T","se","Math","random","ua","buffer","xor","byte_array","j","tmp","unshift","UA","isBlockedUA","HTTPBuildQuery","formdata","arg_separator","use_val","use_key","encodeURIComponent","getQueryParam","url","param","RegExp","exec","decodeURIComponent","getHashParam","hash","matches","match","cookie","nameEQ","ca","split","parse","set_seconds","seconds","is_cross_subdomain","is_secure","is_cross_site","domain_override","cdomain","expires","secure","domain","extract_domain","date","setTime","getTime","toGMTString","set","days","new_cookie_val","remove","_localStorageSupported","localStorageSupported","storage","forceCheck","supported","localStorage","cheap_guid","setItem","getItem","removeItem","is_supported","force_check","msg","register_event","fixEvent","event","preventDefault","stopPropagation","returnValue","cancelBubble","element","type","handler","oldSchool","useCapture","addEventListener","ontype","old_handler","new_handler","old_handlers","old_result","new_result","makeHandler","TOKEN_MATCH_REGEX","dom_query","getAllChildren","all","getElementsByTagName","bad_whitespace","hasClass","elem","selector","className","query","token","tagName","foundCount","elements","currentContextIndex","tokens","currentContext","id","getElementById","nodeName","toLowerCase","token_match","checkFunction","attrName","attrOperator","attrValue","getAttribute","lastIndexOf","info","campaignParams","campaign_keywords","kw","params","kwkey","URL","searchEngine","search","searchInfo","keyword","browser","user_agent","vendor","browserVersion","regex","Internet Explorer Mobile","Microsoft Edge","Chrome","Chrome iOS","UC Browser","Safari","Mobile Safari","Opera","Firefox","Firefox iOS","Konqueror","BlackBerry","Android Mobile","Samsung Internet","Internet Explorer","Mozilla","parseFloat","os","device","referringDomain","properties","$os","$browser","$referrer","$referring_domain","$device","$current_url","href","$browser_version","$screen_height","$screen_width","mp_lib","$lib_version","$insert_id","time","people_properties","pageviewInfo","page","mp_page","mp_referrer","mp_browser","mp_platform","maxlen","guid","determine_eligibility","feature","percent_allowed","SIMPLE_DOMAIN_MATCH_REGEX","DOMAIN_MATCH_REGEX","domain_regex","parts","tld","JSONStringify","JSONParse","getClassName","el","baseVal","isElementNode","isTag","tag","isTextNode","shouldTrackElement","curEl","parentNode","classes","shouldTrackValue","JSON","stringify","autotrack","_initializedTokens","_previousElementSibling","previousElementSibling","previousSibling","_loadScript","scriptUrlToLoad","scriptTag","createElement","src","onload","scripts","insertBefore","body","appendChild","_getPropertiesFromElement","props","tag_name","attributes","attr","nthChild","nthOfType","currentElem","_getDefaultProperties","eventType","$event_type","$ce_version","$host","host","$pathname","pathname","_extractCustomPropertyValue","customProperty","propValues","querySelectorAll","matchedElem","_getCustomProperties","targetElementList","_customProperties","eventSelector","eventElements","eventElement","_getEventTarget","srcElement","_trackEvent","instance","shouldTrackDomEvent","elementText","elementsJson","explicitNoTrack","shouldTrackEl","safeElementText","elText","childNodes","child","textContent","filter","getSafeText","$elements","$el_attr__href","$el_text","track","_navigate","_addDomEventHandlers","init","get_config","_maybeLoadEditor","parseDecideResponse","response","$title","title","_send_request","verbose","version","lib","method","transport","_prepare_callback","that","setTimeout","_editorParamsFromHash","editorParams","state","expiresInSeconds","accessToken","accessTokenExpiresAt","Number","bookmarkletMode","projectId","projectOwnerId","projectToken","readOnly","userFlags","userId","sessionStorage","history","replaceState","parseFromUrl","parseFromStorage","_loadEditor","editorUrl","enabledForProject","numBuckets","numEnabledBuckets","charCodeSum","isBrowserSupported","DomTracker","create_properties","event_handler","after_track_handler","mixpanel_instance","mp","event_name","user_callback","override_event","options","timeout","track_callback","timeout_occured","callback_fired","LinkTracker","evt","new_tab","which","metaKey","ctrlKey","FormTracker","submit","logger$2","SharedLock","storageKey","pollIntervalMS","timeoutMS","withLock","lockedCB","errorCB","pid","startTime","keyX","keyY","keyZ","reportError","delay","cb","loop","waitFor","predicate","getSetY","valY","Error","criticalSection","logger$1","RequestQueue","lock","memQueue","enqueue","flushInterval","queueEntry","flushAfter","payload","succeeded","storedQueue","readFromStorage","saveToStorage","fillBatch","batchSize","batch","idsInBatch","filterOutIDsAndInvalid","items","idSet","filteredItems","removeItemsByID","ids","storageEntry","queue","clear","logger","RequestBatcher","endpoint","libConfig","sendRequest","sendRequestFunc","stopped","flush","stop","timeoutID","clearTimeout","resetBatchSize","resetFlush","scheduleFlush","flushMS","requestInProgress","currentBatchSize","dataForRequest","batchSendCallback","res","removeItemsFromQueue","xhr_req","retryMS","headers","retryAfter","min","halvedBatchSize","max","floor","requestOptions","ignore_json_errors","timeout_ms","sendBeacon","GDPR_DEFAULT_PERSISTENCE_PREFIX","optIn","_optInOut","optOut","hasOptedIn","_getStorageValue","hasOptedOut","ignoreDnt","win","nav","hasDntOn","dntValue","_hasDoNotTrackFlagOn","addOptOutCheckMixpanelLib","_addOptOutCheck","addOptOutCheckMixpanelPeople","_get_config","addOptOutCheckMixpanelGroup","clearOptInOut","_getStorage","_getStorageKey","crossSubdomainCookie","cookieDomain","persistenceType","persistencePrefix","optValue","cookieExpiration","secureCookie","crossSiteCookie","trackEventName","trackProperties","send_immediately","getConfigValue","optedOut","apiActions","set_action","to","$set","_is_reserved_property","unset_action","$unset","set_once_action","$set_once","union_action","list_name","$union","append_action","$append","remove_action","$remove","delete_action","$delete","MixpanelGroup","_init","group_key","group_id","_mixpanel","_group_key","_group_id","set_once","unset","union","date_encoded_data","_track_or_batch","truncated_data","batcher","request_batchers","groups","conf","RESERVED_PROPERTIES","MixpanelPersistence","config","campaign_params_saved","storage_type","load","update_config","upgrade","save","disabled","entry","old_cookie_name","old_cookie","upgrade_from_old_lib","register_once","_expire_notification_campaigns","expire_days","cross_subdomain","cross_site","cookie_domain","default_value","default_expiry","register","unregister","campaigns_shown","EXPIRY_TIME","campaign_id","update_campaign_params","update_search_keyword","update_referrer_info","$initial_referrer","$initial_referring_domain","get_referrer_info","safe_merge","set_disabled","set_cookie_domain","set_cross_site","set_cross_subdomain","set_secure","get_cross_subdomain","_add_to_people_queue","q_key","_get_queue_key","q_data","set_q","_get_or_create_queue","set_once_q","unset_q","add_q","union_q","remove_q","append_q","_pop_from_people_queue","enqueued_obj","append_obj","q","_get_queue","queued_action","default_val","set_event_timer","timers","remove_event_timer","OPERATOR_KEY","PROPERTY_KEY","WINDOW_KEY","UNIT_KEY","VALUE_KEY","HOUR_KEY","DAY_KEY","WEEK_KEY","MONTH_KEY","EVENT_PROPERTY","LITERAL_PROPERTY","AND_OPERATOR","OR_OPERATOR","IN_OPERATOR","NOT_IN_OPERATOR","PLUS_OPERATOR","MINUS_OPERATOR","MUL_OPERATOR","DIV_OPERATOR","MOD_OPERATOR","EQUALS_OPERATOR","NOT_EQUALS_OPERATOR","GREATER_OPERATOR","LESS_OPERATOR","GREATER_EQUAL_OPERATOR","LESS_EQUAL_OPERATOR","BOOLEAN_OPERATOR","DATETIME_OPERATOR","LIST_OPERATOR","NUMBER_OPERATOR","STRING_OPERATOR","NOT_OPERATOR","DEFINED_OPERATOR","NOT_DEFINED_OPERATOR","NOW_LITERAL","toNumber","isNaN","toBoolean","evaluateEquality","op","_isArrayEqual","_isEqual","evaluateSelector","evaluateOperator","evaluateAnd","evaluateOr","leftValue","rightValue","evaluateIn","evaluatePlus","evaluateArithmetic","compare","localeCompare","evaluateComparison","evaluateBoolean","evaluateDateTime","evaluateList","evaluateNumber","evaluateString","evaluateDefined","evaluateNot","evaluateOperand","out","evaluateWindow","filters","MixpanelNotification","notif_data","mixpanel","persistence","resource_protocol","cdn_host","message_id","cta","notif_type","style","video_width","VIDEO_WIDTH","video_height","VIDEO_HEIGHT","display_triggers","dest_url","image_url","thumb_image_url","video_url","clickthrough","mini","notif_width","NOTIF_WIDTH_MINI","NOTIF_WIDTH","_set_client_config","imgs_to_preload","_init_image_html","_init_video","ANIM_TIME","MARKUP_PREFIX","BG_OPACITY","NOTIF_TOP","NOTIF_START_TOP","NOTIF_HEIGHT_MINI","THUMB_BORDER_SIZE","THUMB_IMG_SIZE","THUMB_OFFSET","round","show","body_el","_init_styles","_init_notification_el","_preload_images","_attach_and_animate","dismiss","marked_as_shown","_mark_delivery","invisible","notif_attr","notif_start","notif_goal","exiting_el","showing_video","_get_el","_get_notification_display_el","use_transitions","_remove_class","_add_class","_remove_notification_el","_animate_els","goal","class_name","anims","mss","done_cb","start_time","ai","anim","time_diff","in_progress","cur_time","anim_diff","anim_dir","suffix","shown","_get_shown_campaigns","notification_el","notif_el","_mark_as_shown","click_el","show_video","_track_event","$resource_type","_switch_to_video","tracking_cb","open","_matches_event_data","event_data","display_trigger","_browser_lte","browser_versions","img_html","thumb_img_html","notification_html","video_src","video_html","cancel_html","close_html","play_html","youtube_video","yt_custom","vimeo_video","video_iframe","flip_animate","main_html","innerHTML","style_vals","bg","bg_actions","bg_hover","bg_light","border_gray","cancel_opacity","mini_hover","text_title","text_main","text_tagline","text_hover","shadow","video_shadow","mini_shadow","thumb_total_size","anim_seconds","notif_media_queries","#overlay","display","notif_styles",".flipped","transform","position","top","left","overflow","text-align","z-index","font-family","-webkit-font-smoothing","-moz-osx-font-smoothing","#overlay.mini","#overlay a","padding","text-decoration","text-transform","color","#bgwrapper","#bg","min-width","doc_width","min-height","doc_height","background-color","opacity","-ms-filter","transition","#bg.visible",".mini #bg","#flipcontainer","perspective","#flipper","transform-style","#takeover","margin-left","backface-visibility","#takeover.visible","#takeover.exiting","#thumbspacer","#thumbborder-wrapper","#thumbborder","border-radius","#thumbnail","#mini","right","margin-top","#mini.visible","#mini.exiting","#mainbox","box-shadow","font-size","#mini #mainbox","#mini-border","#mini-icon","background","#mini:hover #mini-icon","#mini:hover #mainbox","#mini-icon-img","background-image","#content","#mini-content","cursor","#img","#title","max-height","word-wrap","font-weight","#body","margin-bottom","line-height","#mini #body","max-width","margin","letter-spacing","#mini #body-text","#mini #body-text div","vertical-align","#tagline","#tagline a","#tagline a:hover","#cancel","box-sizing","#mini #cancel","#cancel-icon","#cancel:hover","#button","#button-close","margin-right","background-repeat","background-position","#button-play","a#button-link","#button:hover","#button:hover a","#video-noflip","#video-flip","#video","#video.exiting","#video-holder","#video-frame","#video-controls","#video:hover #video-controls","#video .video-progress-el","bottom","#video-progress","#video-progress-total","#video-elapsed","#video #video-time","* html #overlay","* html #bg","html, body","zoom","border","#mini #mini-icon","VENDOR_STYLES","VENDOR_PREFIXES","si","pi","styles","media_queries","create_style_text","style_defs","st","style_text","mq_defs","mqt","mq","create_media_query_text","head_el","head","documentElement","style_el","setAttribute","styleSheet","cssText","inject_styles","youtube_match","vimeo_match","_yt_video_ready","firstScriptTag","get_style","style_name","defaultView","getComputedStyle","currentStyle","extra_props","$campaigns","$notifications","all_loaded_cb","preloaded_imgs","img_objs","img","Image","complete","imgs_loaded","clearInterval","_video_progress_checker","visibility","removeChild","get_browser_version","browser_ex","ActiveXObject","scrollWidth","offsetWidth","clientWidth","scrollHeight","offsetHeight","clientHeight","ie_ver","sample_styles","is_css_compatible","rule","toUpperCase","overlay","video_ready","message_type","message_subtype","video_inited","progress_bar","progress_time","progress_el","events","onReady","ytplayer","video_duration","update_video_time","current_time","secs","mins","hours","setInterval","clickx","pageX","getBoundingClientRect","init_type","mixpanel_master","MixpanelPeople","increment","by","$add","append","track_charge","amount","$amount","clear_charges","delete_user","_identify_called","get_distinct_id","device_id","get_property","user_id","had_persisted_distinct_id","people","_enqueue","status","conf_var","_flags","identify_called","_flush_one_queue","action","action_method","queue_to_params_fn","_this","queued_data","action_params","_flush","_set_callback","_add_callback","_append_callback","_set_once_callback","_union_callback","_unset_callback","_remove_callback","$append_queue","$remove_queue","$append_item","append_callback","pop","$remove_item","remove_callback","INIT_MODULE","USE_XHR","XMLHttpRequest","ENQUEUE_REQUESTS","DEFAULT_CONFIG","api_host","api_method","api_transport","app_host","cdn","cross_site_cookie","cross_subdomain_cookie","persistence_name","cookie_name","loaded","store_google","save_referrer","debug","track_links_timeout","cookie_expiration","disable_persistence","disable_cookie","secure_cookie","ip","opt_out_tracking_by_default","opt_out_persistence_by_default","opt_out_tracking_persistence_type","opt_out_tracking_cookie_prefix","property_blacklist","xhr_headers","inapp_protocol","inapp_link_new_window","ignore_dnt","batch_requests","batch_size","batch_flush_interval_ms","batch_request_timeout_ms","DOM_LOADED","MixpanelLib","create_mplib","_cached_groups","_user_decide_check_complete","_events_tracked_before_user_decide_check_complete","_execute_array","encode_data_for_request","json_data","_loaded","variable_features","set_config","callback_fn","PRIMARY_INSTANCE_NAME","__dom_loaded_queue","__request_queue","__disabled_events","disable_all_events","_batch_requests","start_batch_requests","_gdpr_init","uuid","distinct_id","$device_id","_set_default_superprops","_dom_loaded","_track_dom","has_opted_out_tracking","DomClass","dt","jsc","randomized_cb","callback_string","DEFAULT_OPTIONS","body_data","use_post","use_sendBeacon","verbose_mode","req","headerValue","headerName","setRequestHeader","withCredentials","onreadystatechange","readyState","responseText","statusText","send","script","async","defer","fn_name","alias_calls","other_calls","tracking_calls","execute","calls","caller","batcher_config","stop_batch_requests","disable","should_send_immediately","send_request_options","request_enqueued_or_initiated","send_request_immediately","_event_is_disabled","start_timestamp","duration_in_ms","toFixed","blacklisted_prop","_check_and_handle_triggered_notifications","set_group","group_ids","add_group","old_values","remove_group","old_value","idx","splice","track_with_groups","tracking_props","_create_map_key","_remove_group_from_cache","get_group","map_key","group","track_pageview","track_links","track_forms","time_event","_register_single","identify","new_distinct_id","previous_distinct_id","$user_id","$had_persisted_distinct_id","_check_and_handle_notifications","$anon_distinct_id","reset","alias","original","name_tag","prop_name","property_name","_show_notification","notifications","notif","_handle_user_decide_check_complete","shift","has_opted_in_tracking","persistence_type","opt_in_tracking","enable_persistence","opt_out_tracking","clear_persistence","clear_opt_in_out_tracking","_gdpr_update_persistence","_gdpr_call_func","cookie_prefix","instances","override_mp_init_func","add_dom_loaded_handler","dom_loaded_handler","done","inst","attachEvent","toplevel","frameElement","doScroll","do_scroll_check","MixpanelInAppMessaging","Constructor","_classCallCheck","origin","messageSource","checkForMessages","records","addedMixpanelNotificationWrapper","removedMixpanelNotificationWrapper","record","addedNodes","node","HTMLElement","removedNodes","sendMessage","handleMessage","messageEvent","subject","identifyUser","process","MutationObserver","observe","querySelector","childList","postMessage"],"mappings":"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","file":"static/js/main.c33eab51.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/lpassets/mixpanel/prod/v6/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n","'use strict';\n\nvar Config = {\n DEBUG: false,\n LIB_VERSION: '2.38.0'\n}; // since es6 imports are static and we run unit tests from the console, window won't be defined when importing this file\n\nvar window$1;\n\nif (typeof window === 'undefined') {\n var loc = {\n hostname: ''\n };\n window$1 = {\n navigator: {\n userAgent: ''\n },\n document: {\n location: loc,\n referrer: ''\n },\n screen: {\n width: 0,\n height: 0\n },\n location: loc\n };\n} else {\n window$1 = window;\n}\n/*\n * Saved references to long variable names, so that closure compiler can\n * minimize file size.\n */\n\n\nvar ArrayProto = Array.prototype;\nvar FuncProto = Function.prototype;\nvar ObjProto = Object.prototype;\nvar slice = ArrayProto.slice;\nvar toString = ObjProto.toString;\nvar hasOwnProperty = ObjProto.hasOwnProperty;\nvar windowConsole = window$1.console;\nvar navigator$1 = window$1.navigator;\nvar document$1 = window$1.document;\nvar windowOpera = window$1.opera;\nvar screen = window$1.screen;\nvar userAgent = navigator$1.userAgent;\nvar nativeBind = FuncProto.bind;\nvar nativeForEach = ArrayProto.forEach;\nvar nativeIndexOf = ArrayProto.indexOf;\nvar nativeMap = ArrayProto.map;\nvar nativeIsArray = Array.isArray;\nvar breaker = {};\nvar _ = {\n trim: function trim(str) {\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim#Polyfill\n return str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n }\n}; // Console override\n\nvar console$1 = {\n /** @type {function(...*)} */\n log: function log() {\n if (Config.DEBUG && !_.isUndefined(windowConsole) && windowConsole) {\n try {\n windowConsole.log.apply(windowConsole, arguments);\n } catch (err) {\n _.each(arguments, function (arg) {\n windowConsole.log(arg);\n });\n }\n }\n },\n\n /** @type {function(...*)} */\n error: function error() {\n if (Config.DEBUG && !_.isUndefined(windowConsole) && windowConsole) {\n var args = ['Mixpanel error:'].concat(_.toArray(arguments));\n\n try {\n windowConsole.error.apply(windowConsole, args);\n } catch (err) {\n _.each(args, function (arg) {\n windowConsole.error(arg);\n });\n }\n }\n },\n\n /** @type {function(...*)} */\n critical: function critical() {\n if (!_.isUndefined(windowConsole) && windowConsole) {\n var args = ['Mixpanel error:'].concat(_.toArray(arguments));\n\n try {\n windowConsole.error.apply(windowConsole, args);\n } catch (err) {\n _.each(args, function (arg) {\n windowConsole.error(arg);\n });\n }\n }\n }\n};\n\nvar log_func_with_prefix = function log_func_with_prefix(func, prefix) {\n return function () {\n arguments[0] = '[' + prefix + '] ' + arguments[0];\n return func.apply(console$1, arguments);\n };\n};\n\nvar console_with_prefix = function console_with_prefix(prefix) {\n return {\n log: log_func_with_prefix(console$1.log, prefix),\n error: log_func_with_prefix(console$1.error, prefix),\n critical: log_func_with_prefix(console$1.critical, prefix)\n };\n}; // UNDERSCORE\n// Embed part of the Underscore Library\n\n\n_.bind = function (func, context) {\n var args, _bound;\n\n if (nativeBind && func.bind === nativeBind) {\n return nativeBind.apply(func, slice.call(arguments, 1));\n }\n\n if (!_.isFunction(func)) {\n throw new TypeError();\n }\n\n args = slice.call(arguments, 2);\n\n _bound = function bound() {\n if (!(this instanceof _bound)) {\n return func.apply(context, args.concat(slice.call(arguments)));\n }\n\n var ctor = {};\n ctor.prototype = func.prototype;\n var self = new ctor();\n ctor.prototype = null;\n var result = func.apply(self, args.concat(slice.call(arguments)));\n\n if (Object(result) === result) {\n return result;\n }\n\n return self;\n };\n\n return _bound;\n};\n\n_.bind_instance_methods = function (obj) {\n for (var func in obj) {\n if (typeof obj[func] === 'function') {\n obj[func] = _.bind(obj[func], obj);\n }\n }\n};\n/**\n * @param {*=} obj\n * @param {function(...*)=} iterator\n * @param {Object=} context\n */\n\n\n_.each = function (obj, iterator, context) {\n if (obj === null || obj === undefined) {\n return;\n }\n\n if (nativeForEach && obj.forEach === nativeForEach) {\n obj.forEach(iterator, context);\n } else if (obj.length === +obj.length) {\n for (var i = 0, l = obj.length; i < l; i++) {\n if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) {\n return;\n }\n }\n } else {\n for (var key in obj) {\n if (hasOwnProperty.call(obj, key)) {\n if (iterator.call(context, obj[key], key, obj) === breaker) {\n return;\n }\n }\n }\n }\n};\n\n_.escapeHTML = function (s) {\n var escaped = s;\n\n if (escaped && _.isString(escaped)) {\n escaped = escaped.replace(/&/g, '&').replace(//g, '>').replace(/\"/g, '"').replace(/'/g, ''');\n }\n\n return escaped;\n};\n\n_.extend = function (obj) {\n _.each(slice.call(arguments, 1), function (source) {\n for (var prop in source) {\n if (source[prop] !== void 0) {\n obj[prop] = source[prop];\n }\n }\n });\n\n return obj;\n};\n\n_.isArray = nativeIsArray || function (obj) {\n return toString.call(obj) === '[object Array]';\n}; // from a comment on http://dbj.org/dbj/?p=286\n// fails on only one very rare and deliberate custom object:\n// var bomb = { toString : undefined, valueOf: function(o) { return \"function BOMBA!\"; }};\n\n\n_.isFunction = function (f) {\n try {\n return /^\\s*\\bfunction\\b/.test(f);\n } catch (x) {\n return false;\n }\n};\n\n_.isArguments = function (obj) {\n return !!(obj && hasOwnProperty.call(obj, 'callee'));\n};\n\n_.toArray = function (iterable) {\n if (!iterable) {\n return [];\n }\n\n if (iterable.toArray) {\n return iterable.toArray();\n }\n\n if (_.isArray(iterable)) {\n return slice.call(iterable);\n }\n\n if (_.isArguments(iterable)) {\n return slice.call(iterable);\n }\n\n return _.values(iterable);\n};\n\n_.map = function (arr, callback) {\n if (nativeMap && arr.map === nativeMap) {\n return arr.map(callback);\n } else {\n var results = [];\n\n _.each(arr, function (item) {\n results.push(callback(item));\n });\n\n return results;\n }\n};\n\n_.keys = function (obj) {\n var results = [];\n\n if (obj === null) {\n return results;\n }\n\n _.each(obj, function (value, key) {\n results[results.length] = key;\n });\n\n return results;\n};\n\n_.values = function (obj) {\n var results = [];\n\n if (obj === null) {\n return results;\n }\n\n _.each(obj, function (value) {\n results[results.length] = value;\n });\n\n return results;\n};\n\n_.identity = function (value) {\n return value;\n};\n\n_.include = function (obj, target) {\n var found = false;\n\n if (obj === null) {\n return found;\n }\n\n if (nativeIndexOf && obj.indexOf === nativeIndexOf) {\n return obj.indexOf(target) != -1;\n }\n\n _.each(obj, function (value) {\n if (found || (found = value === target)) {\n return breaker;\n }\n });\n\n return found;\n};\n\n_.includes = function (str, needle) {\n return str.indexOf(needle) !== -1;\n}; // Underscore Addons\n\n\n_.inherit = function (subclass, superclass) {\n subclass.prototype = new superclass();\n subclass.prototype.constructor = subclass;\n subclass.superclass = superclass.prototype;\n return subclass;\n};\n\n_.isObject = function (obj) {\n return obj === Object(obj) && !_.isArray(obj);\n};\n\n_.isEmptyObject = function (obj) {\n if (_.isObject(obj)) {\n for (var key in obj) {\n if (hasOwnProperty.call(obj, key)) {\n return false;\n }\n }\n\n return true;\n }\n\n return false;\n};\n\n_.isUndefined = function (obj) {\n return obj === void 0;\n};\n\n_.isString = function (obj) {\n return toString.call(obj) == '[object String]';\n};\n\n_.isDate = function (obj) {\n return toString.call(obj) == '[object Date]';\n};\n\n_.isNumber = function (obj) {\n return toString.call(obj) == '[object Number]';\n};\n\n_.isElement = function (obj) {\n return !!(obj && obj.nodeType === 1);\n};\n\n_.encodeDates = function (obj) {\n _.each(obj, function (v, k) {\n if (_.isDate(v)) {\n obj[k] = _.formatDate(v);\n } else if (_.isObject(v)) {\n obj[k] = _.encodeDates(v); // recurse\n }\n });\n\n return obj;\n};\n\n_.timestamp = function () {\n Date.now = Date.now || function () {\n return +new Date();\n };\n\n return Date.now();\n};\n\n_.formatDate = function (d) {\n // YYYY-MM-DDTHH:MM:SS in UTC\n function pad(n) {\n return n < 10 ? '0' + n : n;\n }\n\n return d.getUTCFullYear() + '-' + pad(d.getUTCMonth() + 1) + '-' + pad(d.getUTCDate()) + 'T' + pad(d.getUTCHours()) + ':' + pad(d.getUTCMinutes()) + ':' + pad(d.getUTCSeconds());\n};\n\n_.safewrap = function (f) {\n return function () {\n try {\n return f.apply(this, arguments);\n } catch (e) {\n console$1.critical('Implementation error. Please turn on debug and contact support@mixpanel.com.');\n\n if (Config.DEBUG) {\n console$1.critical(e);\n }\n }\n };\n};\n\n_.safewrap_class = function (klass, functions) {\n for (var i = 0; i < functions.length; i++) {\n klass.prototype[functions[i]] = _.safewrap(klass.prototype[functions[i]]);\n }\n};\n\n_.safewrap_instance_methods = function (obj) {\n for (var func in obj) {\n if (typeof obj[func] === 'function') {\n obj[func] = _.safewrap(obj[func]);\n }\n }\n};\n\n_.strip_empty_properties = function (p) {\n var ret = {};\n\n _.each(p, function (v, k) {\n if (_.isString(v) && v.length > 0) {\n ret[k] = v;\n }\n });\n\n return ret;\n};\n/*\n * this function returns a copy of object after truncating it. If\n * passed an Array or Object it will iterate through obj and\n * truncate all the values recursively.\n */\n\n\n_.truncate = function (obj, length) {\n var ret;\n\n if (typeof obj === 'string') {\n ret = obj.slice(0, length);\n } else if (_.isArray(obj)) {\n ret = [];\n\n _.each(obj, function (val) {\n ret.push(_.truncate(val, length));\n });\n } else if (_.isObject(obj)) {\n ret = {};\n\n _.each(obj, function (val, key) {\n ret[key] = _.truncate(val, length);\n });\n } else {\n ret = obj;\n }\n\n return ret;\n};\n\n_.JSONEncode = function () {\n return function (mixed_val) {\n var value = mixed_val;\n\n var quote = function quote(string) {\n var escapable = /[\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g; // eslint-disable-line no-control-regex\n\n var meta = {\n // table of character substitutions\n '\\b': '\\\\b',\n '\\t': '\\\\t',\n '\\n': '\\\\n',\n '\\f': '\\\\f',\n '\\r': '\\\\r',\n '\"': '\\\\\"',\n '\\\\': '\\\\\\\\'\n };\n escapable.lastIndex = 0;\n return escapable.test(string) ? '\"' + string.replace(escapable, function (a) {\n var c = meta[a];\n return typeof c === 'string' ? c : \"\\\\u\" + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n }) + '\"' : '\"' + string + '\"';\n };\n\n var str = function str(key, holder) {\n var gap = '';\n var indent = ' ';\n var i = 0; // The loop counter.\n\n var k = ''; // The member key.\n\n var v = ''; // The member value.\n\n var length = 0;\n var mind = gap;\n var partial = [];\n var value = holder[key]; // If the value has a toJSON method, call it to obtain a replacement value.\n\n if (value && typeof value === 'object' && typeof value.toJSON === 'function') {\n value = value.toJSON(key);\n } // What happens next depends on the value's type.\n\n\n switch (typeof value) {\n case 'string':\n return quote(value);\n\n case 'number':\n // JSON numbers must be finite. Encode non-finite numbers as null.\n return isFinite(value) ? String(value) : 'null';\n\n case 'boolean':\n case 'null':\n // If the value is a boolean or null, convert it to a string. Note:\n // typeof null does not produce 'null'. The case is included here in\n // the remote chance that this gets fixed someday.\n return String(value);\n\n case 'object':\n // If the type is 'object', we might be dealing with an object or an array or\n // null.\n // Due to a specification blunder in ECMAScript, typeof null is 'object',\n // so watch out for that case.\n if (!value) {\n return 'null';\n } // Make an array to hold the partial results of stringifying this object value.\n\n\n gap += indent;\n partial = []; // Is the value an array?\n\n if (toString.apply(value) === '[object Array]') {\n // The value is an array. Stringify every element. Use null as a placeholder\n // for non-JSON values.\n length = value.length;\n\n for (i = 0; i < length; i += 1) {\n partial[i] = str(i, value) || 'null';\n } // Join all of the elements together, separated with commas, and wrap them in\n // brackets.\n\n\n v = partial.length === 0 ? '[]' : gap ? '[\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + ']' : '[' + partial.join(',') + ']';\n gap = mind;\n return v;\n } // Iterate through all of the keys in the object.\n\n\n for (k in value) {\n if (hasOwnProperty.call(value, k)) {\n v = str(k, value);\n\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n } // Join all of the member texts together, separated with commas,\n // and wrap them in braces.\n\n\n v = partial.length === 0 ? '{}' : gap ? '{' + partial.join(',') + '' + mind + '}' : '{' + partial.join(',') + '}';\n gap = mind;\n return v;\n }\n }; // Make a fake root object containing our value under the key of ''.\n // Return the result of stringifying the value.\n\n\n return str('', {\n '': value\n });\n };\n}();\n/**\n * From https://github.com/douglascrockford/JSON-js/blob/master/json_parse.js\n * Slightly modified to throw a real Error rather than a POJO\n */\n\n\n_.JSONDecode = function () {\n var at,\n // The index of the current character\n ch,\n // The current character\n escapee = {\n '\"': '\"',\n '\\\\': '\\\\',\n '/': '/',\n 'b': '\\b',\n 'f': '\\f',\n 'n': '\\n',\n 'r': '\\r',\n 't': '\\t'\n },\n text,\n error = function error(m) {\n var e = new SyntaxError(m);\n e.at = at;\n e.text = text;\n throw e;\n },\n next = function next(c) {\n // If a c parameter is provided, verify that it matches the current character.\n if (c && c !== ch) {\n error('Expected \\'' + c + '\\' instead of \\'' + ch + '\\'');\n } // Get the next character. When there are no more characters,\n // return the empty string.\n\n\n ch = text.charAt(at);\n at += 1;\n return ch;\n },\n number = function number() {\n // Parse a number value.\n var number,\n string = '';\n\n if (ch === '-') {\n string = '-';\n next('-');\n }\n\n while (ch >= '0' && ch <= '9') {\n string += ch;\n next();\n }\n\n if (ch === '.') {\n string += '.';\n\n while (next() && ch >= '0' && ch <= '9') {\n string += ch;\n }\n }\n\n if (ch === 'e' || ch === 'E') {\n string += ch;\n next();\n\n if (ch === '-' || ch === '+') {\n string += ch;\n next();\n }\n\n while (ch >= '0' && ch <= '9') {\n string += ch;\n next();\n }\n }\n\n number = +string;\n\n if (!isFinite(number)) {\n error('Bad number');\n } else {\n return number;\n }\n },\n string = function string() {\n // Parse a string value.\n var hex,\n i,\n string = '',\n uffff; // When parsing for string values, we must look for \" and \\ characters.\n\n if (ch === '\"') {\n while (next()) {\n if (ch === '\"') {\n next();\n return string;\n }\n\n if (ch === '\\\\') {\n next();\n\n if (ch === 'u') {\n uffff = 0;\n\n for (i = 0; i < 4; i += 1) {\n hex = parseInt(next(), 16);\n\n if (!isFinite(hex)) {\n break;\n }\n\n uffff = uffff * 16 + hex;\n }\n\n string += String.fromCharCode(uffff);\n } else if (typeof escapee[ch] === 'string') {\n string += escapee[ch];\n } else {\n break;\n }\n } else {\n string += ch;\n }\n }\n }\n\n error('Bad string');\n },\n white = function white() {\n // Skip whitespace.\n while (ch && ch <= ' ') {\n next();\n }\n },\n word = function word() {\n // true, false, or null.\n switch (ch) {\n case 't':\n next('t');\n next('r');\n next('u');\n next('e');\n return true;\n\n case 'f':\n next('f');\n next('a');\n next('l');\n next('s');\n next('e');\n return false;\n\n case 'n':\n next('n');\n next('u');\n next('l');\n next('l');\n return null;\n }\n\n error('Unexpected \"' + ch + '\"');\n },\n value,\n // Placeholder for the value function.\n array = function array() {\n // Parse an array value.\n var array = [];\n\n if (ch === '[') {\n next('[');\n white();\n\n if (ch === ']') {\n next(']');\n return array; // empty array\n }\n\n while (ch) {\n array.push(value());\n white();\n\n if (ch === ']') {\n next(']');\n return array;\n }\n\n next(',');\n white();\n }\n }\n\n error('Bad array');\n },\n object = function object() {\n // Parse an object value.\n var key,\n object = {};\n\n if (ch === '{') {\n next('{');\n white();\n\n if (ch === '}') {\n next('}');\n return object; // empty object\n }\n\n while (ch) {\n key = string();\n white();\n next(':');\n\n if (Object.hasOwnProperty.call(object, key)) {\n error('Duplicate key \"' + key + '\"');\n }\n\n object[key] = value();\n white();\n\n if (ch === '}') {\n next('}');\n return object;\n }\n\n next(',');\n white();\n }\n }\n\n error('Bad object');\n };\n\n value = function value() {\n // Parse a JSON value. It could be an object, an array, a string,\n // a number, or a word.\n white();\n\n switch (ch) {\n case '{':\n return object();\n\n case '[':\n return array();\n\n case '\"':\n return string();\n\n case '-':\n return number();\n\n default:\n return ch >= '0' && ch <= '9' ? number() : word();\n }\n }; // Return the json_parse function. It will have access to all of the\n // above functions and variables.\n\n\n return function (source) {\n var result;\n text = source;\n at = 0;\n ch = ' ';\n result = value();\n white();\n\n if (ch) {\n error('Syntax error');\n }\n\n return result;\n };\n}();\n\n_.base64Encode = function (data) {\n var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n var o1,\n o2,\n o3,\n h1,\n h2,\n h3,\n h4,\n bits,\n i = 0,\n ac = 0,\n enc = '',\n tmp_arr = [];\n\n if (!data) {\n return data;\n }\n\n data = _.utf8Encode(data);\n\n do {\n // pack three octets into four hexets\n o1 = data.charCodeAt(i++);\n o2 = data.charCodeAt(i++);\n o3 = data.charCodeAt(i++);\n bits = o1 << 16 | o2 << 8 | o3;\n h1 = bits >> 18 & 0x3f;\n h2 = bits >> 12 & 0x3f;\n h3 = bits >> 6 & 0x3f;\n h4 = bits & 0x3f; // use hexets to index into b64, and append result to encoded string\n\n tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);\n } while (i < data.length);\n\n enc = tmp_arr.join('');\n\n switch (data.length % 3) {\n case 1:\n enc = enc.slice(0, -2) + '==';\n break;\n\n case 2:\n enc = enc.slice(0, -1) + '=';\n break;\n }\n\n return enc;\n};\n\n_.utf8Encode = function (string) {\n string = (string + '').replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n var utftext = '',\n start,\n end;\n var stringl = 0,\n n;\n start = end = 0;\n stringl = string.length;\n\n for (n = 0; n < stringl; n++) {\n var c1 = string.charCodeAt(n);\n var enc = null;\n\n if (c1 < 128) {\n end++;\n } else if (c1 > 127 && c1 < 2048) {\n enc = String.fromCharCode(c1 >> 6 | 192, c1 & 63 | 128);\n } else {\n enc = String.fromCharCode(c1 >> 12 | 224, c1 >> 6 & 63 | 128, c1 & 63 | 128);\n }\n\n if (enc !== null) {\n if (end > start) {\n utftext += string.substring(start, end);\n }\n\n utftext += enc;\n start = end = n + 1;\n }\n }\n\n if (end > start) {\n utftext += string.substring(start, string.length);\n }\n\n return utftext;\n};\n\n_.UUID = function () {\n // Time/ticks information\n // 1*new Date() is a cross browser version of Date.now()\n var T = function T() {\n var d = 1 * new Date(),\n i = 0; // this while loop figures how many browser ticks go by\n // before 1*new Date() returns a new number, ie the amount\n // of ticks that go by per millisecond\n\n while (d == 1 * new Date()) {\n i++;\n }\n\n return d.toString(16) + i.toString(16);\n }; // Math.Random entropy\n\n\n var R = function R() {\n return Math.random().toString(16).replace('.', '');\n }; // User agent entropy\n // This function takes the user agent string, and then xors\n // together each sequence of 8 bytes. This produces a final\n // sequence of 8 bytes which it returns as hex.\n\n\n var UA = function UA() {\n var ua = userAgent,\n i,\n ch,\n buffer = [],\n ret = 0;\n\n function xor(result, byte_array) {\n var j,\n tmp = 0;\n\n for (j = 0; j < byte_array.length; j++) {\n tmp |= buffer[j] << j * 8;\n }\n\n return result ^ tmp;\n }\n\n for (i = 0; i < ua.length; i++) {\n ch = ua.charCodeAt(i);\n buffer.unshift(ch & 0xFF);\n\n if (buffer.length >= 4) {\n ret = xor(ret, buffer);\n buffer = [];\n }\n }\n\n if (buffer.length > 0) {\n ret = xor(ret, buffer);\n }\n\n return ret.toString(16);\n };\n\n return function () {\n var se = (screen.height * screen.width).toString(16);\n return T() + '-' + R() + '-' + UA() + '-' + se + '-' + T();\n };\n}(); // _.isBlockedUA()\n// This is to block various web spiders from executing our JS and\n// sending false tracking data\n\n\n_.isBlockedUA = function (ua) {\n if (/(google web preview|baiduspider|yandexbot|bingbot|googlebot|yahoo! slurp)/i.test(ua)) {\n return true;\n }\n\n return false;\n};\n/**\n * @param {Object=} formdata\n * @param {string=} arg_separator\n */\n\n\n_.HTTPBuildQuery = function (formdata, arg_separator) {\n var use_val,\n use_key,\n tmp_arr = [];\n\n if (_.isUndefined(arg_separator)) {\n arg_separator = '&';\n }\n\n _.each(formdata, function (val, key) {\n use_val = encodeURIComponent(val.toString());\n use_key = encodeURIComponent(key);\n tmp_arr[tmp_arr.length] = use_key + '=' + use_val;\n });\n\n return tmp_arr.join(arg_separator);\n};\n\n_.getQueryParam = function (url, param) {\n // Expects a raw URL\n param = param.replace(/[[]/, '\\\\[').replace(/[\\]]/, '\\\\]');\n var regexS = '[\\\\?&]' + param + '=([^&#]*)',\n regex = new RegExp(regexS),\n results = regex.exec(url);\n\n if (results === null || results && typeof results[1] !== 'string' && results[1].length) {\n return '';\n } else {\n var result = results[1];\n\n try {\n result = decodeURIComponent(result);\n } catch (err) {\n console$1.error('Skipping decoding for malformed query param: ' + result);\n }\n\n return result.replace(/\\+/g, ' ');\n }\n};\n\n_.getHashParam = function (hash, param) {\n var matches = hash.match(new RegExp(param + '=([^&]*)'));\n return matches ? matches[1] : null;\n}; // _.cookie\n// Methods partially borrowed from quirksmode.org/js/cookies.html\n\n\n_.cookie = {\n get: function get(name) {\n var nameEQ = name + '=';\n var ca = document$1.cookie.split(';');\n\n for (var i = 0; i < ca.length; i++) {\n var c = ca[i];\n\n while (c.charAt(0) == ' ') {\n c = c.substring(1, c.length);\n }\n\n if (c.indexOf(nameEQ) === 0) {\n return decodeURIComponent(c.substring(nameEQ.length, c.length));\n }\n }\n\n return null;\n },\n parse: function parse(name) {\n var cookie;\n\n try {\n cookie = _.JSONDecode(_.cookie.get(name)) || {};\n } catch (err) {// noop\n }\n\n return cookie;\n },\n set_seconds: function set_seconds(name, value, seconds, is_cross_subdomain, is_secure, is_cross_site, domain_override) {\n var cdomain = '',\n expires = '',\n secure = '';\n\n if (domain_override) {\n cdomain = '; domain=' + domain_override;\n } else if (is_cross_subdomain) {\n var domain = extract_domain(document$1.location.hostname);\n cdomain = domain ? '; domain=.' + domain : '';\n }\n\n if (seconds) {\n var date = new Date();\n date.setTime(date.getTime() + seconds * 1000);\n expires = '; expires=' + date.toGMTString();\n }\n\n if (is_cross_site) {\n is_secure = true;\n secure = '; SameSite=None';\n }\n\n if (is_secure) {\n secure += '; secure';\n }\n\n document$1.cookie = name + '=' + encodeURIComponent(value) + expires + '; path=/' + cdomain + secure;\n },\n set: function set(name, value, days, is_cross_subdomain, is_secure, is_cross_site, domain_override) {\n var cdomain = '',\n expires = '',\n secure = '';\n\n if (domain_override) {\n cdomain = '; domain=' + domain_override;\n } else if (is_cross_subdomain) {\n var domain = extract_domain(document$1.location.hostname);\n cdomain = domain ? '; domain=.' + domain : '';\n }\n\n if (days) {\n var date = new Date();\n date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);\n expires = '; expires=' + date.toGMTString();\n }\n\n if (is_cross_site) {\n is_secure = true;\n secure = '; SameSite=None';\n }\n\n if (is_secure) {\n secure += '; secure';\n }\n\n var new_cookie_val = name + '=' + encodeURIComponent(value) + expires + '; path=/' + cdomain + secure;\n document$1.cookie = new_cookie_val;\n return new_cookie_val;\n },\n remove: function remove(name, is_cross_subdomain, domain_override) {\n _.cookie.set(name, '', -1, is_cross_subdomain, false, false, domain_override);\n }\n};\nvar _localStorageSupported = null;\n\nvar localStorageSupported = function localStorageSupported(storage, forceCheck) {\n if (_localStorageSupported !== null && !forceCheck) {\n return _localStorageSupported;\n }\n\n var supported = true;\n\n try {\n storage = storage || window.localStorage;\n var key = '__mplss_' + cheap_guid(8),\n val = 'xyz';\n storage.setItem(key, val);\n\n if (storage.getItem(key) !== val) {\n supported = false;\n }\n\n storage.removeItem(key);\n } catch (err) {\n supported = false;\n }\n\n _localStorageSupported = supported;\n return supported;\n}; // _.localStorage\n\n\n_.localStorage = {\n is_supported: function is_supported(force_check) {\n var supported = localStorageSupported(null, force_check);\n\n if (!supported) {\n console$1.error('localStorage unsupported; falling back to cookie store');\n }\n\n return supported;\n },\n error: function error(msg) {\n console$1.error('localStorage error: ' + msg);\n },\n get: function get(name) {\n try {\n return window.localStorage.getItem(name);\n } catch (err) {\n _.localStorage.error(err);\n }\n\n return null;\n },\n parse: function parse(name) {\n try {\n return _.JSONDecode(_.localStorage.get(name)) || {};\n } catch (err) {// noop\n }\n\n return null;\n },\n set: function set(name, value) {\n try {\n window.localStorage.setItem(name, value);\n } catch (err) {\n _.localStorage.error(err);\n }\n },\n remove: function remove(name) {\n try {\n window.localStorage.removeItem(name);\n } catch (err) {\n _.localStorage.error(err);\n }\n }\n};\n\n_.register_event = function () {\n // written by Dean Edwards, 2005\n // with input from Tino Zijdel - crisp@xs4all.nl\n // with input from Carl Sverre - mail@carlsverre.com\n // with input from Mixpanel\n // http://dean.edwards.name/weblog/2005/10/add-event/\n // https://gist.github.com/1930440\n\n /**\n * @param {Object} element\n * @param {string} type\n * @param {function(...*)} handler\n * @param {boolean=} oldSchool\n * @param {boolean=} useCapture\n */\n var register_event = function register_event(element, type, handler, oldSchool, useCapture) {\n if (!element) {\n console$1.error('No valid element provided to register_event');\n return;\n }\n\n if (element.addEventListener && !oldSchool) {\n element.addEventListener(type, handler, !!useCapture);\n } else {\n var ontype = 'on' + type;\n var old_handler = element[ontype]; // can be undefined\n\n element[ontype] = makeHandler(element, handler, old_handler);\n }\n };\n\n function makeHandler(element, new_handler, old_handlers) {\n var handler = function handler(event) {\n event = event || fixEvent(window.event); // this basically happens in firefox whenever another script\n // overwrites the onload callback and doesn't pass the event\n // object to previously defined callbacks. All the browsers\n // that don't define window.event implement addEventListener\n // so the dom_loaded handler will still be fired as usual.\n\n if (!event) {\n return undefined;\n }\n\n var ret = true;\n var old_result, new_result;\n\n if (_.isFunction(old_handlers)) {\n old_result = old_handlers(event);\n }\n\n new_result = new_handler.call(element, event);\n\n if (false === old_result || false === new_result) {\n ret = false;\n }\n\n return ret;\n };\n\n return handler;\n }\n\n function fixEvent(event) {\n if (event) {\n event.preventDefault = fixEvent.preventDefault;\n event.stopPropagation = fixEvent.stopPropagation;\n }\n\n return event;\n }\n\n fixEvent.preventDefault = function () {\n this.returnValue = false;\n };\n\n fixEvent.stopPropagation = function () {\n this.cancelBubble = true;\n };\n\n return register_event;\n}();\n\nvar TOKEN_MATCH_REGEX = new RegExp('^(\\\\w*)\\\\[(\\\\w+)([=~\\\\|\\\\^\\\\$\\\\*]?)=?\"?([^\\\\]\"]*)\"?\\\\]$');\n\n_.dom_query = function () {\n /* document.getElementsBySelector(selector)\n - returns an array of element objects from the current document\n matching the CSS selector. Selectors can contain element names,\n class names and ids and can be nested. For example:\n elements = document.getElementsBySelector('div#main p a.external')\n Will return an array of all 'a' elements with 'external' in their\n class attribute that are contained inside 'p' elements that are\n contained inside the 'div' element which has id=\"main\"\n New in version 0.4: Support for CSS2 and CSS3 attribute selectors:\n See http://www.w3.org/TR/css3-selectors/#attribute-selectors\n Version 0.4 - Simon Willison, March 25th 2003\n -- Works in Phoenix 0.5, Mozilla 1.3, Opera 7, Internet Explorer 6, Internet Explorer 5 on Windows\n -- Opera 7 fails\n Version 0.5 - Carl Sverre, Jan 7th 2013\n -- Now uses jQuery-esque `hasClass` for testing class name\n equality. This fixes a bug related to '-' characters being\n considered not part of a 'word' in regex.\n */\n function getAllChildren(e) {\n // Returns all children of element. Workaround required for IE5/Windows. Ugh.\n return e.all ? e.all : e.getElementsByTagName('*');\n }\n\n var bad_whitespace = /[\\t\\r\\n]/g;\n\n function hasClass(elem, selector) {\n var className = ' ' + selector + ' ';\n return (' ' + elem.className + ' ').replace(bad_whitespace, ' ').indexOf(className) >= 0;\n }\n\n function getElementsBySelector(selector) {\n // Attempt to fail gracefully in lesser browsers\n if (!document$1.getElementsByTagName) {\n return [];\n } // Split selector in to tokens\n\n\n var tokens = selector.split(' ');\n var token, bits, tagName, found, foundCount, i, j, k, elements, currentContextIndex;\n var currentContext = [document$1];\n\n for (i = 0; i < tokens.length; i++) {\n token = tokens[i].replace(/^\\s+/, '').replace(/\\s+$/, '');\n\n if (token.indexOf('#') > -1) {\n // Token is an ID selector\n bits = token.split('#');\n tagName = bits[0];\n var id = bits[1];\n var element = document$1.getElementById(id);\n\n if (!element || tagName && element.nodeName.toLowerCase() != tagName) {\n // element not found or tag with that ID not found, return false\n return [];\n } // Set currentContext to contain just this element\n\n\n currentContext = [element];\n continue; // Skip to next token\n }\n\n if (token.indexOf('.') > -1) {\n // Token contains a class selector\n bits = token.split('.');\n tagName = bits[0];\n var className = bits[1];\n\n if (!tagName) {\n tagName = '*';\n } // Get elements matching tag, filter them for class selector\n\n\n found = [];\n foundCount = 0;\n\n for (j = 0; j < currentContext.length; j++) {\n if (tagName == '*') {\n elements = getAllChildren(currentContext[j]);\n } else {\n elements = currentContext[j].getElementsByTagName(tagName);\n }\n\n for (k = 0; k < elements.length; k++) {\n found[foundCount++] = elements[k];\n }\n }\n\n currentContext = [];\n currentContextIndex = 0;\n\n for (j = 0; j < found.length; j++) {\n if (found[j].className && _.isString(found[j].className) && // some SVG elements have classNames which are not strings\n hasClass(found[j], className)) {\n currentContext[currentContextIndex++] = found[j];\n }\n }\n\n continue; // Skip to next token\n } // Code to deal with attribute selectors\n\n\n var token_match = token.match(TOKEN_MATCH_REGEX);\n\n if (token_match) {\n tagName = token_match[1];\n var attrName = token_match[2];\n var attrOperator = token_match[3];\n var attrValue = token_match[4];\n\n if (!tagName) {\n tagName = '*';\n } // Grab all of the tagName elements within current context\n\n\n found = [];\n foundCount = 0;\n\n for (j = 0; j < currentContext.length; j++) {\n if (tagName == '*') {\n elements = getAllChildren(currentContext[j]);\n } else {\n elements = currentContext[j].getElementsByTagName(tagName);\n }\n\n for (k = 0; k < elements.length; k++) {\n found[foundCount++] = elements[k];\n }\n }\n\n currentContext = [];\n currentContextIndex = 0;\n var checkFunction; // This function will be used to filter the elements\n\n switch (attrOperator) {\n case '=':\n // Equality\n checkFunction = function checkFunction(e) {\n return e.getAttribute(attrName) == attrValue;\n };\n\n break;\n\n case '~':\n // Match one of space seperated words\n checkFunction = function checkFunction(e) {\n return e.getAttribute(attrName).match(new RegExp('\\\\b' + attrValue + '\\\\b'));\n };\n\n break;\n\n case '|':\n // Match start with value followed by optional hyphen\n checkFunction = function checkFunction(e) {\n return e.getAttribute(attrName).match(new RegExp('^' + attrValue + '-?'));\n };\n\n break;\n\n case '^':\n // Match starts with value\n checkFunction = function checkFunction(e) {\n return e.getAttribute(attrName).indexOf(attrValue) === 0;\n };\n\n break;\n\n case '$':\n // Match ends with value - fails with \"Warning\" in Opera 7\n checkFunction = function checkFunction(e) {\n return e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length;\n };\n\n break;\n\n case '*':\n // Match ends with value\n checkFunction = function checkFunction(e) {\n return e.getAttribute(attrName).indexOf(attrValue) > -1;\n };\n\n break;\n\n default:\n // Just test for existence of attribute\n checkFunction = function checkFunction(e) {\n return e.getAttribute(attrName);\n };\n\n }\n\n currentContext = [];\n currentContextIndex = 0;\n\n for (j = 0; j < found.length; j++) {\n if (checkFunction(found[j])) {\n currentContext[currentContextIndex++] = found[j];\n }\n } // alert('Attribute Selector: '+tagName+' '+attrName+' '+attrOperator+' '+attrValue);\n\n\n continue; // Skip to next token\n } // If we get here, token is JUST an element (not a class or ID selector)\n\n\n tagName = token;\n found = [];\n foundCount = 0;\n\n for (j = 0; j < currentContext.length; j++) {\n elements = currentContext[j].getElementsByTagName(tagName);\n\n for (k = 0; k < elements.length; k++) {\n found[foundCount++] = elements[k];\n }\n }\n\n currentContext = found;\n }\n\n return currentContext;\n }\n\n return function (query) {\n if (_.isElement(query)) {\n return [query];\n } else if (_.isObject(query) && !_.isUndefined(query.length)) {\n return query;\n } else {\n return getElementsBySelector.call(this, query);\n }\n };\n}();\n\n_.info = {\n campaignParams: function campaignParams() {\n var campaign_keywords = 'utm_source utm_medium utm_campaign utm_content utm_term'.split(' '),\n kw = '',\n params = {};\n\n _.each(campaign_keywords, function (kwkey) {\n kw = _.getQueryParam(document$1.URL, kwkey);\n\n if (kw.length) {\n params[kwkey] = kw;\n }\n });\n\n return params;\n },\n searchEngine: function searchEngine(referrer) {\n if (referrer.search('https?://(.*)google.([^/?]*)') === 0) {\n return 'google';\n } else if (referrer.search('https?://(.*)bing.com') === 0) {\n return 'bing';\n } else if (referrer.search('https?://(.*)yahoo.com') === 0) {\n return 'yahoo';\n } else if (referrer.search('https?://(.*)duckduckgo.com') === 0) {\n return 'duckduckgo';\n } else {\n return null;\n }\n },\n searchInfo: function searchInfo(referrer) {\n var search = _.info.searchEngine(referrer),\n param = search != 'yahoo' ? 'q' : 'p',\n ret = {};\n\n if (search !== null) {\n ret['$search_engine'] = search;\n\n var keyword = _.getQueryParam(referrer, param);\n\n if (keyword.length) {\n ret['mp_keyword'] = keyword;\n }\n }\n\n return ret;\n },\n\n /**\n * This function detects which browser is running this script.\n * The order of the checks are important since many user agents\n * include key words used in later checks.\n */\n browser: function browser(user_agent, vendor, opera) {\n vendor = vendor || ''; // vendor is undefined for at least IE9\n\n if (opera || _.includes(user_agent, ' OPR/')) {\n if (_.includes(user_agent, 'Mini')) {\n return 'Opera Mini';\n }\n\n return 'Opera';\n } else if (/(BlackBerry|PlayBook|BB10)/i.test(user_agent)) {\n return 'BlackBerry';\n } else if (_.includes(user_agent, 'IEMobile') || _.includes(user_agent, 'WPDesktop')) {\n return 'Internet Explorer Mobile';\n } else if (_.includes(user_agent, 'SamsungBrowser/')) {\n // https://developer.samsung.com/internet/user-agent-string-format\n return 'Samsung Internet';\n } else if (_.includes(user_agent, 'Edge') || _.includes(user_agent, 'Edg/')) {\n return 'Microsoft Edge';\n } else if (_.includes(user_agent, 'FBIOS')) {\n return 'Facebook Mobile';\n } else if (_.includes(user_agent, 'Chrome')) {\n return 'Chrome';\n } else if (_.includes(user_agent, 'CriOS')) {\n return 'Chrome iOS';\n } else if (_.includes(user_agent, 'UCWEB') || _.includes(user_agent, 'UCBrowser')) {\n return 'UC Browser';\n } else if (_.includes(user_agent, 'FxiOS')) {\n return 'Firefox iOS';\n } else if (_.includes(vendor, 'Apple')) {\n if (_.includes(user_agent, 'Mobile')) {\n return 'Mobile Safari';\n }\n\n return 'Safari';\n } else if (_.includes(user_agent, 'Android')) {\n return 'Android Mobile';\n } else if (_.includes(user_agent, 'Konqueror')) {\n return 'Konqueror';\n } else if (_.includes(user_agent, 'Firefox')) {\n return 'Firefox';\n } else if (_.includes(user_agent, 'MSIE') || _.includes(user_agent, 'Trident/')) {\n return 'Internet Explorer';\n } else if (_.includes(user_agent, 'Gecko')) {\n return 'Mozilla';\n } else {\n return '';\n }\n },\n\n /**\n * This function detects which browser version is running this script,\n * parsing major and minor version (e.g., 42.1). User agent strings from:\n * http://www.useragentstring.com/pages/useragentstring.php\n */\n browserVersion: function browserVersion(userAgent, vendor, opera) {\n var browser = _.info.browser(userAgent, vendor, opera);\n\n var versionRegexs = {\n 'Internet Explorer Mobile': /rv:(\\d+(\\.\\d+)?)/,\n 'Microsoft Edge': /Edge?\\/(\\d+(\\.\\d+)?)/,\n 'Chrome': /Chrome\\/(\\d+(\\.\\d+)?)/,\n 'Chrome iOS': /CriOS\\/(\\d+(\\.\\d+)?)/,\n 'UC Browser': /(UCBrowser|UCWEB)\\/(\\d+(\\.\\d+)?)/,\n 'Safari': /Version\\/(\\d+(\\.\\d+)?)/,\n 'Mobile Safari': /Version\\/(\\d+(\\.\\d+)?)/,\n 'Opera': /(Opera|OPR)\\/(\\d+(\\.\\d+)?)/,\n 'Firefox': /Firefox\\/(\\d+(\\.\\d+)?)/,\n 'Firefox iOS': /FxiOS\\/(\\d+(\\.\\d+)?)/,\n 'Konqueror': /Konqueror:(\\d+(\\.\\d+)?)/,\n 'BlackBerry': /BlackBerry (\\d+(\\.\\d+)?)/,\n 'Android Mobile': /android\\s(\\d+(\\.\\d+)?)/,\n 'Samsung Internet': /SamsungBrowser\\/(\\d+(\\.\\d+)?)/,\n 'Internet Explorer': /(rv:|MSIE )(\\d+(\\.\\d+)?)/,\n 'Mozilla': /rv:(\\d+(\\.\\d+)?)/\n };\n var regex = versionRegexs[browser];\n\n if (regex === undefined) {\n return null;\n }\n\n var matches = userAgent.match(regex);\n\n if (!matches) {\n return null;\n }\n\n return parseFloat(matches[matches.length - 2]);\n },\n os: function os() {\n var a = userAgent;\n\n if (/Windows/i.test(a)) {\n if (/Phone/.test(a) || /WPDesktop/.test(a)) {\n return 'Windows Phone';\n }\n\n return 'Windows';\n } else if (/(iPhone|iPad|iPod)/.test(a)) {\n return 'iOS';\n } else if (/Android/.test(a)) {\n return 'Android';\n } else if (/(BlackBerry|PlayBook|BB10)/i.test(a)) {\n return 'BlackBerry';\n } else if (/Mac/i.test(a)) {\n return 'Mac OS X';\n } else if (/Linux/.test(a)) {\n return 'Linux';\n } else if (/CrOS/.test(a)) {\n return 'Chrome OS';\n } else {\n return '';\n }\n },\n device: function device(user_agent) {\n if (/Windows Phone/i.test(user_agent) || /WPDesktop/.test(user_agent)) {\n return 'Windows Phone';\n } else if (/iPad/.test(user_agent)) {\n return 'iPad';\n } else if (/iPod/.test(user_agent)) {\n return 'iPod Touch';\n } else if (/iPhone/.test(user_agent)) {\n return 'iPhone';\n } else if (/(BlackBerry|PlayBook|BB10)/i.test(user_agent)) {\n return 'BlackBerry';\n } else if (/Android/.test(user_agent)) {\n return 'Android';\n } else {\n return '';\n }\n },\n referringDomain: function referringDomain(referrer) {\n var split = referrer.split('/');\n\n if (split.length >= 3) {\n return split[2];\n }\n\n return '';\n },\n properties: function properties() {\n return _.extend(_.strip_empty_properties({\n '$os': _.info.os(),\n '$browser': _.info.browser(userAgent, navigator$1.vendor, windowOpera),\n '$referrer': document$1.referrer,\n '$referring_domain': _.info.referringDomain(document$1.referrer),\n '$device': _.info.device(userAgent)\n }), {\n '$current_url': window$1.location.href,\n '$browser_version': _.info.browserVersion(userAgent, navigator$1.vendor, windowOpera),\n '$screen_height': screen.height,\n '$screen_width': screen.width,\n 'mp_lib': 'web',\n '$lib_version': Config.LIB_VERSION,\n '$insert_id': cheap_guid(),\n 'time': _.timestamp() / 1000 // epoch time in seconds\n\n });\n },\n people_properties: function people_properties() {\n return _.extend(_.strip_empty_properties({\n '$os': _.info.os(),\n '$browser': _.info.browser(userAgent, navigator$1.vendor, windowOpera)\n }), {\n '$browser_version': _.info.browserVersion(userAgent, navigator$1.vendor, windowOpera)\n });\n },\n pageviewInfo: function pageviewInfo(page) {\n return _.strip_empty_properties({\n 'mp_page': page,\n 'mp_referrer': document$1.referrer,\n 'mp_browser': _.info.browser(userAgent, navigator$1.vendor, windowOpera),\n 'mp_platform': _.info.os()\n });\n }\n};\n\nvar cheap_guid = function cheap_guid(maxlen) {\n var guid = Math.random().toString(36).substring(2, 10) + Math.random().toString(36).substring(2, 10);\n return maxlen ? guid.substring(0, maxlen) : guid;\n};\n/**\n * Check deterministically whether to include or exclude from a feature rollout/test based on the\n * given string and the desired percentage to include.\n * @param {String} str - string to run the check against (for instance a project's token)\n * @param {String} feature - name of feature (for inclusion in hash, to ensure different results\n * for different features)\n * @param {Number} percent_allowed - percentage chance that a given string will be included\n * @returns {Boolean} whether the given string should be included\n */\n\n\nvar determine_eligibility = _.safewrap(function (str, feature, percent_allowed) {\n str = str + feature; // Bernstein's hash: http://www.cse.yorku.ca/~oz/hash.html#djb2\n\n var hash = 5381;\n\n for (var i = 0; i < str.length; i++) {\n hash = (hash << 5) + hash + str.charCodeAt(i);\n hash = hash & hash;\n }\n\n var dart = (hash >>> 0) % 100;\n return dart < percent_allowed;\n}); // naive way to extract domain name (example.com) from full hostname (my.sub.example.com)\n\n\nvar SIMPLE_DOMAIN_MATCH_REGEX = /[a-z0-9][a-z0-9-]*\\.[a-z]+$/i; // this next one attempts to account for some ccSLDs, e.g. extracting oxford.ac.uk from www.oxford.ac.uk\n\nvar DOMAIN_MATCH_REGEX = /[a-z0-9][a-z0-9-]+\\.[a-z.]{2,6}$/i;\n/**\n * Attempts to extract main domain name from full hostname, using a few blunt heuristics. For\n * common TLDs like .com/.org that always have a simple SLD.TLD structure (example.com), we\n * simply extract the last two .-separated parts of the hostname (SIMPLE_DOMAIN_MATCH_REGEX).\n * For others, we attempt to account for short ccSLD+TLD combos (.ac.uk) with the legacy\n * DOMAIN_MATCH_REGEX (kept to maintain backwards compatibility with existing Mixpanel\n * integrations). The only _reliable_ way to extract domain from hostname is with an up-to-date\n * list like at https://publicsuffix.org/ so for cases that this helper fails at, the SDK\n * offers the 'cookie_domain' config option to set it explicitly.\n * @example\n * extract_domain('my.sub.example.com')\n * // 'example.com'\n */\n\nvar extract_domain = function extract_domain(hostname) {\n var domain_regex = DOMAIN_MATCH_REGEX;\n var parts = hostname.split('.');\n var tld = parts[parts.length - 1];\n\n if (tld.length > 4 || tld === 'com' || tld === 'org') {\n domain_regex = SIMPLE_DOMAIN_MATCH_REGEX;\n }\n\n var matches = hostname.match(domain_regex);\n return matches ? matches[0] : '';\n};\n\nvar JSONStringify = null;\nvar JSONParse = null;\n\nif (typeof JSON !== 'undefined') {\n JSONStringify = JSON.stringify;\n JSONParse = JSON.parse;\n}\n\nJSONStringify = JSONStringify || _.JSONEncode;\nJSONParse = JSONParse || _.JSONDecode; // EXPORTS (for closure compiler)\n\n_['toArray'] = _.toArray;\n_['isObject'] = _.isObject;\n_['JSONEncode'] = _.JSONEncode;\n_['JSONDecode'] = _.JSONDecode;\n_['isBlockedUA'] = _.isBlockedUA;\n_['isEmptyObject'] = _.isEmptyObject;\n_['info'] = _.info;\n_['info']['device'] = _.info.device;\n_['info']['browser'] = _.info.browser;\n_['info']['browserVersion'] = _.info.browserVersion;\n_['info']['properties'] = _.info.properties;\n/*\n * Get the className of an element, accounting for edge cases where element.className is an object\n * @param {Element} el - element to get the className of\n * @returns {string} the element's class\n */\n\nfunction getClassName(el) {\n switch (typeof el.className) {\n case 'string':\n return el.className;\n\n case 'object':\n // handle cases where className might be SVGAnimatedString or some other type\n return el.className.baseVal || el.getAttribute('class') || '';\n\n default:\n // future proof\n return '';\n }\n}\n/*\n * Get the direct text content of an element, protecting against sensitive data collection.\n * Concats textContent of each of the element's text node children; this avoids potential\n * collection of sensitive data that could happen if we used element.textContent and the\n * element had sensitive child elements, since element.textContent includes child content.\n * Scrubs values that look like they could be sensitive (i.e. cc or ssn number).\n * @param {Element} el - element to get the text of\n * @returns {string} the element's direct text content\n */\n\n\nfunction getSafeText(el) {\n var elText = '';\n\n if (shouldTrackElement(el) && el.childNodes && el.childNodes.length) {\n _.each(el.childNodes, function (child) {\n if (isTextNode(child) && child.textContent) {\n elText += _.trim(child.textContent) // scrub potentially sensitive values\n .split(/(\\s+)/).filter(shouldTrackValue).join('') // normalize whitespace\n .replace(/[\\r\\n]/g, ' ').replace(/[ ]+/g, ' ') // truncate\n .substring(0, 255);\n }\n });\n }\n\n return _.trim(elText);\n}\n/*\n * Check whether an element has nodeType Node.ELEMENT_NODE\n * @param {Element} el - element to check\n * @returns {boolean} whether el is of the correct nodeType\n */\n\n\nfunction isElementNode(el) {\n return el && el.nodeType === 1; // Node.ELEMENT_NODE - use integer constant for browser portability\n}\n/*\n * Check whether an element is of a given tag type.\n * Due to potential reference discrepancies (such as the webcomponents.js polyfill),\n * we want to match tagNames instead of specific references because something like\n * element === document.body won't always work because element might not be a native\n * element.\n * @param {Element} el - element to check\n * @param {string} tag - tag name (e.g., \"div\")\n * @returns {boolean} whether el is of the given tag type\n */\n\n\nfunction isTag(el, tag) {\n return el && el.tagName && el.tagName.toLowerCase() === tag.toLowerCase();\n}\n/*\n * Check whether an element has nodeType Node.TEXT_NODE\n * @param {Element} el - element to check\n * @returns {boolean} whether el is of the correct nodeType\n */\n\n\nfunction isTextNode(el) {\n return el && el.nodeType === 3; // Node.TEXT_NODE - use integer constant for browser portability\n}\n/*\n * Check whether a DOM event should be \"tracked\" or if it may contain sentitive data\n * using a variety of heuristics.\n * @param {Element} el - element to check\n * @param {Event} event - event to check\n * @returns {boolean} whether the event should be tracked\n */\n\n\nfunction shouldTrackDomEvent(el, event) {\n if (!el || isTag(el, 'html') || !isElementNode(el)) {\n return false;\n }\n\n var tag = el.tagName.toLowerCase();\n\n switch (tag) {\n case 'html':\n return false;\n\n case 'form':\n return event.type === 'submit';\n\n case 'input':\n if (['button', 'submit'].indexOf(el.getAttribute('type')) === -1) {\n return event.type === 'change';\n } else {\n return event.type === 'click';\n }\n\n case 'select':\n case 'textarea':\n return event.type === 'change';\n\n default:\n return event.type === 'click';\n }\n}\n/*\n * Check whether a DOM element should be \"tracked\" or if it may contain sentitive data\n * using a variety of heuristics.\n * @param {Element} el - element to check\n * @returns {boolean} whether the element should be tracked\n */\n\n\nfunction shouldTrackElement(el) {\n for (var curEl = el; curEl.parentNode && !isTag(curEl, 'body'); curEl = curEl.parentNode) {\n var classes = getClassName(curEl).split(' ');\n\n if (_.includes(classes, 'mp-sensitive') || _.includes(classes, 'mp-no-track')) {\n return false;\n }\n }\n\n if (_.includes(getClassName(el).split(' '), 'mp-include')) {\n return true;\n } // don't send data from inputs or similar elements since there will always be\n // a risk of clientside javascript placing sensitive data in attributes\n\n\n if (isTag(el, 'input') || isTag(el, 'select') || isTag(el, 'textarea') || el.getAttribute('contenteditable') === 'true') {\n return false;\n } // don't include hidden or password fields\n\n\n var type = el.type || '';\n\n if (typeof type === 'string') {\n // it's possible for el.type to be a DOM element if el is a form with a child input[name=\"type\"]\n switch (type.toLowerCase()) {\n case 'hidden':\n return false;\n\n case 'password':\n return false;\n }\n } // filter out data from fields that look like sensitive fields\n\n\n var name = el.name || el.id || '';\n\n if (typeof name === 'string') {\n // it's possible for el.name or el.id to be a DOM element if el is a form with a child input[name=\"name\"]\n var sensitiveNameRegex = /^cc|cardnum|ccnum|creditcard|csc|cvc|cvv|exp|pass|pwd|routing|seccode|securitycode|securitynum|socialsec|socsec|ssn/i;\n\n if (sensitiveNameRegex.test(name.replace(/[^a-zA-Z0-9]/g, ''))) {\n return false;\n }\n }\n\n return true;\n}\n/*\n * Check whether a string value should be \"tracked\" or if it may contain sentitive data\n * using a variety of heuristics.\n * @param {string} value - string value to check\n * @returns {boolean} whether the element should be tracked\n */\n\n\nfunction shouldTrackValue(value) {\n if (value === null || _.isUndefined(value)) {\n return false;\n }\n\n if (typeof value === 'string') {\n value = _.trim(value); // check to see if input value looks like a credit card number\n // see: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9781449327453/ch04s20.html\n\n var ccRegex = /^(?:(4[0-9]{12}(?:[0-9]{3})?)|(5[1-5][0-9]{14})|(6(?:011|5[0-9]{2})[0-9]{12})|(3[47][0-9]{13})|(3(?:0[0-5]|[68][0-9])[0-9]{11})|((?:2131|1800|35[0-9]{3})[0-9]{11}))$/;\n\n if (ccRegex.test((value || '').replace(/[- ]/g, ''))) {\n return false;\n } // check to see if input value looks like a social security number\n\n\n var ssnRegex = /(^\\d{3}-?\\d{2}-?\\d{4}$)/;\n\n if (ssnRegex.test(value)) {\n return false;\n }\n }\n\n return true;\n}\n\nvar autotrack = {\n _initializedTokens: [],\n _previousElementSibling: function _previousElementSibling(el) {\n if (el.previousElementSibling) {\n return el.previousElementSibling;\n } else {\n do {\n el = el.previousSibling;\n } while (el && !isElementNode(el));\n\n return el;\n }\n },\n _loadScript: function _loadScript(scriptUrlToLoad, callback) {\n var scriptTag = document.createElement('script');\n scriptTag.type = 'text/javascript';\n scriptTag.src = scriptUrlToLoad;\n scriptTag.onload = callback;\n var scripts = document.getElementsByTagName('script');\n\n if (scripts.length > 0) {\n scripts[0].parentNode.insertBefore(scriptTag, scripts[0]);\n } else {\n document.body.appendChild(scriptTag);\n }\n },\n _getPropertiesFromElement: function _getPropertiesFromElement(elem) {\n var props = {\n 'classes': getClassName(elem).split(' '),\n 'tag_name': elem.tagName.toLowerCase()\n };\n\n if (shouldTrackElement(elem)) {\n _.each(elem.attributes, function (attr) {\n if (shouldTrackValue(attr.value)) {\n props['attr__' + attr.name] = attr.value;\n }\n });\n }\n\n var nthChild = 1;\n var nthOfType = 1;\n var currentElem = elem;\n\n while (currentElem = this._previousElementSibling(currentElem)) {\n // eslint-disable-line no-cond-assign\n nthChild++;\n\n if (currentElem.tagName === elem.tagName) {\n nthOfType++;\n }\n }\n\n props['nth_child'] = nthChild;\n props['nth_of_type'] = nthOfType;\n return props;\n },\n _getDefaultProperties: function _getDefaultProperties(eventType) {\n return {\n '$event_type': eventType,\n '$ce_version': 1,\n '$host': window.location.host,\n '$pathname': window.location.pathname\n };\n },\n _extractCustomPropertyValue: function _extractCustomPropertyValue(customProperty) {\n var propValues = [];\n\n _.each(document.querySelectorAll(customProperty['css_selector']), function (matchedElem) {\n var value;\n\n if (['input', 'select'].indexOf(matchedElem.tagName.toLowerCase()) > -1) {\n value = matchedElem['value'];\n } else if (matchedElem['textContent']) {\n value = matchedElem['textContent'];\n }\n\n if (shouldTrackValue(value)) {\n propValues.push(value);\n }\n });\n\n return propValues.join(', ');\n },\n _getCustomProperties: function _getCustomProperties(targetElementList) {\n var props = {};\n\n _.each(this._customProperties, function (customProperty) {\n _.each(customProperty['event_selectors'], function (eventSelector) {\n var eventElements = document.querySelectorAll(eventSelector);\n\n _.each(eventElements, function (eventElement) {\n if (_.includes(targetElementList, eventElement) && shouldTrackElement(eventElement)) {\n props[customProperty['name']] = this._extractCustomPropertyValue(customProperty);\n }\n }, this);\n }, this);\n }, this);\n\n return props;\n },\n _getEventTarget: function _getEventTarget(e) {\n // https://developer.mozilla.org/en-US/docs/Web/API/Event/target#Compatibility_notes\n if (typeof e.target === 'undefined') {\n return e.srcElement;\n } else {\n return e.target;\n }\n },\n _trackEvent: function _trackEvent(e, instance) {\n /*** Don't mess with this code without running IE8 tests on it ***/\n var target = this._getEventTarget(e);\n\n if (isTextNode(target)) {\n // defeat Safari bug (see: http://www.quirksmode.org/js/events_properties.html)\n target = target.parentNode;\n }\n\n if (shouldTrackDomEvent(target, e)) {\n var targetElementList = [target];\n var curEl = target;\n\n while (curEl.parentNode && !isTag(curEl, 'body')) {\n targetElementList.push(curEl.parentNode);\n curEl = curEl.parentNode;\n }\n\n var elementsJson = [];\n var href,\n explicitNoTrack = false;\n\n _.each(targetElementList, function (el) {\n var shouldTrackEl = shouldTrackElement(el); // if the element or a parent element is an anchor tag\n // include the href as a property\n\n if (el.tagName.toLowerCase() === 'a') {\n href = el.getAttribute('href');\n href = shouldTrackEl && shouldTrackValue(href) && href;\n } // allow users to programatically prevent tracking of elements by adding class 'mp-no-track'\n\n\n var classes = getClassName(el).split(' ');\n\n if (_.includes(classes, 'mp-no-track')) {\n explicitNoTrack = true;\n }\n\n elementsJson.push(this._getPropertiesFromElement(el));\n }, this);\n\n if (explicitNoTrack) {\n return false;\n } // only populate text content from target element (not parents)\n // to prevent text within a sensitive element from being collected\n // as part of a parent's el.textContent\n\n\n var elementText;\n var safeElementText = getSafeText(target);\n\n if (safeElementText && safeElementText.length) {\n elementText = safeElementText;\n }\n\n var props = _.extend(this._getDefaultProperties(e.type), {\n '$elements': elementsJson,\n '$el_attr__href': href,\n '$el_text': elementText\n }, this._getCustomProperties(targetElementList));\n\n instance.track('$web_event', props);\n return true;\n }\n },\n // only reason is to stub for unit tests\n // since you can't override window.location props\n _navigate: function _navigate(href) {\n window.location.href = href;\n },\n _addDomEventHandlers: function _addDomEventHandlers(instance) {\n var handler = _.bind(function (e) {\n e = e || window.event;\n\n this._trackEvent(e, instance);\n }, this);\n\n _.register_event(document, 'submit', handler, false, true);\n\n _.register_event(document, 'change', handler, false, true);\n\n _.register_event(document, 'click', handler, false, true);\n },\n _customProperties: {},\n init: function init(instance) {\n if (!(document && document.body)) {\n console.log('document not ready yet, trying again in 500 milliseconds...');\n var that = this;\n setTimeout(function () {\n that.init(instance);\n }, 500);\n return;\n }\n\n var token = instance.get_config('token');\n\n if (this._initializedTokens.indexOf(token) > -1) {\n console.log('autotrack already initialized for token \"' + token + '\"');\n return;\n }\n\n this._initializedTokens.push(token);\n\n if (!this._maybeLoadEditor(instance)) {\n // don't autotrack actions when the editor is enabled\n var parseDecideResponse = _.bind(function (response) {\n if (response && response['config'] && response['config']['enable_collect_everything'] === true) {\n if (response['custom_properties']) {\n this._customProperties = response['custom_properties'];\n }\n\n instance.track('$web_event', _.extend({\n '$title': document.title\n }, this._getDefaultProperties('pageview')));\n\n this._addDomEventHandlers(instance);\n } else {\n instance['__autotrack_enabled'] = false;\n }\n }, this);\n\n instance._send_request(instance.get_config('api_host') + '/decide/', {\n 'verbose': true,\n 'version': '1',\n 'lib': 'web',\n 'token': token\n }, {\n method: 'GET',\n transport: 'XHR'\n }, instance._prepare_callback(parseDecideResponse));\n }\n },\n _editorParamsFromHash: function _editorParamsFromHash(instance, hash) {\n var editorParams;\n\n try {\n var state = _.getHashParam(hash, 'state');\n\n state = JSON.parse(decodeURIComponent(state));\n\n var expiresInSeconds = _.getHashParam(hash, 'expires_in');\n\n editorParams = {\n 'accessToken': _.getHashParam(hash, 'access_token'),\n 'accessTokenExpiresAt': new Date().getTime() + Number(expiresInSeconds) * 1000,\n 'bookmarkletMode': !!state['bookmarkletMode'],\n 'projectId': state['projectId'],\n 'projectOwnerId': state['projectOwnerId'],\n 'projectToken': state['token'],\n 'readOnly': state['readOnly'],\n 'userFlags': state['userFlags'],\n 'userId': state['userId']\n };\n window.sessionStorage.setItem('editorParams', JSON.stringify(editorParams));\n\n if (state['desiredHash']) {\n window.location.hash = state['desiredHash'];\n } else if (window.history) {\n history.replaceState('', document.title, window.location.pathname + window.location.search); // completely remove hash\n } else {\n window.location.hash = ''; // clear hash (but leaves # unfortunately)\n }\n } catch (e) {\n console.error('Unable to parse data from hash', e);\n }\n\n return editorParams;\n },\n\n /**\n * To load the visual editor, we need an access token and other state. That state comes from one of three places:\n * 1. In the URL hash params if the customer is using an old snippet\n * 2. From session storage under the key `_mpcehash` if the snippet already parsed the hash\n * 3. From session storage under the key `editorParams` if the editor was initialized on a previous page\n */\n _maybeLoadEditor: function _maybeLoadEditor(instance) {\n try {\n var parseFromUrl = false;\n\n if (_.getHashParam(window.location.hash, 'state')) {\n var state = _.getHashParam(window.location.hash, 'state');\n\n state = JSON.parse(decodeURIComponent(state));\n parseFromUrl = state['action'] === 'mpeditor';\n }\n\n var parseFromStorage = !!window.sessionStorage.getItem('_mpcehash');\n var editorParams;\n\n if (parseFromUrl) {\n // happens if they are initializing the editor using an old snippet\n editorParams = this._editorParamsFromHash(instance, window.location.hash);\n } else if (parseFromStorage) {\n // happens if they are initialized the editor and using the new snippet\n editorParams = this._editorParamsFromHash(instance, window.sessionStorage.getItem('_mpcehash'));\n window.sessionStorage.removeItem('_mpcehash');\n } else {\n // get credentials from sessionStorage from a previous initialzation\n editorParams = JSON.parse(window.sessionStorage.getItem('editorParams') || '{}');\n }\n\n if (editorParams['projectToken'] && instance.get_config('token') === editorParams['projectToken']) {\n this._loadEditor(instance, editorParams);\n\n return true;\n } else {\n return false;\n }\n } catch (e) {\n return false;\n }\n },\n _loadEditor: function _loadEditor(instance, editorParams) {\n if (!window['_mpEditorLoaded']) {\n // only load the codeless event editor once, even if there are multiple instances of MixpanelLib\n window['_mpEditorLoaded'] = true;\n var editorUrl = instance.get_config('app_host') + '/js-bundle/reports/collect-everything/editor.js?_ts=' + new Date().getTime();\n\n this._loadScript(editorUrl, function () {\n window['mp_load_editor'](editorParams);\n });\n\n return true;\n }\n\n return false;\n },\n // this is a mechanism to ramp up CE with no server-side interaction.\n // when CE is active, every page load results in a decide request. we\n // need to gently ramp this up so we don't overload decide. this decides\n // deterministically if CE is enabled for this project by modding the char\n // value of the project token.\n enabledForProject: function enabledForProject(token, numBuckets, numEnabledBuckets) {\n numBuckets = !_.isUndefined(numBuckets) ? numBuckets : 10;\n numEnabledBuckets = !_.isUndefined(numEnabledBuckets) ? numEnabledBuckets : 10;\n var charCodeSum = 0;\n\n for (var i = 0; i < token.length; i++) {\n charCodeSum += token.charCodeAt(i);\n }\n\n return charCodeSum % numBuckets < numEnabledBuckets;\n },\n isBrowserSupported: function isBrowserSupported() {\n return _.isFunction(document.querySelectorAll);\n }\n};\n\n_.bind_instance_methods(autotrack);\n\n_.safewrap_instance_methods(autotrack);\n/**\n * DomTracker Object\n * @constructor\n */\n\n\nvar DomTracker = function DomTracker() {}; // interface\n\n\nDomTracker.prototype.create_properties = function () {};\n\nDomTracker.prototype.event_handler = function () {};\n\nDomTracker.prototype.after_track_handler = function () {};\n\nDomTracker.prototype.init = function (mixpanel_instance) {\n this.mp = mixpanel_instance;\n return this;\n};\n/**\n * @param {Object|string} query\n * @param {string} event_name\n * @param {Object=} properties\n * @param {function=} user_callback\n */\n\n\nDomTracker.prototype.track = function (query, event_name, properties, user_callback) {\n var that = this;\n\n var elements = _.dom_query(query);\n\n if (elements.length === 0) {\n console$1.error('The DOM query (' + query + ') returned 0 elements');\n return;\n }\n\n _.each(elements, function (element) {\n _.register_event(element, this.override_event, function (e) {\n var options = {};\n var props = that.create_properties(properties, this);\n var timeout = that.mp.get_config('track_links_timeout');\n that.event_handler(e, this, options); // in case the mixpanel servers don't get back to us in time\n\n window.setTimeout(that.track_callback(user_callback, props, options, true), timeout); // fire the tracking event\n\n that.mp.track(event_name, props, that.track_callback(user_callback, props, options));\n });\n }, this);\n\n return true;\n};\n/**\n * @param {function} user_callback\n * @param {Object} props\n * @param {boolean=} timeout_occured\n */\n\n\nDomTracker.prototype.track_callback = function (user_callback, props, options, timeout_occured) {\n timeout_occured = timeout_occured || false;\n var that = this;\n return function () {\n // options is referenced from both callbacks, so we can have\n // a 'lock' of sorts to ensure only one fires\n if (options.callback_fired) {\n return;\n }\n\n options.callback_fired = true;\n\n if (user_callback && user_callback(timeout_occured, props) === false) {\n // user can prevent the default functionality by\n // returning false from their callback\n return;\n }\n\n that.after_track_handler(props, options, timeout_occured);\n };\n};\n\nDomTracker.prototype.create_properties = function (properties, element) {\n var props;\n\n if (typeof properties === 'function') {\n props = properties(element);\n } else {\n props = _.extend({}, properties);\n }\n\n return props;\n};\n/**\n * LinkTracker Object\n * @constructor\n * @extends DomTracker\n */\n\n\nvar LinkTracker = function LinkTracker() {\n this.override_event = 'click';\n};\n\n_.inherit(LinkTracker, DomTracker);\n\nLinkTracker.prototype.create_properties = function (properties, element) {\n var props = LinkTracker.superclass.create_properties.apply(this, arguments);\n\n if (element.href) {\n props['url'] = element.href;\n }\n\n return props;\n};\n\nLinkTracker.prototype.event_handler = function (evt, element, options) {\n options.new_tab = evt.which === 2 || evt.metaKey || evt.ctrlKey || element.target === '_blank';\n options.href = element.href;\n\n if (!options.new_tab) {\n evt.preventDefault();\n }\n};\n\nLinkTracker.prototype.after_track_handler = function (props, options) {\n if (options.new_tab) {\n return;\n }\n\n setTimeout(function () {\n window.location = options.href;\n }, 0);\n};\n/**\n * FormTracker Object\n * @constructor\n * @extends DomTracker\n */\n\n\nvar FormTracker = function FormTracker() {\n this.override_event = 'submit';\n};\n\n_.inherit(FormTracker, DomTracker);\n\nFormTracker.prototype.event_handler = function (evt, element, options) {\n options.element = element;\n evt.preventDefault();\n};\n\nFormTracker.prototype.after_track_handler = function (props, options) {\n setTimeout(function () {\n options.element.submit();\n }, 0);\n}; // eslint-disable-line camelcase\n\n\nvar logger$2 = console_with_prefix('lock');\n/**\n * SharedLock: a mutex built on HTML5 localStorage, to ensure that only one browser\n * window/tab at a time will be able to access shared resources.\n *\n * Based on the Alur and Taubenfeld fast lock\n * (http://www.cs.rochester.edu/research/synchronization/pseudocode/fastlock.html)\n * with an added timeout to ensure there will be eventual progress in the event\n * that a window is closed in the middle of the callback.\n *\n * Implementation based on the original version by David Wolever (https://github.com/wolever)\n * at https://gist.github.com/wolever/5fd7573d1ef6166e8f8c4af286a69432.\n *\n * @example\n * const myLock = new SharedLock('some-key');\n * myLock.withLock(function() {\n * console.log('I hold the mutex!');\n * });\n *\n * @constructor\n */\n\nvar SharedLock = function SharedLock(key, options) {\n options = options || {};\n this.storageKey = key;\n this.storage = options.storage || window.localStorage;\n this.pollIntervalMS = options.pollIntervalMS || 100;\n this.timeoutMS = options.timeoutMS || 2000;\n}; // pass in a specific pid to test contention scenarios; otherwise\n// it is chosen randomly for each acquisition attempt\n\n\nSharedLock.prototype.withLock = function (lockedCB, errorCB, pid) {\n if (!pid && typeof errorCB !== 'function') {\n pid = errorCB;\n errorCB = null;\n }\n\n var i = pid || new Date().getTime() + '|' + Math.random();\n var startTime = new Date().getTime();\n var key = this.storageKey;\n var pollIntervalMS = this.pollIntervalMS;\n var timeoutMS = this.timeoutMS;\n var storage = this.storage;\n var keyX = key + ':X';\n var keyY = key + ':Y';\n var keyZ = key + ':Z';\n\n var reportError = function reportError(err) {\n errorCB && errorCB(err);\n };\n\n var delay = function delay(cb) {\n if (new Date().getTime() - startTime > timeoutMS) {\n logger$2.error('Timeout waiting for mutex on ' + key + '; clearing lock. [' + i + ']');\n storage.removeItem(keyZ);\n storage.removeItem(keyY);\n loop();\n return;\n }\n\n setTimeout(function () {\n try {\n cb();\n } catch (err) {\n reportError(err);\n }\n }, pollIntervalMS * (Math.random() + 0.1));\n };\n\n var waitFor = function waitFor(predicate, cb) {\n if (predicate()) {\n cb();\n } else {\n delay(function () {\n waitFor(predicate, cb);\n });\n }\n };\n\n var getSetY = function getSetY() {\n var valY = storage.getItem(keyY);\n\n if (valY && valY !== i) {\n // if Y == i then this process already has the lock (useful for test cases)\n return false;\n } else {\n storage.setItem(keyY, i);\n\n if (storage.getItem(keyY) === i) {\n return true;\n } else {\n if (!localStorageSupported(storage, true)) {\n throw new Error('localStorage support dropped while acquiring lock');\n }\n\n return false;\n }\n }\n };\n\n var loop = function loop() {\n storage.setItem(keyX, i);\n waitFor(getSetY, function () {\n if (storage.getItem(keyX) === i) {\n criticalSection();\n return;\n }\n\n delay(function () {\n if (storage.getItem(keyY) !== i) {\n loop();\n return;\n }\n\n waitFor(function () {\n return !storage.getItem(keyZ);\n }, criticalSection);\n });\n });\n };\n\n var criticalSection = function criticalSection() {\n storage.setItem(keyZ, '1');\n\n try {\n lockedCB();\n } finally {\n storage.removeItem(keyZ);\n\n if (storage.getItem(keyY) === i) {\n storage.removeItem(keyY);\n }\n\n if (storage.getItem(keyX) === i) {\n storage.removeItem(keyX);\n }\n }\n };\n\n try {\n if (localStorageSupported(storage, true)) {\n loop();\n } else {\n throw new Error('localStorage support check failed');\n }\n } catch (err) {\n reportError(err);\n }\n}; // eslint-disable-line camelcase\n\n\nvar logger$1 = console_with_prefix('batch');\n/**\n * RequestQueue: queue for batching API requests with localStorage backup for retries.\n * Maintains an in-memory queue which represents the source of truth for the current\n * page, but also writes all items out to a copy in the browser's localStorage, which\n * can be read on subsequent pageloads and retried. For batchability, all the request\n * items in the queue should be of the same type (events, people updates, group updates)\n * so they can be sent in a single request to the same API endpoint.\n *\n * LocalStorage keying and locking: In order for reloads and subsequent pageloads of\n * the same site to access the same persisted data, they must share the same localStorage\n * key (for instance based on project token and queue type). Therefore access to the\n * localStorage entry is guarded by an asynchronous mutex (SharedLock) to prevent\n * simultaneously open windows/tabs from overwriting each other's data (which would lead\n * to data loss in some situations).\n * @constructor\n */\n\nvar RequestQueue = function RequestQueue(storageKey, options) {\n options = options || {};\n this.storageKey = storageKey;\n this.storage = options.storage || window.localStorage;\n this.lock = new SharedLock(storageKey, {\n storage: this.storage\n });\n this.pid = options.pid || null; // pass pid to test out storage lock contention scenarios\n\n this.memQueue = [];\n};\n/**\n * Add one item to queues (memory and localStorage). The queued entry includes\n * the given item along with an auto-generated ID and a \"flush-after\" timestamp.\n * It is expected that the item will be sent over the network and dequeued\n * before the flush-after time; if this doesn't happen it is considered orphaned\n * (e.g., the original tab where it was enqueued got closed before it could be\n * sent) and the item can be sent by any tab that finds it in localStorage.\n *\n * The final callback param is called with a param indicating success or\n * failure of the enqueue operation; it is asynchronous because the localStorage\n * lock is asynchronous.\n */\n\n\nRequestQueue.prototype.enqueue = function (item, flushInterval, cb) {\n var queueEntry = {\n 'id': cheap_guid(),\n 'flushAfter': new Date().getTime() + flushInterval * 2,\n 'payload': item\n };\n this.lock.withLock(_.bind(function lockAcquired() {\n var succeeded;\n\n try {\n var storedQueue = this.readFromStorage();\n storedQueue.push(queueEntry);\n succeeded = this.saveToStorage(storedQueue);\n\n if (succeeded) {\n // only add to in-memory queue when storage succeeds\n this.memQueue.push(queueEntry);\n }\n } catch (err) {\n logger$1.error('Error enqueueing item', item);\n succeeded = false;\n }\n\n if (cb) {\n cb(succeeded);\n }\n }, this), function lockFailure(err) {\n logger$1.error('Error acquiring storage lock', err);\n\n if (cb) {\n cb(false);\n }\n }, this.pid);\n};\n/**\n * Read out the given number of queue entries. If this.memQueue\n * has fewer than batchSize items, then look for \"orphaned\" items\n * in the persisted queue (items where the 'flushAfter' time has\n * already passed).\n */\n\n\nRequestQueue.prototype.fillBatch = function (batchSize) {\n var batch = this.memQueue.slice(0, batchSize);\n\n if (batch.length < batchSize) {\n // don't need lock just to read events; localStorage is thread-safe\n // and the worst that could happen is a duplicate send of some\n // orphaned events, which will be deduplicated on the server side\n var storedQueue = this.readFromStorage();\n\n if (storedQueue.length) {\n // item IDs already in batch; don't duplicate out of storage\n var idsInBatch = {}; // poor man's Set\n\n _.each(batch, function (item) {\n idsInBatch[item['id']] = true;\n });\n\n for (var i = 0; i < storedQueue.length; i++) {\n var item = storedQueue[i];\n\n if (new Date().getTime() > item['flushAfter'] && !idsInBatch[item['id']]) {\n batch.push(item);\n\n if (batch.length >= batchSize) {\n break;\n }\n }\n }\n }\n }\n\n return batch;\n};\n/**\n * Remove items with matching 'id' from array (immutably)\n * also remove any item without a valid id (e.g., malformed\n * storage entries).\n */\n\n\nvar filterOutIDsAndInvalid = function filterOutIDsAndInvalid(items, idSet) {\n var filteredItems = [];\n\n _.each(items, function (item) {\n if (item['id'] && !idSet[item['id']]) {\n filteredItems.push(item);\n }\n });\n\n return filteredItems;\n};\n/**\n * Remove items with matching IDs from both in-memory queue\n * and persisted queue\n */\n\n\nRequestQueue.prototype.removeItemsByID = function (ids, cb) {\n var idSet = {}; // poor man's Set\n\n _.each(ids, function (id) {\n idSet[id] = true;\n });\n\n this.memQueue = filterOutIDsAndInvalid(this.memQueue, idSet);\n this.lock.withLock(_.bind(function lockAcquired() {\n var succeeded;\n\n try {\n var storedQueue = this.readFromStorage();\n storedQueue = filterOutIDsAndInvalid(storedQueue, idSet);\n succeeded = this.saveToStorage(storedQueue);\n } catch (err) {\n logger$1.error('Error removing items', ids);\n succeeded = false;\n }\n\n if (cb) {\n cb(succeeded);\n }\n }, this), function lockFailure(err) {\n logger$1.error('Error acquiring storage lock', err);\n\n if (cb) {\n cb(false);\n }\n }, this.pid);\n};\n/**\n * Read and parse items array from localStorage entry, handling\n * malformed/missing data if necessary.\n */\n\n\nRequestQueue.prototype.readFromStorage = function () {\n var storageEntry;\n\n try {\n storageEntry = this.storage.getItem(this.storageKey);\n\n if (storageEntry) {\n storageEntry = JSONParse(storageEntry);\n\n if (!_.isArray(storageEntry)) {\n logger$1.error('Invalid storage entry:', storageEntry);\n storageEntry = null;\n }\n }\n } catch (err) {\n logger$1.error('Error retrieving queue', err);\n storageEntry = null;\n }\n\n return storageEntry || [];\n};\n/**\n * Serialize the given items array to localStorage.\n */\n\n\nRequestQueue.prototype.saveToStorage = function (queue) {\n try {\n this.storage.setItem(this.storageKey, JSONStringify(queue));\n return true;\n } catch (err) {\n logger$1.error('Error saving queue', err);\n return false;\n }\n};\n/**\n * Clear out queues (memory and localStorage).\n */\n\n\nRequestQueue.prototype.clear = function () {\n this.memQueue = [];\n this.storage.removeItem(this.storageKey);\n}; // eslint-disable-line camelcase\n// maximum interval between request retries after exponential backoff\n\n\nvar MAX_RETRY_INTERVAL_MS = 10 * 60 * 1000; // 10 minutes\n\nvar logger = console_with_prefix('batch');\n/**\n * RequestBatcher: manages the queueing, flushing, retry etc of requests of one\n * type (events, people, groups).\n * Uses RequestQueue to manage the backing store.\n * @constructor\n */\n\nvar RequestBatcher = function RequestBatcher(storageKey, endpoint, options) {\n this.queue = new RequestQueue(storageKey, {\n storage: options.storage\n });\n this.endpoint = endpoint;\n this.libConfig = options.libConfig;\n this.sendRequest = options.sendRequestFunc; // seed variable batch size + flush interval with configured values\n\n this.batchSize = this.libConfig['batch_size'];\n this.flushInterval = this.libConfig['batch_flush_interval_ms'];\n this.stopped = false;\n};\n/**\n * Add one item to queue.\n */\n\n\nRequestBatcher.prototype.enqueue = function (item, cb) {\n this.queue.enqueue(item, this.flushInterval, cb);\n};\n/**\n * Start flushing batches at the configured time interval. Must call\n * this method upon SDK init in order to send anything over the network.\n */\n\n\nRequestBatcher.prototype.start = function () {\n this.stopped = false;\n this.flush();\n};\n/**\n * Stop flushing batches. Can be restarted by calling start().\n */\n\n\nRequestBatcher.prototype.stop = function () {\n this.stopped = true;\n\n if (this.timeoutID) {\n clearTimeout(this.timeoutID);\n this.timeoutID = null;\n }\n};\n/**\n * Clear out queue.\n */\n\n\nRequestBatcher.prototype.clear = function () {\n this.queue.clear();\n};\n/**\n * Restore batch size configuration to whatever is set in the main SDK.\n */\n\n\nRequestBatcher.prototype.resetBatchSize = function () {\n this.batchSize = this.libConfig['batch_size'];\n};\n/**\n * Restore flush interval time configuration to whatever is set in the main SDK.\n */\n\n\nRequestBatcher.prototype.resetFlush = function () {\n this.scheduleFlush(this.libConfig['batch_flush_interval_ms']);\n};\n/**\n * Schedule the next flush in the given number of milliseconds.\n */\n\n\nRequestBatcher.prototype.scheduleFlush = function (flushMS) {\n this.flushInterval = flushMS;\n\n if (!this.stopped) {\n // don't schedule anymore if batching has been stopped\n this.timeoutID = setTimeout(_.bind(this.flush, this), this.flushInterval);\n }\n};\n/**\n * Flush one batch to network. Depending on success/failure modes, it will either\n * remove the batch from the queue or leave it in for retry, and schedule the next\n * flush. In cases of most network or API failures, it will back off exponentially\n * when retrying.\n * @param {Object} [options]\n * @param {boolean} [options.sendBeacon] - whether to send batch with\n * navigator.sendBeacon (only useful for sending batches before page unloads, as\n * sendBeacon offers no callbacks or status indications)\n */\n\n\nRequestBatcher.prototype.flush = function (options) {\n try {\n if (this.requestInProgress) {\n logger.log('Flush: Request already in progress');\n return;\n }\n\n options = options || {};\n var currentBatchSize = this.batchSize;\n var batch = this.queue.fillBatch(currentBatchSize);\n\n if (batch.length < 1) {\n this.resetFlush();\n return; // nothing to do\n }\n\n this.requestInProgress = true;\n var timeoutMS = this.libConfig['batch_request_timeout_ms'];\n var startTime = new Date().getTime();\n\n var dataForRequest = _.map(batch, function (item) {\n return item['payload'];\n });\n\n var batchSendCallback = _.bind(function (res) {\n this.requestInProgress = false;\n\n try {\n // handle API response in a try-catch to make sure we can reset the\n // flush operation if something goes wrong\n var removeItemsFromQueue = false;\n\n if (_.isObject(res) && res.error === 'timeout' && new Date().getTime() - startTime >= timeoutMS) {\n logger.error('Network timeout; retrying');\n this.flush();\n } else if (_.isObject(res) && res.xhr_req && (res.xhr_req['status'] >= 500 || res.xhr_req['status'] <= 0)) {\n // network or API error, retry\n var retryMS = this.flushInterval * 2;\n var headers = res.xhr_req['responseHeaders'];\n\n if (headers) {\n var retryAfter = headers['Retry-After'];\n\n if (retryAfter) {\n retryMS = parseInt(retryAfter, 10) * 1000 || retryMS;\n }\n }\n\n retryMS = Math.min(MAX_RETRY_INTERVAL_MS, retryMS);\n logger.error('Error; retry in ' + retryMS + ' ms');\n this.scheduleFlush(retryMS);\n } else if (_.isObject(res) && res.xhr_req && res.xhr_req['status'] === 413) {\n // 413 Payload Too Large\n if (batch.length > 1) {\n var halvedBatchSize = Math.max(1, Math.floor(currentBatchSize / 2));\n this.batchSize = Math.min(this.batchSize, halvedBatchSize, batch.length - 1);\n logger.error('413 response; reducing batch size to ' + this.batchSize);\n this.resetFlush();\n } else {\n logger.error('Single-event request too large; dropping', batch);\n this.resetBatchSize();\n removeItemsFromQueue = true;\n }\n } else {\n // successful network request+response; remove each item in batch from queue\n // (even if it was e.g. a 400, in which case retrying won't help)\n removeItemsFromQueue = true;\n }\n\n if (removeItemsFromQueue) {\n this.queue.removeItemsByID(_.map(batch, function (item) {\n return item['id'];\n }), _.bind(this.flush, this) // handle next batch if the queue isn't empty\n );\n }\n } catch (err) {\n logger.error('Error handling API response', err);\n this.resetFlush();\n }\n }, this);\n\n var requestOptions = {\n method: 'POST',\n verbose: true,\n ignore_json_errors: true,\n // eslint-disable-line camelcase\n timeout_ms: timeoutMS // eslint-disable-line camelcase\n\n };\n\n if (options.sendBeacon) {\n requestOptions.transport = 'sendBeacon';\n }\n\n logger.log('MIXPANEL REQUEST:', this.endpoint, dataForRequest);\n this.sendRequest(this.endpoint, dataForRequest, requestOptions, batchSendCallback);\n } catch (err) {\n logger.error('Error flushing request queue', err);\n this.resetFlush();\n }\n};\n/**\n * A function used to track a Mixpanel event (e.g. MixpanelLib.track)\n * @callback trackFunction\n * @param {String} event_name The name of the event. This can be anything the user does - 'Button Click', 'Sign Up', 'Item Purchased', etc.\n * @param {Object} [properties] A set of properties to include with the event you're sending. These describe the user who did the event or details about the event itself.\n * @param {Function} [callback] If provided, the callback function will be called after tracking the event.\n */\n\n/** Public **/\n\n\nvar GDPR_DEFAULT_PERSISTENCE_PREFIX = '__mp_opt_in_out_';\n/**\n * Opt the user in to data tracking and cookies/localstorage for the given token\n * @param {string} token - Mixpanel project tracking token\n * @param {Object} [options]\n * @param {trackFunction} [options.track] - function used for tracking a Mixpanel event to record the opt-in action\n * @param {string} [options.trackEventName] - event name to be used for tracking the opt-in action\n * @param {Object} [options.trackProperties] - set of properties to be tracked along with the opt-in action\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__mp_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookieExpiration] - number of days until the opt-in cookie expires\n * @param {string} [options.cookieDomain] - custom cookie domain\n * @param {boolean} [options.crossSiteCookie] - whether the opt-in cookie is set as cross-site-enabled\n * @param {boolean} [options.crossSubdomainCookie] - whether the opt-in cookie is set as cross-subdomain or not\n * @param {boolean} [options.secureCookie] - whether the opt-in cookie is set as secure or not\n */\n\nfunction optIn(token, options) {\n _optInOut(true, token, options);\n}\n/**\n * Opt the user out of data tracking and cookies/localstorage for the given token\n * @param {string} token - Mixpanel project tracking token\n * @param {Object} [options]\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__mp_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookieExpiration] - number of days until the opt-out cookie expires\n * @param {string} [options.cookieDomain] - custom cookie domain\n * @param {boolean} [options.crossSiteCookie] - whether the opt-in cookie is set as cross-site-enabled\n * @param {boolean} [options.crossSubdomainCookie] - whether the opt-out cookie is set as cross-subdomain or not\n * @param {boolean} [options.secureCookie] - whether the opt-out cookie is set as secure or not\n */\n\n\nfunction optOut(token, options) {\n _optInOut(false, token, options);\n}\n/**\n * Check whether the user has opted in to data tracking and cookies/localstorage for the given token\n * @param {string} token - Mixpanel project tracking token\n * @param {Object} [options]\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__mp_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @returns {boolean} whether the user has opted in to the given opt type\n */\n\n\nfunction hasOptedIn(token, options) {\n return _getStorageValue(token, options) === '1';\n}\n/**\n * Check whether the user has opted out of data tracking and cookies/localstorage for the given token\n * @param {string} token - Mixpanel project tracking token\n * @param {Object} [options]\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__mp_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {boolean} [options.ignoreDnt] - flag to ignore browser DNT settings and always return false\n * @returns {boolean} whether the user has opted out of the given opt type\n */\n\n\nfunction hasOptedOut(token, options) {\n if (_hasDoNotTrackFlagOn(options)) {\n return true;\n }\n\n return _getStorageValue(token, options) === '0';\n}\n/**\n * Wrap a MixpanelLib method with a check for whether the user is opted out of data tracking and cookies/localstorage for the given token\n * If the user has opted out, return early instead of executing the method.\n * If a callback argument was provided, execute it passing the 0 error code.\n * @param {function} method - wrapped method to be executed if the user has not opted out\n * @returns {*} the result of executing method OR undefined if the user has opted out\n */\n\n\nfunction addOptOutCheckMixpanelLib(method) {\n return _addOptOutCheck(method, function (name) {\n return this.get_config(name);\n });\n}\n/**\n * Wrap a MixpanelPeople method with a check for whether the user is opted out of data tracking and cookies/localstorage for the given token\n * If the user has opted out, return early instead of executing the method.\n * If a callback argument was provided, execute it passing the 0 error code.\n * @param {function} method - wrapped method to be executed if the user has not opted out\n * @returns {*} the result of executing method OR undefined if the user has opted out\n */\n\n\nfunction addOptOutCheckMixpanelPeople(method) {\n return _addOptOutCheck(method, function (name) {\n return this._get_config(name);\n });\n}\n/**\n * Wrap a MixpanelGroup method with a check for whether the user is opted out of data tracking and cookies/localstorage for the given token\n * If the user has opted out, return early instead of executing the method.\n * If a callback argument was provided, execute it passing the 0 error code.\n * @param {function} method - wrapped method to be executed if the user has not opted out\n * @returns {*} the result of executing method OR undefined if the user has opted out\n */\n\n\nfunction addOptOutCheckMixpanelGroup(method) {\n return _addOptOutCheck(method, function (name) {\n return this._get_config(name);\n });\n}\n/**\n * Clear the user's opt in/out status of data tracking and cookies/localstorage for the given token\n * @param {string} token - Mixpanel project tracking token\n * @param {Object} [options]\n * @param {string} [options.persistenceType] Persistence mechanism used - cookie or localStorage\n * @param {string} [options.persistencePrefix=__mp_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookieExpiration] - number of days until the opt-in cookie expires\n * @param {string} [options.cookieDomain] - custom cookie domain\n * @param {boolean} [options.crossSiteCookie] - whether the opt-in cookie is set as cross-site-enabled\n * @param {boolean} [options.crossSubdomainCookie] - whether the opt-in cookie is set as cross-subdomain or not\n * @param {boolean} [options.secureCookie] - whether the opt-in cookie is set as secure or not\n */\n\n\nfunction clearOptInOut(token, options) {\n options = options || {};\n\n _getStorage(options).remove(_getStorageKey(token, options), !!options.crossSubdomainCookie, options.cookieDomain);\n}\n/** Private **/\n\n/**\n * Get storage util\n * @param {Object} [options]\n * @param {string} [options.persistenceType]\n * @returns {object} either _.cookie or _.localstorage\n */\n\n\nfunction _getStorage(options) {\n options = options || {};\n return options.persistenceType === 'localStorage' ? _.localStorage : _.cookie;\n}\n/**\n * Get the name of the cookie that is used for the given opt type (tracking, cookie, etc.)\n * @param {string} token - Mixpanel project tracking token\n * @param {Object} [options]\n * @param {string} [options.persistencePrefix=__mp_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @returns {string} the name of the cookie for the given opt type\n */\n\n\nfunction _getStorageKey(token, options) {\n options = options || {};\n return (options.persistencePrefix || GDPR_DEFAULT_PERSISTENCE_PREFIX) + token;\n}\n/**\n * Get the value of the cookie that is used for the given opt type (tracking, cookie, etc.)\n * @param {string} token - Mixpanel project tracking token\n * @param {Object} [options]\n * @param {string} [options.persistencePrefix=__mp_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @returns {string} the value of the cookie for the given opt type\n */\n\n\nfunction _getStorageValue(token, options) {\n return _getStorage(options).get(_getStorageKey(token, options));\n}\n/**\n * Check whether the user has set the DNT/doNotTrack setting to true in their browser\n * @param {Object} [options]\n * @param {string} [options.window] - alternate window object to check; used to force various DNT settings in browser tests\n * @param {boolean} [options.ignoreDnt] - flag to ignore browser DNT settings and always return false\n * @returns {boolean} whether the DNT setting is true\n */\n\n\nfunction _hasDoNotTrackFlagOn(options) {\n if (options && options.ignoreDnt) {\n return false;\n }\n\n var win = options && options.window || window$1;\n var nav = win['navigator'] || {};\n var hasDntOn = false;\n\n _.each([nav['doNotTrack'], // standard\n nav['msDoNotTrack'], win['doNotTrack']], function (dntValue) {\n if (_.includes([true, 1, '1', 'yes'], dntValue)) {\n hasDntOn = true;\n }\n });\n\n return hasDntOn;\n}\n/**\n * Set cookie/localstorage for the user indicating that they are opted in or out for the given opt type\n * @param {boolean} optValue - whether to opt the user in or out for the given opt type\n * @param {string} token - Mixpanel project tracking token\n * @param {Object} [options]\n * @param {trackFunction} [options.track] - function used for tracking a Mixpanel event to record the opt-in action\n * @param {string} [options.trackEventName] - event name to be used for tracking the opt-in action\n * @param {Object} [options.trackProperties] - set of properties to be tracked along with the opt-in action\n * @param {string} [options.persistencePrefix=__mp_opt_in_out] - custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookieExpiration] - number of days until the opt-in cookie expires\n * @param {string} [options.cookieDomain] - custom cookie domain\n * @param {boolean} [options.crossSiteCookie] - whether the opt-in cookie is set as cross-site-enabled\n * @param {boolean} [options.crossSubdomainCookie] - whether the opt-in cookie is set as cross-subdomain or not\n * @param {boolean} [options.secureCookie] - whether the opt-in cookie is set as secure or not\n */\n\n\nfunction _optInOut(optValue, token, options) {\n if (!_.isString(token) || !token.length) {\n console.error('gdpr.' + (optValue ? 'optIn' : 'optOut') + ' called with an invalid token');\n return;\n }\n\n options = options || {};\n\n _getStorage(options).set(_getStorageKey(token, options), optValue ? 1 : 0, _.isNumber(options.cookieExpiration) ? options.cookieExpiration : null, !!options.crossSubdomainCookie, !!options.secureCookie, !!options.crossSiteCookie, options.cookieDomain);\n\n if (options.track && optValue) {\n // only track event if opting in (optValue=true)\n options.track(options.trackEventName || '$opt_in', options.trackProperties, {\n 'send_immediately': true\n });\n }\n}\n/**\n * Wrap a method with a check for whether the user is opted out of data tracking and cookies/localstorage for the given token\n * If the user has opted out, return early instead of executing the method.\n * If a callback argument was provided, execute it passing the 0 error code.\n * @param {function} method - wrapped method to be executed if the user has not opted out\n * @param {function} getConfigValue - getter function for the Mixpanel API token and other options to be used with opt-out check\n * @returns {*} the result of executing method OR undefined if the user has opted out\n */\n\n\nfunction _addOptOutCheck(method, getConfigValue) {\n return function () {\n var optedOut = false;\n\n try {\n var token = getConfigValue.call(this, 'token');\n var ignoreDnt = getConfigValue.call(this, 'ignore_dnt');\n var persistenceType = getConfigValue.call(this, 'opt_out_tracking_persistence_type');\n var persistencePrefix = getConfigValue.call(this, 'opt_out_tracking_cookie_prefix');\n var win = getConfigValue.call(this, 'window'); // used to override window during browser tests\n\n if (token) {\n // if there was an issue getting the token, continue method execution as normal\n optedOut = hasOptedOut(token, {\n ignoreDnt: ignoreDnt,\n persistenceType: persistenceType,\n persistencePrefix: persistencePrefix,\n window: win\n });\n }\n } catch (err) {\n console.error('Unexpected error when checking tracking opt-out status: ' + err);\n }\n\n if (!optedOut) {\n return method.apply(this, arguments);\n }\n\n var callback = arguments[arguments.length - 1];\n\n if (typeof callback === 'function') {\n callback(0);\n }\n\n return;\n };\n}\n/** @const */\n\n\nvar SET_ACTION = '$set';\n/** @const */\n\nvar SET_ONCE_ACTION = '$set_once';\n/** @const */\n\nvar UNSET_ACTION = '$unset';\n/** @const */\n\nvar ADD_ACTION = '$add';\n/** @const */\n\nvar APPEND_ACTION = '$append';\n/** @const */\n\nvar UNION_ACTION = '$union';\n/** @const */\n\nvar REMOVE_ACTION = '$remove';\n/** @const */\n\nvar DELETE_ACTION = '$delete'; // Common internal methods for mixpanel.people and mixpanel.group APIs.\n// These methods shouldn't involve network I/O.\n\nvar apiActions = {\n set_action: function set_action(prop, to) {\n var data = {};\n var $set = {};\n\n if (_.isObject(prop)) {\n _.each(prop, function (v, k) {\n if (!this._is_reserved_property(k)) {\n $set[k] = v;\n }\n }, this);\n } else {\n $set[prop] = to;\n }\n\n data[SET_ACTION] = $set;\n return data;\n },\n unset_action: function unset_action(prop) {\n var data = {};\n var $unset = [];\n\n if (!_.isArray(prop)) {\n prop = [prop];\n }\n\n _.each(prop, function (k) {\n if (!this._is_reserved_property(k)) {\n $unset.push(k);\n }\n }, this);\n\n data[UNSET_ACTION] = $unset;\n return data;\n },\n set_once_action: function set_once_action(prop, to) {\n var data = {};\n var $set_once = {};\n\n if (_.isObject(prop)) {\n _.each(prop, function (v, k) {\n if (!this._is_reserved_property(k)) {\n $set_once[k] = v;\n }\n }, this);\n } else {\n $set_once[prop] = to;\n }\n\n data[SET_ONCE_ACTION] = $set_once;\n return data;\n },\n union_action: function union_action(list_name, values) {\n var data = {};\n var $union = {};\n\n if (_.isObject(list_name)) {\n _.each(list_name, function (v, k) {\n if (!this._is_reserved_property(k)) {\n $union[k] = _.isArray(v) ? v : [v];\n }\n }, this);\n } else {\n $union[list_name] = _.isArray(values) ? values : [values];\n }\n\n data[UNION_ACTION] = $union;\n return data;\n },\n append_action: function append_action(list_name, value) {\n var data = {};\n var $append = {};\n\n if (_.isObject(list_name)) {\n _.each(list_name, function (v, k) {\n if (!this._is_reserved_property(k)) {\n $append[k] = v;\n }\n }, this);\n } else {\n $append[list_name] = value;\n }\n\n data[APPEND_ACTION] = $append;\n return data;\n },\n remove_action: function remove_action(list_name, value) {\n var data = {};\n var $remove = {};\n\n if (_.isObject(list_name)) {\n _.each(list_name, function (v, k) {\n if (!this._is_reserved_property(k)) {\n $remove[k] = v;\n }\n }, this);\n } else {\n $remove[list_name] = value;\n }\n\n data[REMOVE_ACTION] = $remove;\n return data;\n },\n delete_action: function delete_action() {\n var data = {};\n data[DELETE_ACTION] = '';\n return data;\n }\n};\n/**\n * Mixpanel Group Object\n * @constructor\n */\n\nvar MixpanelGroup = function MixpanelGroup() {};\n\n_.extend(MixpanelGroup.prototype, apiActions);\n\nMixpanelGroup.prototype._init = function (mixpanel_instance, group_key, group_id) {\n this._mixpanel = mixpanel_instance;\n this._group_key = group_key;\n this._group_id = group_id;\n};\n/**\n * Set properties on a group.\n *\n * ### Usage:\n *\n * mixpanel.get_group('company', 'mixpanel').set('Location', '405 Howard');\n *\n * // or set multiple properties at once\n * mixpanel.get_group('company', 'mixpanel').set({\n * 'Location': '405 Howard',\n * 'Founded' : 2009,\n * });\n * // properties can be strings, integers, dates, or lists\n *\n * @param {Object|String} prop If a string, this is the name of the property. If an object, this is an associative array of names and values.\n * @param {*} [to] A value to set on the given property name\n * @param {Function} [callback] If provided, the callback will be called after the tracking event\n */\n\n\nMixpanelGroup.prototype.set = addOptOutCheckMixpanelGroup(function (prop, to, callback) {\n var data = this.set_action(prop, to);\n\n if (_.isObject(prop)) {\n callback = to;\n }\n\n return this._send_request(data, callback);\n});\n/**\n * Set properties on a group, only if they do not yet exist.\n * This will not overwrite previous group property values, unlike\n * group.set().\n *\n * ### Usage:\n *\n * mixpanel.get_group('company', 'mixpanel').set_once('Location', '405 Howard');\n *\n * // or set multiple properties at once\n * mixpanel.get_group('company', 'mixpanel').set_once({\n * 'Location': '405 Howard',\n * 'Founded' : 2009,\n * });\n * // properties can be strings, integers, lists or dates\n *\n * @param {Object|String} prop If a string, this is the name of the property. If an object, this is an associative array of names and values.\n * @param {*} [to] A value to set on the given property name\n * @param {Function} [callback] If provided, the callback will be called after the tracking event\n */\n\nMixpanelGroup.prototype.set_once = addOptOutCheckMixpanelGroup(function (prop, to, callback) {\n var data = this.set_once_action(prop, to);\n\n if (_.isObject(prop)) {\n callback = to;\n }\n\n return this._send_request(data, callback);\n});\n/**\n * Unset properties on a group permanently.\n *\n * ### Usage:\n *\n * mixpanel.get_group('company', 'mixpanel').unset('Founded');\n *\n * @param {String} prop The name of the property.\n * @param {Function} [callback] If provided, the callback will be called after the tracking event\n */\n\nMixpanelGroup.prototype.unset = addOptOutCheckMixpanelGroup(function (prop, callback) {\n var data = this.unset_action(prop);\n return this._send_request(data, callback);\n});\n/**\n * Merge a given list with a list-valued group property, excluding duplicate values.\n *\n * ### Usage:\n *\n * // merge a value to a list, creating it if needed\n * mixpanel.get_group('company', 'mixpanel').union('Location', ['San Francisco', 'London']);\n *\n * @param {String} list_name Name of the property.\n * @param {Array} values Values to merge with the given property\n * @param {Function} [callback] If provided, the callback will be called after the tracking event\n */\n\nMixpanelGroup.prototype.union = addOptOutCheckMixpanelGroup(function (list_name, values, callback) {\n if (_.isObject(list_name)) {\n callback = values;\n }\n\n var data = this.union_action(list_name, values);\n return this._send_request(data, callback);\n});\n/**\n * Permanently delete a group.\n *\n * ### Usage:\n * mixpanel.get_group('company', 'mixpanel').delete();\n */\n\nMixpanelGroup.prototype['delete'] = addOptOutCheckMixpanelGroup(function (callback) {\n var data = this.delete_action();\n return this._send_request(data, callback);\n});\n/**\n * Remove a property from a group. The value will be ignored if doesn't exist.\n *\n * ### Usage:\n *\n * mixpanel.get_group('company', 'mixpanel').remove('Location', 'London');\n *\n * @param {String} list_name Name of the property.\n * @param {Object} value Value to remove from the given group property\n * @param {Function} [callback] If provided, the callback will be called after the tracking event\n */\n\nMixpanelGroup.prototype.remove = addOptOutCheckMixpanelGroup(function (list_name, value, callback) {\n var data = this.remove_action(list_name, value);\n return this._send_request(data, callback);\n});\n\nMixpanelGroup.prototype._send_request = function (data, callback) {\n data['$group_key'] = this._group_key;\n data['$group_id'] = this._group_id;\n data['$token'] = this._get_config('token');\n\n var date_encoded_data = _.encodeDates(data);\n\n return this._mixpanel._track_or_batch({\n truncated_data: _.truncate(date_encoded_data, 255),\n endpoint: this._get_config('api_host') + '/groups/',\n batcher: this._mixpanel.request_batchers.groups\n }, callback);\n};\n\nMixpanelGroup.prototype._is_reserved_property = function (prop) {\n return prop === '$group_key' || prop === '$group_id';\n};\n\nMixpanelGroup.prototype._get_config = function (conf) {\n return this._mixpanel.get_config(conf);\n};\n\nMixpanelGroup.prototype.toString = function () {\n return this._mixpanel.toString() + '.group.' + this._group_key + '.' + this._group_id;\n}; // MixpanelGroup Exports\n\n\nMixpanelGroup.prototype['remove'] = MixpanelGroup.prototype.remove;\nMixpanelGroup.prototype['set'] = MixpanelGroup.prototype.set;\nMixpanelGroup.prototype['set_once'] = MixpanelGroup.prototype.set_once;\nMixpanelGroup.prototype['union'] = MixpanelGroup.prototype.union;\nMixpanelGroup.prototype['unset'] = MixpanelGroup.prototype.unset;\nMixpanelGroup.prototype['toString'] = MixpanelGroup.prototype.toString;\n/*\n * Constants\n */\n\n/** @const */\n\nvar SET_QUEUE_KEY = '__mps';\n/** @const */\n\nvar SET_ONCE_QUEUE_KEY = '__mpso';\n/** @const */\n\nvar UNSET_QUEUE_KEY = '__mpus';\n/** @const */\n\nvar ADD_QUEUE_KEY = '__mpa';\n/** @const */\n\nvar APPEND_QUEUE_KEY = '__mpap';\n/** @const */\n\nvar REMOVE_QUEUE_KEY = '__mpr';\n/** @const */\n\nvar UNION_QUEUE_KEY = '__mpu'; // This key is deprecated, but we want to check for it to see whether aliasing is allowed.\n\n/** @const */\n\nvar PEOPLE_DISTINCT_ID_KEY = '$people_distinct_id';\n/** @const */\n\nvar ALIAS_ID_KEY = '__alias';\n/** @const */\n\nvar CAMPAIGN_IDS_KEY = '__cmpns';\n/** @const */\n\nvar EVENT_TIMERS_KEY = '__timers';\n/** @const */\n\nvar RESERVED_PROPERTIES = [SET_QUEUE_KEY, SET_ONCE_QUEUE_KEY, UNSET_QUEUE_KEY, ADD_QUEUE_KEY, APPEND_QUEUE_KEY, REMOVE_QUEUE_KEY, UNION_QUEUE_KEY, PEOPLE_DISTINCT_ID_KEY, ALIAS_ID_KEY, CAMPAIGN_IDS_KEY, EVENT_TIMERS_KEY];\n/**\n * Mixpanel Persistence Object\n * @constructor\n */\n\nvar MixpanelPersistence = function MixpanelPersistence(config) {\n this['props'] = {};\n this.campaign_params_saved = false;\n\n if (config['persistence_name']) {\n this.name = 'mp_' + config['persistence_name'];\n } else {\n this.name = 'mp_' + config['token'] + '_mixpanel';\n }\n\n var storage_type = config['persistence'];\n\n if (storage_type !== 'cookie' && storage_type !== 'localStorage') {\n console$1.critical('Unknown persistence type ' + storage_type + '; falling back to cookie');\n storage_type = config['persistence'] = 'cookie';\n }\n\n if (storage_type === 'localStorage' && _.localStorage.is_supported()) {\n this.storage = _.localStorage;\n } else {\n this.storage = _.cookie;\n }\n\n this.load();\n this.update_config(config);\n this.upgrade(config);\n this.save();\n};\n\nMixpanelPersistence.prototype.properties = function () {\n var p = {}; // Filter out reserved properties\n\n _.each(this['props'], function (v, k) {\n if (!_.include(RESERVED_PROPERTIES, k)) {\n p[k] = v;\n }\n });\n\n return p;\n};\n\nMixpanelPersistence.prototype.load = function () {\n if (this.disabled) {\n return;\n }\n\n var entry = this.storage.parse(this.name);\n\n if (entry) {\n this['props'] = _.extend({}, entry);\n }\n};\n\nMixpanelPersistence.prototype.upgrade = function (config) {\n var upgrade_from_old_lib = config['upgrade'],\n old_cookie_name,\n old_cookie;\n\n if (upgrade_from_old_lib) {\n old_cookie_name = 'mp_super_properties'; // Case where they had a custom cookie name before.\n\n if (typeof upgrade_from_old_lib === 'string') {\n old_cookie_name = upgrade_from_old_lib;\n }\n\n old_cookie = this.storage.parse(old_cookie_name); // remove the cookie\n\n this.storage.remove(old_cookie_name);\n this.storage.remove(old_cookie_name, true);\n\n if (old_cookie) {\n this['props'] = _.extend(this['props'], old_cookie['all'], old_cookie['events']);\n }\n }\n\n if (!config['cookie_name'] && config['name'] !== 'mixpanel') {\n // special case to handle people with cookies of the form\n // mp_TOKEN_INSTANCENAME from the first release of this library\n old_cookie_name = 'mp_' + config['token'] + '_' + config['name'];\n old_cookie = this.storage.parse(old_cookie_name);\n\n if (old_cookie) {\n this.storage.remove(old_cookie_name);\n this.storage.remove(old_cookie_name, true); // Save the prop values that were in the cookie from before -\n // this should only happen once as we delete the old one.\n\n this.register_once(old_cookie);\n }\n }\n\n if (this.storage === _.localStorage) {\n old_cookie = _.cookie.parse(this.name);\n\n _.cookie.remove(this.name);\n\n _.cookie.remove(this.name, true);\n\n if (old_cookie) {\n this.register_once(old_cookie);\n }\n }\n};\n\nMixpanelPersistence.prototype.save = function () {\n if (this.disabled) {\n return;\n }\n\n this._expire_notification_campaigns();\n\n this.storage.set(this.name, _.JSONEncode(this['props']), this.expire_days, this.cross_subdomain, this.secure, this.cross_site, this.cookie_domain);\n};\n\nMixpanelPersistence.prototype.remove = function () {\n // remove both domain and subdomain cookies\n this.storage.remove(this.name, false, this.cookie_domain);\n this.storage.remove(this.name, true, this.cookie_domain);\n}; // removes the storage entry and deletes all loaded data\n// forced name for tests\n\n\nMixpanelPersistence.prototype.clear = function () {\n this.remove();\n this['props'] = {};\n};\n/**\n* @param {Object} props\n* @param {*=} default_value\n* @param {number=} days\n*/\n\n\nMixpanelPersistence.prototype.register_once = function (props, default_value, days) {\n if (_.isObject(props)) {\n if (typeof default_value === 'undefined') {\n default_value = 'None';\n }\n\n this.expire_days = typeof days === 'undefined' ? this.default_expiry : days;\n\n _.each(props, function (val, prop) {\n if (!this['props'].hasOwnProperty(prop) || this['props'][prop] === default_value) {\n this['props'][prop] = val;\n }\n }, this);\n\n this.save();\n return true;\n }\n\n return false;\n};\n/**\n* @param {Object} props\n* @param {number=} days\n*/\n\n\nMixpanelPersistence.prototype.register = function (props, days) {\n if (_.isObject(props)) {\n this.expire_days = typeof days === 'undefined' ? this.default_expiry : days;\n\n _.extend(this['props'], props);\n\n this.save();\n return true;\n }\n\n return false;\n};\n\nMixpanelPersistence.prototype.unregister = function (prop) {\n if (prop in this['props']) {\n delete this['props'][prop];\n this.save();\n }\n};\n\nMixpanelPersistence.prototype._expire_notification_campaigns = _.safewrap(function () {\n var campaigns_shown = this['props'][CAMPAIGN_IDS_KEY],\n EXPIRY_TIME = Config.DEBUG ? 60 * 1000 : 60 * 60 * 1000; // 1 minute (Config.DEBUG) / 1 hour (PDXN)\n\n if (!campaigns_shown) {\n return;\n }\n\n for (var campaign_id in campaigns_shown) {\n if (1 * new Date() - campaigns_shown[campaign_id] > EXPIRY_TIME) {\n delete campaigns_shown[campaign_id];\n }\n }\n\n if (_.isEmptyObject(campaigns_shown)) {\n delete this['props'][CAMPAIGN_IDS_KEY];\n }\n});\n\nMixpanelPersistence.prototype.update_campaign_params = function () {\n if (!this.campaign_params_saved) {\n this.register_once(_.info.campaignParams());\n this.campaign_params_saved = true;\n }\n};\n\nMixpanelPersistence.prototype.update_search_keyword = function (referrer) {\n this.register(_.info.searchInfo(referrer));\n}; // EXPORTED METHOD, we test this directly.\n\n\nMixpanelPersistence.prototype.update_referrer_info = function (referrer) {\n // If referrer doesn't exist, we want to note the fact that it was type-in traffic.\n this.register_once({\n '$initial_referrer': referrer || '$direct',\n '$initial_referring_domain': _.info.referringDomain(referrer) || '$direct'\n }, '');\n};\n\nMixpanelPersistence.prototype.get_referrer_info = function () {\n return _.strip_empty_properties({\n '$initial_referrer': this['props']['$initial_referrer'],\n '$initial_referring_domain': this['props']['$initial_referring_domain']\n });\n}; // safely fills the passed in object with stored properties,\n// does not override any properties defined in both\n// returns the passed in object\n\n\nMixpanelPersistence.prototype.safe_merge = function (props) {\n _.each(this['props'], function (val, prop) {\n if (!(prop in props)) {\n props[prop] = val;\n }\n });\n\n return props;\n};\n\nMixpanelPersistence.prototype.update_config = function (config) {\n this.default_expiry = this.expire_days = config['cookie_expiration'];\n this.set_disabled(config['disable_persistence']);\n this.set_cookie_domain(config['cookie_domain']);\n this.set_cross_site(config['cross_site_cookie']);\n this.set_cross_subdomain(config['cross_subdomain_cookie']);\n this.set_secure(config['secure_cookie']);\n};\n\nMixpanelPersistence.prototype.set_disabled = function (disabled) {\n this.disabled = disabled;\n\n if (this.disabled) {\n this.remove();\n } else {\n this.save();\n }\n};\n\nMixpanelPersistence.prototype.set_cookie_domain = function (cookie_domain) {\n if (cookie_domain !== this.cookie_domain) {\n this.remove();\n this.cookie_domain = cookie_domain;\n this.save();\n }\n};\n\nMixpanelPersistence.prototype.set_cross_site = function (cross_site) {\n if (cross_site !== this.cross_site) {\n this.cross_site = cross_site;\n this.remove();\n this.save();\n }\n};\n\nMixpanelPersistence.prototype.set_cross_subdomain = function (cross_subdomain) {\n if (cross_subdomain !== this.cross_subdomain) {\n this.cross_subdomain = cross_subdomain;\n this.remove();\n this.save();\n }\n};\n\nMixpanelPersistence.prototype.get_cross_subdomain = function () {\n return this.cross_subdomain;\n};\n\nMixpanelPersistence.prototype.set_secure = function (secure) {\n if (secure !== this.secure) {\n this.secure = secure ? true : false;\n this.remove();\n this.save();\n }\n};\n\nMixpanelPersistence.prototype._add_to_people_queue = function (queue, data) {\n var q_key = this._get_queue_key(queue),\n q_data = data[queue],\n set_q = this._get_or_create_queue(SET_ACTION),\n set_once_q = this._get_or_create_queue(SET_ONCE_ACTION),\n unset_q = this._get_or_create_queue(UNSET_ACTION),\n add_q = this._get_or_create_queue(ADD_ACTION),\n union_q = this._get_or_create_queue(UNION_ACTION),\n remove_q = this._get_or_create_queue(REMOVE_ACTION, []),\n append_q = this._get_or_create_queue(APPEND_ACTION, []);\n\n if (q_key === SET_QUEUE_KEY) {\n // Update the set queue - we can override any existing values\n _.extend(set_q, q_data); // if there was a pending increment, override it\n // with the set.\n\n\n this._pop_from_people_queue(ADD_ACTION, q_data); // if there was a pending union, override it\n // with the set.\n\n\n this._pop_from_people_queue(UNION_ACTION, q_data);\n\n this._pop_from_people_queue(UNSET_ACTION, q_data);\n } else if (q_key === SET_ONCE_QUEUE_KEY) {\n // only queue the data if there is not already a set_once call for it.\n _.each(q_data, function (v, k) {\n if (!(k in set_once_q)) {\n set_once_q[k] = v;\n }\n });\n\n this._pop_from_people_queue(UNSET_ACTION, q_data);\n } else if (q_key === UNSET_QUEUE_KEY) {\n _.each(q_data, function (prop) {\n // undo previously-queued actions on this key\n _.each([set_q, set_once_q, add_q, union_q], function (enqueued_obj) {\n if (prop in enqueued_obj) {\n delete enqueued_obj[prop];\n }\n });\n\n _.each(append_q, function (append_obj) {\n if (prop in append_obj) {\n delete append_obj[prop];\n }\n });\n\n unset_q[prop] = true;\n });\n } else if (q_key === ADD_QUEUE_KEY) {\n _.each(q_data, function (v, k) {\n // If it exists in the set queue, increment\n // the value\n if (k in set_q) {\n set_q[k] += v;\n } else {\n // If it doesn't exist, update the add\n // queue\n if (!(k in add_q)) {\n add_q[k] = 0;\n }\n\n add_q[k] += v;\n }\n }, this);\n\n this._pop_from_people_queue(UNSET_ACTION, q_data);\n } else if (q_key === UNION_QUEUE_KEY) {\n _.each(q_data, function (v, k) {\n if (_.isArray(v)) {\n if (!(k in union_q)) {\n union_q[k] = [];\n } // We may send duplicates, the server will dedup them.\n\n\n union_q[k] = union_q[k].concat(v);\n }\n });\n\n this._pop_from_people_queue(UNSET_ACTION, q_data);\n } else if (q_key === REMOVE_QUEUE_KEY) {\n remove_q.push(q_data);\n\n this._pop_from_people_queue(APPEND_ACTION, q_data);\n } else if (q_key === APPEND_QUEUE_KEY) {\n append_q.push(q_data);\n\n this._pop_from_people_queue(UNSET_ACTION, q_data);\n }\n\n console$1.log('MIXPANEL PEOPLE REQUEST (QUEUED, PENDING IDENTIFY):');\n console$1.log(data);\n this.save();\n};\n\nMixpanelPersistence.prototype._pop_from_people_queue = function (queue, data) {\n var q = this._get_queue(queue);\n\n if (!_.isUndefined(q)) {\n _.each(data, function (v, k) {\n if (queue === APPEND_ACTION || queue === REMOVE_ACTION) {\n // list actions: only remove if both k+v match\n // e.g. remove should not override append in a case like\n // append({foo: 'bar'}); remove({foo: 'qux'})\n _.each(q, function (queued_action) {\n if (queued_action[k] === v) {\n delete queued_action[k];\n }\n });\n } else {\n delete q[k];\n }\n }, this);\n\n this.save();\n }\n};\n\nMixpanelPersistence.prototype._get_queue_key = function (queue) {\n if (queue === SET_ACTION) {\n return SET_QUEUE_KEY;\n } else if (queue === SET_ONCE_ACTION) {\n return SET_ONCE_QUEUE_KEY;\n } else if (queue === UNSET_ACTION) {\n return UNSET_QUEUE_KEY;\n } else if (queue === ADD_ACTION) {\n return ADD_QUEUE_KEY;\n } else if (queue === APPEND_ACTION) {\n return APPEND_QUEUE_KEY;\n } else if (queue === REMOVE_ACTION) {\n return REMOVE_QUEUE_KEY;\n } else if (queue === UNION_ACTION) {\n return UNION_QUEUE_KEY;\n } else {\n console$1.error('Invalid queue:', queue);\n }\n};\n\nMixpanelPersistence.prototype._get_queue = function (queue) {\n return this['props'][this._get_queue_key(queue)];\n};\n\nMixpanelPersistence.prototype._get_or_create_queue = function (queue, default_val) {\n var key = this._get_queue_key(queue);\n\n default_val = _.isUndefined(default_val) ? {} : default_val;\n return this['props'][key] || (this['props'][key] = default_val);\n};\n\nMixpanelPersistence.prototype.set_event_timer = function (event_name, timestamp) {\n var timers = this['props'][EVENT_TIMERS_KEY] || {};\n timers[event_name] = timestamp;\n this['props'][EVENT_TIMERS_KEY] = timers;\n this.save();\n};\n\nMixpanelPersistence.prototype.remove_event_timer = function (event_name) {\n var timers = this['props'][EVENT_TIMERS_KEY] || {};\n var timestamp = timers[event_name];\n\n if (!_.isUndefined(timestamp)) {\n delete this['props'][EVENT_TIMERS_KEY][event_name];\n this.save();\n }\n\n return timestamp;\n};\n/*\n * This file is a js implementation for a subset in eval_node.c\n */\n\n/*\n * Constants\n */\n// Metadata keys\n\n/** @const */\n\n\nvar OPERATOR_KEY = 'operator';\n/** @const */\n\nvar PROPERTY_KEY = 'property';\n/** @const */\n\nvar WINDOW_KEY = 'window';\n/** @const */\n\nvar UNIT_KEY = 'unit';\n/** @const */\n\nvar VALUE_KEY = 'value';\n/** @const */\n\nvar HOUR_KEY = 'hour';\n/** @const */\n\nvar DAY_KEY = 'day';\n/** @const */\n\nvar WEEK_KEY = 'week';\n/** @const */\n\nvar MONTH_KEY = 'month'; // Operands\n\n/** @const */\n\nvar EVENT_PROPERTY = 'event';\n/** @const */\n\nvar LITERAL_PROPERTY = 'literal'; // Binary Operators\n\n/** @const */\n\nvar AND_OPERATOR = 'and';\n/** @const */\n\nvar OR_OPERATOR = 'or';\n/** @const */\n\nvar IN_OPERATOR = 'in';\n/** @const */\n\nvar NOT_IN_OPERATOR = 'not in';\n/** @const */\n\nvar PLUS_OPERATOR = '+';\n/** @const */\n\nvar MINUS_OPERATOR = '-';\n/** @const */\n\nvar MUL_OPERATOR = '*';\n/** @const */\n\nvar DIV_OPERATOR = '/';\n/** @const */\n\nvar MOD_OPERATOR = '%';\n/** @const */\n\nvar EQUALS_OPERATOR = '==';\n/** @const */\n\nvar NOT_EQUALS_OPERATOR = '!=';\n/** @const */\n\nvar GREATER_OPERATOR = '>';\n/** @const */\n\nvar LESS_OPERATOR = '<';\n/** @const */\n\nvar GREATER_EQUAL_OPERATOR = '>=';\n/** @const */\n\nvar LESS_EQUAL_OPERATOR = '<='; // Typecast Operators\n\n/** @const */\n\nvar BOOLEAN_OPERATOR = 'boolean';\n/** @const */\n\nvar DATETIME_OPERATOR = 'datetime';\n/** @const */\n\nvar LIST_OPERATOR = 'list';\n/** @const */\n\nvar NUMBER_OPERATOR = 'number';\n/** @const */\n\nvar STRING_OPERATOR = 'string'; // Unary Operators\n\n/** @const */\n\nvar NOT_OPERATOR = 'not';\n/** @const */\n\nvar DEFINED_OPERATOR = 'defined';\n/** @const */\n\nvar NOT_DEFINED_OPERATOR = 'not defined'; // Special literals\n\n/** @const */\n\nvar NOW_LITERAL = 'now'; // Type cast functions\n\nfunction toNumber(value) {\n if (value === null) {\n return null;\n }\n\n switch (typeof value) {\n case 'object':\n if (_.isDate(value) && value.getTime() >= 0) {\n return value.getTime();\n }\n\n return null;\n\n case 'boolean':\n return Number(value);\n\n case 'number':\n return value;\n\n case 'string':\n value = Number(value);\n\n if (!isNaN(value)) {\n return value;\n }\n\n return 0;\n }\n\n return null;\n}\n\nfunction evaluateNumber(op, properties) {\n if (!op['operator'] || op['operator'] !== NUMBER_OPERATOR || !op['children'] || op['children'].length !== 1) {\n throw 'Invalid cast operator: number ' + op;\n }\n\n return toNumber(evaluateSelector(op['children'][0], properties));\n}\n\nfunction toBoolean(value) {\n if (value === null) {\n return false;\n }\n\n switch (typeof value) {\n case 'boolean':\n return value;\n\n case 'number':\n return value !== 0.0;\n\n case 'string':\n return value.length > 0;\n\n case 'object':\n if (_.isArray(value) && value.length > 0) {\n return true;\n }\n\n if (_.isDate(value) && value.getTime() > 0) {\n return true;\n }\n\n if (_.isObject(value) && !_.isEmptyObject(value)) {\n return true;\n }\n\n return false;\n }\n\n return false;\n}\n\nfunction evaluateBoolean(op, properties) {\n if (!op['operator'] || op['operator'] !== BOOLEAN_OPERATOR || !op['children'] || op['children'].length !== 1) {\n throw 'Invalid cast operator: boolean ' + op;\n }\n\n return toBoolean(evaluateSelector(op['children'][0], properties));\n}\n\nfunction evaluateDateTime(op, properties) {\n if (!op['operator'] || op['operator'] !== DATETIME_OPERATOR || !op['children'] || op['children'].length !== 1) {\n throw 'Invalid cast operator: datetime ' + op;\n }\n\n var v = evaluateSelector(op['children'][0], properties);\n\n if (v === null) {\n return null;\n }\n\n switch (typeof v) {\n case 'number':\n case 'string':\n var d = new Date(v);\n\n if (isNaN(d.getTime())) {\n return null;\n }\n\n return d;\n\n case 'object':\n if (_.isDate(v)) {\n return v;\n }\n\n }\n\n return null;\n}\n\nfunction evaluateList(op, properties) {\n if (!op['operator'] || op['operator'] !== LIST_OPERATOR || !op['children'] || op['children'].length !== 1) {\n throw 'Invalid cast operator: list ' + op;\n }\n\n var v = evaluateSelector(op['children'][0], properties);\n\n if (v === null) {\n return null;\n }\n\n if (_.isArray(v)) {\n return v;\n }\n\n return null;\n}\n\nfunction evaluateString(op, properties) {\n if (!op['operator'] || op['operator'] !== STRING_OPERATOR || !op['children'] || op['children'].length !== 1) {\n throw 'Invalid cast operator: string ' + op;\n }\n\n var v = evaluateSelector(op['children'][0], properties);\n\n switch (typeof v) {\n case 'object':\n if (_.isDate(v)) {\n return v.toJSON();\n }\n\n return JSON.stringify(v);\n }\n\n return String(v);\n} // Operators\n\n\nfunction evaluateAnd(op, properties) {\n if (!op['operator'] || op['operator'] !== AND_OPERATOR || !op['children'] || op['children'].length !== 2) {\n throw 'Invalid operator: AND ' + op;\n }\n\n return toBoolean(evaluateSelector(op['children'][0], properties)) && toBoolean(evaluateSelector(op['children'][1], properties));\n}\n\nfunction evaluateOr(op, properties) {\n if (!op['operator'] || op['operator'] !== OR_OPERATOR || !op['children'] || op['children'].length !== 2) {\n throw 'Invalid operator: OR ' + op;\n }\n\n return toBoolean(evaluateSelector(op['children'][0], properties)) || toBoolean(evaluateSelector(op['children'][1], properties));\n}\n\nfunction evaluateIn(op, properties) {\n if (!op['operator'] || [IN_OPERATOR, NOT_IN_OPERATOR].indexOf(op['operator']) === -1 || !op['children'] || op['children'].length !== 2) {\n throw 'Invalid operator: IN/NOT IN ' + op;\n }\n\n var leftValue = evaluateSelector(op['children'][0], properties);\n var rightValue = evaluateSelector(op['children'][1], properties);\n\n if (!_.isArray(rightValue) && !_.isString(rightValue)) {\n throw 'Invalid operand for operator IN: invalid type' + rightValue;\n }\n\n var v = rightValue.indexOf(leftValue) > -1;\n\n if (op['operator'] === NOT_IN_OPERATOR) {\n return !v;\n }\n\n return v;\n}\n\nfunction evaluatePlus(op, properties) {\n if (!op['operator'] || op['operator'] !== PLUS_OPERATOR || !op['children'] || op['children'].length < 2) {\n throw 'Invalid operator: PLUS ' + op;\n }\n\n var l = evaluateSelector(op['children'][0], properties);\n var r = evaluateSelector(op['children'][1], properties);\n\n if (typeof l === 'number' && typeof r === 'number') {\n return l + r;\n }\n\n if (typeof l === 'string' && typeof r === 'string') {\n return l + r;\n }\n\n return null;\n}\n\nfunction evaluateArithmetic(op, properties) {\n if (!op['operator'] || [MINUS_OPERATOR, MUL_OPERATOR, DIV_OPERATOR, MOD_OPERATOR].indexOf(op['operator']) === -1 || !op['children'] || op['children'].length < 2) {\n throw 'Invalid arithmetic operator ' + op;\n }\n\n var l = evaluateSelector(op['children'][0], properties);\n var r = evaluateSelector(op['children'][1], properties);\n\n if (typeof l === 'number' && typeof r === 'number') {\n switch (op['operator']) {\n case MINUS_OPERATOR:\n return l - r;\n\n case MUL_OPERATOR:\n return l * r;\n\n case DIV_OPERATOR:\n if (r !== 0) {\n return l / r;\n }\n\n return null;\n\n case MOD_OPERATOR:\n if (r === 0) {\n return null;\n }\n\n if (l === 0) {\n return 0;\n }\n\n if (l < 0 && r > 0 || l > 0 && r < 0) {\n /* Mimic python modulo - result takes sign of the divisor\n * if one operand is negative. */\n return -(Math.floor(l / r) * r - l);\n }\n\n return l % r;\n\n default:\n throw 'Unknown operator: ' + op['operator'];\n }\n }\n\n return null;\n}\n\nfunction _isArrayEqual(l, r) {\n if (l === r) return true;\n if (l === null || r === null) return false;\n if (l.length !== r.length) return false;\n\n for (var i = 0; i < l.length; i++) {\n if (l[i] !== r[i]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction _isEqual(l, r) {\n if (l === null && l === r) {\n return true;\n }\n\n if (typeof l === typeof r) {\n switch (typeof l) {\n case 'number':\n case 'string':\n case 'boolean':\n return l === r;\n\n case 'object':\n if (_.isArray(l) && _.isArray(r)) {\n return _isArrayEqual(l, r);\n }\n\n if (_.isDate(l) && _.isDate(r)) {\n return l.getTime() === r.getTime();\n }\n\n if (_.isObject(l) && _.isObject(r)) {\n return JSON.stringify(l) === JSON.stringify(r);\n }\n\n }\n }\n\n return false;\n}\n\nfunction evaluateEquality(op, properties) {\n if (!op['operator'] || [EQUALS_OPERATOR, NOT_EQUALS_OPERATOR].indexOf(op['operator']) === -1 || !op['children'] || op['children'].length !== 2) {\n throw 'Invalid equality operator ' + op;\n }\n\n var v = _isEqual(evaluateSelector(op['children'][0], properties), evaluateSelector(op['children'][1], properties));\n\n switch (op['operator']) {\n case EQUALS_OPERATOR:\n return v;\n\n case NOT_EQUALS_OPERATOR:\n return !v;\n }\n}\n\nfunction evaluateComparison(op, properties) {\n if (!op['operator'] || [GREATER_OPERATOR, GREATER_EQUAL_OPERATOR, LESS_OPERATOR, LESS_EQUAL_OPERATOR].indexOf(op['operator']) === -1 || !op['children'] || op['children'].length !== 2) {\n throw 'Invalid comparison operator ' + op;\n }\n\n var l = evaluateSelector(op['children'][0], properties);\n var r = evaluateSelector(op['children'][1], properties);\n\n if (typeof l === typeof r) {\n if (typeof r === 'number' || _.isDate(r)) {\n l = toNumber(l);\n r = toNumber(r);\n\n switch (op['operator']) {\n case GREATER_OPERATOR:\n return l > r;\n\n case GREATER_EQUAL_OPERATOR:\n return l >= r;\n\n case LESS_OPERATOR:\n return l < r;\n\n case LESS_EQUAL_OPERATOR:\n return l <= r;\n }\n } else if (typeof r === 'string') {\n var compare = l.localeCompare(r);\n\n switch (op['operator']) {\n case GREATER_OPERATOR:\n return compare > 0;\n\n case GREATER_EQUAL_OPERATOR:\n return compare >= 0;\n\n case LESS_OPERATOR:\n return compare < 0;\n\n case LESS_EQUAL_OPERATOR:\n return compare <= 0;\n }\n }\n }\n\n return null;\n}\n\nfunction evaluateDefined(op, properties) {\n if (!op['operator'] || [DEFINED_OPERATOR, NOT_DEFINED_OPERATOR].indexOf(op['operator']) === -1 || !op['children'] || op['children'].length !== 1) {\n throw 'Invalid defined/not defined operator: ' + op;\n }\n\n var b = evaluateSelector(op['children'][0], properties) !== null;\n\n if (op['operator'] === NOT_DEFINED_OPERATOR) {\n return !b;\n }\n\n return b;\n}\n\nfunction evaluateNot(op, properties) {\n if (!op['operator'] || op['operator'] !== NOT_OPERATOR || !op['children'] || op['children'].length !== 1) {\n throw 'Invalid not operator: ' + op;\n }\n\n var v = evaluateSelector(op['children'][0], properties);\n\n if (v === null) {\n return true;\n }\n\n if (typeof v === 'boolean') {\n return !v;\n }\n\n return null;\n}\n\nfunction evaluateOperator(op, properties) {\n if (!op['operator']) {\n throw 'Invalid operator: operator key missing ' + op;\n }\n\n switch (op['operator']) {\n case AND_OPERATOR:\n return evaluateAnd(op, properties);\n\n case OR_OPERATOR:\n return evaluateOr(op, properties);\n\n case IN_OPERATOR:\n case NOT_IN_OPERATOR:\n return evaluateIn(op, properties);\n\n case PLUS_OPERATOR:\n return evaluatePlus(op, properties);\n\n case MINUS_OPERATOR:\n case MUL_OPERATOR:\n case DIV_OPERATOR:\n case MOD_OPERATOR:\n return evaluateArithmetic(op, properties);\n\n case EQUALS_OPERATOR:\n case NOT_EQUALS_OPERATOR:\n return evaluateEquality(op, properties);\n\n case GREATER_OPERATOR:\n case LESS_OPERATOR:\n case GREATER_EQUAL_OPERATOR:\n case LESS_EQUAL_OPERATOR:\n return evaluateComparison(op, properties);\n\n case BOOLEAN_OPERATOR:\n return evaluateBoolean(op, properties);\n\n case DATETIME_OPERATOR:\n return evaluateDateTime(op, properties);\n\n case LIST_OPERATOR:\n return evaluateList(op, properties);\n\n case NUMBER_OPERATOR:\n return evaluateNumber(op, properties);\n\n case STRING_OPERATOR:\n return evaluateString(op, properties);\n\n case DEFINED_OPERATOR:\n case NOT_DEFINED_OPERATOR:\n return evaluateDefined(op, properties);\n\n case NOT_OPERATOR:\n return evaluateNot(op, properties);\n }\n}\n\nfunction evaluateWindow(value) {\n var win = value[WINDOW_KEY];\n\n if (!win || !win[UNIT_KEY] || !win[VALUE_KEY]) {\n throw 'Invalid window: missing required keys ' + JSON.stringify(value);\n }\n\n var out = new Date();\n\n switch (win[UNIT_KEY]) {\n case HOUR_KEY:\n out.setTime(out.getTime() + win[VALUE_KEY] * -1 * 60 * 60 * 1000);\n break;\n\n case DAY_KEY:\n out.setTime(out.getTime() + win[VALUE_KEY] * -1 * 24 * 60 * 60 * 1000);\n break;\n\n case WEEK_KEY:\n out.setTime(out.getTime() + win[VALUE_KEY] * -1 * 7 * 24 * 60 * 60 * 1000);\n break;\n\n case MONTH_KEY:\n out.setTime(out.getTime() + win[VALUE_KEY] * -1 * 30 * 24 * 60 * 60 * 1000);\n break;\n\n default:\n throw 'Invalid unit: ' + win[UNIT_KEY];\n }\n\n return out;\n}\n\nfunction evaluateOperand(op, properties) {\n if (!op['property'] || !op['value']) {\n throw 'Invalid operand: missing required keys ' + op;\n }\n\n switch (op['property']) {\n case EVENT_PROPERTY:\n if (properties[op['value']] !== undefined) {\n return properties[op['value']];\n }\n\n return null;\n\n case LITERAL_PROPERTY:\n if (op['value'] === NOW_LITERAL) {\n return new Date();\n }\n\n if (typeof op['value'] === 'object') {\n return evaluateWindow(op['value']);\n }\n\n return op['value'];\n\n default:\n throw 'Invalid operand: Invalid property type ' + op['property'];\n }\n}\n\nfunction evaluateSelector(filters, properties) {\n if (filters[PROPERTY_KEY]) {\n return evaluateOperand(filters, properties);\n }\n\n if (filters[OPERATOR_KEY]) {\n return evaluateOperator(filters, properties);\n }\n} // Internal class for notification display\n\n\nvar MixpanelNotification = function MixpanelNotification(notif_data, mixpanel_instance) {\n _.bind_instance_methods(this);\n\n this.mixpanel = mixpanel_instance;\n this.persistence = this.mixpanel['persistence'];\n this.resource_protocol = this.mixpanel.get_config('inapp_protocol');\n this.cdn_host = this.mixpanel.get_config('cdn');\n this.campaign_id = _.escapeHTML(notif_data['id']);\n this.message_id = _.escapeHTML(notif_data['message_id']);\n this.body = (_.escapeHTML(notif_data['body']) || '').replace(/\\n/g, '
');\n this.cta = _.escapeHTML(notif_data['cta']) || 'Close';\n this.notif_type = _.escapeHTML(notif_data['type']) || 'takeover';\n this.style = _.escapeHTML(notif_data['style']) || 'light';\n this.title = _.escapeHTML(notif_data['title']) || '';\n this.video_width = MixpanelNotification.VIDEO_WIDTH;\n this.video_height = MixpanelNotification.VIDEO_HEIGHT;\n this.display_triggers = notif_data['display_triggers'] || []; // These fields are url-sanitized in the backend already.\n\n this.dest_url = notif_data['cta_url'] || null;\n this.image_url = notif_data['image_url'] || null;\n this.thumb_image_url = notif_data['thumb_image_url'] || null;\n this.video_url = notif_data['video_url'] || null;\n\n if (this.thumb_image_url && this.thumb_image_url.indexOf('//') === 0) {\n this.thumb_image_url = this.thumb_image_url.replace('//', this.resource_protocol);\n }\n\n this.clickthrough = true;\n\n if (!this.dest_url) {\n this.dest_url = '#dismiss';\n this.clickthrough = false;\n }\n\n this.mini = this.notif_type === 'mini';\n\n if (!this.mini) {\n this.notif_type = 'takeover';\n }\n\n this.notif_width = !this.mini ? MixpanelNotification.NOTIF_WIDTH : MixpanelNotification.NOTIF_WIDTH_MINI;\n\n this._set_client_config();\n\n this.imgs_to_preload = this._init_image_html();\n\n this._init_video();\n};\n\nMixpanelNotification.ANIM_TIME = 200;\nMixpanelNotification.MARKUP_PREFIX = 'mixpanel-notification';\nMixpanelNotification.BG_OPACITY = 0.6;\nMixpanelNotification.NOTIF_TOP = 25;\nMixpanelNotification.NOTIF_START_TOP = 200;\nMixpanelNotification.NOTIF_WIDTH = 388;\nMixpanelNotification.NOTIF_WIDTH_MINI = 420;\nMixpanelNotification.NOTIF_HEIGHT_MINI = 85;\nMixpanelNotification.THUMB_BORDER_SIZE = 5;\nMixpanelNotification.THUMB_IMG_SIZE = 60;\nMixpanelNotification.THUMB_OFFSET = Math.round(MixpanelNotification.THUMB_IMG_SIZE / 2);\nMixpanelNotification.VIDEO_WIDTH = 595;\nMixpanelNotification.VIDEO_HEIGHT = 334;\n\nMixpanelNotification.prototype.show = function () {\n var self = this;\n\n this._set_client_config(); // don't display until HTML body exists\n\n\n if (!this.body_el) {\n setTimeout(function () {\n self.show();\n }, 300);\n return;\n }\n\n this._init_styles();\n\n this._init_notification_el(); // wait for any images to load before showing notification\n\n\n this._preload_images(this._attach_and_animate);\n};\n\nMixpanelNotification.prototype.dismiss = _.safewrap(function () {\n if (!this.marked_as_shown) {\n // unexpected condition: user interacted with notif even though we didn't consider it\n // visible (see _mark_as_shown()); send tracking signals to mark delivery\n this._mark_delivery({\n 'invisible': true\n });\n }\n\n var exiting_el = this.showing_video ? this._get_el('video') : this._get_notification_display_el();\n\n if (this.use_transitions) {\n this._remove_class('bg', 'visible');\n\n this._add_class(exiting_el, 'exiting');\n\n setTimeout(this._remove_notification_el, MixpanelNotification.ANIM_TIME);\n } else {\n var notif_attr, notif_start, notif_goal;\n\n if (this.mini) {\n notif_attr = 'right';\n notif_start = 20;\n notif_goal = -100;\n } else {\n notif_attr = 'top';\n notif_start = MixpanelNotification.NOTIF_TOP;\n notif_goal = MixpanelNotification.NOTIF_START_TOP + MixpanelNotification.NOTIF_TOP;\n }\n\n this._animate_els([{\n el: this._get_el('bg'),\n attr: 'opacity',\n start: MixpanelNotification.BG_OPACITY,\n goal: 0.0\n }, {\n el: exiting_el,\n attr: 'opacity',\n start: 1.0,\n goal: 0.0\n }, {\n el: exiting_el,\n attr: notif_attr,\n start: notif_start,\n goal: notif_goal\n }], MixpanelNotification.ANIM_TIME, this._remove_notification_el);\n }\n});\nMixpanelNotification.prototype._add_class = _.safewrap(function (el, class_name) {\n class_name = MixpanelNotification.MARKUP_PREFIX + '-' + class_name;\n\n if (typeof el === 'string') {\n el = this._get_el(el);\n }\n\n if (!el.className) {\n el.className = class_name;\n } else if (!~(' ' + el.className + ' ').indexOf(' ' + class_name + ' ')) {\n el.className += ' ' + class_name;\n }\n});\nMixpanelNotification.prototype._remove_class = _.safewrap(function (el, class_name) {\n class_name = MixpanelNotification.MARKUP_PREFIX + '-' + class_name;\n\n if (typeof el === 'string') {\n el = this._get_el(el);\n }\n\n if (el.className) {\n el.className = (' ' + el.className + ' ').replace(' ' + class_name + ' ', '').replace(/^[\\s\\xA0]+/, '').replace(/[\\s\\xA0]+$/, '');\n }\n});\nMixpanelNotification.prototype._animate_els = _.safewrap(function (anims, mss, done_cb, start_time) {\n var self = this,\n in_progress = false,\n ai,\n anim,\n cur_time = 1 * new Date(),\n time_diff;\n start_time = start_time || cur_time;\n time_diff = cur_time - start_time;\n\n for (ai = 0; ai < anims.length; ai++) {\n anim = anims[ai];\n\n if (typeof anim.val === 'undefined') {\n anim.val = anim.start;\n }\n\n if (anim.val !== anim.goal) {\n in_progress = true;\n var anim_diff = anim.goal - anim.start,\n anim_dir = anim.goal >= anim.start ? 1 : -1;\n anim.val = anim.start + anim_diff * time_diff / mss;\n\n if (anim.attr !== 'opacity') {\n anim.val = Math.round(anim.val);\n }\n\n if (anim_dir > 0 && anim.val >= anim.goal || anim_dir < 0 && anim.val <= anim.goal) {\n anim.val = anim.goal;\n }\n }\n }\n\n if (!in_progress) {\n if (done_cb) {\n done_cb();\n }\n\n return;\n }\n\n for (ai = 0; ai < anims.length; ai++) {\n anim = anims[ai];\n\n if (anim.el) {\n var suffix = anim.attr === 'opacity' ? '' : 'px';\n anim.el.style[anim.attr] = String(anim.val) + suffix;\n }\n }\n\n setTimeout(function () {\n self._animate_els(anims, mss, done_cb, start_time);\n }, 10);\n});\nMixpanelNotification.prototype._attach_and_animate = _.safewrap(function () {\n var self = this; // no possibility to double-display\n\n if (this.shown || this._get_shown_campaigns()[this.campaign_id]) {\n return;\n }\n\n this.shown = true;\n this.body_el.appendChild(this.notification_el);\n setTimeout(function () {\n var notif_el = self._get_notification_display_el();\n\n if (self.use_transitions) {\n if (!self.mini) {\n self._add_class('bg', 'visible');\n }\n\n self._add_class(notif_el, 'visible');\n\n self._mark_as_shown();\n } else {\n var notif_attr, notif_start, notif_goal;\n\n if (self.mini) {\n notif_attr = 'right';\n notif_start = -100;\n notif_goal = 20;\n } else {\n notif_attr = 'top';\n notif_start = MixpanelNotification.NOTIF_START_TOP + MixpanelNotification.NOTIF_TOP;\n notif_goal = MixpanelNotification.NOTIF_TOP;\n }\n\n self._animate_els([{\n el: self._get_el('bg'),\n attr: 'opacity',\n start: 0.0,\n goal: MixpanelNotification.BG_OPACITY\n }, {\n el: notif_el,\n attr: 'opacity',\n start: 0.0,\n goal: 1.0\n }, {\n el: notif_el,\n attr: notif_attr,\n start: notif_start,\n goal: notif_goal\n }], MixpanelNotification.ANIM_TIME, self._mark_as_shown);\n }\n }, 100);\n\n _.register_event(self._get_el('cancel'), 'click', function (e) {\n e.preventDefault();\n self.dismiss();\n });\n\n var click_el = self._get_el('button') || self._get_el('mini-content');\n\n _.register_event(click_el, 'click', function (e) {\n e.preventDefault();\n\n if (self.show_video) {\n self._track_event('$campaign_open', {\n '$resource_type': 'video'\n });\n\n self._switch_to_video();\n } else {\n self.dismiss();\n\n if (self.clickthrough) {\n var tracking_cb = null;\n\n if (self.mixpanel.get_config('inapp_link_new_window')) {\n window.open(self.dest_url);\n } else {\n tracking_cb = function tracking_cb() {\n window.location.href = self.dest_url;\n };\n }\n\n self._track_event('$campaign_open', {\n '$resource_type': 'link'\n }, tracking_cb);\n }\n }\n });\n});\n\nMixpanelNotification.prototype._get_el = function (id) {\n return document.getElementById(MixpanelNotification.MARKUP_PREFIX + '-' + id);\n};\n\nMixpanelNotification.prototype._get_notification_display_el = function () {\n return this._get_el(this.notif_type);\n};\n\nMixpanelNotification.prototype._get_shown_campaigns = function () {\n return this.persistence['props'][CAMPAIGN_IDS_KEY] || (this.persistence['props'][CAMPAIGN_IDS_KEY] = {});\n};\n\nMixpanelNotification.prototype._matches_event_data = _.safewrap(function (event_data) {\n var event_name = event_data['event'] || '';\n\n for (var i = 0; i < this.display_triggers.length; i++) {\n var display_trigger = this.display_triggers[i];\n var match_event = display_trigger['event'] || '';\n\n if (match_event === '$any_event' || event_name === display_trigger['event']) {\n if (display_trigger['selector'] && !_.isEmptyObject(display_trigger['selector'])) {\n if (evaluateSelector(display_trigger['selector'], event_data['properties'])) {\n return true;\n }\n } else {\n return true;\n }\n }\n }\n\n return false;\n});\n\nMixpanelNotification.prototype._browser_lte = function (browser, version) {\n return this.browser_versions[browser] && this.browser_versions[browser] <= version;\n};\n\nMixpanelNotification.prototype._init_image_html = function () {\n var imgs_to_preload = [];\n\n if (!this.mini) {\n if (this.image_url) {\n imgs_to_preload.push(this.image_url);\n this.img_html = '';\n } else {\n this.img_html = '';\n }\n\n if (this.thumb_image_url) {\n imgs_to_preload.push(this.thumb_image_url);\n this.thumb_img_html = '
' + '' + '
';\n } else {\n this.thumb_img_html = '';\n }\n } else {\n this.thumb_image_url = this.thumb_image_url || this.cdn_host + '/site_media/images/icons/notifications/mini-news-dark.png';\n imgs_to_preload.push(this.thumb_image_url);\n }\n\n return imgs_to_preload;\n};\n\nMixpanelNotification.prototype._init_notification_el = function () {\n var notification_html = '';\n var video_src = '';\n var video_html = '';\n var cancel_html = '
' + '
' + '
';\n this.notification_el = document.createElement('div');\n this.notification_el.id = MixpanelNotification.MARKUP_PREFIX + '-wrapper';\n\n if (!this.mini) {\n // TAKEOVER notification\n var close_html = this.clickthrough || this.show_video ? '' : '
',\n play_html = this.show_video ? '
' : '';\n\n if (this._browser_lte('ie', 7)) {\n close_html = '';\n play_html = '';\n }\n\n notification_html = '
' + this.thumb_img_html + '
' + cancel_html + '
' + this.img_html + '
' + this.title + '
' + '
' + this.body + '
' + '' + '
' + '
' + close_html + '' + this.cta + '' + play_html + '
' + '
' + '
';\n } else {\n // MINI notification\n notification_html = '
' + '
' + cancel_html + '
' + '
' + '
' + '
' + '
' + '
' + this.body + '
' + '
' + '
' + '
' + '
' + '
';\n }\n\n if (this.youtube_video) {\n video_src = this.resource_protocol + 'www.youtube.com/embed/' + this.youtube_video + '?wmode=transparent&showinfo=0&modestbranding=0&rel=0&autoplay=1&loop=0&vq=hd1080';\n\n if (this.yt_custom) {\n video_src += '&enablejsapi=1&html5=1&controls=0';\n video_html = '
' + '
' + '
' + '
' + '
' + '
' + '
';\n }\n } else if (this.vimeo_video) {\n video_src = this.resource_protocol + 'player.vimeo.com/video/' + this.vimeo_video + '?autoplay=1&title=0&byline=0&portrait=0';\n }\n\n if (this.show_video) {\n this.video_iframe = '';\n video_html = '
' + '
' + '
' + video_html + '
' + '
';\n }\n\n var main_html = video_html + notification_html;\n\n if (this.flip_animate) {\n main_html = (this.mini ? notification_html : '') + '
' + (this.mini ? video_html : main_html) + '
';\n }\n\n this.notification_el.innerHTML = ('
' + '
' + '
' + '
' + main_html + '
' + '
' + '
').replace(/class=\"/g, 'class=\"' + MixpanelNotification.MARKUP_PREFIX + '-').replace(/id=\"/g, 'id=\"' + MixpanelNotification.MARKUP_PREFIX + '-');\n};\n\nMixpanelNotification.prototype._init_styles = function () {\n if (this.style === 'dark') {\n this.style_vals = {\n bg: '#1d1f25',\n bg_actions: '#282b32',\n bg_hover: '#3a4147',\n bg_light: '#4a5157',\n border_gray: '#32353c',\n cancel_opacity: '0.4',\n mini_hover: '#2a3137',\n text_title: '#fff',\n text_main: '#9498a3',\n text_tagline: '#464851',\n text_hover: '#ddd'\n };\n } else {\n this.style_vals = {\n bg: '#fff',\n bg_actions: '#e7eaee',\n bg_hover: '#eceff3',\n bg_light: '#f5f5f5',\n border_gray: '#e4ecf2',\n cancel_opacity: '1.0',\n mini_hover: '#fafafa',\n text_title: '#5c6578',\n text_main: '#8b949b',\n text_tagline: '#ced9e6',\n text_hover: '#7c8598'\n };\n }\n\n var shadow = '0px 0px 35px 0px rgba(45, 49, 56, 0.7)',\n video_shadow = shadow,\n mini_shadow = shadow,\n thumb_total_size = MixpanelNotification.THUMB_IMG_SIZE + MixpanelNotification.THUMB_BORDER_SIZE * 2,\n anim_seconds = MixpanelNotification.ANIM_TIME / 1000 + 's';\n\n if (this.mini) {\n shadow = 'none';\n } // don't display on small viewports\n\n\n var notif_media_queries = {},\n min_width = MixpanelNotification.NOTIF_WIDTH_MINI + 20;\n notif_media_queries['@media only screen and (max-width: ' + (min_width - 1) + 'px)'] = {\n '#overlay': {\n 'display': 'none'\n }\n };\n var notif_styles = {\n '.flipped': {\n 'transform': 'rotateY(180deg)'\n },\n '#overlay': {\n 'position': 'fixed',\n 'top': '0',\n 'left': '0',\n 'width': '100%',\n 'height': '100%',\n 'overflow': 'auto',\n 'text-align': 'center',\n 'z-index': '10000',\n 'font-family': '\"Helvetica\", \"Arial\", sans-serif',\n '-webkit-font-smoothing': 'antialiased',\n '-moz-osx-font-smoothing': 'grayscale'\n },\n '#overlay.mini': {\n 'height': '0',\n 'overflow': 'visible'\n },\n '#overlay a': {\n 'width': 'initial',\n 'padding': '0',\n 'text-decoration': 'none',\n 'text-transform': 'none',\n 'color': 'inherit'\n },\n '#bgwrapper': {\n 'position': 'relative',\n 'width': '100%',\n 'height': '100%'\n },\n '#bg': {\n 'position': 'fixed',\n 'top': '0',\n 'left': '0',\n 'width': '100%',\n 'height': '100%',\n 'min-width': this.doc_width * 4 + 'px',\n 'min-height': this.doc_height * 4 + 'px',\n 'background-color': 'black',\n 'opacity': '0.0',\n '-ms-filter': 'progid:DXImageTransform.Microsoft.Alpha(Opacity=60)',\n // IE8\n 'filter': 'alpha(opacity=60)',\n // IE5-7\n 'transition': 'opacity ' + anim_seconds\n },\n '#bg.visible': {\n 'opacity': MixpanelNotification.BG_OPACITY\n },\n '.mini #bg': {\n 'width': '0',\n 'height': '0',\n 'min-width': '0'\n },\n '#flipcontainer': {\n 'perspective': '1000px',\n 'position': 'absolute',\n 'width': '100%'\n },\n '#flipper': {\n 'position': 'relative',\n 'transform-style': 'preserve-3d',\n 'transition': '0.3s'\n },\n '#takeover': {\n 'position': 'absolute',\n 'left': '50%',\n 'width': MixpanelNotification.NOTIF_WIDTH + 'px',\n 'margin-left': Math.round(-MixpanelNotification.NOTIF_WIDTH / 2) + 'px',\n 'backface-visibility': 'hidden',\n 'transform': 'rotateY(0deg)',\n 'opacity': '0.0',\n 'top': MixpanelNotification.NOTIF_START_TOP + 'px',\n 'transition': 'opacity ' + anim_seconds + ', top ' + anim_seconds\n },\n '#takeover.visible': {\n 'opacity': '1.0',\n 'top': MixpanelNotification.NOTIF_TOP + 'px'\n },\n '#takeover.exiting': {\n 'opacity': '0.0',\n 'top': MixpanelNotification.NOTIF_START_TOP + 'px'\n },\n '#thumbspacer': {\n 'height': MixpanelNotification.THUMB_OFFSET + 'px'\n },\n '#thumbborder-wrapper': {\n 'position': 'absolute',\n 'top': -MixpanelNotification.THUMB_BORDER_SIZE + 'px',\n 'left': MixpanelNotification.NOTIF_WIDTH / 2 - MixpanelNotification.THUMB_OFFSET - MixpanelNotification.THUMB_BORDER_SIZE + 'px',\n 'width': thumb_total_size + 'px',\n 'height': thumb_total_size / 2 + 'px',\n 'overflow': 'hidden'\n },\n '#thumbborder': {\n 'position': 'absolute',\n 'width': thumb_total_size + 'px',\n 'height': thumb_total_size + 'px',\n 'border-radius': thumb_total_size + 'px',\n 'background-color': this.style_vals.bg_actions,\n 'opacity': '0.5'\n },\n '#thumbnail': {\n 'position': 'absolute',\n 'top': '0px',\n 'left': MixpanelNotification.NOTIF_WIDTH / 2 - MixpanelNotification.THUMB_OFFSET + 'px',\n 'width': MixpanelNotification.THUMB_IMG_SIZE + 'px',\n 'height': MixpanelNotification.THUMB_IMG_SIZE + 'px',\n 'overflow': 'hidden',\n 'z-index': '100',\n 'border-radius': MixpanelNotification.THUMB_IMG_SIZE + 'px'\n },\n '#mini': {\n 'position': 'absolute',\n 'right': '20px',\n 'top': MixpanelNotification.NOTIF_TOP + 'px',\n 'width': this.notif_width + 'px',\n 'height': MixpanelNotification.NOTIF_HEIGHT_MINI * 2 + 'px',\n 'margin-top': 20 - MixpanelNotification.NOTIF_HEIGHT_MINI + 'px',\n 'backface-visibility': 'hidden',\n 'opacity': '0.0',\n 'transform': 'rotateX(90deg)',\n 'transition': 'opacity 0.3s, transform 0.3s, right 0.3s'\n },\n '#mini.visible': {\n 'opacity': '1.0',\n 'transform': 'rotateX(0deg)'\n },\n '#mini.exiting': {\n 'opacity': '0.0',\n 'right': '-150px'\n },\n '#mainbox': {\n 'border-radius': '4px',\n 'box-shadow': shadow,\n 'text-align': 'center',\n 'background-color': this.style_vals.bg,\n 'font-size': '14px',\n 'color': this.style_vals.text_main\n },\n '#mini #mainbox': {\n 'height': MixpanelNotification.NOTIF_HEIGHT_MINI + 'px',\n 'margin-top': MixpanelNotification.NOTIF_HEIGHT_MINI + 'px',\n 'border-radius': '3px',\n 'transition': 'background-color ' + anim_seconds\n },\n '#mini-border': {\n 'height': MixpanelNotification.NOTIF_HEIGHT_MINI + 6 + 'px',\n 'width': MixpanelNotification.NOTIF_WIDTH_MINI + 6 + 'px',\n 'position': 'absolute',\n 'top': '-3px',\n 'left': '-3px',\n 'margin-top': MixpanelNotification.NOTIF_HEIGHT_MINI + 'px',\n 'border-radius': '6px',\n 'opacity': '0.25',\n 'background-color': '#fff',\n 'z-index': '-1',\n 'box-shadow': mini_shadow\n },\n '#mini-icon': {\n 'position': 'relative',\n 'display': 'inline-block',\n 'width': '75px',\n 'height': MixpanelNotification.NOTIF_HEIGHT_MINI + 'px',\n 'border-radius': '3px 0 0 3px',\n 'background-color': this.style_vals.bg_actions,\n 'background': 'linear-gradient(135deg, ' + this.style_vals.bg_light + ' 0%, ' + this.style_vals.bg_actions + ' 100%)',\n 'transition': 'background-color ' + anim_seconds\n },\n '#mini:hover #mini-icon': {\n 'background-color': this.style_vals.mini_hover\n },\n '#mini:hover #mainbox': {\n 'background-color': this.style_vals.mini_hover\n },\n '#mini-icon-img': {\n 'position': 'absolute',\n 'background-image': 'url(' + this.thumb_image_url + ')',\n 'width': '48px',\n 'height': '48px',\n 'top': '20px',\n 'left': '12px'\n },\n '#content': {\n 'padding': '30px 20px 0px 20px'\n },\n '#mini-content': {\n 'text-align': 'left',\n 'height': MixpanelNotification.NOTIF_HEIGHT_MINI + 'px',\n 'cursor': 'pointer'\n },\n '#img': {\n 'width': '328px',\n 'margin-top': '30px',\n 'border-radius': '5px'\n },\n '#title': {\n 'max-height': '600px',\n 'overflow': 'hidden',\n 'word-wrap': 'break-word',\n 'padding': '25px 0px 20px 0px',\n 'font-size': '19px',\n 'font-weight': 'bold',\n 'color': this.style_vals.text_title\n },\n '#body': {\n 'max-height': '600px',\n 'margin-bottom': '25px',\n 'overflow': 'hidden',\n 'word-wrap': 'break-word',\n 'line-height': '21px',\n 'font-size': '15px',\n 'font-weight': 'normal',\n 'text-align': 'left'\n },\n '#mini #body': {\n 'display': 'inline-block',\n 'max-width': '250px',\n 'margin': '0 0 0 30px',\n 'height': MixpanelNotification.NOTIF_HEIGHT_MINI + 'px',\n 'font-size': '16px',\n 'letter-spacing': '0.8px',\n 'color': this.style_vals.text_title\n },\n '#mini #body-text': {\n 'display': 'table',\n 'height': MixpanelNotification.NOTIF_HEIGHT_MINI + 'px'\n },\n '#mini #body-text div': {\n 'display': 'table-cell',\n 'vertical-align': 'middle'\n },\n '#tagline': {\n 'margin-bottom': '15px',\n 'font-size': '10px',\n 'font-weight': '600',\n 'letter-spacing': '0.8px',\n 'color': '#ccd7e0',\n 'text-align': 'left'\n },\n '#tagline a': {\n 'color': this.style_vals.text_tagline,\n 'transition': 'color ' + anim_seconds\n },\n '#tagline a:hover': {\n 'color': this.style_vals.text_hover\n },\n '#cancel': {\n 'position': 'absolute',\n 'right': '0',\n 'width': '8px',\n 'height': '8px',\n 'padding': '10px',\n 'border-radius': '20px',\n 'margin': '12px 12px 0 0',\n 'box-sizing': 'content-box',\n 'cursor': 'pointer',\n 'transition': 'background-color ' + anim_seconds\n },\n '#mini #cancel': {\n 'margin': '7px 7px 0 0'\n },\n '#cancel-icon': {\n 'width': '8px',\n 'height': '8px',\n 'overflow': 'hidden',\n 'background-image': 'url(' + this.cdn_host + '/site_media/images/icons/notifications/cancel-x.png)',\n 'opacity': this.style_vals.cancel_opacity\n },\n '#cancel:hover': {\n 'background-color': this.style_vals.bg_hover\n },\n '#button': {\n 'display': 'block',\n 'height': '60px',\n 'line-height': '60px',\n 'text-align': 'center',\n 'background-color': this.style_vals.bg_actions,\n 'border-radius': '0 0 4px 4px',\n 'overflow': 'hidden',\n 'cursor': 'pointer',\n 'transition': 'background-color ' + anim_seconds\n },\n '#button-close': {\n 'display': 'inline-block',\n 'width': '9px',\n 'height': '60px',\n 'margin-right': '8px',\n 'vertical-align': 'top',\n 'background-image': 'url(' + this.cdn_host + '/site_media/images/icons/notifications/close-x-' + this.style + '.png)',\n 'background-repeat': 'no-repeat',\n 'background-position': '0px 25px'\n },\n '#button-play': {\n 'display': 'inline-block',\n 'width': '30px',\n 'height': '60px',\n 'margin-left': '15px',\n 'background-image': 'url(' + this.cdn_host + '/site_media/images/icons/notifications/play-' + this.style + '-small.png)',\n 'background-repeat': 'no-repeat',\n 'background-position': '0px 15px'\n },\n 'a#button-link': {\n 'display': 'inline-block',\n 'vertical-align': 'top',\n 'text-align': 'center',\n 'font-size': '17px',\n 'font-weight': 'bold',\n 'overflow': 'hidden',\n 'word-wrap': 'break-word',\n 'color': this.style_vals.text_title,\n 'transition': 'color ' + anim_seconds\n },\n '#button:hover': {\n 'background-color': this.style_vals.bg_hover,\n 'color': this.style_vals.text_hover\n },\n '#button:hover a': {\n 'color': this.style_vals.text_hover\n },\n '#video-noflip': {\n 'position': 'relative',\n 'top': -this.video_height * 2 + 'px'\n },\n '#video-flip': {\n 'backface-visibility': 'hidden',\n 'transform': 'rotateY(180deg)'\n },\n '#video': {\n 'position': 'absolute',\n 'width': this.video_width - 1 + 'px',\n 'height': this.video_height + 'px',\n 'top': MixpanelNotification.NOTIF_TOP + 'px',\n 'margin-top': '100px',\n 'left': '50%',\n 'margin-left': Math.round(-this.video_width / 2) + 'px',\n 'overflow': 'hidden',\n 'border-radius': '5px',\n 'box-shadow': video_shadow,\n 'transform': 'translateZ(1px)',\n // webkit rendering bug http://stackoverflow.com/questions/18167981/clickable-link-area-unexpectedly-smaller-after-css-transform\n 'transition': 'opacity ' + anim_seconds + ', top ' + anim_seconds\n },\n '#video.exiting': {\n 'opacity': '0.0',\n 'top': this.video_height + 'px'\n },\n '#video-holder': {\n 'position': 'absolute',\n 'width': this.video_width - 1 + 'px',\n 'height': this.video_height + 'px',\n 'overflow': 'hidden',\n 'border-radius': '5px'\n },\n '#video-frame': {\n 'margin-left': '-1px',\n 'width': this.video_width + 'px'\n },\n '#video-controls': {\n 'opacity': '0',\n 'transition': 'opacity 0.5s'\n },\n '#video:hover #video-controls': {\n 'opacity': '1.0'\n },\n '#video .video-progress-el': {\n 'position': 'absolute',\n 'bottom': '0',\n 'height': '25px',\n 'border-radius': '0 0 0 5px'\n },\n '#video-progress': {\n 'width': '90%'\n },\n '#video-progress-total': {\n 'width': '100%',\n 'background-color': this.style_vals.bg,\n 'opacity': '0.7'\n },\n '#video-elapsed': {\n 'width': '0',\n 'background-color': '#6cb6f5',\n 'opacity': '0.9'\n },\n '#video #video-time': {\n 'width': '10%',\n 'right': '0',\n 'font-size': '11px',\n 'line-height': '25px',\n 'color': this.style_vals.text_main,\n 'background-color': '#666',\n 'border-radius': '0 0 5px 0'\n }\n }; // IE hacks\n\n if (this._browser_lte('ie', 8)) {\n _.extend(notif_styles, {\n '* html #overlay': {\n 'position': 'absolute'\n },\n '* html #bg': {\n 'position': 'absolute'\n },\n 'html, body': {\n 'height': '100%'\n }\n });\n }\n\n if (this._browser_lte('ie', 7)) {\n _.extend(notif_styles, {\n '#mini #body': {\n 'display': 'inline',\n 'zoom': '1',\n 'border': '1px solid ' + this.style_vals.bg_hover\n },\n '#mini #body-text': {\n 'padding': '20px'\n },\n '#mini #mini-icon': {\n 'display': 'none'\n }\n });\n } // add vendor-prefixed style rules\n\n\n var VENDOR_STYLES = ['backface-visibility', 'border-radius', 'box-shadow', 'opacity', 'perspective', 'transform', 'transform-style', 'transition'],\n VENDOR_PREFIXES = ['khtml', 'moz', 'ms', 'o', 'webkit'];\n\n for (var selector in notif_styles) {\n for (var si = 0; si < VENDOR_STYLES.length; si++) {\n var prop = VENDOR_STYLES[si];\n\n if (prop in notif_styles[selector]) {\n var val = notif_styles[selector][prop];\n\n for (var pi = 0; pi < VENDOR_PREFIXES.length; pi++) {\n notif_styles[selector]['-' + VENDOR_PREFIXES[pi] + '-' + prop] = val;\n }\n }\n }\n }\n\n var inject_styles = function inject_styles(styles, media_queries) {\n var create_style_text = function create_style_text(style_defs) {\n var st = '';\n\n for (var selector in style_defs) {\n var mp_selector = selector.replace(/#/g, '#' + MixpanelNotification.MARKUP_PREFIX + '-').replace(/\\./g, '.' + MixpanelNotification.MARKUP_PREFIX + '-');\n st += '\\n' + mp_selector + ' {';\n var props = style_defs[selector];\n\n for (var k in props) {\n st += k + ':' + props[k] + ';';\n }\n\n st += '}';\n }\n\n return st;\n };\n\n var create_media_query_text = function create_media_query_text(mq_defs) {\n var mqt = '';\n\n for (var mq in mq_defs) {\n mqt += '\\n' + mq + ' {' + create_style_text(mq_defs[mq]) + '\\n}';\n }\n\n return mqt;\n };\n\n var style_text = create_style_text(styles) + create_media_query_text(media_queries),\n head_el = document.head || document.getElementsByTagName('head')[0] || document.documentElement,\n style_el = document.createElement('style');\n head_el.appendChild(style_el);\n style_el.setAttribute('type', 'text/css');\n\n if (style_el.styleSheet) {\n // IE\n style_el.styleSheet.cssText = style_text;\n } else {\n style_el.textContent = style_text;\n }\n };\n\n inject_styles(notif_styles, notif_media_queries);\n};\n\nMixpanelNotification.prototype._init_video = _.safewrap(function () {\n if (!this.video_url) {\n return;\n }\n\n var self = this; // Youtube iframe API compatibility\n\n self.yt_custom = 'postMessage' in window;\n self.dest_url = self.video_url;\n var youtube_match = self.video_url.match( // http://stackoverflow.com/questions/2936467/parse-youtube-video-id-using-preg-match\n /(?:youtube(?:-nocookie)?\\.com\\/(?:[^/]+\\/.+\\/|(?:v|e(?:mbed)?)\\/|.*[?&]v=)|youtu\\.be\\/)([^\"&?/ ]{11})/i),\n vimeo_match = self.video_url.match(/vimeo\\.com\\/.*?(\\d+)/i);\n\n if (youtube_match) {\n self.show_video = true;\n self.youtube_video = youtube_match[1];\n\n if (self.yt_custom) {\n window['onYouTubeIframeAPIReady'] = function () {\n if (self._get_el('video-frame')) {\n self._yt_video_ready();\n }\n }; // load Youtube iframe API; see https://developers.google.com/youtube/iframe_api_reference\n\n\n var tag = document.createElement('script');\n tag.src = self.resource_protocol + 'www.youtube.com/iframe_api';\n var firstScriptTag = document.getElementsByTagName('script')[0];\n firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n }\n } else if (vimeo_match) {\n self.show_video = true;\n self.vimeo_video = vimeo_match[1];\n } // IE <= 7, FF <= 3: fall through to video link rather than embedded player\n\n\n if (self._browser_lte('ie', 7) || self._browser_lte('firefox', 3)) {\n self.show_video = false;\n self.clickthrough = true;\n }\n});\nMixpanelNotification.prototype._mark_as_shown = _.safewrap(function () {\n // click on background to dismiss\n var self = this;\n\n _.register_event(self._get_el('bg'), 'click', function () {\n self.dismiss();\n });\n\n var get_style = function get_style(el, style_name) {\n var styles = {};\n\n if (document.defaultView && document.defaultView.getComputedStyle) {\n styles = document.defaultView.getComputedStyle(el, null); // FF3 requires both args\n } else if (el.currentStyle) {\n // IE\n styles = el.currentStyle;\n }\n\n return styles[style_name];\n };\n\n if (this.campaign_id) {\n var notif_el = this._get_el('overlay');\n\n if (notif_el && get_style(notif_el, 'visibility') !== 'hidden' && get_style(notif_el, 'display') !== 'none') {\n this._mark_delivery();\n }\n }\n});\nMixpanelNotification.prototype._mark_delivery = _.safewrap(function (extra_props) {\n if (!this.marked_as_shown) {\n this.marked_as_shown = true;\n\n if (this.campaign_id) {\n // mark notification shown (local cache)\n this._get_shown_campaigns()[this.campaign_id] = 1 * new Date();\n this.persistence.save();\n } // track delivery\n\n\n this._track_event('$campaign_delivery', extra_props); // mark notification shown (mixpanel property)\n\n\n this.mixpanel['people']['append']({\n '$campaigns': this.campaign_id,\n '$notifications': {\n 'campaign_id': this.campaign_id,\n 'message_id': this.message_id,\n 'type': 'web',\n 'time': new Date()\n }\n });\n }\n});\n\nMixpanelNotification.prototype._preload_images = function (all_loaded_cb) {\n var self = this;\n\n if (this.imgs_to_preload.length === 0) {\n all_loaded_cb();\n return;\n }\n\n var preloaded_imgs = 0;\n var img_objs = [];\n\n var onload = function onload() {\n preloaded_imgs++;\n\n if (preloaded_imgs === self.imgs_to_preload.length && all_loaded_cb) {\n all_loaded_cb();\n all_loaded_cb = null;\n }\n };\n\n for (var i = 0; i < this.imgs_to_preload.length; i++) {\n var img = new Image();\n img.onload = onload;\n img.src = this.imgs_to_preload[i];\n\n if (img.complete) {\n onload();\n }\n\n img_objs.push(img);\n } // IE6/7 doesn't fire onload reliably\n\n\n if (this._browser_lte('ie', 7)) {\n setTimeout(function () {\n var imgs_loaded = true;\n\n for (i = 0; i < img_objs.length; i++) {\n if (!img_objs[i].complete) {\n imgs_loaded = false;\n }\n }\n\n if (imgs_loaded && all_loaded_cb) {\n all_loaded_cb();\n all_loaded_cb = null;\n }\n }, 500);\n }\n};\n\nMixpanelNotification.prototype._remove_notification_el = _.safewrap(function () {\n window.clearInterval(this._video_progress_checker);\n this.notification_el.style.visibility = 'hidden';\n this.body_el.removeChild(this.notification_el);\n});\n\nMixpanelNotification.prototype._set_client_config = function () {\n var get_browser_version = function get_browser_version(browser_ex) {\n var match = navigator.userAgent.match(browser_ex);\n return match && match[1];\n };\n\n this.browser_versions = {};\n this.browser_versions['chrome'] = get_browser_version(/Chrome\\/(\\d+)/);\n this.browser_versions['firefox'] = get_browser_version(/Firefox\\/(\\d+)/);\n this.browser_versions['ie'] = get_browser_version(/MSIE (\\d+).+/);\n\n if (!this.browser_versions['ie'] && !window.ActiveXObject && 'ActiveXObject' in window) {\n this.browser_versions['ie'] = 11;\n }\n\n this.body_el = document.body || document.getElementsByTagName('body')[0];\n\n if (this.body_el) {\n this.doc_width = Math.max(this.body_el.scrollWidth, document.documentElement.scrollWidth, this.body_el.offsetWidth, document.documentElement.offsetWidth, this.body_el.clientWidth, document.documentElement.clientWidth);\n this.doc_height = Math.max(this.body_el.scrollHeight, document.documentElement.scrollHeight, this.body_el.offsetHeight, document.documentElement.offsetHeight, this.body_el.clientHeight, document.documentElement.clientHeight);\n } // detect CSS compatibility\n\n\n var ie_ver = this.browser_versions['ie'];\n\n var sample_styles = document.createElement('div').style,\n is_css_compatible = function is_css_compatible(rule) {\n if (rule in sample_styles) {\n return true;\n }\n\n if (!ie_ver) {\n rule = rule[0].toUpperCase() + rule.slice(1);\n var props = ['O' + rule, 'Webkit' + rule, 'Moz' + rule];\n\n for (var i = 0; i < props.length; i++) {\n if (props[i] in sample_styles) {\n return true;\n }\n }\n }\n\n return false;\n };\n\n this.use_transitions = this.body_el && is_css_compatible('transition') && is_css_compatible('transform');\n this.flip_animate = (this.browser_versions['chrome'] >= 33 || this.browser_versions['firefox'] >= 15) && this.body_el && is_css_compatible('backfaceVisibility') && is_css_compatible('perspective') && is_css_compatible('transform');\n};\n\nMixpanelNotification.prototype._switch_to_video = _.safewrap(function () {\n var self = this,\n anims = [{\n el: self._get_notification_display_el(),\n attr: 'opacity',\n start: 1.0,\n goal: 0.0\n }, {\n el: self._get_notification_display_el(),\n attr: 'top',\n start: MixpanelNotification.NOTIF_TOP,\n goal: -500\n }, {\n el: self._get_el('video-noflip'),\n attr: 'opacity',\n start: 0.0,\n goal: 1.0\n }, {\n el: self._get_el('video-noflip'),\n attr: 'top',\n start: -self.video_height * 2,\n goal: 0\n }];\n\n if (self.mini) {\n var bg = self._get_el('bg'),\n overlay = self._get_el('overlay');\n\n bg.style.width = '100%';\n bg.style.height = '100%';\n overlay.style.width = '100%';\n\n self._add_class(self._get_notification_display_el(), 'exiting');\n\n self._add_class(bg, 'visible');\n\n anims.push({\n el: self._get_el('bg'),\n attr: 'opacity',\n start: 0.0,\n goal: MixpanelNotification.BG_OPACITY\n });\n }\n\n var video_el = self._get_el('video-holder');\n\n video_el.innerHTML = self.video_iframe;\n\n var video_ready = function video_ready() {\n if (window['YT'] && window['YT']['loaded']) {\n self._yt_video_ready();\n }\n\n self.showing_video = true;\n self._get_notification_display_el().style.visibility = 'hidden';\n };\n\n if (self.flip_animate) {\n self._add_class('flipper', 'flipped');\n\n setTimeout(video_ready, MixpanelNotification.ANIM_TIME);\n } else {\n self._animate_els(anims, MixpanelNotification.ANIM_TIME, video_ready);\n }\n});\n\nMixpanelNotification.prototype._track_event = function (event_name, properties, cb) {\n if (this.campaign_id) {\n properties = properties || {};\n properties = _.extend(properties, {\n 'campaign_id': this.campaign_id,\n 'message_id': this.message_id,\n 'message_type': 'web_inapp',\n 'message_subtype': this.notif_type\n });\n this.mixpanel['track'](event_name, properties, cb);\n } else if (cb) {\n cb.call();\n }\n};\n\nMixpanelNotification.prototype._yt_video_ready = _.safewrap(function () {\n var self = this;\n\n if (self.video_inited) {\n return;\n }\n\n self.video_inited = true;\n\n var progress_bar = self._get_el('video-elapsed'),\n progress_time = self._get_el('video-time'),\n progress_el = self._get_el('video-progress');\n\n new window['YT']['Player'](MixpanelNotification.MARKUP_PREFIX + '-video-frame', {\n 'events': {\n 'onReady': function onReady(event) {\n var ytplayer = event['target'],\n video_duration = ytplayer['getDuration'](),\n pad = function pad(i) {\n return ('00' + i).slice(-2);\n },\n update_video_time = function update_video_time(current_time) {\n var secs = Math.round(video_duration - current_time),\n mins = Math.floor(secs / 60),\n hours = Math.floor(mins / 60);\n secs -= mins * 60;\n mins -= hours * 60;\n progress_time.innerHTML = '-' + (hours ? hours + ':' : '') + pad(mins) + ':' + pad(secs);\n };\n\n update_video_time(0);\n self._video_progress_checker = window.setInterval(function () {\n var current_time = ytplayer['getCurrentTime']();\n progress_bar.style.width = current_time / video_duration * 100 + '%';\n update_video_time(current_time);\n }, 250);\n\n _.register_event(progress_el, 'click', function (e) {\n var clickx = Math.max(0, e.pageX - progress_el.getBoundingClientRect().left);\n ytplayer['seekTo'](video_duration * clickx / progress_el.clientWidth, true);\n });\n }\n }\n });\n});\n/**\n * Mixpanel People Object\n * @constructor\n */\n\nvar MixpanelPeople = function MixpanelPeople() {};\n\n_.extend(MixpanelPeople.prototype, apiActions);\n\nMixpanelPeople.prototype._init = function (mixpanel_instance) {\n this._mixpanel = mixpanel_instance;\n};\n/*\n* Set properties on a user record.\n*\n* ### Usage:\n*\n* mixpanel.people.set('gender', 'm');\n*\n* // or set multiple properties at once\n* mixpanel.people.set({\n* 'Company': 'Acme',\n* 'Plan': 'Premium',\n* 'Upgrade date': new Date()\n* });\n* // properties can be strings, integers, dates, or lists\n*\n* @param {Object|String} prop If a string, this is the name of the property. If an object, this is an associative array of names and values.\n* @param {*} [to] A value to set on the given property name\n* @param {Function} [callback] If provided, the callback will be called after tracking the event.\n*/\n\n\nMixpanelPeople.prototype.set = addOptOutCheckMixpanelPeople(function (prop, to, callback) {\n var data = this.set_action(prop, to);\n\n if (_.isObject(prop)) {\n callback = to;\n } // make sure that the referrer info has been updated and saved\n\n\n if (this._get_config('save_referrer')) {\n this._mixpanel['persistence'].update_referrer_info(document.referrer);\n } // update $set object with default people properties\n\n\n data[SET_ACTION] = _.extend({}, _.info.people_properties(), this._mixpanel['persistence'].get_referrer_info(), data[SET_ACTION]);\n return this._send_request(data, callback);\n});\n/*\n* Set properties on a user record, only if they do not yet exist.\n* This will not overwrite previous people property values, unlike\n* people.set().\n*\n* ### Usage:\n*\n* mixpanel.people.set_once('First Login Date', new Date());\n*\n* // or set multiple properties at once\n* mixpanel.people.set_once({\n* 'First Login Date': new Date(),\n* 'Starting Plan': 'Premium'\n* });\n*\n* // properties can be strings, integers or dates\n*\n* @param {Object|String} prop If a string, this is the name of the property. If an object, this is an associative array of names and values.\n* @param {*} [to] A value to set on the given property name\n* @param {Function} [callback] If provided, the callback will be called after tracking the event.\n*/\n\nMixpanelPeople.prototype.set_once = addOptOutCheckMixpanelPeople(function (prop, to, callback) {\n var data = this.set_once_action(prop, to);\n\n if (_.isObject(prop)) {\n callback = to;\n }\n\n return this._send_request(data, callback);\n});\n/*\n* Unset properties on a user record (permanently removes the properties and their values from a profile).\n*\n* ### Usage:\n*\n* mixpanel.people.unset('gender');\n*\n* // or unset multiple properties at once\n* mixpanel.people.unset(['gender', 'Company']);\n*\n* @param {Array|String} prop If a string, this is the name of the property. If an array, this is a list of property names.\n* @param {Function} [callback] If provided, the callback will be called after tracking the event.\n*/\n\nMixpanelPeople.prototype.unset = addOptOutCheckMixpanelPeople(function (prop, callback) {\n var data = this.unset_action(prop);\n return this._send_request(data, callback);\n});\n/*\n* Increment/decrement numeric people analytics properties.\n*\n* ### Usage:\n*\n* mixpanel.people.increment('page_views', 1);\n*\n* // or, for convenience, if you're just incrementing a counter by\n* // 1, you can simply do\n* mixpanel.people.increment('page_views');\n*\n* // to decrement a counter, pass a negative number\n* mixpanel.people.increment('credits_left', -1);\n*\n* // like mixpanel.people.set(), you can increment multiple\n* // properties at once:\n* mixpanel.people.increment({\n* counter1: 1,\n* counter2: 6\n* });\n*\n* @param {Object|String} prop If a string, this is the name of the property. If an object, this is an associative array of names and numeric values.\n* @param {Number} [by] An amount to increment the given property\n* @param {Function} [callback] If provided, the callback will be called after tracking the event.\n*/\n\nMixpanelPeople.prototype.increment = addOptOutCheckMixpanelPeople(function (prop, by, callback) {\n var data = {};\n var $add = {};\n\n if (_.isObject(prop)) {\n _.each(prop, function (v, k) {\n if (!this._is_reserved_property(k)) {\n if (isNaN(parseFloat(v))) {\n console$1.error('Invalid increment value passed to mixpanel.people.increment - must be a number');\n return;\n } else {\n $add[k] = v;\n }\n }\n }, this);\n\n callback = by;\n } else {\n // convenience: mixpanel.people.increment('property'); will\n // increment 'property' by 1\n if (_.isUndefined(by)) {\n by = 1;\n }\n\n $add[prop] = by;\n }\n\n data[ADD_ACTION] = $add;\n return this._send_request(data, callback);\n});\n/*\n* Append a value to a list-valued people analytics property.\n*\n* ### Usage:\n*\n* // append a value to a list, creating it if needed\n* mixpanel.people.append('pages_visited', 'homepage');\n*\n* // like mixpanel.people.set(), you can append multiple\n* // properties at once:\n* mixpanel.people.append({\n* list1: 'bob',\n* list2: 123\n* });\n*\n* @param {Object|String} list_name If a string, this is the name of the property. If an object, this is an associative array of names and values.\n* @param {*} [value] value An item to append to the list\n* @param {Function} [callback] If provided, the callback will be called after tracking the event.\n*/\n\nMixpanelPeople.prototype.append = addOptOutCheckMixpanelPeople(function (list_name, value, callback) {\n if (_.isObject(list_name)) {\n callback = value;\n }\n\n var data = this.append_action(list_name, value);\n return this._send_request(data, callback);\n});\n/*\n* Remove a value from a list-valued people analytics property.\n*\n* ### Usage:\n*\n* mixpanel.people.remove('School', 'UCB');\n*\n* @param {Object|String} list_name If a string, this is the name of the property. If an object, this is an associative array of names and values.\n* @param {*} [value] value Item to remove from the list\n* @param {Function} [callback] If provided, the callback will be called after tracking the event.\n*/\n\nMixpanelPeople.prototype.remove = addOptOutCheckMixpanelPeople(function (list_name, value, callback) {\n if (_.isObject(list_name)) {\n callback = value;\n }\n\n var data = this.remove_action(list_name, value);\n return this._send_request(data, callback);\n});\n/*\n* Merge a given list with a list-valued people analytics property,\n* excluding duplicate values.\n*\n* ### Usage:\n*\n* // merge a value to a list, creating it if needed\n* mixpanel.people.union('pages_visited', 'homepage');\n*\n* // like mixpanel.people.set(), you can append multiple\n* // properties at once:\n* mixpanel.people.union({\n* list1: 'bob',\n* list2: 123\n* });\n*\n* // like mixpanel.people.append(), you can append multiple\n* // values to the same list:\n* mixpanel.people.union({\n* list1: ['bob', 'billy']\n* });\n*\n* @param {Object|String} list_name If a string, this is the name of the property. If an object, this is an associative array of names and values.\n* @param {*} [value] Value / values to merge with the given property\n* @param {Function} [callback] If provided, the callback will be called after tracking the event.\n*/\n\nMixpanelPeople.prototype.union = addOptOutCheckMixpanelPeople(function (list_name, values, callback) {\n if (_.isObject(list_name)) {\n callback = values;\n }\n\n var data = this.union_action(list_name, values);\n return this._send_request(data, callback);\n});\n/*\n* Record that you have charged the current user a certain amount\n* of money. Charges recorded with track_charge() will appear in the\n* Mixpanel revenue report.\n*\n* ### Usage:\n*\n* // charge a user $50\n* mixpanel.people.track_charge(50);\n*\n* // charge a user $30.50 on the 2nd of january\n* mixpanel.people.track_charge(30.50, {\n* '$time': new Date('jan 1 2012')\n* });\n*\n* @param {Number} amount The amount of money charged to the current user\n* @param {Object} [properties] An associative array of properties associated with the charge\n* @param {Function} [callback] If provided, the callback will be called when the server responds\n*/\n\nMixpanelPeople.prototype.track_charge = addOptOutCheckMixpanelPeople(function (amount, properties, callback) {\n if (!_.isNumber(amount)) {\n amount = parseFloat(amount);\n\n if (isNaN(amount)) {\n console$1.error('Invalid value passed to mixpanel.people.track_charge - must be a number');\n return;\n }\n }\n\n return this.append('$transactions', _.extend({\n '$amount': amount\n }, properties), callback);\n});\n/*\n* Permanently clear all revenue report transactions from the\n* current user's people analytics profile.\n*\n* ### Usage:\n*\n* mixpanel.people.clear_charges();\n*\n* @param {Function} [callback] If provided, the callback will be called after tracking the event.\n*/\n\nMixpanelPeople.prototype.clear_charges = function (callback) {\n return this.set('$transactions', [], callback);\n};\n/*\n* Permanently deletes the current people analytics profile from\n* Mixpanel (using the current distinct_id).\n*\n* ### Usage:\n*\n* // remove the all data you have stored about the current user\n* mixpanel.people.delete_user();\n*\n*/\n\n\nMixpanelPeople.prototype.delete_user = function () {\n if (!this._identify_called()) {\n console$1.error('mixpanel.people.delete_user() requires you to call identify() first');\n return;\n }\n\n var data = {\n '$delete': this._mixpanel.get_distinct_id()\n };\n return this._send_request(data);\n};\n\nMixpanelPeople.prototype.toString = function () {\n return this._mixpanel.toString() + '.people';\n};\n\nMixpanelPeople.prototype._send_request = function (data, callback) {\n data['$token'] = this._get_config('token');\n data['$distinct_id'] = this._mixpanel.get_distinct_id();\n\n var device_id = this._mixpanel.get_property('$device_id');\n\n var user_id = this._mixpanel.get_property('$user_id');\n\n var had_persisted_distinct_id = this._mixpanel.get_property('$had_persisted_distinct_id');\n\n if (device_id) {\n data['$device_id'] = device_id;\n }\n\n if (user_id) {\n data['$user_id'] = user_id;\n }\n\n if (had_persisted_distinct_id) {\n data['$had_persisted_distinct_id'] = had_persisted_distinct_id;\n }\n\n var date_encoded_data = _.encodeDates(data);\n\n var truncated_data = _.truncate(date_encoded_data, 255);\n\n if (!this._identify_called()) {\n this._enqueue(data);\n\n if (!_.isUndefined(callback)) {\n if (this._get_config('verbose')) {\n callback({\n status: -1,\n error: null\n });\n } else {\n callback(-1);\n }\n }\n\n return truncated_data;\n }\n\n return this._mixpanel._track_or_batch({\n truncated_data: truncated_data,\n endpoint: this._get_config('api_host') + '/engage/',\n batcher: this._mixpanel.request_batchers.people\n }, callback);\n};\n\nMixpanelPeople.prototype._get_config = function (conf_var) {\n return this._mixpanel.get_config(conf_var);\n};\n\nMixpanelPeople.prototype._identify_called = function () {\n return this._mixpanel._flags.identify_called === true;\n}; // Queue up engage operations if identify hasn't been called yet.\n\n\nMixpanelPeople.prototype._enqueue = function (data) {\n if (SET_ACTION in data) {\n this._mixpanel['persistence']._add_to_people_queue(SET_ACTION, data);\n } else if (SET_ONCE_ACTION in data) {\n this._mixpanel['persistence']._add_to_people_queue(SET_ONCE_ACTION, data);\n } else if (UNSET_ACTION in data) {\n this._mixpanel['persistence']._add_to_people_queue(UNSET_ACTION, data);\n } else if (ADD_ACTION in data) {\n this._mixpanel['persistence']._add_to_people_queue(ADD_ACTION, data);\n } else if (APPEND_ACTION in data) {\n this._mixpanel['persistence']._add_to_people_queue(APPEND_ACTION, data);\n } else if (REMOVE_ACTION in data) {\n this._mixpanel['persistence']._add_to_people_queue(REMOVE_ACTION, data);\n } else if (UNION_ACTION in data) {\n this._mixpanel['persistence']._add_to_people_queue(UNION_ACTION, data);\n } else {\n console$1.error('Invalid call to _enqueue():', data);\n }\n};\n\nMixpanelPeople.prototype._flush_one_queue = function (action, action_method, callback, queue_to_params_fn) {\n var _this = this;\n\n var queued_data = _.extend({}, this._mixpanel['persistence']._get_queue(action));\n\n var action_params = queued_data;\n\n if (!_.isUndefined(queued_data) && _.isObject(queued_data) && !_.isEmptyObject(queued_data)) {\n _this._mixpanel['persistence']._pop_from_people_queue(action, queued_data);\n\n if (queue_to_params_fn) {\n action_params = queue_to_params_fn(queued_data);\n }\n\n action_method.call(_this, action_params, function (response, data) {\n // on bad response, we want to add it back to the queue\n if (response === 0) {\n _this._mixpanel['persistence']._add_to_people_queue(action, queued_data);\n }\n\n if (!_.isUndefined(callback)) {\n callback(response, data);\n }\n });\n }\n}; // Flush queued engage operations - order does not matter,\n// and there are network level race conditions anyway\n\n\nMixpanelPeople.prototype._flush = function (_set_callback, _add_callback, _append_callback, _set_once_callback, _union_callback, _unset_callback, _remove_callback) {\n var _this = this;\n\n var $append_queue = this._mixpanel['persistence']._get_queue(APPEND_ACTION);\n\n var $remove_queue = this._mixpanel['persistence']._get_queue(REMOVE_ACTION);\n\n this._flush_one_queue(SET_ACTION, this.set, _set_callback);\n\n this._flush_one_queue(SET_ONCE_ACTION, this.set_once, _set_once_callback);\n\n this._flush_one_queue(UNSET_ACTION, this.unset, _unset_callback, function (queue) {\n return _.keys(queue);\n });\n\n this._flush_one_queue(ADD_ACTION, this.increment, _add_callback);\n\n this._flush_one_queue(UNION_ACTION, this.union, _union_callback); // we have to fire off each $append individually since there is\n // no concat method server side\n\n\n if (!_.isUndefined($append_queue) && _.isArray($append_queue) && $append_queue.length) {\n var $append_item;\n\n var append_callback = function append_callback(response, data) {\n if (response === 0) {\n _this._mixpanel['persistence']._add_to_people_queue(APPEND_ACTION, $append_item);\n }\n\n if (!_.isUndefined(_append_callback)) {\n _append_callback(response, data);\n }\n };\n\n for (var i = $append_queue.length - 1; i >= 0; i--) {\n $append_item = $append_queue.pop();\n\n if (!_.isEmptyObject($append_item)) {\n _this.append($append_item, append_callback);\n }\n } // Save the shortened append queue\n\n\n _this._mixpanel['persistence'].save();\n } // same for $remove\n\n\n if (!_.isUndefined($remove_queue) && _.isArray($remove_queue) && $remove_queue.length) {\n var $remove_item;\n\n var remove_callback = function remove_callback(response, data) {\n if (response === 0) {\n _this._mixpanel['persistence']._add_to_people_queue(REMOVE_ACTION, $remove_item);\n }\n\n if (!_.isUndefined(_remove_callback)) {\n _remove_callback(response, data);\n }\n };\n\n for (var j = $remove_queue.length - 1; j >= 0; j--) {\n $remove_item = $remove_queue.pop();\n\n if (!_.isEmptyObject($remove_item)) {\n _this.remove($remove_item, remove_callback);\n }\n }\n\n _this._mixpanel['persistence'].save();\n }\n};\n\nMixpanelPeople.prototype._is_reserved_property = function (prop) {\n return prop === '$distinct_id' || prop === '$token' || prop === '$device_id' || prop === '$user_id' || prop === '$had_persisted_distinct_id';\n}; // MixpanelPeople Exports\n\n\nMixpanelPeople.prototype['set'] = MixpanelPeople.prototype.set;\nMixpanelPeople.prototype['set_once'] = MixpanelPeople.prototype.set_once;\nMixpanelPeople.prototype['unset'] = MixpanelPeople.prototype.unset;\nMixpanelPeople.prototype['increment'] = MixpanelPeople.prototype.increment;\nMixpanelPeople.prototype['append'] = MixpanelPeople.prototype.append;\nMixpanelPeople.prototype['remove'] = MixpanelPeople.prototype.remove;\nMixpanelPeople.prototype['union'] = MixpanelPeople.prototype.union;\nMixpanelPeople.prototype['track_charge'] = MixpanelPeople.prototype.track_charge;\nMixpanelPeople.prototype['clear_charges'] = MixpanelPeople.prototype.clear_charges;\nMixpanelPeople.prototype['delete_user'] = MixpanelPeople.prototype.delete_user;\nMixpanelPeople.prototype['toString'] = MixpanelPeople.prototype.toString;\n/*\n * Mixpanel JS Library\n *\n * Copyright 2012, Mixpanel, Inc. All Rights Reserved\n * http://mixpanel.com/\n *\n * Includes portions of Underscore.js\n * http://documentcloud.github.com/underscore/\n * (c) 2011 Jeremy Ashkenas, DocumentCloud Inc.\n * Released under the MIT License.\n */\n// ==ClosureCompiler==\n// @compilation_level ADVANCED_OPTIMIZATIONS\n// @output_file_name mixpanel-2.8.min.js\n// ==/ClosureCompiler==\n\n/*\nSIMPLE STYLE GUIDE:\n\nthis.x === public function\nthis._x === internal - only use within this file\nthis.__x === private - only use within the class\n\nGlobals should be all caps\n*/\n\nvar init_type; // MODULE or SNIPPET loader\n\nvar mixpanel_master; // main mixpanel instance / object\n\nvar INIT_MODULE = 0;\nvar INIT_SNIPPET = 1;\n/** @const */\n\nvar PRIMARY_INSTANCE_NAME = 'mixpanel';\n/*\n * Dynamic... constants? Is that an oxymoron?\n */\n// http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/\n// https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#withCredentials\n\nvar USE_XHR = window$1.XMLHttpRequest && 'withCredentials' in new XMLHttpRequest(); // IE<10 does not support cross-origin XHR's but script tags\n// with defer won't block window.onload; ENQUEUE_REQUESTS\n// should only be true for Opera<12\n\nvar ENQUEUE_REQUESTS = !USE_XHR && userAgent.indexOf('MSIE') === -1 && userAgent.indexOf('Mozilla') === -1; // save reference to navigator.sendBeacon so it can be minified\n\nvar sendBeacon = null;\n\nif (navigator$1['sendBeacon']) {\n sendBeacon = function sendBeacon() {\n // late reference to navigator.sendBeacon to allow patching/spying\n return navigator$1['sendBeacon'].apply(navigator$1, arguments);\n };\n}\n/*\n * Module-level globals\n */\n\n\nvar DEFAULT_CONFIG = {\n 'api_host': 'https://api-js.mixpanel.com',\n 'api_method': 'POST',\n 'api_transport': 'XHR',\n 'app_host': 'https://mixpanel.com',\n 'autotrack': true,\n 'cdn': 'https://cdn.mxpnl.com',\n 'cross_site_cookie': false,\n 'cross_subdomain_cookie': true,\n 'persistence': 'cookie',\n 'persistence_name': '',\n 'cookie_domain': '',\n 'cookie_name': '',\n 'loaded': function loaded() {},\n 'store_google': true,\n 'save_referrer': true,\n 'test': false,\n 'verbose': false,\n 'img': false,\n 'debug': false,\n 'track_links_timeout': 300,\n 'cookie_expiration': 365,\n 'upgrade': false,\n 'disable_persistence': false,\n 'disable_cookie': false,\n 'secure_cookie': false,\n 'ip': true,\n 'opt_out_tracking_by_default': false,\n 'opt_out_persistence_by_default': false,\n 'opt_out_tracking_persistence_type': 'localStorage',\n 'opt_out_tracking_cookie_prefix': null,\n 'property_blacklist': [],\n 'xhr_headers': {},\n // { header: value, header2: value }\n 'inapp_protocol': '//',\n 'inapp_link_new_window': false,\n 'ignore_dnt': false,\n 'batch_requests': false,\n // for now\n 'batch_size': 50,\n 'batch_flush_interval_ms': 5000,\n 'batch_request_timeout_ms': 90000\n};\nvar DOM_LOADED = false;\n/**\n * Mixpanel Library Object\n * @constructor\n */\n\nvar MixpanelLib = function MixpanelLib() {};\n/**\n * create_mplib(token:string, config:object, name:string)\n *\n * This function is used by the init method of MixpanelLib objects\n * as well as the main initializer at the end of the JSLib (that\n * initializes document.mixpanel as well as any additional instances\n * declared before this file has loaded).\n */\n\n\nvar create_mplib = function create_mplib(token, config, name) {\n var instance,\n target = name === PRIMARY_INSTANCE_NAME ? mixpanel_master : mixpanel_master[name];\n\n if (target && init_type === INIT_MODULE) {\n instance = target;\n } else {\n if (target && !_.isArray(target)) {\n console$1.error('You have already initialized ' + name);\n return;\n }\n\n instance = new MixpanelLib();\n }\n\n instance._cached_groups = {}; // cache groups in a pool\n\n instance._user_decide_check_complete = false;\n instance._events_tracked_before_user_decide_check_complete = [];\n\n instance._init(token, config, name);\n\n instance['people'] = new MixpanelPeople();\n\n instance['people']._init(instance); // if any instance on the page has debug = true, we set the\n // global debug to be true\n\n\n Config.DEBUG = Config.DEBUG || instance.get_config('debug');\n instance['__autotrack_enabled'] = instance.get_config('autotrack');\n\n if (instance.get_config('autotrack')) {\n var num_buckets = 100;\n var num_enabled_buckets = 100;\n\n if (!autotrack.enabledForProject(instance.get_config('token'), num_buckets, num_enabled_buckets)) {\n instance['__autotrack_enabled'] = false;\n console$1.log('Not in active bucket: disabling Automatic Event Collection.');\n } else if (!autotrack.isBrowserSupported()) {\n instance['__autotrack_enabled'] = false;\n console$1.log('Disabling Automatic Event Collection because this browser is not supported');\n } else {\n autotrack.init(instance);\n }\n } // if target is not defined, we called init after the lib already\n // loaded, so there won't be an array of things to execute\n\n\n if (!_.isUndefined(target) && _.isArray(target)) {\n // Crunch through the people queue first - we queue this data up &\n // flush on identify, so it's better to do all these operations first\n instance._execute_array.call(instance['people'], target['people']);\n\n instance._execute_array(target);\n }\n\n return instance;\n};\n\nvar encode_data_for_request = function encode_data_for_request(data) {\n var json_data = _.JSONEncode(data);\n\n var encoded_data = _.base64Encode(json_data);\n\n return {\n 'data': encoded_data\n };\n}; // Initialization methods\n\n/**\n * This function initializes a new instance of the Mixpanel tracking object.\n * All new instances are added to the main mixpanel object as sub properties (such as\n * mixpanel.library_name) and also returned by this function. To define a\n * second instance on the page, you would call:\n *\n * mixpanel.init('new token', { your: 'config' }, 'library_name');\n *\n * and use it like so:\n *\n * mixpanel.library_name.track(...);\n *\n * @param {String} token Your Mixpanel API token\n * @param {Object} [config] A dictionary of config options to override. See a list of default config options.\n * @param {String} [name] The name for the new mixpanel instance that you want created\n */\n\n\nMixpanelLib.prototype.init = function (token, config, name) {\n if (_.isUndefined(name)) {\n console$1.error('You must name your new library: init(token, config, name)');\n return;\n }\n\n if (name === PRIMARY_INSTANCE_NAME) {\n console$1.error('You must initialize the main mixpanel object right after you include the Mixpanel js snippet');\n return;\n }\n\n var instance = create_mplib(token, config, name);\n mixpanel_master[name] = instance;\n\n instance._loaded();\n\n return instance;\n}; // mixpanel._init(token:string, config:object, name:string)\n//\n// This function sets up the current instance of the mixpanel\n// library. The difference between this method and the init(...)\n// method is this one initializes the actual instance, whereas the\n// init(...) method sets up a new library and calls _init on it.\n//\n\n\nMixpanelLib.prototype._init = function (token, config, name) {\n this['__loaded'] = true;\n this['config'] = {};\n this['_triggered_notifs'] = []; // rollout: enable batch_requests by default for 10% of projects\n // (only if they have not specified a value in their init config)\n\n var variable_features = {};\n\n if (!('batch_requests' in (config || {})) && determine_eligibility(token, 'batch', 10)) {\n variable_features['batch_requests'] = true;\n }\n\n this.set_config(_.extend({}, DEFAULT_CONFIG, variable_features, config, {\n 'name': name,\n 'token': token,\n 'callback_fn': (name === PRIMARY_INSTANCE_NAME ? name : PRIMARY_INSTANCE_NAME + '.' + name) + '._jsc'\n }));\n\n this['_jsc'] = function () {};\n\n this.__dom_loaded_queue = [];\n this.__request_queue = [];\n this.__disabled_events = [];\n this._flags = {\n 'disable_all_events': false,\n 'identify_called': false\n }; // set up request queueing/batching\n\n this.request_batchers = {};\n this._batch_requests = this.get_config('batch_requests');\n\n if (this._batch_requests) {\n if (!_.localStorage.is_supported(true) || !USE_XHR) {\n this._batch_requests = false;\n console$1.log('Turning off Mixpanel request-queueing; needs XHR and localStorage support');\n } else {\n this.start_batch_requests();\n\n if (sendBeacon && window$1.addEventListener) {\n window$1.addEventListener('unload', _.bind(function () {\n // Before page closes, attempt to flush any events queued up via navigator.sendBeacon.\n // Since sendBeacon doesn't report success/failure, events will not be removed from\n // the persistent store; if the site is loaded again, the events will be flushed again\n // on startup and deduplicated on the Mixpanel server side.\n this.request_batchers.events.flush({\n sendBeacon: true\n });\n }, this));\n }\n }\n }\n\n this['persistence'] = this['cookie'] = new MixpanelPersistence(this['config']);\n\n this._gdpr_init();\n\n var uuid = _.UUID();\n\n if (!this.get_distinct_id()) {\n // There is no need to set the distinct id\n // or the device id if something was already stored\n // in the persitence\n this.register_once({\n 'distinct_id': uuid,\n '$device_id': uuid\n }, '');\n }\n}; // Private methods\n\n\nMixpanelLib.prototype._loaded = function () {\n this.get_config('loaded')(this);\n\n this._set_default_superprops();\n}; // update persistence with info on referrer, UTM params, etc\n\n\nMixpanelLib.prototype._set_default_superprops = function () {\n this['persistence'].update_search_keyword(document$1.referrer);\n\n if (this.get_config('store_google')) {\n this['persistence'].update_campaign_params();\n }\n\n if (this.get_config('save_referrer')) {\n this['persistence'].update_referrer_info(document$1.referrer);\n }\n};\n\nMixpanelLib.prototype._dom_loaded = function () {\n _.each(this.__dom_loaded_queue, function (item) {\n this._track_dom.apply(this, item);\n }, this);\n\n if (!this.has_opted_out_tracking()) {\n _.each(this.__request_queue, function (item) {\n this._send_request.apply(this, item);\n }, this);\n }\n\n delete this.__dom_loaded_queue;\n delete this.__request_queue;\n};\n\nMixpanelLib.prototype._track_dom = function (DomClass, args) {\n if (this.get_config('img')) {\n console$1.error('You can\\'t use DOM tracking functions with img = true.');\n return false;\n }\n\n if (!DOM_LOADED) {\n this.__dom_loaded_queue.push([DomClass, args]);\n\n return false;\n }\n\n var dt = new DomClass().init(this);\n return dt.track.apply(dt, args);\n};\n/**\n * _prepare_callback() should be called by callers of _send_request for use\n * as the callback argument.\n *\n * If there is no callback, this returns null.\n * If we are going to make XHR/XDR requests, this returns a function.\n * If we are going to use script tags, this returns a string to use as the\n * callback GET param.\n */\n\n\nMixpanelLib.prototype._prepare_callback = function (callback, data) {\n if (_.isUndefined(callback)) {\n return null;\n }\n\n if (USE_XHR) {\n var callback_function = function callback_function(response) {\n callback(response, data);\n };\n\n return callback_function;\n } else {\n // if the user gives us a callback, we store as a random\n // property on this instances jsc function and update our\n // callback string to reflect that.\n var jsc = this['_jsc'];\n var randomized_cb = '' + Math.floor(Math.random() * 100000000);\n var callback_string = this.get_config('callback_fn') + '[' + randomized_cb + ']';\n\n jsc[randomized_cb] = function (response) {\n delete jsc[randomized_cb];\n callback(response, data);\n };\n\n return callback_string;\n }\n};\n\nMixpanelLib.prototype._send_request = function (url, data, options, callback) {\n var succeeded = true;\n\n if (ENQUEUE_REQUESTS) {\n this.__request_queue.push(arguments);\n\n return succeeded;\n }\n\n var DEFAULT_OPTIONS = {\n method: this.get_config('api_method'),\n transport: this.get_config('api_transport'),\n verbose: this.get_config('verbose')\n };\n var body_data = null;\n\n if (!callback && (_.isFunction(options) || typeof options === 'string')) {\n callback = options;\n options = null;\n }\n\n options = _.extend(DEFAULT_OPTIONS, options || {});\n\n if (!USE_XHR) {\n options.method = 'GET';\n }\n\n var use_post = options.method === 'POST';\n var use_sendBeacon = sendBeacon && use_post && options.transport.toLowerCase() === 'sendbeacon'; // needed to correctly format responses\n\n var verbose_mode = options.verbose;\n\n if (data['verbose']) {\n verbose_mode = true;\n }\n\n if (this.get_config('test')) {\n data['test'] = 1;\n }\n\n if (verbose_mode) {\n data['verbose'] = 1;\n }\n\n if (this.get_config('img')) {\n data['img'] = 1;\n }\n\n if (!USE_XHR) {\n if (callback) {\n data['callback'] = callback;\n } else if (verbose_mode || this.get_config('test')) {\n // Verbose output (from verbose mode, or an error in test mode) is a json blob,\n // which by itself is not valid javascript. Without a callback, this verbose output will\n // cause an error when returned via jsonp, so we force a no-op callback param.\n // See the ECMA script spec: http://www.ecma-international.org/ecma-262/5.1/#sec-12.4\n data['callback'] = '(function(){})';\n }\n }\n\n data['ip'] = this.get_config('ip') ? 1 : 0;\n data['_'] = new Date().getTime().toString();\n\n if (use_post) {\n body_data = 'data=' + data['data'];\n delete data['data'];\n }\n\n url += '?' + _.HTTPBuildQuery(data);\n\n if ('img' in data) {\n var img = document$1.createElement('img');\n img.src = url;\n document$1.body.appendChild(img);\n } else if (use_sendBeacon) {\n try {\n succeeded = sendBeacon(url, body_data);\n } catch (e) {\n console$1.error(e);\n succeeded = false;\n }\n } else if (USE_XHR) {\n try {\n var req = new XMLHttpRequest();\n req.open(options.method, url, true);\n var headers = this.get_config('xhr_headers');\n\n if (use_post) {\n headers['Content-Type'] = 'application/x-www-form-urlencoded';\n }\n\n _.each(headers, function (headerValue, headerName) {\n req.setRequestHeader(headerName, headerValue);\n });\n\n if (options.timeout_ms && typeof req.timeout !== 'undefined') {\n req.timeout = options.timeout_ms;\n var start_time = new Date().getTime();\n } // send the mp_optout cookie\n // withCredentials cannot be modified until after calling .open on Android and Mobile Safari\n\n\n req.withCredentials = true;\n\n req.onreadystatechange = function () {\n if (req.readyState === 4) {\n // XMLHttpRequest.DONE == 4, except in safari 4\n if (req.status === 200) {\n if (callback) {\n if (verbose_mode) {\n var response;\n\n try {\n response = _.JSONDecode(req.responseText);\n } catch (e) {\n console$1.error(e);\n\n if (options.ignore_json_errors) {\n response = req.responseText;\n } else {\n return;\n }\n }\n\n callback(response);\n } else {\n callback(Number(req.responseText));\n }\n }\n } else {\n var error;\n\n if (req.timeout && !req.status && new Date().getTime() - start_time >= req.timeout) {\n error = 'timeout';\n } else {\n error = 'Bad HTTP status: ' + req.status + ' ' + req.statusText;\n }\n\n console$1.error(error);\n\n if (callback) {\n if (verbose_mode) {\n callback({\n status: 0,\n error: error,\n xhr_req: req\n });\n } else {\n callback(0);\n }\n }\n }\n }\n };\n\n req.send(body_data);\n } catch (e) {\n console$1.error(e);\n succeeded = false;\n }\n } else {\n var script = document$1.createElement('script');\n script.type = 'text/javascript';\n script.async = true;\n script.defer = true;\n script.src = url;\n var s = document$1.getElementsByTagName('script')[0];\n s.parentNode.insertBefore(script, s);\n }\n\n return succeeded;\n};\n/**\n * _execute_array() deals with processing any mixpanel function\n * calls that were called before the Mixpanel library were loaded\n * (and are thus stored in an array so they can be called later)\n *\n * Note: we fire off all the mixpanel function calls && user defined\n * functions BEFORE we fire off mixpanel tracking calls. This is so\n * identify/register/set_config calls can properly modify early\n * tracking calls.\n *\n * @param {Array} array\n */\n\n\nMixpanelLib.prototype._execute_array = function (array) {\n var fn_name,\n alias_calls = [],\n other_calls = [],\n tracking_calls = [];\n\n _.each(array, function (item) {\n if (item) {\n fn_name = item[0];\n\n if (_.isArray(fn_name)) {\n tracking_calls.push(item); // chained call e.g. mixpanel.get_group().set()\n } else if (typeof item === 'function') {\n item.call(this);\n } else if (_.isArray(item) && fn_name === 'alias') {\n alias_calls.push(item);\n } else if (_.isArray(item) && fn_name.indexOf('track') !== -1 && typeof this[fn_name] === 'function') {\n tracking_calls.push(item);\n } else {\n other_calls.push(item);\n }\n }\n }, this);\n\n var execute = function execute(calls, context) {\n _.each(calls, function (item) {\n if (_.isArray(item[0])) {\n // chained call\n var caller = context;\n\n _.each(item, function (call) {\n caller = caller[call[0]].apply(caller, call.slice(1));\n });\n } else {\n this[item[0]].apply(this, item.slice(1));\n }\n }, context);\n };\n\n execute(alias_calls, this);\n execute(other_calls, this);\n execute(tracking_calls, this);\n}; // request queueing utils\n\n\nMixpanelLib.prototype.start_batch_requests = function () {\n var token = this.get_config('token');\n\n if (!this.request_batchers.events) {\n // no batchers initialized yet\n var batcher_config = {\n libConfig: this['config'],\n sendRequestFunc: _.bind(function (endpoint, data, options, cb) {\n this._send_request(this.get_config('api_host') + endpoint, encode_data_for_request(data), options, this._prepare_callback(cb, data));\n }, this)\n };\n this.request_batchers = {\n events: new RequestBatcher('__mpq_' + token + '_ev', '/track/', batcher_config),\n people: new RequestBatcher('__mpq_' + token + '_pp', '/engage/', batcher_config),\n groups: new RequestBatcher('__mpq_' + token + '_gr', '/groups/', batcher_config)\n };\n }\n\n _.each(this.request_batchers, function (batcher) {\n batcher.start();\n });\n};\n\nMixpanelLib.prototype.stop_batch_requests = function () {\n this._batch_requests = false;\n\n _.each(this.request_batchers, function (batcher) {\n batcher.stop();\n batcher.clear();\n });\n};\n/**\n * push() keeps the standard async-array-push\n * behavior around after the lib is loaded.\n * This is only useful for external integrations that\n * do not wish to rely on our convenience methods\n * (created in the snippet).\n *\n * ### Usage:\n * mixpanel.push(['register', { a: 'b' }]);\n *\n * @param {Array} item A [function_name, args...] array to be executed\n */\n\n\nMixpanelLib.prototype.push = function (item) {\n this._execute_array([item]);\n};\n/**\n * Disable events on the Mixpanel object. If passed no arguments,\n * this function disables tracking of any event. If passed an\n * array of event names, those events will be disabled, but other\n * events will continue to be tracked.\n *\n * Note: this function does not stop other mixpanel functions from\n * firing, such as register() or people.set().\n *\n * @param {Array} [events] An array of event names to disable\n */\n\n\nMixpanelLib.prototype.disable = function (events) {\n if (typeof events === 'undefined') {\n this._flags.disable_all_events = true;\n } else {\n this.__disabled_events = this.__disabled_events.concat(events);\n }\n}; // internal method for handling track vs batch-enqueue logic\n\n\nMixpanelLib.prototype._track_or_batch = function (options, callback) {\n var truncated_data = options.truncated_data;\n var endpoint = options.endpoint;\n var batcher = options.batcher;\n var should_send_immediately = options.should_send_immediately;\n var send_request_options = options.send_request_options || {};\n\n callback = callback || function () {};\n\n var request_enqueued_or_initiated = true;\n\n var send_request_immediately = _.bind(function () {\n console$1.log('MIXPANEL REQUEST:');\n console$1.log(truncated_data);\n return this._send_request(endpoint, encode_data_for_request(truncated_data), send_request_options, this._prepare_callback(callback, truncated_data));\n }, this);\n\n if (this._batch_requests && !should_send_immediately) {\n batcher.enqueue(truncated_data, function (succeeded) {\n if (succeeded) {\n callback(1, truncated_data);\n } else {\n send_request_immediately();\n }\n });\n } else {\n request_enqueued_or_initiated = send_request_immediately();\n }\n\n return request_enqueued_or_initiated && truncated_data;\n};\n/**\n * Track an event. This is the most important and\n * frequently used Mixpanel function.\n *\n * ### Usage:\n *\n * // track an event named 'Registered'\n * mixpanel.track('Registered', {'Gender': 'Male', 'Age': 21});\n *\n * // track an event using navigator.sendBeacon\n * mixpanel.track('Left page', {'duration_seconds': 35}, {transport: 'sendBeacon'});\n *\n * To track link clicks or form submissions, see track_links() or track_forms().\n *\n * @param {String} event_name The name of the event. This can be anything the user does - 'Button Click', 'Sign Up', 'Item Purchased', etc.\n * @param {Object} [properties] A set of properties to include with the event you're sending. These describe the user who did the event or details about the event itself.\n * @param {Object} [options] Optional configuration for this track request.\n * @param {String} [options.transport] Transport method for network request ('xhr' or 'sendBeacon').\n * @param {Boolean} [options.send_immediately] Whether to bypass batching/queueing and send track request immediately.\n * @param {Function} [callback] If provided, the callback function will be called after tracking the event.\n * @returns {Boolean|Object} If the tracking request was successfully initiated/queued, an object\n * with the tracking payload sent to the API server is returned; otherwise false.\n */\n\n\nMixpanelLib.prototype.track = addOptOutCheckMixpanelLib(function (event_name, properties, options, callback) {\n if (!callback && typeof options === 'function') {\n callback = options;\n options = null;\n }\n\n options = options || {};\n var transport = options['transport']; // external API, don't minify 'transport' prop\n\n if (transport) {\n options.transport = transport; // 'transport' prop name can be minified internally\n }\n\n var should_send_immediately = options['send_immediately'];\n\n if (typeof callback !== 'function') {\n callback = function callback() {};\n }\n\n if (_.isUndefined(event_name)) {\n console$1.error('No event name provided to mixpanel.track');\n return;\n }\n\n if (this._event_is_disabled(event_name)) {\n callback(0);\n return;\n } // set defaults\n\n\n properties = properties || {};\n properties['token'] = this.get_config('token'); // set $duration if time_event was previously called for this event\n\n var start_timestamp = this['persistence'].remove_event_timer(event_name);\n\n if (!_.isUndefined(start_timestamp)) {\n var duration_in_ms = new Date().getTime() - start_timestamp;\n properties['$duration'] = parseFloat((duration_in_ms / 1000).toFixed(3));\n }\n\n this._set_default_superprops(); // note: extend writes to the first object, so lets make sure we\n // don't write to the persistence properties object and info\n // properties object by passing in a new object\n // update properties with pageview info and super-properties\n\n\n properties = _.extend({}, _.info.properties(), this['persistence'].properties(), properties);\n var property_blacklist = this.get_config('property_blacklist');\n\n if (_.isArray(property_blacklist)) {\n _.each(property_blacklist, function (blacklisted_prop) {\n delete properties[blacklisted_prop];\n });\n } else {\n console$1.error('Invalid value for property_blacklist config: ' + property_blacklist);\n }\n\n var data = {\n 'event': event_name,\n 'properties': properties\n };\n\n var ret = this._track_or_batch({\n truncated_data: _.truncate(data, 255),\n endpoint: this.get_config('api_host') + '/track/',\n batcher: this.request_batchers.events,\n should_send_immediately: should_send_immediately,\n send_request_options: options\n }, callback);\n\n this._check_and_handle_triggered_notifications(data);\n\n return ret;\n});\n/**\n * Register the current user into one/many groups.\n *\n * ### Usage:\n *\n * mixpanel.set_group('company', ['mixpanel', 'google']) // an array of IDs\n * mixpanel.set_group('company', 'mixpanel')\n * mixpanel.set_group('company', 128746312)\n *\n * @param {String} group_key Group key\n * @param {Array|String|Number} group_ids An array of group IDs, or a singular group ID\n * @param {Function} [callback] If provided, the callback will be called after tracking the event.\n *\n */\n\nMixpanelLib.prototype.set_group = addOptOutCheckMixpanelLib(function (group_key, group_ids, callback) {\n if (!_.isArray(group_ids)) {\n group_ids = [group_ids];\n }\n\n var prop = {};\n prop[group_key] = group_ids;\n this.register(prop);\n return this['people'].set(group_key, group_ids, callback);\n});\n/**\n * Add a new group for this user.\n *\n * ### Usage:\n *\n * mixpanel.add_group('company', 'mixpanel')\n *\n * @param {String} group_key Group key\n * @param {*} group_id A valid Mixpanel property type\n * @param {Function} [callback] If provided, the callback will be called after tracking the event.\n */\n\nMixpanelLib.prototype.add_group = addOptOutCheckMixpanelLib(function (group_key, group_id, callback) {\n var old_values = this.get_property(group_key);\n\n if (old_values === undefined) {\n var prop = {};\n prop[group_key] = [group_id];\n this.register(prop);\n } else {\n if (old_values.indexOf(group_id) === -1) {\n old_values.push(group_id);\n this.register(prop);\n }\n }\n\n return this['people'].union(group_key, group_id, callback);\n});\n/**\n * Remove a group from this user.\n *\n * ### Usage:\n *\n * mixpanel.remove_group('company', 'mixpanel')\n *\n * @param {String} group_key Group key\n * @param {*} group_id A valid Mixpanel property type\n * @param {Function} [callback] If provided, the callback will be called after tracking the event.\n */\n\nMixpanelLib.prototype.remove_group = addOptOutCheckMixpanelLib(function (group_key, group_id, callback) {\n var old_value = this.get_property(group_key); // if the value doesn't exist, the persistent store is unchanged\n\n if (old_value !== undefined) {\n var idx = old_value.indexOf(group_id);\n\n if (idx > -1) {\n old_value.splice(idx, 1);\n this.register({\n group_key: old_value\n });\n }\n\n if (old_value.length === 0) {\n this.unregister(group_key);\n }\n }\n\n return this['people'].remove(group_key, group_id, callback);\n});\n/**\n * Track an event with specific groups.\n *\n * ### Usage:\n *\n * mixpanel.track_with_groups('purchase', {'product': 'iphone'}, {'University': ['UCB', 'UCLA']})\n *\n * @param {String} event_name The name of the event (see `mixpanel.track()`)\n * @param {Object=} properties A set of properties to include with the event you're sending (see `mixpanel.track()`)\n * @param {Object=} groups An object mapping group name keys to one or more values\n * @param {Function} [callback] If provided, the callback will be called after tracking the event.\n */\n\nMixpanelLib.prototype.track_with_groups = addOptOutCheckMixpanelLib(function (event_name, properties, groups, callback) {\n var tracking_props = _.extend({}, properties || {});\n\n _.each(groups, function (v, k) {\n if (v !== null && v !== undefined) {\n tracking_props[k] = v;\n }\n });\n\n return this.track(event_name, tracking_props, callback);\n});\n\nMixpanelLib.prototype._create_map_key = function (group_key, group_id) {\n return group_key + '_' + JSON.stringify(group_id);\n};\n\nMixpanelLib.prototype._remove_group_from_cache = function (group_key, group_id) {\n delete this._cached_groups[this._create_map_key(group_key, group_id)];\n};\n/**\n * Look up reference to a Mixpanel group\n *\n * ### Usage:\n *\n * mixpanel.get_group(group_key, group_id)\n *\n * @param {String} group_key Group key\n * @param {Object} group_id A valid Mixpanel property type\n * @returns {Object} A MixpanelGroup identifier\n */\n\n\nMixpanelLib.prototype.get_group = function (group_key, group_id) {\n var map_key = this._create_map_key(group_key, group_id);\n\n var group = this._cached_groups[map_key];\n\n if (group === undefined || group._group_key !== group_key || group._group_id !== group_id) {\n group = new MixpanelGroup();\n\n group._init(this, group_key, group_id);\n\n this._cached_groups[map_key] = group;\n }\n\n return group;\n};\n/**\n * Track mp_page_view event. This is now ignored by the server.\n *\n * @param {String} [page] The url of the page to record. If you don't include this, it defaults to the current url.\n * @deprecated\n */\n\n\nMixpanelLib.prototype.track_pageview = function (page) {\n if (_.isUndefined(page)) {\n page = document$1.location.href;\n }\n\n this.track('mp_page_view', _.info.pageviewInfo(page));\n};\n/**\n * Track clicks on a set of document elements. Selector must be a\n * valid query. Elements must exist on the page at the time track_links is called.\n *\n * ### Usage:\n *\n * // track click for link id #nav\n * mixpanel.track_links('#nav', 'Clicked Nav Link');\n *\n * ### Notes:\n *\n * This function will wait up to 300 ms for the Mixpanel\n * servers to respond. If they have not responded by that time\n * it will head to the link without ensuring that your event\n * has been tracked. To configure this timeout please see the\n * set_config() documentation below.\n *\n * If you pass a function in as the properties argument, the\n * function will receive the DOMElement that triggered the\n * event as an argument. You are expected to return an object\n * from the function; any properties defined on this object\n * will be sent to mixpanel as event properties.\n *\n * @type {Function}\n * @param {Object|String} query A valid DOM query, element or jQuery-esque list\n * @param {String} event_name The name of the event to track\n * @param {Object|Function} [properties] A properties object or function that returns a dictionary of properties when passed a DOMElement\n */\n\n\nMixpanelLib.prototype.track_links = function () {\n return this._track_dom.call(this, LinkTracker, arguments);\n};\n/**\n * Track form submissions. Selector must be a valid query.\n *\n * ### Usage:\n *\n * // track submission for form id 'register'\n * mixpanel.track_forms('#register', 'Created Account');\n *\n * ### Notes:\n *\n * This function will wait up to 300 ms for the mixpanel\n * servers to respond, if they have not responded by that time\n * it will head to the link without ensuring that your event\n * has been tracked. To configure this timeout please see the\n * set_config() documentation below.\n *\n * If you pass a function in as the properties argument, the\n * function will receive the DOMElement that triggered the\n * event as an argument. You are expected to return an object\n * from the function; any properties defined on this object\n * will be sent to mixpanel as event properties.\n *\n * @type {Function}\n * @param {Object|String} query A valid DOM query, element or jQuery-esque list\n * @param {String} event_name The name of the event to track\n * @param {Object|Function} [properties] This can be a set of properties, or a function that returns a set of properties after being passed a DOMElement\n */\n\n\nMixpanelLib.prototype.track_forms = function () {\n return this._track_dom.call(this, FormTracker, arguments);\n};\n/**\n * Time an event by including the time between this call and a\n * later 'track' call for the same event in the properties sent\n * with the event.\n *\n * ### Usage:\n *\n * // time an event named 'Registered'\n * mixpanel.time_event('Registered');\n * mixpanel.track('Registered', {'Gender': 'Male', 'Age': 21});\n *\n * When called for a particular event name, the next track call for that event\n * name will include the elapsed time between the 'time_event' and 'track'\n * calls. This value is stored as seconds in the '$duration' property.\n *\n * @param {String} event_name The name of the event.\n */\n\n\nMixpanelLib.prototype.time_event = function (event_name) {\n if (_.isUndefined(event_name)) {\n console$1.error('No event name provided to mixpanel.time_event');\n return;\n }\n\n if (this._event_is_disabled(event_name)) {\n return;\n }\n\n this['persistence'].set_event_timer(event_name, new Date().getTime());\n};\n/**\n * Register a set of super properties, which are included with all\n * events. This will overwrite previous super property values.\n *\n * ### Usage:\n *\n * // register 'Gender' as a super property\n * mixpanel.register({'Gender': 'Female'});\n *\n * // register several super properties when a user signs up\n * mixpanel.register({\n * 'Email': 'jdoe@example.com',\n * 'Account Type': 'Free'\n * });\n *\n * @param {Object} properties An associative array of properties to store about the user\n * @param {Number} [days] How many days since the user's last visit to store the super properties\n */\n\n\nMixpanelLib.prototype.register = function (props, days) {\n this['persistence'].register(props, days);\n};\n/**\n * Register a set of super properties only once. This will not\n * overwrite previous super property values, unlike register().\n *\n * ### Usage:\n *\n * // register a super property for the first time only\n * mixpanel.register_once({\n * 'First Login Date': new Date().toISOString()\n * });\n *\n * ### Notes:\n *\n * If default_value is specified, current super properties\n * with that value will be overwritten.\n *\n * @param {Object} properties An associative array of properties to store about the user\n * @param {*} [default_value] Value to override if already set in super properties (ex: 'False') Default: 'None'\n * @param {Number} [days] How many days since the users last visit to store the super properties\n */\n\n\nMixpanelLib.prototype.register_once = function (props, default_value, days) {\n this['persistence'].register_once(props, default_value, days);\n};\n/**\n * Delete a super property stored with the current user.\n *\n * @param {String} property The name of the super property to remove\n */\n\n\nMixpanelLib.prototype.unregister = function (property) {\n this['persistence'].unregister(property);\n};\n\nMixpanelLib.prototype._register_single = function (prop, value) {\n var props = {};\n props[prop] = value;\n this.register(props);\n};\n/**\n * Identify a user with a unique ID to track user activity across\n * devices, tie a user to their events, and create a user profile.\n * If you never call this method, unique visitors are tracked using\n * a UUID generated the first time they visit the site.\n *\n * Call identify when you know the identity of the current user,\n * typically after login or signup. We recommend against using\n * identify for anonymous visitors to your site.\n *\n * ### Notes:\n * If your project has\n * ID Merge\n * enabled, the identify method will connect pre- and\n * post-authentication events when appropriate.\n *\n * If your project does not have ID Merge enabled, identify will\n * change the user's local distinct_id to the unique ID you pass.\n * Events tracked prior to authentication will not be connected\n * to the same user identity. If ID Merge is disabled, alias can\n * be used to connect pre- and post-registration events.\n *\n * @param {String} [unique_id] A string that uniquely identifies a user. If not provided, the distinct_id currently in the persistent store (cookie or localStorage) will be used.\n */\n\n\nMixpanelLib.prototype.identify = function (new_distinct_id, _set_callback, _add_callback, _append_callback, _set_once_callback, _union_callback, _unset_callback, _remove_callback) {\n // Optional Parameters\n // _set_callback:function A callback to be run if and when the People set queue is flushed\n // _add_callback:function A callback to be run if and when the People add queue is flushed\n // _append_callback:function A callback to be run if and when the People append queue is flushed\n // _set_once_callback:function A callback to be run if and when the People set_once queue is flushed\n // _union_callback:function A callback to be run if and when the People union queue is flushed\n // _unset_callback:function A callback to be run if and when the People unset queue is flushed\n var previous_distinct_id = this.get_distinct_id();\n this.register({\n '$user_id': new_distinct_id\n });\n\n if (!this.get_property('$device_id')) {\n // The persisted distinct id might not actually be a device id at all\n // it might be a distinct id of the user from before\n var device_id = previous_distinct_id;\n this.register_once({\n '$had_persisted_distinct_id': true,\n '$device_id': device_id\n }, '');\n } // identify only changes the distinct id if it doesn't match either the existing or the alias;\n // if it's new, blow away the alias as well.\n\n\n if (new_distinct_id !== previous_distinct_id && new_distinct_id !== this.get_property(ALIAS_ID_KEY)) {\n this.unregister(ALIAS_ID_KEY);\n this.register({\n 'distinct_id': new_distinct_id\n });\n }\n\n this._check_and_handle_notifications(this.get_distinct_id());\n\n this._flags.identify_called = true; // Flush any queued up people requests\n\n this['people']._flush(_set_callback, _add_callback, _append_callback, _set_once_callback, _union_callback, _unset_callback, _remove_callback); // send an $identify event any time the distinct_id is changing - logic on the server\n // will determine whether or not to do anything with it.\n\n\n if (new_distinct_id !== previous_distinct_id) {\n this.track('$identify', {\n 'distinct_id': new_distinct_id,\n '$anon_distinct_id': previous_distinct_id\n });\n }\n};\n/**\n * Clears super properties and generates a new random distinct_id for this instance.\n * Useful for clearing data when a user logs out.\n */\n\n\nMixpanelLib.prototype.reset = function () {\n this['persistence'].clear();\n this._flags.identify_called = false;\n\n var uuid = _.UUID();\n\n this.register_once({\n 'distinct_id': uuid,\n '$device_id': uuid\n }, '');\n};\n/**\n * Returns the current distinct id of the user. This is either the id automatically\n * generated by the library or the id that has been passed by a call to identify().\n *\n * ### Notes:\n *\n * get_distinct_id() can only be called after the Mixpanel library has finished loading.\n * init() has a loaded function available to handle this automatically. For example:\n *\n * // set distinct_id after the mixpanel library has loaded\n * mixpanel.init('YOUR PROJECT TOKEN', {\n * loaded: function(mixpanel) {\n * distinct_id = mixpanel.get_distinct_id();\n * }\n * });\n */\n\n\nMixpanelLib.prototype.get_distinct_id = function () {\n return this.get_property('distinct_id');\n};\n/**\n * The alias method creates an alias which Mixpanel will use to\n * remap one id to another. Multiple aliases can point to the\n * same identifier.\n *\n * The following is a valid use of alias:\n *\n * mixpanel.alias('new_id', 'existing_id');\n * // You can add multiple id aliases to the existing ID\n * mixpanel.alias('newer_id', 'existing_id');\n *\n * Aliases can also be chained - the following is a valid example:\n *\n * mixpanel.alias('new_id', 'existing_id');\n * // chain newer_id - new_id - existing_id\n * mixpanel.alias('newer_id', 'new_id');\n *\n * Aliases cannot point to multiple identifiers - the following\n * example will not work:\n *\n * mixpanel.alias('new_id', 'existing_id');\n * // this is invalid as 'new_id' already points to 'existing_id'\n * mixpanel.alias('new_id', 'newer_id');\n *\n * ### Notes:\n *\n * If your project does not have\n * ID Merge\n * enabled, the best practice is to call alias once when a unique\n * ID is first created for a user (e.g., when a user first registers\n * for an account). Do not use alias multiple times for a single\n * user without ID Merge enabled.\n *\n * @param {String} alias A unique identifier that you want to use for this user in the future.\n * @param {String} [original] The current identifier being used for this user.\n */\n\n\nMixpanelLib.prototype.alias = function (alias, original) {\n // If the $people_distinct_id key exists in persistence, there has been a previous\n // mixpanel.people.identify() call made for this user. It is VERY BAD to make an alias with\n // this ID, as it will duplicate users.\n if (alias === this.get_property(PEOPLE_DISTINCT_ID_KEY)) {\n console$1.critical('Attempting to create alias for existing People user - aborting.');\n return -2;\n }\n\n var _this = this;\n\n if (_.isUndefined(original)) {\n original = this.get_distinct_id();\n }\n\n if (alias !== original) {\n this._register_single(ALIAS_ID_KEY, alias);\n\n return this.track('$create_alias', {\n 'alias': alias,\n 'distinct_id': original\n }, function () {\n // Flush the people queue\n _this.identify(alias);\n });\n } else {\n console$1.error('alias matches current distinct_id - skipping api call.');\n this.identify(alias);\n return -1;\n }\n};\n/**\n * Provide a string to recognize the user by. The string passed to\n * this method will appear in the Mixpanel Streams product rather\n * than an automatically generated name. Name tags do not have to\n * be unique.\n *\n * This value will only be included in Streams data.\n *\n * @param {String} name_tag A human readable name for the user\n * @deprecated\n */\n\n\nMixpanelLib.prototype.name_tag = function (name_tag) {\n this._register_single('mp_name_tag', name_tag);\n};\n/**\n * Update the configuration of a mixpanel library instance.\n *\n * The default config is:\n *\n * {\n * // HTTP method for tracking requests\n * api_method: 'POST'\n *\n * // transport for sending requests ('XHR' or 'sendBeacon')\n * // NB: sendBeacon should only be used for scenarios such as\n * // page unload where a \"best-effort\" attempt to send is\n * // acceptable; the sendBeacon API does not support callbacks\n * // or any way to know the result of the request. Mixpanel\n * // tracking via sendBeacon will not support any event-\n * // batching or retry mechanisms.\n * api_transport: 'XHR'\n *\n * // turn on request-batching/queueing/retry\n * batch_requests: false,\n *\n * // maximum number of events/updates to send in a single\n * // network request\n * batch_size: 50,\n *\n * // milliseconds to wait between sending batch requests\n * batch_flush_interval_ms: 5000,\n *\n * // milliseconds to wait for network responses to batch requests\n * // before they are considered timed-out and retried\n * batch_request_timeout_ms: 90000,\n *\n * // override value for cookie domain, only useful for ensuring\n * // correct cross-subdomain cookies on unusual domains like\n * // subdomain.mainsite.avocat.fr; NB this cannot be used to\n * // set cookies on a different domain than the current origin\n * cookie_domain: ''\n *\n * // super properties cookie expiration (in days)\n * cookie_expiration: 365\n *\n * // if true, cookie will be set with SameSite=None; Secure\n * // this is only useful in special situations, like embedded\n * // 3rd-party iframes that set up a Mixpanel instance\n * cross_site_cookie: false\n *\n * // super properties span subdomains\n * cross_subdomain_cookie: true\n *\n * // debug mode\n * debug: false\n *\n * // if this is true, the mixpanel cookie or localStorage entry\n * // will be deleted, and no user persistence will take place\n * disable_persistence: false\n *\n * // if this is true, Mixpanel will automatically determine\n * // City, Region and Country data using the IP address of\n * //the client\n * ip: true\n *\n * // opt users out of tracking by this Mixpanel instance by default\n * opt_out_tracking_by_default: false\n *\n * // opt users out of browser data storage by this Mixpanel instance by default\n * opt_out_persistence_by_default: false\n *\n * // persistence mechanism used by opt-in/opt-out methods - cookie\n * // or localStorage - falls back to cookie if localStorage is unavailable\n * opt_out_tracking_persistence_type: 'localStorage'\n *\n * // customize the name of cookie/localStorage set by opt-in/opt-out methods\n * opt_out_tracking_cookie_prefix: null\n *\n * // type of persistent store for super properties (cookie/\n * // localStorage) if set to 'localStorage', any existing\n * // mixpanel cookie value with the same persistence_name\n * // will be transferred to localStorage and deleted\n * persistence: 'cookie'\n *\n * // name for super properties persistent store\n * persistence_name: ''\n *\n * // names of properties/superproperties which should never\n * // be sent with track() calls\n * property_blacklist: []\n *\n * // if this is true, mixpanel cookies will be marked as\n * // secure, meaning they will only be transmitted over https\n * secure_cookie: false\n *\n * // the amount of time track_links will\n * // wait for Mixpanel's servers to respond\n * track_links_timeout: 300\n *\n * // if you set upgrade to be true, the library will check for\n * // a cookie from our old js library and import super\n * // properties from it, then the old cookie is deleted\n * // The upgrade config option only works in the initialization,\n * // so make sure you set it when you create the library.\n * upgrade: false\n *\n * // extra HTTP request headers to set for each API request, in\n * // the format {'Header-Name': value}\n * xhr_headers: {}\n *\n * // protocol for fetching in-app message resources, e.g.\n * // 'https://' or 'http://'; defaults to '//' (which defers to the\n * // current page's protocol)\n * inapp_protocol: '//'\n *\n * // whether to open in-app message link in new tab/window\n * inapp_link_new_window: false\n *\n * // whether to ignore or respect the web browser's Do Not Track setting\n * ignore_dnt: false\n * }\n *\n *\n * @param {Object} config A dictionary of new configuration values to update\n */\n\n\nMixpanelLib.prototype.set_config = function (config) {\n if (_.isObject(config)) {\n _.extend(this['config'], config);\n\n var new_batch_size = config['batch_size'];\n\n if (new_batch_size) {\n _.each(this.request_batchers, function (batcher) {\n batcher.resetBatchSize();\n });\n }\n\n if (!this.get_config('persistence_name')) {\n this['config']['persistence_name'] = this['config']['cookie_name'];\n }\n\n if (!this.get_config('disable_persistence')) {\n this['config']['disable_persistence'] = this['config']['disable_cookie'];\n }\n\n if (this['persistence']) {\n this['persistence'].update_config(this['config']);\n }\n\n Config.DEBUG = Config.DEBUG || this.get_config('debug');\n }\n};\n/**\n * returns the current config object for the library.\n */\n\n\nMixpanelLib.prototype.get_config = function (prop_name) {\n return this['config'][prop_name];\n};\n/**\n * Returns the value of the super property named property_name. If no such\n * property is set, get_property() will return the undefined value.\n *\n * ### Notes:\n *\n * get_property() can only be called after the Mixpanel library has finished loading.\n * init() has a loaded function available to handle this automatically. For example:\n *\n * // grab value for 'user_id' after the mixpanel library has loaded\n * mixpanel.init('YOUR PROJECT TOKEN', {\n * loaded: function(mixpanel) {\n * user_id = mixpanel.get_property('user_id');\n * }\n * });\n *\n * @param {String} property_name The name of the super property you want to retrieve\n */\n\n\nMixpanelLib.prototype.get_property = function (property_name) {\n return this['persistence']['props'][property_name];\n};\n\nMixpanelLib.prototype.toString = function () {\n var name = this.get_config('name');\n\n if (name !== PRIMARY_INSTANCE_NAME) {\n name = PRIMARY_INSTANCE_NAME + '.' + name;\n }\n\n return name;\n};\n\nMixpanelLib.prototype._event_is_disabled = function (event_name) {\n return _.isBlockedUA(userAgent) || this._flags.disable_all_events || _.include(this.__disabled_events, event_name);\n};\n\nMixpanelLib.prototype._check_and_handle_triggered_notifications = addOptOutCheckMixpanelLib(function (event_data) {\n if (!this._user_decide_check_complete) {\n this._events_tracked_before_user_decide_check_complete.push(event_data);\n } else {\n var arr = this['_triggered_notifs'];\n\n for (var i = 0; i < arr.length; i++) {\n var notif = new MixpanelNotification(arr[i], this);\n\n if (notif._matches_event_data(event_data)) {\n this._show_notification(arr[i]);\n\n return;\n }\n }\n }\n});\nMixpanelLib.prototype._check_and_handle_notifications = addOptOutCheckMixpanelLib(function (distinct_id) {\n if (!distinct_id || this._flags.identify_called || this.get_config('disable_notifications')) {\n return;\n }\n\n console$1.log('MIXPANEL NOTIFICATION CHECK');\n var data = {\n 'verbose': true,\n 'version': '3',\n 'lib': 'web',\n 'token': this.get_config('token'),\n 'distinct_id': distinct_id\n };\n\n this._send_request(this.get_config('api_host') + '/decide/', data, {\n method: 'GET',\n transport: 'XHR'\n }, this._prepare_callback(_.bind(function (result) {\n if (result['notifications'] && result['notifications'].length > 0) {\n this['_triggered_notifs'] = [];\n var notifications = [];\n\n _.each(result['notifications'], function (notif) {\n (notif['display_triggers'] && notif['display_triggers'].length > 0 ? this['_triggered_notifs'] : notifications).push(notif);\n }, this);\n\n if (notifications.length > 0) {\n this._show_notification.call(this, notifications[0]);\n }\n }\n\n this._handle_user_decide_check_complete();\n }, this)));\n});\n\nMixpanelLib.prototype._handle_user_decide_check_complete = function () {\n this._user_decide_check_complete = true; // check notifications against events that were tracked before decide call completed\n\n var events = this._events_tracked_before_user_decide_check_complete;\n\n while (events.length > 0) {\n var data = events.shift(); // replay in the same order they came in\n\n this._check_and_handle_triggered_notifications(data);\n }\n};\n\nMixpanelLib.prototype._show_notification = function (notif_data) {\n var notification = new MixpanelNotification(notif_data, this);\n notification.show();\n}; // perform some housekeeping around GDPR opt-in/out state\n\n\nMixpanelLib.prototype._gdpr_init = function () {\n var is_localStorage_requested = this.get_config('opt_out_tracking_persistence_type') === 'localStorage'; // try to convert opt-in/out cookies to localStorage if possible\n\n if (is_localStorage_requested && _.localStorage.is_supported()) {\n if (!this.has_opted_in_tracking() && this.has_opted_in_tracking({\n 'persistence_type': 'cookie'\n })) {\n this.opt_in_tracking({\n 'enable_persistence': false\n });\n }\n\n if (!this.has_opted_out_tracking() && this.has_opted_out_tracking({\n 'persistence_type': 'cookie'\n })) {\n this.opt_out_tracking({\n 'clear_persistence': false\n });\n }\n\n this.clear_opt_in_out_tracking({\n 'persistence_type': 'cookie',\n 'enable_persistence': false\n });\n } // check whether the user has already opted out - if so, clear & disable persistence\n\n\n if (this.has_opted_out_tracking()) {\n this._gdpr_update_persistence({\n 'clear_persistence': true\n }); // check whether we should opt out by default\n // note: we don't clear persistence here by default since opt-out default state is often\n // used as an initial state while GDPR information is being collected\n\n } else if (!this.has_opted_in_tracking() && (this.get_config('opt_out_tracking_by_default') || _.cookie.get('mp_optout'))) {\n _.cookie.remove('mp_optout');\n\n this.opt_out_tracking({\n 'clear_persistence': this.get_config('opt_out_persistence_by_default')\n });\n }\n};\n/**\n * Enable or disable persistence based on options\n * only enable/disable if persistence is not already in this state\n * @param {boolean} [options.clear_persistence] If true, will delete all data stored by the sdk in persistence and disable it\n * @param {boolean} [options.enable_persistence] If true, will re-enable sdk persistence\n */\n\n\nMixpanelLib.prototype._gdpr_update_persistence = function (options) {\n var disabled;\n\n if (options && options['clear_persistence']) {\n disabled = true;\n } else if (options && options['enable_persistence']) {\n disabled = false;\n } else {\n return;\n }\n\n if (!this.get_config('disable_persistence') && this['persistence'].disabled !== disabled) {\n this['persistence'].set_disabled(disabled);\n }\n\n if (disabled) {\n _.each(this.request_batchers, function (batcher) {\n batcher.clear();\n });\n }\n}; // call a base gdpr function after constructing the appropriate token and options args\n\n\nMixpanelLib.prototype._gdpr_call_func = function (func, options) {\n options = _.extend({\n 'track': _.bind(this.track, this),\n 'persistence_type': this.get_config('opt_out_tracking_persistence_type'),\n 'cookie_prefix': this.get_config('opt_out_tracking_cookie_prefix'),\n 'cookie_expiration': this.get_config('cookie_expiration'),\n 'cross_site_cookie': this.get_config('cross_site_cookie'),\n 'cross_subdomain_cookie': this.get_config('cross_subdomain_cookie'),\n 'cookie_domain': this.get_config('cookie_domain'),\n 'secure_cookie': this.get_config('secure_cookie'),\n 'ignore_dnt': this.get_config('ignore_dnt')\n }, options); // check if localStorage can be used for recording opt out status, fall back to cookie if not\n\n if (!_.localStorage.is_supported()) {\n options['persistence_type'] = 'cookie';\n }\n\n return func(this.get_config('token'), {\n track: options['track'],\n trackEventName: options['track_event_name'],\n trackProperties: options['track_properties'],\n persistenceType: options['persistence_type'],\n persistencePrefix: options['cookie_prefix'],\n cookieDomain: options['cookie_domain'],\n cookieExpiration: options['cookie_expiration'],\n crossSiteCookie: options['cross_site_cookie'],\n crossSubdomainCookie: options['cross_subdomain_cookie'],\n secureCookie: options['secure_cookie'],\n ignoreDnt: options['ignore_dnt']\n });\n};\n/**\n * Opt the user in to data tracking and cookies/localstorage for this Mixpanel instance\n *\n * ### Usage\n *\n * // opt user in\n * mixpanel.opt_in_tracking();\n *\n * // opt user in with specific event name, properties, cookie configuration\n * mixpanel.opt_in_tracking({\n * track_event_name: 'User opted in',\n * track_event_properties: {\n * 'Email': 'jdoe@example.com'\n * },\n * cookie_expiration: 30,\n * secure_cookie: true\n * });\n *\n * @param {Object} [options] A dictionary of config options to override\n * @param {function} [options.track] Function used for tracking a Mixpanel event to record the opt-in action (default is this Mixpanel instance's track method)\n * @param {string} [options.track_event_name=$opt_in] Event name to be used for tracking the opt-in action\n * @param {Object} [options.track_properties] Set of properties to be tracked along with the opt-in action\n * @param {boolean} [options.enable_persistence=true] If true, will re-enable sdk persistence\n * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable\n * @param {string} [options.cookie_prefix=__mp_opt_in_out] Custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookie_expiration] Number of days until the opt-in cookie expires (overrides value specified in this Mixpanel instance's config)\n * @param {string} [options.cookie_domain] Custom cookie domain (overrides value specified in this Mixpanel instance's config)\n * @param {boolean} [options.cross_site_cookie] Whether the opt-in cookie is set as cross-site-enabled (overrides value specified in this Mixpanel instance's config)\n * @param {boolean} [options.cross_subdomain_cookie] Whether the opt-in cookie is set as cross-subdomain or not (overrides value specified in this Mixpanel instance's config)\n * @param {boolean} [options.secure_cookie] Whether the opt-in cookie is set as secure or not (overrides value specified in this Mixpanel instance's config)\n */\n\n\nMixpanelLib.prototype.opt_in_tracking = function (options) {\n options = _.extend({\n 'enable_persistence': true\n }, options);\n\n this._gdpr_call_func(optIn, options);\n\n this._gdpr_update_persistence(options);\n};\n/**\n * Opt the user out of data tracking and cookies/localstorage for this Mixpanel instance\n *\n * ### Usage\n *\n * // opt user out\n * mixpanel.opt_out_tracking();\n *\n * // opt user out with different cookie configuration from Mixpanel instance\n * mixpanel.opt_out_tracking({\n * cookie_expiration: 30,\n * secure_cookie: true\n * });\n *\n * @param {Object} [options] A dictionary of config options to override\n * @param {boolean} [options.delete_user=true] If true, will delete the currently identified user's profile and clear all charges after opting the user out\n * @param {boolean} [options.clear_persistence=true] If true, will delete all data stored by the sdk in persistence\n * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable\n * @param {string} [options.cookie_prefix=__mp_opt_in_out] Custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookie_expiration] Number of days until the opt-in cookie expires (overrides value specified in this Mixpanel instance's config)\n * @param {string} [options.cookie_domain] Custom cookie domain (overrides value specified in this Mixpanel instance's config)\n * @param {boolean} [options.cross_site_cookie] Whether the opt-in cookie is set as cross-site-enabled (overrides value specified in this Mixpanel instance's config)\n * @param {boolean} [options.cross_subdomain_cookie] Whether the opt-in cookie is set as cross-subdomain or not (overrides value specified in this Mixpanel instance's config)\n * @param {boolean} [options.secure_cookie] Whether the opt-in cookie is set as secure or not (overrides value specified in this Mixpanel instance's config)\n */\n\n\nMixpanelLib.prototype.opt_out_tracking = function (options) {\n options = _.extend({\n 'clear_persistence': true,\n 'delete_user': true\n }, options); // delete user and clear charges since these methods may be disabled by opt-out\n\n if (options['delete_user'] && this['people'] && this['people']._identify_called()) {\n this['people'].delete_user();\n this['people'].clear_charges();\n }\n\n this._gdpr_call_func(optOut, options);\n\n this._gdpr_update_persistence(options);\n};\n/**\n * Check whether the user has opted in to data tracking and cookies/localstorage for this Mixpanel instance\n *\n * ### Usage\n *\n * var has_opted_in = mixpanel.has_opted_in_tracking();\n * // use has_opted_in value\n *\n * @param {Object} [options] A dictionary of config options to override\n * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable\n * @param {string} [options.cookie_prefix=__mp_opt_in_out] Custom prefix to be used in the cookie/localstorage name\n * @returns {boolean} current opt-in status\n */\n\n\nMixpanelLib.prototype.has_opted_in_tracking = function (options) {\n return this._gdpr_call_func(hasOptedIn, options);\n};\n/**\n * Check whether the user has opted out of data tracking and cookies/localstorage for this Mixpanel instance\n *\n * ### Usage\n *\n * var has_opted_out = mixpanel.has_opted_out_tracking();\n * // use has_opted_out value\n *\n * @param {Object} [options] A dictionary of config options to override\n * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable\n * @param {string} [options.cookie_prefix=__mp_opt_in_out] Custom prefix to be used in the cookie/localstorage name\n * @returns {boolean} current opt-out status\n */\n\n\nMixpanelLib.prototype.has_opted_out_tracking = function (options) {\n return this._gdpr_call_func(hasOptedOut, options);\n};\n/**\n * Clear the user's opt in/out status of data tracking and cookies/localstorage for this Mixpanel instance\n *\n * ### Usage\n *\n * // clear user's opt-in/out status\n * mixpanel.clear_opt_in_out_tracking();\n *\n * // clear user's opt-in/out status with specific cookie configuration - should match\n * // configuration used when opt_in_tracking/opt_out_tracking methods were called.\n * mixpanel.clear_opt_in_out_tracking({\n * cookie_expiration: 30,\n * secure_cookie: true\n * });\n *\n * @param {Object} [options] A dictionary of config options to override\n * @param {boolean} [options.enable_persistence=true] If true, will re-enable sdk persistence\n * @param {string} [options.persistence_type=localStorage] Persistence mechanism used - cookie or localStorage - falls back to cookie if localStorage is unavailable\n * @param {string} [options.cookie_prefix=__mp_opt_in_out] Custom prefix to be used in the cookie/localstorage name\n * @param {Number} [options.cookie_expiration] Number of days until the opt-in cookie expires (overrides value specified in this Mixpanel instance's config)\n * @param {string} [options.cookie_domain] Custom cookie domain (overrides value specified in this Mixpanel instance's config)\n * @param {boolean} [options.cross_site_cookie] Whether the opt-in cookie is set as cross-site-enabled (overrides value specified in this Mixpanel instance's config)\n * @param {boolean} [options.cross_subdomain_cookie] Whether the opt-in cookie is set as cross-subdomain or not (overrides value specified in this Mixpanel instance's config)\n * @param {boolean} [options.secure_cookie] Whether the opt-in cookie is set as secure or not (overrides value specified in this Mixpanel instance's config)\n */\n\n\nMixpanelLib.prototype.clear_opt_in_out_tracking = function (options) {\n options = _.extend({\n 'enable_persistence': true\n }, options);\n\n this._gdpr_call_func(clearOptInOut, options);\n\n this._gdpr_update_persistence(options);\n}; // EXPORTS (for closure compiler)\n// MixpanelLib Exports\n\n\nMixpanelLib.prototype['init'] = MixpanelLib.prototype.init;\nMixpanelLib.prototype['reset'] = MixpanelLib.prototype.reset;\nMixpanelLib.prototype['disable'] = MixpanelLib.prototype.disable;\nMixpanelLib.prototype['time_event'] = MixpanelLib.prototype.time_event;\nMixpanelLib.prototype['track'] = MixpanelLib.prototype.track;\nMixpanelLib.prototype['track_links'] = MixpanelLib.prototype.track_links;\nMixpanelLib.prototype['track_forms'] = MixpanelLib.prototype.track_forms;\nMixpanelLib.prototype['track_pageview'] = MixpanelLib.prototype.track_pageview;\nMixpanelLib.prototype['register'] = MixpanelLib.prototype.register;\nMixpanelLib.prototype['register_once'] = MixpanelLib.prototype.register_once;\nMixpanelLib.prototype['unregister'] = MixpanelLib.prototype.unregister;\nMixpanelLib.prototype['identify'] = MixpanelLib.prototype.identify;\nMixpanelLib.prototype['alias'] = MixpanelLib.prototype.alias;\nMixpanelLib.prototype['name_tag'] = MixpanelLib.prototype.name_tag;\nMixpanelLib.prototype['set_config'] = MixpanelLib.prototype.set_config;\nMixpanelLib.prototype['get_config'] = MixpanelLib.prototype.get_config;\nMixpanelLib.prototype['get_property'] = MixpanelLib.prototype.get_property;\nMixpanelLib.prototype['get_distinct_id'] = MixpanelLib.prototype.get_distinct_id;\nMixpanelLib.prototype['toString'] = MixpanelLib.prototype.toString;\nMixpanelLib.prototype['_check_and_handle_notifications'] = MixpanelLib.prototype._check_and_handle_notifications;\nMixpanelLib.prototype['_handle_user_decide_check_complete'] = MixpanelLib.prototype._handle_user_decide_check_complete;\nMixpanelLib.prototype['_show_notification'] = MixpanelLib.prototype._show_notification;\nMixpanelLib.prototype['opt_out_tracking'] = MixpanelLib.prototype.opt_out_tracking;\nMixpanelLib.prototype['opt_in_tracking'] = MixpanelLib.prototype.opt_in_tracking;\nMixpanelLib.prototype['has_opted_out_tracking'] = MixpanelLib.prototype.has_opted_out_tracking;\nMixpanelLib.prototype['has_opted_in_tracking'] = MixpanelLib.prototype.has_opted_in_tracking;\nMixpanelLib.prototype['clear_opt_in_out_tracking'] = MixpanelLib.prototype.clear_opt_in_out_tracking;\nMixpanelLib.prototype['get_group'] = MixpanelLib.prototype.get_group;\nMixpanelLib.prototype['set_group'] = MixpanelLib.prototype.set_group;\nMixpanelLib.prototype['add_group'] = MixpanelLib.prototype.add_group;\nMixpanelLib.prototype['remove_group'] = MixpanelLib.prototype.remove_group;\nMixpanelLib.prototype['track_with_groups'] = MixpanelLib.prototype.track_with_groups;\nMixpanelLib.prototype['stop_batch_requests'] = MixpanelLib.prototype.stop_batch_requests; // MixpanelPersistence Exports\n\nMixpanelPersistence.prototype['properties'] = MixpanelPersistence.prototype.properties;\nMixpanelPersistence.prototype['update_search_keyword'] = MixpanelPersistence.prototype.update_search_keyword;\nMixpanelPersistence.prototype['update_referrer_info'] = MixpanelPersistence.prototype.update_referrer_info;\nMixpanelPersistence.prototype['get_cross_subdomain'] = MixpanelPersistence.prototype.get_cross_subdomain;\nMixpanelPersistence.prototype['clear'] = MixpanelPersistence.prototype.clear;\n\n_.safewrap_class(MixpanelLib, ['identify', '_check_and_handle_notifications', '_show_notification']);\n\nvar instances = {};\n\nvar extend_mp = function extend_mp() {\n // add all the sub mixpanel instances\n _.each(instances, function (instance, name) {\n if (name !== PRIMARY_INSTANCE_NAME) {\n mixpanel_master[name] = instance;\n }\n }); // add private functions as _\n\n\n mixpanel_master['_'] = _;\n};\n\nvar override_mp_init_func = function override_mp_init_func() {\n // we override the snippets init function to handle the case where a\n // user initializes the mixpanel library after the script loads & runs\n mixpanel_master['init'] = function (token, config, name) {\n if (name) {\n // initialize a sub library\n if (!mixpanel_master[name]) {\n mixpanel_master[name] = instances[name] = create_mplib(token, config, name);\n\n mixpanel_master[name]._loaded();\n }\n\n return mixpanel_master[name];\n } else {\n var instance = mixpanel_master;\n\n if (instances[PRIMARY_INSTANCE_NAME]) {\n // main mixpanel lib already initialized\n instance = instances[PRIMARY_INSTANCE_NAME];\n } else if (token) {\n // intialize the main mixpanel lib\n instance = create_mplib(token, config, PRIMARY_INSTANCE_NAME);\n\n instance._loaded();\n\n instances[PRIMARY_INSTANCE_NAME] = instance;\n }\n\n mixpanel_master = instance;\n\n if (init_type === INIT_SNIPPET) {\n window$1[PRIMARY_INSTANCE_NAME] = mixpanel_master;\n }\n\n extend_mp();\n }\n };\n};\n\nvar add_dom_loaded_handler = function add_dom_loaded_handler() {\n // Cross browser DOM Loaded support\n function dom_loaded_handler() {\n // function flag since we only want to execute this once\n if (dom_loaded_handler.done) {\n return;\n }\n\n dom_loaded_handler.done = true;\n DOM_LOADED = true;\n ENQUEUE_REQUESTS = false;\n\n _.each(instances, function (inst) {\n inst._dom_loaded();\n });\n }\n\n function do_scroll_check() {\n try {\n document$1.documentElement.doScroll('left');\n } catch (e) {\n setTimeout(do_scroll_check, 1);\n return;\n }\n\n dom_loaded_handler();\n }\n\n if (document$1.addEventListener) {\n if (document$1.readyState === 'complete') {\n // safari 4 can fire the DOMContentLoaded event before loading all\n // external JS (including this file). you will see some copypasta\n // on the internet that checks for 'complete' and 'loaded', but\n // 'loaded' is an IE thing\n dom_loaded_handler();\n } else {\n document$1.addEventListener('DOMContentLoaded', dom_loaded_handler, false);\n }\n } else if (document$1.attachEvent) {\n // IE\n document$1.attachEvent('onreadystatechange', dom_loaded_handler); // check to make sure we arn't in a frame\n\n var toplevel = false;\n\n try {\n toplevel = window$1.frameElement === null;\n } catch (e) {// noop\n }\n\n if (document$1.documentElement.doScroll && toplevel) {\n do_scroll_check();\n }\n } // fallback handler, always will work\n\n\n _.register_event(window$1, 'load', dom_loaded_handler, true);\n};\n\nfunction init_as_module() {\n init_type = INIT_MODULE;\n mixpanel_master = new MixpanelLib();\n override_mp_init_func();\n mixpanel_master['init']();\n add_dom_loaded_handler();\n return mixpanel_master;\n}\n\nvar mixpanel = init_as_module();\nmodule.exports = mixpanel;","import { Mixpanel } from 'mixpanel-browser'\n\nexport class MixpanelInAppMessaging {\n origin: string | null\n messageSource: Window | null\n mixpanel: Mixpanel\n\n constructor(mixpanel: Mixpanel) {\n this.mixpanel = mixpanel\n this.messageSource = null\n this.origin = null\n }\n\n checkForMessages = (records: MutationRecord[]) => {\n let addedMixpanelNotificationWrapper = false\n let removedMixpanelNotificationWrapper = false\n\n records.forEach(record => {\n record.addedNodes.forEach(node => {\n if (\n node instanceof HTMLElement &&\n node.id === 'mixpanel-notification-wrapper'\n ) {\n addedMixpanelNotificationWrapper = true\n }\n })\n\n record.removedNodes.forEach(node => {\n if (\n node instanceof HTMLElement &&\n node.id === 'mixpanel-notification-wrapper'\n ) {\n removedMixpanelNotificationWrapper = true\n }\n })\n })\n\n if (addedMixpanelNotificationWrapper) {\n this.sendMessage('display', true)\n }\n\n if (removedMixpanelNotificationWrapper) {\n this.sendMessage('display', false)\n }\n }\n\n handleMessage = (messageEvent: MessageEvent) => {\n this.messageSource = messageEvent.source as Window | null\n this.origin = messageEvent.origin\n\n if (messageEvent.data.subject === 'identifyUser') {\n this.identifyUser(messageEvent.data.userId)\n }\n }\n\n identifyUser = (userId: string) => {\n this.mixpanel.identify(userId)\n }\n\n init = () => {\n if (typeof process.env.REACT_APP_MIXPANEL_TOKEN === 'undefined') {\n throw new Error('Missing Mixpanel API token')\n }\n\n this.mixpanel.init(process.env.REACT_APP_MIXPANEL_TOKEN, {\n // eslint-disable-next-line @typescript-eslint/camelcase\n batch_requests: true,\n debug: process.env.NODE_ENV !== 'production',\n // eslint-disable-next-line @typescript-eslint/camelcase\n disable_cookie: true,\n // eslint-disable-next-line @typescript-eslint/camelcase\n api_host:\n process.env.REACT_APP_DEV_BASE_URL ||\n 'https://lastpass.com/product-messaging',\n // eslint-disable-next-line @typescript-eslint/camelcase\n inapp_link_new_window: true\n })\n\n window.addEventListener(\n 'message',\n event => this.handleMessage(event),\n false\n )\n // @ts-ignore\n window.open = url => {\n this.sendMessage('goTo', url)\n }\n\n const observer = new MutationObserver(this.checkForMessages)\n observer.observe(document.querySelector('body') as Node, {\n childList: true\n })\n }\n\n sendMessage = (subject: string, value) => {\n if (!this.messageSource || !this.origin) {\n throw new Error('No target defined send the message to')\n }\n\n this.messageSource.postMessage({ subject, value }, this.origin)\n }\n}\n","import { MixpanelInAppMessaging } from './mixpanel-in-app-messaging'\nimport mixpanel from 'mixpanel-browser'\n\nconst iam = new MixpanelInAppMessaging(mixpanel)\niam.init()\n","export default function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}"],"sourceRoot":""}