{"version":3,"sources":["webpack:///liftoff-58ea9097a7f92539efa7.js","webpack:///webpack/bootstrap 4c081c14b06df0b018c2","webpack:///./src/js/frontendlib/utils.js","webpack:///./src/js/frontendlib/dom_utils.js","webpack:///./src/js/constants.js","webpack:///./src/js/madlib/logger.js","webpack:///./src/js/madlib/autoclick/AutoclickBehaviorAbstract.js","webpack:///./src/js/error_handling.js","webpack:///./src/js/frontendlib/event_listener.js","webpack:///./src/js/madlib/liftoff_mraid.js","webpack:///./src/js/madlib/adexp.js","webpack:///./src/js/lib/monkey_patch.js","webpack:///./src/js/madlib/cta.js","webpack:///./src/js/madlib/csp-env/messages.js","webpack:///./src/js/lib/audio_toggle_icon.js","webpack:///./src/js/lib/global_audio_controller.js","webpack:///./src/js/creative_utils.js","webpack:///./src/js/madlib/autoclick/autoclick_utils.js","webpack:///./src/js/lib/click_interaction.js","webpack:///./src/js/madlib/addDeadzones.js","webpack:///./src/js/click_handling.js","webpack:///./src/js/interaction_monitor.js","webpack:///./src/js/madlib/autoclick/Autoclick.js","webpack:///./src/js/madlib/autoclick/behaviors/AutoclickBehaviorCompletedDelay.js","webpack:///./src/js/madlib/autoclick/behaviors/AutoclickBehaviorInteractionCount.js","webpack:///./src/js/madlib/autoclick/behaviors/AutoclickBehaviorLastInteraction.js","webpack:///./src/js/madlib/autoclick/behaviors/AutoclickBehaviorLastInteractionAndCount.js","webpack:///./src/js/madlib/autoclick/behaviors/AutoclickBehaviorLoadDelay.js","webpack:///./src/js/madlib/autoclick/behaviors/AutoclickBehaviorViewableDelay.js","webpack:///./src/js/madlib/autoclick/behaviors/AutoclickBehaviorViewableDelayWithReset.js","webpack:///./src/js/madlib/madlib.js","webpack:///./src/js/container.js","webpack:///./src/js/lib/last_chance_endscreen/last_chance_endscreen.js","webpack:///./src/js/madlib/liftoff.js","webpack:///./src/js/madlib/component.js","webpack:///./src/js/madlib/letterbox_config.js","webpack:///./src/js/madlib/window_resize_logger.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","__webpack_exports__","_toConsumableArray","arr","Array","isArray","arr2","length","from","makeJSONRequest","url","json","method","options","arguments","undefined","_options$rejectOnErro","rejectOnErrorResponse","fetchPromise","fetch","body","JSON","stringify","credentials","headers","Content-Type","wrapResponsePromise","value","appendParamObjectToURL","appendQueryStringToURL","assignWithDefaults","binaryFind","camelCase","capitalize","clamp","clone","compareNumbers","compareStrings","composeAsync","smartCompare","deepEqual","deepInclude","deepUnique","diffObjects","escapeRegExp","flatten","formatConjunction","formatFileSize","formatUSD","getLocale","numberToLocaleString","getIn","kebabCase","isPromise","isEmpty","loadImage","loadImages","mapByID","mapcat","mergePropertiesWithDefaults","objFromQueryString","objToQueryString","errorSensitiveFetch","postJSON","patchJSON","ping","poll","precisionRound","randomInt","range","request","runAsync","removeKeys","removeEmptyKeys","selectKeys","shuffle","stableSort","timeDifference","type","wait","timeout","unique","isFunction","_slicedToArray","sliceIterator","_arr","_n","_d","_e","_s","_i","Symbol","iterator","next","done","push","err","TypeError","params","queryString","includes","target","defaults","_len","sources","_key","keys","forEach","key","filter","source","fn","high","low","mid","str","_ref","_ref$isSuffix","isSuffix","split","map","part","toLowerCase","join","toUpperCase","slice","x","a","b","obj","parse","trim","localeCompare","_len2","funcs","_key2","arg","res","Promise","resolve","f","then","_ref2","_ref2$reverse","reverse","Error","compareType","_ref3","_ref4","valueA","valueB","_ref5","_ref5$toJSON","toJSON","compareA","compareB","tA","tB","size","bShallowCopy","Set","_iteratorNormalCompletion","_didIteratorError","_iteratorError","aLoop","_step","_iterator","aElement","has","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","bElement","delete","return","k","parent","child","some","values","index","item","concat","currItem","includeAKeys","result","replace","apply","words","conjunction","wc","thousands","Math","floor","round","pow","val","assign","style","currency","toLocaleString","_window","window","navigator","languages","language","locale","Number","e","ks","charAt","crossOrigin","reject","img","Image","addEventListener","src","complete","urls","all","reduce","id","_len3","args","_key3","location","search","acc","_part$split$map","decodeURIComponent","_part$split$map2","encodeURIComponent","responsePromise","response","Response","ok","catch","timeoutMS","timedOut","setTimeout","_ref6","state","number","precision","factor","random","start","stop","step","fill","_","req","XMLHttpRequest","onreadystatechange","readyState","status","bind","open","setRequestHeader","send","j","_ref7","sortFn","agg","set","Map","sort","elapsed","abs","units","msPerSecond","msPerMinute","msPerHour","msPerDay","msPerWeek","msPerMonth","toString","match","ms","el","indexOf","_objectWithoutProperties","_defineProperty","writable","addOneTimeListener","animationEndPromise","transitionEndPromise","runTransitionSequence","appendChildren","copyToClipboard","createElement","empty","fetchHTML","firstAncestor","fragmentFromString","forceReflow","generateSnippetMap","getCSSProperty","getElementsByClass","getRelativeBoundingClientRect","getAggregateBoundingClientRect","getFontSizeToFit","getFontSizeToFitLines","imageIsRendered","off","on","onAnimationsComplete","parseCSSLength","prependChild","replaceStyle","scrollIntoView","strToElement","strToStyle","writeToIframe","preparetagHTML","appendImpressionTags","__WEBPACK_IMPORTED_MODULE_0__utils__","eventName","ignoreBubbling","listener","event","removeEventListener","eventRacePromise","events","_ref$matchTarget","matchTarget","eventsString","callbackRun","callback","message","transitions","_ref2$timeoutMS","_ref2$continueFn","continueFn","prevTransitionEndPromise","thisTransition","finally","currentTransitionEndPromise","race","node","children","fragment","document","createDocumentFragment","appendChild","Node","text","multiline","elemType","select","execCommand","remove","elementConfig","createTextNode","_elementConfig$namesp","namespace","_elementConfig$tagNam","tagName","_elementConfig$classL","classList","_elementConfig$style","_elementConfig$attrib","attributes","_elementConfig$data","data","_elementConfig$childr","_elementConfig$eventH","eventHandlers","unintendedProps","unintendedKeys","element","createElementNS","filteredClassList","className","_element$classList","add","entries","setAttribute","dataset","firstChild","removeChild","selector","halt","matches","parentNode","strHTML","templateEl","innerHTML","content","offsetHeight","html","wrapper","snippets","querySelectorAll","coll","snippet","removeAttribute","cloneNode","getComputedStyle","getPropertyValue","classNames","elements","querySelector","reference","rect","getBoundingClientRect","refRect","top","bottom","left","right","width","height","nodes","min","max","Infinity","maxFontSizePx","startingFontSize","fontSize","startingOverflow","overflow","clientHeight","scrollHeight","clientWidth","scrollWidth","maxLines","parseFloat","prevFontSizeStyle","prevHeight","prevLineHeight","lineHeight","computedFontSize","paddingTop","paddingBottom","Date","now","checkRendered","requestAnimationFrame","names","els","animationsLeft","exec","_match","insertBefore","newStyles","pRect","topDiff","botDiff","scrollTop","div","iframeEl","contentHTML","contentWindow","write","close","tagHTML","wrapperEl","originalScriptTag","replacementScriptTag","nodeName","nodeValue","replaceChild","containerEl","impressionTags","append","PLATFORM_ANDROID","PLATFORM_IOS","AUDIO_POLICY_ALWAYS_MUTE","AUDIO_POLICY_ON_INTERACTION","AUDIO_POLICY_NO_RESTRICTIONS","EXCHANGE_DOUBLECLICK","EXCHANGE_INNERACTIVE","EXCHANGE_IRONSOURCE","EXCHANGE_MINTEGRAL","EXCHANGE_VUNGLE","ORIENTATION_PORTRAIT","ORIENTATION_LANDSCAPE","CLICK_AREA_TYPE_OTHER","CLICK_AREA_TYPE_CTA","CLICK_METRIC_TYPE_CLOSE","CLICK_METRIC_TYPE_CTA","CLICK_METRIC_TYPE_DEADZONE","CLICK_METRIC_TYPE_UNKNOWN","CLICK_REJECTION_REASON_NO_INTERACTIONS","CLICKTHROUGH_URL_TYPE_LIFTOFF_ENDPOINT","CLICK_TRACKING_URL_TYPE_LIFTOFF_ENDPOINT","TRACKING_METHOD_OPEN_METHOD","TRACKING_METHOD_IMAGE","TRACKING_METHOD_BEACON","AUTOCLICK_TYPE_LAST_INTERACTION","AUTOCLICK_TYPE_INTERACTION_COUNT","AUTOCLICK_TYPE_LAST_INTERACTION_AND_INTERACTION_COUNT","AUTOCLICK_TYPE_COMPLETED_DELAY","AUTOCLICK_TYPE_LOAD_DELAY","AUTOCLICK_TYPE_VIEWABLE_DELAY","AUTOCLICK_TYPE_VIEWABLE_DELAY_WITH_RESET","CLICK_OPEN_METHOD_WINDOW_OPEN","CLICK_OPEN_METHOD_MRAID","CLICK_OPEN_METHOD_ANCHOR","CLICK_OPEN_METHOD_LOCATION","_classCallCheck","instance","Constructor","__WEBPACK_IMPORTED_MODULE_0__adexp__","__WEBPACK_IMPORTED_MODULE_1__error_handling__","__WEBPACK_IMPORTED_MODULE_2__frontendlib_utils__","_createClass","defineProperties","props","descriptor","protoProps","staticProps","console","error","payload","postMetricV2","adexpContextSnapshotFn","endpoint","eventTrackingParam","adexpContext","context","metric","Logger","this","enabled","loggedErrors","_this","errorEvent","normalizedError","recordError","recordLabeledError","tag","_processError","errorObj","normalizedErr","errorIdentifier","sourceURL","line","recordLog","log","isInteger","alwaysRecordMetricV2","debug","init","AutoclickBehaviorAbstract","autoclick","behavior","delayClickthroughHandler","_autoclick","_behavior","internalCount","count","delay","getCurrentCount","getBehaviorCount","getBehaviorDelay","isCountReached","_possibleConstructorReturn","self","ReferenceError","_inherits","subClass","superClass","create","constructor","setPrototypeOf","__proto__","Warning","normalizeError","normalizeErrorEvent","normalizePromiseRejectionEvent","shouldIgnoreError","__WEBPACK_IMPORTED_MODULE_0__frontendlib_utils__","_Error","getPrototypeOf","captureStackTrace","severity","tryConvertStringToNumber","parsed","parseInt","isNaN","tryParseStackInfo","stack","String","column","errorProps","getOwnPropertyNames","filename","lineno","colno","parsedInfo","reason","reasonIsError","reasonIsString","errorMessage","stackFilter","RegExp","regexFilters","messageFilter","errorStr","test","normalized","nKeys","onlyMessage","onlyMessageStack","noSourceURL","EventListener","methods","_this2","single","_this3","cb","onEvent","emitEvent","emit","__WEBPACK_IMPORTED_MODULE_0__frontendlib_event_listener__","__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__","__WEBPACK_IMPORTED_MODULE_2__constants__","__WEBPACK_IMPORTED_MODULE_3__logger__","__WEBPACK_IMPORTED_MODULE_4__error_handling__","CLICK_OPEN_METHODS","WINDOW_OPEN","MRAID","ANCHOR","LOCATION","LiftoffMRAID","liftoffMraidInitTimestamp","pubsubify","once","_addMraidEventListener","viewableDurationMS","lastViewableTS","clickRetryTimeout","lastOpenedURL","isOrientationLocked","orientationToLock","viewable","isViewableByEvent","mraids","mraidIndex","supported","_setInitialState","_addEventListeners","document.hidden","hidden","document.visibilityState","visibilityState","LiftoffMRAID.viewable","MRAID_ENV","mraid","getMRAID","ready","_mraidTry","hasSupport","getState","fallback","isViewable","processViewableChange","isViewportShown","sinceInitMs","sinceInit","version","getMRAIDVersion","func","_ref$tag","_ref$fallback","_ref$logError","logError","errors","getVersion","ee","_appendEventLog","viewableChange","normalizedIsViewable","lockOrientation","clearTimeout","continuous","_this4","nowAndOnViewableChange","_this5","exchange","_ref2$isLiftoffURL","platform","abTests","isLiftoffURL","_ref2$isAutoclick","isAutoclick","mraidOpenIsSupported","requireMRAID","clickWaterfallDisabled","getFinalClickURL","openMethod","open_method","tracking_method","openMethods","href","click","isOpenSKProductView","appleStoreUrlPrefix","tryOpen","methodType","finalClickURL","clickOpenMethod","_this6","onReady","recordMetricV2","use","_this7","useCustomClose","orientation","setOrientationProperties","allowOrientationChange","forceOrientation","windowMraid","methodName","isSupported","support","prop","_ref4$log","logMethodSupport","_this8","_ref5$log","innerHeight","innerWidth","_LiftoffMRAID","AdexpMetricV2","AdexpJavaScriptError","AdexpLog","AdexpMessage","getAdexpContextSnapshotFn","_ref$severity","AdexpContext","viewportWidth","viewportHeight","adLanguage","ad_language","viewport_height","viewport_width","metrics_v2","viewportEl","hasMraidFn","patchedObjects","MonkeyPatch","propertyName","protoMap","dataKey","originalValue","getOwnPropertyDescriptor","_applyPatch","_patch","pointInCTA","clickAreaTypeFromEvent","isDeadzoneCoord","__WEBPACK_IMPORTED_MODULE_0__constants__","pointInEl","y","_el$getBoundingClient","elTop","elRight","elBottom","ctaEl","clientX","clientY","isFinite","warn","MESSAGE_CREATIVE_MADE_SOUND","MESSAGE_TOGGLE_MUTED","MESSAGE_INTERACTION_CHANGE","MESSAGE_CLICKTHROUGH","MESSAGE_MRAID_EVENT","MESSAGE_MRAID_CALL","MESSAGE_UPDATED_MRAID_PROPERTIES","MESSAGE_INNER_ENV_INIT_COMPLETE","MESSAGE_OUTER_ENV_INIT_COMPLETE","MESSAGE_REQUEST_DOM_SNAPSHOT","MESSAGE_DOM_SNAPSHOT","MESSAGE_INNER_ENV_ERROR","MESSAGE_RESIZE","MESSAGE_VUNGLE_CLICKTHROUGH","MESSAGE_TRESENSA_INTERACTION","__WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__","AudioToggleIcon","setMuted","muted","display","__WEBPACK_IMPORTED_MODULE_0__monkey_patch__","isMediaElement","doesVideoHaveAudio","audioTracks","webkitAudioDecodedByteCount","GlobalWebAudioController","_firstSoundMade","_muted","_cb","_gainNodes","originalAudioContext","AudioContext","webkitAudioContext","audioCtx","gainNode","createGain","analyserNode","createAnalyser","fftSize","freqData","Uint8Array","frequencyBinCount","soundPollInterval","setInterval","getByteFrequencyData","clearInterval","_handleFirstSound","originalDestination","destination","connect","gain","shouldMute","MediaElementWatcher","_seenElements","WeakSet","originalCreateElement","Document","patchFunction","_handleNewElement","originalAudio","Audio","originalMethod","HTMLMediaElement","_len4","_key4","GlobalMediaElementAudioController","_globallyMuted","_elToSetState","WeakMap","_allMediaEls","_originalMutedSetter","originalMutedGetter","patchSetter","_canMakeSound","systemMutedState","patchGetter","recordedSetState","mute","_watchForSound","_toggleElementMuted","paused","_toggleMediaMuted","GlobalAudioController","_initialized","_onFirstSoundCallbacks","handleFirstSound","_init","applyLiftoffPolicy","postHTMLReturn","getDOMSnapshot","configureHTMLReturn","__WEBPACK_IMPORTED_MODULE_0__lib_audio_toggle_icon__","__WEBPACK_IMPORTED_MODULE_1__lib_global_audio_controller__","__WEBPACK_IMPORTED_MODULE_2__madlib_liftoff_mraid__","__WEBPACK_IMPORTED_MODULE_3__constants__","__WEBPACK_IMPORTED_MODULE_4__frontendlib_utils__","createCloseEl","closeEl","position","zIndex","buttonStyles","textAlign","border","borderRadius","boxSizing","pointerEvents","closeTargetEl","color","backgroundColor","stopPropagation","closeDelayEl","countdown","textContent","closeDelayInterval","onFirstInteraction","hasUserInteracted","handleFirstInteraction","createGlobalAudioToggle","opacity","icon","iconEl","getElement","isCurrentlyMuted","contains","runAfterFirstSound","globallyMuteAllAudio","snippetEl","addBorder","showAdChoices","russianAgeRating","showChineseWatermark","closeDelay","audioPolicy","creativeID","sourceAppName","sourceAppID","cdnURL","watermarksEl","queryParams","creative_id","source_app_name","source_app_id","optoutPageURL","preventDefault","backgroundImage","backgroundPosition","backgroundRepeat","backgroundSize","ageTag","fontWeight","background","padding","verticalAlign","globalAudioToggleEl","isUsingCustomClose","adexpEndpoint","documentElement","outerHTML","htmlReturnDelay","postHTML","info","intentionalInteractionCounterFn","__WEBPACK_IMPORTED_MODULE_0__cta__","throttle","ignore","minimumInteractions","intentionalInteractionsFromMonitor","intentionalInteractionCountFromThrottle","countIntentionalInteractionThrottle","countIntentionalInteractions","lastInteraction","startX","startY","cumulativeStats","interactionCount","hasBeenClicked","firstClickHandlers","sliders","setSlideDistance","sliderSize","setSlideRatio","getPointerEventX","changedTouches","touches","ClickInteraction","handleFirstClick","onCompleted","clickEl","onClickComplete","handler","slideStartPosition","mousedown touchstart","mousemove touchmove","mouseup mouseleave touchend","slideDistance","completedSliders","addDeadzoneStyles","head","addDeadzones","useExpandedZones","rootEl","getClickTrackingQueryParams","handleClick","__WEBPACK_IMPORTED_MODULE_0__madlib_liftoff_mraid__","__WEBPACK_IMPORTED_MODULE_1__madlib_logger__","__WEBPACK_IMPORTED_MODULE_3__frontendlib_utils__","getLiftoffContainerRect","getElementById","allInteractionData","containerRect","ct","aw","toFixed","ah","tv","getViewableDurationMS","cx","cy","durationMS","dur","it","isTrusted","frc","maxForce","ar","maxArea","distance","pt","pointerType","ic","tid","totalDistance","constructLiftoffClickURL","baseClickURL","pingTrackingURLWithImage","onload","onerror","pingTrackingURLWithBeacon","sendBeacon","clickthroughWithScriptTag","clickthroughURL","_ref2$abTests","_ref2$onlyMraid","onlyMraid","_loOpen","clickURL","script","return_js","isLiftoffClickTrackingURL","clickTrackingURL","pingClickTrackingURL","getClickTrackingURLString","trackingMethod","canUse","pingFn","prevPromiseFn","nextWaterfallOption","urlString","handleClickTracking","clickTrackingURLs","pingCompletePromises","isLiftoffClickthroughURL","handleClickthrough","isReengagement","_ref4$abTests","pv","urlStr","mac","dap","clickConfig","_ref5$abTests","exchangePingElem","clickthroughParams","promise","InteractionMonitor","_get","receiver","Function","desc","getPointerEventPointerType","pointerEvent","isButtonPressed","buttons","which","computeDistance","endX","endY","sqrt","isTouchInWindow","touch","maxTouchEventForce","touchForces","force","touchEventArea","sum","radiusX","radiusY","PI","Interaction","startEvent","_startEvent","_lastMoveEvent","_endEvent","_maxForce","_maxArea","area","_totalDistance","endEvent","_updateMetrics","moveEvent","metrics","isComplete","timestamp","newEvent","_lastMaxArea","lastEvent","InteractionEventMonitor","_interactionCount","_totalInteractionDistance","_lastInteraction","_interactionStartHandlers","_interactionEndHandlers","_attachedEventListeners","_attachEventListeners","listenerOptions","capture","handlerFn","isInteractionInProgress","normalizedEvent","_normalizeEvent","setEndEvent","_updateCumulativeInteractionStats","setLastMoveEvent","isInProgress","getMetrics","getLastInteractionData","getCumulativeInteractionStats","MouseEventMonitor","_InteractionEventMoni","pageX","pageY","timeStamp","webkitForce","_handleStartEvent","_handleEndEvent","_handleMoveEvent","PointerEventMonitor","_InteractionEventMoni2","pressure","TouchEventMonitor","_InteractionEventMoni3","isInWindow","isLastInteractionComplete","_monitors","monitor","onInteractionStart","_handleInteractionEvent","onInteractionEnd","_previousAllInteractionData","_interactionChangeHandlers","currentAllInteractionData","getAllInteractionData","find","eventMonitor","_chooseEventMonitorWithInProgressInteractions","_chooseEventMonitorWithCompletedInteractions","_chooseEventMonitor","_behaviorClasses","__WEBPACK_IMPORTED_MODULE_1__behaviors_AutoclickBehaviorCompletedDelay__","__WEBPACK_IMPORTED_MODULE_2__behaviors_AutoclickBehaviorInteractionCount__","__WEBPACK_IMPORTED_MODULE_3__behaviors_AutoclickBehaviorLastInteraction__","__WEBPACK_IMPORTED_MODULE_4__behaviors_AutoclickBehaviorLastInteractionAndCount__","__WEBPACK_IMPORTED_MODULE_5__behaviors_AutoclickBehaviorLoadDelay__","__WEBPACK_IMPORTED_MODULE_6__behaviors_AutoclickBehaviorViewableDelay__","__WEBPACK_IMPORTED_MODULE_7__behaviors_AutoclickBehaviorViewableDelayWithReset__","behaviorClasses","MONITORED_EVENTS","INTERACTION_EVENT","COMPLETED","ENGAGEMENT","HTML_LOADED","VIEWABLE","VIEWABLE_CHANGE","AUTOCLICK_EVENT_COUNT_CHANGE","Autoclick","_eventListeners","clickthroughHandler","disable","_clickthroughHandler","_lastCount","behaviorType","behaviorClass","_handleDelayClickthrough","eventListeners","onEngagement","onHtmlLoaded","onViewable","onViewableChange","_recordLastInteraction","onInteraction","autoclickDisabled","_len5","_key5","_delayTimer","_clickthrough","_len6","_key6","__WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__","AutoclickBehaviorCompletedDelay","_AutoclickBehaviorAbs","delayClickthrough","__WEBPACK_IMPORTED_MODULE_1__autoclick_utils__","AutoclickBehaviorInteractionCount","_counter","triggered","setCurrentCount","AutoclickBehaviorLastInteraction","AutoclickBehaviorLastInteractionAndCount","AutoclickBehaviorLoadDelay","AutoclickBehaviorViewableDelay","__WEBPACK_IMPORTED_MODULE_2__frontendlib_event_listener__","__WEBPACK_IMPORTED_MODULE_3__lib_click_interaction__","__WEBPACK_IMPORTED_MODULE_4__container__","__WEBPACK_IMPORTED_MODULE_5__cta__","__WEBPACK_IMPORTED_MODULE_6__liftoff_mraid__","__WEBPACK_IMPORTED_MODULE_7__addDeadzones__","Madlib","config","loaded","containerByID","allContainers","rootContainer","didEverApplyLetterboxStyles","productIndex","clickAreaType","Liftoff","_Liftoff$env$products","env","products","handleMadlibError","applyExchangePolicies","loadDOM","addEventListeners","coordinate","layout","onLoadCompleted","animationDurationLimit","getAnimationDurationLimit","container","layoutEl","addListeners","handleNavigationClick","_Liftoff$bidContext","bidContext","is_interstitial","is_reengagement","isDeadzoneExperiment","hasTestGroup","timeMS","scenes","layoutContent","letterboxConfig","useDarkRootBackground","useLayoutBackground","toggle","getStyleForClickElement","invalidate","reset","getLetterboxConfig","rootElementConstraints","configureLetterbox","getLetterboxConstraintsForMadlibRootElement","parseCreativeConfig","getCreativeConfig","loadContent","invalidated","onMadlibLoaded","onFirstLayoutFinished","resetClickParams","componentParams","clickTargets","constraints","containers","coordination","css","rootConstraints","rootPostLayoutTransform","traverse","_componentParams$id","component","subcomponents","fixValues","_params$key","resolveAsset","componentName","Component","new","subcomponent","relay","postLayoutTransform","attachAnchors","configureCoordination","configureClickTargets","anchors","edge","anchor","actions","eventType","eventMacros","actors","action","actionName","actionType","actionMacros","actor","emitter","getMacroValues","eventPayload","macroValues","macro","expandMacros","actionPayload","expansion","r","sub","processEventPayload","dispatchActions","_ref8","is_tre","TreSensa","EDGE_TO_TYPE","EDGE_TO_DIMENSION","ctaContainerRegex","isCTAContainer","containerID","Container","_EventListener","fixedWidth","fixedHeight","layoutReady","contentReady","system","hide","visibility","show","promises","load","resetTransform","center","applyTransform","styles","transform","containerEdge","_constraints$containe","anchorEdge","containerEdgeType","anchorEdgeType","dimension","offset","_parseCSSLength","matchWidthToHeight","matchHeightToWidth","centerHorizontal","centerVertical","TEMPLATE","LastChanceEndscreen","appStoreData","parentEl","validateUserClick","ctaText","cta_text","autoEndCardCallCount","images","imagePaths","has_html_endscreen","closest","wasShown","prepareAutoEndcard","showAutoEndcard","initializeEvents","touchstart","useInteractionMonitor","screenY","__WEBPACK_IMPORTED_MODULE_0__component__","__WEBPACK_IMPORTED_MODULE_1__creative_utils__","__WEBPACK_IMPORTED_MODULE_2__click_handling__","__WEBPACK_IMPORTED_MODULE_3__liftoff_mraid__","__WEBPACK_IMPORTED_MODULE_4__interaction_monitor__","__WEBPACK_IMPORTED_MODULE_5__letterbox_config__","__WEBPACK_IMPORTED_MODULE_6__logger__","__WEBPACK_IMPORTED_MODULE_7__window_resize_logger__","__WEBPACK_IMPORTED_MODULE_8__constants__","__WEBPACK_IMPORTED_MODULE_9__frontendlib_dom_utils__","__WEBPACK_IMPORTED_MODULE_10__frontendlib_utils__","__WEBPACK_IMPORTED_MODULE_11__cta__","__WEBPACK_IMPORTED_MODULE_12__adexp__","__WEBPACK_IMPORTED_MODULE_13__autoclick_Autoclick__","__WEBPACK_IMPORTED_MODULE_14__madlib__","__WEBPACK_IMPORTED_MODULE_15__lib_last_chance_endscreen_last_chance_endscreen__","__WEBPACK_IMPORTED_MODULE_16__csp_env_messages__","logMraidSupport","getSupportedLog","onTreSensaInteraction","autoEndcard","lastChanceEndscreenAutoclick","lastChanceEndscreenInteractionAutoclick","vxInteractionListeners","initAutoEndcard","assets","trackingTags","trackingTagHolder","populateAppStoreData","bid_context","testGroups","ab_tests","group","lastClickMetric","interactionMonitor","onInteractionChange","_autoclickBus","ac","emitInteractionEvent","updateMRAID","loadLogger","initAutoclickBehaviors","applyPolicy","windowResizeLogger","enable_logging","madlibLoaded","useAutoendcardBehaviour","app_store_data","VungleHelper","tokens","APP_ICON","APP_NAME","description","APP_DESCRIPTION","rating","APP_STORE_RATING","LIFTOFF_START_TS","_viewclick","viewclick_behavior","ae","last_chance_endscreen_autoclick_behavior","_lastChanceEndscreenAutoclick","_lastChanceEndscreenInteractionAutoclick","last_chance_endscreen_interaction_autoclick_behavior","emitInteractionPromptReachedEvent","creative_policy","animation_duration_limit","_bidContext","_env","enableLogging","enableHtmlReturn","enable_html_return","logging_endpoint","trackingParam","event_tracking_param","html_return_delay","passContext","enable","addErrorListeners","_snippetEl$classList","treContainerEl","add_border","russian_age_rating","show_chinese_watermark","show_ad_choices","use_custom_close","close_delay","clickParams","clickTrackingParams","allQueryParams","cbl","getClickParams","ca","click_config","clickthrough_url","click_tracking_urls","path","composedPath","clickMetric","time_ms","someElements","pred","eventtarget","Element","emitViewableEvent","emitViewableChangeEvent","onClickCapture","logInitialDims","emitHtmlLoadedEvent","assetType","assetID","asset","image_versions","video_versions","DOMUtils","Utils","__WEBPACK_IMPORTED_MODULE_1__logger__","overrideMethods","resize","restart","registry","cls","assertSubclassed","setInteractionPromptReached","LetterboxConfig","dims","viewportSize","bidCreativeSize","viewportOrientation","orientationMismatch","getCreativePreferredOrientation","isRotated","useWhiteBars","contentSize","_config","scaleFactor","preserveAspectRatioScalingFactor","rootContainerSize","rootContainerOffset","rootContainerScaled","rootContainerTransformedArea","_getLetterboxLayoutIn","getLetterboxLayoutInfo","_getLetterboxLayoutIn2","__WEBPACK_IMPORTED_MODULE_0__logger__","initialScreenAngle","RESIZE_LOGGING_SAMPLING_FREQUENCY_MULTIPLIER","WindowResizeLogger","enableResizeLogging","resizeCount","resizeLog","logResizedDims","_snippetEl$getBoundin","sinceStartMS","screen.orientation.angle","supportsOrientationChange","supportsDeviceOrientation","window.innerWidth","window.innerHeight","documentElement.clientWidth","documentElement.clientHeight","_logDims"],"mappings":"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","file":"liftoff-58ea9097a7f92539efa7.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \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, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\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 = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 135);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"appendParamObjectToURL\", function() { return appendParamObjectToURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"appendQueryStringToURL\", function() { return appendQueryStringToURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"assignWithDefaults\", function() { return assignWithDefaults; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"binaryFind\", function() { return binaryFind; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"camelCase\", function() { return camelCase; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"capitalize\", function() { return capitalize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"clamp\", function() { return clamp; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"clone\", function() { return clone; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"compareNumbers\", function() { return compareNumbers; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"compareStrings\", function() { return compareStrings; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"composeAsync\", function() { return composeAsync; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"smartCompare\", function() { return smartCompare; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"deepEqual\", function() { return deepEqual; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"deepInclude\", function() { return deepInclude; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"deepUnique\", function() { return deepUnique; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"diffObjects\", function() { return diffObjects; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"escapeRegExp\", function() { return escapeRegExp; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"flatten\", function() { return flatten; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"formatConjunction\", function() { return formatConjunction; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"formatFileSize\", function() { return formatFileSize; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"formatUSD\", function() { return formatUSD; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getLocale\", function() { return getLocale; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"numberToLocaleString\", function() { return numberToLocaleString; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getIn\", function() { return getIn; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"kebabCase\", function() { return kebabCase; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isPromise\", function() { return isPromise; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isEmpty\", function() { return isEmpty; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"loadImage\", function() { return loadImage; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"loadImages\", function() { return loadImages; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mapByID\", function() { return mapByID; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mapcat\", function() { return mapcat; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mergePropertiesWithDefaults\", function() { return mergePropertiesWithDefaults; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"objFromQueryString\", function() { return objFromQueryString; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"objToQueryString\", function() { return objToQueryString; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"errorSensitiveFetch\", function() { return errorSensitiveFetch; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"postJSON\", function() { return postJSON; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"patchJSON\", function() { return patchJSON; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ping\", function() { return ping; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"poll\", function() { return poll; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"precisionRound\", function() { return precisionRound; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"randomInt\", function() { return randomInt; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"range\", function() { return range; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"request\", function() { return request; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"runAsync\", function() { return runAsync; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeKeys\", function() { return removeKeys; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeEmptyKeys\", function() { return removeEmptyKeys; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"selectKeys\", function() { return selectKeys; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"shuffle\", function() { return shuffle; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"stableSort\", function() { return stableSort; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"timeDifference\", function() { return timeDifference; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"type\", function() { return type; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"wait\", function() { return wait; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"timeout\", function() { return timeout; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"unique\", function() { return unique; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"isFunction\", function() { return isFunction; });\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar appendParamObjectToURL = function appendParamObjectToURL(url, params) {\n return appendQueryStringToURL(url, objToQueryString(params));\n};\n\nvar appendQueryStringToURL = function appendQueryStringToURL(url, queryString) {\n if (queryString === \"\") return url;\n\n var separator = url.includes(\"?\") ? \"&\" : \"?\";\n\n return \"\" + url + separator + queryString;\n};\n\n// If any key in the `defaults` object doesn't exist in `target`, the key is\n// merged. Additional `sources` object arguments are merged into `target`, but\n// only the keys that exist in `defaults`.\nvar assignWithDefaults = function assignWithDefaults(target, defaults) {\n for (var _len = arguments.length, sources = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n sources[_key - 2] = arguments[_key];\n }\n\n Object.keys(defaults).forEach(function (key) {\n if (!target.hasOwnProperty(key) || target[key] === undefined) {\n target[key] = defaults[key];\n }\n\n sources.filter(function (source) {\n return source != null && source.hasOwnProperty(key) && source[key] !== undefined;\n }).forEach(function (source) {\n return target[key] = source[key];\n });\n });\n\n return target;\n};\n\n/**\n * Takes an ordered array and returns the first value where fn(value) returns true.\n */\nvar binaryFind = function binaryFind(arr, fn) {\n var high = arr.length + 1;\n var low = 0;\n while (low + 1 < high) {\n var mid = low + (high - low >> 1);\n if (fn(arr[mid])) {\n high = mid;\n } else {\n low = mid;\n }\n }\n\n return arr[high];\n};\n\nvar camelCase = function camelCase(str) {\n var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n _ref$isSuffix = _ref.isSuffix,\n isSuffix = _ref$isSuffix === undefined ? false : _ref$isSuffix;\n\n return str.split(/[-_]/g).map(function (part, i) {\n return i === 0 && !isSuffix ? part.toLowerCase() : capitalize(part.toLowerCase());\n }).join(\"\");\n};\n\nvar capitalize = function capitalize(str) {\n if (str === \"\") return str;\n\n return \"\" + str[0].toUpperCase() + str.slice(1);\n};\n\nvar clamp = function clamp(x, a, b) {\n if (a > b) {\n return clamp(x, b, a);\n }\n\n if (x < a) {\n return a;\n }\n\n if (x > b) {\n return b;\n }\n\n return x;\n};\n\nvar clone = function clone(obj) {\n if (obj === undefined) return undefined;\n\n return JSON.parse(JSON.stringify(obj));\n};\n\nvar compareNumbers = function compareNumbers(a, b) {\n if (a == null && b == null) return 0;else if (a == null) return -1;else if (b == null) return 1;\n\n return a - b;\n};\n\nvar compareStrings = function compareStrings(a, b) {\n return (a || \"\").trim().toLowerCase().localeCompare((b || \"\").trim().toLowerCase());\n};\n\n/**\n * Composes functions such that any returned Promise is resolved before the next invocation.\n * @param {Function[]} funcs - A list of potentially async functions that each take a single param. Any null/\n * undefined values are ignored.\n */\nvar composeAsync = function composeAsync() {\n for (var _len2 = arguments.length, funcs = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n funcs[_key2] = arguments[_key2];\n }\n\n return function (arg) {\n var res = Promise.resolve(arg);\n\n var _loop = function _loop(i) {\n var f = funcs[i];\n if (f == null) {\n return \"continue\";\n }\n res = res.then(function (arg) {\n return f(arg);\n });\n };\n\n for (var i = funcs.length - 1; i >= 0; i--) {\n var _ret = _loop(i);\n\n if (_ret === \"continue\") continue;\n }\n return res;\n };\n};\n\nvar smartCompare = function smartCompare(a, b) {\n var _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n _ref2$reverse = _ref2.reverse,\n reverse = _ref2$reverse === undefined ? false : _ref2$reverse;\n\n if (a === b) return 0;\n if (type(a) !== type(b) && b != null && a != null) {\n throw new Error(\"Don't know how to compare type \" + type(a) + \" with type \" + type(b) + \"!\");\n }\n var compareType = a != null ? type(a) : type(b);\n\n var _ref3 = reverse ? [b, a] : [a, b],\n _ref4 = _slicedToArray(_ref3, 2),\n valueA = _ref4[0],\n valueB = _ref4[1];\n\n switch (compareType) {\n case \"string\":\n return compareStrings(valueA, valueB);\n case \"number\":\n return compareNumbers(valueA, valueB);\n default:\n // TODO(oscar): Add more types for comparison such as Dates.\n throw new Error(\"Missing method for comparing type \" + compareType);\n }\n};\n\n/**\n * Recursively compares 2 JS objects.\n * @param {any} a\n * @param {any} b\n * @param {Object} options\n * @param {boolean} options.toJSON - Uses clone() in order to compare objects as\n * their JSON representations.\n * Useful when comparing plain objects to class instances.\n */\nvar deepEqual = function deepEqual(a, b) {\n var _ref5 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n _ref5$toJSON = _ref5.toJSON,\n toJSON = _ref5$toJSON === undefined ? false : _ref5$toJSON;\n\n if (a === b) {\n return true;\n }\n\n var compareA = toJSON ? clone(a) : a;\n var compareB = toJSON ? clone(b) : b;\n var tA = type(compareA);\n var tB = type(compareB);\n\n if (tA === \"array\" && tB === \"array\") {\n if (compareA.length !== compareB.length) return false;\n\n for (var i = 0; i < compareA.length; i++) {\n if (!deepEqual(compareA[i], compareB[i])) return false;\n }\n\n return true;\n }\n\n if (tA === \"set\" && tB === \"set\") {\n if (compareA.size !== compareB.size) return false;\n\n var bShallowCopy = new Set(compareB);\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n aLoop: for (var _iterator = compareA[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var aElement = _step.value;\n\n // First check if there's an equivalent reference in the two sets before checking for deep equality,\n // since the latter is very inefficient.\n if (bShallowCopy.has(aElement)) {\n bShallowCopy.delete(aElement);\n continue;\n }\n\n var _iteratorNormalCompletion2 = true;\n var _didIteratorError2 = false;\n var _iteratorError2 = undefined;\n\n try {\n for (var _iterator2 = bShallowCopy[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var bElement = _step2.value;\n\n if (deepEqual(aElement, bElement)) {\n bShallowCopy.delete(bElement);\n continue aLoop;\n }\n }\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2.return) {\n _iterator2.return();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n\n return false;\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n return true;\n }\n\n if (tA === \"object\" && tB === \"object\") {\n for (var k in compareA) {\n if (!(k in compareB)) return false;\n }\n\n for (var _k in compareB) {\n if (!(_k in compareA) || !deepEqual(compareA[_k], compareB[_k])) return false;\n }\n\n return true;\n }\n\n return compareA === compareB;\n};\n\nvar deepInclude = function deepInclude(parent, child) {\n if (type(parent.some) === \"function\") {\n return parent.some(function (obj) {\n return deepEqual(obj, child);\n });\n } else if (type(parent) === \"object\") {\n return Object.values(parent).some(function (obj) {\n return deepEqual(obj, child);\n });\n }\n return false;\n};\n\nvar deepUnique = function deepUnique(arr) {\n var index = 0;\n\n var _loop2 = function _loop2() {\n var item = arr[index];\n arr = arr.slice(0, index + 1).concat(arr.slice(index).filter(function (currItem) {\n return !deepEqual(item, currItem);\n }));\n index += 1;\n };\n\n while (index < arr.length) {\n _loop2();\n }\n\n return arr;\n};\n\n/**\n * @param {Object} a\n * @param {Object} b\n * @param {boolean} includeAKeys\n * @returns {Object} - An object containing keys in `b` if the values differ\n * from those in `a`. If `includeAKeys` is true, the keys in `a` that are NOT in\n * `b` are also included.\n */\nvar diffObjects = function diffObjects(a, b) {\n var includeAKeys = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var result = {};\n for (var k in b) {\n if (!deepEqual(a[k], b[k])) {\n result[k] = b[k];\n }\n }\n if (includeAKeys) {\n for (var _k2 in a) {\n if (!(_k2 in b)) {\n result[_k2] = null;\n }\n }\n }\n\n return result;\n};\n\n// https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex\nvar escapeRegExp = function escapeRegExp(str) {\n return str.replace(/[-[\\]/{}()*+?.\\\\^$|]/g, \"\\\\$&\");\n};\n\nvar flatten = function flatten(arr) {\n return [].concat.apply([], arr);\n};\n\n/**\n * Takes a list of words and joins them via coordinating conjunction grammar rules. Oxford comma is mandatory.\n * @param {String[]} words\n */\nvar formatConjunction = function formatConjunction(words) {\n var conjunction = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"and\";\n\n var wc = words.length;\n if (wc <= 2) {\n return words.join(\" \" + conjunction + \" \");\n } else {\n return [].concat(_toConsumableArray(words.slice(0, wc - 1)), [conjunction + \" \" + words[wc - 1]]).join(\", \");\n }\n};\n\nvar formatFileSize = function formatFileSize(size) {\n // NOTE: Math.log10 is not available in every browser and Math.log / Math.LN10\n // is unreliable.\n var thousands = Math.floor(((\"\" + size).length - 1) / 3);\n return \"\" + Math.round(size / Math.pow(10, 3 * thousands)) + \"BKMGTP\"[thousands];\n};\n\nvar formatUSD = function formatUSD(val) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n options = Object.assign({\n style: \"currency\",\n currency: \"USD\"\n }, options);\n\n return type(val) !== \"number\" ? null : val.toLocaleString(\"en\", options);\n};\n\nvar getLocale = function getLocale() {\n var _window = window,\n navigator = _window.navigator;\n\n if (navigator == null) return null;\n return navigator.languages && navigator.languages.length ? navigator.languages[0] : navigator.language;\n};\n\n/**\n * This function is a wrapper for Number.toLocalString() however it tries to use\n * the device's language. If all else fails, it uses \"en\".\n *\n * TODO(oscar): Fix the Intl polyfill we use, so there's no issue using\n * `undefined` as the locale.\n */\nvar numberToLocaleString = function numberToLocaleString(n, options, locale) {\n var f = function f(locale) {\n try {\n return Number(n).toLocaleString(locale, options);\n } catch (e) {}\n };\n return f(locale) || f() || f(getLocale()) || f(\"en\");\n};\n\nvar getIn = function getIn(m, ks, d) {\n if (m == null) return d;\n if (ks.length === 1) {\n return m[ks[0]];\n }\n\n return getIn(m[ks[0]], ks.slice(1));\n};\n\nvar kebabCase = function kebabCase(str) {\n // A \"-\" will be inserted before every capital letter, so make sure the first\n // character isn't capitalized.\n str = str.charAt(0).toLowerCase() + str.slice(1);\n // Convert camel case to kebab case.\n str = str.replace(/[A-Z]/g, \"-$&\").toLowerCase();\n // Convert snake case to kebab case.\n str = str.replace(/_/g, \"-\");\n\n return str;\n};\n\nvar isPromise = function isPromise(obj) {\n return Promise.resolve(obj) === obj;\n};\n\nvar isEmpty = function isEmpty(obj) {\n return obj == null || Object.keys(obj).length === 0 &&\n // Needed for iterables like `Set`.\n Array.from(obj).length === 0 && (obj.size || 0) === 0;\n};\n\nvar loadImage = function loadImage(url) {\n var crossOrigin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n if (!url) return Promise.reject(new Error(\"No image URL provided\"));\n\n return new Promise(function (resolve, reject) {\n var img = new Image();\n img.crossOrigin = crossOrigin;\n img.addEventListener(\"load\", function () {\n return resolve(img);\n });\n img.addEventListener(\"error\", reject);\n img.src = url;\n if (img.complete) {\n resolve(img);\n }\n });\n};\n\nvar loadImages = function loadImages(urls) {\n var crossOrigin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n return Promise.all(urls.filter(function (url) {\n return url != null;\n }).map(function (url) {\n return loadImage(url, crossOrigin);\n }));\n};\n\nvar mapByID = function mapByID(arr) {\n var fn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n return arr.reduce(function (map, item) {\n map[item.id] = fn != null ? fn(item) : item;\n return map;\n }, {});\n};\n\nvar mapcat = function mapcat(arr, fn) {\n return [].concat.apply([], arr.map(fn));\n};\n\n// Like `Object.assign`, merges subsequent object arguments into the first\n// object argument `defaults`, but only keys that exist in `defaults`.\n// Unlike `Object.assign`, does not modify the first argument, but returns a\n// shallow clone instead.\nvar mergePropertiesWithDefaults = function mergePropertiesWithDefaults(defaults) {\n for (var _len3 = arguments.length, args = Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n\n if (args.length === 0) return defaults;\n\n var target = Object.assign(defaults);\n var keys = Object.keys(target);\n\n args.forEach(function (source) {\n if (source == null) return;\n\n keys.forEach(function (key) {\n if (source.hasOwnProperty(key) && source[key] !== undefined) {\n target[key] = source[key];\n }\n });\n });\n\n return target;\n};\n\nvar objFromQueryString = function objFromQueryString() {\n var str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : location.search.slice(1);\n\n return str.split(\"&\").reduce(function (acc, part) {\n var _part$split$map = part.split(\"=\", 2).map(decodeURIComponent),\n _part$split$map2 = _slicedToArray(_part$split$map, 2),\n key = _part$split$map2[0],\n value = _part$split$map2[1];\n\n if (key != null && value != null) {\n acc[key] = value;\n }\n\n return acc;\n }, {});\n};\n\nvar objToQueryString = function objToQueryString(obj) {\n return Object.keys(obj).filter(function (key) {\n return obj[key] != null;\n }).map(function (key) {\n return encodeURIComponent(key) + \"=\" + encodeURIComponent(obj[key]);\n }).join(\"&\");\n};\n\n/**\n * Given a `Promise` that should resolve with a `Response` (e.g. a `Promise` returned by `fetch`), returns\n * a new Promise that will reject if 1) the original `Promise` rejects, 2) the original `Promise` resolves\n * with something that's not a `Response`, or 3) the original response had an error status.\n */\nvar wrapResponsePromise = function wrapResponsePromise(responsePromise) {\n return new Promise(function (resolve, reject) {\n return responsePromise.then(function (response) {\n if (!(response instanceof Response && response.ok)) {\n reject(response);\n return;\n }\n\n resolve(response);\n }).catch(reject);\n });\n};\n\n/**\n * Like `fetch` but returns a `Promise` that rejects if `!response.ok`. This allows calling code to handle\n * non-ok responses (e.g. 404s and 500s) using `Promise.catch`.\n */\nvar errorSensitiveFetch = function errorSensitiveFetch() {\n return wrapResponsePromise(fetch.apply(undefined, arguments));\n};\n\nvar postJSON = function postJSON(url, json, options) {\n return makeJSONRequest(url, json, \"POST\", options);\n};\n\nvar patchJSON = function patchJSON(url, json, options) {\n return makeJSONRequest(url, json, \"PATCH\", options);\n};\n\n/**\n * Sends a `fetch` request to `url` using the given `method` (e.g. \"GET\", \"POST\", \"PATCH\") and returns a\n * `Promise` that resolves with a `Response`. If `options.rejectOnErrorResponse === true`, the returned\n * `Promise` will reject if the sever returns an error response.\n */\nfunction makeJSONRequest(url, json, method) {\n var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n var _options$rejectOnErro = options.rejectOnErrorResponse,\n rejectOnErrorResponse = _options$rejectOnErro === undefined ? false : _options$rejectOnErro;\n\n var fetchPromise = fetch(url, {\n body: JSON.stringify(json),\n credentials: \"same-origin\",\n headers: { \"Content-Type\": \"application/json; charset=utf-8\" },\n method: method\n });\n if (!rejectOnErrorResponse) {\n return fetchPromise;\n }\n return wrapResponsePromise(fetchPromise);\n}\n\nvar ping = function ping(url) {\n var img = new Image();\n img.src = url;\n};\n\n// Polls a `url` for up to `timeoutMS`. Assumes the response is a JSON object\n// with keys { state, value } where the values for `state` are one of\n// [\"success\", \"failed\", \"timeout\"].\nvar poll = function poll(url, timeoutMS) {\n var timedOut = false;\n setTimeout(function () {\n return timedOut = true;\n }, timeoutMS);\n\n var request = function request() {\n if (timedOut) {\n return Promise.reject(new Error(\"poll exceeded timeout duration\"));\n }\n\n return fetch(url, { credentials: \"same-origin\" }).then(function (response) {\n return response.json();\n }).then(function (_ref6) {\n var state = _ref6.state,\n value = _ref6.value;\n\n switch (state) {\n case \"success\":\n return value;\n case \"failed\":\n throw new Error(\"poll received failed response with value: \" + value);\n case \"timeout\":\n return request();\n default:\n throw new Error(\"poll received response with unknown state: \" + state);\n }\n });\n };\n\n return request();\n};\n\nvar precisionRound = function precisionRound(number, precision) {\n var factor = Math.pow(10, precision);\n\n return Math.round(number * factor) / factor;\n};\n\nvar randomInt = function randomInt(low, high) {\n return low + Math.floor(Math.random() * (high - low));\n};\n\n// Returns an array of integers from [start, stop) (i.e. exclusive of stop).\n// Special case: if start === stop, return array with start as the only\n// element.\nvar range = function range(start, stop) {\n var step = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n\n if (start === stop) return [start];\n\n if (stop - start < 0 !== step < 0) {\n throw new Error(\"Invalid call to range: range(\" + start + \", \" + stop + \", \" + step + \")\");\n }\n\n return Array((stop - start) / step | 0).fill(null).map(function (_, i) {\n return start + i * step;\n });\n};\n\nvar request = function request(method, url) {\n var headers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var body = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n return new Promise(function (resolve, reject) {\n var req = new XMLHttpRequest();\n req.onreadystatechange = function () {\n if (req.readyState === 4 && req.status === 200) {\n resolve(req);\n }\n };\n req.addEventListener(\"load\", resolve.bind(null, req));\n req.addEventListener(\"error\", reject.bind(null, req));\n req.open(method.toUpperCase(), url);\n Object.keys(headers).forEach(function (key) {\n req.setRequestHeader(key, headers[key]);\n });\n req.send(body);\n });\n};\n\nvar runAsync = function runAsync(fn) {\n setTimeout(fn, 0);\n};\n\nvar removeKeys = function removeKeys(source, keys) {\n if (source == null) return {};\n\n return Object.keys(source).filter(function (key) {\n return !keys.includes(key);\n }).reduce(function (target, key) {\n target[key] = source[key];\n\n return target;\n }, {});\n};\n\n/** Remove keys if their value is empty. */\nvar removeEmptyKeys = function removeEmptyKeys(source) {\n return selectKeys(source, function (_, val) {\n return !isEmpty(val);\n });\n};\n\nvar selectKeys = function selectKeys(source, keys) {\n if (source == null) return {};\n\n switch (type(keys)) {\n case \"array\":\n return keys.reduce(function (target, key) {\n if (source.hasOwnProperty(key)) {\n target[key] = source[key];\n }\n\n return target;\n }, {});\n case \"function\":\n return Object.keys(source).reduce(function (target, key) {\n if (keys(key, source[key])) {\n target[key] = source[key];\n }\n\n return target;\n }, {});\n }\n};\n\n/**\n * Reorders items randomly into a new Array.\n * @param {Iterable} arr\n * @returns {Array}\n */\nvar shuffle = function shuffle(arr) {\n var result = [].concat(_toConsumableArray(arr));\n for (var i = result.length - 1; i > 0; i--) {\n var j = Math.floor(Math.random() * (i + 1));\n var _ref7 = [result[j], result[i]];\n result[i] = _ref7[0];\n result[j] = _ref7[1];\n }\n return result;\n};\n\n// Like `Array.sort()`, but maintains the relative order of array items with\n// equal sort values and does not mutate the original array.\nvar stableSort = function stableSort(arr, sortFn) {\n var index = arr.reduce(function (agg, item, i) {\n agg.set(item, i);\n\n return agg;\n }, new Map());\n\n return arr.slice().sort(function (a, b) {\n return sortFn(a, b) || index.get(a) - index.get(b);\n });\n};\n\nvar timeDifference = function timeDifference(a, b) {\n var msPerSecond = 1000,\n msPerMinute = msPerSecond * 60,\n msPerHour = msPerMinute * 60,\n msPerDay = msPerHour * 24,\n msPerWeek = msPerDay * 7,\n msPerMonth = msPerWeek * 4,\n msPerYear = msPerMonth * 13,\n elapsed = Math.abs(a - b);\n if (a <= b && elapsed < 1000 * 10) {\n return \"just now\";\n } else {\n var val = void 0,\n units = void 0;\n if (elapsed < msPerMinute) {\n val = Math.round(elapsed / msPerSecond);\n units = \"second\";\n } else if (elapsed < msPerHour) {\n val = Math.round(elapsed / msPerMinute);\n units = \"minute\";\n } else if (elapsed < msPerDay) {\n val = Math.round(elapsed / msPerHour);\n units = \"hour\";\n } else if (elapsed < msPerWeek) {\n val = Math.round(elapsed / msPerDay);\n units = \"day\";\n } else if (elapsed < msPerMonth) {\n val = Math.round(elapsed / msPerWeek);\n units = \"week\";\n } else if (elapsed < msPerYear) {\n val = Math.round(elapsed / msPerMonth);\n units = \"month\";\n } else {\n val = Math.round(elapsed / msPerYear);\n units = \"year\";\n }\n\n return [val, \"\" + units + (val === 1 ? \"\" : \"s\"), a < b ? \"ago\" : \"from now\"].join(\" \");\n }\n};\n\nvar type = function type(object) {\n return {}.toString.call(object).match(/\\s([a-zA-Z]+)/)[1].toLowerCase();\n};\n\n/** Returns a Promise that resolves after `ms` ms. */\nvar wait = function wait(ms) {\n return new Promise(function (resolve) {\n setTimeout(resolve, ms);\n });\n};\n\n/** Returns a Promise that rejects after `ms` ms. */\nvar timeout = function timeout(ms) {\n return new Promise(function (_, reject) {\n setTimeout(function () {\n return reject(new Error(\"Promise timed out after \" + ms + \"ms\"));\n }, ms);\n });\n};\n\nvar unique = function unique(arr) {\n return arr.filter(function (el, i) {\n return arr.indexOf(el) === i;\n });\n};\n\nvar isFunction = function isFunction(object) {\n return type(object) === \"function\";\n};\n\n/***/ }),\n/* 1 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addOneTimeListener\", function() { return addOneTimeListener; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"animationEndPromise\", function() { return animationEndPromise; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"transitionEndPromise\", function() { return transitionEndPromise; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"runTransitionSequence\", function() { return runTransitionSequence; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"appendChildren\", function() { return appendChildren; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"copyToClipboard\", function() { return copyToClipboard; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"createElement\", function() { return createElement; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"empty\", function() { return empty; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fetchHTML\", function() { return fetchHTML; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"firstAncestor\", function() { return firstAncestor; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"fragmentFromString\", function() { return fragmentFromString; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"forceReflow\", function() { return forceReflow; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"generateSnippetMap\", function() { return generateSnippetMap; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getCSSProperty\", function() { return getCSSProperty; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getElementsByClass\", function() { return getElementsByClass; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getRelativeBoundingClientRect\", function() { return getRelativeBoundingClientRect; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getAggregateBoundingClientRect\", function() { return getAggregateBoundingClientRect; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getFontSizeToFit\", function() { return getFontSizeToFit; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getFontSizeToFitLines\", function() { return getFontSizeToFitLines; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"indexOf\", function() { return indexOf; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"imageIsRendered\", function() { return imageIsRendered; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"off\", function() { return off; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"on\", function() { return on; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"onAnimationsComplete\", function() { return onAnimationsComplete; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"parseCSSLength\", function() { return parseCSSLength; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"prependChild\", function() { return prependChild; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"replaceStyle\", function() { return replaceStyle; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"scrollIntoView\", function() { return scrollIntoView; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"strToElement\", function() { return strToElement; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"strToStyle\", function() { return strToStyle; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"writeToIframe\", function() { return writeToIframe; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"preparetagHTML\", function() { return preparetagHTML; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"appendImpressionTags\", function() { return appendImpressionTags; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils__ = __webpack_require__(0);\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\nvar addOneTimeListener = function addOneTimeListener(el, eventName, fn) {\n var ignoreBubbling = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n var listener = function listener(event) {\n if (ignoreBubbling && event.target !== el) return;\n\n el.removeEventListener(eventName, listener);\n fn(event);\n };\n el.addEventListener(eventName, listener);\n};\n\n/** Responds to the first event triggered. Useful for polyfilling webkit prefixed events. */\nvar eventRacePromise = function eventRacePromise(el, events) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n timeout = _ref.timeout,\n _ref$matchTarget = _ref.matchTarget,\n matchTarget = _ref$matchTarget === undefined ? false : _ref$matchTarget;\n\n var eventsString = [].concat(events).join(\" \");\n return new Promise(function (resolve) {\n var callbackRun = false;\n var callback = function callback() {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n if (callbackRun || matchTarget && el !== args[0].target) return;\n callbackRun = true;\n resolve.apply(undefined, args);\n off(el, _defineProperty({}, eventsString, callback));\n };\n\n on(el, _defineProperty({}, eventsString, callback));\n if (timeout != null) {\n setTimeout(function () {\n return callback({ message: \"Promise timed out.\" });\n }, timeout);\n }\n });\n};\n\nvar animationEndPromise = function animationEndPromise(el) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n return eventRacePromise(el, \"animationend webkitAnimationEnd\", options);\n};\n\nvar transitionEndPromise = function transitionEndPromise(el) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n return eventRacePromise(el, \"transitionend webkitTransitionEnd\", options);\n};\n\n/**\n * Given:\n * - `el` - a DOM node\n * - `transitions` - an array where each element is either 1) a function, or 2) an object of style property\n * names to values\n * this sequentially 1) runs the function and waits for the Promise returned by the function to resolve (if\n * the function returns a Promise) before moving onto the next step, or 2) applies the styles to `el` and\n * waits for a `transitionend` event before moving onto the next step. Returns a Promise. `timeoutMS` is\n * an optional duration (in ms) after which the next transition should be run even if the previous transition\n * has not completed or if the previous function's returned promise has not resolved.\n */\nvar runTransitionSequence = function runTransitionSequence(el, transitions) {\n var _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n _ref2$timeoutMS = _ref2.timeoutMS,\n timeoutMS = _ref2$timeoutMS === undefined ? null : _ref2$timeoutMS,\n _ref2$continueFn = _ref2.continueFn,\n continueFn = _ref2$continueFn === undefined ? function () {\n return true;\n } : _ref2$continueFn;\n\n return transitions.reduce(function (prevTransitionEndPromise, thisTransition) {\n return prevTransitionEndPromise.finally(function () {\n if (!continueFn()) {\n return Promise.resolve();\n }\n\n var currentTransitionEndPromise = void 0;\n if (Object(__WEBPACK_IMPORTED_MODULE_0__utils__[\"isFunction\"])(thisTransition)) {\n currentTransitionEndPromise = thisTransition();\n } else {\n currentTransitionEndPromise = transitionEndPromise(el);\n Object.assign(el.style, thisTransition);\n }\n\n if (timeoutMS == null) {\n return currentTransitionEndPromise;\n }\n\n return Promise.race([Object(__WEBPACK_IMPORTED_MODULE_0__utils__[\"timeout\"])(timeoutMS), currentTransitionEndPromise]);\n });\n }, Promise.resolve());\n};\n\nvar appendChildren = function appendChildren(node, children) {\n var fragment = document.createDocumentFragment();\n\n children.forEach(function (child) {\n if (!child) return;\n\n fragment.appendChild(child instanceof Node ? child : createElement(child));\n });\n\n node.appendChild(fragment);\n};\n\nvar copyToClipboard = function copyToClipboard(text, multiline) {\n var elemType = multiline ? \"textarea\" : \"input\";\n var el = document.createElement(elemType);\n document.body.appendChild(el);\n el.value = text;\n el.select();\n document.execCommand(\"copy\");\n el.remove();\n};\n\n/**\n * @param {Object} elementConfig A map of options specifying a new Element.\n * @param {String} [elementConfig.namespace = null] A namespace URI to associate with the new element.\n * See https://developer.mozilla.org/en-US/docs/Web/API/Document/createElementNS for details.\n * @param {String} [elementConfig.tagName = \"div\"] The tag name determining the result\n * Element's type. Defaults to \"div\".\n * @param {String[]} [elementConfig.classList = []] A list of classes. Falsy values\n * are ignored. Defaults to [].\n * @param {{}} [elementConfig.style = {}] A map of style settings to merge into the result\n * Element's style. Defaults to {}.\n * @param {{}} [elementConfig.attributes = {}] A map of attributes to set on the result\n * Element. Defaults to {}.\n * @param {{}} [elementConfig.data = {}] A map of data to merge into the result Element's\n * dataset. Defaults to {}.\n * @param {({}|Element)[]} [elementConfig.children = []] An array of Elements or\n * elementConfigs to append as children. Falsy values are ignored. Defaults to [].\n * @param {{}} [elementConfig.eventHandlers = {}] A map from event names to handlers,\n * which will all be assigned to listen on the result Element. Defaults to {}.\n * @returns {HTMLElement} An Element object with properties corresponding to the parameters.\n */\nvar createElement = function createElement(elementConfig) {\n if (Object(__WEBPACK_IMPORTED_MODULE_0__utils__[\"type\"])(elementConfig) === \"string\" || Object(__WEBPACK_IMPORTED_MODULE_0__utils__[\"type\"])(elementConfig) === \"number\") {\n return document.createTextNode(elementConfig);\n }\n\n var _elementConfig$namesp = elementConfig.namespace,\n namespace = _elementConfig$namesp === undefined ? null : _elementConfig$namesp,\n _elementConfig$tagNam = elementConfig.tagName,\n tagName = _elementConfig$tagNam === undefined ? \"div\" : _elementConfig$tagNam,\n _elementConfig$classL = elementConfig.classList,\n classList = _elementConfig$classL === undefined ? [] : _elementConfig$classL,\n _elementConfig$style = elementConfig.style,\n style = _elementConfig$style === undefined ? {} : _elementConfig$style,\n _elementConfig$attrib = elementConfig.attributes,\n attributes = _elementConfig$attrib === undefined ? {} : _elementConfig$attrib,\n _elementConfig$data = elementConfig.data,\n data = _elementConfig$data === undefined ? {} : _elementConfig$data,\n _elementConfig$childr = elementConfig.children,\n children = _elementConfig$childr === undefined ? [] : _elementConfig$childr,\n _elementConfig$eventH = elementConfig.eventHandlers,\n eventHandlers = _elementConfig$eventH === undefined ? {} : _elementConfig$eventH,\n unintendedProps = _objectWithoutProperties(elementConfig, [\"namespace\", \"tagName\", \"classList\", \"style\", \"attributes\", \"data\", \"children\", \"eventHandlers\"]);\n\n var unintendedKeys = Object.keys(unintendedProps);\n if (unintendedKeys.length > 0) {\n throw new Error(\"`createElement` must not receive unintended keys: \" + JSON.stringify(unintendedKeys));\n }\n\n var element = namespace == null ? document.createElement(tagName) : document.createElementNS(namespace, tagName);\n var filteredClassList = (classList || []).filter(function (className) {\n return className;\n });\n if (filteredClassList.length > 0) {\n var _element$classList;\n\n (_element$classList = element.classList).add.apply(_element$classList, _toConsumableArray(filteredClassList));\n }\n Object.assign(element.style, style);\n\n Object.entries(attributes).forEach(function (_ref3) {\n var _ref4 = _slicedToArray(_ref3, 2),\n name = _ref4[0],\n value = _ref4[1];\n\n element.setAttribute(name, value);\n });\n Object.assign(element.dataset, data);\n\n if (children.length > 0) {\n appendChildren(element, children);\n }\n\n on(element, eventHandlers);\n\n return element;\n};\n\n\nvar empty = function empty(node) {\n while (node.firstChild) {\n node.removeChild(node.firstChild);\n }\n\n return node;\n};\n\nvar fetchHTML = function fetchHTML(url) {\n return fetch(url).then(function (response) {\n return response.text();\n }).then(strToElement);\n};\n\nvar firstAncestor = function firstAncestor(node, selector) {\n var halt = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : \"body\";\n\n while (node != null && !node.matches(selector)) {\n if (node.matches(halt)) return null;\n\n node = node.parentNode;\n }\n\n return node;\n};\n\n/**\n * Returns a DocumentFragment containing the given HTML string, or null if\n * the string is empty or falsey.\n */\nvar fragmentFromString = function fragmentFromString(strHTML) {\n if (!strHTML) {\n return null;\n }\n\n var templateEl = document.createElement(\"template\");\n templateEl.innerHTML = strHTML;\n return templateEl.content;\n};\n\n// Forces a reflow of the element so that cached styles are recomputed. This is\n// important for ensuring that animations are used when changing styles or CSS\n// classes via JS. See http://stackoverflow.com/q/11131875.\nvar forceReflow = function forceReflow(el) {\n el.offsetHeight;\n};\n\nvar generateSnippetMap = function generateSnippetMap(html) {\n var wrapper = document.createElement(\"div\");\n wrapper.innerHTML = html;\n var snippets = [].concat(_toConsumableArray(wrapper.querySelectorAll(\"[data-snippet]\"))).reduce(function (coll, node) {\n var name = node.dataset.snippet;\n coll[name] = node;\n node.removeAttribute(\"data-snippet\");\n node.remove();\n\n return coll;\n }, {});\n\n return function (name) {\n if (snippets[name] == null) return;\n\n return snippets[name].cloneNode(true);\n };\n};\n\nvar getCSSProperty = function getCSSProperty(node, property) {\n return window.getComputedStyle(node).getPropertyValue(property);\n};\n\nvar getElementsByClass = function getElementsByClass(parent, classNames) {\n return classNames.reduce(function (elements, name) {\n elements[Object(__WEBPACK_IMPORTED_MODULE_0__utils__[\"camelCase\"])(name)] = parent.querySelector(\".\" + name);\n\n return elements;\n }, {});\n};\n\n// A version of `getBoundingClientRect` relative to a reference node instead\n// of the window.\nvar getRelativeBoundingClientRect = function getRelativeBoundingClientRect(node) {\n var reference = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n if (reference == null) {\n reference = node.parentNode;\n }\n\n var rect = node.getBoundingClientRect();\n var refRect = reference.getBoundingClientRect();\n return {\n top: rect.top - refRect.top,\n bottom: rect.bottom - refRect.bottom,\n left: rect.left - refRect.left,\n right: rect.right - refRect.right,\n width: rect.width,\n height: rect.height\n };\n};\n\n// Determines a bounding rectangle that encompasses all given nodes.\nvar getAggregateBoundingClientRect = function getAggregateBoundingClientRect(nodes) {\n return [].concat(_toConsumableArray(nodes)).reduce(function (agg, node) {\n var rect = node.getBoundingClientRect();\n agg.top = Math.min(agg.top, rect.top);\n agg.bottom = Math.max(agg.bottom, rect.bottom);\n agg.left = Math.min(agg.left, rect.left);\n agg.right = Math.max(agg.right, rect.right);\n agg.width = Math.max(agg.width, rect.left - agg.left + rect.width);\n agg.height = Math.max(agg.height, rect.top - agg.top + rect.height);\n return agg;\n }, {\n top: Infinity,\n bottom: 0,\n left: Infinity,\n right: 0,\n width: 0,\n height: 0\n });\n};\n\n// Given an element, this will return an integer that is the maximum font size (in px) that allows all the\n// text to fit without overflow.\nvar getFontSizeToFit = function getFontSizeToFit(el) {\n var maxFontSizePx = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 24;\n\n var startingFontSize = el.style.fontSize;\n var startingOverflow = el.style.overflow;\n el.style.overflow = \"hidden\";\n var high = maxFontSizePx + 1;\n var low = 0;\n el.style.fontSize = high + \"px\";\n while (low + 1 < high) {\n var mid = low + (high - low >> 1);\n el.style.fontSize = mid + \"px\";\n if (el.clientHeight < el.scrollHeight || el.clientWidth < el.scrollWidth) {\n high = mid;\n } else {\n low = mid;\n }\n }\n\n el.style.fontSize = startingFontSize;\n el.style.overflow = startingOverflow;\n return low;\n};\n\n/**\n * Attempt to calculate the `font-size` needed to have the text of `el` fit within the given number of lines.\n *\n * This is far from a perfect solution as there are several factors that determine line count not to mention\n * occasional ambiguity of what constitutes a \"line\" when there's `innerHTML` to contend with.\n *\n * @param {HTMLElement} el - Element with text to fit `maxLines`.\n * @param {number} maxLines - Max line count to calculate for.\n * @param {number} [precision] - The amount in px to incrementally adjust `font-size` by to determine changes.\n * @return {number} - In px.\n */\nvar getFontSizeToFitLines = function getFontSizeToFitLines(el, maxLines) {\n var precision = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.5;\n\n /**\n * NOTE(oscar): The computed style of certain \"older\" properties should always be in px regardless of\n * applied style.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle\n */\n var fontSize = parseFloat(getCSSProperty(el, \"font-size\"));\n\n var prevFontSizeStyle = el.style.fontSize;\n var prevHeight = el.style.height;\n var prevLineHeight = el.style.lineHeight;\n el.style.height = \"unset\";\n\n // NOTE(oscar): Ensures line-height is sensitive to changes in font-size.\n el.style.lineHeight = \"10em\";\n\n var computedFontSize = Object(__WEBPACK_IMPORTED_MODULE_0__utils__[\"binaryFind\"])(Object(__WEBPACK_IMPORTED_MODULE_0__utils__[\"range\"])(precision, fontSize, precision), function (value) {\n el.style.fontSize = value + precision + \"px\";\n var lineHeight = parseFloat(getCSSProperty(el, \"line-height\"));\n var paddingTop = parseFloat(getCSSProperty(el, \"padding-top\"));\n var paddingBottom = parseFloat(getCSSProperty(el, \"padding-bottom\"));\n var textHeight = el.getBoundingClientRect().height - paddingTop - paddingBottom;\n return textHeight > lineHeight * maxLines;\n }) || fontSize;\n\n el.style.height = prevHeight;\n el.style.fontSize = prevFontSizeStyle;\n el.style.lineHeight = prevLineHeight;\n return computedFontSize;\n};\n\nvar indexOf = function indexOf(node) {\n return [].indexOf.call(node.parentNode.children, node);\n};\n\n// Returns a Promise that resolves when the passed Image is rendered (determined by polling for a non-zero\n// clientWidth and clientHeight).\nvar imageIsRendered = function imageIsRendered(img) {\n var timeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 10000;\n\n var start = Date.now();\n return new Promise(function (resolve, reject) {\n var checkRendered = function checkRendered() {\n if (Date.now() - start >= timeout) {\n reject(new Error(\"Timeout loading image \\\"\" + img.src + \"\\\"\"));\n } else if (img.clientWidth === 0 || img.clientHeight === 0) {\n requestAnimationFrame(checkRendered);\n } else {\n resolve();\n }\n };\n\n requestAnimationFrame(checkRendered);\n });\n};\n\nvar off = function off(node, events) {\n Object.keys(events).forEach(function (names) {\n var listener = events[names];\n\n names.trim().split(/\\s+/).forEach(function (name) {\n node.removeEventListener(name, listener);\n });\n });\n};\n\nvar on = function on(node, events) {\n Object.keys(events).forEach(function (names) {\n var listener = events[names];\n\n names.trim().split(/\\s+/).forEach(function (name) {\n node.addEventListener(name, listener);\n });\n });\n};\n\nvar onAnimationsComplete = function onAnimationsComplete(els, callback) {\n var animationsLeft = els.length;\n els.forEach(function (el) {\n addOneTimeListener(el, \"webkitAnimationEnd\", function () {\n animationsLeft -= 1;\n if (animationsLeft === 0) {\n callback();\n }\n });\n });\n};\n\n// Returns a map of { units, value } for a CSS length property.\n// The length must be a string with \"px\" or \"%\" units or a value of 0.\nvar parseCSSLength = function parseCSSLength(length) {\n if (length === 0 || length === \"0\") return { value: 0, units: \"px\" };\n\n var match = /(.+)(px|%)/.exec(length);\n if (!match) return null;\n\n var _match = _slicedToArray(match, 3),\n _ = _match[0],\n value = _match[1],\n units = _match[2];\n\n if (value == null || units == null) return null;\n\n return { units: units, value: Number(value) };\n};\n\nvar prependChild = function prependChild(parentNode, node) {\n parentNode.insertBefore(node, parentNode.children[0]);\n\n return parentNode;\n};\n\nvar replaceStyle = function replaceStyle(element) {\n for (var _len2 = arguments.length, newStyles = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n newStyles[_key2 - 1] = arguments[_key2];\n }\n\n element.removeAttribute(\"style\");\n Object.assign.apply(Object, [element.style].concat(newStyles));\n};\n\nvar scrollIntoView = function scrollIntoView(node) {\n var rect = node.getBoundingClientRect();\n var pRect = node.parentNode.getBoundingClientRect();\n var topDiff = rect.top - pRect.top;\n var botDiff = rect.bottom - pRect.bottom;\n\n if (topDiff < 0 && botDiff > 0) {\n node.parentNode.scrollTop += (topDiff + botDiff) / 2;\n } else if (topDiff < 0) {\n node.parentNode.scrollTop += topDiff;\n } else if (botDiff > 0) {\n node.parentNode.scrollTop += botDiff;\n }\n};\n\nvar strToElement = function strToElement(str) {\n var div = document.createElement(\"div\");\n div.innerHTML = str.replace(/\\n\\s*/g, \"\");\n\n return div.firstChild;\n};\n\nvar strToStyle = function strToStyle(str) {\n var style = document.createElement(\"style\");\n style.innerHTML = str;\n\n return style;\n};\n\n/** Writes `contentHTML` into `iframeEl`. */\nvar writeToIframe = function writeToIframe(iframeEl, contentHTML) {\n iframeEl.contentWindow.document.open();\n iframeEl.contentWindow.document.write(contentHTML);\n iframeEl.contentWindow.document.close();\n};\n\nvar preparetagHTML = function preparetagHTML(tagHTML) {\n var wrapperEl = document.createElement(\"div\");\n wrapperEl.innerHTML = tagHTML;\n\n // Script tags must be reattached in order to run.\n [].concat(_toConsumableArray(wrapperEl.querySelectorAll(\"script\"))).forEach(function (originalScriptTag) {\n var replacementScriptTag = document.createElement(\"script\");\n [].concat(_toConsumableArray(originalScriptTag.attributes)).forEach(function (_ref5) {\n var name = _ref5.nodeName,\n value = _ref5.nodeValue;\n\n replacementScriptTag.setAttribute(name, value);\n });\n replacementScriptTag.innerHTML = originalScriptTag.innerHTML;\n originalScriptTag.parentNode.replaceChild(replacementScriptTag, originalScriptTag);\n });\n\n return wrapperEl;\n};\n\nvar appendImpressionTags = function appendImpressionTags(containerEl, impressionTags) {\n impressionTags.forEach(function (tagHTML) {\n var wrapper = preparetagHTML(tagHTML);\n containerEl.append(wrapper);\n });\n};\n\n/***/ }),\n/* 2 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"E\", function() { return PLATFORM_ANDROID; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"F\", function() { return PLATFORM_IOS; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return AUDIO_POLICY_ALWAYS_MUTE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return AUDIO_POLICY_ON_INTERACTION; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return AUDIO_POLICY_NO_RESTRICTIONS; });\n/* unused harmony export EXCHANGE_APPLOVIN */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"x\", function() { return EXCHANGE_DOUBLECLICK; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"y\", function() { return EXCHANGE_INNERACTIVE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"z\", function() { return EXCHANGE_IRONSOURCE; });\n/* unused harmony export EXCHANGE_MOPUB */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"A\", function() { return EXCHANGE_MINTEGRAL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"B\", function() { return EXCHANGE_VUNGLE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"D\", function() { return ORIENTATION_PORTRAIT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"C\", function() { return ORIENTATION_LANDSCAPE; });\n/* unused harmony export CONNECTION_TYPE_WIFI */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"m\", function() { return CLICK_AREA_TYPE_OTHER; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"l\", function() { return CLICK_AREA_TYPE_CTA; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"n\", function() { return CLICK_METRIC_TYPE_CLOSE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"o\", function() { return CLICK_METRIC_TYPE_CTA; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"p\", function() { return CLICK_METRIC_TYPE_DEADZONE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"q\", function() { return CLICK_METRIC_TYPE_UNKNOWN; });\n/* unused harmony export CLICK_REJECTION_REASON_UNKNOWN */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"v\", function() { return CLICK_REJECTION_REASON_NO_INTERACTIONS; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"k\", function() { return CLICKTHROUGH_URL_TYPE_LIFTOFF_ENDPOINT; });\n/* unused harmony export CLICKTHROUGH_URL_TYPE_APP_STORE */\n/* unused harmony export CLICK_TRACKING_URL_TYPE_UNKNOWN */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"w\", function() { return CLICK_TRACKING_URL_TYPE_LIFTOFF_ENDPOINT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"I\", function() { return TRACKING_METHOD_OPEN_METHOD; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"H\", function() { return TRACKING_METHOD_IMAGE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"G\", function() { return TRACKING_METHOD_BEACON; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return AUTOCLICK_TYPE_LAST_INTERACTION; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return AUTOCLICK_TYPE_INTERACTION_COUNT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return AUTOCLICK_TYPE_LAST_INTERACTION_AND_INTERACTION_COUNT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return AUTOCLICK_TYPE_COMPLETED_DELAY; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return AUTOCLICK_TYPE_LOAD_DELAY; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"i\", function() { return AUTOCLICK_TYPE_VIEWABLE_DELAY; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"j\", function() { return AUTOCLICK_TYPE_VIEWABLE_DELAY_WITH_RESET; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"u\", function() { return CLICK_OPEN_METHOD_WINDOW_OPEN; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"t\", function() { return CLICK_OPEN_METHOD_MRAID; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"r\", function() { return CLICK_OPEN_METHOD_ANCHOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"s\", function() { return CLICK_OPEN_METHOD_LOCATION; });\nvar PLATFORM_ANDROID = \"android\";\nvar PLATFORM_IOS = \"ios\";\n\nvar AUDIO_POLICY_ALWAYS_MUTE = \"always-mute\";\nvar AUDIO_POLICY_ON_INTERACTION = \"on-interaction\";\nvar AUDIO_POLICY_NO_RESTRICTIONS = \"no-restrictions\";\n\n// TODO(Casey): Use constants instead of string literals for all exchanges\n// throughout.\nvar EXCHANGE_APPLOVIN = \"applovin\";\nvar EXCHANGE_DOUBLECLICK = \"doubleclick\";\nvar EXCHANGE_INNERACTIVE = \"inneractive-direct\";\nvar EXCHANGE_IRONSOURCE = \"ironsource\";\nvar EXCHANGE_MOPUB = \"mopub\";\nvar EXCHANGE_MINTEGRAL = \"mintegral\";\nvar EXCHANGE_VUNGLE = \"vungle\";\n\nvar ORIENTATION_PORTRAIT = \"portrait\";\nvar ORIENTATION_LANDSCAPE = \"landscape\";\n\n// These must correspond to the rtb.proto ConnectionType enum definition.\nvar CONNECTION_TYPE_WIFI = 2;\n\n// These must correspond to the rtb.proto ClickAreaType enum definition.\nvar CLICK_AREA_TYPE_OTHER = 1;\nvar CLICK_AREA_TYPE_CTA = 3;\n\nvar CLICK_METRIC_TYPE_CLOSE = \"CLOSE\";\nvar CLICK_METRIC_TYPE_CTA = \"CTA\";\nvar CLICK_METRIC_TYPE_DEADZONE = \"DEADZONE\";\nvar CLICK_METRIC_TYPE_UNKNOWN = \"UNKNOWN_CLICK_TYPE\";\n\n// This must correspond to the rtb.proto ClickRejectionReason enum definition.\nvar CLICK_REJECTION_REASON_UNKNOWN = 0;\nvar CLICK_REJECTION_REASON_NO_INTERACTIONS = 1;\n\n// This must correspond to the auction.proto ClickthroughURLType.\nvar CLICKTHROUGH_URL_TYPE_LIFTOFF_ENDPOINT = 1;\nvar CLICKTHROUGH_URL_TYPE_APP_STORE = 2;\n\n// This must correspond to the auction.proto ClickTrackingURLType.\nvar CLICK_TRACKING_URL_TYPE_UNKNOWN = 0;\nvar CLICK_TRACKING_URL_TYPE_LIFTOFF_ENDPOINT = 1;\n\n// This must correspond to the rtb.proto TrackingMethod enum definition.\nvar TRACKING_METHOD_OPEN_METHOD = 1;\nvar TRACKING_METHOD_IMAGE = 2;\nvar TRACKING_METHOD_BEACON = 3;\n\nvar AUTOCLICK_TYPE_LAST_INTERACTION = \"lastInteraction\";\nvar AUTOCLICK_TYPE_INTERACTION_COUNT = \"interactionCount\";\nvar AUTOCLICK_TYPE_LAST_INTERACTION_AND_INTERACTION_COUNT = \"lastInteractionAndInteractionCount\";\nvar AUTOCLICK_TYPE_COMPLETED_DELAY = \"completedDelay\";\nvar AUTOCLICK_TYPE_LOAD_DELAY = \"loadDelay\";\nvar AUTOCLICK_TYPE_VIEWABLE_DELAY = \"viewableDelay\";\nvar AUTOCLICK_TYPE_VIEWABLE_DELAY_WITH_RESET = \"viewableDelayWithReset\";\n\nvar CLICK_OPEN_METHOD_WINDOW_OPEN = \"window_open\";\nvar CLICK_OPEN_METHOD_MRAID = \"mraid\";\nvar CLICK_OPEN_METHOD_ANCHOR = \"anchor\";\nvar CLICK_OPEN_METHOD_LOCATION = \"location\";\n\n/***/ }),\n/* 3 */,\n/* 4 */,\n/* 5 */,\n/* 6 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__adexp__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__error_handling__ = __webpack_require__(10);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__frontendlib_utils__ = __webpack_require__(0);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n\n\n/**\n * Sends log to Adexp.\n */\nvar postJSON = function postJSON(url, data) {\n /**\n * TODO(oscar): Investigate if we could improve empty payloads.\n * @see https://github.com/liftoffio/liftoff/pull/25293\n */\n if (data == null) {\n console.error(\"No data to post for logging.\");\n return Promise.resolve();\n }\n var payload = JSON.stringify(data);\n\n if (payload.length < 2) {\n console.error(\"Data could not be stringified for logging.\");\n return Promise.resolve();\n }\n\n return Object(__WEBPACK_IMPORTED_MODULE_2__frontendlib_utils__[\"request\"])(\"POST\", url, {\n // Don't set the content type to \"application/json\" because that requires\n // a preflight OPTIONS request (because this is a cross-domain request).\n \"Content-Type\": \"text/plain\"\n }, payload).catch(function () {\n console.error(\"Failed to post JSON for logging.\");\n });\n};\n\nvar postMetricV2 = function postMetricV2(_ref, name, value) {\n var adexpContextSnapshotFn = _ref.adexpContextSnapshotFn,\n endpoint = _ref.endpoint,\n eventTrackingParam = _ref.eventTrackingParam;\n\n var adexpContext = adexpContextSnapshotFn();\n var payload = new __WEBPACK_IMPORTED_MODULE_0__adexp__[\"c\" /* AdexpMessage */]({\n context: adexpContext,\n metric: new __WEBPACK_IMPORTED_MODULE_0__adexp__[\"d\" /* AdexpMetricV2 */](name, value)\n });\n\n return postJSON(endpoint + \"/adexp_metrics/\" + eventTrackingParam, payload);\n};\n\nvar Logger = function () {\n function Logger() {\n _classCallCheck(this, Logger);\n }\n\n _createClass(Logger, null, [{\n key: \"init\",\n\n // #if process.env.NODE_ENV === \"test\"\n // static resetForTests() {\n // delete this.enabled;\n // delete this.loggedErrors;\n // delete this.endpoint;\n // delete this.eventTrackingParam;\n // delete this.adexpContextSnapshotFn;\n // }\n // #endif\n\n value: function init() {\n this.enabled = false;\n this.loggedErrors = [];\n }\n }, {\n key: \"enable\",\n value: function enable() {\n this.enabled = true;\n }\n\n /**\n * Pass the logger required context\n * @param {string} endpoint - The endpoint to which the creative will post\n * AdExp logs or metrics.\n * @param {string} eventTrackingParam - The tracking parameter string which\n * includes encoded bid context information.\n * @param {function} adexpContextSnapshotFn - A function to call that will\n * take a snapshot of the current environment and return an `AdexpContext`\n * object.\n */\n\n }, {\n key: \"passContext\",\n value: function passContext(endpoint, eventTrackingParam, adexpContextSnapshotFn) {\n this.endpoint = endpoint;\n this.eventTrackingParam = eventTrackingParam;\n this.adexpContextSnapshotFn = adexpContextSnapshotFn;\n }\n\n /**\n * Listens for errors that are caught by the window and reports them to adexp.\n * Don't call this if you use your own custom error handlers.\n */\n\n }, {\n key: \"addErrorListeners\",\n value: function addErrorListeners() {\n var _this = this;\n\n window.addEventListener(\"error\", function (errorEvent) {\n var normalizedError = Object(__WEBPACK_IMPORTED_MODULE_1__error_handling__[\"c\" /* normalizeErrorEvent */])(errorEvent);\n _this.recordError(normalizedError);\n });\n }\n\n /**\n * recordError takes an object like:\n * { message, line, column, sourceURL ... }\n * and logs the error to adexp.\n */\n\n }, {\n key: \"recordError\",\n value: function recordError(e) {\n this.recordLabeledError(\"error\", e);\n }\n }, {\n key: \"recordLabeledError\",\n value: function recordLabeledError(tag, e) {\n // #if process.env.NODE_ENV !== \"test\"\n console.error(e);\n // #endif\n this._processError(tag, e);\n }\n }, {\n key: \"_processError\",\n value: function _processError(tag, errorObj) {\n if (Object(__WEBPACK_IMPORTED_MODULE_1__error_handling__[\"e\" /* shouldIgnoreError */])(errorObj)) {\n return;\n }\n\n var normalizedErr = Object(__WEBPACK_IMPORTED_MODULE_1__error_handling__[\"b\" /* normalizeError */])(errorObj);\n\n // Only log one error per (sourceURL, line #, message) combination. This\n // prevents noise from certain errors that are logged many times\n // from a single impression.\n var errorIdentifier = [normalizedErr.sourceURL, normalizedErr.line, normalizedErr.message].join(\"-\");\n\n if (this.loggedErrors.includes(errorIdentifier)) {\n return;\n }\n\n this.loggedErrors.push(errorIdentifier);\n this.recordLog(tag, normalizedErr.message, new __WEBPACK_IMPORTED_MODULE_0__adexp__[\"a\" /* AdexpJavaScriptError */](normalizedErr));\n }\n }, {\n key: \"recordLog\",\n value: function recordLog(tag, message, data) {\n if (!this.enabled) {\n return;\n }\n\n var adexpContext = this.adexpContextSnapshotFn();\n var payload = new __WEBPACK_IMPORTED_MODULE_0__adexp__[\"c\" /* AdexpMessage */]({\n context: adexpContext,\n log: new __WEBPACK_IMPORTED_MODULE_0__adexp__[\"b\" /* AdexpLog */](tag, message, data)\n });\n\n return postJSON(this.endpoint + \"/adexp_log/\" + this.eventTrackingParam, payload);\n }\n }, {\n key: \"recordMetricV2\",\n value: function recordMetricV2(name, value) {\n if (!this.enabled) {\n return Promise.resolve();\n }\n return postMetricV2({\n endpoint: this.endpoint,\n eventTrackingParam: this.eventTrackingParam,\n adexpContextSnapshotFn: this.adexpContextSnapshotFn\n }, name, value);\n }\n }, {\n key: \"recordVXOnlyAdexpMetric\",\n value: function recordVXOnlyAdexpMetric(name, value) {\n if (!Number.isInteger(value)) {\n console.debug(\"Expected an integer value for VXOnlyAdexpMetric: \" + name);\n return;\n }\n\n return this.alwaysRecordMetricV2(\"custom_event\", {\n name: name,\n value: value\n });\n }\n }, {\n key: \"alwaysRecordMetricV2\",\n value: function alwaysRecordMetricV2(name, value) {\n return postMetricV2({\n endpoint: this.endpoint,\n eventTrackingParam: this.eventTrackingParam,\n adexpContextSnapshotFn: this.adexpContextSnapshotFn\n }, name, value);\n }\n }]);\n\n return Logger;\n}();\n\n// TODO(oscar): Create a global Logger.\n\n\nLogger.init();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Logger);\n\n/***/ }),\n/* 7 */,\n/* 8 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar AutoclickBehaviorAbstract = function () {\n function AutoclickBehaviorAbstract(_ref) {\n var autoclick = _ref.autoclick,\n behavior = _ref.behavior,\n delayClickthroughHandler = _ref.delayClickthroughHandler;\n\n _classCallCheck(this, AutoclickBehaviorAbstract);\n\n this._autoclick = autoclick;\n this._behavior = behavior;\n this.internalCount = 0;\n this.delayClickthroughHandler = delayClickthroughHandler;\n this.init();\n }\n\n /** Runs when the class is instantiated. */\n\n\n _createClass(AutoclickBehaviorAbstract, [{\n key: \"init\",\n value: function init() {}\n\n /**\n * Only relevant for types that count something like interactions.\n * @returns {number} - Minimum amount until enabling delayed clickthrough.\n */\n\n }, {\n key: \"getBehaviorCount\",\n value: function getBehaviorCount() {\n return this._behavior == null ? null : this._behavior.count;\n }\n }, {\n key: \"getBehaviorType\",\n value: function getBehaviorType() {\n return this._behavior == null ? null : this._behavior.type;\n }\n\n /**\n * How long to delay clickthrough by.\n * @returns {number} - Delay value in milliseconds.\n */\n\n }, {\n key: \"getBehaviorDelay\",\n value: function getBehaviorDelay() {\n return this._behavior == null ? null : this._behavior.delay;\n }\n }, {\n key: \"isCountReached\",\n value: function isCountReached() {\n return this.getCurrentCount() >= this.getBehaviorCount();\n }\n }, {\n key: \"getCurrentCount\",\n value: function getCurrentCount() {\n return this.internalCount;\n }\n }, {\n key: \"setCurrentCount\",\n value: function setCurrentCount(n) {\n if (typeof n !== \"number\") {\n throw new Error(\"n must be a number, got: \" + n);\n }\n this.internalCount = n;\n }\n\n /** Triggers a delayed clickthrough event. */\n\n }, {\n key: \"delayClickthrough\",\n value: function delayClickthrough() {\n var delay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getBehaviorDelay();\n\n if (!this.isCountReached()) return;\n\n this.delayClickthroughHandler(delay);\n }\n\n /**\n * Triggered by the InteractionMonitor class.\n */\n\n }, {\n key: \"onInteraction\",\n value: function onInteraction(_) {}\n\n /**\n * Should trigger when the creative is \"finished\". Typically this is the moment\n * an endscreen will appear.\n */\n\n }, {\n key: \"onCompleted\",\n value: function onCompleted() {}\n\n /**\n * Triggers when an \"engagement\" event occurs. Engagement must be fired by the\n * creative or a subcomponent thereof.\n */\n\n }, {\n key: \"onEngagement\",\n value: function onEngagement() {}\n }, {\n key: \"onHtmlLoaded\",\n value: function onHtmlLoaded() {}\n }, {\n key: \"onViewable\",\n value: function onViewable() {}\n }, {\n key: \"onViewableChange\",\n value: function onViewableChange(_) {}\n }]);\n\n return AutoclickBehaviorAbstract;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (AutoclickBehaviorAbstract);\n\n/***/ }),\n/* 9 */,\n/* 10 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* unused harmony export isTestError */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Warning; });\n/* unused harmony export tryParseStackInfo */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return normalizeError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return normalizeErrorEvent; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return normalizePromiseRejectionEvent; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return shouldIgnoreError; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__frontendlib_utils__ = __webpack_require__(0);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n// if process.env.NODE_ENV === \"test\"\nvar isTestError = function isTestError(error) {\n // NOTE(Austin): Annoyingly, assertion errors will loop back here in\n // tests, so we have to ignore these.\n return error != null && error.constructor.name === \"AssertionError\";\n};\n// #endif\n\nvar Warning = function (_Error) {\n _inherits(Warning, _Error);\n\n function Warning() {\n var _ref;\n\n _classCallCheck(this, Warning);\n\n for (var _len = arguments.length, params = Array(_len), _key = 0; _key < _len; _key++) {\n params[_key] = arguments[_key];\n }\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n var _this = _possibleConstructorReturn(this, (_ref = Warning.__proto__ || Object.getPrototypeOf(Warning)).call.apply(_ref, [this].concat(params)));\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(_this, Warning);\n }\n _this.severity = \"warning\";\n return _this;\n }\n\n return Warning;\n}(Error);\n\nvar tryConvertStringToNumber = function tryConvertStringToNumber(str) {\n if (str == null) {\n return 0;\n }\n\n var parsed = parseInt(str);\n if (Number.isNaN(parsed)) {\n return 0;\n }\n\n return parsed;\n};\n\nvar tryParseStackInfo = function tryParseStackInfo(stack) {\n if (stack == null) {\n return null;\n }\n\n var match = String(stack).match(\n // NOTE(Austin): We include about:srcdoc for inner_env errors.\n /(\\b(?:[^ ]*\\.js.*?)|(?:about:srcdoc)):(\\d+)?:?(\\d+)?/);\n\n if (match == null) {\n return null;\n }\n\n // Line and column need to be integers. We have them in our adexp\n // protobuf this way, so if they aren't we'll get a malformed message.\n return {\n sourceURL: match[1],\n line: tryConvertStringToNumber(match[2]),\n column: tryConvertStringToNumber(match[3])\n };\n};\n\n/**\n * Converts an Error or string into a map like\n * { message, stack, sourceURL, line, column }\n */\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/Error\nvar normalizeError = function normalizeError(obj) {\n if (obj == null) {\n return null;\n }\n\n if (typeof obj === \"string\") {\n return {\n message: obj\n };\n }\n\n var errorProps = Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_utils__[\"selectKeys\"])(obj, Object.getOwnPropertyNames(obj));\n\n return Object.assign({}, tryParseStackInfo(errorProps.stack), errorProps);\n};\n\n/**\n * Converts an ErrorEvent object to a map like:\n * { message, line, column, sourceURL }\n * plus any additional information the error object contains.\n */\nvar normalizeErrorEvent = function normalizeErrorEvent(_ref2) {\n var message = _ref2.message,\n filename = _ref2.filename,\n lineno = _ref2.lineno,\n colno = _ref2.colno,\n error = _ref2.error;\n\n try {\n // Possible keys in an ErrorEvent:\n // [stack, name, fileName, lineNumber, columnNumber]\n var errorProps = error != null ? Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_utils__[\"selectKeys\"])(error, Object.getOwnPropertyNames(error)) : {};\n\n var errorObj = Object.assign({\n message: message,\n severity: error && error.severity ? error.severity : \"error\",\n line: lineno,\n column: colno,\n sourceURL: filename\n }, errorProps);\n\n if (error == null) {\n return errorObj;\n }\n\n var parsedInfo = tryParseStackInfo(error.stack);\n return Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_utils__[\"mergePropertiesWithDefaults\"])(errorObj, parsedInfo);\n } catch (e) {\n console.error(\"Error in normalizeErrorEvent: \" + e.stack);\n return null;\n }\n};\n\n/**\n * Converts an PromiseRejectionEvent object to a map like\n * { message, line, column, sourceURL }\n * plus any additional information the error object contains.\n */\nvar normalizePromiseRejectionEvent = function normalizePromiseRejectionEvent(_ref3) {\n var reason = _ref3.reason;\n\n try {\n var reasonIsError = reason instanceof Error;\n var reasonIsString = typeof reason === \"string\";\n\n var errorMessage = reasonIsString ? reason : reason.message;\n\n // Possible keys in object (* are non-standard):\n // [message, stack*, name, fileName*, lineNumber*, columnNumber*]\n var errorProps = reasonIsError ? Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_utils__[\"selectKeys\"])(reason, Object.getOwnPropertyNames(reason)) : {};\n\n var errorObj = Object.assign({\n message: errorMessage\n }, errorProps);\n\n return Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_utils__[\"mergePropertiesWithDefaults\"])(errorObj, tryParseStackInfo(reason.stack));\n } catch (e) {\n console.error(\"Error in normalizePromiseRejectionEvent: \" + e.stack);\n return null;\n }\n};\n\n/**\n * Normalizes the error and returns true if the error should be ingored;\n * otherwise, returns false.\n */\nvar shouldIgnoreError = function shouldIgnoreError(errorObj) {\n // Report only errors with non-malformed sourceURL.\n if (errorObj == null || errorObj.sourceURL === \"undefined\") {\n return true;\n }\n\n // mraid.js from adverty.com is a buggy implemenation. SMAATO and PUBMATIC are\n // the exchanges using such version and we see strange errors from the most.\n // While we are working with them to get a good MRAID implementation we filter\n // the noisy error messages by checking where the mraid.js is from.\n var stackFilter = new RegExp(\"adverty\\\\.com/.*mraid\\\\.js\");\n\n // We see these errors quite often, and they are not related to our code.\n var regexFilters = [\"Cannot read properties of undefined \\\\(reading 'fireEvent'\\\\)\", \"Cannot read property 'fireEvent' of undefined\", \"showInterstitial\", \"al_onPoststitialDismiss\", \"AFMA_ReceiveMessage\", \"webviewDidAppear\", \"AFMA_updateActiveView is not a function\", \"al_onAdViewRendered\", \"mraidbridge\", \"MoatMAK\", \"$adgIOS\", \"googqscp\", \"inmobi\", \"Script error\", \"avidbridge\"];\n var messageFilter = new RegExp(regexFilters.join(\"|\"));\n var errorStr = errorObj.message || errorObj.toString();\n if (messageFilter.test(errorStr) || stackFilter.test(errorObj.stack)) {\n return true;\n }\n\n var normalized = Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_utils__[\"selectKeys\"])(errorObj, [\"message\", \"line\", \"column\", \"stack\", \"sourceURL\"]);\n\n var nKeys = Object.keys(normalized).length;\n var onlyMessage = \"message\" in errorObj && nKeys === 1 && errorObj.message === \"undefined is not a function\";\n\n var onlyMessageStack = \"stack\" in errorObj && \"message\" in errorObj && nKeys === 2 && errorObj.stack === \"\" && errorObj.message === \"undefined is not a function\";\n\n var noSourceURL = errorObj.sourceURL == null && nKeys === 5;\n return onlyMessage || onlyMessageStack || noSourceURL;\n};\n\n/***/ }),\n/* 11 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils__ = __webpack_require__(0);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\nvar EventListener = function () {\n _createClass(EventListener, null, [{\n key: \"pubsubify\",\n value: function pubsubify(object) {\n var methods = Object.getOwnPropertyNames(EventListener.prototype).filter(function (name) {\n return name !== \"constructor\";\n });\n Object.assign(object, new EventListener());\n Object.assign(object, Object(__WEBPACK_IMPORTED_MODULE_0__utils__[\"selectKeys\"])(EventListener.prototype, methods));\n }\n }]);\n\n function EventListener() {\n _classCallCheck(this, EventListener);\n\n this.events = {};\n }\n\n _createClass(EventListener, [{\n key: \"on\",\n value: function on(map, callback) {\n var _this = this;\n\n if (Object(__WEBPACK_IMPORTED_MODULE_0__utils__[\"type\"])(map) !== \"object\") {\n map = _defineProperty({}, map, callback);\n }\n\n Object.keys(map).forEach(function (name) {\n if (_this.events[name] == null) {\n _this.events[name] = [];\n }\n\n _this.events[name].push(map[name]);\n });\n }\n }, {\n key: \"once\",\n value: function once(name, callback) {\n var _this2 = this;\n\n var single = function single() {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this2.off(name, single);\n callback.apply(null, args);\n };\n\n this.on(name, single);\n }\n }, {\n key: \"off\",\n value: function off(map, callback) {\n var _this3 = this;\n\n if (Object(__WEBPACK_IMPORTED_MODULE_0__utils__[\"type\"])(map) !== \"object\") {\n map = _defineProperty({}, map, callback);\n }\n\n Object.keys(map).forEach(function (name) {\n if (_this3.events[name] == null) return;\n\n var callback = map[name];\n if (callback == null) return delete _this3.events[name];\n\n _this3.events[name] = _this3.events[name].filter(function (cb) {\n return cb !== callback;\n });\n if (_this3.events[name].length === 0) {\n delete _this3.events[name];\n }\n });\n }\n }, {\n key: \"emit\",\n value: function emit(name) {\n for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n if (this.events[name] == null) return;\n\n return Promise.all(this.events[name].map(function (cb) {\n return cb.apply(null, args);\n }));\n }\n }, {\n key: \"relay\",\n value: function relay(listener, onEvent) {\n var emitEvent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : onEvent;\n\n this.on(onEvent, listener.emit.bind(listener, emitEvent));\n }\n }]);\n\n return EventListener;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (EventListener);\n\n/***/ }),\n/* 12 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__frontendlib_event_listener__ = __webpack_require__(11);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__constants__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__logger__ = __webpack_require__(6);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__error_handling__ = __webpack_require__(10);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n\n\n\n\n/**\n * This interval is the time between attempts to open a URL via different\n * methods (see `LiftoffMRAID.open`).\n */\nvar CLICK_RETRY_INTERVAL_MS = 1000;\n\nvar CLICK_OPEN_METHODS = {\n WINDOW_OPEN: \"window_open\",\n MRAID: \"mraid\",\n ANCHOR: \"anchor\",\n LOCATION: \"location\"\n};\n\n/**\n * This is a low-level wrapper around mraid that should be usable generally\n * (i.e. in any HTML ad environment). It's used by both madlib and third-party\n * creatives.\n */\n\nvar LiftoffMRAID = function () {\n function LiftoffMRAID() {\n _classCallCheck(this, LiftoffMRAID);\n }\n\n _createClass(LiftoffMRAID, null, [{\n key: \"init\",\n\n /**\n * Among other things, this function attaches event listeners to the\n * window.mraid object. It should be called as soon as possible after\n * window.mraid is defined. Because of this side-effect, it should also only\n * be called once.\n */\n value: function init() {\n this.liftoffMraidInitTimestamp = Date.now();\n\n __WEBPACK_IMPORTED_MODULE_0__frontendlib_event_listener__[\"a\" /* default */].pubsubify(this);\n this.on = this.on.bind(this);\n this.once = this.once.bind(this);\n this._addMraidEventListener = this._addMraidEventListener.bind(this);\n\n this.viewableDurationMS = null;\n this.lastViewableTS = null;\n this.clickRetryTimeout = null;\n this.lastOpenedURL = null;\n this.isOrientationLocked = false;\n this.orientationToLock = null;\n this.viewable = null;\n this.isViewableByEvent = null;\n\n /** Keeps track of each version of window.mraid loaded. */\n this.mraids = [];\n /** This index of this.mraids that is currently loaded on window.mraid. */\n this.mraidIndex = null;\n\n /**\n * This object keeps track of what the current mraid object supports at the\n * moment support was checked.\n */\n this.supported = {\n methods: {},\n /**\n * NOTE(oscar): Unlike MRAID methods, we log mraid events that we listen\n * to as they occur.\n */\n events: {}\n };\n\n this._setInitialState();\n this._addEventListeners();\n }\n\n /** Returns time since LiftoffMRAID has been initialized in milliseconds. */\n\n }, {\n key: \"sinceInit\",\n value: function sinceInit() {\n return Date.now() - this.liftoffMraidInitTimestamp;\n }\n }, {\n key: \"getSupportedLog\",\n value: function getSupportedLog() {\n return Object.assign({\n \"document.hidden\": document.hidden,\n \"document.visibilityState\": document.visibilityState,\n \"LiftoffMRAID.viewable\": LiftoffMRAID.viewable,\n MRAID_ENV: window.MRAID_ENV\n }, this.supported);\n }\n }, {\n key: \"_setInitialState\",\n value: function _setInitialState() {\n var _this = this;\n\n var mraid = this.getMRAID();\n this.ready = this._mraidTry(function () {\n return _this.hasSupport(\"getState\") && mraid.getState() === \"default\";\n }, { tag: \"getState\", fallback: false });\n\n this.isViewableByEvent = this.hasSupport(\"isViewable\") ? this._mraidTry(function () {\n return mraid.isViewable();\n }, {\n tag: \"isViewable\",\n // NOTE(oscar): If isViewable() still fails, we fall back to\n // document.visibilityState.\n fallback: document.visibilityState !== \"hidden\"\n }) : document.visibilityState !== \"hidden\";\n this.processViewableChange(this.isViewableByEvent && this.isViewportShown());\n this.viewableDurationMS = 0;\n }\n\n /** TODO(oscar): Don't append to log if it won't be sent to Adexp. */\n\n }, {\n key: \"_appendEventLog\",\n value: function _appendEventLog(eventName, mraidIndex, args) {\n if (this.supported.events[eventName] == null) {\n this.supported.events[eventName] = [];\n }\n this.supported.events[eventName].push({\n sinceInitMs: this.sinceInit(),\n args: args,\n mraidIndex: mraidIndex,\n version: this.getMRAIDVersion()\n });\n }\n\n /**\n * This function is used to wrap calls to mraid methods in a try/catch block.\n * Any error gets logged in this.supported.errors.\n *\n * In general, this.hasSupport() is used to check for support. This function\n * serves as a further safeguard against errors due to faulty mraid\n * implementations.\n */\n\n }, {\n key: \"_mraidTry\",\n value: function _mraidTry(func, _ref) {\n var _ref$tag = _ref.tag,\n tag = _ref$tag === undefined ? \"other\" : _ref$tag,\n _ref$fallback = _ref.fallback,\n fallback = _ref$fallback === undefined ? undefined : _ref$fallback,\n _ref$logError = _ref.logError,\n logError = _ref$logError === undefined ? true : _ref$logError;\n\n try {\n return func();\n } catch (e) {\n if (logError) {\n // Record the error.\n this.supported.errors = this.supported.errors || [];\n var version = void 0;\n try {\n version = this.getMRAID().getVersion();\n } catch (ee) {\n console.error(\"Failed to get MRAID version\", ee);\n }\n this.supported.errors.push({\n tag: tag,\n sinceInitMs: this.sinceInit(),\n message: e != null ? e.message : null,\n mraidIndex: this.mraidIndex,\n version: version\n });\n }\n return fallback;\n }\n }\n }, {\n key: \"_addMraidEventListener\",\n value: function _addMraidEventListener(eventName, callback) {\n var _this2 = this;\n\n if (!this.hasSupport(\"addEventListener\")) return;\n\n var mraid = this.getMRAID();\n var mraidIndex = this.mraidIndex;\n\n this._mraidTry(function () {\n mraid.addEventListener(eventName, function () {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this2._appendEventLog(eventName, mraidIndex, args);\n\n callback.apply(undefined, args);\n });\n }, { tag: eventName });\n }\n }, {\n key: \"_addEventListeners\",\n value: function _addEventListeners() {\n var _this3 = this;\n\n // \"error\" events include 2 arguments: a message and an action. The action\n // is the MRAID API call that caused the error.\n this._addMraidEventListener(\"error\", function () {\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n var e = new Error(\"MRAID error: \" + args);\n _this3.emit(\"error\", e);\n });\n this._addMraidEventListener(\"ready\", function () {\n if (_this3.ready) return;\n _this3.ready = true;\n _this3.emit(\"ready\");\n });\n this._addMraidEventListener(\"viewableChange\", function (viewable) {\n _this3.isViewableByEvent = viewable;\n _this3.processViewableChange(_this3.isViewableByEvent && _this3.isViewportShown());\n });\n\n // NOTE(oscar): We're using _addMraidEventListener to log this event.\n this._addMraidEventListener(\"exposureChange\", function () {});\n\n /**\n * The following is a fallback in case mraid's viewableChange is not\n * supported.\n */\n document.addEventListener(\"visibilitychange\", function () {\n for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n\n _this3._appendEventLog(\"document.visibilitychange\", _this3.mraidIndex, args);\n\n /**\n * We delay the following by an event cycle to allow mraid's\n * viewableChange event to occur first.\n */\n Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"runAsync\"])(function () {\n if (_this3.supported.events.viewableChange == null) {\n _this3.isViewableByEvent = document.visibilityState !== \"hidden\";\n _this3.processViewableChange(_this3.isViewableByEvent && _this3.isViewportShown());\n }\n });\n });\n }\n }, {\n key: \"processViewableChange\",\n value: function processViewableChange(isViewable) {\n /**\n * NOTE(oscar): On the off chance the mraid implementation gives us\n * truthy/falsey values instead.\n */\n var normalizedIsViewable = !!isViewable;\n if (normalizedIsViewable === this.viewable) return;\n this.viewable = normalizedIsViewable;\n\n if (this.viewable) {\n this.lastViewableTS = Date.now();\n if (!this.isOrientationLocked && this.orientationToLock != null) {\n // NOTE(oscar): We won't lock the orientation until after the ad is\n // viewable.\n this.lockOrientation(this.orientationToLock);\n }\n } else {\n this.viewableDurationMS += this.lastViewableTS == null ? 0 : Date.now() - this.lastViewableTS;\n this.lastOpenedURL = null;\n clearTimeout(this.clickRetryTimeout);\n }\n\n if (this.viewable) {\n this.emit(\"viewable\");\n }\n this.emit(\"viewableChange\", this.viewable);\n }\n }, {\n key: \"onReady\",\n value: function onReady(fn) {\n if (this.ready) {\n Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"runAsync\"])(fn);\n return;\n }\n this.once(\"ready\", fn);\n }\n\n /**\n * Adds a listener to the \"viewable\" event. The \"viewable\" event fires\n * whenever we believe the ad has become visible to the user. If the ad was\n * already visible, then it fires the listener immediately.\n * @param {Function} callback\n * @param {boolean} continuous – Whether to listen to all viewable events.\n * Defaults to false, meaning it will only trigger the callback once.\n * @returns\n */\n\n }, {\n key: \"onViewable\",\n value: function onViewable(callback) {\n var continuous = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (this.viewable) {\n Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"runAsync\"])(callback);\n if (!continuous) return;\n }\n var deferrer = continuous ? this.on : this.once;\n deferrer(\"viewable\", callback);\n }\n\n /** Runs fn now with current viewable value and on \"viewableChange\" event. */\n\n }, {\n key: \"nowAndOnViewableChange\",\n value: function nowAndOnViewableChange(fn) {\n var _this4 = this;\n\n Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"runAsync\"])(function () {\n return fn(_this4.viewable);\n });\n\n this.on(\"viewableChange\", fn);\n }\n\n // TODO(oscar): Replace with nowAndOnViewableChange once v2 productionizes.\n\n }, {\n key: \"onViewableChange\",\n value: function onViewableChange(fn) {\n this.nowAndOnViewableChange(fn);\n }\n\n // IMPORTANT: This method MUST be called synchronously with a user action.\n\n }, {\n key: \"open\",\n value: function open(url, _ref2) {\n var _this5 = this;\n\n var exchange = _ref2.exchange,\n platform = _ref2.platform,\n _ref2$abTests = _ref2.abTests,\n abTests = _ref2$abTests === undefined ? [] : _ref2$abTests,\n _ref2$isLiftoffURL = _ref2.isLiftoffURL,\n isLiftoffURL = _ref2$isLiftoffURL === undefined ? false : _ref2$isLiftoffURL,\n _ref2$isAutoclick = _ref2.isAutoclick,\n isAutoclick = _ref2$isAutoclick === undefined ? false : _ref2$isAutoclick;\n\n // To prevent the click waterfall from resetting if the user clicks twice in\n // rapid succession, don't restart the waterfall unless the URL being opened\n // is different.\n if (this.lastOpenedURL === url) return;\n\n this.lastOpenedURL = url;\n clearTimeout(this.clickRetryTimeout);\n\n var mraid = this.getMRAID();\n // NOTE(oscar): Check to see if mraid.open is currently available.\n var mraidOpenIsSupported = this.hasSupport(\"open\");\n // NOTE(Casey): Ironsource requires us to only use mraid.open\n // for opening clickthrough URLs.\n var requireMRAID = mraidOpenIsSupported && (isAutoclick || exchange === __WEBPACK_IMPORTED_MODULE_2__constants__[\"z\" /* EXCHANGE_IRONSOURCE */]);\n\n var clickWaterfallDisabled = exchange === __WEBPACK_IMPORTED_MODULE_2__constants__[\"A\" /* EXCHANGE_MINTEGRAL */] || exchange === __WEBPACK_IMPORTED_MODULE_2__constants__[\"B\" /* EXCHANGE_VUNGLE */] || exchange == __WEBPACK_IMPORTED_MODULE_2__constants__[\"y\" /* EXCHANGE_INNERACTIVE */];\n\n var getFinalClickURL = function getFinalClickURL(openMethod) {\n return isLiftoffURL ? Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"appendParamObjectToURL\"])(url, {\n open_method: openMethod,\n tracking_method: __WEBPACK_IMPORTED_MODULE_2__constants__[\"I\" /* TRACKING_METHOD_OPEN_METHOD */]\n }) : url;\n };\n\n // To ensure that the user can click through, attempt multiple methods of\n // navigating to the URL. In order, they are:\n // 1. `mraid.open`, if mraid is available\n // 2. A fake anchor element\n // 3. `window.location`\n var openMethods = [\n // NOTE(vsingh): The window.open method is not used currently, but may be\n // used in future tests that compare click methods.\n {\n type: __WEBPACK_IMPORTED_MODULE_2__constants__[\"u\" /* CLICK_OPEN_METHOD_WINDOW_OPEN */],\n enabled: false,\n fn: function fn(url) {\n return window.open(url);\n }\n }, {\n type: __WEBPACK_IMPORTED_MODULE_2__constants__[\"t\" /* CLICK_OPEN_METHOD_MRAID */],\n enabled: mraidOpenIsSupported,\n fn: function fn(url) {\n if (!_this5.ready) {\n _this5.emit(\"error\", new Error(\"Called mraid.open before mraid was ready\"));\n }\n\n mraid.open(url);\n }\n }, {\n type: __WEBPACK_IMPORTED_MODULE_2__constants__[\"r\" /* CLICK_OPEN_METHOD_ANCHOR */],\n enabled: !requireMRAID,\n fn: function fn(url) {\n var a = document.createElement(\"a\");\n a.href = url;\n a.target = \"_blank\";\n a.click();\n }\n }, {\n type: __WEBPACK_IMPORTED_MODULE_2__constants__[\"s\" /* CLICK_OPEN_METHOD_LOCATION */],\n enabled: !requireMRAID,\n fn: function fn(url) {\n window.location = url;\n }\n }].filter(function (_ref3) {\n var enabled = _ref3.enabled;\n return enabled;\n });\n\n if (clickWaterfallDisabled) {\n openMethods = openMethods.slice(0, 1);\n }\n\n /**\n * Checks if we expect for the SKProductView will open. If so, then it's\n * likely for no visibility event to occur.\n * TODO(oscar/cwu): Replace url check with other `skproductview` indicating\n * boolean that should be populated from h2go.\n */\n var isOpenSKProductView = function isOpenSKProductView(openMethod, url) {\n var appleStoreUrlPrefix = new RegExp(\"^(https?://)?apps\\\\.apple\\\\.com\");\n return openMethod.type === CLICK_OPEN_METHODS.MRAID && appleStoreUrlPrefix.test(url);\n };\n\n var tryOpen = function tryOpen() {\n var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n // We don't emit any error if we're in the waterfall experiment\n // because this is guaranteed to happen if the user clicks more than\n // once (whereas in the original this will only happen if it thinks a\n // click failed).\n if (index > 0) {\n var methodType = openMethods[index - 1].type;\n _this5.emit(\"error\", new __WEBPACK_IMPORTED_MODULE_4__error_handling__[\"a\" /* Warning */](\"Failed to open \" + url + \" using \" + methodType));\n }\n if (index === openMethods.length - 1) {\n _this5.lastOpenedURL = null;\n }\n if (index >= openMethods.length && !(index === 1 && isOpenSKProductView(openMethods[0], url))) {\n _this5.emit(\"error\", new Error(\"Failed to open \" + url + \" by any methods. Tried \" + openMethods.length + \" method(s)\"));\n return;\n }\n\n var openMethod = openMethods[index];\n var finalClickURL = getFinalClickURL(openMethod.type);\n openMethod.fn(finalClickURL);\n _this5.emit(\"clickMethodTried\", {\n clickOpenMethod: openMethod.type,\n isAutoclick: isAutoclick\n });\n\n _this5.clickRetryTimeout = setTimeout(tryOpen.bind(_this5, index + 1), CLICK_RETRY_INTERVAL_MS);\n };\n\n tryOpen();\n }\n }, {\n key: \"close\",\n value: function close() {\n var _this6 = this;\n\n this.onReady(function () {\n __WEBPACK_IMPORTED_MODULE_3__logger__[\"a\" /* default */].recordMetricV2(\"close_count\", 1);\n\n if (!_this6.hasSupport(\"close\")) {\n _this6.emit(\"error\", new __WEBPACK_IMPORTED_MODULE_4__error_handling__[\"a\" /* Warning */](\"Attempted to call 'MRAID.close' when it is not supported.\"));\n return;\n }\n\n _this6.getMRAID().close();\n });\n }\n\n // NOTE(brian): The `useCustomClose` method is deprecated (read: ignored) in\n // MRAID 3.0.\n // NOTE(Casey): Unity's `useCustomClose` throws an error. Although we handle\n // this case by not trying custom custom close on Unity, this implementation\n // handles that scenario in case other exchanges are (unknowingly) similar.\n /**\n * Returns a `Promise` that resolves with `false` if custom close was not set\n * or to `true` if custom close was set successfully. The `Promise` rejects\n * if an error was thrown.\n */\n\n }, {\n key: \"useCustomClose\",\n value: function useCustomClose(use) {\n var _this7 = this;\n\n return new Promise(function (resolve, reject) {\n try {\n _this7.onReady(function () {\n if (!(_this7.hasSupport(\"useCustomClose\") && _this7.hasSupport(\"close\") && use)) {\n return resolve(false);\n }\n var mraid = _this7.getMRAID();\n mraid.useCustomClose(use);\n resolve(use);\n });\n } catch (e) {\n reject(e);\n }\n });\n }\n }, {\n key: \"getViewableDurationMS\",\n value: function getViewableDurationMS() {\n if (!this.viewable) return this.viewableDurationMS;\n if (this.lastViewableTS == null) {\n console.error(\"Internal LiftoffMRAID error: this.lastViewableTS should be set.\");\n return this.viewableDurationMS;\n }\n return this.viewableDurationMS + (Date.now() - this.lastViewableTS);\n }\n }, {\n key: \"lockOrientation\",\n value: function lockOrientation(orientation) {\n if (!this.ready || !this.viewable || !this.hasSupport(\"setOrientationProperties\")) {\n return;\n }\n\n this.orientationToLock = orientation;\n var mraid = this.getMRAID();\n this._mraidTry(function () {\n mraid.setOrientationProperties({\n allowOrientationChange: false,\n forceOrientation: orientation\n });\n }, { tag: \"setOrientationProperties\" });\n this.isOrientationLocked = true;\n }\n }, {\n key: \"getMRAID\",\n value: function getMRAID() {\n var windowMraid = window.mraid;\n if (windowMraid != null) {\n // NOTE(oscar): There are some sdks that will delete window.mraid after it\n // was initialized. In some cases at least, this is done to replace the\n // mraid object with a new one, but it's unclear why this is done in an\n // asynchronous way. In order not to race with the SDK's implementation of\n // MRAID, we will use the last mraid object loaded as a fallback.\n // Related test: https://docs.google.com/document/d/1TWLnTFlTGFc6ZJB_UXfR8QvmEa8x_d3k532fmX-13Fs\n // Related test 2: https://docs.google.com/document/d/1iChTG_zLZvQzI5Opw-6kpHqRCXRYklTPpbNB7TPBFdQ\n this.mraidIndex = this.mraids.indexOf(windowMraid);\n if (this.mraidIndex === -1) {\n this.mraidIndex = this.mraids.length;\n this.mraids.push(windowMraid);\n }\n }\n\n return this.mraids[this.mraidIndex];\n }\n }, {\n key: \"logMethodSupport\",\n value: function logMethodSupport(methodName, isSupported) {\n if (this.supported.methods[methodName] == null) {\n this.supported.methods[methodName] = {};\n }\n if (this.supported.methods[methodName][this.mraidIndex] == null) {\n this.supported.methods[methodName][this.mraidIndex] = [];\n }\n // NOTE(oscar): The MRAID spec allows for a method to go from no support to\n // support when the mraid's \"ready\" event triggers.\n this.supported.methods[methodName][this.mraidIndex].push({\n sinceInitMs: this.sinceInit(),\n ready: this.ready,\n support: isSupported,\n /** Logging is disabled here to prevent an infinite loop. */\n version: this.getMRAIDVersion({ log: false })\n });\n }\n\n /**\n * Checks to see if the MRAID implementation supports the given method.\n * More specifically, this checks to see if the method is a function on the\n * window.mraid object. It does not actually call the method to see if it\n * works and any caller should be prepared to handle errors.\n *\n * @param {string} prop - The name of the method to check.\n * @param {Object} options\n * @param {boolean} options.log - Whether to log the result of the check.\n */\n\n }, {\n key: \"hasSupport\",\n value: function hasSupport(prop) {\n var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n _ref4$log = _ref4.log,\n log = _ref4$log === undefined ? true : _ref4$log;\n\n var mraid = this.getMRAID();\n if (mraid == null) {\n return false;\n }\n\n if (prop === \"mraid\") {\n return true;\n }\n\n var support = Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"type\"])(mraid[prop]) === \"function\";\n\n if (log) {\n this.logMethodSupport(prop, support);\n }\n\n return support;\n }\n\n /** Returns the currently loaded MRAID version. */\n\n }, {\n key: \"getMRAIDVersion\",\n value: function getMRAIDVersion() {\n var _this8 = this;\n\n var _ref5 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n _ref5$log = _ref5.log,\n log = _ref5$log === undefined ? true : _ref5$log;\n\n return this._mraidTry(function () {\n return _this8.hasSupport(\"getVersion\", { log: log }) ? _this8.getMRAID().getVersion() : null;\n }, { tag: \"getVersion\", logError: log });\n }\n }, {\n key: \"isViewportShown\",\n value: function isViewportShown() {\n return window.innerHeight > 0 && window.innerWidth > 0;\n }\n }]);\n\n return LiftoffMRAID;\n}();\n\nif (window._LiftoffMRAID == null) {\n LiftoffMRAID.init();\n /**\n * NOTE(oscar): Global state is needed in order to only call .init() once and\n * to ensure that the same LiftoffMRAID is exported.\n */\n window._LiftoffMRAID = LiftoffMRAID;\n}\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (window._LiftoffMRAID);\n\n/***/ }),\n/* 13 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return AdexpMetricV2; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return AdexpJavaScriptError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return AdexpLog; });\n/* unused harmony export AdexpContext */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return AdexpMessage; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return getAdexpContextSnapshotFn; });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// Wrappers around adexp objects contained in adexpjson.go\n\nvar AdexpMetricV2 = function AdexpMetricV2(name, value) {\n _classCallCheck(this, AdexpMetricV2);\n\n this.name = name;\n this.value = value;\n};\n\nvar AdexpJavaScriptError = function AdexpJavaScriptError() {\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n message = _ref.message,\n _ref$severity = _ref.severity,\n severity = _ref$severity === undefined ? \"error\" : _ref$severity,\n sourceURL = _ref.sourceURL,\n line = _ref.line,\n column = _ref.column,\n stack = _ref.stack;\n\n _classCallCheck(this, AdexpJavaScriptError);\n\n this.error = {\n message: message,\n severity: severity,\n sourceURL: sourceURL,\n line: line,\n column: column,\n stack: stack\n };\n};\n\nvar AdexpLog = function AdexpLog(tag, message, data) {\n _classCallCheck(this, AdexpLog);\n\n this.tag = tag;\n this.message = message;\n Object.assign(this, data);\n};\n\nvar AdexpContext = function AdexpContext() {\n var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n viewportWidth = _ref2.viewportWidth,\n viewportHeight = _ref2.viewportHeight,\n adLanguage = _ref2.adLanguage,\n mraid = _ref2.mraid;\n\n _classCallCheck(this, AdexpContext);\n\n this.ad_language = adLanguage;\n this.mraid = mraid;\n this.viewport_height = viewportHeight;\n this.viewport_width = viewportWidth;\n};\n\nvar AdexpMessage = function AdexpMessage() {\n var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n context = _ref3.context,\n metric = _ref3.metric,\n log = _ref3.log;\n\n _classCallCheck(this, AdexpMessage);\n\n Object.assign(this, context);\n // NOTE(Austin): metrics_v2 must be an array. For now\n // we don't log more than one metric at a time though.\n this.metrics_v2 = metric != null ? [metric] : undefined;\n this.log = log;\n};\n\n// TODO(Austin): Consolidate ClickMetric here.\n\n/**\n * Returns a function that takes a snapshot of the current environment\n * and returns a `AdexpContext`.\n */\nvar getAdexpContextSnapshotFn = function getAdexpContextSnapshotFn(viewportEl, hasMraidFn) {\n return function () {\n var _ref4 = viewportEl != null ? viewportEl.getBoundingClientRect() : {},\n width = _ref4.width,\n height = _ref4.height;\n\n return new AdexpContext({\n viewportWidth: width != null ? Math.round(width) : undefined,\n viewportHeight: height != null ? Math.round(height) : undefined,\n adLanguage: navigator.language,\n mraid: hasMraidFn()\n });\n };\n};\n\n/***/ }),\n/* 14 */,\n/* 15 */,\n/* 16 */,\n/* 17 */,\n/* 18 */,\n/* 19 */,\n/* 20 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar patchedObjects = [];\n\nvar MonkeyPatch = function () {\n function MonkeyPatch() {\n _classCallCheck(this, MonkeyPatch);\n }\n\n _createClass(MonkeyPatch, null, [{\n key: \"_applyPatch\",\n\n // #if process.env.NODE_ENV === \"test\"\n // static resetAll() {\n // patchedObjects.forEach(({ obj, propertyName, dataKey, value }) => {\n // MonkeyPatch._applyPatch(obj, propertyName, { [dataKey]: value });\n // });\n // \n // // Clear the array.\n // patchedObjects.splice(0, patchedObjects.length);\n // }\n // #endif\n\n value: function _applyPatch(obj, propertyName, protoMap) {\n if (obj.propertyName !== undefined) {\n delete obj[propertyName];\n }\n\n try {\n // See\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#Description\n Object.defineProperty(obj, propertyName, protoMap);\n } catch (e) {\n // TODO(Austin): Delete added patchedObject entry?\n throw new Error(\"Cannot monkey patch \" + obj.constructor.name + \"[\" + propertyName + \"], because: '\" + e + \"'.\");\n }\n }\n }, {\n key: \"_patch\",\n value: function _patch(obj, propertyName, dataKey, value) {\n var originalValue = Object.getOwnPropertyDescriptor(obj, propertyName)[dataKey];\n\n patchedObjects.push({\n obj: obj,\n propertyName: propertyName,\n dataKey: dataKey,\n value: originalValue\n });\n\n MonkeyPatch._applyPatch(obj, propertyName, _defineProperty({}, dataKey, value));\n }\n }, {\n key: \"patchFunction\",\n value: function patchFunction(obj, propertyName, fn) {\n // \"value\" is the property value. See doc in _applyPatch.\n MonkeyPatch._patch(obj, propertyName, \"value\", fn);\n }\n }, {\n key: \"patchSetter\",\n value: function patchSetter(obj, propertyName, fn) {\n // \"set\" is the property setter. See doc in _applyPatch.\n MonkeyPatch._patch(obj, propertyName, \"set\", fn);\n }\n }, {\n key: \"patchGetter\",\n value: function patchGetter(obj, propertyName, fn) {\n // \"get\" is the property getter. See doc in _applyPatch.\n MonkeyPatch._patch(obj, propertyName, \"get\", fn);\n }\n }]);\n\n return MonkeyPatch;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (MonkeyPatch);\n\n/***/ }),\n/* 21 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return pointInCTA; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return clickAreaTypeFromEvent; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return isDeadzoneCoord; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__constants__ = __webpack_require__(2);\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n/**\n * Contains logic to determine whether cta was clicked. This is not the optimal\n * way to do it - a better way would be to include CTA location as part of the\n * creative's concept rendering configuration and to set it explicitly.\n */\n\n\n\nvar pointInEl = function pointInEl(el, x, y) {\n var _el$getBoundingClient = el.getBoundingClientRect(),\n elTop = _el$getBoundingClient.top,\n elRight = _el$getBoundingClient.right,\n elBottom = _el$getBoundingClient.bottom,\n elLeft = _el$getBoundingClient.left;\n\n return x >= elLeft && x <= elRight && y >= elTop && y <= elBottom;\n};\n\n/**\n * Returns true iff (x, y) is within the bounds of a CTA. We\n * consider an element to be a \"CTA element\" if it's part of the generic-cta or\n * custom-cta components or is in a container that has 'cta' in the id. This can\n * give both false positives (e.g. if a non-CTA image is placed in a CTA\n * container) and false negatives (e.g. if a CTA is embedded in a larger image\n * in one of the \"fill\" templates), but it's probably close to the best we can\n * do without manual tagging. We include all descendants of cta\n * containers/components, because sometimes their children overflow.\n */\nvar pointInCTA = function pointInCTA(x, y) {\n return [].concat(_toConsumableArray(document.querySelectorAll([\".generic-cta\", \".generic-cta *\", \".custom-cta\", \".custom-cta *\", \".cta-container\", \".cta-container *\", \".liftoff-cta\", \".liftoff-cta *\", \".product-view-cta .light\", \".last-chance-endscreen-container\"].join(\", \")))).some(function (ctaEl) {\n return pointInEl(ctaEl, x, y);\n });\n};\n\n/**\n * Returns true iff e is a MouseEvent that occurred over a CTA.\n */\nvar clickAreaTypeFromEvent = function clickAreaTypeFromEvent(e) {\n return pointInCTA(e.clientX, e.clientY) ? __WEBPACK_IMPORTED_MODULE_0__constants__[\"l\" /* CLICK_AREA_TYPE_CTA */] : __WEBPACK_IMPORTED_MODULE_0__constants__[\"m\" /* CLICK_AREA_TYPE_OTHER */];\n};\n\nvar isDeadzoneCoord = function isDeadzoneCoord(_ref) {\n var x = _ref.x,\n y = _ref.y;\n\n if (!Number.isFinite(x) || !Number.isFinite(y)) {\n console.warn(\"Unexpected coords\", { x: x, y: y });\n return;\n }\n return [].concat(_toConsumableArray(document.body.querySelectorAll(\".liftoff-deadzone\"))).some(function (el) {\n return pointInEl(el, x, y);\n });\n};\n\n/***/ }),\n/* 22 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return MESSAGE_CREATIVE_MADE_SOUND; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"l\", function() { return MESSAGE_TOGGLE_MUTED; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return MESSAGE_INTERACTION_CHANGE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return MESSAGE_CLICKTHROUGH; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return MESSAGE_MRAID_EVENT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return MESSAGE_MRAID_CALL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"n\", function() { return MESSAGE_UPDATED_MRAID_PROPERTIES; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return MESSAGE_INNER_ENV_INIT_COMPLETE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"i\", function() { return MESSAGE_OUTER_ENV_INIT_COMPLETE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"j\", function() { return MESSAGE_REQUEST_DOM_SNAPSHOT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return MESSAGE_DOM_SNAPSHOT; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return MESSAGE_INNER_ENV_ERROR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"k\", function() { return MESSAGE_RESIZE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"o\", function() { return MESSAGE_VUNGLE_CLICKTHROUGH; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"m\", function() { return MESSAGE_TRESENSA_INTERACTION; });\nvar MESSAGE_CREATIVE_MADE_SOUND = \"CREATIVE_MADE_SOUND\";\nvar MESSAGE_TOGGLE_MUTED = \"TOGGLE_MUTED\";\nvar MESSAGE_INTERACTION_CHANGE = \"INTERACTION_CHANGE\";\nvar MESSAGE_CLICKTHROUGH = \"CLICKTHROUGH\";\nvar MESSAGE_MRAID_EVENT = \"MRAID_EVENT\";\nvar MESSAGE_MRAID_CALL = \"MRAID_CALL\";\nvar MESSAGE_UPDATED_MRAID_PROPERTIES = \"UPDATED_MRAID_PROPERTIES\";\nvar MESSAGE_INNER_ENV_INIT_COMPLETE = \"INNER_ENV_INIT_COMPLETE\";\nvar MESSAGE_OUTER_ENV_INIT_COMPLETE = \"OUTER_ENV_INIT_COMPLETE\";\nvar MESSAGE_REQUEST_DOM_SNAPSHOT = \"REQUEST_DOM_SNAPSHOT\";\nvar MESSAGE_DOM_SNAPSHOT = \"DOM_SNAPSHOT\";\nvar MESSAGE_INNER_ENV_ERROR = \"INNER_ENV_ERROR\";\nvar MESSAGE_RESIZE = \"RESIZE\";\n\n// External Messages from Vungle.\nvar MESSAGE_VUNGLE_CLICKTHROUGH = \"download\";\n\n// External Messages from Tresensa creatives.\nvar MESSAGE_TRESENSA_INTERACTION = \"tre_interaction\";\n\n/***/ }),\n/* 23 */,\n/* 24 */,\n/* 25 */,\n/* 26 */,\n/* 27 */,\n/* 28 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__ = __webpack_require__(1);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\nvar AudioToggleIcon = function () {\n function AudioToggleIcon() {\n _classCallCheck(this, AudioToggleIcon);\n\n this.el = Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__[\"strToElement\"])(\"\\n <div class=\\\"audio-toggle-icon\\\"\\n style=\\\"margin:10px;border-radius:25px;background-color:black;line-height:10px\\\">\\n <svg fill=\\\"#FFFFFF\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\"\\n width=\\\"30\\\" height=\\\"30\\\" viewBox=\\\"0 0 16 16\\\"\\n >\\n <g class=\\\"audio-toggle-unmute\\\" transform=\\\"translate(8 8) scale(0.69 0.69) translate(-8 -8)\\\">\\n <polygon points=\\\"\\n 14.293,14.293 1.707,1.707 1,2.414 4.586,6 4,6 4,10 7,10 11,14 11,12.414 13.586,15\\n \\\"></polygon>\\n <polygon points=\\\"11,2 7.207,5.793 11,9.586\\\"></polygon>\\n </g>\\n <g class=\\\"audio-toggle-mute\\\" transform=\\\"translate(8 8) scale(0.69 0.69) translate(-8 -8)\\\">\\n <polygon points=\\\"7,6 4,6 4,10 7,10 11,14 11,2\\\"></polygon>\\n </g>\\n </svg>\\n </div>\\n \");\n\n this.setMuted(true);\n }\n\n _createClass(AudioToggleIcon, [{\n key: \"getElement\",\n value: function getElement() {\n return this.el;\n }\n }, {\n key: \"setMuted\",\n value: function setMuted(muted) {\n this.el.querySelector(\".audio-toggle-unmute\").style.display = muted ? \"\" : \"none\";\n this.el.querySelector(\".audio-toggle-mute\").style.display = muted ? \"none\" : \"\";\n }\n }]);\n\n return AudioToggleIcon;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (AudioToggleIcon);\n\n/***/ }),\n/* 29 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__monkey_patch__ = __webpack_require__(20);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n/**\n * Returns true iff `el` is a media (audio or video) element;\n */\nvar isMediaElement = function isMediaElement(el) {\n return el.tagName === \"VIDEO\" || el.tagName === \"AUDIO\";\n};\n\n/**\n * Assuming `el` is a playing video, returns `true` iff it has audio data.\n */\nvar doesVideoHaveAudio = function doesVideoHaveAudio(el) {\n return el.audioTracks != null && el.audioTracks.length > 0 || el.webkitAudioDecodedByteCount != null && el.webkitAudioDecodedByteCount > 0;\n};\n\n// Minimum bin size of a web audio analyzer node frequency spectrum. See:\n// https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/fftSize#Value.\nvar MIN_FFT_SIZE = 32;\n\n/**\n * Global controller for web audio. This works by monkey-patching the\n * `AudioContext` constructor and redefining `AudioContext.destination`\n * (normally an `AudioDestinationNode` that routes sound to the speakers)\n * to a node that allows the global controller to intercept and control all\n * output. This is used by `GlobalAudioController`--it's not intended to be\n * used directly. `cb` is a function that will be called the first time any\n * `AudioContext` produces a sound.\n */\n\nvar GlobalWebAudioController = function () {\n function GlobalWebAudioController() {\n _classCallCheck(this, GlobalWebAudioController);\n }\n\n _createClass(GlobalWebAudioController, null, [{\n key: \"reset\",\n\n // if process.env.NODE_ENV === \"test\"\n /**\n * Resets all state back to it's uninitialized state.\n * Used for testing purposes.\n */\n value: function reset() {\n GlobalWebAudioController._firstSoundMade = false;\n GlobalWebAudioController._muted = null;\n }\n // #endif\n\n }, {\n key: \"init\",\n value: function init(cb) {\n GlobalWebAudioController._muted = null;\n GlobalWebAudioController._cb = cb;\n GlobalWebAudioController._firstSoundMade = false;\n GlobalWebAudioController._gainNodes = [];\n\n try {\n var originalAudioContext = window.AudioContext || window.webkitAudioContext;\n\n /**\n * An alternative to monkey-patching the `AudioContext` constructor would\n * be to monkey-patch the `AudioContext.prototype.destination` getter,\n * but this doesn't work on old (pre-getter) browsers.\n */\n window.AudioContext = window.webkitAudioContext = function AudioContext() {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var audioCtx = new (Function.prototype.bind.apply(originalAudioContext, [null].concat(args)))();\n var gainNode = audioCtx.createGain();\n var analyserNode = audioCtx.createAnalyser();\n // We just want to know if the `AudioContext` is producing _any_ sound\n // and don't care about the frequency spectrum per se. We therefore used\n // the smallest allowed FFT size.\n analyserNode.fftSize = MIN_FFT_SIZE;\n var freqData = new Uint8Array(analyserNode.frequencyBinCount);\n var soundPollInterval = setInterval(function () {\n analyserNode.getByteFrequencyData(freqData);\n var i = 0;\n for (; i < freqData.length; i++) {\n if (freqData[i] !== 0) break;\n }\n if (i === freqData.length) return;\n clearInterval(soundPollInterval);\n GlobalWebAudioController._handleFirstSound();\n }, 10);\n /**\n * The resulting node structure is:\n * input -> analyser -> gain -> destination\n * We use the analyser node to detect when the AudioContext is producing\n * sound and the gain node to globally control output.\n */\n var originalDestination = audioCtx.destination;\n analyserNode.connect(gainNode);\n gainNode.connect(originalDestination);\n gainNode.gain.value = GlobalWebAudioController._muted ? 0 : 1;\n GlobalWebAudioController._gainNodes.push(gainNode);\n\n Object.defineProperty(audioCtx, \"destination\", {\n value: analyserNode,\n // Ensure that our destination node is the only destination node.\n writable: false,\n configurable: false\n });\n\n return audioCtx;\n };\n } catch (_) {\n console.error(\"Unable to monkey-patch AudioContext\");\n }\n }\n }, {\n key: \"_handleFirstSound\",\n value: function _handleFirstSound() {\n if (GlobalWebAudioController._firstSoundMade) return;\n GlobalWebAudioController._cb();\n GlobalWebAudioController._firstSoundMade = true;\n }\n\n /**\n * Mutes all `AudioContext`s when `shouldMute === true` and restores all\n * `AudioContext`s to the state set by the user when `shouldMute === false`.\n */\n\n }, {\n key: \"setMuted\",\n value: function setMuted(shouldMute) {\n if (GlobalWebAudioController._muted === shouldMute) {\n return;\n }\n GlobalWebAudioController._muted = shouldMute;\n GlobalWebAudioController._gainNodes.forEach(function (gainNode) {\n gainNode.gain.value = shouldMute ? 0 : 1;\n });\n }\n }]);\n\n return GlobalWebAudioController;\n}();\n\n/**\n * Utility for tracking media elements. Media elements can come into existence\n * in several different ways, which requies multiple different tricks for\n * becoming aware of their existence:\n * 1) They may exist in the DOM on page load (i.e. be embedded directly in\n * the HTML document) - these can be detected by querying the dom for video\n * and audio elements\n * 2) They can be produced from an HTML string (e.g. `someEl.innerHTML =\n * \"<audio ... />\"`) and appended to the DOM. They must fire a \"loadstart\"\n * event after being appended to the DOM, or the `load` or `play` methods\n * may be called directly on the element. These can be detected by\n * listening for \"loadstart\" events and by monkey-patching the `load` and\n * `play` methods. This is true regardless of whether or not autoplay is\n * true.\n * 3) `document.createElement` - these are detected by monkey-patching\n * `Document.prototype.createElement`. These won't be caught by the\n * approaches in 2 if the \"autoplay\" attribute is set to `true` (since they\n * can make sound without ever being explicitly loaded, played, or append\n * to the DOM).\n * 4) The `Audio` constructor - these are detected by monkey-patching the\n * `Audio` constructor.\n */\n\n\nvar MediaElementWatcher = function () {\n function MediaElementWatcher() {\n _classCallCheck(this, MediaElementWatcher);\n\n throw new Error(\"Cannot construct instances of MediaElementWatcher.\");\n }\n\n /**\n * Initializes the class, and immediately calls function `cb` once for each\n * media element that already exists. Subsequently calls `cb` whenever a new\n * media element is created. This should only be called once.\n */\n\n\n _createClass(MediaElementWatcher, null, [{\n key: \"init\",\n value: function init(cb) {\n MediaElementWatcher._cb = cb;\n MediaElementWatcher._seenElements = new WeakSet();\n\n var originalCreateElement = Document.prototype.createElement;\n __WEBPACK_IMPORTED_MODULE_0__monkey_patch__[\"a\" /* default */].patchFunction(Document.prototype, \"createElement\", function () {\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n var el = originalCreateElement.apply(this, args);\n MediaElementWatcher._handleNewElement(el);\n return el;\n });\n\n var originalAudio = window.Audio;\n window.Audio = function Audio() {\n for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n\n var a = new (Function.prototype.bind.apply(originalAudio, [null].concat(args)))();\n MediaElementWatcher._handleNewElement(a);\n return a;\n };\n window.Audio.prototype = originalAudio.prototype;\n\n [\"play\", \"load\"].forEach(function (methodName) {\n var originalMethod = HTMLMediaElement.prototype[methodName];\n __WEBPACK_IMPORTED_MODULE_0__monkey_patch__[\"a\" /* default */].patchFunction(HTMLMediaElement.prototype, methodName, function () {\n MediaElementWatcher._handleNewElement(this);\n\n for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n\n return originalMethod.apply(this, args);\n });\n });\n\n window.addEventListener(\"loadstart\", function (e) {\n MediaElementWatcher._handleNewElement(e.target);\n }, true);\n\n document.querySelectorAll(\"video, audio\").forEach(function (el) {\n MediaElementWatcher._cb(el);\n });\n }\n }, {\n key: \"_handleNewElement\",\n value: function _handleNewElement(el) {\n if (!isMediaElement(el) || MediaElementWatcher._seenElements.has(el)) {\n return;\n }\n MediaElementWatcher._seenElements.add(el);\n MediaElementWatcher._cb(el);\n }\n }]);\n\n return MediaElementWatcher;\n}();\n\n/**\n * Global controller for media (audio and video) elements. Used by\n * `GlobalAudioController` and not intended to be used directly. `cb` is a\n * function that will be called the first time any media element can\n * produce a sound (were global control not applied).\n */\n\n\nvar GlobalMediaElementAudioController = function () {\n // #if process.env.NODE_ENV === \"test\"\n // /**\n // * Resets all state back to it's uninitialized state.\n // * Used for testing purposes.\n // */\n // static reset() {\n // GlobalMediaElementAudioController._firstSoundMade = false;\n // GlobalMediaElementAudioController._globallyMuted = null;\n // }\n // #endif\n\n function GlobalMediaElementAudioController() {\n _classCallCheck(this, GlobalMediaElementAudioController);\n\n throw new Error(\"Cannot construct instances of GlobalMediaElementAudioController.\");\n }\n\n _createClass(GlobalMediaElementAudioController, null, [{\n key: \"init\",\n value: function init(cb) {\n GlobalMediaElementAudioController._globallyMuted = null;\n /**\n * We keep track of the values for el.muted set by the user for each media\n * el. When we globally unmute, we restore the set state (so calling\n * `GlobalMediaElementAudioController.unmute()` does not unmute\n * elements that the user has set to be muted).\n */\n GlobalMediaElementAudioController._elToSetState = new WeakMap();\n GlobalMediaElementAudioController._allMediaEls = [];\n GlobalMediaElementAudioController._firstSoundMade = false;\n GlobalMediaElementAudioController._cb = cb;\n\n try {\n GlobalMediaElementAudioController._originalMutedSetter = Object.getOwnPropertyDescriptor(HTMLMediaElement.prototype, \"muted\").set;\n var originalMutedGetter = Object.getOwnPropertyDescriptor(HTMLMediaElement.prototype, \"muted\").get;\n\n __WEBPACK_IMPORTED_MODULE_0__monkey_patch__[\"a\" /* default */].patchSetter(HTMLMediaElement.prototype, \"muted\", function (val) {\n GlobalMediaElementAudioController._elToSetState.set(this, val);\n if (GlobalMediaElementAudioController._canMakeSound(this)) {\n GlobalMediaElementAudioController._handleFirstSound();\n }\n\n var systemMutedState = originalMutedGetter.call(this);\n if (GlobalMediaElementAudioController._globallyMuted && (systemMutedState || !val)) {\n return;\n }\n GlobalMediaElementAudioController._originalMutedSetter.call(this, val);\n });\n\n // Patch the \"muted\" getter so that it returns the value set by the user,\n // rather than the underlying \"system\" value.\n __WEBPACK_IMPORTED_MODULE_0__monkey_patch__[\"a\" /* default */].patchGetter(HTMLMediaElement.prototype, \"muted\", function () {\n var recordedSetState = GlobalMediaElementAudioController._elToSetState.get(this);\n return recordedSetState == null ? originalMutedGetter.call(this) : recordedSetState;\n });\n // #if process.env.NODE_ENV === \"test\"\n // // Expose the underlying system muted setting to tests.\n // Object.defineProperty(HTMLMediaElement.prototype, \"systemMutedState\", {\n // get: originalMutedGetter,\n // });\n // #endif\n } catch (_) {\n /**\n * Monkey-patching will fail on old (pre-setter) browsers. In this case,\n * we have no way of keeping track of the set state.\n * (Listening for \"volumechange\" events doesn't work, because if we force\n * the state to `true` due to globally muting, then the event will not\n * fire if the user subsequently sets the `muted` to `true`.) In this\n * case, we just keep the page globally muted.\n */\n GlobalMediaElementAudioController._originalMutedSetter = function (mute) {\n this.muted = mute;\n };\n console.error(\"Unable to monkey-patch HTMLMediaElement.muted\");\n }\n\n MediaElementWatcher.init(function (el) {\n if (!GlobalMediaElementAudioController._allMediaEls.includes(el)) {\n GlobalMediaElementAudioController._allMediaEls.push(el);\n }\n GlobalMediaElementAudioController._watchForSound(el);\n GlobalMediaElementAudioController._toggleElementMuted(el, GlobalMediaElementAudioController._globallyMuted);\n });\n }\n\n /**\n * Returns `true` iff `el` would be able to make a sound were it not being\n * controlled by this global controller. We consider an element able to make\n * a sound if it is either an audio element or is a video with audio tracks.\n * Assumes that `el` is in the playing state (whether or not a video has\n * audio cannot be determined for all browsers for media that are not\n * playing).\n */\n\n }, {\n key: \"_canMakeSound\",\n value: function _canMakeSound(el) {\n var isMuted = GlobalMediaElementAudioController._elToSetState.get(el);\n return !isMuted && (el.tagName === \"AUDIO\" || doesVideoHaveAudio(el));\n }\n }, {\n key: \"_watchForSound\",\n value: function _watchForSound(el) {\n if (!el.paused && GlobalMediaElementAudioController._canMakeSound(el)) {\n GlobalMediaElementAudioController._handleFirstSound();\n return;\n }\n\n el.addEventListener(\"playing\", function () {\n if (!GlobalMediaElementAudioController._canMakeSound(el)) return;\n GlobalMediaElementAudioController._handleFirstSound();\n });\n }\n\n /**\n * Forces `el.muted` to `muted` (a boolean). Assumes that if `muted === true`,\n * the value of `el.muted` is the state set by the user.\n * (i.e. This is not idempotent.)\n */\n\n }, {\n key: \"_toggleElementMuted\",\n value: function _toggleElementMuted(el, muted) {\n if (muted) {\n GlobalMediaElementAudioController._elToSetState.set(el, el.muted);\n GlobalMediaElementAudioController._originalMutedSetter.call(el, true);\n return;\n }\n\n GlobalMediaElementAudioController._originalMutedSetter.call(el, GlobalMediaElementAudioController._elToSetState.get(el));\n }\n }, {\n key: \"_toggleMediaMuted\",\n value: function _toggleMediaMuted(muted) {\n GlobalMediaElementAudioController._allMediaEls.forEach(function (el) {\n GlobalMediaElementAudioController._toggleElementMuted(el, muted);\n });\n }\n }, {\n key: \"_handleFirstSound\",\n value: function _handleFirstSound() {\n if (GlobalMediaElementAudioController._firstSoundMade) return;\n GlobalMediaElementAudioController._cb();\n GlobalMediaElementAudioController._firstSoundMade = true;\n }\n\n /**\n * Mutes all HTML media elements when `shouldMute === true` and restores the\n * set state of all HTML media elements when `shouldMute === false`.\n */\n\n }, {\n key: \"setMuted\",\n value: function setMuted(shouldMute) {\n if (GlobalMediaElementAudioController._globallyMuted === shouldMute) {\n return;\n }\n GlobalMediaElementAudioController._toggleMediaMuted(shouldMute);\n GlobalMediaElementAudioController._globallyMuted = shouldMute;\n }\n }]);\n\n return GlobalMediaElementAudioController;\n}();\n\n/**\n * Global controller for all possible sources of audio in a web page, except\n * for `iframe`s. The public interface consists of only two methods:\n * - `GlobalAudioController.setMuted` - takes a boolean indicating whether\n * audio from all sound sources (HTML media elements and web audio) should\n * be muted (true) or not (false);\n * - `GlobalAudioController.onFirstSound` - receives one argument, a function\n * that will be called immediately if the page is already making sound or\n * otherwise will be called once when the page first makes a sound\n * (possibly never).\n */\n\n\nvar GlobalAudioController = function () {\n // #if process.env.NODE_ENV === \"test\"\n // /**\n // * Just to facilitate testing of `onFirstSound` by allowing the registered\n // * callback to be run multiple times when new sources of sound are added to\n // * the testing environment page.\n // */\n // static reset() {\n // GlobalAudioController._firstSoundMade = false;\n // GlobalAudioController._onFirstSoundCallbacks = [];\n // \n // GlobalMediaElementAudioController.reset();\n // GlobalWebAudioController.reset();\n // }\n // #endif\n\n function GlobalAudioController() {\n _classCallCheck(this, GlobalAudioController);\n\n throw new Error(\"Cannot construct instances of GlobalAudioController.\");\n }\n\n /**\n * This class is invasive insofar as implements a series of monkey patches on\n * browser API objects. We thus only initialize it when it's actually used.\n */\n\n\n _createClass(GlobalAudioController, null, [{\n key: \"_init\",\n value: function _init() {\n if (GlobalAudioController._initialized) {\n return;\n }\n GlobalAudioController._initialized = true;\n GlobalAudioController._firstSoundMade = false;\n GlobalAudioController._onFirstSoundCallbacks = [];\n\n var handleFirstSound = function handleFirstSound() {\n if (GlobalAudioController._firstSoundMade) {\n return;\n }\n GlobalAudioController._firstSoundMade = true;\n GlobalAudioController._onFirstSoundCallbacks.forEach(function (cb) {\n return cb();\n });\n };\n GlobalMediaElementAudioController.init(handleFirstSound);\n GlobalWebAudioController.init(handleFirstSound);\n }\n }, {\n key: \"setMuted\",\n value: function setMuted(shouldMute) {\n GlobalAudioController._init();\n GlobalMediaElementAudioController.setMuted(shouldMute);\n GlobalWebAudioController.setMuted(shouldMute);\n }\n }, {\n key: \"runAfterFirstSound\",\n value: function runAfterFirstSound(cb) {\n GlobalAudioController._init();\n if (GlobalAudioController._firstSoundMade) {\n cb();\n return;\n }\n\n GlobalAudioController._onFirstSoundCallbacks.push(cb);\n }\n }]);\n\n return GlobalAudioController;\n}();\n\nGlobalAudioController._initialized = false;\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (GlobalAudioController);\n\n/***/ }),\n/* 30 */,\n/* 31 */,\n/* 32 */,\n/* 33 */,\n/* 34 */,\n/* 35 */,\n/* 36 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return applyLiftoffPolicy; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return postHTMLReturn; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return getDOMSnapshot; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return configureHTMLReturn; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__lib_audio_toggle_icon__ = __webpack_require__(28);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__lib_global_audio_controller__ = __webpack_require__(29);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__madlib_liftoff_mraid__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__constants__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__frontendlib_utils__ = __webpack_require__(0);\n\n\n\n\n\n\nvar CLOSE_Z = 99;\nvar WATERMARKS_Z = 98;\n\n/**\n * Returns a close element with a countdown timer that starts at `delay` seconds.\n */\nvar createCloseEl = function createCloseEl(delay) {\n var closeEl = document.createElement(\"div\");\n closeEl.id = \"liftoff-close\";\n Object.assign(closeEl.style, {\n display: \"block\",\n position: \"absolute\",\n top: \"10px\",\n right: \"10px\",\n width: \"32px\",\n height: \"32px\",\n zIndex: CLOSE_Z\n });\n var buttonStyles = {\n width: \"100%\",\n height: \"100%\",\n display: \"block\",\n position: \"absolute\",\n top: \"0\",\n left: \"0\",\n fontSize: \"16px\",\n lineHeight: \"28px\",\n textAlign: \"center\",\n border: \"2px solid #FFF\",\n borderRadius: \"50%\",\n boxSizing: \"border-box\",\n pointerEvents: \"all\"\n };\n var closeTargetEl = document.createElement(\"div\");\n closeTargetEl.classList.add(\"liftoff-close-target\");\n Object.assign(closeTargetEl.style, buttonStyles, {\n color: \"#EEE\",\n backgroundColor: \"#000\"\n });\n // This is a nice close X.\n closeTargetEl.innerHTML = \"✕\";\n closeTargetEl.addEventListener(\"click\", function (e) {\n __WEBPACK_IMPORTED_MODULE_2__madlib_liftoff_mraid__[\"a\" /* default */].close();\n e.stopPropagation();\n });\n closeEl.appendChild(closeTargetEl);\n if (delay > 0) {\n var closeDelayEl = document.createElement(\"div\");\n closeDelayEl.classList.add(\"liftoff-close-delay\");\n Object.assign(closeDelayEl.style, buttonStyles, {\n color: \"#555\",\n backgroundColor: \"#BBB\"\n });\n var countdown = delay;\n closeDelayEl.textContent = countdown;\n closeDelayEl.style.display = \"block\";\n var closeDelayInterval = setInterval(function () {\n countdown -= 1;\n if (countdown > 0) {\n closeDelayEl.textContent = countdown;\n return;\n }\n closeDelayEl.style.display = \"none\";\n clearInterval(closeDelayInterval);\n }, 1000);\n closeEl.appendChild(closeDelayEl);\n }\n return closeEl;\n};\n\n/**\n * Calls `callback` on the user's first interaction.\n */\nvar onFirstInteraction = function onFirstInteraction(callback) {\n var hasUserInteracted = false;\n var handleFirstInteraction = function handleFirstInteraction(e) {\n window.removeEventListener(\"mousedown\", handleFirstInteraction, true);\n window.removeEventListener(\"touchstart\", handleFirstInteraction, true);\n if (hasUserInteracted) return;\n hasUserInteracted = true;\n callback(e);\n };\n window.addEventListener(\"mousedown\", handleFirstInteraction, true);\n window.addEventListener(\"touchstart\", handleFirstInteraction, true);\n};\n\n/**\n * Creates an icon in the lower-right corner that allows the user to globally toggle the creative's audio on\n * and off. The toggle only appears on creatives that have autoplay audio (i.e. audio that plays prior to user\n * interaction). For creatives that have autoplay audio, the creative is globally muted by default but will\n * become globally unmuted when the user interacts with the creative.\n */\nvar createGlobalAudioToggle = function createGlobalAudioToggle() {\n var el = document.createElement(\"div\");\n el.classList.add(\"liftoff-global-audio-toggle\");\n Object.assign(el.style, {\n opacity: \"0.5\",\n display: \"none\",\n pointerEvents: \"all\",\n right: \"0\",\n bottom: \"0\",\n position: \"absolute\"\n });\n var icon = new __WEBPACK_IMPORTED_MODULE_0__lib_audio_toggle_icon__[\"a\" /* default */]();\n var iconEl = icon.getElement();\n el.appendChild(iconEl);\n\n var isCurrentlyMuted = false;\n var setMuted = function setMuted(shouldMute) {\n if (shouldMute === isCurrentlyMuted) return;\n isCurrentlyMuted = shouldMute;\n __WEBPACK_IMPORTED_MODULE_1__lib_global_audio_controller__[\"a\" /* default */].setMuted(shouldMute);\n icon.setMuted(shouldMute);\n };\n\n var hasUserInteracted = false;\n onFirstInteraction(function (e) {\n hasUserInteracted = true;\n // Interactions with the global audio toggle icon are handled by the click listener below.\n if (el.contains(e.target)) return;\n setMuted(false);\n });\n\n iconEl.addEventListener(\"click\", function () {\n setMuted(!isCurrentlyMuted);\n });\n\n __WEBPACK_IMPORTED_MODULE_1__lib_global_audio_controller__[\"a\" /* default */].runAfterFirstSound(function () {\n if (hasUserInteracted) return;\n el.style.display = \"inline-block\";\n });\n\n setMuted(true);\n return el;\n};\n\nvar globallyMuteAllAudio = function globallyMuteAllAudio() {\n __WEBPACK_IMPORTED_MODULE_1__lib_global_audio_controller__[\"a\" /* default */].setMuted(true);\n};\n\n/**\n * Performs various operations required to conform to exchange- and/or country-specific creative policies.\n * This is used by both madlib HTML and CSP (third-party) creatives.\n * Requires:\n * - creativePolicy - An object with keys:\n * addBorder (boolean)\n * showAdChoices (boolean)\n * showChineseWatermark (boolean)\n * russianAgeRating (number)\n * - bidContext - An object with keys: { creativeID, platform, exchange, sourceAppName, sourceAppID }\n */\nvar applyLiftoffPolicy = function applyLiftoffPolicy(snippetEl, _ref, _ref2) {\n var addBorder = _ref.addBorder,\n showAdChoices = _ref.showAdChoices,\n russianAgeRating = _ref.russianAgeRating,\n showChineseWatermark = _ref.showChineseWatermark,\n useCustomClose = _ref.useCustomClose,\n closeDelay = _ref.closeDelay,\n audioPolicy = _ref.audioPolicy;\n var creativeID = _ref2.creativeID,\n platform = _ref2.platform,\n exchange = _ref2.exchange,\n sourceAppName = _ref2.sourceAppName,\n sourceAppID = _ref2.sourceAppID,\n cdnURL = _ref2.cdnURL;\n\n var watermarksEl = document.createElement(\"div\");\n watermarksEl.classList.add(\"liftoff-watermarks\");\n Object.assign(watermarksEl.style, {\n position: \"absolute\",\n bottom: \"0\",\n left: \"0\",\n zIndex: \"\" + WATERMARKS_Z,\n height: \"18px\",\n pointerEvents: \"none\"\n });\n\n /**\n * Creates an element to apply a border around the whole creative (required for banners on certain\n * exchanges). We do this rather than adding a border directly to `#liftoff-snippet`, because the latter\n * changes the size of the snippet content by 2 * border-width, resulting in slightly inconsistent\n * rendering depending on whether the border is there or not.\n */\n if (addBorder) {\n var el = document.createElement(\"div\");\n el.id = \"liftoff-border\";\n Object.assign(el.style, {\n width: \"100%\",\n height: \"100%\",\n position: \"absolute\",\n border: \"1px solid #AAA\",\n boxSizing: \"border-box\",\n zIndex: \"10\",\n pointerEvents: \"none\"\n });\n document.body.appendChild(el);\n }\n\n if (showAdChoices) {\n // NOTE(Austin): We append these parameters for Google Analytics and more\n // granular cloudfront logs.\n var queryParams = {\n creative_id: creativeID,\n platform: platform,\n exchange: exchange,\n source_app_name: sourceAppName,\n source_app_id: sourceAppID\n };\n\n var a = document.createElement(\"a\");\n a.classList.add(\"ad-choices-icon\");\n var optoutPageURL = __WEBPACK_IMPORTED_MODULE_4__frontendlib_utils__[\"appendParamObjectToURL\"](cdnURL + \"/optout.html\", queryParams);\n\n if (exchange === __WEBPACK_IMPORTED_MODULE_3__constants__[\"x\" /* EXCHANGE_DOUBLECLICK */]) {\n // NOTE (Austin): Letting the click from the anchor tag intentionally take\n // the user out of the ad provides a better experience, as the in-app\n // browser is broken on some inventory (e.g., DoubleClick). Some\n // exchanges, such as Unity, open the in-app browser regardless, leading to\n // a poor user experience. Additionally, certain exchanges ignore our\n // mraid.open or window.open parameters, opening the clickthrough URL in a\n // new browser anyway.\n // TODO(Austin): Test making this the default.\n a.setAttribute(\"target\", \"_blank\");\n a.setAttribute(\"href\", optoutPageURL);\n } else {\n // NOTE(oscar): Chartboost recommends we open the ad choices link using\n // MRAID.\n a.addEventListener(\"click\", function (e) {\n e.preventDefault();\n __WEBPACK_IMPORTED_MODULE_2__madlib_liftoff_mraid__[\"a\" /* default */].open(optoutPageURL, { exchange: exchange, platform: platform });\n });\n }\n\n Object.assign(a.style, {\n width: \"20px\",\n height: \"100%\",\n display: \"inline-block\",\n backgroundColor: \"rgba(204, 204, 204, 0.6)\",\n backgroundImage: \"url(\" + cdnURL + \"/adchoices.png)\",\n backgroundPosition: \"center\",\n backgroundRepeat: \"no-repeat\",\n backgroundSize: \"12px 12px\",\n pointerEvents: \"all\"\n });\n watermarksEl.appendChild(a);\n }\n\n if (russianAgeRating != null) {\n var ageTag = document.createElement(\"div\");\n ageTag.textContent = russianAgeRating + \"+\";\n ageTag.classList.add(\"age-rating\");\n Object.assign(ageTag.style, {\n color: \"blue\",\n fontSize: \"10px\",\n fontWeight: \"500\",\n background: \"whitesmoke\",\n borderRadius: \"0 5px 0 0\",\n padding: \"0 3px\",\n opacity: \"0.75\",\n display: \"inline\",\n verticalAlign: \"bottom\",\n pointerEvents: \"none\",\n lineHeight: \"20px\"\n });\n watermarksEl.appendChild(ageTag);\n }\n\n if (showChineseWatermark) {\n var _el = document.createElement(\"div\");\n _el.classList.add(\"chinese-watermark\");\n Object.assign(_el.style, {\n display: \"inline-block\",\n height: \"100%\",\n width: \"42px\",\n pointerEvents: \"none\",\n backgroundColor: \"rgba(204, 204, 204, 0.6)\",\n backgroundImage: \"url(\" + cdnURL + \"/chinese_watermark.png)\",\n backgroundPosition: \"center\",\n backgroundRepeat: \"no-repeat\",\n backgroundSize: \"contain\"\n });\n watermarksEl.appendChild(_el);\n }\n\n if (audioPolicy === __WEBPACK_IMPORTED_MODULE_3__constants__[\"a\" /* AUDIO_POLICY_ALWAYS_MUTE */]) {\n globallyMuteAllAudio();\n } else if (audioPolicy === __WEBPACK_IMPORTED_MODULE_3__constants__[\"c\" /* AUDIO_POLICY_ON_INTERACTION */]) {\n var globalAudioToggleEl = createGlobalAudioToggle();\n snippetEl.appendChild(globalAudioToggleEl);\n }\n\n __WEBPACK_IMPORTED_MODULE_2__madlib_liftoff_mraid__[\"a\" /* default */].useCustomClose(useCustomClose).then(function (isUsingCustomClose) {\n if (!isUsingCustomClose) return;\n var closeEl = createCloseEl(closeDelay);\n snippetEl.appendChild(closeEl);\n });\n\n snippetEl.appendChild(watermarksEl);\n return snippetEl;\n};\n\nvar postHTMLReturn = function postHTMLReturn(adexpEndpoint, html) {\n return __WEBPACK_IMPORTED_MODULE_4__frontendlib_utils__[\"request\"](\"POST\", adexpEndpoint + \"/html_return\", {\n // Don't set the content type to \"application/json\" because that requires\n // a preflight OPTIONS request (because this is a cross-domain request).\n \"Content-Type\": \"text/plain\"\n }, html);\n};\n\nvar getDOMSnapshot = function getDOMSnapshot() {\n return document.documentElement.outerHTML;\n};\n\n/**\n * Given `adexpEndpoint` (the AdExp host as a `String`), this sends an HTML\n * return after `htmlReturnDelay` ms. Returns a `Promise` that resolves when\n * the HTML return HTTP request is complete.\n */\nvar configureHTMLReturn = function configureHTMLReturn(adexpEndpoint, htmlReturnDelay) {\n var postHTML = function postHTML() {\n console.info(\"Returning HTML\");\n return postHTMLReturn(adexpEndpoint, getDOMSnapshot());\n };\n\n if (htmlReturnDelay == null || htmlReturnDelay === 0) {\n // NOTE(oscar): A delay of 0 ideally should return the DOM before any JS\n // manipulation, so we capture the state of the DOM immediately.\n return postHTML();\n }\n\n return new Promise(function (resolve, reject) {\n setTimeout(function () {\n return postHTML().then(resolve, reject);\n }, htmlReturnDelay);\n });\n};\n\n/***/ }),\n/* 37 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* unused harmony export throttle */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return intentionalInteractionCounterFn; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__cta__ = __webpack_require__(21);\n\n\nvar throttle = function throttle(f, ms) {\n var ignore = false;\n\n return function () {\n if (ignore) return;\n f.apply(undefined, arguments);\n ignore = true;\n setTimeout(function () {\n ignore = false;\n }, ms);\n };\n};\n\nvar intentionalInteractionCounterFn = function intentionalInteractionCounterFn(minimumInteractions) {\n /**\n * InteractionMonitor has somewhat imperfect de-duplication logic for what\n * counts as a full interaction. It also doesn't account for intentional\n * interactions. Also note that onInteractionChange() triggers for every\n * start, drag, and end event.\n *\n * For our purposes, we'll use both InteractionMonitor's count and a custom\n * counter.\n */\n var intentionalInteractionsFromMonitor = new Set();\n var intentionalInteractionCountFromThrottle = 0;\n\n var countIntentionalInteractionThrottle = throttle(function () {\n intentionalInteractionCountFromThrottle += 1;\n },\n /** Count interactions only once every 0.4 seconds. */\n 400);\n\n var getCurrentCount = function getCurrentCount() {\n return Math.min(intentionalInteractionCountFromThrottle, intentionalInteractionsFromMonitor.size);\n };\n\n var countIntentionalInteractions = function countIntentionalInteractions(e) {\n if (Object(__WEBPACK_IMPORTED_MODULE_0__cta__[\"b\" /* isDeadzoneCoord */])({\n x: e.lastInteraction.startX,\n y: e.lastInteraction.startY\n })) {\n return;\n }\n /**\n * NOTE(oscar): e.cumulativeStats.interactionCount is only incremented for\n * full interactions (or at least in theory). It also counts deadzone\n * interactions. Here we use interactionCount to identify which counts are\n * intentional.\n */\n if (e.cumulativeStats.interactionCount > 0 && intentionalInteractionsFromMonitor.size <= minimumInteractions) {\n intentionalInteractionsFromMonitor.add(e.cumulativeStats.interactionCount);\n }\n countIntentionalInteractionThrottle();\n };\n return function (e) {\n countIntentionalInteractions(e);\n return getCurrentCount();\n };\n};\n\n/***/ }),\n/* 38 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__ = __webpack_require__(1);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n/*\n * ClickInteraction is used to connect elements that respond to clicks\n * with the elements that trigger click events. Primarily, this allows\n * dynamic CTAs to respond to click events on click overlays or any\n * other clickthrough element.\n */\n\n// Global state for two-click CTAs.\nvar hasBeenClicked = false;\nvar firstClickHandlers = [];\n\n// Global state for slider CTAs.\nvar SLIDER_COMPLETION_RATIO = 0.7;\nvar sliders = [];\n\nvar setSlideDistance = function setSlideDistance(value) {\n sliders.forEach(function (_ref) {\n var sliderSize = _ref.sliderSize,\n setSlideRatio = _ref.setSlideRatio;\n return setSlideRatio(value / sliderSize);\n });\n};\n\nvar getPointerEventX = function getPointerEventX(e) {\n return (e.changedTouches && e.changedTouches[0] || e.touches && e.touches[0] || e).clientX;\n};\n\nvar ClickInteraction = function () {\n function ClickInteraction() {\n _classCallCheck(this, ClickInteraction);\n }\n\n _createClass(ClickInteraction, null, [{\n key: \"captureFirstClick\",\n value: function captureFirstClick(handleFirstClick) {\n firstClickHandlers.push(handleFirstClick);\n }\n }, {\n key: \"captureSlideClick\",\n value: function captureSlideClick(_ref2) {\n var onCompleted = _ref2.onCompleted,\n sliderSize = _ref2.sliderSize,\n setSlideRatio = _ref2.setSlideRatio;\n\n sliders.push({ onCompleted: onCompleted, sliderSize: sliderSize, setSlideRatio: setSlideRatio });\n }\n }, {\n key: \"addListeners\",\n value: function addListeners(clickEl, onClickComplete) {\n clickEl.addEventListener(\"click\", function (e) {\n if (sliders.length > 0) {\n return;\n }\n\n if (!hasBeenClicked) {\n hasBeenClicked = true;\n\n if (firstClickHandlers.length > 0) {\n firstClickHandlers.forEach(function (handler) {\n return handler(e);\n });\n\n return;\n }\n }\n\n onClickComplete(e);\n }, true);\n\n var slideStartPosition = null;\n __WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__[\"on\"](clickEl, {\n \"mousedown touchstart\": function mousedownTouchstart(e) {\n slideStartPosition = getPointerEventX(e);\n },\n \"mousemove touchmove\": function mousemoveTouchmove(e) {\n if (slideStartPosition == null) return;\n\n setSlideDistance(getPointerEventX(e) - slideStartPosition);\n },\n \"mouseup mouseleave touchend\": function mouseupMouseleaveTouchend(e) {\n if (slideStartPosition == null) return;\n\n var slideDistance = getPointerEventX(e) - slideStartPosition;\n var completedSliders = sliders.filter(function (_ref3) {\n var sliderSize = _ref3.sliderSize;\n return slideDistance > sliderSize * SLIDER_COMPLETION_RATIO;\n });\n\n if (completedSliders.length > 0) {\n completedSliders.forEach(function (_ref4) {\n var onCompleted = _ref4.onCompleted;\n return onCompleted();\n });\n Promise.resolve(onClickComplete(e)).then(function () {\n return new Promise(function (resolve) {\n return setTimeout(resolve, 1000);\n });\n }).then(function () {\n return setSlideDistance(0);\n });\n } else {\n setSlideDistance(0);\n }\n\n slideStartPosition = null;\n }\n });\n }\n }]);\n\n return ClickInteraction;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (ClickInteraction);\n\n/***/ }),\n/* 39 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return addDeadzoneStyles; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__ = __webpack_require__(1);\n\n\n/** TODO(oscar): This is a temporary solution to add deadzones to CSPs. */\nvar addDeadzoneStyles = function addDeadzoneStyles() {\n var el = Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__[\"strToElement\"])(\"\\n <style>\\n .liftoff-deadzone.deadzone-experiment {\\n position: absolute;\\n width: max(50px, min(85px, 11vw));\\n height: max(50px, min(85px, 11vw));\\n z-index: 96;\\n }\\n .liftoff-deadzone.top-left {\\n top: 0;\\n left: 0;\\n }\\n .liftoff-deadzone.top-right {\\n top: 0;\\n right: 0;\\n }\\n </style>\\n \");\n document.head.appendChild(el);\n};\n\nvar addDeadzones = function addDeadzones(useExpandedZones) {\n var rootEl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document.body;\n\n var deadzoneEls = [Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__[\"strToElement\"])(\"<div class=\\\"liftoff-deadzone top-left\\\"></div>\"), Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__[\"strToElement\"])(\"<div class=\\\"liftoff-deadzone top-right\\\"></div>\")];\n deadzoneEls.forEach(function (el) {\n if (useExpandedZones) {\n el.classList.add(\"deadzone-experiment\");\n }\n rootEl.appendChild(el);\n });\n};\n\n/* harmony default export */ __webpack_exports__[\"b\"] = (addDeadzones);\n\n/***/ }),\n/* 40 */,\n/* 41 */,\n/* 42 */,\n/* 43 */,\n/* 44 */,\n/* 45 */,\n/* 46 */,\n/* 47 */,\n/* 48 */,\n/* 49 */,\n/* 50 */,\n/* 51 */,\n/* 52 */,\n/* 53 */,\n/* 54 */,\n/* 55 */,\n/* 56 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return getClickTrackingQueryParams; });\n/* unused harmony export constructLiftoffClickURL */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return handleClick; });\n/* unused harmony export _forUnitTestingOnly */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__madlib_liftoff_mraid__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__madlib_logger__ = __webpack_require__(6);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__constants__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__frontendlib_utils__ = __webpack_require__(0);\n\n\n\n\n\nvar getLiftoffContainerRect = function getLiftoffContainerRect() {\n // NOTE(Casey): 'liftoff-snippet' might not exist if the creative is not\n // fully initialized.\n var containerEl = document.getElementById(\"liftoff-snippet\") || document.body;\n return containerEl.getBoundingClientRect();\n};\n\nvar getClickTrackingQueryParams = function getClickTrackingQueryParams(allInteractionData) {\n var _ref = allInteractionData || {},\n lastInteraction = _ref.lastInteraction,\n cumulativeStats = _ref.cumulativeStats;\n\n var containerRect = getLiftoffContainerRect();\n\n var params = {\n // Unix timestamp of when the click is sent.\n ct: Date.now(),\n // Width of #liftoff-snippet in px.\n aw: containerRect.width.toFixed(),\n // Height of #liftoff-snippet in px.\n ah: containerRect.height.toFixed(),\n // Whether or not MRAID is supported for this impression, determined\n // empirically based on the presence/absence of the mraid object.\n m: __WEBPACK_IMPORTED_MODULE_0__madlib_liftoff_mraid__[\"a\" /* default */].hasSupport(\"mraid\") ? 1 : 0,\n // Total duration, in ms, that the creative was viewable prior to the\n // click. This depends on the mraid \"viewableChange\" event, so its\n // accuracy depends on the exchange's implementation.\n tv: __WEBPACK_IMPORTED_MODULE_0__madlib_liftoff_mraid__[\"a\" /* default */].getViewableDurationMS()\n };\n\n if (lastInteraction == null) {\n return params;\n }\n\n // NOTE(Casey): We see some rare events that do not have x/y coordinates.\n if (lastInteraction.startX != null) {\n // The horizontal position of the click in pixels, relative to the\n // upper-left corner of #liftoff-snippet.\n params.cx = (lastInteraction.startX - containerRect.left).toFixed();\n }\n\n if (lastInteraction.startY != null) {\n // The vertical position of the click in pixels, relative to the\n // upper-left corner of #liftoff-snippet.\n params.cy = (lastInteraction.startY - containerRect.top).toFixed();\n }\n\n if (lastInteraction.durationMS != null) {\n // Duration in milliseconds of the click, as measured by the difference\n // between timestamps on the start and end events (e.g. touchstart and\n // touchend).\n params.dur = lastInteraction.durationMS.toFixed();\n }\n\n Object.assign(params, {\n // The value of Event.isTrusted (see\n // https://developer.mozilla.org/en-US/docs/Web/API/Event/isTrusted).\n it: lastInteraction.isTrusted ? 1 : 0,\n // Maximum force of the interaction on a 0-100 scale. derived from\n // Touch.force (for TouchEvents), MouseEvent.webkitForce, or\n // PointerEvent.pressure. This may be 0 or have some arbitrary value if\n // the pointer device/surface doesn't support force/pressure measurement.\n frc: Math.round(lastInteraction.maxForce * 100),\n // Maximum area of the screen with which the user interacted in px^2 (e.g.\n // the area of the screen covered by a finger during a click). May be 0 or\n // have some arbitrary value if the pointer device/surface doesn't support\n // area measurement.\n ar: lastInteraction.maxArea.toFixed(),\n // Path length traversed from the beginning to the end of the click, in px.\n d: lastInteraction.distance.toFixed(),\n // An enum describing the type of pointing device--Mouse, Touch, or other\n // (e.g. pen/stylus). See the constants defined in `InteractionMonitor`\n // and the corresponding definitions in rtb.proto.\n pt: lastInteraction.pointerType,\n // Total number of distinct interactions detected prior to and including the\n // click. \"Distinct interactions\" are bounded by start/end events or by\n // the pointing device leaving the creative.\n ic: cumulativeStats.interactionCount,\n // Total path length of all interactions.\n tid: cumulativeStats.totalDistance.toFixed()\n });\n\n return params;\n};\n\n/**\n * Given a baseClickURL (a string), attaches the caller's query\n * parameters provided as an object, and returns a string.\n */\nvar constructLiftoffClickURL = function constructLiftoffClickURL(baseClickURL, queryParams) {\n return __WEBPACK_IMPORTED_MODULE_3__frontendlib_utils__[\"appendParamObjectToURL\"](baseClickURL, queryParams);\n};\n\n/**\n * Returns a Promise that resolves when the tracking pixel at url is loaded.\n */\nvar pingTrackingURLWithImage = function pingTrackingURLWithImage(url) {\n return new Promise(function (resolve) {\n // NOTE(Austin): Image is a the best method here as far as we know because\n // it's a foolproof way to get a no-cors request and avoid any strange\n // behavior with XMLHttpRequest. One downside is that Image only tells us\n // when it's fully loaded, and technically we don't need to wait that long.\n // We technically only need to wait for the request to send (we don't need\n // to wait for the response).\n\n // NOTE(Casey): In some cases (e.g. SKAdNetwork impressions on some\n // exchanges), we \"force\" a direct clickthrough with a click-tracking URL\n // that redirects to the MMP and app store. We still use an image tag to\n // ping Usher and the MMP, but it will generate an error. We still want\n // to click through in this case.\n\n // TODO(Casey): Consider alternatives to this (e.g. using an iframe).\n\n var img = new Image();\n img.onload = function () {\n return resolve(url);\n };\n\n // TODO(Austin): Investigate if there are errors here that should be\n // rejected.\n img.onerror = function () {\n return resolve(url);\n };\n img.src = url;\n }).catch(function (e) {\n __WEBPACK_IMPORTED_MODULE_1__madlib_logger__[\"a\" /* default */].recordLabeledError(\"clicktracking_img_error\", e || {});\n });\n};\n\n/**\n * pingTrackingURLWithBeacon sends a ping using the beacon API,\n * which guarantees that the url will be reached before the page is disposed.\n * See: https://developer.mozilla.org/en-US/docs/Web/API/Beacon_API\n */\nvar pingTrackingURLWithBeacon = function pingTrackingURLWithBeacon(url) {\n return new Promise(function (resolve, reject) {\n if (navigator.sendBeacon(url)) {\n resolve();\n } else {\n reject();\n }\n });\n};\n\n/**\n * NOTE(Casey): When the return_js=true query param is attached to an Usher URL,\n * Usher will return a JavaScript file containing\n * '_loOpen(\"{{HTTP_REDIRECT_URL}}\")'. For unknown reasons, this\n * method for fetching the redirect URL works better than fetching it via XHR,\n * possibly due to CORS restrictions. See\n * https://docs.google.com/document/d/1nzlGVs9HNSY_Wd29UzoZSx1luZIwufl6yiQ8AXol7cU/\n */\nvar clickthroughWithScriptTag = function clickthroughWithScriptTag(_ref2) {\n var clickthroughURL = _ref2.clickthroughURL,\n platform = _ref2.platform,\n exchange = _ref2.exchange,\n _ref2$abTests = _ref2.abTests,\n abTests = _ref2$abTests === undefined ? [] : _ref2$abTests,\n _ref2$onlyMraid = _ref2.onlyMraid,\n onlyMraid = _ref2$onlyMraid === undefined ? false : _ref2$onlyMraid;\n\n window._loOpen = function (clickURL) {\n return (\n // We assume the url returned is never a liftoff url.\n __WEBPACK_IMPORTED_MODULE_0__madlib_liftoff_mraid__[\"a\" /* default */].open(clickURL, {\n platform: platform,\n exchange: exchange,\n abTests: abTests,\n isLiftoffURL: false,\n onlyMraid: onlyMraid\n })\n );\n };\n return new Promise(function (resolve) {\n var script = document.createElement(\"script\");\n script.onload = resolve;\n script.onerror = function (e) {\n __WEBPACK_IMPORTED_MODULE_1__madlib_logger__[\"a\" /* default */].recordLabeledError(\"click_script_error\", e || {});\n };\n script.src = __WEBPACK_IMPORTED_MODULE_3__frontendlib_utils__[\"appendParamObjectToURL\"](clickthroughURL, {\n return_js: true\n });\n document.body.appendChild(script);\n }).catch(function (e) {\n __WEBPACK_IMPORTED_MODULE_1__madlib_logger__[\"a\" /* default */].recordLabeledError(\"clickthrough_error\", e || {});\n });\n};\n\n/**\n * Returns true if clickTrackingURL (an object like { url, type }) is a Liftoff\n * click tracking URL.\n */\nvar isLiftoffClickTrackingURL = function isLiftoffClickTrackingURL(clickTrackingURL) {\n return clickTrackingURL.type === __WEBPACK_IMPORTED_MODULE_2__constants__[\"w\" /* CLICK_TRACKING_URL_TYPE_LIFTOFF_ENDPOINT */];\n};\n\n/**\n * Prepares and pings a clickTrackingURL (an object like { url, type }); common\n * Liftoff query parameters and the caller's queryParams are attached only to\n * Liftoff clickTrackingURLs.\n */\nvar pingClickTrackingURL = function pingClickTrackingURL(clickTrackingURL, queryParams) {\n var abTests = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n\n var getClickTrackingURLString = function getClickTrackingURLString(trackingMethod) {\n // NOTE(Austin): Right now we should only have \"liftoff\" click tracking\n // URLs (i.e. http://click.liftoff.io/v1/campaign_click/... ).\n return isLiftoffClickTrackingURL(clickTrackingURL) ? constructLiftoffClickURL(clickTrackingURL.url, Object.assign({}, queryParams, {\n tracking_method: trackingMethod\n })) : clickTrackingURL.url;\n };\n\n // The waterfall of click tracking methods to try (in priority order).\n // Each object in the array should contain a map with the following\n // keys:\n // - method: The tracking method integer, as described in rtb.proto\n // TrackingMethod.\n // - canUse: Whether the method should be tried.\n // - pingFn: The function to ping that takes a URL string and returns a\n // promise.\n var clickTrackingWaterfall = [{\n method: __WEBPACK_IMPORTED_MODULE_2__constants__[\"G\" /* TRACKING_METHOD_BEACON */],\n canUse: abTests != null && abTests.includes(\"madlib-beacon-ping-experiment\") && isLiftoffClickTrackingURL(clickTrackingURL) && navigator.sendBeacon != null,\n pingFn: pingTrackingURLWithBeacon\n }, {\n method: __WEBPACK_IMPORTED_MODULE_2__constants__[\"H\" /* TRACKING_METHOD_IMAGE */],\n canUse: true,\n pingFn: pingTrackingURLWithImage\n }];\n\n // Chain all promises to try each click tracking method. If the\n // method at the previous index returns a rejected promise,\n // we try the next; otherwise we return. If we reach the end without\n // any methods succeeding, this method returns a rejected promise.\n return clickTrackingWaterfall.filter(function (_ref3) {\n var canUse = _ref3.canUse;\n return canUse;\n }).reduce(function (prevPromiseFn, nextWaterfallOption) {\n return function () {\n var method = nextWaterfallOption.method,\n pingFn = nextWaterfallOption.pingFn;\n\n var urlString = getClickTrackingURLString(method);\n return prevPromiseFn().catch(function () {\n return pingFn(urlString);\n });\n };\n }, function () {\n return Promise.reject();\n })();\n};\n\nvar handleClickTracking = function handleClickTracking(clickTrackingURLs, queryParams) {\n var abTests = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n\n return new Promise(function (resolve) {\n var pingCompletePromises = clickTrackingURLs.map(function (clickTrackingURL) {\n return pingClickTrackingURL(clickTrackingURL, queryParams, abTests);\n });\n\n Promise.all(pingCompletePromises).then(resolve);\n }).catch(function (e) {\n __WEBPACK_IMPORTED_MODULE_1__madlib_logger__[\"a\" /* default */].recordLabeledError(\"clicktracking_error\", e || {});\n });\n};\n\nvar isLiftoffClickthroughURL = function isLiftoffClickthroughURL(clickthroughURL) {\n return clickthroughURL.type === __WEBPACK_IMPORTED_MODULE_2__constants__[\"k\" /* CLICKTHROUGH_URL_TYPE_LIFTOFF_ENDPOINT */];\n};\n\n/**\n * Opens a clickthrough URL (object like { url, type }) using the best method\n * for the given context (platform, isReengagement).\n */\nvar handleClickthrough = function handleClickthrough(_ref4) {\n var clickthroughURL = _ref4.clickthroughURL,\n queryParams = _ref4.queryParams,\n exchange = _ref4.exchange,\n platform = _ref4.platform,\n isReengagement = _ref4.isReengagement,\n _ref4$abTests = _ref4.abTests,\n abTests = _ref4$abTests === undefined ? [] : _ref4$abTests;\n\n /**\n * NOTE(oscar): As of it 2022-10-31, we only want to use MRAID for iOS POD.\n * The main reason for this is because we want to guarantee that:\n *\n * 1. SKStoreProductViewController (i.e. App Store overlay) is used. This\n * assumes mraid is needed for this.\n * 2. The click waterfall does not also open the App Store. This is an issue\n * we've seen with AppLovin, but it may affect other exchanges.\n */\n var isAutoclick = !!queryParams.pv;\n\n return new Promise(function (resolve) {\n var isLiftoffURL = isLiftoffClickthroughURL(clickthroughURL);\n var urlStr = isLiftoffURL ? constructLiftoffClickURL(clickthroughURL.url, queryParams) : clickthroughURL.url;\n\n if (queryParams.mac || queryParams.dap) {\n // The method name here is pingClickTrackingURL we do ping clickthrough\n // URL here as this is a background click.\n pingClickTrackingURL(clickthroughURL, queryParams, abTests);\n } else {\n /**\n * NOTE(Casey): On Android, script tag clicks perform better than redirect\n * clicks, while on iOS the opposite is true. However, for reengagement on\n * iOS, trackers may use \"universal links\", which are special web pages that\n * deeplink to an app or redirect to the app store. These links historically\n * have not worked with redirects, so we fetch the link and send the user\n * directly.\n * NOTE(Polly): We append a suffix to certain fyber clickthrough urls when\n * the native browser should be opened upon a click. We should not use the\n * script tag when the \"FYBER_OPEN_BROWSER\" suffix is present in the url.\n * TODO(Casey): Test if we can now redirect to universal links on iOS\n * (we have been told that this may have been fixed).\n */\n if (isLiftoffURL && (platform === __WEBPACK_IMPORTED_MODULE_2__constants__[\"E\" /* PLATFORM_ANDROID */] || isReengagement) && !urlStr.includes(\"FYBER_OPEN_BROWSER\")) {\n return clickthroughWithScriptTag({\n clickthroughURL: urlStr,\n platform: platform,\n exchange: exchange,\n abTests: abTests\n });\n }\n\n __WEBPACK_IMPORTED_MODULE_0__madlib_liftoff_mraid__[\"a\" /* default */].open(urlStr, {\n exchange: exchange,\n platform: platform,\n abTests: abTests,\n isLiftoffURL: isLiftoffURL,\n isAutoclick: isAutoclick\n });\n }\n\n resolve();\n }).catch(function (e) {\n __WEBPACK_IMPORTED_MODULE_1__madlib_logger__[\"a\" /* default */].recordLabeledError(\"clickthrough_error\", e || {});\n });\n};\n\n/**\n * Given clickConfig, an object like:\n *\n * {\n * clickthroughURL: { url, type },\n * clickTrackingURLs: [{ url, type }, { url, type }, ...],\n * }\n *\n * prepares all URLs as appropriate based on type, pings tracking URLs, and\n * opens the click URL using the optimal method for a given context\n * (isReengagement, platform).\n */\nvar handleClick = function handleClick(_ref5) {\n var clickConfig = _ref5.clickConfig,\n queryParams = _ref5.queryParams,\n isReengagement = _ref5.isReengagement,\n platform = _ref5.platform,\n exchange = _ref5.exchange,\n _ref5$abTests = _ref5.abTests,\n abTests = _ref5$abTests === undefined ? null : _ref5$abTests;\n\n // NOTE(oscar): Some exchanges wrap our URLs in order to track their\n // metrics. We perform an asynchronous ping to this link while redirecting\n // users to our actual link to reduce latency.\n\n // TODO(Casey): Determine if we can move the exchange ping URL into\n // clickTrackingURLs and handle along with our own tracking URLs.\n var exchangePingElem = document.getElementById(\"exchange-ping-url\");\n\n if (exchangePingElem != null && exchangePingElem.href != null) {\n __WEBPACK_IMPORTED_MODULE_3__frontendlib_utils__[\"ping\"](exchangePingElem.href);\n }\n\n var clickthroughURL = clickConfig.clickthroughURL,\n clickTrackingURLs = clickConfig.clickTrackingURLs;\n\n\n var clickthroughParams = {\n clickthroughURL: clickthroughURL,\n queryParams: queryParams,\n platform: platform,\n isReengagement: isReengagement,\n exchange: exchange,\n abTests: abTests\n };\n /**\n * Handles both clicktracking and clickthrough.\n *\n * NOTE(Austin): We are testing waiting for the exchange ping to see if there\n * is some race condition.\n *\n * TODO(Austin): Consolidate rejected promises and log errors here.\n */\n var doFullClick = function doFullClick() {\n /** Product View clicks are not tracked. */\n var promise = Promise.resolve();\n if (!queryParams.pv) {\n promise = handleClickTracking(clickTrackingURLs, queryParams, abTests);\n }\n\n return promise.then(function () {\n return handleClickthrough(clickthroughParams);\n });\n };\n\n return doFullClick();\n};\n\nvar _forUnitTestingOnly = {\n pingTrackingURLWithImage: pingTrackingURLWithImage,\n isLiftoffClickTrackingURL: isLiftoffClickTrackingURL,\n pingClickTrackingURL: pingClickTrackingURL,\n handleClickTracking: handleClickTracking,\n isLiftoffClickthroughURL: isLiftoffClickthroughURL,\n clickthroughWithScriptTag: clickthroughWithScriptTag,\n handleClickthrough: handleClickthrough,\n // We re-export LiftoffMRAID for unit testing to ensure that tests and the\n // functions in this file refer to the identical LiftoffMRAID object.\n LiftoffMRAID: __WEBPACK_IMPORTED_MODULE_0__madlib_liftoff_mraid__[\"a\" /* default */]\n};\n\n/***/ }),\n/* 57 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return InteractionMonitor; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__frontendlib_utils__ = __webpack_require__(0);\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n/**\n * This includes classes for tracking interactions with creatives. The data\n * they collect are attached as query parameters to clicks (the last\n * interaction prior to a click is assumed to be the click itself).\n *\n * We listen for all three possible types of events (MouseEvents,\n * PointerEvents, and TouchEvents), because 1) device capabilities differ, so\n * different events may fire on different devices, and 2) some third-party\n * creatives block propagation of some events such that later events do not\n * fire (e.g. if they stop propagation of a PointerEvent, then the\n * corresponding TouchEvent will not fire). However, we collect data from\n * only one type of event in the following order of priority: 1) touch,\n * 2) pointer, 3) mouse (e.g. we only collect pointer data if we're not\n * receiving touch events).\n *\n * We somewhat arbitrarily define interactions as starting and ending at\n * the window's boundaries (i.e. if the user moves over a path that leaves\n * and then re-enters window, this would count as two interactions: one ends\n * when their finger leaves the window, and another one starts when it\n * re-enters the window).\n */\n\n\nvar POINTER_TYPE_TOUCH = 1;\nvar POINTER_TYPE_MOUSE = 2;\n// POINTER_TYPE_POINTER is a catch-all for anything other than touch or mouse.\nvar POINTER_TYPE_POINTER = 3;\n\n/**\n * Returns the pointer type of a PointerEvent.\n */\nvar getPointerEventPointerType = function getPointerEventPointerType(pointerEvent) {\n switch (pointerEvent.pointerType) {\n case \"mouse\":\n return POINTER_TYPE_MOUSE;\n case \"touch\":\n return POINTER_TYPE_TOUCH;\n default:\n return POINTER_TYPE_POINTER;\n }\n};\n\n/**\n * Given a MouseEvent or a PointerEvent, returns true iff a device button\n * is pressed (returns false if this cannot be determined from the event).\n */\nvar isButtonPressed = function isButtonPressed(e) {\n // e.which is a non-standard fallback for old versions of Safari.\n var buttons = e.buttons != null ? e.buttons : e.which;\n return buttons != null && buttons !== 0;\n};\n\n/** Returns the linear distance between (startX, startY) and (endX, endY). */\nvar computeDistance = function computeDistance(startX, startY, endX, endY) {\n return Math.sqrt(Math.pow(startX - endX, 2) + Math.pow(startY - endY, 2));\n};\n\n/**\n * Returns true iff the given TouchEvent has some touch-point within the bounds\n * of the window.\n */\nvar isTouchInWindow = function isTouchInWindow(e) {\n return [].concat(_toConsumableArray(e.changedTouches)).some(function (touch) {\n var clientX = touch.clientX,\n clientY = touch.clientY;\n\n return clientX >= 0 && clientX <= window.innerWidth && clientY >= 0 && clientY <= window.innerHeight;\n });\n};\n\n/**\n * Returns the maximum force of all touches in a TouchEvent, or 0 if force\n * information is not available.\n */\nvar maxTouchEventForce = function maxTouchEventForce(e) {\n var touchForces = [].concat(_toConsumableArray(e.changedTouches), _toConsumableArray(e.touches)).map(function (touch) {\n return touch.force || 0;\n });\n\n return Math.max.apply(Math, [0].concat(_toConsumableArray(touchForces)));\n};\n\n/**\n * Returns the total touch area of a TouchEvent, or 0 if touch area is not\n * available.\n */\nvar touchEventArea = function touchEventArea(e) {\n return [].concat(_toConsumableArray(e.touches)).reduce(function (sum, touch) {\n var radiusX = touch.radiusX,\n radiusY = touch.radiusY;\n\n var area = radiusX == null || radiusY == null ? 0 : Math.PI * radiusX * radiusY;\n return sum + area;\n }, 0);\n};\n\nvar Interaction = function () {\n function Interaction(startEvent) {\n _classCallCheck(this, Interaction);\n\n this._startEvent = startEvent;\n this._lastMoveEvent = null;\n this._endEvent = null;\n this._maxForce = startEvent.force;\n this._maxArea = startEvent.area;\n this._totalDistance = 0;\n }\n\n _createClass(Interaction, [{\n key: \"setEndEvent\",\n value: function setEndEvent(endEvent) {\n this._updateMetrics(endEvent);\n this._endEvent = endEvent;\n }\n }, {\n key: \"setLastMoveEvent\",\n value: function setLastMoveEvent(moveEvent) {\n this._updateMetrics(moveEvent);\n this._lastMoveEvent = moveEvent;\n }\n }, {\n key: \"isInProgress\",\n value: function isInProgress() {\n return this._startEvent != null && this._endEvent == null;\n }\n }, {\n key: \"isComplete\",\n value: function isComplete() {\n return this._startEvent != null && this._endEvent != null;\n }\n }, {\n key: \"getMetrics\",\n value: function getMetrics() {\n var metrics = {\n startX: this._startEvent.x,\n startY: this._startEvent.y,\n isTrusted: this._startEvent.isTrusted,\n maxForce: this._maxForce,\n maxArea: this._maxArea,\n distance: this._totalDistance,\n pointerType: this._startEvent.pointerType\n // Omit durationMS because a null duration is different\n // than a duration of 0, it's important to distinguish the two.\n // The nullable value is allowed by the rtb.proto.Click object.\n };\n\n if (this.isComplete()) {\n // Add data that requires the interaction to be complete,\n // (i.e. has a end event).\n Object.assign(metrics, {\n durationMS: this._endEvent.timestamp - this._startEvent.timestamp\n });\n }\n\n return metrics;\n }\n }, {\n key: \"_updateMetrics\",\n value: function _updateMetrics(newEvent) {\n this._maxForce = Math.max(this._maxForce, newEvent.force);\n this._lastMaxArea = Math.max(this._maxArea, newEvent.area);\n\n var lastEvent = this._lastMoveEvent || this._startEvent;\n this._totalDistance += computeDistance(lastEvent.x, lastEvent.y, newEvent.x, newEvent.y);\n }\n }]);\n\n return Interaction;\n}();\n\n/**\n * This is an abstract base class for monitoring interaction events. Concrete\n * subclasses must define two methods:\n *\n * 1) _attachEventListeners: this must attach the relevant listeners to the\n * window and call _handleStartEvent, _handleEndEvent, and _handleMoveEvent\n * with the proper raw event.\n * 2) _normalizeEvent: this must take a raw event of the relevant type and\n * return a \"normalized event\" (an object like { x, y, isTrusted, timestamp,\n * force, area, pointerType }.\n */\n\n\nvar InteractionEventMonitor = function () {\n // #if process.env.NODE_ENV === \"test\"\n // destroy() {\n // this._attachedEventListeners.forEach(\n // ({ eventName, handler, listenerOptions }) => {\n // window.removeEventListener(eventName, handler, listenerOptions);\n // }\n // );\n // this._attachedEventListeners = [];\n // }\n // #endif\n\n function InteractionEventMonitor() {\n _classCallCheck(this, InteractionEventMonitor);\n\n this._interactionCount = 0;\n this._totalInteractionDistance = 0;\n this._lastInteraction = null;\n this._interactionStartHandlers = [];\n this._interactionEndHandlers = [];\n this._attachedEventListeners = [];\n this._attachEventListeners();\n }\n\n _createClass(InteractionEventMonitor, [{\n key: \"listenFor\",\n value: function listenFor(eventName, handler) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n var listenerOptions = Object.assign({\n // NOTE(Austin): By default, it's absolutely critical we capture events\n // as they bubble down so we have interaction data before developers\n // presumably call our `Liftoff.open` method in an event listener handler.\n capture: true\n }, options);\n this._attachedEventListeners.push({\n eventName: eventName,\n handler: handler,\n listenerOptions: listenerOptions\n });\n window.addEventListener(eventName, handler, listenerOptions);\n }\n }, {\n key: \"onInteractionStart\",\n value: function onInteractionStart(handlerFn) {\n if (this._interactionStartHandlers.includes(handlerFn)) {\n return;\n }\n\n this._interactionStartHandlers.push(handlerFn);\n }\n }, {\n key: \"_handleStartEvent\",\n value: function _handleStartEvent(e) {\n if (this.isInteractionInProgress()) {\n // This could occur if another interaction starts before another one\n // completes (e.g. in the case of multiple pointer devices) or if the\n // device fires multiple 'start' events in some cases (e.g. firing\n // \"pointerover\" and then \"pointerdown\" for touch events).\n return;\n }\n\n var normalizedEvent = this._normalizeEvent(e);\n this._lastInteraction = new Interaction(normalizedEvent);\n this._interactionStartHandlers.forEach(function (handler) {\n return handler();\n });\n }\n }, {\n key: \"onInteractionEnd\",\n value: function onInteractionEnd(handlerFn) {\n if (this._interactionEndHandlers.includes(handlerFn)) {\n return;\n }\n\n this._interactionEndHandlers.push(handlerFn);\n }\n }, {\n key: \"_handleEndEvent\",\n value: function _handleEndEvent(e) {\n if (!this.isInteractionInProgress()) {\n return;\n }\n var normalizedEvent = this._normalizeEvent(e);\n this._lastInteraction.setEndEvent(normalizedEvent);\n\n this._updateCumulativeInteractionStats();\n this._interactionEndHandlers.forEach(function (handler) {\n return handler();\n });\n }\n }, {\n key: \"_handleMoveEvent\",\n value: function _handleMoveEvent(e) {\n if (!this.isInteractionInProgress()) {\n return;\n }\n\n var normalizedEvent = this._normalizeEvent(e);\n this._lastInteraction.setLastMoveEvent(normalizedEvent);\n }\n }, {\n key: \"isInteractionInProgress\",\n value: function isInteractionInProgress() {\n return this._lastInteraction != null && this._lastInteraction.isInProgress();\n }\n }, {\n key: \"isLastInteractionComplete\",\n value: function isLastInteractionComplete() {\n return this._lastInteraction != null && this._lastInteraction.isComplete();\n }\n }, {\n key: \"getLastInteractionData\",\n value: function getLastInteractionData() {\n return this._lastInteraction && this._lastInteraction.getMetrics();\n }\n }, {\n key: \"getAllInteractionData\",\n value: function getAllInteractionData() {\n return {\n lastInteraction: this.getLastInteractionData(),\n cumulativeStats: this.getCumulativeInteractionStats()\n };\n }\n }, {\n key: \"_updateCumulativeInteractionStats\",\n value: function _updateCumulativeInteractionStats() {\n this._interactionCount += 1;\n this._totalInteractionDistance += this._lastInteraction.getMetrics().distance;\n }\n }, {\n key: \"getCumulativeInteractionStats\",\n value: function getCumulativeInteractionStats() {\n return {\n interactionCount: this._interactionCount,\n totalDistance: this._totalInteractionDistance\n };\n }\n }, {\n key: \"_normalizeEvent\",\n value: function _normalizeEvent(_) {\n throw new Error(\"_normalizeEvent must be implemented by a concrete subclass\");\n }\n }, {\n key: \"_attachEventListeners\",\n value: function _attachEventListeners() {\n throw new Error(\"_attachEventListeners must be implemented by a concrete subclass\");\n }\n }]);\n\n return InteractionEventMonitor;\n}();\n\nvar MouseEventMonitor = function (_InteractionEventMoni) {\n _inherits(MouseEventMonitor, _InteractionEventMoni);\n\n function MouseEventMonitor() {\n _classCallCheck(this, MouseEventMonitor);\n\n return _possibleConstructorReturn(this, (MouseEventMonitor.__proto__ || Object.getPrototypeOf(MouseEventMonitor)).call(this));\n }\n\n _createClass(MouseEventMonitor, [{\n key: \"_normalizeEvent\",\n value: function _normalizeEvent(e) {\n return {\n x: e.pageX,\n y: e.pageY,\n isTrusted: e.isTrusted,\n timestamp: e.timeStamp,\n // NOTE(Casey): MouseEvent.webkitForce is non-standard, but we collect\n // it if it's available anyway.\n force: e.webkitForce || 0,\n area: 0,\n pointerType: POINTER_TYPE_MOUSE\n };\n }\n }, {\n key: \"_attachEventListeners\",\n value: function _attachEventListeners() {\n var _this2 = this;\n\n _get(MouseEventMonitor.prototype.__proto__ || Object.getPrototypeOf(MouseEventMonitor.prototype), \"listenFor\", this).call(this, \"mousedown\", function (e) {\n return _this2._handleStartEvent(e);\n });\n _get(MouseEventMonitor.prototype.__proto__ || Object.getPrototypeOf(MouseEventMonitor.prototype), \"listenFor\", this).call(this, \"mouseover\", function (e) {\n if (!isButtonPressed(e)) return;\n _this2._handleStartEvent(e);\n });\n _get(MouseEventMonitor.prototype.__proto__ || Object.getPrototypeOf(MouseEventMonitor.prototype), \"listenFor\", this).call(this, \"mouseup\", function (e) {\n return _this2._handleEndEvent(e);\n });\n _get(MouseEventMonitor.prototype.__proto__ || Object.getPrototypeOf(MouseEventMonitor.prototype), \"listenFor\", this).call(this, \"mouseout\", function (e) {\n if (!isButtonPressed(e)) return;\n _this2._handleEndEvent(e);\n });\n _get(MouseEventMonitor.prototype.__proto__ || Object.getPrototypeOf(MouseEventMonitor.prototype), \"listenFor\", this).call(this, \"mousemove\", function (e) {\n if (!isButtonPressed(e)) return;\n _this2._handleMoveEvent(e);\n });\n }\n }]);\n\n return MouseEventMonitor;\n}(InteractionEventMonitor);\n\nvar PointerEventMonitor = function (_InteractionEventMoni2) {\n _inherits(PointerEventMonitor, _InteractionEventMoni2);\n\n function PointerEventMonitor() {\n _classCallCheck(this, PointerEventMonitor);\n\n return _possibleConstructorReturn(this, (PointerEventMonitor.__proto__ || Object.getPrototypeOf(PointerEventMonitor)).call(this));\n }\n\n _createClass(PointerEventMonitor, [{\n key: \"_normalizeEvent\",\n value: function _normalizeEvent(e) {\n return {\n x: e.pageX,\n y: e.pageY,\n isTrusted: e.isTrusted,\n timestamp: e.timeStamp,\n force: e.pressure,\n // NOTE(Casey): We consider pointer area as an ellipse for consistency\n // with touch events.\n area: Math.PI * e.width * e.height / 4,\n pointerType: getPointerEventPointerType(e)\n };\n }\n }, {\n key: \"_attachEventListeners\",\n value: function _attachEventListeners() {\n var _this4 = this;\n\n _get(PointerEventMonitor.prototype.__proto__ || Object.getPrototypeOf(PointerEventMonitor.prototype), \"listenFor\", this).call(this, \"pointerdown\", function (e) {\n return _this4._handleStartEvent(e);\n });\n _get(PointerEventMonitor.prototype.__proto__ || Object.getPrototypeOf(PointerEventMonitor.prototype), \"listenFor\", this).call(this, \"pointerover\", function (e) {\n if (!isButtonPressed(e)) return;\n _this4._handleStartEvent(e);\n });\n _get(PointerEventMonitor.prototype.__proto__ || Object.getPrototypeOf(PointerEventMonitor.prototype), \"listenFor\", this).call(this, \"pointerup\", function (e) {\n return _this4._handleEndEvent(e);\n });\n _get(PointerEventMonitor.prototype.__proto__ || Object.getPrototypeOf(PointerEventMonitor.prototype), \"listenFor\", this).call(this, \"pointercancel\", function (e) {\n return _this4._handleEndEvent(e);\n });\n _get(PointerEventMonitor.prototype.__proto__ || Object.getPrototypeOf(PointerEventMonitor.prototype), \"listenFor\", this).call(this, \"pointerout\", function (e) {\n if (!isButtonPressed(e)) return;\n _this4._handleEndEvent(e);\n });\n _get(PointerEventMonitor.prototype.__proto__ || Object.getPrototypeOf(PointerEventMonitor.prototype), \"listenFor\", this).call(this, \"pointermove\", function (e) {\n if (!isButtonPressed(e)) return;\n _this4._handleMoveEvent(e);\n });\n }\n }]);\n\n return PointerEventMonitor;\n}(InteractionEventMonitor);\n\nvar TouchEventMonitor = function (_InteractionEventMoni3) {\n _inherits(TouchEventMonitor, _InteractionEventMoni3);\n\n function TouchEventMonitor() {\n _classCallCheck(this, TouchEventMonitor);\n\n return _possibleConstructorReturn(this, (TouchEventMonitor.__proto__ || Object.getPrototypeOf(TouchEventMonitor)).call(this));\n }\n\n _createClass(TouchEventMonitor, [{\n key: \"_normalizeEvent\",\n value: function _normalizeEvent(e) {\n return {\n // NOTE(Casey): We arbitrarily choose a changed touch to use for the\n // interaction position, making distance measures inaccurate for multi-\n // touch interactions.\n x: e.changedTouches[0].pageX,\n y: e.changedTouches[0].pageY,\n isTrusted: e.isTrusted,\n timestamp: e.timeStamp,\n force: maxTouchEventForce(e),\n area: touchEventArea(e),\n pointerType: POINTER_TYPE_TOUCH\n };\n }\n }, {\n key: \"_attachEventListeners\",\n value: function _attachEventListeners() {\n var _this6 = this;\n\n _get(TouchEventMonitor.prototype.__proto__ || Object.getPrototypeOf(TouchEventMonitor.prototype), \"listenFor\", this).call(this, \"touchstart\", function (e) {\n return _this6._handleStartEvent(e);\n });\n _get(TouchEventMonitor.prototype.__proto__ || Object.getPrototypeOf(TouchEventMonitor.prototype), \"listenFor\", this).call(this, \"touchend\", function (e) {\n if (e.touches.length !== 0) return;\n _this6._handleEndEvent(e);\n });\n _get(TouchEventMonitor.prototype.__proto__ || Object.getPrototypeOf(TouchEventMonitor.prototype), \"listenFor\", this).call(this, \"touchcancel\", function (e) {\n return _this6._handleEndEvent(e);\n });\n _get(TouchEventMonitor.prototype.__proto__ || Object.getPrototypeOf(TouchEventMonitor.prototype), \"listenFor\", this).call(this, \"touchmove\", function (e) {\n // NOTE(Casey): There are no touch events analogous to\n // mouseover/pointerover and mouseout/pointerout, so we check if the touch\n // is within the window during move events instead.\n var isInWindow = isTouchInWindow(e);\n if (!isInWindow && _this6.isInteractionInProgress()) {\n // The touch started inside the window and has now moved outside of it.\n _this6._handleEndEvent(e);\n } else if (isInWindow && _this6.isLastInteractionComplete()) {\n // The touch started outside of the window and moved into the window,\n // so we need to start tracking a new interaction.\n _this6._handleStartEvent(e);\n } else {\n // This event is part of the interaction we're currently tracking.\n _this6._handleMoveEvent(e);\n }\n });\n }\n }]);\n\n return TouchEventMonitor;\n}(InteractionEventMonitor);\n\nvar InteractionMonitor = function () {\n // #if process.env.NODE_ENV === \"test\"\n // destroy() {\n // this._monitors.forEach((monitor) => {\n // monitor.destroy();\n // });\n // this._monitors = [];\n // }\n // #endif\n\n function InteractionMonitor() {\n var _this7 = this;\n\n _classCallCheck(this, InteractionMonitor);\n\n // These events are ordered by priority, from highest to lowest.\n this._monitors = [new TouchEventMonitor(), new PointerEventMonitor(), new MouseEventMonitor()];\n\n this._monitors.forEach(function (monitor) {\n monitor.onInteractionStart(_this7._handleInteractionEvent.bind(_this7));\n });\n this._monitors.forEach(function (monitor) {\n monitor.onInteractionEnd(_this7._handleInteractionEvent.bind(_this7));\n });\n\n this._previousAllInteractionData = null;\n this._interactionChangeHandlers = [];\n }\n\n /**\n * Given a function that will receive an object like that returned by\n * getAllInteractionData, sets up listeners so that handlerFn will be called\n * whenever any interaction data change.\n */\n\n\n _createClass(InteractionMonitor, [{\n key: \"onInteractionChange\",\n value: function onInteractionChange(handlerFn) {\n if (this._interactionChangeHandlers.includes(handlerFn)) {\n return;\n }\n\n this._interactionChangeHandlers.push(handlerFn);\n }\n }, {\n key: \"_handleInteractionEvent\",\n value: function _handleInteractionEvent() {\n var currentAllInteractionData = this.getAllInteractionData();\n if (Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_utils__[\"deepEqual\"])(this._previousAllInteractionData, currentAllInteractionData)) {\n return;\n }\n\n this._previousAllInteractionData = currentAllInteractionData;\n this._interactionChangeHandlers.forEach(function (handler) {\n handler(currentAllInteractionData);\n });\n }\n }, {\n key: \"_chooseEventMonitorWithInProgressInteractions\",\n value: function _chooseEventMonitorWithInProgressInteractions() {\n return this._monitors.find(function (eventMonitor) {\n return eventMonitor.isInteractionInProgress();\n });\n }\n }, {\n key: \"_chooseEventMonitorWithCompletedInteractions\",\n value: function _chooseEventMonitorWithCompletedInteractions() {\n return this._monitors.find(function (eventMonitor) {\n return eventMonitor.isLastInteractionComplete();\n });\n }\n }, {\n key: \"_chooseEventMonitor\",\n value: function _chooseEventMonitor() {\n // Since this class is used by in-house and third-party creatives\n // we prioritize partial interactions (i.e. clickthrough events\n // that fire before the touchEnd/clickEnd/etc. fires).\n return this._chooseEventMonitorWithInProgressInteractions() || this._chooseEventMonitorWithCompletedInteractions();\n }\n\n /**\n * Returns a map containing the last interaction and the cumulative\n * statistics. Prefer using this over calling `getLastInteractionData` and\n * `getCumulativeInteractionStats` separately.\n */\n\n }, {\n key: \"getAllInteractionData\",\n value: function getAllInteractionData() {\n var eventMonitor = this._chooseEventMonitor();\n if (eventMonitor == null) {\n return null;\n }\n\n return eventMonitor.getAllInteractionData();\n }\n\n /**\n * Returns an object like { startX, startY, isTrusted, durationMS, maxForce\n * maxArea, distance, pointerType } describing the last interaction.\n */\n\n }, {\n key: \"getLastInteractionData\",\n value: function getLastInteractionData() {\n var eventMonitor = this._chooseEventMonitor();\n if (eventMonitor == null) {\n return null;\n }\n\n return eventMonitor.getLastInteractionData();\n }\n\n /** Returns an object like { interactionCount, totalDistance }. */\n\n }, {\n key: \"getCumulativeInteractionStats\",\n value: function getCumulativeInteractionStats() {\n var eventMonitor = this._chooseEventMonitor();\n if (eventMonitor == null) {\n return null;\n }\n\n return eventMonitor.getCumulativeInteractionStats();\n }\n }]);\n\n return InteractionMonitor;\n}();\n\n\n\n/***/ }),\n/* 58 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__constants__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__behaviors_AutoclickBehaviorCompletedDelay__ = __webpack_require__(59);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__behaviors_AutoclickBehaviorInteractionCount__ = __webpack_require__(60);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__behaviors_AutoclickBehaviorLastInteraction__ = __webpack_require__(61);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__behaviors_AutoclickBehaviorLastInteractionAndCount__ = __webpack_require__(62);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__behaviors_AutoclickBehaviorLoadDelay__ = __webpack_require__(63);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__behaviors_AutoclickBehaviorViewableDelay__ = __webpack_require__(64);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__behaviors_AutoclickBehaviorViewableDelayWithReset__ = __webpack_require__(65);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _behaviorClasses;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\n\n\n\n\n\n\n\n\nvar behaviorClasses = (_behaviorClasses = {}, _defineProperty(_behaviorClasses, __WEBPACK_IMPORTED_MODULE_0__constants__[\"d\" /* AUTOCLICK_TYPE_COMPLETED_DELAY */], __WEBPACK_IMPORTED_MODULE_1__behaviors_AutoclickBehaviorCompletedDelay__[\"a\" /* default */]), _defineProperty(_behaviorClasses, __WEBPACK_IMPORTED_MODULE_0__constants__[\"e\" /* AUTOCLICK_TYPE_INTERACTION_COUNT */], __WEBPACK_IMPORTED_MODULE_2__behaviors_AutoclickBehaviorInteractionCount__[\"a\" /* default */]), _defineProperty(_behaviorClasses, __WEBPACK_IMPORTED_MODULE_0__constants__[\"f\" /* AUTOCLICK_TYPE_LAST_INTERACTION */], __WEBPACK_IMPORTED_MODULE_3__behaviors_AutoclickBehaviorLastInteraction__[\"a\" /* default */]), _defineProperty(_behaviorClasses, __WEBPACK_IMPORTED_MODULE_0__constants__[\"g\" /* AUTOCLICK_TYPE_LAST_INTERACTION_AND_INTERACTION_COUNT */], __WEBPACK_IMPORTED_MODULE_4__behaviors_AutoclickBehaviorLastInteractionAndCount__[\"a\" /* default */]), _defineProperty(_behaviorClasses, __WEBPACK_IMPORTED_MODULE_0__constants__[\"h\" /* AUTOCLICK_TYPE_LOAD_DELAY */], __WEBPACK_IMPORTED_MODULE_5__behaviors_AutoclickBehaviorLoadDelay__[\"a\" /* default */]), _defineProperty(_behaviorClasses, __WEBPACK_IMPORTED_MODULE_0__constants__[\"i\" /* AUTOCLICK_TYPE_VIEWABLE_DELAY */], __WEBPACK_IMPORTED_MODULE_6__behaviors_AutoclickBehaviorViewableDelay__[\"a\" /* default */]), _defineProperty(_behaviorClasses, __WEBPACK_IMPORTED_MODULE_0__constants__[\"j\" /* AUTOCLICK_TYPE_VIEWABLE_DELAY_WITH_RESET */], __WEBPACK_IMPORTED_MODULE_7__behaviors_AutoclickBehaviorViewableDelayWithReset__[\"a\" /* default */]), _behaviorClasses);\n\nvar MONITORED_EVENTS = {\n INTERACTION_EVENT: \"interactionEvent\",\n COMPLETED: \"completed\",\n ENGAGEMENT: \"engagement\",\n HTML_LOADED: \"htmlLoaded\",\n VIEWABLE: \"viewable\",\n VIEWABLE_CHANGE: \"viewableChange\"\n};\n\nvar AUTOCLICK_EVENT_COUNT_CHANGE = \"countChanged\";\n\n/**\n * @callback ClickthroughHandler\n * @param {object} lastEvent - The last Interaction event.\n */\n\n/**\n * @typedef AutoclickBehaviorConfig\n * @property {string} type - autoclick variant type.\n * @property {number} delay - In ms. Time to wait until opening App Store from\n * autoclick click.\n * @property {number} count - Max occurrences of events as determined by type.\n */\n\n/**\n * Controls App Store On Interaction, aka. autoclick, behavior.\n * @see https://docs.google.com/document/d/1QYHzXt1oxmGIx2F63XErz7dF4SD6pxSi-1mkxxnHsUU/edit#heading=h.bypyxke51ec\n */\n\nvar Autoclick = function () {\n /**\n *\n * @param {AutoclickBehaviorConfig} behavior - Describes the autoclick behavior.\n * @param {Object} ctx\n * @param {ClickthroughHandler} ctx.clickthroughHandler\n * @returns\n */\n function Autoclick(behavior, _ref) {\n var _eventListeners;\n\n var clickthroughHandler = _ref.clickthroughHandler;\n\n _classCallCheck(this, Autoclick);\n\n if (behavior == null) {\n this.disable();\n return;\n }\n this._clickthroughHandler = clickthroughHandler;\n this._lastCount = 0;\n this._lastInteraction = null;\n\n this._behavior = behavior;\n var behaviorType = behavior == null ? null : behavior.type;\n if (behaviorClasses[behaviorType] == null) {\n console.error(\"Behavior class not found: \" + behaviorType);\n this.disable();\n return;\n }\n /** @type {AutoclickBehaviorInteractionCount|AutoclickBehaviorCompletedDelay|AutoclickBehaviorLastInteraction|AutoclickBehaviorLastInteractionAndCount} */\n this.behaviorClass = new behaviorClasses[behaviorType]({\n autoclick: this,\n behavior: behavior,\n delayClickthroughHandler: this._handleDelayClickthrough.bind(this)\n });\n\n this._handleDelayClickthrough = this._handleDelayClickthrough.bind(this);\n\n this.eventListeners = (_eventListeners = {}, _defineProperty(_eventListeners, MONITORED_EVENTS.ENGAGEMENT, [this.behaviorClass.onEngagement.bind(this.behaviorClass)]), _defineProperty(_eventListeners, MONITORED_EVENTS.HTML_LOADED, [this.behaviorClass.onHtmlLoaded.bind(this.behaviorClass)]), _defineProperty(_eventListeners, MONITORED_EVENTS.VIEWABLE, [this.behaviorClass.onViewable.bind(this.behaviorClass)]), _defineProperty(_eventListeners, MONITORED_EVENTS.VIEWABLE_CHANGE, [this.behaviorClass.onViewableChange.bind(this.behaviorClass)]), _defineProperty(_eventListeners, MONITORED_EVENTS.COMPLETED, [this.behaviorClass.onCompleted.bind(this.behaviorClass)]), _defineProperty(_eventListeners, MONITORED_EVENTS.INTERACTION_EVENT,\n // Order matters.\n [this._recordLastInteraction.bind(this), this.behaviorClass.onInteraction.bind(this.behaviorClass)]), _defineProperty(_eventListeners, AUTOCLICK_EVENT_COUNT_CHANGE, []), _eventListeners);\n }\n\n _createClass(Autoclick, [{\n key: \"disable\",\n value: function disable() {\n this.autoclickDisabled = true;\n }\n }, {\n key: \"emitInteractionEvent\",\n value: function emitInteractionEvent() {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n this.emit.apply(this, [MONITORED_EVENTS.INTERACTION_EVENT].concat(args));\n }\n }, {\n key: \"emitInteractionPromptReachedEvent\",\n value: function emitInteractionPromptReachedEvent() {\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n this.emit.apply(this, [MONITORED_EVENTS.COMPLETED].concat(args));\n }\n }, {\n key: \"emitHtmlLoadedEvent\",\n value: function emitHtmlLoadedEvent() {\n for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n\n this.emit.apply(this, [MONITORED_EVENTS.HTML_LOADED].concat(args));\n }\n }, {\n key: \"emitViewableEvent\",\n value: function emitViewableEvent() {\n for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n\n this.emit.apply(this, [MONITORED_EVENTS.VIEWABLE].concat(args));\n }\n }, {\n key: \"emitViewableChangeEvent\",\n value: function emitViewableChangeEvent() {\n for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n args[_key5] = arguments[_key5];\n }\n\n this.emit.apply(this, [MONITORED_EVENTS.VIEWABLE_CHANGE].concat(args));\n }\n }, {\n key: \"_recordLastInteraction\",\n value: function _recordLastInteraction(e) {\n this._lastInteraction = e;\n }\n }, {\n key: \"_handleDelayClickthrough\",\n value: function _handleDelayClickthrough(delay) {\n var _this = this;\n\n clearTimeout(this._delayTimer);\n if (this.autoclickDisabled) return;\n\n this._delayTimer = setTimeout(function () {\n _this._clickthrough();\n }, delay || 0);\n }\n }, {\n key: \"_clickthrough\",\n value: function _clickthrough() {\n if (this.autoclickDisabled) return;\n this._clickthroughHandler(this._lastInteraction);\n this.disable();\n }\n }, {\n key: \"emit\",\n value: function emit(eventName) {\n for (var _len6 = arguments.length, args = Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) {\n args[_key6 - 1] = arguments[_key6];\n }\n\n if (this.autoclickDisabled) return;\n if (!(eventName in this.eventListeners)) {\n throw new Error(\"Event \" + eventName + \" not found!\");\n }\n this.eventListeners[eventName].forEach(function (f) {\n f.apply(undefined, args);\n });\n }\n }]);\n\n return Autoclick;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Autoclick);\n\n/***/ }),\n/* 59 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__ = __webpack_require__(8);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\nvar AutoclickBehaviorCompletedDelay = function (_AutoclickBehaviorAbs) {\n _inherits(AutoclickBehaviorCompletedDelay, _AutoclickBehaviorAbs);\n\n function AutoclickBehaviorCompletedDelay() {\n _classCallCheck(this, AutoclickBehaviorCompletedDelay);\n\n return _possibleConstructorReturn(this, (AutoclickBehaviorCompletedDelay.__proto__ || Object.getPrototypeOf(AutoclickBehaviorCompletedDelay)).apply(this, arguments));\n }\n\n _createClass(AutoclickBehaviorCompletedDelay, [{\n key: \"onCompleted\",\n value: function onCompleted() {\n this.delayClickthrough(this.getBehaviorDelay());\n }\n }]);\n\n return AutoclickBehaviorCompletedDelay;\n}(__WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__[\"a\" /* default */]);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (AutoclickBehaviorCompletedDelay);\n\n/***/ }),\n/* 60 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__ = __webpack_require__(8);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__autoclick_utils__ = __webpack_require__(37);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\nvar AutoclickBehaviorInteractionCount = function (_AutoclickBehaviorAbs) {\n _inherits(AutoclickBehaviorInteractionCount, _AutoclickBehaviorAbs);\n\n function AutoclickBehaviorInteractionCount() {\n _classCallCheck(this, AutoclickBehaviorInteractionCount);\n\n return _possibleConstructorReturn(this, (AutoclickBehaviorInteractionCount.__proto__ || Object.getPrototypeOf(AutoclickBehaviorInteractionCount)).apply(this, arguments));\n }\n\n _createClass(AutoclickBehaviorInteractionCount, [{\n key: \"init\",\n value: function init() {\n this._counter = Object(__WEBPACK_IMPORTED_MODULE_1__autoclick_utils__[\"a\" /* intentionalInteractionCounterFn */])(this.getBehaviorCount());\n this.triggered = false;\n }\n }, {\n key: \"onInteraction\",\n value: function onInteraction(e) {\n this.setCurrentCount(this._counter(e));\n\n if (!this.isCountReached() || this.triggered) return;\n this.triggered = true;\n\n this.delayClickthrough(this.getBehaviorDelay());\n }\n }]);\n\n return AutoclickBehaviorInteractionCount;\n}(__WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__[\"a\" /* default */]);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (AutoclickBehaviorInteractionCount);\n\n/***/ }),\n/* 61 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__ = __webpack_require__(8);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\nvar AutoclickBehaviorLastInteraction = function (_AutoclickBehaviorAbs) {\n _inherits(AutoclickBehaviorLastInteraction, _AutoclickBehaviorAbs);\n\n function AutoclickBehaviorLastInteraction() {\n _classCallCheck(this, AutoclickBehaviorLastInteraction);\n\n return _possibleConstructorReturn(this, (AutoclickBehaviorLastInteraction.__proto__ || Object.getPrototypeOf(AutoclickBehaviorLastInteraction)).apply(this, arguments));\n }\n\n _createClass(AutoclickBehaviorLastInteraction, [{\n key: \"onInteraction\",\n value: function onInteraction() {\n this.delayClickthrough(this.getBehaviorDelay());\n }\n }]);\n\n return AutoclickBehaviorLastInteraction;\n}(__WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__[\"a\" /* default */]);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (AutoclickBehaviorLastInteraction);\n\n/***/ }),\n/* 62 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__ = __webpack_require__(8);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__autoclick_utils__ = __webpack_require__(37);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\nvar AutoclickBehaviorLastInteractionAndCount = function (_AutoclickBehaviorAbs) {\n _inherits(AutoclickBehaviorLastInteractionAndCount, _AutoclickBehaviorAbs);\n\n function AutoclickBehaviorLastInteractionAndCount() {\n _classCallCheck(this, AutoclickBehaviorLastInteractionAndCount);\n\n return _possibleConstructorReturn(this, (AutoclickBehaviorLastInteractionAndCount.__proto__ || Object.getPrototypeOf(AutoclickBehaviorLastInteractionAndCount)).apply(this, arguments));\n }\n\n _createClass(AutoclickBehaviorLastInteractionAndCount, [{\n key: \"init\",\n value: function init() {\n this._counter = Object(__WEBPACK_IMPORTED_MODULE_1__autoclick_utils__[\"a\" /* intentionalInteractionCounterFn */])(this.getBehaviorCount());\n }\n }, {\n key: \"onInteraction\",\n value: function onInteraction(e) {\n this.setCurrentCount(this._counter(e));\n\n this.delayClickthrough(this.getBehaviorDelay());\n }\n }]);\n\n return AutoclickBehaviorLastInteractionAndCount;\n}(__WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__[\"a\" /* default */]);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (AutoclickBehaviorLastInteractionAndCount);\n\n/***/ }),\n/* 63 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__ = __webpack_require__(8);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\nvar AutoclickBehaviorLoadDelay = function (_AutoclickBehaviorAbs) {\n _inherits(AutoclickBehaviorLoadDelay, _AutoclickBehaviorAbs);\n\n function AutoclickBehaviorLoadDelay() {\n _classCallCheck(this, AutoclickBehaviorLoadDelay);\n\n return _possibleConstructorReturn(this, (AutoclickBehaviorLoadDelay.__proto__ || Object.getPrototypeOf(AutoclickBehaviorLoadDelay)).apply(this, arguments));\n }\n\n _createClass(AutoclickBehaviorLoadDelay, [{\n key: \"onHtmlLoaded\",\n value: function onHtmlLoaded() {\n this.delayClickthrough(this.getBehaviorDelay());\n }\n }]);\n\n return AutoclickBehaviorLoadDelay;\n}(__WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__[\"a\" /* default */]);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (AutoclickBehaviorLoadDelay);\n\n/***/ }),\n/* 64 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__ = __webpack_require__(8);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\nvar AutoclickBehaviorViewableDelay = function (_AutoclickBehaviorAbs) {\n _inherits(AutoclickBehaviorViewableDelay, _AutoclickBehaviorAbs);\n\n function AutoclickBehaviorViewableDelay() {\n _classCallCheck(this, AutoclickBehaviorViewableDelay);\n\n return _possibleConstructorReturn(this, (AutoclickBehaviorViewableDelay.__proto__ || Object.getPrototypeOf(AutoclickBehaviorViewableDelay)).apply(this, arguments));\n }\n\n _createClass(AutoclickBehaviorViewableDelay, [{\n key: \"onViewable\",\n value: function onViewable() {\n this.delayClickthrough(this.getBehaviorDelay());\n }\n }]);\n\n return AutoclickBehaviorViewableDelay;\n}(__WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__[\"a\" /* default */]);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (AutoclickBehaviorViewableDelay);\n\n/***/ }),\n/* 65 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__ = __webpack_require__(8);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\nvar AutoclickBehaviorViewableDelay = function (_AutoclickBehaviorAbs) {\n _inherits(AutoclickBehaviorViewableDelay, _AutoclickBehaviorAbs);\n\n function AutoclickBehaviorViewableDelay() {\n _classCallCheck(this, AutoclickBehaviorViewableDelay);\n\n return _possibleConstructorReturn(this, (AutoclickBehaviorViewableDelay.__proto__ || Object.getPrototypeOf(AutoclickBehaviorViewableDelay)).apply(this, arguments));\n }\n\n _createClass(AutoclickBehaviorViewableDelay, [{\n key: \"onViewable\",\n value: function onViewable() {\n this.delayClickthrough(this.getBehaviorDelay());\n }\n }, {\n key: \"onViewableChange\",\n value: function onViewableChange(isViewable) {\n if (!isViewable) {\n clearTimeout(this._autoclick._delayTimer);\n }\n }\n }]);\n\n return AutoclickBehaviorViewableDelay;\n}(__WEBPACK_IMPORTED_MODULE_0__AutoclickBehaviorAbstract__[\"a\" /* default */]);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (AutoclickBehaviorViewableDelay);\n\n/***/ }),\n/* 66 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__frontendlib_event_listener__ = __webpack_require__(11);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__lib_click_interaction__ = __webpack_require__(38);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__container__ = __webpack_require__(67);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__cta__ = __webpack_require__(21);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__liftoff_mraid__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__addDeadzones__ = __webpack_require__(39);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n\n\n\n\n\n\n\n\n\nvar Madlib = function () {\n function Madlib() {\n _classCallCheck(this, Madlib);\n }\n\n _createClass(Madlib, null, [{\n key: \"init\",\n value: function init() {\n __WEBPACK_IMPORTED_MODULE_2__frontendlib_event_listener__[\"a\" /* default */].pubsubify(this);\n\n this.rootEl = null;\n this.config = null;\n\n this.loaded = false;\n this.containerByID = {};\n this.allContainers = [];\n this.rootContainer = null;\n\n // TODO(vsingh): Remove hacky global once we are more clear on how Madlib resize events should\n // be handled.\n this.didEverApplyLetterboxStyles = false;\n\n this.productIndex = 0;\n\n this.on(\"navigation-click\", function (queryParams, clickAreaType) {\n Liftoff.handleClick(queryParams, clickAreaType);\n });\n }\n\n /**\n * Returns a product cycling indefinitely.\n */\n\n }, {\n key: \"getNextProduct\",\n value: function getNextProduct() {\n var _Liftoff$env$products = Liftoff.env.products,\n products = _Liftoff$env$products === undefined ? [] : _Liftoff$env$products;\n var productIndex = this.productIndex;\n\n this.productIndex += 1;\n\n return products[productIndex % products.length];\n }\n }, {\n key: \"error\",\n value: function error() {\n var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Error(\"Unspecified Madlib error.\");\n\n Liftoff.handleMadlibError(e);\n }\n }, {\n key: \"load\",\n value: function load(rootEl, config) {\n this.rootEl = rootEl;\n this.config = config;\n this.applyExchangePolicies();\n this.loadDOM();\n this.addEventListeners();\n this.coordinate();\n this.layout();\n\n Liftoff.onLoadCompleted();\n }\n }, {\n key: \"applyExchangePolicies\",\n value: function applyExchangePolicies() {\n var animationDurationLimit = Liftoff.getAnimationDurationLimit();\n if (animationDurationLimit > 0) {\n setTimeout(function () {\n Madlib.allContainers.forEach(function (container) {\n var content = container.content;\n\n if (content == null) return;\n container.layout().then(function () {\n content.stop();\n });\n });\n }, animationDurationLimit);\n }\n }\n }, {\n key: \"loadDOM\",\n value: function loadDOM() {\n var _this = this;\n\n this.layoutEl = document.createElement(\"div\");\n this.layoutEl.id = \"liftoff-layout\";\n this.rootEl.appendChild(this.layoutEl);\n\n this.clickEl = document.createElement(\"div\");\n this.clickEl.id = \"liftoff-click\";\n __WEBPACK_IMPORTED_MODULE_3__lib_click_interaction__[\"a\" /* default */].addListeners(this.clickEl, function (e) {\n _this.handleNavigationClick(e);\n });\n this.rootEl.appendChild(this.clickEl);\n\n var _Liftoff$bidContext = Liftoff.bidContext,\n is_interstitial = _Liftoff$bidContext.is_interstitial,\n is_reengagement = _Liftoff$bidContext.is_reengagement;\n // TODO(oscar): Cleanup test code once crserve-deadzone experiment is over.\n\n var isDeadzoneExperiment = Liftoff.hasTestGroup(\"crserve-deadzone-v2-experiment\");\n var useDeadzones = is_interstitial && (!is_reengagement || isDeadzoneExperiment);\n if (useDeadzones) {\n Object(__WEBPACK_IMPORTED_MODULE_7__addDeadzones__[\"b\" /* default */])(isDeadzoneExperiment, this.rootEl);\n }\n }\n }, {\n key: \"handleNavigationClick\",\n value: function handleNavigationClick(e) {\n var queryParams = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n this.emit(\"navigation-click\", queryParams, Object(__WEBPACK_IMPORTED_MODULE_5__cta__[\"a\" /* clickAreaTypeFromEvent */])(e));\n }\n }, {\n key: \"addEventListeners\",\n value: function addEventListeners() {\n var _this2 = this;\n\n window.addEventListener(\"resize\", function () {\n _this2.layout();\n });\n }\n }, {\n key: \"coordinate\",\n value: function coordinate() {\n this.on(\"wait\", function (_ref) {\n var timeMS = _ref.timeMS;\n\n return new Promise(function (resolve) {\n return setTimeout(resolve, Number(timeMS));\n });\n });\n }\n }, {\n key: \"getEvents\",\n value: function getEvents() {\n return [{ name: \"beforeVisible\" }].map(function (e) {\n e.type = \"madlib\";\n return e;\n });\n }\n }, {\n key: \"getActions\",\n value: function getActions() {\n return [{\n name: \"wait\",\n data: [\"timeMS\"]\n }].map(function (a) {\n a.type = \"madlib\";\n return a;\n });\n }\n }, {\n key: \"getCreativeConfig\",\n value: function getCreativeConfig() {\n // TODO(cory) Implement rendering for multiple scenes. For now, all configs have exactly one scene.\n return this.config.scenes[0].layoutContent;\n }\n }, {\n key: \"configureLetterbox\",\n value: function configureLetterbox(letterboxConfig) {\n var useDarkRootBackground = letterboxConfig.useDarkRootBackground();\n var useLayoutBackground = letterboxConfig.useLayoutBackground();\n\n this.rootEl.classList.toggle(\"letterbox-dark-background\", useDarkRootBackground);\n this.layoutEl.classList.toggle(\"letterbox-layout-background\", useLayoutBackground);\n\n this.didEverApplyLetterboxStyles = true;\n\n Object.assign(this.clickEl.style, letterboxConfig.getStyleForClickElement());\n }\n }, {\n key: \"layout\",\n value: function layout() {\n var _this3 = this;\n\n if (this.rootContainer != null) {\n this.rootContainer.invalidate();\n }\n\n this.reset();\n\n var letterboxConfig = Liftoff.getLetterboxConfig();\n var rootElementConstraints = null;\n\n if (letterboxConfig.enabled()) {\n this.configureLetterbox(letterboxConfig);\n rootElementConstraints = letterboxConfig.getLetterboxConstraintsForMadlibRootElement();\n }\n\n this.parseCreativeConfig(this.layoutEl, this.getCreativeConfig(), rootElementConstraints);\n\n var allContainers = this.allContainers,\n rootContainer = this.rootContainer;\n\n\n var loaded = rootContainer.loadContent().catch(function (e) {\n return _this3.error(e);\n });\n\n var ready = rootContainer.layout().then(function () {\n __WEBPACK_IMPORTED_MODULE_6__liftoff_mraid__[\"a\" /* default */].onViewable(function () {\n if (rootContainer.invalidated) return;\n allContainers.forEach(function (_ref2) {\n var content = _ref2.content;\n\n if (content) content.start();\n });\n });\n }).catch(function (e) {\n return _this3.error(e);\n });\n\n Promise.all([loaded, ready]).then(function () {\n if (!_this3.loaded) {\n _this3.loaded = true;\n Liftoff.onMadlibLoaded();\n _this3.emit(\"beforeVisible\");\n Liftoff.onFirstLayoutFinished();\n }\n });\n }\n }, {\n key: \"reset\",\n value: function reset() {\n this.productIndex = 0;\n // TODO(brian): Teardown existing components here.\n Liftoff.resetClickParams();\n this.clickEl.classList.remove(\"active\");\n Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__[\"empty\"])(this.layoutEl);\n if (this.didEverApplyLetterboxStyles) {\n [this.layoutEl, this.clickEl].forEach(function (el) {\n [\"left\", \"top\", \"width\", \"height\", \"right\", \"bottom\", \"transform\"].forEach(function (prop) {\n el.style[prop] = \"\";\n });\n });\n }\n }\n }, {\n key: \"parseCreativeConfig\",\n value: function parseCreativeConfig(rootEl, config, rootElementConstraints) {\n var _this4 = this;\n\n var componentParams = config.componentParams;\n\n var clickTargets = config.clickTargets,\n constraints = config.constraints,\n containers = config.containers,\n coordination = config.coordination,\n css = config.css;\n\n var _ref3 = rootElementConstraints || {},\n rootConstraints = _ref3.rootConstraints,\n rootPostLayoutTransform = _ref3.rootPostLayoutTransform;\n\n var traverse = function traverse(parent, _ref4) {\n var id = _ref4.id,\n children = _ref4.children;\n\n var container = new __WEBPACK_IMPORTED_MODULE_4__container__[\"a\" /* default */](document.createElement(\"div\"), id);\n container.parent = parent;\n container.children = (children || []).map(traverse.bind(null, container));\n container.css = css[id];\n container.constraints = constraints[id];\n if (componentParams[id] != null) {\n var _componentParams$id = componentParams[id],\n component = _componentParams$id.component,\n params = _componentParams$id.params;\n\n var subcomponents = [];\n var fixValues = function fixValues(params) {\n Object.keys(params).forEach(function (key) {\n var _params$key = params[key],\n type = _params$key.type,\n value = _params$key.value;\n\n if (value != null) {\n switch (type) {\n case \"array\":\n params[key].value = value.map(fixValues);\n break;\n case \"image_original\":\n case \"video_original\":\n params[key].value = Liftoff.resolveAsset(type, value);\n break;\n case \"component\":\n var componentName = value.component;\n var _componentParams = fixValues(Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"clone\"])(value.params));\n var _component = Liftoff.Component.new(componentName, _componentParams);\n params[key].value = _component;\n subcomponents.push(_component);\n break;\n }\n }\n\n params[key] = params[key].value;\n });\n return params;\n };\n\n params = fixValues(Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"clone\"])(params));\n container.content = Liftoff.Component.new(component, params);\n container.content.on(\"error\", _this4.error.bind(_this4));\n // Errors from all subcomponents, regardless of nesting depth, are\n // relayed directly to the top-level component.\n subcomponents.forEach(function (subcomponent) {\n return subcomponent.relay(container.content, \"error\");\n });\n }\n\n _this4.containerByID[id] = container;\n _this4.allContainers.push(container);\n return container;\n };\n\n this.containerByID = {};\n this.allContainers = [];\n this.rootContainer = new __WEBPACK_IMPORTED_MODULE_4__container__[\"a\" /* default */](rootEl);\n this.rootContainer.parent = new __WEBPACK_IMPORTED_MODULE_4__container__[\"a\" /* default */](rootEl.parentNode);\n this.rootContainer.children = containers.map(traverse.bind(null, this.rootContainer));\n this.rootContainer.css = { overflow: \"hidden\" };\n this.rootContainer.constraints = rootConstraints || {\n width: \"100%\",\n height: \"100%\"\n };\n this.rootContainer.postLayoutTransform = rootPostLayoutTransform;\n\n this.attachAnchors();\n this.configureCoordination(coordination);\n this.configureClickTargets(clickTargets);\n\n this.rootContainer.layout();\n }\n }, {\n key: \"attachAnchors\",\n value: function attachAnchors() {\n var _this5 = this;\n\n this.allContainers.forEach(function (container) {\n if (container.constraints == null) return;\n container.anchors = [\"top\", \"right\", \"bottom\", \"left\"].filter(function (edge) {\n return Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"type\"])(container.constraints[edge]) === \"object\";\n }).map(function (edge) {\n return {\n edge: edge,\n anchor: _this5.containerByID[container.constraints[edge].anchor]\n };\n });\n });\n }\n\n // Link events with actions.\n\n }, {\n key: \"configureCoordination\",\n value: function configureCoordination(coordination) {\n var _this6 = this;\n\n coordination.filter(function (_ref5) {\n var event = _ref5.event;\n return event.name != null;\n }).forEach(function (_ref6) {\n var event = _ref6.event,\n actions = _ref6.actions;\n var eventName = event.name,\n eventType = event.type,\n source = event.source,\n eventMacros = event.data;\n\n\n var actors = actions.map(function (action) {\n var actionName = action.name,\n actionType = action.type,\n target = action.target,\n actionMacros = action.data;\n\n var actor = void 0;\n switch (actionType) {\n case \"madlib\":\n actor = _this6;\n break;\n case \"component\":\n actor = _this6.containerByID[target].content;\n break;\n case \"container\":\n actor = _this6.containerByID[target];\n break;\n }\n\n return { actionName: actionName, actor: actor, actionMacros: actionMacros };\n }).filter(function (_ref7) {\n var actionName = _ref7.actionName;\n return actionName != null;\n });\n\n var emitter = void 0;\n switch (eventType) {\n case \"madlib\":\n emitter = _this6;\n break;\n case \"component\":\n emitter = _this6.containerByID[source].content;\n break;\n case \"container\":\n emitter = _this6.containerByID[source];\n break;\n }\n\n var getMacroValues = function getMacroValues(eventPayload) {\n var macroValues = {};\n Object.keys(eventMacros).forEach(function (key) {\n var macro = eventMacros[key];\n macroValues[macro] = eventPayload[key];\n });\n\n return macroValues;\n };\n\n var expandMacros = function expandMacros(macroValues, actionMacros) {\n var actionPayload = {};\n Object.keys(actionMacros).forEach(function (key) {\n var expansion = Object.keys(macroValues).reduce(function (s, macro) {\n // TODO(oscar): Tokenize macro better.\n s = s == null ? \"\" : s;\n var r = Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"escapeRegExp\"])(macro);\n var sub = macroValues[macro] == null ? \"\" : String(macroValues[macro]);\n return s.replace(new RegExp(r, \"g\"), sub);\n }, actionMacros[key]);\n\n actionPayload[key] = expansion;\n });\n\n return actionPayload;\n };\n\n var processEventPayload = function processEventPayload(eventPayload, actionMacros) {\n return expandMacros(getMacroValues(eventPayload), actionMacros);\n };\n\n var dispatchActions = function dispatchActions() {\n var eventPayload = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n // \"Waterfall\" the `.emit` Promises to process them serially.\n return actors.reduce(function (promise, _ref8) {\n var actionName = _ref8.actionName,\n actor = _ref8.actor,\n actionMacros = _ref8.actionMacros;\n\n var data = processEventPayload(eventPayload, actionMacros);\n return promise.then(function () {\n return actor.emit(actionName, data);\n });\n }, Promise.resolve()).catch(function (e) {\n return _this6.error(e);\n });\n };\n\n emitter.on(eventName, dispatchActions);\n });\n }\n\n // Setup click listeners.\n\n }, {\n key: \"configureClickTargets\",\n value: function configureClickTargets(clickTargets) {\n var _this7 = this;\n\n if (clickTargets.length > 0) {\n clickTargets.forEach(function (id) {\n __WEBPACK_IMPORTED_MODULE_3__lib_click_interaction__[\"a\" /* default */].addListeners(_this7.containerByID[id].el, function (e) {\n _this7.handleNavigationClick(e);\n });\n });\n }\n // tre HTML endcards have their own way of handling click events.\n else if (!window.Liftoff.env.is_tre || !window.TreSensa) {\n this.clickEl.classList.add(\"active\");\n }\n }\n }]);\n\n return Madlib;\n}();\n\nMadlib.init();\n\nMadlib.ClickInteraction = __WEBPACK_IMPORTED_MODULE_3__lib_click_interaction__[\"a\" /* default */];\n\nwindow.Madlib = Madlib;\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (Madlib);\n\n/***/ }),\n/* 67 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__frontendlib_event_listener__ = __webpack_require__(11);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\n\nvar EDGE_TO_TYPE = {\n left: \"leading\",\n right: \"trailing\",\n top: \"leading\",\n bottom: \"trailing\"\n};\nvar EDGE_TO_DIMENSION = {\n left: \"width\",\n right: \"width\",\n top: \"height\",\n bottom: \"height\"\n};\n\n// We currently require CTA containers to be prefixed with \"CTA\", but we're\n// more liberal here to support some legacy templates.\nvar ctaContainerRegex = /\\bcta\\b/i;\nvar isCTAContainer = function isCTAContainer(containerID) {\n return ctaContainerRegex.test(containerID);\n};\n\nvar Container = function (_EventListener) {\n _inherits(Container, _EventListener);\n\n _createClass(Container, null, [{\n key: \"getEvents\",\n value: function getEvents() {\n return [{ name: \"beforeLayout\", system: true }, { name: \"onClick\" }].map(function (e) {\n e.type = \"container\";\n return e;\n });\n }\n }, {\n key: \"getActions\",\n value: function getActions() {\n return [{ name: \"show\" }, { name: \"hide\" }].map(function (a) {\n a.type = \"container\";\n return a;\n });\n }\n\n /** @param {HTMLDivElement} el - The container element. */\n\n }]);\n\n function Container(el) {\n var id = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"\";\n\n _classCallCheck(this, Container);\n\n var _this = _possibleConstructorReturn(this, (Container.__proto__ || Object.getPrototypeOf(Container)).call(this));\n\n _this.el = el;\n _this.el.classList.add(\"madlib-container\");\n if (isCTAContainer(id)) {\n // We tag CTA containers to help us detect when clicks occur on CTAs.\n _this.el.classList.add(\"cta-container\");\n }\n // `parent` and `children` refer to other Containers.\n _this.parent = null;\n _this.children = [];\n\n _this.fixedWidth = false;\n _this.fixedHeight = false;\n\n _this.css = null;\n _this.constraints = null;\n _this.anchors = [];\n _this.content = null;\n\n _this.layoutReady = null;\n _this.contentReady = null;\n _this.hidden = false;\n\n _this.postLayoutTransform = null;\n\n _this.addEventListeners();\n _this.coordinate();\n return _this;\n }\n\n _createClass(Container, [{\n key: \"addEventListeners\",\n value: function addEventListeners() {\n var _this2 = this;\n\n this.el.addEventListener(\"click\", function () {\n return _this2.emit(\"onClick\");\n });\n }\n }, {\n key: \"coordinate\",\n value: function coordinate() {\n var _this3 = this;\n\n this.on({\n hide: function hide() {\n Object.assign(_this3.el.style, {\n pointerEvents: \"none\",\n visibility: \"hidden\"\n });\n },\n show: function show() {\n Object.assign(_this3.el.style, {\n pointerEvents: _this3.css && _this3.css[\"pointer-events\"] || \"auto\",\n visibility: _this3.css && _this3.css.visibility || \"visible\"\n });\n }\n });\n }\n }, {\n key: \"loadContent\",\n value: function loadContent() {\n if (this.contentReady == null) {\n var promises = this.children.map(function (child) {\n return child.loadContent();\n });\n if (this.content != null) {\n promises.push(this.content.load());\n }\n\n this.contentReady = Promise.all(promises);\n }\n\n return this.contentReady;\n }\n }, {\n key: \"layout\",\n value: function layout() {\n var _this4 = this;\n\n if (this.layoutReady == null) {\n // NOTE(oscar): beforeLayout should probably only trigger at most once per\n // container.\n this.emit(\"beforeLayout\");\n }\n if (this.layoutReady == null) {\n if (this.el.parentNode !== this.parent.el) {\n this.parent.el.appendChild(this.el);\n }\n\n if (this.constraints != null) {\n if (this.constraints.left != null && this.constraints.right != null || this.constraints.width != null) {\n this.fixedWidth = true;\n }\n\n if (this.constraints.top != null && this.constraints.bottom != null || this.constraints.height != null) {\n this.fixedHeight = true;\n }\n }\n\n // The child components do not layout properly if a transform is active.\n // So, let's reset the transform before we proceed, then apply it later.\n this.resetTransform();\n\n this.style();\n this.position();\n this.layoutReady = this.loadContent().then(function () {\n return _this4.anchor();\n }).then(function () {\n return _this4.match();\n }).then(function () {\n return _this4.layoutContent();\n }).then(function () {\n return _this4.center();\n }).then(function () {\n return _this4.applyTransform();\n });\n }\n\n return this.layoutReady;\n }\n }, {\n key: \"style\",\n value: function style() {\n // The zIndex creates a stacking context for the contents of the container\n // element so that they don't interfere with other containers.\n Object.assign(this.el.style, { zIndex: 1 }, this.css);\n }\n }, {\n key: \"position\",\n value: function position() {\n var _this5 = this;\n\n if (this.constraints == null) return;\n var styles = { position: \"absolute\" };\n [\"top\", \"bottom\", \"left\", \"right\", \"width\", \"height\"].forEach(function (prop) {\n var value = _this5.constraints[prop];\n if (value != null && Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"type\"])(value) !== \"object\") {\n styles[prop] = value;\n }\n });\n Object.assign(this.el.style, styles);\n }\n }, {\n key: \"resetTransform\",\n value: function resetTransform() {\n if (this.postLayoutTransform != null) {\n this.el.style.transform = \"none\";\n }\n }\n }, {\n key: \"applyTransform\",\n value: function applyTransform() {\n if (this.postLayoutTransform != null) {\n this.el.style.transform = this.postLayoutTransform;\n }\n }\n }, {\n key: \"anchor\",\n value: function anchor() {\n var _this6 = this;\n\n var pRect = void 0;\n var promises = this.anchors.map(function (_ref) {\n var containerEdge = _ref.edge,\n anchor = _ref.anchor;\n var _constraints$containe = _this6.constraints[containerEdge],\n distance = _constraints$containe.distance,\n anchorEdge = _constraints$containe.edge;\n\n var containerEdgeType = EDGE_TO_TYPE[containerEdge];\n var anchorEdgeType = EDGE_TO_TYPE[anchorEdge];\n var dimension = EDGE_TO_DIMENSION[containerEdge];\n // Block positioning until the anchor is ready.\n return anchor.layout().then(function () {\n if (pRect == null) {\n pRect = _this6.parent.el.getBoundingClientRect();\n }\n\n var rect = Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__[\"getRelativeBoundingClientRect\"])(anchor.el);\n var offset = void 0;\n switch (containerEdgeType + \" \" + anchorEdgeType) {\n case \"leading leading\":\n offset = rect[anchorEdge];\n break;\n case \"trailing trailing\":\n offset = -rect[anchorEdge];\n break;\n case \"leading trailing\":\n offset = pRect[dimension] + rect[anchorEdge];\n break;\n case \"trailing leading\":\n offset = pRect[dimension] - rect[anchorEdge];\n break;\n }\n\n var _parseCSSLength = Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__[\"parseCSSLength\"])(distance),\n value = _parseCSSLength.value,\n units = _parseCSSLength.units;\n\n switch (units) {\n case \"px\":\n offset += value;\n break;\n case \"%\":\n offset += pRect[dimension] * value / 100;\n break;\n }\n\n _this6.el.style[containerEdge] = offset + \"px\";\n });\n });\n return Promise.all(promises);\n }\n }, {\n key: \"match\",\n value: function match() {\n if (this.constraints == null || !(this.constraints.matchWidthToHeight || this.constraints.matchHeightToWidth)) {\n return;\n }\n\n var _el$getBoundingClient = this.el.getBoundingClientRect(),\n width = _el$getBoundingClient.width,\n height = _el$getBoundingClient.height;\n\n if (this.constraints.matchWidthToHeight) {\n this.el.style.width = height + \"px\";\n } else if (this.constraints.matchHeightToWidth) {\n this.el.style.height = width + \"px\";\n }\n }\n }, {\n key: \"layoutContent\",\n value: function layoutContent() {\n var _this7 = this;\n\n if (this.invalidated) return;\n\n var promises = this.children.map(function (child) {\n return child.layout();\n });\n if (this.content != null) {\n promises.push(this.content.layout(this.el));\n }\n\n return Promise.all(promises).then(function () {\n // For containers that serve as wrappers for other containers (i.e. do not\n // have content), calculate the aggregate bounding rectangle for all\n // children and resize the container to match the rectangle. This allows\n // centering to work properly.\n if (_this7.content != null || _this7.fixedWidth && _this7.fixedHeight) return;\n var rect = Object(__WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__[\"getAggregateBoundingClientRect\"])(_this7.children.map(function (child) {\n return child.el;\n }));\n var style = {};\n if (!_this7.fixedWidth) {\n style.width = rect.width + \"px\";\n }\n\n if (!_this7.fixedHeight) {\n style.height = rect.height + \"px\";\n }\n\n Object.assign(_this7.el.style, style);\n });\n }\n }, {\n key: \"center\",\n value: function center() {\n if (this.constraints == null || !(this.constraints.centerHorizontal || this.constraints.centerVertical)) {\n return;\n }\n\n var pRect = this.parent.el.getBoundingClientRect();\n var rect = this.el.getBoundingClientRect();\n if (this.constraints.centerHorizontal) {\n this.el.style.left = (pRect.width - rect.width) / 2 + \"px\";\n }\n\n if (this.constraints.centerVertical) {\n this.el.style.top = (pRect.height - rect.height) / 2 + \"px\";\n }\n }\n }, {\n key: \"invalidate\",\n value: function invalidate() {\n this.invalidated = true;\n\n // NOTE(vsingh):\n // The following is a hack on top of a hack. We invalidate containers when\n // resetting layout, so that any asynchronous process kicked off\n // by those containers will have no further effect.\n // Unfortunately the invalidation hack has holes: there are still\n // cases where side effects are applied to the DOM element\n // associated with the container. Therefore, dissociate the\n // container and the DOM element immediately upon container\n // invalidation.\n this.el = document.createElement(\"div\");\n }\n }]);\n\n return Container;\n}(__WEBPACK_IMPORTED_MODULE_2__frontendlib_event_listener__[\"a\" /* default */]);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Container);\n\n/***/ }),\n/* 68 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__ = __webpack_require__(0);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n\nvar TEMPLATE = \"<div class=\\\"last-chance-endscreen\\\">\\n <svg class=\\\"back-cta-icon hidden\\\" width=\\\"24px\\\" height=\\\"24px\\\" fill=\\\"white\\\">\\n <path d=\\\"M12 17.414 3.293 8.707l1.414-1.414L12 14.586l7.293-7.293 1.414 1.414L12 17.414z\\\"/>\\n </svg>\\n <div class=\\\"last-chance-endscreen-container\\\">\\n <div class=\\\"inner-container hidden\\\">\\n <img class=\\\"last-chance-logo\\\" />\\n <div class=\\\"icon-container\\\"></div>\\n <div class=\\\"caption\\\"></div>\\n <a class=\\\"liftoff-link liftoff-cta\\\">\\n <img />\\n <div class=\\\"common-cta\\\"></div>\\n </a>\\n </div>\\n </div>\\n</div>\";\n\n/**\n * @typedef AppStoreData\n * @property {string} icon - application icon.\n * @property {string} name - application name.\n * @property {string} company - application company/developer.\n * @property {number} rating - application rating on Google Play store.\n * @property {number} rating_count - number of times the app has been rated on\n * the Google Play store.\n * @property {string | number} download_count - number of times the app has been\n * downloaded from the Google Play store.\n * @property {string} content_rating - app content rating on the Google Play\n * store.\n * @property {string} screenshots - screenshots available for the app.\n * @property {string} description - app description.\n */\n\n/**\n * Creates a Liftoff Last Chance Endscreen component which is displayed to the\n * user as an overlay HTML endscreen.\n *\n * @see https://docs.google.com/presentation/d/15EUBJUVXP2DpFbkA3hB0yE8z-iEy6C1I5tlZ-1h-jBw/edit?usp=sharing\n */\n\nvar LastChanceEndscreen = function () {\n /**\n *\n * @param {AppStoreData} appStoreData\n * @param {Object} parentEl\n * @param {function} handleClick\n * @param {boolean} validateUserClick - if true then CTA is only triggered if\n * click is invoked by the user and not programmatically.\n * @param {Object} env\n */\n function LastChanceEndscreen(appStoreData, parentEl, handleClick) {\n var validateUserClick = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var env = arguments[4];\n\n _classCallCheck(this, LastChanceEndscreen);\n\n this.appStoreData = appStoreData;\n this.parentEl = parentEl;\n this.el = __WEBPACK_IMPORTED_MODULE_0__frontendlib_dom_utils__[\"strToElement\"](TEMPLATE);\n this.handleClick = handleClick;\n this.validateUserClick = validateUserClick;\n this.env = env;\n this.ctaText = env.cta_text || \"INSTALL\";\n this.autoEndCardCallCount = 0;\n this.timeout = null;\n\n if (this.parentEl == null) {\n console.error(\"Last chance endscreen was created without a parent container\");\n }\n // Load app icon when the Liftoff Last Chance Endscreen instance is created.\n this.images = this.loadImages([this.appStoreData.icon]);\n }\n\n _createClass(LastChanceEndscreen, [{\n key: \"loadImages\",\n value: function loadImages(imagePaths) {\n return __WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"loadImages\"](imagePaths);\n }\n }, {\n key: \"prepareAutoEndcard\",\n value: function prepareAutoEndcard() {\n var _this = this;\n\n this.el.querySelector(\".caption\").innerHTML = this.appStoreData.name;\n this.el.querySelector(\".common-cta\").innerHTML = this.ctaText.toUpperCase();\n // Show all elements in the LO last chance endscreen after app icon is\n // loaded on the browser.\n this.images.then(function (values) {\n values.forEach(function (img) {\n img.classList.add(\"icon\");\n _this.el.querySelector(\".icon-container\").appendChild(img);\n });\n }).catch(function (error) {\n console.error(\"Error while rendering app icon: \" + error.message);\n }).finally(function () {\n // This will run on success or error.\n _this.el.querySelector(\".inner-container\").classList.remove(\"hidden\");\n });\n\n this.parentEl.appendChild(this.el);\n }\n }, {\n key: \"showAutoEndcard\",\n value: function showAutoEndcard() {\n if (this.env.has_html_endscreen) {\n if (this.env.platform) {\n // For adding iOS/Android specific styles on the AutoEndcard\n this.el.closest(\"#liftoff-snippet\").classList.add(this.env.platform);\n }\n\n this.el.querySelector(\".back-cta-icon\").classList.remove(\"hidden\");\n this.el.classList.add(\"rolling-up-animation\");\n }\n }\n }, {\n key: \"initAutoEndcard\",\n value: function initAutoEndcard() {\n if (this.wasShown) return;\n this.wasShown = true;\n this.prepareAutoEndcard();\n this.showAutoEndcard();\n this.initializeEvents();\n }\n }, {\n key: \"initializeEvents\",\n value: function initializeEvents() {\n var _this2 = this;\n\n var touchstart = 0;\n\n // Fire CTA if user clicks anywhere on the screen.\n this.el.addEventListener(\"click\", function (e) {\n if (!e.target.closest(\".back-cta-icon\")) {\n var triggerCTA = _this2.validateUserClick ? e.isTrusted : true;\n if (triggerCTA) {\n _this2.handleClick(!_this2.useInteractionMonitor ? e : _this2._lastInteraction);\n }\n }\n });\n\n this.el.querySelector(\".back-cta-icon\").addEventListener(\"click\", function () {\n _this2.el.classList.add(\"rolling-down-animation\");\n });\n\n this.el.addEventListener(\"touchstart\", function (e) {\n touchstart = e.changedTouches[0].screenY;\n });\n\n this.el.addEventListener(\"touchend\", function (e) {\n // Adding 70px buffer to avoid accidental taps on screen\n if (e.changedTouches[0].screenY > touchstart + 70) {\n _this2.el.classList.add(\"rolling-down-animation\");\n }\n });\n }\n }]);\n\n return LastChanceEndscreen;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (LastChanceEndscreen);\n\n/***/ }),\n/* 69 */,\n/* 70 */,\n/* 71 */,\n/* 72 */,\n/* 73 */,\n/* 74 */,\n/* 75 */,\n/* 76 */,\n/* 77 */,\n/* 78 */,\n/* 79 */,\n/* 80 */,\n/* 81 */,\n/* 82 */,\n/* 83 */,\n/* 84 */,\n/* 85 */,\n/* 86 */,\n/* 87 */,\n/* 88 */,\n/* 89 */,\n/* 90 */,\n/* 91 */,\n/* 92 */,\n/* 93 */,\n/* 94 */,\n/* 95 */,\n/* 96 */,\n/* 97 */,\n/* 98 */,\n/* 99 */,\n/* 100 */,\n/* 101 */,\n/* 102 */,\n/* 103 */,\n/* 104 */,\n/* 105 */,\n/* 106 */,\n/* 107 */,\n/* 108 */,\n/* 109 */,\n/* 110 */,\n/* 111 */,\n/* 112 */,\n/* 113 */,\n/* 114 */,\n/* 115 */,\n/* 116 */,\n/* 117 */,\n/* 118 */,\n/* 119 */,\n/* 120 */,\n/* 121 */,\n/* 122 */,\n/* 123 */,\n/* 124 */,\n/* 125 */,\n/* 126 */,\n/* 127 */,\n/* 128 */,\n/* 129 */,\n/* 130 */,\n/* 131 */,\n/* 132 */,\n/* 133 */,\n/* 134 */,\n/* 135 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(136);\nmodule.exports = __webpack_require__(140);\n\n\n/***/ }),\n/* 136 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__component__ = __webpack_require__(137);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__creative_utils__ = __webpack_require__(36);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__click_handling__ = __webpack_require__(56);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__liftoff_mraid__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__interaction_monitor__ = __webpack_require__(57);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__letterbox_config__ = __webpack_require__(138);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__logger__ = __webpack_require__(6);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__window_resize_logger__ = __webpack_require__(139);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__constants__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__frontendlib_dom_utils__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__frontendlib_utils__ = __webpack_require__(0);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__cta__ = __webpack_require__(21);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__adexp__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__autoclick_Autoclick__ = __webpack_require__(58);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__madlib__ = __webpack_require__(66);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__lib_last_chance_endscreen_last_chance_endscreen__ = __webpack_require__(68);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__csp_env_messages__ = __webpack_require__(22);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * NOTE(oscar): After 3 seconds, log what mraid methods/events have been\n * supported. This should be right before users typically close the ad\n * which should give enough time to check what events have triggered or\n * methods used.\n */\nvar logMraidSupport = function logMraidSupport() {\n setTimeout(function () {\n __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */].recordLog(\"mraid\",\n // TODO(oscar): Use the data param once adexp logs can save it.\n JSON.stringify(Object.assign({\n tag: \"mraidSupport\"\n }, __WEBPACK_IMPORTED_MODULE_3__liftoff_mraid__[\"a\" /* default */].getSupportedLog())));\n }, 3000);\n};\n\n/**\n * Function used to handle auto-endcard interaction event from TreSensa\n * creatives made from the \"tresensa-snippet\" Madlib component.\n * @param {*} e\n * @param {*} autoEndcard\n * @param {*} lastChanceEndscreenAutoclick\n * @param {*} lastChanceEndscreenInteractionAutoclick\n * TODO(luis): We need to integrate TreSensa interaction events with the\n * InteractionMonitor class.\n */\nvar onTreSensaInteraction = function onTreSensaInteraction(e, autoEndcard, lastChanceEndscreenAutoclick, lastChanceEndscreenInteractionAutoclick, vxInteractionListeners) {\n if (e.data === __WEBPACK_IMPORTED_MODULE_16__csp_env_messages__[\"m\" /* MESSAGE_TRESENSA_INTERACTION */]) {\n if (lastChanceEndscreenAutoclick) {\n lastChanceEndscreenAutoclick.disable();\n }\n // TODO(Luis): This is a temporary fix to handle the case where the\n // interaction event is triggered from a TreSensa wrapped 3p.\n // Eventually this needs to be deleted and updated so that a\n // tre_interaction event does trigger a global interaction that can be\n // detected by the AutoClick interaction behaviour.\n if (autoEndcard && lastChanceEndscreenInteractionAutoclick && lastChanceEndscreenInteractionAutoclick._behavior && lastChanceEndscreenInteractionAutoclick._behavior.delay) {\n // Display auto-endcard after a delay on interaction.\n setTimeout(function () {\n autoEndcard.initAutoEndcard();\n }, lastChanceEndscreenInteractionAutoclick._behavior.delay);\n }\n\n // NOTE(Sangeeth): The onTreSensaInteraction handler is only called for\n // tresensa client wrapped playables. These playables run inside an iframe\n // so we can't detect interaction events for them through the interaction\n // monitor.\n vxInteractionListeners.forEach(function (cb) {\n return cb();\n });\n }\n};\n\nvar Liftoff = function () {\n function Liftoff() {\n _classCallCheck(this, Liftoff);\n }\n\n _createClass(Liftoff, null, [{\n key: \"init\",\n value: function init(env, assets) {\n var _this = this;\n\n var trackingTags = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];\n\n try {\n /** TODO(oscar): Consider logging MRAID support for CSP creatives. */\n logMraidSupport();\n\n if (trackingTags != null) {\n __WEBPACK_IMPORTED_MODULE_3__liftoff_mraid__[\"a\" /* default */].onViewable(function () {\n var trackingTagHolder = document.getElementById(\"tracking-tag-holder\");\n __WEBPACK_IMPORTED_MODULE_9__frontendlib_dom_utils__[\"appendImpressionTags\"](trackingTagHolder, trackingTags);\n });\n }\n\n this.env = env;\n this.populateAppStoreData();\n // The bid context is often used, giving it an alias saves characters and lines of this JS.\n this.bidContext = env.bid_context;\n this.assets = assets;\n this.testGroups = {};\n this.bidContext.ab_tests.forEach(function (group) {\n _this.testGroups[group] = true;\n });\n this.lastClickMetric = null;\n this.resetClickParams();\n this.interactionMonitor = new __WEBPACK_IMPORTED_MODULE_4__interaction_monitor__[\"a\" /* InteractionMonitor */]();\n this.vxInteractionListeners = [];\n this.interactionMonitor.onInteractionChange(function (e) {\n _this.vxInteractionListeners.forEach(function (cb) {\n return cb(e);\n });\n _this._autoclickBus.forEach(function (ac) {\n return ac.emitInteractionEvent(e);\n });\n });\n\n this.snippetEl = null;\n this.updateMRAID();\n this.loadDOM();\n this.loadLogger();\n this.initAutoclickBehaviors();\n __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */].recordMetricV2(\"initial_load_count\", 1);\n this.applyPolicy();\n this.windowResizeLogger = new __WEBPACK_IMPORTED_MODULE_7__window_resize_logger__[\"a\" /* default */](this.snippetEl, this.env.enable_logging);\n this.addEventListeners();\n this.madlibLoaded = false;\n this.useAutoendcardBehaviour = null;\n\n __WEBPACK_IMPORTED_MODULE_3__liftoff_mraid__[\"a\" /* default */].on(\"error\", function (e) {\n return __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */].recordError(e);\n });\n } catch (e) {\n __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */].recordError(e);\n }\n }\n }, {\n key: \"populateAppStoreData\",\n value: function populateAppStoreData() {\n if (!this.env.app_store_data) {\n try {\n if (window.parent.VungleHelper) {\n var tokens = window.parent.VungleHelper.tokens;\n if (tokens) {\n this.env.app_store_data = {\n icon: tokens.APP_ICON,\n name: tokens.APP_NAME,\n description: tokens.APP_DESCRIPTION,\n rating: tokens.APP_STORE_RATING\n };\n }\n }\n } catch (error) {\n console.error(\"Error occurred:\", error.message);\n }\n }\n }\n }, {\n key: \"initAutoclickBehaviors\",\n value: function initAutoclickBehaviors() {\n var _this2 = this;\n\n this._autoclickBus = [];\n __WEBPACK_IMPORTED_MODULE_3__liftoff_mraid__[\"a\" /* default */].on(\"clickMethodTried\", function (_ref) {\n var clickOpenMethod = _ref.clickOpenMethod,\n isAutoclick = _ref.isAutoclick;\n\n if (isAutoclick && clickOpenMethod === __WEBPACK_IMPORTED_MODULE_8__constants__[\"t\" /* CLICK_OPEN_METHOD_MRAID */]) {\n __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */].recordMetricV2(\"mraid_autoclick_fired_ms\", Date.now() - LIFTOFF_START_TS);\n }\n });\n\n this._viewclick = new __WEBPACK_IMPORTED_MODULE_13__autoclick_Autoclick__[\"a\" /* default */](this.bidContext.viewclick_behavior, {\n clickthroughHandler: function clickthroughHandler(lastEvent) {\n return _this2.handleClick({\n mac: 1\n }, Object(__WEBPACK_IMPORTED_MODULE_11__cta__[\"a\" /* clickAreaTypeFromEvent */])({\n clientX: lastEvent == null ? null : lastEvent.lastInteraction.startX,\n clientY: lastEvent == null ? null : lastEvent.lastInteraction.startY\n }));\n }\n });\n this._autoclickBus.push(this._viewclick);\n\n // We store app store data in this variable for reusability.\n var appStoreData = this.env.app_store_data;\n\n var autoEndcard = void 0;\n // Only initialize autoEndcard if there is app store data in the bid context.\n if (appStoreData) {\n autoEndcard = new __WEBPACK_IMPORTED_MODULE_15__lib_last_chance_endscreen_last_chance_endscreen__[\"a\" /* default */](appStoreData, this.snippetEl, function (e) {\n __WEBPACK_IMPORTED_MODULE_14__madlib__[\"default\"].handleNavigationClick(e, {\n ae: 1\n });\n }, this.bidContext.exchange === \"inmobi\", this.env);\n }\n\n this.useAutoendcardBehaviour = this.bidContext.last_chance_endscreen_autoclick_behavior;\n\n // If exchange is mintegral then only display the auto endcard on delay if\n // platform is ios.\n if (this.useAutoendcardBehaviour && (this.bidContext.exchange != \"mintegral\" || this.bidContext.platform === \"ios\")) {\n this._lastChanceEndscreenAutoclick = new __WEBPACK_IMPORTED_MODULE_13__autoclick_Autoclick__[\"a\" /* default */](this.useAutoendcardBehaviour, {\n clickthroughHandler: function clickthroughHandler() {\n if (autoEndcard) {\n autoEndcard.initAutoEndcard();\n }\n }\n });\n this._autoclickBus.push(this._lastChanceEndscreenAutoclick);\n }\n\n this._lastChanceEndscreenInteractionAutoclick = new __WEBPACK_IMPORTED_MODULE_13__autoclick_Autoclick__[\"a\" /* default */](this.bidContext.last_chance_endscreen_interaction_autoclick_behavior, {\n clickthroughHandler: function clickthroughHandler() {\n if (autoEndcard) {\n autoEndcard.initAutoEndcard();\n }\n }\n });\n this._autoclickBus.push(this._lastChanceEndscreenInteractionAutoclick);\n /**\n * Handle cases where the interaction event is triggered from the\n * \"tresensa-snippet\" Madlib component.\n */\n window.addEventListener(\"message\", function (e) {\n onTreSensaInteraction(e, autoEndcard, _this2._lastChanceEndscreenAutoclick, _this2._lastChanceEndscreenInteractionAutoclick, _this2.vxInteractionListeners);\n }, true);\n }\n }, {\n key: \"setInteractionPromptReached\",\n value: function setInteractionPromptReached(e) {\n this._autoclickBus.forEach(function (ac) {\n return ac.emitInteractionPromptReachedEvent(e);\n });\n }\n }, {\n key: \"getAnimationDurationLimit\",\n value: function getAnimationDurationLimit() {\n return this.env.creative_policy.animation_duration_limit;\n }\n }, {\n key: \"handleMadlibError\",\n value: function handleMadlibError(e) {\n __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */].recordError(e);\n }\n }, {\n key: \"hasTestGroup\",\n value: function hasTestGroup(group) {\n return !!this.testGroups[group];\n }\n }, {\n key: \"isExchange\",\n value: function isExchange(exchange) {\n return this.bidContext.exchange.toLowerCase() === exchange.toLowerCase();\n }\n }, {\n key: \"updateMRAID\",\n value: function updateMRAID() {\n if (this.bidContext.is_interstitial) {\n var _bidContext = this.bidContext,\n width = _bidContext.width,\n height = _bidContext.height;\n\n __WEBPACK_IMPORTED_MODULE_3__liftoff_mraid__[\"a\" /* default */].lockOrientation(width < height ? \"portrait\" : \"landscape\");\n }\n }\n }, {\n key: \"loadLogger\",\n value: function loadLogger() {\n var _env = this.env,\n enableLogging = _env.enable_logging,\n enableHtmlReturn = _env.enable_html_return,\n endpoint = _env.logging_endpoint,\n trackingParam = _env.event_tracking_param,\n delay = _env.html_return_delay;\n\n\n __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */].passContext(endpoint, trackingParam, Object(__WEBPACK_IMPORTED_MODULE_12__adexp__[\"e\" /* getAdexpContextSnapshotFn */])(this.snippetEl, function () {\n return __WEBPACK_IMPORTED_MODULE_3__liftoff_mraid__[\"a\" /* default */].hasSupport(\"mraid\");\n }));\n\n if (!enableLogging) {\n return;\n }\n\n __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */].enable();\n __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */].addErrorListeners();\n\n if (!enableHtmlReturn) {\n return;\n }\n __WEBPACK_IMPORTED_MODULE_1__creative_utils__[\"b\" /* configureHTMLReturn */](endpoint, delay);\n }\n }, {\n key: \"loadDOM\",\n value: function loadDOM() {\n var _snippetEl$classList;\n\n this.snippetEl = document.createElement(\"div\");\n this.snippetEl.id = \"liftoff-snippet\";\n this.snippetEl.classList.add(this.bidContext.platform.toLowerCase());\n (_snippetEl$classList = this.snippetEl.classList).add.apply(_snippetEl$classList, _toConsumableArray(this.bidContext.ab_tests));\n document.body.appendChild(this.snippetEl);\n // TreSensa endcards using the adcontainer.js library rely on the\n // \"tre_container\" div being present.\n if (this.env.is_tre) {\n this.treContainerEl = document.createElement(\"div\");\n this.treContainerEl.id = \"tre_container\";\n this.treContainerEl.zIndex = 2;\n this.snippetEl.appendChild(this.treContainerEl);\n }\n }\n\n /**\n * A creative policy is a collection of special requirements the creative must comply with. These tend\n * to be country and/or exchange specific.\n * Creative policies are set in admarkup/core.\n * @param {Object} policy - A series of requirements.\n * @param {boolean} policy.add_border - Adds a border around the creative.\n * @param {string} policy.russian_age_rating - Shows age rating watermark.\n * @param {number} policy.animation_duration_limit - Stops all animation after a set time.\n * @param {boolean} policy.show_chinese_watermark - Shows Chinese watermark.\n * @param {boolean} policy.show_ad_choices - Shows the AdChoices watermark.\n * @param {boolean} policy.block_notifications - Blocks notification icons from appearing on chat banners.\n * @param {boolean} policy.block_strobing - Keeps strobing/blinking animations from happening.\n * @param {boolean} policy.use_custom_close - True iff we should use a custom close button for this\n * impression.\n * @param {number} policy.close_delay - Overrides any previously set close delay duration.\n */\n\n }, {\n key: \"applyPolicy\",\n value: function applyPolicy() {\n var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.env.creative_policy,\n add_border = _ref2.add_border,\n russian_age_rating = _ref2.russian_age_rating,\n show_chinese_watermark = _ref2.show_chinese_watermark,\n show_ad_choices = _ref2.show_ad_choices,\n use_custom_close = _ref2.use_custom_close,\n close_delay = _ref2.close_delay;\n\n var bidContext = this.bidContext;\n __WEBPACK_IMPORTED_MODULE_1__creative_utils__[\"a\" /* applyLiftoffPolicy */](this.snippetEl, {\n addBorder: add_border,\n showAdChoices: show_ad_choices,\n russianAgeRating: russian_age_rating,\n showChineseWatermark: show_chinese_watermark,\n useCustomClose: use_custom_close,\n closeDelay: close_delay,\n // NOTE(Casey): `applyLiftoffPolicy` globally modifies audio output of the entire creative. Currently,\n // madlib creatives do not use these global controls -- we depend on components to directly check\n // the audio policy before making sound. We therefore set `audioPolicy` here to `NO_RESTRICTION` to\n // disable the global controls.\n // TODO(Casey): Update this if we decide to use global controls for madlib creatives in the future.\n audioPolicy: __WEBPACK_IMPORTED_MODULE_8__constants__[\"b\" /* AUDIO_POLICY_NO_RESTRICTIONS */]\n }, {\n creativeID: bidContext.creative_id,\n platform: bidContext.platform,\n exchange: bidContext.exchange.toLowerCase(),\n sourceAppName: bidContext.source_app_name,\n sourceAppID: bidContext.source_app_id,\n cdnURL: bidContext.cdnURL\n });\n }\n }, {\n key: \"onMadlibLoaded\",\n value: function onMadlibLoaded() {\n this.madlibLoaded = true;\n }\n }, {\n key: \"resetClickParams\",\n value: function resetClickParams() {\n this.clickParams = {};\n }\n }, {\n key: \"mergeClickParams\",\n value: function mergeClickParams(params) {\n Object.assign(this.clickParams, params);\n }\n }, {\n key: \"getClickParams\",\n value: function getClickParams() {\n return this.clickParams;\n }\n\n /** Handles clickthrough/CTA clicks. */\n\n }, {\n key: \"handleClick\",\n value: function handleClick() {\n var queryParams = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var clickAreaType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n /**\n * NOTE(oscar): To prevent aggressive behavior, we disable autoclick the\n * first time the store page is opened regardless of how.\n * mac=1 means there will be no UX change.\n */\n if (this._lastChanceEndscreenAutoclick && !queryParams.mac) {\n this._lastChanceEndscreenAutoclick.disable();\n }\n // NOTE(oscar): pv=1 clicks should mean the MMP is not sent a click.\n if (!queryParams.pv) {\n this._viewclick.disable();\n }\n\n var clickTrackingParams = __WEBPACK_IMPORTED_MODULE_2__click_handling__[\"a\" /* getClickTrackingQueryParams */](this.interactionMonitor.getAllInteractionData());\n\n var allQueryParams = Object.assign({\n cbl: this.madlibLoaded ? 0 : 1\n }, this.getClickParams(), clickTrackingParams, queryParams);\n\n if (clickAreaType != null) {\n allQueryParams.ca = clickAreaType;\n }\n\n var bidContext = this.bidContext,\n clickConfig = this.env.click_config;\n\n __WEBPACK_IMPORTED_MODULE_2__click_handling__[\"b\" /* handleClick */]({\n clickConfig: {\n clickthroughURL: clickConfig.clickthrough_url,\n clickTrackingURLs: clickConfig.click_tracking_urls\n },\n queryParams: allQueryParams,\n isReengagement: bidContext.is_reengagement,\n platform: bidContext.platform,\n exchange: bidContext.exchange,\n abTests: bidContext.ab_tests\n });\n }\n }, {\n key: \"onClickCapture\",\n value: function onClickCapture(e) {\n var _this3 = this;\n\n // An array of EventTarget objects, some of which may be instances of Element.\n var path = e.composedPath && e.composedPath() || e.path;\n if (path == null) {\n return;\n }\n\n var foundSnippet = path.some(function (el) {\n return el === _this3.snippetEl;\n });\n if (!foundSnippet) {\n return;\n }\n\n var rect = this.snippetEl.getBoundingClientRect();\n var clickMetric = {\n x: Math.round(e.pageX - rect.left),\n y: Math.round(e.pageY - rect.top),\n time_ms: Date.now() - LIFTOFF_START_TS,\n // NOTE(vsingh): The click type below must be one of AdexpMetric.ClickType.\n type: __WEBPACK_IMPORTED_MODULE_8__constants__[\"q\" /* CLICK_METRIC_TYPE_UNKNOWN */]\n };\n\n // Helper function that returns true if some Elements in `path` satisfy the condition `pred`.\n var someElements = function someElements(pred) {\n return path.some(function (eventtarget) {\n return eventtarget instanceof Element && pred(eventtarget);\n });\n };\n\n if (someElements(function (el) {\n return el.classList.contains(\"liftoff-close-target\");\n })) {\n clickMetric.type = __WEBPACK_IMPORTED_MODULE_8__constants__[\"n\" /* CLICK_METRIC_TYPE_CLOSE */];\n } else if (Object(__WEBPACK_IMPORTED_MODULE_11__cta__[\"c\" /* pointInCTA */])(e.clientX, e.clientY)) {\n clickMetric.type = __WEBPACK_IMPORTED_MODULE_8__constants__[\"o\" /* CLICK_METRIC_TYPE_CTA */];\n } else if (someElements(function (el) {\n return el.classList.contains(\"liftoff-deadzone\");\n })) {\n clickMetric.type = __WEBPACK_IMPORTED_MODULE_8__constants__[\"p\" /* CLICK_METRIC_TYPE_DEADZONE */];\n } else if (someElements(function (el) {\n return el.id === \"liftoff-close\";\n })) {\n // NOTE(vsingh): Special/weird case: if we hit liftoff-close but not liftoff-close-target,\n // consider it a deadzone click. There are just a few pixels around the close button that\n // trigger this `if` clause.\n clickMetric.type = __WEBPACK_IMPORTED_MODULE_8__constants__[\"p\" /* CLICK_METRIC_TYPE_DEADZONE */];\n }\n\n __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */].recordMetricV2(\"click\", clickMetric);\n this.lastClickMetric = clickMetric;\n }\n }, {\n key: \"addEventListeners\",\n value: function addEventListeners() {\n var _this4 = this;\n\n __WEBPACK_IMPORTED_MODULE_3__liftoff_mraid__[\"a\" /* default */].onViewable(function () {\n __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */].recordMetricV2(\"first_viewable_ms\", Date.now() - LIFTOFF_START_TS);\n });\n __WEBPACK_IMPORTED_MODULE_3__liftoff_mraid__[\"a\" /* default */].onViewable(function (e) {\n _this4._autoclickBus.forEach(function (ac) {\n return ac.emitViewableEvent(e);\n });\n }, true);\n __WEBPACK_IMPORTED_MODULE_3__liftoff_mraid__[\"a\" /* default */].onViewableChange(function (e) {\n _this4._autoclickBus.forEach(function (ac) {\n return ac.emitViewableChangeEvent(e);\n });\n });\n\n window.addEventListener(\"click\", function (e) {\n _this4.onClickCapture(e);\n if (_this4._lastChanceEndscreenAutoclick) {\n _this4._lastChanceEndscreenAutoclick.disable();\n }\n }, true);\n }\n }, {\n key: \"onLoadCompleted\",\n value: function onLoadCompleted() {\n // NOTE(oscar): We log the initial dimensions immediately in case no \"resize\" event triggers.\n this.windowResizeLogger.logInitialDims();\n }\n }, {\n key: \"onFirstLayoutFinished\",\n value: function onFirstLayoutFinished() {\n __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */].recordMetricV2(\"load_time_ms\", Date.now() - LIFTOFF_START_TS);\n this._autoclickBus.forEach(function (ac) {\n return ac.emitHtmlLoadedEvent();\n });\n }\n }, {\n key: \"getLetterboxConfig\",\n value: function getLetterboxConfig() {\n return new __WEBPACK_IMPORTED_MODULE_5__letterbox_config__[\"a\" /* default */](this.snippetEl);\n }\n }, {\n key: \"resolveAsset\",\n value: function resolveAsset(assetType, assetID) {\n var asset = this.assets[assetType + \"s\"][assetID];\n if (asset == null) {\n throw new Error(assetType + \": \" + assetID + \" not found\");\n }\n\n switch (assetType) {\n // NOTE(oscar): By default, we should assume only 1 asset URL per original will be passed to the markup.\n // Occasionally, we will test how we serve our assets, which may entail providing more than 1 version to\n // be selected here.\n\n // The common structure for an original asset is as follows:\n /**\n * {\n * \"id\",\n * \"asset-versions\": [{ \"public-url\", \"version-id\" }, ...]\n * }\n */\n case \"image_original\":\n return asset.image_versions[0][\"public-url\"];\n case \"video_original\":\n return asset.video_versions[0][\"public-url\"];\n }\n\n return asset.url;\n }\n\n /**\n * Enables exclusive format creatives to listen for Madlib interaction events.\n * Note: This method does not register interaction events for Madlib CSPs.\n */\n\n }, {\n key: \"addVXInteractionEventListener\",\n value: function addVXInteractionEventListener(cb) {\n this.vxInteractionListeners.push(cb);\n }\n }]);\n\n return Liftoff;\n}();\n\nObject.assign(Liftoff, {\n Component: __WEBPACK_IMPORTED_MODULE_0__component__[\"a\" /* default */],\n DOMUtils: __WEBPACK_IMPORTED_MODULE_9__frontendlib_dom_utils__,\n LiftoffMRAID: __WEBPACK_IMPORTED_MODULE_3__liftoff_mraid__[\"a\" /* default */],\n Logger: __WEBPACK_IMPORTED_MODULE_6__logger__[\"a\" /* default */],\n Utils: __WEBPACK_IMPORTED_MODULE_10__frontendlib_utils__\n});\n\nwindow.Liftoff = Liftoff;\n\n/***/ }),\n/* 137 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__frontendlib_event_listener__ = __webpack_require__(11);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__logger__ = __webpack_require__(6);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\nvar overrideMethods = {\n layout: true,\n load: true,\n resize: true,\n start: true,\n stop: true,\n restart: true\n};\n\nvar Component = function (_EventListener) {\n _inherits(Component, _EventListener);\n\n _createClass(Component, null, [{\n key: \"init\",\n value: function init() {\n this.registry = {};\n }\n }, {\n key: \"register\",\n value: function register(name, cls) {\n if (this.registry[name] != null) {\n throw new Error(\"ComponentError: \" + name + \" already registered\");\n }\n\n this.assertSubclassed(cls);\n this.registry[name] = cls;\n }\n }, {\n key: \"new\",\n value: function _new(name, config) {\n var cls = this.registry[name];\n if (cls == null) {\n throw new Error(\"ComponentError: component \\\"\" + name + \"\\\" not registered\");\n }\n\n return new cls(config);\n }\n }, {\n key: \"assertSubclassed\",\n value: function assertSubclassed(cls) {\n var _this2 = this;\n\n var methods = Object.getOwnPropertyNames(this.prototype);\n methods.forEach(function (method) {\n if (overrideMethods[method] !== true) return;\n if (cls.prototype[method] === _this2.prototype[method]) {\n throw new Error(\"ComponentError: \" + method + \" must be overridden\");\n }\n });\n }\n }]);\n\n function Component(config) {\n _classCallCheck(this, Component);\n\n var _this = _possibleConstructorReturn(this, (Component.__proto__ || Object.getPrototypeOf(Component)).call(this));\n\n _this.config = config;\n _this.on({\n start: function start() {\n return _this.start();\n },\n stop: function stop() {\n return _this.stop();\n },\n restart: function restart() {\n return _this.restart();\n }\n });\n return _this;\n }\n\n _createClass(Component, [{\n key: \"error\",\n value: function error(err) {\n this.emit(\"error\", this.constructor.name + \"Error: \" + err);\n }\n\n // The layout method should prepare the component to take up a stable size and\n // position within the DOM.\n\n }, {\n key: \"layout\",\n value: function layout(parentNode) {\n this.parentNode = parentNode;\n }\n\n // The load method should load assets. This is intended to capture the time it\n // takes for the component to be fully visible (all images/videos loaded).\n\n }, {\n key: \"load\",\n value: function load() {}\n }, {\n key: \"resize\",\n value: function resize() {}\n }, {\n key: \"start\",\n value: function start() {}\n }, {\n key: \"stop\",\n value: function stop() {}\n }, {\n key: \"restart\",\n value: function restart() {}\n }, {\n key: \"recordInteraction\",\n value: function recordInteraction() {\n __WEBPACK_IMPORTED_MODULE_1__logger__[\"a\" /* default */].recordMetricV2(\"interaction_count\", 1);\n }\n }, {\n key: \"recordInteractionPromptReached\",\n value: function recordInteractionPromptReached() {\n __WEBPACK_IMPORTED_MODULE_1__logger__[\"a\" /* default */].recordMetricV2(\"interaction_prompt_reached_count\", 1);\n if (window.Liftoff != null && window.Liftoff.setInteractionPromptReached != null) {\n window.Liftoff.setInteractionPromptReached();\n }\n }\n }]);\n\n return Component;\n}(__WEBPACK_IMPORTED_MODULE_0__frontendlib_event_listener__[\"a\" /* default */]);\n\nComponent.init();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Component);\n\n/***/ }),\n/* 138 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * This config is used for letterboxing Madlib creatives. It works by changing the size\n * of liftoff-layout element (specific to Madlib), and scale it within liftoff-snippet\n * (provided by Liftoff.js).\n *\n * Arguably the better way to implement letterboxing is by controlling the size of\n * liftoff-snippet element based on Madlib configuration (i.e. fixed size or\n * stretchable, in the future), for example, by displaying Madlib creative in\n * an iFrame. If iFrames do not involve performance penalty, it would be\n * preferable since it would be another step to unify Madlib and CSP creatives.\n */\nvar LetterboxConfig = function () {\n /**\n * @typedef {Object} Dimensions\n * @property {number} width - The width of the element.\n * @property {number} height - The height of the element.\n */\n\n /**\n * @typedef {Object} LetterboxConfigData\n * @property {Dimensions} viewportSize - The size of the viewport.\n * @property {Dimensions} bidCreativeSize - The size of the bid creative.\n * @property {boolean} enable - Indicates if the creative should be letterboxed.\n * @property {boolean} useDarkRootBackground - Indicates if the root element should use a dark background.\n * @property {boolean} useLayoutBackground - Indicates if the layout element should use its own light-colored background.\n */\n\n function LetterboxConfig(snippetEl) {\n _classCallCheck(this, LetterboxConfig);\n\n this.snippetEl = snippetEl;\n\n /** @type {LetterboxConfigData} */\n this.config = this.getLetterboxConfig();\n }\n\n _createClass(LetterboxConfig, [{\n key: \"enabled\",\n value: function enabled() {\n return this.config.enable;\n }\n }, {\n key: \"useDarkRootBackground\",\n value: function useDarkRootBackground() {\n return this.config.useDarkRootBackground;\n }\n }, {\n key: \"useLayoutBackground\",\n value: function useLayoutBackground() {\n return this.config.useLayoutBackground;\n }\n\n /**\n * Choose the appropriate config based on viewport dimensions.\n * If one orientation's config is missing, default to the other one.\n */\n\n }, {\n key: \"getCreativePreferredOrientation\",\n value: function getCreativePreferredOrientation(_ref) {\n var width = _ref.width,\n height = _ref.height;\n\n return width <= height ? \"portrait\" : \"landscape\";\n }\n\n /**\n * Analyze the viewport and make some decisions about how we will present our\n * creative content.\n * @returns {LetterboxConfigData}\n */\n\n }, {\n key: \"getLetterboxConfig\",\n value: function getLetterboxConfig() {\n var dims = function dims(obj) {\n return { width: obj.width, height: obj.height };\n };\n\n var viewportSize = dims(this.snippetEl.getBoundingClientRect());\n var bidCreativeSize = dims(Liftoff.bidContext);\n\n var viewportOrientation = viewportSize.width <= viewportSize.height ? \"portrait\" : \"landscape\";\n\n // We are trying to show a portrait creative in a landscape-size viewport, or a landscape creative\n // in a portrait-size viewport.\n var orientationMismatch = viewportOrientation !== this.getCreativePreferredOrientation(bidCreativeSize);\n\n var isRotated = Liftoff.bidContext.is_interstitial && orientationMismatch;\n\n var useWhiteBars = isRotated;\n var useDarkRootBackground = !useWhiteBars;\n var useLayoutBackground = useDarkRootBackground;\n var enable = useWhiteBars || isRotated;\n\n return {\n viewportSize: viewportSize,\n bidCreativeSize: bidCreativeSize,\n enable: enable,\n useDarkRootBackground: useDarkRootBackground,\n useLayoutBackground: useLayoutBackground\n };\n }\n\n // Returns the scaling factor necessary to scale `contentSize` up to `viewportSize`\n // whilst maintaining the aspect ratio of the content.\n\n }, {\n key: \"preserveAspectRatioScalingFactor\",\n value: function preserveAspectRatioScalingFactor(contentSize, viewportSize) {\n if (contentSize.height * viewportSize.width <= viewportSize.height * contentSize.width) {\n return viewportSize.width / contentSize.width;\n } else {\n return viewportSize.height / contentSize.height;\n }\n }\n\n // Given a letterbox config, returns information that is useful for laying out the various DOM elements.\n // Returns an object with the following keys:\n // scaleFactor: the scale factor to be applied to the layout element\n // rootContainerSize: the width and height in pixels of the layout element\n // rootContainerOffset: the x and y coordinates in pixels of the layout element\n // rootContainerTransformedArea: expected values in pixels for the x, y, width, and height of the root\n // container after scale and rotation are applied\n\n }, {\n key: \"getLetterboxLayoutInfo\",\n value: function getLetterboxLayoutInfo() {\n var _config = this.config,\n viewportSize = _config.viewportSize,\n bidCreativeSize = _config.bidCreativeSize;\n\n\n var scaleFactor = this.preserveAspectRatioScalingFactor(bidCreativeSize, viewportSize);\n var rootContainerSize = bidCreativeSize;\n var rootContainerOffset = {\n x: (viewportSize.width - rootContainerSize.width) / 2,\n y: (viewportSize.height - rootContainerSize.height) / 2\n };\n\n var rootContainerScaled = {\n width: bidCreativeSize.width * scaleFactor,\n height: bidCreativeSize.height * scaleFactor\n };\n var rootContainerTransformedArea = {\n x: (viewportSize.width - rootContainerScaled.width) / 2,\n y: (viewportSize.height - rootContainerScaled.height) / 2,\n width: rootContainerScaled.width,\n height: rootContainerScaled.height\n };\n\n return {\n scaleFactor: scaleFactor,\n rootContainerSize: rootContainerSize,\n rootContainerOffset: rootContainerOffset,\n rootContainerTransformedArea: rootContainerTransformedArea\n };\n }\n }, {\n key: \"getLetterboxConstraintsForMadlibRootElement\",\n value: function getLetterboxConstraintsForMadlibRootElement() {\n var _getLetterboxLayoutIn = this.getLetterboxLayoutInfo(),\n scaleFactor = _getLetterboxLayoutIn.scaleFactor,\n rootContainerSize = _getLetterboxLayoutIn.rootContainerSize,\n rootContainerOffset = _getLetterboxLayoutIn.rootContainerOffset;\n\n return {\n rootConstraints: {\n left: rootContainerOffset.x + \"px\",\n top: rootContainerOffset.y + \"px\",\n width: rootContainerSize.width + \"px\",\n height: rootContainerSize.height + \"px\"\n },\n rootPostLayoutTransform: \"scale(\" + scaleFactor + \")\"\n };\n }\n }, {\n key: \"getStyleForClickElement\",\n value: function getStyleForClickElement() {\n var _getLetterboxLayoutIn2 = this.getLetterboxLayoutInfo(),\n rootContainerTransformedArea = _getLetterboxLayoutIn2.rootContainerTransformedArea;\n\n return {\n left: rootContainerTransformedArea.x + \"px\",\n top: rootContainerTransformedArea.y + \"px\",\n width: rootContainerTransformedArea.width + \"px\",\n height: rootContainerTransformedArea.height + \"px\",\n right: \"auto\",\n bottom: \"auto\"\n };\n }\n }]);\n\n return LetterboxConfig;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (LetterboxConfig);\n\n/***/ }),\n/* 139 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__logger__ = __webpack_require__(6);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__ = __webpack_require__(0);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\n\nvar initialScreenAngle = Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"getIn\"])(window, [\"screen\", \"orientation\", \"angle\"]);\n\nvar RESIZE_LOGGING_SAMPLING_FREQUENCY_MULTIPLIER = 0.1;\n\n/**\n * Logs window resize events to Adexp.\n */\n\nvar WindowResizeLogger = function () {\n function WindowResizeLogger(snippetEl, enable_logging) {\n var _this = this;\n\n _classCallCheck(this, WindowResizeLogger);\n\n // We log resizes at a lower sampling frequency, because the log messages can be very numerous.\n this.enableResizeLogging = enable_logging ? Math.random() < RESIZE_LOGGING_SAMPLING_FREQUENCY_MULTIPLIER : false;\n\n this.resizeCount = 0;\n this.resizeLog = [];\n this.snippetEl = snippetEl;\n\n window.addEventListener(\"resize\", function () {\n _this.logResizedDims();\n });\n }\n\n _createClass(WindowResizeLogger, [{\n key: \"_logDims\",\n value: function _logDims() {\n if (!this.enableResizeLogging) return;\n\n var _snippetEl$getBoundin = this.snippetEl.getBoundingClientRect(),\n width = _snippetEl$getBoundin.width,\n height = _snippetEl$getBoundin.height;\n\n var data = {\n height: height,\n width: width,\n sinceStartMS: Date.now() - LIFTOFF_START_TS,\n \"screen.orientation.angle\": Object(__WEBPACK_IMPORTED_MODULE_1__frontendlib_utils__[\"getIn\"])(window, [\"screen\", \"orientation\", \"angle\"]),\n initialScreenAngle: initialScreenAngle,\n resizeCount: this.resizeCount,\n // Check support of rotation events.\n supportsOrientationChange: \"onorientationchange\" in window,\n supportsDeviceOrientation: \"ondeviceorientation\" in window,\n \"window.innerWidth\": window.innerWidth,\n \"window.innerHeight\": window.innerHeight,\n \"documentElement.clientWidth\": document.documentElement != null && document.documentElement.clientWidth,\n \"documentElement.clientHeight\": document.documentElement != null && document.documentElement.clientHeight\n };\n this.resizeLog = [].concat(_toConsumableArray(this.resizeLog), [data]);\n __WEBPACK_IMPORTED_MODULE_0__logger__[\"a\" /* default */].recordLog(\"resize\", \"resize\", { resizeLog: this.resizeLog });\n }\n }, {\n key: \"logInitialDims\",\n value: function logInitialDims() {\n this._logDims();\n }\n }, {\n key: \"logResizedDims\",\n value: function logResizedDims() {\n this.resizeCount += 1;\n this._logDims();\n }\n }]);\n\n return WindowResizeLogger;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (WindowResizeLogger);\n\n/***/ }),\n/* 140 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ })\n/******/ ]);\n\n\n// WEBPACK FOOTER //\n// liftoff-58ea9097a7f92539efa7.js"," \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, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\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 = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 135);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 4c081c14b06df0b018c2","export const appendParamObjectToURL = (url, params) => {\n return appendQueryStringToURL(url, objToQueryString(params));\n};\n\nexport const appendQueryStringToURL = (url, queryString) => {\n if (queryString === \"\") return url;\n\n const separator = url.includes(\"?\") ? \"&\" : \"?\";\n\n return `${url}${separator}${queryString}`;\n};\n\n// If any key in the `defaults` object doesn't exist in `target`, the key is\n// merged. Additional `sources` object arguments are merged into `target`, but\n// only the keys that exist in `defaults`.\nexport const assignWithDefaults = (target, defaults, ...sources) => {\n Object.keys(defaults).forEach((key) => {\n if (!target.hasOwnProperty(key) || target[key] === undefined) {\n target[key] = defaults[key];\n }\n\n sources\n .filter((source) => {\n return (\n source != null &&\n source.hasOwnProperty(key) &&\n source[key] !== undefined\n );\n })\n .forEach((source) => (target[key] = source[key]));\n });\n\n return target;\n};\n\n/**\n * Takes an ordered array and returns the first value where fn(value) returns true.\n */\nexport const binaryFind = (arr, fn) => {\n let high = arr.length + 1;\n let low = 0;\n while (low + 1 < high) {\n const mid = low + ((high - low) >> 1);\n if (fn(arr[mid])) {\n high = mid;\n } else {\n low = mid;\n }\n }\n\n return arr[high];\n};\n\nexport const camelCase = (str, { isSuffix = false } = {}) => {\n return str\n .split(/[-_]/g)\n .map((part, i) =>\n i === 0 && !isSuffix ? part.toLowerCase() : capitalize(part.toLowerCase())\n )\n .join(\"\");\n};\n\nexport const capitalize = (str) => {\n if (str === \"\") return str;\n\n return `${str[0].toUpperCase()}${str.slice(1)}`;\n};\n\nexport const clamp = (x, a, b) => {\n if (a > b) {\n return clamp(x, b, a);\n }\n\n if (x < a) {\n return a;\n }\n\n if (x > b) {\n return b;\n }\n\n return x;\n};\n\nexport const clone = (obj) => {\n if (obj === undefined) return undefined;\n\n return JSON.parse(JSON.stringify(obj));\n};\n\nexport const compareNumbers = (a, b) => {\n if (a == null && b == null) return 0;\n else if (a == null) return -1;\n else if (b == null) return 1;\n\n return a - b;\n};\n\nexport const compareStrings = (a, b) => {\n return (a || \"\")\n .trim()\n .toLowerCase()\n .localeCompare((b || \"\").trim().toLowerCase());\n};\n\n/**\n * Composes functions such that any returned Promise is resolved before the next invocation.\n * @param {Function[]} funcs - A list of potentially async functions that each take a single param. Any null/\n * undefined values are ignored.\n */\nexport const composeAsync = (...funcs) => {\n return (arg) => {\n let res = Promise.resolve(arg);\n for (let i = funcs.length - 1; i >= 0; i--) {\n const f = funcs[i];\n if (f == null) {\n continue;\n }\n res = res.then((arg) => f(arg));\n }\n return res;\n };\n};\n\nexport const smartCompare = (a, b, { reverse = false } = {}) => {\n if (a === b) return 0;\n if (type(a) !== type(b) && b != null && a != null) {\n throw new Error(\n `Don't know how to compare type ${type(a)} with type ${type(b)}!`\n );\n }\n const compareType = a != null ? type(a) : type(b);\n\n const [valueA, valueB] = reverse ? [b, a] : [a, b];\n switch (compareType) {\n case \"string\":\n return compareStrings(valueA, valueB);\n case \"number\":\n return compareNumbers(valueA, valueB);\n default:\n // TODO(oscar): Add more types for comparison such as Dates.\n throw new Error(`Missing method for comparing type ${compareType}`);\n }\n};\n\n/**\n * Recursively compares 2 JS objects.\n * @param {any} a\n * @param {any} b\n * @param {Object} options\n * @param {boolean} options.toJSON - Uses clone() in order to compare objects as\n * their JSON representations.\n * Useful when comparing plain objects to class instances.\n */\nexport const deepEqual = (a, b, { toJSON = false } = {}) => {\n if (a === b) {\n return true;\n }\n\n const compareA = toJSON ? clone(a) : a;\n const compareB = toJSON ? clone(b) : b;\n const tA = type(compareA);\n const tB = type(compareB);\n\n if (tA === \"array\" && tB === \"array\") {\n if (compareA.length !== compareB.length) return false;\n\n for (let i = 0; i < compareA.length; i++) {\n if (!deepEqual(compareA[i], compareB[i])) return false;\n }\n\n return true;\n }\n\n if (tA === \"set\" && tB === \"set\") {\n if (compareA.size !== compareB.size) return false;\n\n const bShallowCopy = new Set(compareB);\n aLoop: for (const aElement of compareA) {\n // First check if there's an equivalent reference in the two sets before checking for deep equality,\n // since the latter is very inefficient.\n if (bShallowCopy.has(aElement)) {\n bShallowCopy.delete(aElement);\n continue;\n }\n\n for (const bElement of bShallowCopy) {\n if (deepEqual(aElement, bElement)) {\n bShallowCopy.delete(bElement);\n continue aLoop;\n }\n }\n\n return false;\n }\n\n return true;\n }\n\n if (tA === \"object\" && tB === \"object\") {\n for (const k in compareA) {\n if (!(k in compareB)) return false;\n }\n\n for (const k in compareB) {\n if (!(k in compareA) || !deepEqual(compareA[k], compareB[k]))\n return false;\n }\n\n return true;\n }\n\n return compareA === compareB;\n};\n\nexport const deepInclude = (parent, child) => {\n if (type(parent.some) === \"function\") {\n return parent.some((obj) => deepEqual(obj, child));\n } else if (type(parent) === \"object\") {\n return Object.values(parent).some((obj) => deepEqual(obj, child));\n }\n return false;\n};\n\nexport const deepUnique = (arr) => {\n let index = 0;\n while (index < arr.length) {\n const item = arr[index];\n arr = arr\n .slice(0, index + 1)\n .concat(\n arr.slice(index).filter((currItem) => !deepEqual(item, currItem))\n );\n index += 1;\n }\n\n return arr;\n};\n\n/**\n * @param {Object} a\n * @param {Object} b\n * @param {boolean} includeAKeys\n * @returns {Object} - An object containing keys in `b` if the values differ\n * from those in `a`. If `includeAKeys` is true, the keys in `a` that are NOT in\n * `b` are also included.\n */\nexport const diffObjects = (a, b, includeAKeys = false) => {\n const result = {};\n for (const k in b) {\n if (!deepEqual(a[k], b[k])) {\n result[k] = b[k];\n }\n }\n if (includeAKeys) {\n for (const k in a) {\n if (!(k in b)) {\n result[k] = null;\n }\n }\n }\n\n return result;\n};\n\n// https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex\nexport const escapeRegExp = (str) => {\n return str.replace(/[-[\\]/{}()*+?.\\\\^$|]/g, \"\\\\$&\");\n};\n\nexport const flatten = (arr) => {\n return [].concat.apply([], arr);\n};\n\n/**\n * Takes a list of words and joins them via coordinating conjunction grammar rules. Oxford comma is mandatory.\n * @param {String[]} words\n */\nexport const formatConjunction = (words, conjunction = \"and\") => {\n const wc = words.length;\n if (wc <= 2) {\n return words.join(` ${conjunction} `);\n } else {\n return [...words.slice(0, wc - 1), `${conjunction} ${words[wc - 1]}`].join(\n \", \"\n );\n }\n};\n\nexport const formatFileSize = (size) => {\n // NOTE: Math.log10 is not available in every browser and Math.log / Math.LN10\n // is unreliable.\n const thousands = Math.floor((`${size}`.length - 1) / 3);\n return `${Math.round(size / Math.pow(10, 3 * thousands))}${\n \"BKMGTP\"[thousands]\n }`;\n};\n\nexport const formatUSD = (val, options = {}) => {\n options = Object.assign(\n {\n style: \"currency\",\n currency: \"USD\",\n },\n options\n );\n\n return type(val) !== \"number\" ? null : val.toLocaleString(\"en\", options);\n};\n\nexport const getLocale = () => {\n const { navigator } = window;\n if (navigator == null) return null;\n return navigator.languages && navigator.languages.length\n ? navigator.languages[0]\n : navigator.language;\n};\n\n/**\n * This function is a wrapper for Number.toLocalString() however it tries to use\n * the device's language. If all else fails, it uses \"en\".\n *\n * TODO(oscar): Fix the Intl polyfill we use, so there's no issue using\n * `undefined` as the locale.\n */\nexport const numberToLocaleString = (n, options, locale) => {\n const f = (locale) => {\n try {\n return Number(n).toLocaleString(locale, options);\n } catch (e) {}\n };\n return f(locale) || f() || f(getLocale()) || f(\"en\");\n};\n\nexport const getIn = (m, ks, d) => {\n if (m == null) return d;\n if (ks.length === 1) {\n return m[ks[0]];\n }\n\n return getIn(m[ks[0]], ks.slice(1));\n};\n\nexport const kebabCase = (str) => {\n // A \"-\" will be inserted before every capital letter, so make sure the first\n // character isn't capitalized.\n str = str.charAt(0).toLowerCase() + str.slice(1);\n // Convert camel case to kebab case.\n str = str.replace(/[A-Z]/g, \"-$&\").toLowerCase();\n // Convert snake case to kebab case.\n str = str.replace(/_/g, \"-\");\n\n return str;\n};\n\nexport const isPromise = (obj) => {\n return Promise.resolve(obj) === obj;\n};\n\nexport const isEmpty = (obj) =>\n obj == null ||\n (Object.keys(obj).length === 0 &&\n // Needed for iterables like `Set`.\n Array.from(obj).length === 0 &&\n (obj.size || 0) === 0);\n\nexport const loadImage = (url, crossOrigin = null) => {\n if (!url) return Promise.reject(new Error(\"No image URL provided\"));\n\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = crossOrigin;\n img.addEventListener(\"load\", () => resolve(img));\n img.addEventListener(\"error\", reject);\n img.src = url;\n if (img.complete) {\n resolve(img);\n }\n });\n};\n\nexport const loadImages = (urls, crossOrigin = null) =>\n Promise.all(\n urls.filter((url) => url != null).map((url) => loadImage(url, crossOrigin))\n );\n\nexport const mapByID = (arr, fn = null) => {\n return arr.reduce((map, item) => {\n map[item.id] = fn != null ? fn(item) : item;\n return map;\n }, {});\n};\n\nexport const mapcat = (arr, fn) => {\n return [].concat.apply([], arr.map(fn));\n};\n\n// Like `Object.assign`, merges subsequent object arguments into the first\n// object argument `defaults`, but only keys that exist in `defaults`.\n// Unlike `Object.assign`, does not modify the first argument, but returns a\n// shallow clone instead.\nexport const mergePropertiesWithDefaults = (defaults, ...args) => {\n if (args.length === 0) return defaults;\n\n const target = Object.assign(defaults);\n const keys = Object.keys(target);\n\n args.forEach((source) => {\n if (source == null) return;\n\n keys.forEach((key) => {\n if (source.hasOwnProperty(key) && source[key] !== undefined) {\n target[key] = source[key];\n }\n });\n });\n\n return target;\n};\n\nexport const objFromQueryString = (str = location.search.slice(1)) => {\n return str.split(\"&\").reduce((acc, part) => {\n const [key, value] = part.split(\"=\", 2).map(decodeURIComponent);\n if (key != null && value != null) {\n acc[key] = value;\n }\n\n return acc;\n }, {});\n};\n\nexport const objToQueryString = (obj) => {\n return Object.keys(obj)\n .filter((key) => obj[key] != null)\n .map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(obj[key])}`)\n .join(\"&\");\n};\n\n/**\n * Given a `Promise` that should resolve with a `Response` (e.g. a `Promise` returned by `fetch`), returns\n * a new Promise that will reject if 1) the original `Promise` rejects, 2) the original `Promise` resolves\n * with something that's not a `Response`, or 3) the original response had an error status.\n */\nconst wrapResponsePromise = (responsePromise) => {\n return new Promise((resolve, reject) => {\n return responsePromise\n .then((response) => {\n if (!(response instanceof Response && response.ok)) {\n reject(response);\n return;\n }\n\n resolve(response);\n })\n .catch(reject);\n });\n};\n\n/**\n * Like `fetch` but returns a `Promise` that rejects if `!response.ok`. This allows calling code to handle\n * non-ok responses (e.g. 404s and 500s) using `Promise.catch`.\n */\nexport const errorSensitiveFetch = (...args) =>\n wrapResponsePromise(fetch(...args));\n\nexport const postJSON = (url, json, options) => {\n return makeJSONRequest(url, json, \"POST\", options);\n};\n\nexport const patchJSON = (url, json, options) => {\n return makeJSONRequest(url, json, \"PATCH\", options);\n};\n\n/**\n * Sends a `fetch` request to `url` using the given `method` (e.g. \"GET\", \"POST\", \"PATCH\") and returns a\n * `Promise` that resolves with a `Response`. If `options.rejectOnErrorResponse === true`, the returned\n * `Promise` will reject if the sever returns an error response.\n */\nfunction makeJSONRequest(url, json, method, options = {}) {\n const { rejectOnErrorResponse = false } = options;\n const fetchPromise = fetch(url, {\n body: JSON.stringify(json),\n credentials: \"same-origin\",\n headers: { \"Content-Type\": \"application/json; charset=utf-8\" },\n method,\n });\n if (!rejectOnErrorResponse) {\n return fetchPromise;\n }\n return wrapResponsePromise(fetchPromise);\n}\n\nexport const ping = (url) => {\n const img = new Image();\n img.src = url;\n};\n\n// Polls a `url` for up to `timeoutMS`. Assumes the response is a JSON object\n// with keys { state, value } where the values for `state` are one of\n// [\"success\", \"failed\", \"timeout\"].\nexport const poll = (url, timeoutMS) => {\n let timedOut = false;\n setTimeout(() => (timedOut = true), timeoutMS);\n\n const request = () => {\n if (timedOut) {\n return Promise.reject(new Error(\"poll exceeded timeout duration\"));\n }\n\n return fetch(url, { credentials: \"same-origin\" })\n .then((response) => response.json())\n .then(({ state, value }) => {\n switch (state) {\n case \"success\":\n return value;\n case \"failed\":\n throw new Error(\n `poll received failed response with value: ${value}`\n );\n case \"timeout\":\n return request();\n default:\n throw new Error(\n `poll received response with unknown state: ${state}`\n );\n }\n });\n };\n\n return request();\n};\n\nexport const precisionRound = (number, precision) => {\n const factor = Math.pow(10, precision);\n\n return Math.round(number * factor) / factor;\n};\n\nexport const randomInt = (low, high) => {\n return low + Math.floor(Math.random() * (high - low));\n};\n\n// Returns an array of integers from [start, stop) (i.e. exclusive of stop).\n// Special case: if start === stop, return array with start as the only\n// element.\nexport const range = (start, stop, step = 1) => {\n if (start === stop) return [start];\n\n if (stop - start < 0 !== step < 0) {\n throw new Error(`Invalid call to range: range(${start}, ${stop}, ${step})`);\n }\n\n return Array(((stop - start) / step) | 0)\n .fill(null)\n .map((_, i) => start + i * step);\n};\n\nexport const request = (method, url, headers = {}, body = null) => {\n return new Promise((resolve, reject) => {\n const req = new XMLHttpRequest();\n req.onreadystatechange = () => {\n if (req.readyState === 4 && req.status === 200) {\n resolve(req);\n }\n };\n req.addEventListener(\"load\", resolve.bind(null, req));\n req.addEventListener(\"error\", reject.bind(null, req));\n req.open(method.toUpperCase(), url);\n Object.keys(headers).forEach((key) => {\n req.setRequestHeader(key, headers[key]);\n });\n req.send(body);\n });\n};\n\nexport const runAsync = (fn) => {\n setTimeout(fn, 0);\n};\n\nexport const removeKeys = (source, keys) => {\n if (source == null) return {};\n\n return Object.keys(source)\n .filter((key) => !keys.includes(key))\n .reduce((target, key) => {\n target[key] = source[key];\n\n return target;\n }, {});\n};\n\n/** Remove keys if their value is empty. */\nexport const removeEmptyKeys = (source) => {\n return selectKeys(source, (_, val) => !isEmpty(val));\n};\n\nexport const selectKeys = (source, keys) => {\n if (source == null) return {};\n\n switch (type(keys)) {\n case \"array\":\n return keys.reduce((target, key) => {\n if (source.hasOwnProperty(key)) {\n target[key] = source[key];\n }\n\n return target;\n }, {});\n case \"function\":\n return Object.keys(source).reduce((target, key) => {\n if (keys(key, source[key])) {\n target[key] = source[key];\n }\n\n return target;\n }, {});\n }\n};\n\n/**\n * Reorders items randomly into a new Array.\n * @param {Iterable} arr\n * @returns {Array}\n */\nexport const shuffle = (arr) => {\n const result = [...arr];\n for (let i = result.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [result[i], result[j]] = [result[j], result[i]];\n }\n return result;\n};\n\n// Like `Array.sort()`, but maintains the relative order of array items with\n// equal sort values and does not mutate the original array.\nexport const stableSort = (arr, sortFn) => {\n const index = arr.reduce((agg, item, i) => {\n agg.set(item, i);\n\n return agg;\n }, new Map());\n\n return arr\n .slice()\n .sort((a, b) => sortFn(a, b) || index.get(a) - index.get(b));\n};\n\nexport const timeDifference = (a, b) => {\n const msPerSecond = 1000,\n msPerMinute = msPerSecond * 60,\n msPerHour = msPerMinute * 60,\n msPerDay = msPerHour * 24,\n msPerWeek = msPerDay * 7,\n msPerMonth = msPerWeek * 4,\n msPerYear = msPerMonth * 13,\n elapsed = Math.abs(a - b);\n if (a <= b && elapsed < 1000 * 10) {\n return \"just now\";\n } else {\n let val, units;\n if (elapsed < msPerMinute) {\n val = Math.round(elapsed / msPerSecond);\n units = \"second\";\n } else if (elapsed < msPerHour) {\n val = Math.round(elapsed / msPerMinute);\n units = \"minute\";\n } else if (elapsed < msPerDay) {\n val = Math.round(elapsed / msPerHour);\n units = \"hour\";\n } else if (elapsed < msPerWeek) {\n val = Math.round(elapsed / msPerDay);\n units = \"day\";\n } else if (elapsed < msPerMonth) {\n val = Math.round(elapsed / msPerWeek);\n units = \"week\";\n } else if (elapsed < msPerYear) {\n val = Math.round(elapsed / msPerMonth);\n units = \"month\";\n } else {\n val = Math.round(elapsed / msPerYear);\n units = \"year\";\n }\n\n return [\n val,\n `${units}${val === 1 ? \"\" : \"s\"}`,\n a < b ? \"ago\" : \"from now\",\n ].join(\" \");\n }\n};\n\nexport const type = (object) => {\n return {}.toString\n .call(object)\n .match(/\\s([a-zA-Z]+)/)[1]\n .toLowerCase();\n};\n\n/** Returns a Promise that resolves after `ms` ms. */\nexport const wait = (ms) => {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n};\n\n/** Returns a Promise that rejects after `ms` ms. */\nexport const timeout = (ms) => {\n return new Promise((_, reject) => {\n setTimeout(() => reject(new Error(`Promise timed out after ${ms}ms`)), ms);\n });\n};\n\nexport const unique = (arr) => {\n return arr.filter((el, i) => arr.indexOf(el) === i);\n};\n\nexport const isFunction = (object) => type(object) === \"function\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/frontendlib/utils.js","import {\n camelCase,\n type,\n range,\n binaryFind,\n isFunction,\n timeout,\n} from \"./utils\";\n\nexport const addOneTimeListener = (\n el,\n eventName,\n fn,\n ignoreBubbling = false\n) => {\n const listener = (event) => {\n if (ignoreBubbling && event.target !== el) return;\n\n el.removeEventListener(eventName, listener);\n fn(event);\n };\n el.addEventListener(eventName, listener);\n};\n\n/** Responds to the first event triggered. Useful for polyfilling webkit prefixed events. */\nconst eventRacePromise = (\n el,\n events,\n { timeout, matchTarget = false } = {}\n) => {\n const eventsString = [].concat(events).join(\" \");\n return new Promise((resolve) => {\n let callbackRun = false;\n const callback = (...args) => {\n if (callbackRun || (matchTarget && el !== args[0].target)) return;\n callbackRun = true;\n resolve(...args);\n off(el, { [eventsString]: callback });\n };\n\n on(el, { [eventsString]: callback });\n if (timeout != null) {\n setTimeout(() => callback({ message: \"Promise timed out.\" }), timeout);\n }\n });\n};\n\nexport const animationEndPromise = (el, options = {}) => {\n return eventRacePromise(el, \"animationend webkitAnimationEnd\", options);\n};\n\nexport const transitionEndPromise = (el, options = {}) => {\n return eventRacePromise(el, \"transitionend webkitTransitionEnd\", options);\n};\n\n/**\n * Given:\n * - `el` - a DOM node\n * - `transitions` - an array where each element is either 1) a function, or 2) an object of style property\n * names to values\n * this sequentially 1) runs the function and waits for the Promise returned by the function to resolve (if\n * the function returns a Promise) before moving onto the next step, or 2) applies the styles to `el` and\n * waits for a `transitionend` event before moving onto the next step. Returns a Promise. `timeoutMS` is\n * an optional duration (in ms) after which the next transition should be run even if the previous transition\n * has not completed or if the previous function's returned promise has not resolved.\n */\nexport const runTransitionSequence = (\n el,\n transitions,\n { timeoutMS = null, continueFn = () => true } = {}\n) => {\n return transitions.reduce((prevTransitionEndPromise, thisTransition) => {\n return prevTransitionEndPromise.finally(() => {\n if (!continueFn()) {\n return Promise.resolve();\n }\n\n let currentTransitionEndPromise;\n if (isFunction(thisTransition)) {\n currentTransitionEndPromise = thisTransition();\n } else {\n currentTransitionEndPromise = transitionEndPromise(el);\n Object.assign(el.style, thisTransition);\n }\n\n if (timeoutMS == null) {\n return currentTransitionEndPromise;\n }\n\n return Promise.race([timeout(timeoutMS), currentTransitionEndPromise]);\n });\n }, Promise.resolve());\n};\n\nexport const appendChildren = (node, children) => {\n const fragment = document.createDocumentFragment();\n\n children.forEach((child) => {\n if (!child) return;\n\n fragment.appendChild(child instanceof Node ? child : createElement(child));\n });\n\n node.appendChild(fragment);\n};\n\nexport const copyToClipboard = (text, multiline) => {\n const elemType = multiline ? \"textarea\" : \"input\";\n const el = document.createElement(elemType);\n document.body.appendChild(el);\n el.value = text;\n el.select();\n document.execCommand(\"copy\");\n el.remove();\n};\n\n/**\n * @param {Object} elementConfig A map of options specifying a new Element.\n * @param {String} [elementConfig.namespace = null] A namespace URI to associate with the new element.\n * See https://developer.mozilla.org/en-US/docs/Web/API/Document/createElementNS for details.\n * @param {String} [elementConfig.tagName = \"div\"] The tag name determining the result\n * Element's type. Defaults to \"div\".\n * @param {String[]} [elementConfig.classList = []] A list of classes. Falsy values\n * are ignored. Defaults to [].\n * @param {{}} [elementConfig.style = {}] A map of style settings to merge into the result\n * Element's style. Defaults to {}.\n * @param {{}} [elementConfig.attributes = {}] A map of attributes to set on the result\n * Element. Defaults to {}.\n * @param {{}} [elementConfig.data = {}] A map of data to merge into the result Element's\n * dataset. Defaults to {}.\n * @param {({}|Element)[]} [elementConfig.children = []] An array of Elements or\n * elementConfigs to append as children. Falsy values are ignored. Defaults to [].\n * @param {{}} [elementConfig.eventHandlers = {}] A map from event names to handlers,\n * which will all be assigned to listen on the result Element. Defaults to {}.\n * @returns {HTMLElement} An Element object with properties corresponding to the parameters.\n */\nexport const createElement = (elementConfig) => {\n if (type(elementConfig) === \"string\" || type(elementConfig) === \"number\") {\n return document.createTextNode(elementConfig);\n }\n\n const {\n namespace = null,\n tagName = \"div\",\n classList = [],\n style = {},\n\n attributes = {},\n data = {},\n\n children = [],\n\n eventHandlers = {},\n ...unintendedProps\n } = elementConfig;\n\n const unintendedKeys = Object.keys(unintendedProps);\n if (unintendedKeys.length > 0) {\n throw new Error(\n `\\`createElement\\` must not receive unintended keys: ${JSON.stringify(\n unintendedKeys\n )}`\n );\n }\n\n const element =\n namespace == null\n ? document.createElement(tagName)\n : document.createElementNS(namespace, tagName);\n const filteredClassList = (classList || []).filter((className) => className);\n if (filteredClassList.length > 0) {\n element.classList.add(...filteredClassList);\n }\n Object.assign(element.style, style);\n\n Object.entries(attributes).forEach(([name, value]) => {\n element.setAttribute(name, value);\n });\n Object.assign(element.dataset, data);\n\n if (children.length > 0) {\n appendChildren(element, children);\n }\n\n on(element, eventHandlers);\n\n return element;\n};\n\nexport const empty = (node) => {\n while (node.firstChild) {\n node.removeChild(node.firstChild);\n }\n\n return node;\n};\n\nexport const fetchHTML = (url) => {\n return fetch(url)\n .then((response) => response.text())\n .then(strToElement);\n};\n\nexport const firstAncestor = (node, selector, halt = \"body\") => {\n while (node != null && !node.matches(selector)) {\n if (node.matches(halt)) return null;\n\n node = node.parentNode;\n }\n\n return node;\n};\n\n/**\n * Returns a DocumentFragment containing the given HTML string, or null if\n * the string is empty or falsey.\n */\nexport const fragmentFromString = (strHTML) => {\n if (!strHTML) {\n return null;\n }\n\n const templateEl = document.createElement(\"template\");\n templateEl.innerHTML = strHTML;\n return templateEl.content;\n};\n\n// Forces a reflow of the element so that cached styles are recomputed. This is\n// important for ensuring that animations are used when changing styles or CSS\n// classes via JS. See http://stackoverflow.com/q/11131875.\nexport const forceReflow = (el) => {\n el.offsetHeight;\n};\n\nexport const generateSnippetMap = (html) => {\n const wrapper = document.createElement(\"div\");\n wrapper.innerHTML = html;\n const snippets = [...wrapper.querySelectorAll(\"[data-snippet]\")].reduce(\n (coll, node) => {\n const name = node.dataset.snippet;\n coll[name] = node;\n node.removeAttribute(\"data-snippet\");\n node.remove();\n\n return coll;\n },\n {}\n );\n\n return (name) => {\n if (snippets[name] == null) return;\n\n return snippets[name].cloneNode(true);\n };\n};\n\nexport const getCSSProperty = (node, property) => {\n return window.getComputedStyle(node).getPropertyValue(property);\n};\n\nexport const getElementsByClass = (parent, classNames) => {\n return classNames.reduce((elements, name) => {\n elements[camelCase(name)] = parent.querySelector(`.${name}`);\n\n return elements;\n }, {});\n};\n\n// A version of `getBoundingClientRect` relative to a reference node instead\n// of the window.\nexport const getRelativeBoundingClientRect = (node, reference = null) => {\n if (reference == null) {\n reference = node.parentNode;\n }\n\n const rect = node.getBoundingClientRect();\n const refRect = reference.getBoundingClientRect();\n return {\n top: rect.top - refRect.top,\n bottom: rect.bottom - refRect.bottom,\n left: rect.left - refRect.left,\n right: rect.right - refRect.right,\n width: rect.width,\n height: rect.height,\n };\n};\n\n// Determines a bounding rectangle that encompasses all given nodes.\nexport const getAggregateBoundingClientRect = (nodes) => {\n return [...nodes].reduce(\n (agg, node) => {\n const rect = node.getBoundingClientRect();\n agg.top = Math.min(agg.top, rect.top);\n agg.bottom = Math.max(agg.bottom, rect.bottom);\n agg.left = Math.min(agg.left, rect.left);\n agg.right = Math.max(agg.right, rect.right);\n agg.width = Math.max(agg.width, rect.left - agg.left + rect.width);\n agg.height = Math.max(agg.height, rect.top - agg.top + rect.height);\n return agg;\n },\n {\n top: Infinity,\n bottom: 0,\n left: Infinity,\n right: 0,\n width: 0,\n height: 0,\n }\n );\n};\n\n// Given an element, this will return an integer that is the maximum font size (in px) that allows all the\n// text to fit without overflow.\nexport const getFontSizeToFit = (el, maxFontSizePx = 24) => {\n const startingFontSize = el.style.fontSize;\n const startingOverflow = el.style.overflow;\n el.style.overflow = \"hidden\";\n let high = maxFontSizePx + 1;\n let low = 0;\n el.style.fontSize = `${high}px`;\n while (low + 1 < high) {\n const mid = low + ((high - low) >> 1);\n el.style.fontSize = `${mid}px`;\n if (el.clientHeight < el.scrollHeight || el.clientWidth < el.scrollWidth) {\n high = mid;\n } else {\n low = mid;\n }\n }\n\n el.style.fontSize = startingFontSize;\n el.style.overflow = startingOverflow;\n return low;\n};\n\n/**\n * Attempt to calculate the `font-size` needed to have the text of `el` fit within the given number of lines.\n *\n * This is far from a perfect solution as there are several factors that determine line count not to mention\n * occasional ambiguity of what constitutes a \"line\" when there's `innerHTML` to contend with.\n *\n * @param {HTMLElement} el - Element with text to fit `maxLines`.\n * @param {number} maxLines - Max line count to calculate for.\n * @param {number} [precision] - The amount in px to incrementally adjust `font-size` by to determine changes.\n * @return {number} - In px.\n */\nexport const getFontSizeToFitLines = (el, maxLines, precision = 0.5) => {\n /**\n * NOTE(oscar): The computed style of certain \"older\" properties should always be in px regardless of\n * applied style.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle\n */\n const fontSize = parseFloat(getCSSProperty(el, \"font-size\"));\n\n const prevFontSizeStyle = el.style.fontSize;\n const prevHeight = el.style.height;\n const prevLineHeight = el.style.lineHeight;\n el.style.height = \"unset\";\n\n // NOTE(oscar): Ensures line-height is sensitive to changes in font-size.\n el.style.lineHeight = \"10em\";\n\n const computedFontSize =\n binaryFind(range(precision, fontSize, precision), (value) => {\n el.style.fontSize = `${value + precision}px`;\n const lineHeight = parseFloat(getCSSProperty(el, \"line-height\"));\n const paddingTop = parseFloat(getCSSProperty(el, \"padding-top\"));\n const paddingBottom = parseFloat(getCSSProperty(el, \"padding-bottom\"));\n const textHeight =\n el.getBoundingClientRect().height - paddingTop - paddingBottom;\n return textHeight > lineHeight * maxLines;\n }) || fontSize;\n\n el.style.height = prevHeight;\n el.style.fontSize = prevFontSizeStyle;\n el.style.lineHeight = prevLineHeight;\n return computedFontSize;\n};\n\nexport const indexOf = (node) => {\n return [].indexOf.call(node.parentNode.children, node);\n};\n\n// Returns a Promise that resolves when the passed Image is rendered (determined by polling for a non-zero\n// clientWidth and clientHeight).\nexport const imageIsRendered = (img, timeout = 10000) => {\n const start = Date.now();\n return new Promise((resolve, reject) => {\n const checkRendered = () => {\n if (Date.now() - start >= timeout) {\n reject(new Error(`Timeout loading image \"${img.src}\"`));\n } else if (img.clientWidth === 0 || img.clientHeight === 0) {\n requestAnimationFrame(checkRendered);\n } else {\n resolve();\n }\n };\n\n requestAnimationFrame(checkRendered);\n });\n};\n\nexport const off = (node, events) => {\n Object.keys(events).forEach((names) => {\n const listener = events[names];\n\n names\n .trim()\n .split(/\\s+/)\n .forEach((name) => {\n node.removeEventListener(name, listener);\n });\n });\n};\n\nexport const on = (node, events) => {\n Object.keys(events).forEach((names) => {\n const listener = events[names];\n\n names\n .trim()\n .split(/\\s+/)\n .forEach((name) => {\n node.addEventListener(name, listener);\n });\n });\n};\n\nexport const onAnimationsComplete = (els, callback) => {\n let animationsLeft = els.length;\n els.forEach((el) => {\n addOneTimeListener(el, \"webkitAnimationEnd\", () => {\n animationsLeft -= 1;\n if (animationsLeft === 0) {\n callback();\n }\n });\n });\n};\n\n// Returns a map of { units, value } for a CSS length property.\n// The length must be a string with \"px\" or \"%\" units or a value of 0.\nexport const parseCSSLength = (length) => {\n if (length === 0 || length === \"0\") return { value: 0, units: \"px\" };\n\n const match = /(.+)(px|%)/.exec(length);\n if (!match) return null;\n\n const [_, value, units] = match;\n if (value == null || units == null) return null;\n\n return { units, value: Number(value) };\n};\n\nexport const prependChild = (parentNode, node) => {\n parentNode.insertBefore(node, parentNode.children[0]);\n\n return parentNode;\n};\n\nexport const replaceStyle = (element, ...newStyles) => {\n element.removeAttribute(\"style\");\n Object.assign(element.style, ...newStyles);\n};\n\nexport const scrollIntoView = (node) => {\n const rect = node.getBoundingClientRect();\n const pRect = node.parentNode.getBoundingClientRect();\n const topDiff = rect.top - pRect.top;\n const botDiff = rect.bottom - pRect.bottom;\n\n if (topDiff < 0 && botDiff > 0) {\n node.parentNode.scrollTop += (topDiff + botDiff) / 2;\n } else if (topDiff < 0) {\n node.parentNode.scrollTop += topDiff;\n } else if (botDiff > 0) {\n node.parentNode.scrollTop += botDiff;\n }\n};\n\nexport const strToElement = (str) => {\n const div = document.createElement(\"div\");\n div.innerHTML = str.replace(/\\n\\s*/g, \"\");\n\n return div.firstChild;\n};\n\nexport const strToStyle = (str) => {\n const style = document.createElement(\"style\");\n style.innerHTML = str;\n\n return style;\n};\n\n/** Writes `contentHTML` into `iframeEl`. */\nexport const writeToIframe = (iframeEl, contentHTML) => {\n iframeEl.contentWindow.document.open();\n iframeEl.contentWindow.document.write(contentHTML);\n iframeEl.contentWindow.document.close();\n};\n\nexport const preparetagHTML = (tagHTML) => {\n const wrapperEl = document.createElement(\"div\");\n wrapperEl.innerHTML = tagHTML;\n\n // Script tags must be reattached in order to run.\n [...wrapperEl.querySelectorAll(\"script\")].forEach((originalScriptTag) => {\n const replacementScriptTag = document.createElement(\"script\");\n [...originalScriptTag.attributes].forEach(\n ({ nodeName: name, nodeValue: value }) => {\n replacementScriptTag.setAttribute(name, value);\n }\n );\n replacementScriptTag.innerHTML = originalScriptTag.innerHTML;\n originalScriptTag.parentNode.replaceChild(\n replacementScriptTag,\n originalScriptTag\n );\n });\n\n return wrapperEl;\n};\n\nexport const appendImpressionTags = (containerEl, impressionTags) => {\n impressionTags.forEach((tagHTML) => {\n const wrapper = preparetagHTML(tagHTML);\n containerEl.append(wrapper);\n });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/frontendlib/dom_utils.js","export const PLATFORM_ANDROID = \"android\";\nexport const PLATFORM_IOS = \"ios\";\n\nexport const AUDIO_POLICY_ALWAYS_MUTE = \"always-mute\";\nexport const AUDIO_POLICY_ON_INTERACTION = \"on-interaction\";\nexport const AUDIO_POLICY_NO_RESTRICTIONS = \"no-restrictions\";\n\n// TODO(Casey): Use constants instead of string literals for all exchanges\n// throughout.\nexport const EXCHANGE_APPLOVIN = \"applovin\";\nexport const EXCHANGE_DOUBLECLICK = \"doubleclick\";\nexport const EXCHANGE_INNERACTIVE = \"inneractive-direct\";\nexport const EXCHANGE_IRONSOURCE = \"ironsource\";\nexport const EXCHANGE_MOPUB = \"mopub\";\nexport const EXCHANGE_MINTEGRAL = \"mintegral\";\nexport const EXCHANGE_VUNGLE = \"vungle\";\n\nexport const ORIENTATION_PORTRAIT = \"portrait\";\nexport const ORIENTATION_LANDSCAPE = \"landscape\";\n\n// These must correspond to the rtb.proto ConnectionType enum definition.\nexport const CONNECTION_TYPE_WIFI = 2;\n\n// These must correspond to the rtb.proto ClickAreaType enum definition.\nexport const CLICK_AREA_TYPE_OTHER = 1;\nexport const CLICK_AREA_TYPE_CTA = 3;\n\nexport const CLICK_METRIC_TYPE_CLOSE = \"CLOSE\";\nexport const CLICK_METRIC_TYPE_CTA = \"CTA\";\nexport const CLICK_METRIC_TYPE_DEADZONE = \"DEADZONE\";\nexport const CLICK_METRIC_TYPE_UNKNOWN = \"UNKNOWN_CLICK_TYPE\";\n\n// This must correspond to the rtb.proto ClickRejectionReason enum definition.\nexport const CLICK_REJECTION_REASON_UNKNOWN = 0;\nexport const CLICK_REJECTION_REASON_NO_INTERACTIONS = 1;\n\n// This must correspond to the auction.proto ClickthroughURLType.\nexport const CLICKTHROUGH_URL_TYPE_LIFTOFF_ENDPOINT = 1;\nexport const CLICKTHROUGH_URL_TYPE_APP_STORE = 2;\n\n// This must correspond to the auction.proto ClickTrackingURLType.\nexport const CLICK_TRACKING_URL_TYPE_UNKNOWN = 0;\nexport const CLICK_TRACKING_URL_TYPE_LIFTOFF_ENDPOINT = 1;\n\n// This must correspond to the rtb.proto TrackingMethod enum definition.\nexport const TRACKING_METHOD_OPEN_METHOD = 1;\nexport const TRACKING_METHOD_IMAGE = 2;\nexport const TRACKING_METHOD_BEACON = 3;\n\nexport const AUTOCLICK_TYPE_LAST_INTERACTION = \"lastInteraction\";\nexport const AUTOCLICK_TYPE_INTERACTION_COUNT = \"interactionCount\";\nexport const AUTOCLICK_TYPE_LAST_INTERACTION_AND_INTERACTION_COUNT =\n \"lastInteractionAndInteractionCount\";\nexport const AUTOCLICK_TYPE_COMPLETED_DELAY = \"completedDelay\";\nexport const AUTOCLICK_TYPE_LOAD_DELAY = \"loadDelay\";\nexport const AUTOCLICK_TYPE_VIEWABLE_DELAY = \"viewableDelay\";\nexport const AUTOCLICK_TYPE_VIEWABLE_DELAY_WITH_RESET =\n \"viewableDelayWithReset\";\n\nexport const CLICK_OPEN_METHOD_WINDOW_OPEN = \"window_open\";\nexport const CLICK_OPEN_METHOD_MRAID = \"mraid\";\nexport const CLICK_OPEN_METHOD_ANCHOR = \"anchor\";\nexport const CLICK_OPEN_METHOD_LOCATION = \"location\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/constants.js","import {\n AdexpLog,\n AdexpMetricV2,\n AdexpMessage,\n AdexpJavaScriptError,\n} from \"./adexp\";\nimport {\n normalizeError,\n normalizeErrorEvent,\n shouldIgnoreError,\n} from \"../error_handling\";\nimport { request } from \"../frontendlib/utils\";\n\n/**\n * Sends log to Adexp.\n */\nconst postJSON = (url, data) => {\n /**\n * TODO(oscar): Investigate if we could improve empty payloads.\n * @see https://github.com/liftoffio/liftoff/pull/25293\n */\n if (data == null) {\n console.error(\"No data to post for logging.\");\n return Promise.resolve();\n }\n const payload = JSON.stringify(data);\n\n if (payload.length < 2) {\n console.error(\"Data could not be stringified for logging.\");\n return Promise.resolve();\n }\n\n return request(\n \"POST\",\n url,\n {\n // Don't set the content type to \"application/json\" because that requires\n // a preflight OPTIONS request (because this is a cross-domain request).\n \"Content-Type\": \"text/plain\",\n },\n payload\n ).catch(() => {\n console.error(\"Failed to post JSON for logging.\");\n });\n};\n\nconst postMetricV2 = (\n { adexpContextSnapshotFn, endpoint, eventTrackingParam },\n name,\n value\n) => {\n const adexpContext = adexpContextSnapshotFn();\n const payload = new AdexpMessage({\n context: adexpContext,\n metric: new AdexpMetricV2(name, value),\n });\n\n return postJSON(`${endpoint}/adexp_metrics/${eventTrackingParam}`, payload);\n};\n\nclass Logger {\n // #if process.env.NODE_ENV === \"test\"\n// static resetForTests() {\n// delete this.enabled;\n// delete this.loggedErrors;\n// delete this.endpoint;\n// delete this.eventTrackingParam;\n// delete this.adexpContextSnapshotFn;\n// }\n // #endif\n\n static init() {\n this.enabled = false;\n this.loggedErrors = [];\n }\n\n static enable() {\n this.enabled = true;\n }\n\n /**\n * Pass the logger required context\n * @param {string} endpoint - The endpoint to which the creative will post\n * AdExp logs or metrics.\n * @param {string} eventTrackingParam - The tracking parameter string which\n * includes encoded bid context information.\n * @param {function} adexpContextSnapshotFn - A function to call that will\n * take a snapshot of the current environment and return an `AdexpContext`\n * object.\n */\n static passContext(endpoint, eventTrackingParam, adexpContextSnapshotFn) {\n this.endpoint = endpoint;\n this.eventTrackingParam = eventTrackingParam;\n this.adexpContextSnapshotFn = adexpContextSnapshotFn;\n }\n\n /**\n * Listens for errors that are caught by the window and reports them to adexp.\n * Don't call this if you use your own custom error handlers.\n */\n static addErrorListeners() {\n window.addEventListener(\"error\", (errorEvent) => {\n const normalizedError = normalizeErrorEvent(errorEvent);\n this.recordError(normalizedError);\n });\n }\n\n /**\n * recordError takes an object like:\n * { message, line, column, sourceURL ... }\n * and logs the error to adexp.\n */\n static recordError(e) {\n this.recordLabeledError(\"error\", e);\n }\n\n static recordLabeledError(tag, e) {\n // #if process.env.NODE_ENV !== \"test\"\n console.error(e);\n // #endif\n this._processError(tag, e);\n }\n\n static _processError(tag, errorObj) {\n if (shouldIgnoreError(errorObj)) {\n return;\n }\n\n const normalizedErr = normalizeError(errorObj);\n\n // Only log one error per (sourceURL, line #, message) combination. This\n // prevents noise from certain errors that are logged many times\n // from a single impression.\n const errorIdentifier = [\n normalizedErr.sourceURL,\n normalizedErr.line,\n normalizedErr.message,\n ].join(\"-\");\n\n if (this.loggedErrors.includes(errorIdentifier)) {\n return;\n }\n\n this.loggedErrors.push(errorIdentifier);\n this.recordLog(\n tag,\n normalizedErr.message,\n new AdexpJavaScriptError(normalizedErr)\n );\n }\n\n static recordLog(tag, message, data) {\n if (!this.enabled) {\n return;\n }\n\n const adexpContext = this.adexpContextSnapshotFn();\n const payload = new AdexpMessage({\n context: adexpContext,\n log: new AdexpLog(tag, message, data),\n });\n\n return postJSON(\n `${this.endpoint}/adexp_log/${this.eventTrackingParam}`,\n payload\n );\n }\n\n static recordMetricV2(name, value) {\n if (!this.enabled) {\n return Promise.resolve();\n }\n return postMetricV2(\n {\n endpoint: this.endpoint,\n eventTrackingParam: this.eventTrackingParam,\n adexpContextSnapshotFn: this.adexpContextSnapshotFn,\n },\n name,\n value\n );\n }\n\n static recordVXOnlyAdexpMetric(name, value) {\n if (!Number.isInteger(value)) {\n console.debug(\"Expected an integer value for VXOnlyAdexpMetric: \" + name);\n return;\n }\n\n return this.alwaysRecordMetricV2(\"custom_event\", {\n name: name,\n value: value,\n });\n }\n\n static alwaysRecordMetricV2(name, value) {\n return postMetricV2(\n {\n endpoint: this.endpoint,\n eventTrackingParam: this.eventTrackingParam,\n adexpContextSnapshotFn: this.adexpContextSnapshotFn,\n },\n name,\n value\n );\n }\n}\n\n// TODO(oscar): Create a global Logger.\nLogger.init();\n\nexport default Logger;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/logger.js","class AutoclickBehaviorAbstract {\n constructor({ autoclick, behavior, delayClickthroughHandler }) {\n this._autoclick = autoclick;\n this._behavior = behavior;\n this.internalCount = 0;\n this.delayClickthroughHandler = delayClickthroughHandler;\n this.init();\n }\n\n /** Runs when the class is instantiated. */\n init() {}\n\n /**\n * Only relevant for types that count something like interactions.\n * @returns {number} - Minimum amount until enabling delayed clickthrough.\n */\n getBehaviorCount() {\n return this._behavior == null ? null : this._behavior.count;\n }\n\n getBehaviorType() {\n return this._behavior == null ? null : this._behavior.type;\n }\n\n /**\n * How long to delay clickthrough by.\n * @returns {number} - Delay value in milliseconds.\n */\n getBehaviorDelay() {\n return this._behavior == null ? null : this._behavior.delay;\n }\n\n isCountReached() {\n return this.getCurrentCount() >= this.getBehaviorCount();\n }\n\n getCurrentCount() {\n return this.internalCount;\n }\n\n setCurrentCount(n) {\n if (typeof n !== \"number\") {\n throw new Error(`n must be a number, got: ${n}`);\n }\n this.internalCount = n;\n }\n\n /** Triggers a delayed clickthrough event. */\n delayClickthrough(delay = this.getBehaviorDelay()) {\n if (!this.isCountReached()) return;\n\n this.delayClickthroughHandler(delay);\n }\n\n /**\n * Triggered by the InteractionMonitor class.\n */\n onInteraction(_) {}\n\n /**\n * Should trigger when the creative is \"finished\". Typically this is the moment\n * an endscreen will appear.\n */\n onCompleted() {}\n\n /**\n * Triggers when an \"engagement\" event occurs. Engagement must be fired by the\n * creative or a subcomponent thereof.\n */\n onEngagement() {}\n\n onHtmlLoaded() {}\n\n onViewable() {}\n\n onViewableChange(_) {}\n}\nexport default AutoclickBehaviorAbstract;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/autoclick/AutoclickBehaviorAbstract.js","import { mergePropertiesWithDefaults, selectKeys } from \"./frontendlib/utils\";\n\n// if process.env.NODE_ENV === \"test\"\nexport const isTestError = (error) => {\n // NOTE(Austin): Annoyingly, assertion errors will loop back here in\n // tests, so we have to ignore these.\n return error != null && error.constructor.name === \"AssertionError\";\n};\n// #endif\n\nexport class Warning extends Error {\n constructor(...params) {\n super(...params);\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, Warning);\n }\n this.severity = \"warning\";\n }\n}\n\nconst tryConvertStringToNumber = (str) => {\n if (str == null) {\n return 0;\n }\n\n const parsed = parseInt(str);\n if (Number.isNaN(parsed)) {\n return 0;\n }\n\n return parsed;\n};\n\nexport const tryParseStackInfo = (stack) => {\n if (stack == null) {\n return null;\n }\n\n const match = String(stack).match(\n // NOTE(Austin): We include about:srcdoc for inner_env errors.\n /(\\b(?:[^ ]*\\.js.*?)|(?:about:srcdoc)):(\\d+)?:?(\\d+)?/\n );\n\n if (match == null) {\n return null;\n }\n\n // Line and column need to be integers. We have them in our adexp\n // protobuf this way, so if they aren't we'll get a malformed message.\n return {\n sourceURL: match[1],\n line: tryConvertStringToNumber(match[2]),\n column: tryConvertStringToNumber(match[3]),\n };\n};\n\n/**\n * Converts an Error or string into a map like\n * { message, stack, sourceURL, line, column }\n */\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/Error\nexport const normalizeError = (obj) => {\n if (obj == null) {\n return null;\n }\n\n if (typeof obj === \"string\") {\n return {\n message: obj,\n };\n }\n\n const errorProps = selectKeys(obj, Object.getOwnPropertyNames(obj));\n\n return {\n ...tryParseStackInfo(errorProps.stack),\n ...errorProps,\n };\n};\n\n/**\n * Converts an ErrorEvent object to a map like:\n * { message, line, column, sourceURL }\n * plus any additional information the error object contains.\n */\nexport const normalizeErrorEvent = ({\n // https://developer.mozilla.org/en-US/docs/Web/API/ErrorEvent\n message,\n filename,\n lineno,\n colno,\n error,\n}) => {\n try {\n // Possible keys in an ErrorEvent:\n // [stack, name, fileName, lineNumber, columnNumber]\n const errorProps =\n error != null ? selectKeys(error, Object.getOwnPropertyNames(error)) : {};\n\n const errorObj = {\n message,\n severity: error && error.severity ? error.severity : \"error\",\n line: lineno,\n column: colno,\n sourceURL: filename,\n ...errorProps,\n };\n\n if (error == null) {\n return errorObj;\n }\n\n const parsedInfo = tryParseStackInfo(error.stack);\n return mergePropertiesWithDefaults(errorObj, parsedInfo);\n } catch (e) {\n console.error(`Error in normalizeErrorEvent: ${e.stack}`);\n return null;\n }\n};\n\n/**\n * Converts an PromiseRejectionEvent object to a map like\n * { message, line, column, sourceURL }\n * plus any additional information the error object contains.\n */\nexport const normalizePromiseRejectionEvent = ({\n // https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n reason,\n}) => {\n try {\n const reasonIsError = reason instanceof Error;\n const reasonIsString = typeof reason === \"string\";\n\n const errorMessage = reasonIsString ? reason : reason.message;\n\n // Possible keys in object (* are non-standard):\n // [message, stack*, name, fileName*, lineNumber*, columnNumber*]\n const errorProps = reasonIsError\n ? selectKeys(reason, Object.getOwnPropertyNames(reason))\n : {};\n\n const errorObj = {\n message: errorMessage,\n ...errorProps,\n };\n\n return mergePropertiesWithDefaults(\n errorObj,\n tryParseStackInfo(reason.stack)\n );\n } catch (e) {\n console.error(`Error in normalizePromiseRejectionEvent: ${e.stack}`);\n return null;\n }\n};\n\n/**\n * Normalizes the error and returns true if the error should be ingored;\n * otherwise, returns false.\n */\nexport const shouldIgnoreError = (errorObj) => {\n // Report only errors with non-malformed sourceURL.\n if (errorObj == null || errorObj.sourceURL === \"undefined\") {\n return true;\n }\n\n // mraid.js from adverty.com is a buggy implemenation. SMAATO and PUBMATIC are\n // the exchanges using such version and we see strange errors from the most.\n // While we are working with them to get a good MRAID implementation we filter\n // the noisy error messages by checking where the mraid.js is from.\n const stackFilter = new RegExp(\"adverty\\\\.com/.*mraid\\\\.js\");\n\n // We see these errors quite often, and they are not related to our code.\n const regexFilters = [\n \"Cannot read properties of undefined \\\\(reading 'fireEvent'\\\\)\",\n \"Cannot read property 'fireEvent' of undefined\",\n \"showInterstitial\",\n \"al_onPoststitialDismiss\",\n \"AFMA_ReceiveMessage\",\n \"webviewDidAppear\",\n \"AFMA_updateActiveView is not a function\",\n \"al_onAdViewRendered\",\n \"mraidbridge\",\n \"MoatMAK\",\n \"$adgIOS\",\n \"googqscp\",\n \"inmobi\",\n \"Script error\",\n \"avidbridge\",\n ];\n const messageFilter = new RegExp(regexFilters.join(\"|\"));\n const errorStr = errorObj.message || errorObj.toString();\n if (messageFilter.test(errorStr) || stackFilter.test(errorObj.stack)) {\n return true;\n }\n\n const normalized = selectKeys(errorObj, [\n \"message\",\n \"line\",\n \"column\",\n \"stack\",\n \"sourceURL\",\n ]);\n\n const nKeys = Object.keys(normalized).length;\n const onlyMessage =\n \"message\" in errorObj &&\n nKeys === 1 &&\n errorObj.message === \"undefined is not a function\";\n\n const onlyMessageStack =\n \"stack\" in errorObj &&\n \"message\" in errorObj &&\n nKeys === 2 &&\n errorObj.stack === \"\" &&\n errorObj.message === \"undefined is not a function\";\n\n const noSourceURL = errorObj.sourceURL == null && nKeys === 5;\n return onlyMessage || onlyMessageStack || noSourceURL;\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/error_handling.js","import { selectKeys, type } from \"./utils\";\n\nclass EventListener {\n static pubsubify(object) {\n const methods = Object.getOwnPropertyNames(EventListener.prototype).filter(\n (name) => name !== \"constructor\"\n );\n Object.assign(object, new EventListener());\n Object.assign(object, selectKeys(EventListener.prototype, methods));\n }\n\n constructor() {\n this.events = {};\n }\n\n on(map, callback) {\n if (type(map) !== \"object\") {\n map = { [map]: callback };\n }\n\n Object.keys(map).forEach((name) => {\n if (this.events[name] == null) {\n this.events[name] = [];\n }\n\n this.events[name].push(map[name]);\n });\n }\n\n once(name, callback) {\n const single = (...args) => {\n this.off(name, single);\n callback.apply(null, args);\n };\n\n this.on(name, single);\n }\n\n off(map, callback) {\n if (type(map) !== \"object\") {\n map = { [map]: callback };\n }\n\n Object.keys(map).forEach((name) => {\n if (this.events[name] == null) return;\n\n const callback = map[name];\n if (callback == null) return delete this.events[name];\n\n this.events[name] = this.events[name].filter((cb) => cb !== callback);\n if (this.events[name].length === 0) {\n delete this.events[name];\n }\n });\n }\n\n emit(name, ...args) {\n if (this.events[name] == null) return;\n\n return Promise.all(this.events[name].map((cb) => cb.apply(null, args)));\n }\n\n relay(listener, onEvent, emitEvent = onEvent) {\n this.on(onEvent, listener.emit.bind(listener, emitEvent));\n }\n}\n\nexport default EventListener;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/frontendlib/event_listener.js","import EventListener from \"../frontendlib/event_listener\";\nimport { runAsync, type, appendParamObjectToURL } from \"../frontendlib/utils\";\nimport {\n EXCHANGE_IRONSOURCE,\n EXCHANGE_MINTEGRAL,\n EXCHANGE_VUNGLE,\n EXCHANGE_INNERACTIVE,\n TRACKING_METHOD_OPEN_METHOD,\n CLICK_OPEN_METHOD_WINDOW_OPEN,\n CLICK_OPEN_METHOD_MRAID,\n CLICK_OPEN_METHOD_ANCHOR,\n CLICK_OPEN_METHOD_LOCATION,\n} from \"../constants\";\nimport Logger from \"./logger\";\nimport { Warning } from \"../error_handling\";\n\n/**\n * This interval is the time between attempts to open a URL via different\n * methods (see `LiftoffMRAID.open`).\n */\nconst CLICK_RETRY_INTERVAL_MS = 1000;\n\nconst CLICK_OPEN_METHODS = {\n WINDOW_OPEN: \"window_open\",\n MRAID: \"mraid\",\n ANCHOR: \"anchor\",\n LOCATION: \"location\",\n};\n\n/**\n * This is a low-level wrapper around mraid that should be usable generally\n * (i.e. in any HTML ad environment). It's used by both madlib and third-party\n * creatives.\n */\nclass LiftoffMRAID {\n /**\n * Among other things, this function attaches event listeners to the\n * window.mraid object. It should be called as soon as possible after\n * window.mraid is defined. Because of this side-effect, it should also only\n * be called once.\n */\n static init() {\n this.liftoffMraidInitTimestamp = Date.now();\n\n EventListener.pubsubify(this);\n this.on = this.on.bind(this);\n this.once = this.once.bind(this);\n this._addMraidEventListener = this._addMraidEventListener.bind(this);\n\n this.viewableDurationMS = null;\n this.lastViewableTS = null;\n this.clickRetryTimeout = null;\n this.lastOpenedURL = null;\n this.isOrientationLocked = false;\n this.orientationToLock = null;\n this.viewable = null;\n this.isViewableByEvent = null;\n\n /** Keeps track of each version of window.mraid loaded. */\n this.mraids = [];\n /** This index of this.mraids that is currently loaded on window.mraid. */\n this.mraidIndex = null;\n\n /**\n * This object keeps track of what the current mraid object supports at the\n * moment support was checked.\n */\n this.supported = {\n methods: {},\n /**\n * NOTE(oscar): Unlike MRAID methods, we log mraid events that we listen\n * to as they occur.\n */\n events: {},\n };\n\n this._setInitialState();\n this._addEventListeners();\n }\n\n /** Returns time since LiftoffMRAID has been initialized in milliseconds. */\n static sinceInit() {\n return Date.now() - this.liftoffMraidInitTimestamp;\n }\n\n static getSupportedLog() {\n return {\n \"document.hidden\": document.hidden,\n \"document.visibilityState\": document.visibilityState,\n \"LiftoffMRAID.viewable\": LiftoffMRAID.viewable,\n MRAID_ENV: window.MRAID_ENV,\n ...this.supported,\n };\n }\n\n static _setInitialState() {\n const mraid = this.getMRAID();\n this.ready = this._mraidTry(\n () => {\n return this.hasSupport(\"getState\") && mraid.getState() === \"default\";\n },\n { tag: \"getState\", fallback: false }\n );\n\n this.isViewableByEvent = this.hasSupport(\"isViewable\")\n ? this._mraidTry(() => mraid.isViewable(), {\n tag: \"isViewable\",\n // NOTE(oscar): If isViewable() still fails, we fall back to\n // document.visibilityState.\n fallback: document.visibilityState !== \"hidden\",\n })\n : document.visibilityState !== \"hidden\";\n this.processViewableChange(\n this.isViewableByEvent && this.isViewportShown()\n );\n this.viewableDurationMS = 0;\n }\n\n /** TODO(oscar): Don't append to log if it won't be sent to Adexp. */\n static _appendEventLog(eventName, mraidIndex, args) {\n if (this.supported.events[eventName] == null) {\n this.supported.events[eventName] = [];\n }\n this.supported.events[eventName].push({\n sinceInitMs: this.sinceInit(),\n args,\n mraidIndex,\n version: this.getMRAIDVersion(),\n });\n }\n\n /**\n * This function is used to wrap calls to mraid methods in a try/catch block.\n * Any error gets logged in this.supported.errors.\n *\n * In general, this.hasSupport() is used to check for support. This function\n * serves as a further safeguard against errors due to faulty mraid\n * implementations.\n */\n static _mraidTry(\n func,\n { tag = \"other\", fallback = undefined, logError = true }\n ) {\n try {\n return func();\n } catch (e) {\n if (logError) {\n // Record the error.\n this.supported.errors = this.supported.errors || [];\n let version;\n try {\n version = this.getMRAID().getVersion();\n } catch (ee) {\n console.error(\"Failed to get MRAID version\", ee);\n }\n this.supported.errors.push({\n tag,\n sinceInitMs: this.sinceInit(),\n message: e != null ? e.message : null,\n mraidIndex: this.mraidIndex,\n version,\n });\n }\n return fallback;\n }\n }\n\n static _addMraidEventListener(eventName, callback) {\n if (!this.hasSupport(\"addEventListener\")) return;\n\n const mraid = this.getMRAID();\n const mraidIndex = this.mraidIndex;\n\n this._mraidTry(\n () => {\n mraid.addEventListener(eventName, (...args) => {\n this._appendEventLog(eventName, mraidIndex, args);\n\n callback(...args);\n });\n },\n { tag: eventName }\n );\n }\n\n static _addEventListeners() {\n // \"error\" events include 2 arguments: a message and an action. The action\n // is the MRAID API call that caused the error.\n this._addMraidEventListener(\"error\", (...args) => {\n const e = new Error(`MRAID error: ${args}`);\n this.emit(\"error\", e);\n });\n this._addMraidEventListener(\"ready\", () => {\n if (this.ready) return;\n this.ready = true;\n this.emit(\"ready\");\n });\n this._addMraidEventListener(\"viewableChange\", (viewable) => {\n this.isViewableByEvent = viewable;\n this.processViewableChange(\n this.isViewableByEvent && this.isViewportShown()\n );\n });\n\n // NOTE(oscar): We're using _addMraidEventListener to log this event.\n this._addMraidEventListener(\"exposureChange\", () => {});\n\n /**\n * The following is a fallback in case mraid's viewableChange is not\n * supported.\n */\n document.addEventListener(\"visibilitychange\", (...args) => {\n this._appendEventLog(\"document.visibilitychange\", this.mraidIndex, args);\n\n /**\n * We delay the following by an event cycle to allow mraid's\n * viewableChange event to occur first.\n */\n runAsync(() => {\n if (this.supported.events.viewableChange == null) {\n this.isViewableByEvent = document.visibilityState !== \"hidden\";\n this.processViewableChange(\n this.isViewableByEvent && this.isViewportShown()\n );\n }\n });\n });\n }\n\n static processViewableChange(isViewable) {\n /**\n * NOTE(oscar): On the off chance the mraid implementation gives us\n * truthy/falsey values instead.\n */\n const normalizedIsViewable = !!isViewable;\n if (normalizedIsViewable === this.viewable) return;\n this.viewable = normalizedIsViewable;\n\n if (this.viewable) {\n this.lastViewableTS = Date.now();\n if (!this.isOrientationLocked && this.orientationToLock != null) {\n // NOTE(oscar): We won't lock the orientation until after the ad is\n // viewable.\n this.lockOrientation(this.orientationToLock);\n }\n } else {\n this.viewableDurationMS +=\n this.lastViewableTS == null ? 0 : Date.now() - this.lastViewableTS;\n this.lastOpenedURL = null;\n clearTimeout(this.clickRetryTimeout);\n }\n\n if (this.viewable) {\n this.emit(\"viewable\");\n }\n this.emit(\"viewableChange\", this.viewable);\n }\n\n static onReady(fn) {\n if (this.ready) {\n runAsync(fn);\n return;\n }\n this.once(\"ready\", fn);\n }\n\n /**\n * Adds a listener to the \"viewable\" event. The \"viewable\" event fires\n * whenever we believe the ad has become visible to the user. If the ad was\n * already visible, then it fires the listener immediately.\n * @param {Function} callback\n * @param {boolean} continuous – Whether to listen to all viewable events.\n * Defaults to false, meaning it will only trigger the callback once.\n * @returns\n */\n static onViewable(callback, continuous = false) {\n if (this.viewable) {\n runAsync(callback);\n if (!continuous) return;\n }\n const deferrer = continuous ? this.on : this.once;\n deferrer(\"viewable\", callback);\n }\n\n /** Runs fn now with current viewable value and on \"viewableChange\" event. */\n static nowAndOnViewableChange(fn) {\n runAsync(() => fn(this.viewable));\n\n this.on(\"viewableChange\", fn);\n }\n\n // TODO(oscar): Replace with nowAndOnViewableChange once v2 productionizes.\n static onViewableChange(fn) {\n this.nowAndOnViewableChange(fn);\n }\n\n // IMPORTANT: This method MUST be called synchronously with a user action.\n static open(\n url,\n {\n // NOTE(Austin): Disable eslint for fields being unused, because\n // we don't want to have to keep removing/re-adding it.\n exchange,\n // eslint-disable-next-line\n platform,\n // eslint-disable-next-line\n abTests = [],\n isLiftoffURL = false,\n isAutoclick = false,\n }\n ) {\n // To prevent the click waterfall from resetting if the user clicks twice in\n // rapid succession, don't restart the waterfall unless the URL being opened\n // is different.\n if (this.lastOpenedURL === url) return;\n\n this.lastOpenedURL = url;\n clearTimeout(this.clickRetryTimeout);\n\n const mraid = this.getMRAID();\n // NOTE(oscar): Check to see if mraid.open is currently available.\n const mraidOpenIsSupported = this.hasSupport(\"open\");\n // NOTE(Casey): Ironsource requires us to only use mraid.open\n // for opening clickthrough URLs.\n const requireMRAID =\n mraidOpenIsSupported && (isAutoclick || exchange === EXCHANGE_IRONSOURCE);\n\n const clickWaterfallDisabled =\n exchange === EXCHANGE_MINTEGRAL ||\n exchange === EXCHANGE_VUNGLE ||\n exchange == EXCHANGE_INNERACTIVE;\n\n const getFinalClickURL = (openMethod) => {\n return isLiftoffURL\n ? appendParamObjectToURL(url, {\n open_method: openMethod,\n tracking_method: TRACKING_METHOD_OPEN_METHOD,\n })\n : url;\n };\n\n // To ensure that the user can click through, attempt multiple methods of\n // navigating to the URL. In order, they are:\n // 1. `mraid.open`, if mraid is available\n // 2. A fake anchor element\n // 3. `window.location`\n let openMethods = [\n // NOTE(vsingh): The window.open method is not used currently, but may be\n // used in future tests that compare click methods.\n {\n type: CLICK_OPEN_METHOD_WINDOW_OPEN,\n enabled: false,\n fn: (url) => window.open(url),\n },\n {\n type: CLICK_OPEN_METHOD_MRAID,\n enabled: mraidOpenIsSupported,\n fn: (url) => {\n if (!this.ready) {\n this.emit(\n \"error\",\n new Error(\"Called mraid.open before mraid was ready\")\n );\n }\n\n mraid.open(url);\n },\n },\n {\n type: CLICK_OPEN_METHOD_ANCHOR,\n enabled: !requireMRAID,\n fn: (url) => {\n const a = document.createElement(\"a\");\n a.href = url;\n a.target = \"_blank\";\n a.click();\n },\n },\n {\n type: CLICK_OPEN_METHOD_LOCATION,\n enabled: !requireMRAID,\n fn: (url) => {\n window.location = url;\n },\n },\n ].filter(({ enabled }) => enabled);\n\n if (clickWaterfallDisabled) {\n openMethods = openMethods.slice(0, 1);\n }\n\n /**\n * Checks if we expect for the SKProductView will open. If so, then it's\n * likely for no visibility event to occur.\n * TODO(oscar/cwu): Replace url check with other `skproductview` indicating\n * boolean that should be populated from h2go.\n */\n const isOpenSKProductView = (openMethod, url) => {\n const appleStoreUrlPrefix = new RegExp(\"^(https?://)?apps\\\\.apple\\\\.com\");\n return (\n openMethod.type === CLICK_OPEN_METHODS.MRAID &&\n appleStoreUrlPrefix.test(url)\n );\n };\n\n const tryOpen = (index = 0) => {\n // We don't emit any error if we're in the waterfall experiment\n // because this is guaranteed to happen if the user clicks more than\n // once (whereas in the original this will only happen if it thinks a\n // click failed).\n if (index > 0) {\n const methodType = openMethods[index - 1].type;\n this.emit(\n \"error\",\n new Warning(`Failed to open ${url} using ${methodType}`)\n );\n }\n if (index === openMethods.length - 1) {\n this.lastOpenedURL = null;\n }\n if (\n index >= openMethods.length &&\n !(index === 1 && isOpenSKProductView(openMethods[0], url))\n ) {\n this.emit(\n \"error\",\n new Error(\n `Failed to open ${url} by any methods. Tried ${openMethods.length} method(s)`\n )\n );\n return;\n }\n\n const openMethod = openMethods[index];\n const finalClickURL = getFinalClickURL(openMethod.type);\n openMethod.fn(finalClickURL);\n this.emit(\"clickMethodTried\", {\n clickOpenMethod: openMethod.type,\n isAutoclick,\n });\n\n this.clickRetryTimeout = setTimeout(\n tryOpen.bind(this, index + 1),\n CLICK_RETRY_INTERVAL_MS\n );\n };\n\n tryOpen();\n }\n\n static close() {\n this.onReady(() => {\n Logger.recordMetricV2(\"close_count\", 1);\n\n if (!this.hasSupport(\"close\")) {\n this.emit(\n \"error\",\n new Warning(\n \"Attempted to call 'MRAID.close' when it is not supported.\"\n )\n );\n return;\n }\n\n this.getMRAID().close();\n });\n }\n\n // NOTE(brian): The `useCustomClose` method is deprecated (read: ignored) in\n // MRAID 3.0.\n // NOTE(Casey): Unity's `useCustomClose` throws an error. Although we handle\n // this case by not trying custom custom close on Unity, this implementation\n // handles that scenario in case other exchanges are (unknowingly) similar.\n /**\n * Returns a `Promise` that resolves with `false` if custom close was not set\n * or to `true` if custom close was set successfully. The `Promise` rejects\n * if an error was thrown.\n */\n static useCustomClose(use) {\n return new Promise((resolve, reject) => {\n try {\n this.onReady(() => {\n if (\n !(\n this.hasSupport(\"useCustomClose\") &&\n this.hasSupport(\"close\") &&\n use\n )\n ) {\n return resolve(false);\n }\n const mraid = this.getMRAID();\n mraid.useCustomClose(use);\n resolve(use);\n });\n } catch (e) {\n reject(e);\n }\n });\n }\n\n static getViewableDurationMS() {\n if (!this.viewable) return this.viewableDurationMS;\n if (this.lastViewableTS == null) {\n console.error(\n \"Internal LiftoffMRAID error: this.lastViewableTS should be set.\"\n );\n return this.viewableDurationMS;\n }\n return this.viewableDurationMS + (Date.now() - this.lastViewableTS);\n }\n\n static lockOrientation(orientation) {\n if (\n !this.ready ||\n !this.viewable ||\n !this.hasSupport(\"setOrientationProperties\")\n ) {\n return;\n }\n\n this.orientationToLock = orientation;\n const mraid = this.getMRAID();\n this._mraidTry(\n () => {\n mraid.setOrientationProperties({\n allowOrientationChange: false,\n forceOrientation: orientation,\n });\n },\n { tag: \"setOrientationProperties\" }\n );\n this.isOrientationLocked = true;\n }\n\n static getMRAID() {\n const windowMraid = window.mraid;\n if (windowMraid != null) {\n // NOTE(oscar): There are some sdks that will delete window.mraid after it\n // was initialized. In some cases at least, this is done to replace the\n // mraid object with a new one, but it's unclear why this is done in an\n // asynchronous way. In order not to race with the SDK's implementation of\n // MRAID, we will use the last mraid object loaded as a fallback.\n // Related test: https://docs.google.com/document/d/1TWLnTFlTGFc6ZJB_UXfR8QvmEa8x_d3k532fmX-13Fs\n // Related test 2: https://docs.google.com/document/d/1iChTG_zLZvQzI5Opw-6kpHqRCXRYklTPpbNB7TPBFdQ\n this.mraidIndex = this.mraids.indexOf(windowMraid);\n if (this.mraidIndex === -1) {\n this.mraidIndex = this.mraids.length;\n this.mraids.push(windowMraid);\n }\n }\n\n return this.mraids[this.mraidIndex];\n }\n\n static logMethodSupport(methodName, isSupported) {\n if (this.supported.methods[methodName] == null) {\n this.supported.methods[methodName] = {};\n }\n if (this.supported.methods[methodName][this.mraidIndex] == null) {\n this.supported.methods[methodName][this.mraidIndex] = [];\n }\n // NOTE(oscar): The MRAID spec allows for a method to go from no support to\n // support when the mraid's \"ready\" event triggers.\n this.supported.methods[methodName][this.mraidIndex].push({\n sinceInitMs: this.sinceInit(),\n ready: this.ready,\n support: isSupported,\n /** Logging is disabled here to prevent an infinite loop. */\n version: this.getMRAIDVersion({ log: false }),\n });\n }\n\n /**\n * Checks to see if the MRAID implementation supports the given method.\n * More specifically, this checks to see if the method is a function on the\n * window.mraid object. It does not actually call the method to see if it\n * works and any caller should be prepared to handle errors.\n *\n * @param {string} prop - The name of the method to check.\n * @param {Object} options\n * @param {boolean} options.log - Whether to log the result of the check.\n */\n static hasSupport(prop, { log = true } = {}) {\n const mraid = this.getMRAID();\n if (mraid == null) {\n return false;\n }\n\n if (prop === \"mraid\") {\n return true;\n }\n\n const support = type(mraid[prop]) === \"function\";\n\n if (log) {\n this.logMethodSupport(prop, support);\n }\n\n return support;\n }\n\n /** Returns the currently loaded MRAID version. */\n static getMRAIDVersion({ log = true } = {}) {\n return this._mraidTry(\n () => {\n return this.hasSupport(\"getVersion\", { log })\n ? this.getMRAID().getVersion()\n : null;\n },\n { tag: \"getVersion\", logError: log }\n );\n }\n\n static isViewportShown() {\n return window.innerHeight > 0 && window.innerWidth > 0;\n }\n}\n\nif (window._LiftoffMRAID == null) {\n LiftoffMRAID.init();\n /**\n * NOTE(oscar): Global state is needed in order to only call .init() once and\n * to ensure that the same LiftoffMRAID is exported.\n */\n window._LiftoffMRAID = LiftoffMRAID;\n}\n\nexport default window._LiftoffMRAID;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/liftoff_mraid.js","// Wrappers around adexp objects contained in adexpjson.go\n\nexport class AdexpMetricV2 {\n constructor(name, value) {\n this.name = name;\n this.value = value;\n }\n}\n\nexport class AdexpJavaScriptError {\n constructor({\n message,\n severity = \"error\",\n sourceURL,\n line,\n column,\n stack,\n } = {}) {\n this.error = {\n message,\n severity,\n sourceURL,\n line,\n column,\n stack,\n };\n }\n}\n\nexport class AdexpLog {\n constructor(tag, message, data) {\n this.tag = tag;\n this.message = message;\n Object.assign(this, data);\n }\n}\n\nexport class AdexpContext {\n constructor({ viewportWidth, viewportHeight, adLanguage, mraid } = {}) {\n this.ad_language = adLanguage;\n this.mraid = mraid;\n this.viewport_height = viewportHeight;\n this.viewport_width = viewportWidth;\n }\n}\n\nexport class AdexpMessage {\n constructor({ context, metric, log } = {}) {\n Object.assign(this, context);\n // NOTE(Austin): metrics_v2 must be an array. For now\n // we don't log more than one metric at a time though.\n this.metrics_v2 = metric != null ? [metric] : undefined;\n this.log = log;\n }\n}\n\n// TODO(Austin): Consolidate ClickMetric here.\n\n/**\n * Returns a function that takes a snapshot of the current environment\n * and returns a `AdexpContext`.\n */\nexport const getAdexpContextSnapshotFn = (viewportEl, hasMraidFn) => () => {\n const { width, height } =\n viewportEl != null ? viewportEl.getBoundingClientRect() : {};\n return new AdexpContext({\n viewportWidth: width != null ? Math.round(width) : undefined,\n viewportHeight: height != null ? Math.round(height) : undefined,\n adLanguage: navigator.language,\n mraid: hasMraidFn(),\n });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/adexp.js","const patchedObjects = [];\n\nclass MonkeyPatch {\n // #if process.env.NODE_ENV === \"test\"\n// static resetAll() {\n// patchedObjects.forEach(({ obj, propertyName, dataKey, value }) => {\n// MonkeyPatch._applyPatch(obj, propertyName, { [dataKey]: value });\n// });\n// \n// // Clear the array.\n// patchedObjects.splice(0, patchedObjects.length);\n// }\n // #endif\n\n static _applyPatch(obj, propertyName, protoMap) {\n if (obj.propertyName !== undefined) {\n delete obj[propertyName];\n }\n\n try {\n // See\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#Description\n Object.defineProperty(obj, propertyName, protoMap);\n } catch (e) {\n // TODO(Austin): Delete added patchedObject entry?\n throw new Error(\n `Cannot monkey patch ${obj.constructor.name}[${propertyName}], because: '${e}'.`\n );\n }\n }\n\n static _patch(obj, propertyName, dataKey, value) {\n const originalValue = Object.getOwnPropertyDescriptor(obj, propertyName)[\n dataKey\n ];\n\n patchedObjects.push({\n obj,\n propertyName,\n dataKey,\n value: originalValue,\n });\n\n MonkeyPatch._applyPatch(obj, propertyName, { [dataKey]: value });\n }\n\n static patchFunction(obj, propertyName, fn) {\n // \"value\" is the property value. See doc in _applyPatch.\n MonkeyPatch._patch(obj, propertyName, \"value\", fn);\n }\n\n static patchSetter(obj, propertyName, fn) {\n // \"set\" is the property setter. See doc in _applyPatch.\n MonkeyPatch._patch(obj, propertyName, \"set\", fn);\n }\n\n static patchGetter(obj, propertyName, fn) {\n // \"get\" is the property getter. See doc in _applyPatch.\n MonkeyPatch._patch(obj, propertyName, \"get\", fn);\n }\n}\n\nexport default MonkeyPatch;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/monkey_patch.js","/**\n * Contains logic to determine whether cta was clicked. This is not the optimal\n * way to do it - a better way would be to include CTA location as part of the\n * creative's concept rendering configuration and to set it explicitly.\n */\n\nimport { CLICK_AREA_TYPE_CTA, CLICK_AREA_TYPE_OTHER } from \"../constants\";\n\nconst pointInEl = (el, x, y) => {\n const {\n top: elTop,\n right: elRight,\n bottom: elBottom,\n left: elLeft,\n } = el.getBoundingClientRect();\n return x >= elLeft && x <= elRight && y >= elTop && y <= elBottom;\n};\n\n/**\n * Returns true iff (x, y) is within the bounds of a CTA. We\n * consider an element to be a \"CTA element\" if it's part of the generic-cta or\n * custom-cta components or is in a container that has 'cta' in the id. This can\n * give both false positives (e.g. if a non-CTA image is placed in a CTA\n * container) and false negatives (e.g. if a CTA is embedded in a larger image\n * in one of the \"fill\" templates), but it's probably close to the best we can\n * do without manual tagging. We include all descendants of cta\n * containers/components, because sometimes their children overflow.\n */\nexport const pointInCTA = (x, y) => {\n return [\n ...document.querySelectorAll(\n [\n \".generic-cta\",\n \".generic-cta *\",\n \".custom-cta\",\n \".custom-cta *\",\n \".cta-container\",\n \".cta-container *\",\n \".liftoff-cta\",\n \".liftoff-cta *\",\n \".product-view-cta .light\",\n \".last-chance-endscreen-container\",\n ].join(\", \")\n ),\n ].some((ctaEl) => {\n return pointInEl(ctaEl, x, y);\n });\n};\n\n/**\n * Returns true iff e is a MouseEvent that occurred over a CTA.\n */\nexport const clickAreaTypeFromEvent = (e) => {\n return pointInCTA(e.clientX, e.clientY)\n ? CLICK_AREA_TYPE_CTA\n : CLICK_AREA_TYPE_OTHER;\n};\n\nexport const isDeadzoneCoord = ({ x, y }) => {\n if (!Number.isFinite(x) || !Number.isFinite(y)) {\n console.warn(\"Unexpected coords\", { x, y });\n return;\n }\n return [...document.body.querySelectorAll(\".liftoff-deadzone\")].some((el) =>\n pointInEl(el, x, y)\n );\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/cta.js","export const MESSAGE_CREATIVE_MADE_SOUND = \"CREATIVE_MADE_SOUND\";\nexport const MESSAGE_TOGGLE_MUTED = \"TOGGLE_MUTED\";\nexport const MESSAGE_INTERACTION_CHANGE = \"INTERACTION_CHANGE\";\nexport const MESSAGE_CLICKTHROUGH = \"CLICKTHROUGH\";\nexport const MESSAGE_MRAID_EVENT = \"MRAID_EVENT\";\nexport const MESSAGE_MRAID_CALL = \"MRAID_CALL\";\nexport const MESSAGE_UPDATED_MRAID_PROPERTIES = \"UPDATED_MRAID_PROPERTIES\";\nexport const MESSAGE_INNER_ENV_INIT_COMPLETE = \"INNER_ENV_INIT_COMPLETE\";\nexport const MESSAGE_OUTER_ENV_INIT_COMPLETE = \"OUTER_ENV_INIT_COMPLETE\";\nexport const MESSAGE_REQUEST_DOM_SNAPSHOT = \"REQUEST_DOM_SNAPSHOT\";\nexport const MESSAGE_DOM_SNAPSHOT = \"DOM_SNAPSHOT\";\nexport const MESSAGE_INNER_ENV_ERROR = \"INNER_ENV_ERROR\";\nexport const MESSAGE_RESIZE = \"RESIZE\";\n\n// External Messages from Vungle.\nexport const MESSAGE_VUNGLE_CLICKTHROUGH = \"download\";\n\n// External Messages from Tresensa creatives.\nexport const MESSAGE_TRESENSA_INTERACTION = \"tre_interaction\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/csp-env/messages.js","import { strToElement } from \"../frontendlib/dom_utils\";\n\nclass AudioToggleIcon {\n constructor() {\n this.el = strToElement(`\n <div class=\"audio-toggle-icon\"\n style=\"margin:10px;border-radius:25px;background-color:black;line-height:10px\">\n <svg fill=\"#FFFFFF\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n width=\"30\" height=\"30\" viewBox=\"0 0 16 16\"\n >\n <g class=\"audio-toggle-unmute\" transform=\"translate(8 8) scale(0.69 0.69) translate(-8 -8)\">\n <polygon points=\"\n 14.293,14.293 1.707,1.707 1,2.414 4.586,6 4,6 4,10 7,10 11,14 11,12.414 13.586,15\n \"></polygon>\n <polygon points=\"11,2 7.207,5.793 11,9.586\"></polygon>\n </g>\n <g class=\"audio-toggle-mute\" transform=\"translate(8 8) scale(0.69 0.69) translate(-8 -8)\">\n <polygon points=\"7,6 4,6 4,10 7,10 11,14 11,2\"></polygon>\n </g>\n </svg>\n </div>\n `);\n\n this.setMuted(true);\n }\n\n getElement() {\n return this.el;\n }\n\n setMuted(muted) {\n this.el.querySelector(\".audio-toggle-unmute\").style.display = muted\n ? \"\"\n : \"none\";\n this.el.querySelector(\".audio-toggle-mute\").style.display = muted\n ? \"none\"\n : \"\";\n }\n}\n\nexport default AudioToggleIcon;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/audio_toggle_icon.js","import MonkeyPatch from \"./monkey_patch\";\n\n/**\n * Returns true iff `el` is a media (audio or video) element;\n */\nconst isMediaElement = (el) => el.tagName === \"VIDEO\" || el.tagName === \"AUDIO\";\n\n/**\n * Assuming `el` is a playing video, returns `true` iff it has audio data.\n */\nconst doesVideoHaveAudio = (el) => {\n return (\n (el.audioTracks != null && el.audioTracks.length > 0) ||\n (el.webkitAudioDecodedByteCount != null &&\n el.webkitAudioDecodedByteCount > 0)\n );\n};\n\n// Minimum bin size of a web audio analyzer node frequency spectrum. See:\n// https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/fftSize#Value.\nconst MIN_FFT_SIZE = 32;\n\n/**\n * Global controller for web audio. This works by monkey-patching the\n * `AudioContext` constructor and redefining `AudioContext.destination`\n * (normally an `AudioDestinationNode` that routes sound to the speakers)\n * to a node that allows the global controller to intercept and control all\n * output. This is used by `GlobalAudioController`--it's not intended to be\n * used directly. `cb` is a function that will be called the first time any\n * `AudioContext` produces a sound.\n */\nclass GlobalWebAudioController {\n // if process.env.NODE_ENV === \"test\"\n /**\n * Resets all state back to it's uninitialized state.\n * Used for testing purposes.\n */\n static reset() {\n GlobalWebAudioController._firstSoundMade = false;\n GlobalWebAudioController._muted = null;\n }\n // #endif\n\n static init(cb) {\n GlobalWebAudioController._muted = null;\n GlobalWebAudioController._cb = cb;\n GlobalWebAudioController._firstSoundMade = false;\n GlobalWebAudioController._gainNodes = [];\n\n try {\n const originalAudioContext =\n window.AudioContext || window.webkitAudioContext;\n\n /**\n * An alternative to monkey-patching the `AudioContext` constructor would\n * be to monkey-patch the `AudioContext.prototype.destination` getter,\n * but this doesn't work on old (pre-getter) browsers.\n */\n window.AudioContext = window.webkitAudioContext = function AudioContext(\n ...args\n ) {\n const audioCtx = new originalAudioContext(...args);\n const gainNode = audioCtx.createGain();\n const analyserNode = audioCtx.createAnalyser();\n // We just want to know if the `AudioContext` is producing _any_ sound\n // and don't care about the frequency spectrum per se. We therefore used\n // the smallest allowed FFT size.\n analyserNode.fftSize = MIN_FFT_SIZE;\n const freqData = new Uint8Array(analyserNode.frequencyBinCount);\n const soundPollInterval = setInterval(() => {\n analyserNode.getByteFrequencyData(freqData);\n let i = 0;\n for (; i < freqData.length; i++) {\n if (freqData[i] !== 0) break;\n }\n if (i === freqData.length) return;\n clearInterval(soundPollInterval);\n GlobalWebAudioController._handleFirstSound();\n }, 10);\n /**\n * The resulting node structure is:\n * input -> analyser -> gain -> destination\n * We use the analyser node to detect when the AudioContext is producing\n * sound and the gain node to globally control output.\n */\n const originalDestination = audioCtx.destination;\n analyserNode.connect(gainNode);\n gainNode.connect(originalDestination);\n gainNode.gain.value = GlobalWebAudioController._muted ? 0 : 1;\n GlobalWebAudioController._gainNodes.push(gainNode);\n\n Object.defineProperty(audioCtx, \"destination\", {\n value: analyserNode,\n // Ensure that our destination node is the only destination node.\n writable: false,\n configurable: false,\n });\n\n return audioCtx;\n };\n } catch (_) {\n console.error(\"Unable to monkey-patch AudioContext\");\n }\n }\n\n static _handleFirstSound() {\n if (GlobalWebAudioController._firstSoundMade) return;\n GlobalWebAudioController._cb();\n GlobalWebAudioController._firstSoundMade = true;\n }\n\n /**\n * Mutes all `AudioContext`s when `shouldMute === true` and restores all\n * `AudioContext`s to the state set by the user when `shouldMute === false`.\n */\n static setMuted(shouldMute) {\n if (GlobalWebAudioController._muted === shouldMute) {\n return;\n }\n GlobalWebAudioController._muted = shouldMute;\n GlobalWebAudioController._gainNodes.forEach((gainNode) => {\n gainNode.gain.value = shouldMute ? 0 : 1;\n });\n }\n}\n\n/**\n * Utility for tracking media elements. Media elements can come into existence\n * in several different ways, which requies multiple different tricks for\n * becoming aware of their existence:\n * 1) They may exist in the DOM on page load (i.e. be embedded directly in\n * the HTML document) - these can be detected by querying the dom for video\n * and audio elements\n * 2) They can be produced from an HTML string (e.g. `someEl.innerHTML =\n * \"<audio ... />\"`) and appended to the DOM. They must fire a \"loadstart\"\n * event after being appended to the DOM, or the `load` or `play` methods\n * may be called directly on the element. These can be detected by\n * listening for \"loadstart\" events and by monkey-patching the `load` and\n * `play` methods. This is true regardless of whether or not autoplay is\n * true.\n * 3) `document.createElement` - these are detected by monkey-patching\n * `Document.prototype.createElement`. These won't be caught by the\n * approaches in 2 if the \"autoplay\" attribute is set to `true` (since they\n * can make sound without ever being explicitly loaded, played, or append\n * to the DOM).\n * 4) The `Audio` constructor - these are detected by monkey-patching the\n * `Audio` constructor.\n */\nclass MediaElementWatcher {\n constructor() {\n throw new Error(\"Cannot construct instances of MediaElementWatcher.\");\n }\n\n /**\n * Initializes the class, and immediately calls function `cb` once for each\n * media element that already exists. Subsequently calls `cb` whenever a new\n * media element is created. This should only be called once.\n */\n static init(cb) {\n MediaElementWatcher._cb = cb;\n MediaElementWatcher._seenElements = new WeakSet();\n\n const originalCreateElement = Document.prototype.createElement;\n MonkeyPatch.patchFunction(\n Document.prototype,\n \"createElement\",\n function (...args) {\n const el = originalCreateElement.apply(this, args);\n MediaElementWatcher._handleNewElement(el);\n return el;\n }\n );\n\n const originalAudio = window.Audio;\n window.Audio = function Audio(...args) {\n const a = new originalAudio(...args);\n MediaElementWatcher._handleNewElement(a);\n return a;\n };\n window.Audio.prototype = originalAudio.prototype;\n\n [\"play\", \"load\"].forEach((methodName) => {\n const originalMethod = HTMLMediaElement.prototype[methodName];\n MonkeyPatch.patchFunction(\n HTMLMediaElement.prototype,\n methodName,\n function (...args) {\n MediaElementWatcher._handleNewElement(this);\n return originalMethod.apply(this, args);\n }\n );\n });\n\n window.addEventListener(\n \"loadstart\",\n (e) => {\n MediaElementWatcher._handleNewElement(e.target);\n },\n true\n );\n\n document.querySelectorAll(\"video, audio\").forEach((el) => {\n MediaElementWatcher._cb(el);\n });\n }\n\n static _handleNewElement(el) {\n if (!isMediaElement(el) || MediaElementWatcher._seenElements.has(el)) {\n return;\n }\n MediaElementWatcher._seenElements.add(el);\n MediaElementWatcher._cb(el);\n }\n}\n\n/**\n * Global controller for media (audio and video) elements. Used by\n * `GlobalAudioController` and not intended to be used directly. `cb` is a\n * function that will be called the first time any media element can\n * produce a sound (were global control not applied).\n */\nclass GlobalMediaElementAudioController {\n // #if process.env.NODE_ENV === \"test\"\n// /**\n// * Resets all state back to it's uninitialized state.\n// * Used for testing purposes.\n// */\n// static reset() {\n// GlobalMediaElementAudioController._firstSoundMade = false;\n// GlobalMediaElementAudioController._globallyMuted = null;\n// }\n // #endif\n\n constructor() {\n throw new Error(\n \"Cannot construct instances of GlobalMediaElementAudioController.\"\n );\n }\n\n static init(cb) {\n GlobalMediaElementAudioController._globallyMuted = null;\n /**\n * We keep track of the values for el.muted set by the user for each media\n * el. When we globally unmute, we restore the set state (so calling\n * `GlobalMediaElementAudioController.unmute()` does not unmute\n * elements that the user has set to be muted).\n */\n GlobalMediaElementAudioController._elToSetState = new WeakMap();\n GlobalMediaElementAudioController._allMediaEls = [];\n GlobalMediaElementAudioController._firstSoundMade = false;\n GlobalMediaElementAudioController._cb = cb;\n\n try {\n GlobalMediaElementAudioController._originalMutedSetter =\n Object.getOwnPropertyDescriptor(\n HTMLMediaElement.prototype,\n \"muted\"\n ).set;\n const originalMutedGetter = Object.getOwnPropertyDescriptor(\n HTMLMediaElement.prototype,\n \"muted\"\n ).get;\n\n MonkeyPatch.patchSetter(\n HTMLMediaElement.prototype,\n \"muted\",\n function (val) {\n GlobalMediaElementAudioController._elToSetState.set(this, val);\n if (GlobalMediaElementAudioController._canMakeSound(this)) {\n GlobalMediaElementAudioController._handleFirstSound();\n }\n\n const systemMutedState = originalMutedGetter.call(this);\n if (\n GlobalMediaElementAudioController._globallyMuted &&\n (systemMutedState || !val)\n ) {\n return;\n }\n GlobalMediaElementAudioController._originalMutedSetter.call(\n this,\n val\n );\n }\n );\n\n // Patch the \"muted\" getter so that it returns the value set by the user,\n // rather than the underlying \"system\" value.\n MonkeyPatch.patchGetter(HTMLMediaElement.prototype, \"muted\", function () {\n const recordedSetState =\n GlobalMediaElementAudioController._elToSetState.get(this);\n return recordedSetState == null\n ? originalMutedGetter.call(this)\n : recordedSetState;\n });\n // #if process.env.NODE_ENV === \"test\"\n// // Expose the underlying system muted setting to tests.\n// Object.defineProperty(HTMLMediaElement.prototype, \"systemMutedState\", {\n// get: originalMutedGetter,\n// });\n // #endif\n } catch (_) {\n /**\n * Monkey-patching will fail on old (pre-setter) browsers. In this case,\n * we have no way of keeping track of the set state.\n * (Listening for \"volumechange\" events doesn't work, because if we force\n * the state to `true` due to globally muting, then the event will not\n * fire if the user subsequently sets the `muted` to `true`.) In this\n * case, we just keep the page globally muted.\n */\n GlobalMediaElementAudioController._originalMutedSetter = function (mute) {\n this.muted = mute;\n };\n console.error(\"Unable to monkey-patch HTMLMediaElement.muted\");\n }\n\n MediaElementWatcher.init((el) => {\n if (!GlobalMediaElementAudioController._allMediaEls.includes(el)) {\n GlobalMediaElementAudioController._allMediaEls.push(el);\n }\n GlobalMediaElementAudioController._watchForSound(el);\n GlobalMediaElementAudioController._toggleElementMuted(\n el,\n GlobalMediaElementAudioController._globallyMuted\n );\n });\n }\n\n /**\n * Returns `true` iff `el` would be able to make a sound were it not being\n * controlled by this global controller. We consider an element able to make\n * a sound if it is either an audio element or is a video with audio tracks.\n * Assumes that `el` is in the playing state (whether or not a video has\n * audio cannot be determined for all browsers for media that are not\n * playing).\n */\n static _canMakeSound(el) {\n const isMuted = GlobalMediaElementAudioController._elToSetState.get(el);\n return !isMuted && (el.tagName === \"AUDIO\" || doesVideoHaveAudio(el));\n }\n\n static _watchForSound(el) {\n if (!el.paused && GlobalMediaElementAudioController._canMakeSound(el)) {\n GlobalMediaElementAudioController._handleFirstSound();\n return;\n }\n\n el.addEventListener(\"playing\", () => {\n if (!GlobalMediaElementAudioController._canMakeSound(el)) return;\n GlobalMediaElementAudioController._handleFirstSound();\n });\n }\n\n /**\n * Forces `el.muted` to `muted` (a boolean). Assumes that if `muted === true`,\n * the value of `el.muted` is the state set by the user.\n * (i.e. This is not idempotent.)\n */\n static _toggleElementMuted(el, muted) {\n if (muted) {\n GlobalMediaElementAudioController._elToSetState.set(el, el.muted);\n GlobalMediaElementAudioController._originalMutedSetter.call(el, true);\n return;\n }\n\n GlobalMediaElementAudioController._originalMutedSetter.call(\n el,\n GlobalMediaElementAudioController._elToSetState.get(el)\n );\n }\n\n static _toggleMediaMuted(muted) {\n GlobalMediaElementAudioController._allMediaEls.forEach((el) => {\n GlobalMediaElementAudioController._toggleElementMuted(el, muted);\n });\n }\n\n static _handleFirstSound() {\n if (GlobalMediaElementAudioController._firstSoundMade) return;\n GlobalMediaElementAudioController._cb();\n GlobalMediaElementAudioController._firstSoundMade = true;\n }\n\n /**\n * Mutes all HTML media elements when `shouldMute === true` and restores the\n * set state of all HTML media elements when `shouldMute === false`.\n */\n static setMuted(shouldMute) {\n if (GlobalMediaElementAudioController._globallyMuted === shouldMute) {\n return;\n }\n GlobalMediaElementAudioController._toggleMediaMuted(shouldMute);\n GlobalMediaElementAudioController._globallyMuted = shouldMute;\n }\n}\n\n/**\n * Global controller for all possible sources of audio in a web page, except\n * for `iframe`s. The public interface consists of only two methods:\n * - `GlobalAudioController.setMuted` - takes a boolean indicating whether\n * audio from all sound sources (HTML media elements and web audio) should\n * be muted (true) or not (false);\n * - `GlobalAudioController.onFirstSound` - receives one argument, a function\n * that will be called immediately if the page is already making sound or\n * otherwise will be called once when the page first makes a sound\n * (possibly never).\n */\nclass GlobalAudioController {\n // #if process.env.NODE_ENV === \"test\"\n// /**\n// * Just to facilitate testing of `onFirstSound` by allowing the registered\n// * callback to be run multiple times when new sources of sound are added to\n// * the testing environment page.\n// */\n// static reset() {\n// GlobalAudioController._firstSoundMade = false;\n// GlobalAudioController._onFirstSoundCallbacks = [];\n// \n// GlobalMediaElementAudioController.reset();\n// GlobalWebAudioController.reset();\n// }\n // #endif\n\n constructor() {\n throw new Error(\"Cannot construct instances of GlobalAudioController.\");\n }\n\n /**\n * This class is invasive insofar as implements a series of monkey patches on\n * browser API objects. We thus only initialize it when it's actually used.\n */\n static _init() {\n if (GlobalAudioController._initialized) {\n return;\n }\n GlobalAudioController._initialized = true;\n GlobalAudioController._firstSoundMade = false;\n GlobalAudioController._onFirstSoundCallbacks = [];\n\n const handleFirstSound = () => {\n if (GlobalAudioController._firstSoundMade) {\n return;\n }\n GlobalAudioController._firstSoundMade = true;\n GlobalAudioController._onFirstSoundCallbacks.forEach((cb) => cb());\n };\n GlobalMediaElementAudioController.init(handleFirstSound);\n GlobalWebAudioController.init(handleFirstSound);\n }\n\n static setMuted(shouldMute) {\n GlobalAudioController._init();\n GlobalMediaElementAudioController.setMuted(shouldMute);\n GlobalWebAudioController.setMuted(shouldMute);\n }\n\n static runAfterFirstSound(cb) {\n GlobalAudioController._init();\n if (GlobalAudioController._firstSoundMade) {\n cb();\n return;\n }\n\n GlobalAudioController._onFirstSoundCallbacks.push(cb);\n }\n}\nGlobalAudioController._initialized = false;\n\nexport default GlobalAudioController;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/global_audio_controller.js","import AudioToggleIcon from \"./lib/audio_toggle_icon\";\nimport GlobalAudioController from \"./lib/global_audio_controller\";\nimport LiftoffMRAID from \"./madlib/liftoff_mraid\";\nimport {\n AUDIO_POLICY_ALWAYS_MUTE,\n AUDIO_POLICY_ON_INTERACTION,\n EXCHANGE_DOUBLECLICK,\n} from \"./constants\";\nimport * as Utils from \"./frontendlib/utils\";\n\nconst CLOSE_Z = 99;\nconst WATERMARKS_Z = 98;\n\n/**\n * Returns a close element with a countdown timer that starts at `delay` seconds.\n */\nconst createCloseEl = (delay) => {\n const closeEl = document.createElement(\"div\");\n closeEl.id = \"liftoff-close\";\n Object.assign(closeEl.style, {\n display: \"block\",\n position: \"absolute\",\n top: \"10px\",\n right: \"10px\",\n width: \"32px\",\n height: \"32px\",\n zIndex: CLOSE_Z,\n });\n const buttonStyles = {\n width: \"100%\",\n height: \"100%\",\n display: \"block\",\n position: \"absolute\",\n top: \"0\",\n left: \"0\",\n fontSize: \"16px\",\n lineHeight: \"28px\",\n textAlign: \"center\",\n border: \"2px solid #FFF\",\n borderRadius: \"50%\",\n boxSizing: \"border-box\",\n pointerEvents: \"all\",\n };\n const closeTargetEl = document.createElement(\"div\");\n closeTargetEl.classList.add(\"liftoff-close-target\");\n Object.assign(closeTargetEl.style, buttonStyles, {\n color: \"#EEE\",\n backgroundColor: \"#000\",\n });\n // This is a nice close X.\n closeTargetEl.innerHTML = \"✕\";\n closeTargetEl.addEventListener(\"click\", (e) => {\n LiftoffMRAID.close();\n e.stopPropagation();\n });\n closeEl.appendChild(closeTargetEl);\n if (delay > 0) {\n const closeDelayEl = document.createElement(\"div\");\n closeDelayEl.classList.add(\"liftoff-close-delay\");\n Object.assign(closeDelayEl.style, buttonStyles, {\n color: \"#555\",\n backgroundColor: \"#BBB\",\n });\n let countdown = delay;\n closeDelayEl.textContent = countdown;\n closeDelayEl.style.display = \"block\";\n const closeDelayInterval = setInterval(() => {\n countdown -= 1;\n if (countdown > 0) {\n closeDelayEl.textContent = countdown;\n return;\n }\n closeDelayEl.style.display = \"none\";\n clearInterval(closeDelayInterval);\n }, 1000);\n closeEl.appendChild(closeDelayEl);\n }\n return closeEl;\n};\n\n/**\n * Calls `callback` on the user's first interaction.\n */\nconst onFirstInteraction = (callback) => {\n let hasUserInteracted = false;\n const handleFirstInteraction = (e) => {\n window.removeEventListener(\"mousedown\", handleFirstInteraction, true);\n window.removeEventListener(\"touchstart\", handleFirstInteraction, true);\n if (hasUserInteracted) return;\n hasUserInteracted = true;\n callback(e);\n };\n window.addEventListener(\"mousedown\", handleFirstInteraction, true);\n window.addEventListener(\"touchstart\", handleFirstInteraction, true);\n};\n\n/**\n * Creates an icon in the lower-right corner that allows the user to globally toggle the creative's audio on\n * and off. The toggle only appears on creatives that have autoplay audio (i.e. audio that plays prior to user\n * interaction). For creatives that have autoplay audio, the creative is globally muted by default but will\n * become globally unmuted when the user interacts with the creative.\n */\nconst createGlobalAudioToggle = () => {\n const el = document.createElement(\"div\");\n el.classList.add(\"liftoff-global-audio-toggle\");\n Object.assign(el.style, {\n opacity: \"0.5\",\n display: \"none\",\n pointerEvents: \"all\",\n right: \"0\",\n bottom: \"0\",\n position: \"absolute\",\n });\n const icon = new AudioToggleIcon();\n const iconEl = icon.getElement();\n el.appendChild(iconEl);\n\n let isCurrentlyMuted = false;\n const setMuted = (shouldMute) => {\n if (shouldMute === isCurrentlyMuted) return;\n isCurrentlyMuted = shouldMute;\n GlobalAudioController.setMuted(shouldMute);\n icon.setMuted(shouldMute);\n };\n\n let hasUserInteracted = false;\n onFirstInteraction((e) => {\n hasUserInteracted = true;\n // Interactions with the global audio toggle icon are handled by the click listener below.\n if (el.contains(e.target)) return;\n setMuted(false);\n });\n\n iconEl.addEventListener(\"click\", () => {\n setMuted(!isCurrentlyMuted);\n });\n\n GlobalAudioController.runAfterFirstSound(() => {\n if (hasUserInteracted) return;\n el.style.display = \"inline-block\";\n });\n\n setMuted(true);\n return el;\n};\n\nconst globallyMuteAllAudio = () => {\n GlobalAudioController.setMuted(true);\n};\n\n/**\n * Performs various operations required to conform to exchange- and/or country-specific creative policies.\n * This is used by both madlib HTML and CSP (third-party) creatives.\n * Requires:\n * - creativePolicy - An object with keys:\n * addBorder (boolean)\n * showAdChoices (boolean)\n * showChineseWatermark (boolean)\n * russianAgeRating (number)\n * - bidContext - An object with keys: { creativeID, platform, exchange, sourceAppName, sourceAppID }\n */\nexport const applyLiftoffPolicy = (\n snippetEl,\n {\n addBorder,\n showAdChoices,\n russianAgeRating,\n showChineseWatermark,\n useCustomClose,\n closeDelay,\n audioPolicy,\n },\n { creativeID, platform, exchange, sourceAppName, sourceAppID, cdnURL }\n) => {\n const watermarksEl = document.createElement(\"div\");\n watermarksEl.classList.add(\"liftoff-watermarks\");\n Object.assign(watermarksEl.style, {\n position: \"absolute\",\n bottom: \"0\",\n left: \"0\",\n zIndex: `${WATERMARKS_Z}`,\n height: \"18px\",\n pointerEvents: \"none\",\n });\n\n /**\n * Creates an element to apply a border around the whole creative (required for banners on certain\n * exchanges). We do this rather than adding a border directly to `#liftoff-snippet`, because the latter\n * changes the size of the snippet content by 2 * border-width, resulting in slightly inconsistent\n * rendering depending on whether the border is there or not.\n */\n if (addBorder) {\n const el = document.createElement(\"div\");\n el.id = \"liftoff-border\";\n Object.assign(el.style, {\n width: \"100%\",\n height: \"100%\",\n position: \"absolute\",\n border: \"1px solid #AAA\",\n boxSizing: \"border-box\",\n zIndex: \"10\",\n pointerEvents: \"none\",\n });\n document.body.appendChild(el);\n }\n\n if (showAdChoices) {\n // NOTE(Austin): We append these parameters for Google Analytics and more\n // granular cloudfront logs.\n const queryParams = {\n creative_id: creativeID,\n platform: platform,\n exchange: exchange,\n source_app_name: sourceAppName,\n source_app_id: sourceAppID,\n };\n\n const a = document.createElement(\"a\");\n a.classList.add(\"ad-choices-icon\");\n const optoutPageURL = Utils.appendParamObjectToURL(\n `${cdnURL}/optout.html`,\n queryParams\n );\n\n if (exchange === EXCHANGE_DOUBLECLICK) {\n // NOTE (Austin): Letting the click from the anchor tag intentionally take\n // the user out of the ad provides a better experience, as the in-app\n // browser is broken on some inventory (e.g., DoubleClick). Some\n // exchanges, such as Unity, open the in-app browser regardless, leading to\n // a poor user experience. Additionally, certain exchanges ignore our\n // mraid.open or window.open parameters, opening the clickthrough URL in a\n // new browser anyway.\n // TODO(Austin): Test making this the default.\n a.setAttribute(\"target\", \"_blank\");\n a.setAttribute(\"href\", optoutPageURL);\n } else {\n // NOTE(oscar): Chartboost recommends we open the ad choices link using\n // MRAID.\n a.addEventListener(\"click\", (e) => {\n e.preventDefault();\n LiftoffMRAID.open(optoutPageURL, { exchange, platform });\n });\n }\n\n Object.assign(a.style, {\n width: \"20px\",\n height: \"100%\",\n display: \"inline-block\",\n backgroundColor: \"rgba(204, 204, 204, 0.6)\",\n backgroundImage: `url(${cdnURL}/adchoices.png)`,\n backgroundPosition: \"center\",\n backgroundRepeat: \"no-repeat\",\n backgroundSize: \"12px 12px\",\n pointerEvents: \"all\",\n });\n watermarksEl.appendChild(a);\n }\n\n if (russianAgeRating != null) {\n const ageTag = document.createElement(\"div\");\n ageTag.textContent = `${russianAgeRating}+`;\n ageTag.classList.add(\"age-rating\");\n Object.assign(ageTag.style, {\n color: \"blue\",\n fontSize: \"10px\",\n fontWeight: \"500\",\n background: \"whitesmoke\",\n borderRadius: \"0 5px 0 0\",\n padding: \"0 3px\",\n opacity: \"0.75\",\n display: \"inline\",\n verticalAlign: \"bottom\",\n pointerEvents: \"none\",\n lineHeight: \"20px\",\n });\n watermarksEl.appendChild(ageTag);\n }\n\n if (showChineseWatermark) {\n const el = document.createElement(\"div\");\n el.classList.add(\"chinese-watermark\");\n Object.assign(el.style, {\n display: \"inline-block\",\n height: \"100%\",\n width: \"42px\",\n pointerEvents: \"none\",\n backgroundColor: \"rgba(204, 204, 204, 0.6)\",\n backgroundImage: `url(${cdnURL}/chinese_watermark.png)`,\n backgroundPosition: \"center\",\n backgroundRepeat: \"no-repeat\",\n backgroundSize: \"contain\",\n });\n watermarksEl.appendChild(el);\n }\n\n if (audioPolicy === AUDIO_POLICY_ALWAYS_MUTE) {\n globallyMuteAllAudio();\n } else if (audioPolicy === AUDIO_POLICY_ON_INTERACTION) {\n const globalAudioToggleEl = createGlobalAudioToggle();\n snippetEl.appendChild(globalAudioToggleEl);\n }\n\n LiftoffMRAID.useCustomClose(useCustomClose).then((isUsingCustomClose) => {\n if (!isUsingCustomClose) return;\n const closeEl = createCloseEl(closeDelay);\n snippetEl.appendChild(closeEl);\n });\n\n snippetEl.appendChild(watermarksEl);\n return snippetEl;\n};\n\nexport const postHTMLReturn = (adexpEndpoint, html) => {\n return Utils.request(\n \"POST\",\n `${adexpEndpoint}/html_return`,\n {\n // Don't set the content type to \"application/json\" because that requires\n // a preflight OPTIONS request (because this is a cross-domain request).\n \"Content-Type\": \"text/plain\",\n },\n html\n );\n};\n\nexport const getDOMSnapshot = () => document.documentElement.outerHTML;\n\n/**\n * Given `adexpEndpoint` (the AdExp host as a `String`), this sends an HTML\n * return after `htmlReturnDelay` ms. Returns a `Promise` that resolves when\n * the HTML return HTTP request is complete.\n */\nexport const configureHTMLReturn = (adexpEndpoint, htmlReturnDelay) => {\n const postHTML = () => {\n console.info(\"Returning HTML\");\n return postHTMLReturn(adexpEndpoint, getDOMSnapshot());\n };\n\n if (htmlReturnDelay == null || htmlReturnDelay === 0) {\n // NOTE(oscar): A delay of 0 ideally should return the DOM before any JS\n // manipulation, so we capture the state of the DOM immediately.\n return postHTML();\n }\n\n return new Promise((resolve, reject) => {\n setTimeout(() => postHTML().then(resolve, reject), htmlReturnDelay);\n });\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/creative_utils.js","import { isDeadzoneCoord } from \"../cta\";\n\nexport const throttle = (f, ms) => {\n let ignore = false;\n\n return (...args) => {\n if (ignore) return;\n f(...args);\n ignore = true;\n setTimeout(() => {\n ignore = false;\n }, ms);\n };\n};\n\nexport const intentionalInteractionCounterFn = (minimumInteractions) => {\n /**\n * InteractionMonitor has somewhat imperfect de-duplication logic for what\n * counts as a full interaction. It also doesn't account for intentional\n * interactions. Also note that onInteractionChange() triggers for every\n * start, drag, and end event.\n *\n * For our purposes, we'll use both InteractionMonitor's count and a custom\n * counter.\n */\n let intentionalInteractionsFromMonitor = new Set();\n let intentionalInteractionCountFromThrottle = 0;\n\n const countIntentionalInteractionThrottle = throttle(\n () => {\n intentionalInteractionCountFromThrottle += 1;\n },\n /** Count interactions only once every 0.4 seconds. */\n 400\n );\n\n const getCurrentCount = () =>\n Math.min(\n intentionalInteractionCountFromThrottle,\n intentionalInteractionsFromMonitor.size\n );\n\n const countIntentionalInteractions = (e) => {\n if (\n isDeadzoneCoord({\n x: e.lastInteraction.startX,\n y: e.lastInteraction.startY,\n })\n ) {\n return;\n }\n /**\n * NOTE(oscar): e.cumulativeStats.interactionCount is only incremented for\n * full interactions (or at least in theory). It also counts deadzone\n * interactions. Here we use interactionCount to identify which counts are\n * intentional.\n */\n if (\n e.cumulativeStats.interactionCount > 0 &&\n intentionalInteractionsFromMonitor.size <= minimumInteractions\n ) {\n intentionalInteractionsFromMonitor.add(\n e.cumulativeStats.interactionCount\n );\n }\n countIntentionalInteractionThrottle();\n };\n return (e) => {\n countIntentionalInteractions(e);\n return getCurrentCount();\n };\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/autoclick/autoclick_utils.js","import * as DOMUtils from \"../frontendlib/dom_utils\";\n\n/*\n * ClickInteraction is used to connect elements that respond to clicks\n * with the elements that trigger click events. Primarily, this allows\n * dynamic CTAs to respond to click events on click overlays or any\n * other clickthrough element.\n */\n\n// Global state for two-click CTAs.\nlet hasBeenClicked = false;\nconst firstClickHandlers = [];\n\n// Global state for slider CTAs.\nconst SLIDER_COMPLETION_RATIO = 0.7;\nconst sliders = [];\n\nconst setSlideDistance = (value) => {\n sliders.forEach(({ sliderSize, setSlideRatio }) =>\n setSlideRatio(value / sliderSize)\n );\n};\n\nconst getPointerEventX = (e) =>\n (\n (e.changedTouches && e.changedTouches[0]) ||\n (e.touches && e.touches[0]) ||\n e\n ).clientX;\n\nclass ClickInteraction {\n static captureFirstClick(handleFirstClick) {\n firstClickHandlers.push(handleFirstClick);\n }\n\n static captureSlideClick({ onCompleted, sliderSize, setSlideRatio }) {\n sliders.push({ onCompleted, sliderSize, setSlideRatio });\n }\n\n static addListeners(clickEl, onClickComplete) {\n clickEl.addEventListener(\n \"click\",\n (e) => {\n if (sliders.length > 0) {\n return;\n }\n\n if (!hasBeenClicked) {\n hasBeenClicked = true;\n\n if (firstClickHandlers.length > 0) {\n firstClickHandlers.forEach((handler) => handler(e));\n\n return;\n }\n }\n\n onClickComplete(e);\n },\n true\n );\n\n let slideStartPosition = null;\n DOMUtils.on(clickEl, {\n \"mousedown touchstart\": (e) => {\n slideStartPosition = getPointerEventX(e);\n },\n \"mousemove touchmove\": (e) => {\n if (slideStartPosition == null) return;\n\n setSlideDistance(getPointerEventX(e) - slideStartPosition);\n },\n \"mouseup mouseleave touchend\": (e) => {\n if (slideStartPosition == null) return;\n\n const slideDistance = getPointerEventX(e) - slideStartPosition;\n const completedSliders = sliders.filter(\n ({ sliderSize }) =>\n slideDistance > sliderSize * SLIDER_COMPLETION_RATIO\n );\n\n if (completedSliders.length > 0) {\n completedSliders.forEach(({ onCompleted }) => onCompleted());\n Promise.resolve(onClickComplete(e))\n .then(() => new Promise((resolve) => setTimeout(resolve, 1000)))\n .then(() => setSlideDistance(0));\n } else {\n setSlideDistance(0);\n }\n\n slideStartPosition = null;\n },\n });\n }\n}\n\nexport default ClickInteraction;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/click_interaction.js","import { strToElement } from \"../frontendlib/dom_utils\";\n\n/** TODO(oscar): This is a temporary solution to add deadzones to CSPs. */\nexport const addDeadzoneStyles = () => {\n const el = strToElement(`\n <style>\n .liftoff-deadzone.deadzone-experiment {\n position: absolute;\n width: max(50px, min(85px, 11vw));\n height: max(50px, min(85px, 11vw));\n z-index: 96;\n }\n .liftoff-deadzone.top-left {\n top: 0;\n left: 0;\n }\n .liftoff-deadzone.top-right {\n top: 0;\n right: 0;\n }\n </style>\n `);\n document.head.appendChild(el);\n};\n\nconst addDeadzones = (useExpandedZones, rootEl = document.body) => {\n const deadzoneEls = [\n strToElement(`<div class=\"liftoff-deadzone top-left\"></div>`),\n strToElement(`<div class=\"liftoff-deadzone top-right\"></div>`),\n ];\n deadzoneEls.forEach((el) => {\n if (useExpandedZones) {\n el.classList.add(\"deadzone-experiment\");\n }\n rootEl.appendChild(el);\n });\n};\n\nexport default addDeadzones;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/addDeadzones.js","import LiftoffMRAID from \"./madlib/liftoff_mraid\";\nimport Logger from \"./madlib/logger\";\nimport {\n CLICK_TRACKING_URL_TYPE_LIFTOFF_ENDPOINT,\n CLICKTHROUGH_URL_TYPE_LIFTOFF_ENDPOINT,\n TRACKING_METHOD_IMAGE,\n TRACKING_METHOD_BEACON,\n PLATFORM_ANDROID,\n} from \"./constants\";\nimport * as Utils from \"./frontendlib/utils\";\n\nconst getLiftoffContainerRect = () => {\n // NOTE(Casey): 'liftoff-snippet' might not exist if the creative is not\n // fully initialized.\n const containerEl =\n document.getElementById(\"liftoff-snippet\") || document.body;\n return containerEl.getBoundingClientRect();\n};\n\nexport const getClickTrackingQueryParams = (allInteractionData) => {\n const { lastInteraction, cumulativeStats } = allInteractionData || {};\n\n const containerRect = getLiftoffContainerRect();\n\n const params = {\n // Unix timestamp of when the click is sent.\n ct: Date.now(),\n // Width of #liftoff-snippet in px.\n aw: containerRect.width.toFixed(),\n // Height of #liftoff-snippet in px.\n ah: containerRect.height.toFixed(),\n // Whether or not MRAID is supported for this impression, determined\n // empirically based on the presence/absence of the mraid object.\n m: LiftoffMRAID.hasSupport(\"mraid\") ? 1 : 0,\n // Total duration, in ms, that the creative was viewable prior to the\n // click. This depends on the mraid \"viewableChange\" event, so its\n // accuracy depends on the exchange's implementation.\n tv: LiftoffMRAID.getViewableDurationMS(),\n };\n\n if (lastInteraction == null) {\n return params;\n }\n\n // NOTE(Casey): We see some rare events that do not have x/y coordinates.\n if (lastInteraction.startX != null) {\n // The horizontal position of the click in pixels, relative to the\n // upper-left corner of #liftoff-snippet.\n params.cx = (lastInteraction.startX - containerRect.left).toFixed();\n }\n\n if (lastInteraction.startY != null) {\n // The vertical position of the click in pixels, relative to the\n // upper-left corner of #liftoff-snippet.\n params.cy = (lastInteraction.startY - containerRect.top).toFixed();\n }\n\n if (lastInteraction.durationMS != null) {\n // Duration in milliseconds of the click, as measured by the difference\n // between timestamps on the start and end events (e.g. touchstart and\n // touchend).\n params.dur = lastInteraction.durationMS.toFixed();\n }\n\n Object.assign(params, {\n // The value of Event.isTrusted (see\n // https://developer.mozilla.org/en-US/docs/Web/API/Event/isTrusted).\n it: lastInteraction.isTrusted ? 1 : 0,\n // Maximum force of the interaction on a 0-100 scale. derived from\n // Touch.force (for TouchEvents), MouseEvent.webkitForce, or\n // PointerEvent.pressure. This may be 0 or have some arbitrary value if\n // the pointer device/surface doesn't support force/pressure measurement.\n frc: Math.round(lastInteraction.maxForce * 100),\n // Maximum area of the screen with which the user interacted in px^2 (e.g.\n // the area of the screen covered by a finger during a click). May be 0 or\n // have some arbitrary value if the pointer device/surface doesn't support\n // area measurement.\n ar: lastInteraction.maxArea.toFixed(),\n // Path length traversed from the beginning to the end of the click, in px.\n d: lastInteraction.distance.toFixed(),\n // An enum describing the type of pointing device--Mouse, Touch, or other\n // (e.g. pen/stylus). See the constants defined in `InteractionMonitor`\n // and the corresponding definitions in rtb.proto.\n pt: lastInteraction.pointerType,\n // Total number of distinct interactions detected prior to and including the\n // click. \"Distinct interactions\" are bounded by start/end events or by\n // the pointing device leaving the creative.\n ic: cumulativeStats.interactionCount,\n // Total path length of all interactions.\n tid: cumulativeStats.totalDistance.toFixed(),\n });\n\n return params;\n};\n\n/**\n * Given a baseClickURL (a string), attaches the caller's query\n * parameters provided as an object, and returns a string.\n */\nexport const constructLiftoffClickURL = (baseClickURL, queryParams) => {\n return Utils.appendParamObjectToURL(baseClickURL, queryParams);\n};\n\n/**\n * Returns a Promise that resolves when the tracking pixel at url is loaded.\n */\nconst pingTrackingURLWithImage = (url) => {\n return new Promise((resolve) => {\n // NOTE(Austin): Image is a the best method here as far as we know because\n // it's a foolproof way to get a no-cors request and avoid any strange\n // behavior with XMLHttpRequest. One downside is that Image only tells us\n // when it's fully loaded, and technically we don't need to wait that long.\n // We technically only need to wait for the request to send (we don't need\n // to wait for the response).\n\n // NOTE(Casey): In some cases (e.g. SKAdNetwork impressions on some\n // exchanges), we \"force\" a direct clickthrough with a click-tracking URL\n // that redirects to the MMP and app store. We still use an image tag to\n // ping Usher and the MMP, but it will generate an error. We still want\n // to click through in this case.\n\n // TODO(Casey): Consider alternatives to this (e.g. using an iframe).\n\n const img = new Image();\n img.onload = () => resolve(url);\n\n // TODO(Austin): Investigate if there are errors here that should be\n // rejected.\n img.onerror = () => resolve(url);\n img.src = url;\n }).catch((e) => {\n Logger.recordLabeledError(\"clicktracking_img_error\", e || {});\n });\n};\n\n/**\n * pingTrackingURLWithBeacon sends a ping using the beacon API,\n * which guarantees that the url will be reached before the page is disposed.\n * See: https://developer.mozilla.org/en-US/docs/Web/API/Beacon_API\n */\nconst pingTrackingURLWithBeacon = (url) => {\n return new Promise((resolve, reject) => {\n if (navigator.sendBeacon(url)) {\n resolve();\n } else {\n reject();\n }\n });\n};\n\n/**\n * NOTE(Casey): When the return_js=true query param is attached to an Usher URL,\n * Usher will return a JavaScript file containing\n * '_loOpen(\"{{HTTP_REDIRECT_URL}}\")'. For unknown reasons, this\n * method for fetching the redirect URL works better than fetching it via XHR,\n * possibly due to CORS restrictions. See\n * https://docs.google.com/document/d/1nzlGVs9HNSY_Wd29UzoZSx1luZIwufl6yiQ8AXol7cU/\n */\nconst clickthroughWithScriptTag = ({\n clickthroughURL,\n platform,\n exchange,\n abTests = [],\n onlyMraid = false,\n}) => {\n window._loOpen = (clickURL) =>\n // We assume the url returned is never a liftoff url.\n LiftoffMRAID.open(clickURL, {\n platform,\n exchange,\n abTests,\n isLiftoffURL: false,\n onlyMraid,\n });\n return new Promise((resolve) => {\n const script = document.createElement(\"script\");\n script.onload = resolve;\n script.onerror = (e) => {\n Logger.recordLabeledError(\"click_script_error\", e || {});\n };\n script.src = Utils.appendParamObjectToURL(clickthroughURL, {\n return_js: true,\n });\n document.body.appendChild(script);\n }).catch((e) => {\n Logger.recordLabeledError(\"clickthrough_error\", e || {});\n });\n};\n\n/**\n * Returns true if clickTrackingURL (an object like { url, type }) is a Liftoff\n * click tracking URL.\n */\nconst isLiftoffClickTrackingURL = (clickTrackingURL) => {\n return clickTrackingURL.type === CLICK_TRACKING_URL_TYPE_LIFTOFF_ENDPOINT;\n};\n\n/**\n * Prepares and pings a clickTrackingURL (an object like { url, type }); common\n * Liftoff query parameters and the caller's queryParams are attached only to\n * Liftoff clickTrackingURLs.\n */\nconst pingClickTrackingURL = (clickTrackingURL, queryParams, abTests = []) => {\n const getClickTrackingURLString = (trackingMethod) => {\n // NOTE(Austin): Right now we should only have \"liftoff\" click tracking\n // URLs (i.e. http://click.liftoff.io/v1/campaign_click/... ).\n return isLiftoffClickTrackingURL(clickTrackingURL)\n ? constructLiftoffClickURL(clickTrackingURL.url, {\n ...queryParams,\n tracking_method: trackingMethod,\n })\n : clickTrackingURL.url;\n };\n\n // The waterfall of click tracking methods to try (in priority order).\n // Each object in the array should contain a map with the following\n // keys:\n // - method: The tracking method integer, as described in rtb.proto\n // TrackingMethod.\n // - canUse: Whether the method should be tried.\n // - pingFn: The function to ping that takes a URL string and returns a\n // promise.\n const clickTrackingWaterfall = [\n {\n method: TRACKING_METHOD_BEACON,\n canUse:\n abTests != null &&\n abTests.includes(\"madlib-beacon-ping-experiment\") &&\n isLiftoffClickTrackingURL(clickTrackingURL) &&\n navigator.sendBeacon != null,\n pingFn: pingTrackingURLWithBeacon,\n },\n {\n method: TRACKING_METHOD_IMAGE,\n canUse: true,\n pingFn: pingTrackingURLWithImage,\n },\n ];\n\n // Chain all promises to try each click tracking method. If the\n // method at the previous index returns a rejected promise,\n // we try the next; otherwise we return. If we reach the end without\n // any methods succeeding, this method returns a rejected promise.\n return clickTrackingWaterfall\n .filter(({ canUse }) => canUse)\n .reduce(\n (prevPromiseFn, nextWaterfallOption) => () => {\n const { method, pingFn } = nextWaterfallOption;\n const urlString = getClickTrackingURLString(method);\n return prevPromiseFn().catch(() => pingFn(urlString));\n },\n () => Promise.reject()\n )();\n};\n\nconst handleClickTracking = (clickTrackingURLs, queryParams, abTests = []) => {\n return new Promise((resolve) => {\n const pingCompletePromises = clickTrackingURLs.map((clickTrackingURL) => {\n return pingClickTrackingURL(clickTrackingURL, queryParams, abTests);\n });\n\n Promise.all(pingCompletePromises).then(resolve);\n }).catch((e) => {\n Logger.recordLabeledError(\"clicktracking_error\", e || {});\n });\n};\n\nconst isLiftoffClickthroughURL = (clickthroughURL) => {\n return clickthroughURL.type === CLICKTHROUGH_URL_TYPE_LIFTOFF_ENDPOINT;\n};\n\n/**\n * Opens a clickthrough URL (object like { url, type }) using the best method\n * for the given context (platform, isReengagement).\n */\nconst handleClickthrough = ({\n clickthroughURL,\n queryParams,\n exchange,\n platform,\n isReengagement,\n abTests = [],\n}) => {\n /**\n * NOTE(oscar): As of it 2022-10-31, we only want to use MRAID for iOS POD.\n * The main reason for this is because we want to guarantee that:\n *\n * 1. SKStoreProductViewController (i.e. App Store overlay) is used. This\n * assumes mraid is needed for this.\n * 2. The click waterfall does not also open the App Store. This is an issue\n * we've seen with AppLovin, but it may affect other exchanges.\n */\n const isAutoclick = !!queryParams.pv;\n\n return new Promise((resolve) => {\n const isLiftoffURL = isLiftoffClickthroughURL(clickthroughURL);\n const urlStr = isLiftoffURL\n ? constructLiftoffClickURL(clickthroughURL.url, queryParams)\n : clickthroughURL.url;\n\n if (queryParams.mac || queryParams.dap) {\n // The method name here is pingClickTrackingURL we do ping clickthrough\n // URL here as this is a background click.\n pingClickTrackingURL(clickthroughURL, queryParams, abTests);\n } else {\n /**\n * NOTE(Casey): On Android, script tag clicks perform better than redirect\n * clicks, while on iOS the opposite is true. However, for reengagement on\n * iOS, trackers may use \"universal links\", which are special web pages that\n * deeplink to an app or redirect to the app store. These links historically\n * have not worked with redirects, so we fetch the link and send the user\n * directly.\n * NOTE(Polly): We append a suffix to certain fyber clickthrough urls when\n * the native browser should be opened upon a click. We should not use the\n * script tag when the \"FYBER_OPEN_BROWSER\" suffix is present in the url.\n * TODO(Casey): Test if we can now redirect to universal links on iOS\n * (we have been told that this may have been fixed).\n */\n if (\n isLiftoffURL &&\n (platform === PLATFORM_ANDROID || isReengagement) &&\n !urlStr.includes(\"FYBER_OPEN_BROWSER\")\n ) {\n return clickthroughWithScriptTag({\n clickthroughURL: urlStr,\n platform,\n exchange,\n abTests,\n });\n }\n\n LiftoffMRAID.open(urlStr, {\n exchange,\n platform,\n abTests,\n isLiftoffURL,\n isAutoclick,\n });\n }\n\n resolve();\n }).catch((e) => {\n Logger.recordLabeledError(\"clickthrough_error\", e || {});\n });\n};\n\n/**\n * Given clickConfig, an object like:\n *\n * {\n * clickthroughURL: { url, type },\n * clickTrackingURLs: [{ url, type }, { url, type }, ...],\n * }\n *\n * prepares all URLs as appropriate based on type, pings tracking URLs, and\n * opens the click URL using the optimal method for a given context\n * (isReengagement, platform).\n */\nexport const handleClick = ({\n clickConfig,\n queryParams,\n isReengagement,\n platform,\n exchange,\n // NOTE(Austin): The below parameters are being used temporarily\n // for different AB tests.\n abTests = null,\n}) => {\n // NOTE(oscar): Some exchanges wrap our URLs in order to track their\n // metrics. We perform an asynchronous ping to this link while redirecting\n // users to our actual link to reduce latency.\n\n // TODO(Casey): Determine if we can move the exchange ping URL into\n // clickTrackingURLs and handle along with our own tracking URLs.\n const exchangePingElem = document.getElementById(\"exchange-ping-url\");\n\n if (exchangePingElem != null && exchangePingElem.href != null) {\n Utils.ping(exchangePingElem.href);\n }\n\n const { clickthroughURL, clickTrackingURLs } = clickConfig;\n\n const clickthroughParams = {\n clickthroughURL,\n queryParams,\n platform,\n isReengagement,\n exchange,\n abTests,\n };\n /**\n * Handles both clicktracking and clickthrough.\n *\n * NOTE(Austin): We are testing waiting for the exchange ping to see if there\n * is some race condition.\n *\n * TODO(Austin): Consolidate rejected promises and log errors here.\n */\n const doFullClick = () => {\n /** Product View clicks are not tracked. */\n let promise = Promise.resolve();\n if (!queryParams.pv) {\n promise = handleClickTracking(clickTrackingURLs, queryParams, abTests);\n }\n\n return promise.then(() => handleClickthrough(clickthroughParams));\n };\n\n return doFullClick();\n};\n\nexport const _forUnitTestingOnly = {\n pingTrackingURLWithImage,\n isLiftoffClickTrackingURL,\n pingClickTrackingURL,\n handleClickTracking,\n isLiftoffClickthroughURL,\n clickthroughWithScriptTag,\n handleClickthrough,\n // We re-export LiftoffMRAID for unit testing to ensure that tests and the\n // functions in this file refer to the identical LiftoffMRAID object.\n LiftoffMRAID,\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/click_handling.js","/**\n * This includes classes for tracking interactions with creatives. The data\n * they collect are attached as query parameters to clicks (the last\n * interaction prior to a click is assumed to be the click itself).\n *\n * We listen for all three possible types of events (MouseEvents,\n * PointerEvents, and TouchEvents), because 1) device capabilities differ, so\n * different events may fire on different devices, and 2) some third-party\n * creatives block propagation of some events such that later events do not\n * fire (e.g. if they stop propagation of a PointerEvent, then the\n * corresponding TouchEvent will not fire). However, we collect data from\n * only one type of event in the following order of priority: 1) touch,\n * 2) pointer, 3) mouse (e.g. we only collect pointer data if we're not\n * receiving touch events).\n *\n * We somewhat arbitrarily define interactions as starting and ending at\n * the window's boundaries (i.e. if the user moves over a path that leaves\n * and then re-enters window, this would count as two interactions: one ends\n * when their finger leaves the window, and another one starts when it\n * re-enters the window).\n */\nimport { deepEqual } from \"./frontendlib/utils\";\n\nconst POINTER_TYPE_TOUCH = 1;\nconst POINTER_TYPE_MOUSE = 2;\n// POINTER_TYPE_POINTER is a catch-all for anything other than touch or mouse.\nconst POINTER_TYPE_POINTER = 3;\n\n/**\n * Returns the pointer type of a PointerEvent.\n */\nconst getPointerEventPointerType = (pointerEvent) => {\n switch (pointerEvent.pointerType) {\n case \"mouse\":\n return POINTER_TYPE_MOUSE;\n case \"touch\":\n return POINTER_TYPE_TOUCH;\n default:\n return POINTER_TYPE_POINTER;\n }\n};\n\n/**\n * Given a MouseEvent or a PointerEvent, returns true iff a device button\n * is pressed (returns false if this cannot be determined from the event).\n */\nconst isButtonPressed = (e) => {\n // e.which is a non-standard fallback for old versions of Safari.\n const buttons = e.buttons != null ? e.buttons : e.which;\n return buttons != null && buttons !== 0;\n};\n\n/** Returns the linear distance between (startX, startY) and (endX, endY). */\nconst computeDistance = (startX, startY, endX, endY) => {\n return Math.sqrt(Math.pow(startX - endX, 2) + Math.pow(startY - endY, 2));\n};\n\n/**\n * Returns true iff the given TouchEvent has some touch-point within the bounds\n * of the window.\n */\nconst isTouchInWindow = (e) => {\n return [...e.changedTouches].some((touch) => {\n const { clientX, clientY } = touch;\n return (\n clientX >= 0 &&\n clientX <= window.innerWidth &&\n clientY >= 0 &&\n clientY <= window.innerHeight\n );\n });\n};\n\n/**\n * Returns the maximum force of all touches in a TouchEvent, or 0 if force\n * information is not available.\n */\nconst maxTouchEventForce = (e) => {\n const touchForces = [...e.changedTouches, ...e.touches].map(\n (touch) => touch.force || 0\n );\n\n return Math.max(0, ...touchForces);\n};\n\n/**\n * Returns the total touch area of a TouchEvent, or 0 if touch area is not\n * available.\n */\nconst touchEventArea = (e) => {\n return [...e.touches].reduce((sum, touch) => {\n const { radiusX, radiusY } = touch;\n const area =\n radiusX == null || radiusY == null ? 0 : Math.PI * radiusX * radiusY;\n return sum + area;\n }, 0);\n};\n\nclass Interaction {\n constructor(startEvent) {\n this._startEvent = startEvent;\n this._lastMoveEvent = null;\n this._endEvent = null;\n this._maxForce = startEvent.force;\n this._maxArea = startEvent.area;\n this._totalDistance = 0;\n }\n\n setEndEvent(endEvent) {\n this._updateMetrics(endEvent);\n this._endEvent = endEvent;\n }\n\n setLastMoveEvent(moveEvent) {\n this._updateMetrics(moveEvent);\n this._lastMoveEvent = moveEvent;\n }\n\n isInProgress() {\n return this._startEvent != null && this._endEvent == null;\n }\n\n isComplete() {\n return this._startEvent != null && this._endEvent != null;\n }\n\n getMetrics() {\n const metrics = {\n startX: this._startEvent.x,\n startY: this._startEvent.y,\n isTrusted: this._startEvent.isTrusted,\n maxForce: this._maxForce,\n maxArea: this._maxArea,\n distance: this._totalDistance,\n pointerType: this._startEvent.pointerType,\n // Omit durationMS because a null duration is different\n // than a duration of 0, it's important to distinguish the two.\n // The nullable value is allowed by the rtb.proto.Click object.\n };\n\n if (this.isComplete()) {\n // Add data that requires the interaction to be complete,\n // (i.e. has a end event).\n Object.assign(metrics, {\n durationMS: this._endEvent.timestamp - this._startEvent.timestamp,\n });\n }\n\n return metrics;\n }\n\n _updateMetrics(newEvent) {\n this._maxForce = Math.max(this._maxForce, newEvent.force);\n this._lastMaxArea = Math.max(this._maxArea, newEvent.area);\n\n const lastEvent = this._lastMoveEvent || this._startEvent;\n this._totalDistance += computeDistance(\n lastEvent.x,\n lastEvent.y,\n newEvent.x,\n newEvent.y\n );\n }\n}\n\n/**\n * This is an abstract base class for monitoring interaction events. Concrete\n * subclasses must define two methods:\n *\n * 1) _attachEventListeners: this must attach the relevant listeners to the\n * window and call _handleStartEvent, _handleEndEvent, and _handleMoveEvent\n * with the proper raw event.\n * 2) _normalizeEvent: this must take a raw event of the relevant type and\n * return a \"normalized event\" (an object like { x, y, isTrusted, timestamp,\n * force, area, pointerType }.\n */\nclass InteractionEventMonitor {\n // #if process.env.NODE_ENV === \"test\"\n// destroy() {\n// this._attachedEventListeners.forEach(\n// ({ eventName, handler, listenerOptions }) => {\n// window.removeEventListener(eventName, handler, listenerOptions);\n// }\n// );\n// this._attachedEventListeners = [];\n// }\n // #endif\n\n constructor() {\n this._interactionCount = 0;\n this._totalInteractionDistance = 0;\n this._lastInteraction = null;\n this._interactionStartHandlers = [];\n this._interactionEndHandlers = [];\n this._attachedEventListeners = [];\n this._attachEventListeners();\n }\n\n listenFor(eventName, handler, options = {}) {\n const listenerOptions = {\n // NOTE(Austin): By default, it's absolutely critical we capture events\n // as they bubble down so we have interaction data before developers\n // presumably call our `Liftoff.open` method in an event listener handler.\n capture: true,\n ...options,\n };\n this._attachedEventListeners.push({\n eventName,\n handler,\n listenerOptions,\n });\n window.addEventListener(eventName, handler, listenerOptions);\n }\n\n onInteractionStart(handlerFn) {\n if (this._interactionStartHandlers.includes(handlerFn)) {\n return;\n }\n\n this._interactionStartHandlers.push(handlerFn);\n }\n\n _handleStartEvent(e) {\n if (this.isInteractionInProgress()) {\n // This could occur if another interaction starts before another one\n // completes (e.g. in the case of multiple pointer devices) or if the\n // device fires multiple 'start' events in some cases (e.g. firing\n // \"pointerover\" and then \"pointerdown\" for touch events).\n return;\n }\n\n const normalizedEvent = this._normalizeEvent(e);\n this._lastInteraction = new Interaction(normalizedEvent);\n this._interactionStartHandlers.forEach((handler) => handler());\n }\n\n onInteractionEnd(handlerFn) {\n if (this._interactionEndHandlers.includes(handlerFn)) {\n return;\n }\n\n this._interactionEndHandlers.push(handlerFn);\n }\n\n _handleEndEvent(e) {\n if (!this.isInteractionInProgress()) {\n return;\n }\n const normalizedEvent = this._normalizeEvent(e);\n this._lastInteraction.setEndEvent(normalizedEvent);\n\n this._updateCumulativeInteractionStats();\n this._interactionEndHandlers.forEach((handler) => handler());\n }\n\n _handleMoveEvent(e) {\n if (!this.isInteractionInProgress()) {\n return;\n }\n\n const normalizedEvent = this._normalizeEvent(e);\n this._lastInteraction.setLastMoveEvent(normalizedEvent);\n }\n\n isInteractionInProgress() {\n return (\n this._lastInteraction != null && this._lastInteraction.isInProgress()\n );\n }\n\n isLastInteractionComplete() {\n return this._lastInteraction != null && this._lastInteraction.isComplete();\n }\n\n getLastInteractionData() {\n return this._lastInteraction && this._lastInteraction.getMetrics();\n }\n\n getAllInteractionData() {\n return {\n lastInteraction: this.getLastInteractionData(),\n cumulativeStats: this.getCumulativeInteractionStats(),\n };\n }\n\n _updateCumulativeInteractionStats() {\n this._interactionCount += 1;\n this._totalInteractionDistance +=\n this._lastInteraction.getMetrics().distance;\n }\n\n getCumulativeInteractionStats() {\n return {\n interactionCount: this._interactionCount,\n totalDistance: this._totalInteractionDistance,\n };\n }\n\n _normalizeEvent(_) {\n throw new Error(\n \"_normalizeEvent must be implemented by a concrete subclass\"\n );\n }\n\n _attachEventListeners() {\n throw new Error(\n \"_attachEventListeners must be implemented by a concrete subclass\"\n );\n }\n}\n\nclass MouseEventMonitor extends InteractionEventMonitor {\n constructor() {\n super();\n }\n\n _normalizeEvent(e) {\n return {\n x: e.pageX,\n y: e.pageY,\n isTrusted: e.isTrusted,\n timestamp: e.timeStamp,\n // NOTE(Casey): MouseEvent.webkitForce is non-standard, but we collect\n // it if it's available anyway.\n force: e.webkitForce || 0,\n area: 0,\n pointerType: POINTER_TYPE_MOUSE,\n };\n }\n\n _attachEventListeners() {\n super.listenFor(\"mousedown\", (e) => this._handleStartEvent(e));\n super.listenFor(\"mouseover\", (e) => {\n if (!isButtonPressed(e)) return;\n this._handleStartEvent(e);\n });\n super.listenFor(\"mouseup\", (e) => this._handleEndEvent(e));\n super.listenFor(\"mouseout\", (e) => {\n if (!isButtonPressed(e)) return;\n this._handleEndEvent(e);\n });\n super.listenFor(\"mousemove\", (e) => {\n if (!isButtonPressed(e)) return;\n this._handleMoveEvent(e);\n });\n }\n}\n\nclass PointerEventMonitor extends InteractionEventMonitor {\n constructor() {\n super();\n }\n\n _normalizeEvent(e) {\n return {\n x: e.pageX,\n y: e.pageY,\n isTrusted: e.isTrusted,\n timestamp: e.timeStamp,\n force: e.pressure,\n // NOTE(Casey): We consider pointer area as an ellipse for consistency\n // with touch events.\n area: (Math.PI * e.width * e.height) / 4,\n pointerType: getPointerEventPointerType(e),\n };\n }\n\n _attachEventListeners() {\n super.listenFor(\"pointerdown\", (e) => this._handleStartEvent(e));\n super.listenFor(\"pointerover\", (e) => {\n if (!isButtonPressed(e)) return;\n this._handleStartEvent(e);\n });\n super.listenFor(\"pointerup\", (e) => this._handleEndEvent(e));\n super.listenFor(\"pointercancel\", (e) => this._handleEndEvent(e));\n super.listenFor(\"pointerout\", (e) => {\n if (!isButtonPressed(e)) return;\n this._handleEndEvent(e);\n });\n super.listenFor(\"pointermove\", (e) => {\n if (!isButtonPressed(e)) return;\n this._handleMoveEvent(e);\n });\n }\n}\n\nclass TouchEventMonitor extends InteractionEventMonitor {\n constructor() {\n super();\n }\n\n _normalizeEvent(e) {\n return {\n // NOTE(Casey): We arbitrarily choose a changed touch to use for the\n // interaction position, making distance measures inaccurate for multi-\n // touch interactions.\n x: e.changedTouches[0].pageX,\n y: e.changedTouches[0].pageY,\n isTrusted: e.isTrusted,\n timestamp: e.timeStamp,\n force: maxTouchEventForce(e),\n area: touchEventArea(e),\n pointerType: POINTER_TYPE_TOUCH,\n };\n }\n\n _attachEventListeners() {\n super.listenFor(\"touchstart\", (e) => this._handleStartEvent(e));\n super.listenFor(\"touchend\", (e) => {\n if (e.touches.length !== 0) return;\n this._handleEndEvent(e);\n });\n super.listenFor(\"touchcancel\", (e) => this._handleEndEvent(e));\n super.listenFor(\"touchmove\", (e) => {\n // NOTE(Casey): There are no touch events analogous to\n // mouseover/pointerover and mouseout/pointerout, so we check if the touch\n // is within the window during move events instead.\n const isInWindow = isTouchInWindow(e);\n if (!isInWindow && this.isInteractionInProgress()) {\n // The touch started inside the window and has now moved outside of it.\n this._handleEndEvent(e);\n } else if (isInWindow && this.isLastInteractionComplete()) {\n // The touch started outside of the window and moved into the window,\n // so we need to start tracking a new interaction.\n this._handleStartEvent(e);\n } else {\n // This event is part of the interaction we're currently tracking.\n this._handleMoveEvent(e);\n }\n });\n }\n}\n\nclass InteractionMonitor {\n // #if process.env.NODE_ENV === \"test\"\n// destroy() {\n// this._monitors.forEach((monitor) => {\n// monitor.destroy();\n// });\n// this._monitors = [];\n// }\n // #endif\n\n constructor() {\n // These events are ordered by priority, from highest to lowest.\n this._monitors = [\n new TouchEventMonitor(),\n new PointerEventMonitor(),\n new MouseEventMonitor(),\n ];\n\n this._monitors.forEach((monitor) => {\n monitor.onInteractionStart(this._handleInteractionEvent.bind(this));\n });\n this._monitors.forEach((monitor) => {\n monitor.onInteractionEnd(this._handleInteractionEvent.bind(this));\n });\n\n this._previousAllInteractionData = null;\n this._interactionChangeHandlers = [];\n }\n\n /**\n * Given a function that will receive an object like that returned by\n * getAllInteractionData, sets up listeners so that handlerFn will be called\n * whenever any interaction data change.\n */\n onInteractionChange(handlerFn) {\n if (this._interactionChangeHandlers.includes(handlerFn)) {\n return;\n }\n\n this._interactionChangeHandlers.push(handlerFn);\n }\n\n _handleInteractionEvent() {\n const currentAllInteractionData = this.getAllInteractionData();\n if (\n deepEqual(this._previousAllInteractionData, currentAllInteractionData)\n ) {\n return;\n }\n\n this._previousAllInteractionData = currentAllInteractionData;\n this._interactionChangeHandlers.forEach((handler) => {\n handler(currentAllInteractionData);\n });\n }\n\n _chooseEventMonitorWithInProgressInteractions() {\n return this._monitors.find((eventMonitor) =>\n eventMonitor.isInteractionInProgress()\n );\n }\n\n _chooseEventMonitorWithCompletedInteractions() {\n return this._monitors.find((eventMonitor) =>\n eventMonitor.isLastInteractionComplete()\n );\n }\n\n _chooseEventMonitor() {\n // Since this class is used by in-house and third-party creatives\n // we prioritize partial interactions (i.e. clickthrough events\n // that fire before the touchEnd/clickEnd/etc. fires).\n return (\n this._chooseEventMonitorWithInProgressInteractions() ||\n this._chooseEventMonitorWithCompletedInteractions()\n );\n }\n\n /**\n * Returns a map containing the last interaction and the cumulative\n * statistics. Prefer using this over calling `getLastInteractionData` and\n * `getCumulativeInteractionStats` separately.\n */\n getAllInteractionData() {\n const eventMonitor = this._chooseEventMonitor();\n if (eventMonitor == null) {\n return null;\n }\n\n return eventMonitor.getAllInteractionData();\n }\n\n /**\n * Returns an object like { startX, startY, isTrusted, durationMS, maxForce\n * maxArea, distance, pointerType } describing the last interaction.\n */\n getLastInteractionData() {\n const eventMonitor = this._chooseEventMonitor();\n if (eventMonitor == null) {\n return null;\n }\n\n return eventMonitor.getLastInteractionData();\n }\n\n /** Returns an object like { interactionCount, totalDistance }. */\n getCumulativeInteractionStats() {\n const eventMonitor = this._chooseEventMonitor();\n if (eventMonitor == null) {\n return null;\n }\n\n return eventMonitor.getCumulativeInteractionStats();\n }\n}\n\nexport {\n InteractionMonitor,\n // #if process.env.NODE_ENV === \"test\"\n// POINTER_TYPE_TOUCH,\n// POINTER_TYPE_MOUSE,\n// POINTER_TYPE_POINTER,\n // #endif\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/interaction_monitor.js","import {\n AUTOCLICK_TYPE_COMPLETED_DELAY,\n AUTOCLICK_TYPE_INTERACTION_COUNT,\n AUTOCLICK_TYPE_LAST_INTERACTION,\n AUTOCLICK_TYPE_LAST_INTERACTION_AND_INTERACTION_COUNT,\n AUTOCLICK_TYPE_LOAD_DELAY,\n AUTOCLICK_TYPE_VIEWABLE_DELAY,\n AUTOCLICK_TYPE_VIEWABLE_DELAY_WITH_RESET,\n} from \"../../constants\";\nimport AutoclickBehaviorCompletedDelay from \"./behaviors/AutoclickBehaviorCompletedDelay\";\nimport AutoclickBehaviorInteractionCount from \"./behaviors/AutoclickBehaviorInteractionCount\";\nimport AutoclickBehaviorLastInteraction from \"./behaviors/AutoclickBehaviorLastInteraction\";\nimport AutoclickBehaviorLastInteractionAndCount from \"./behaviors/AutoclickBehaviorLastInteractionAndCount\";\nimport AutoclickBehaviorLoadDelay from \"./behaviors/AutoclickBehaviorLoadDelay\";\nimport AutoclickBehaviorViewableDelay from \"./behaviors/AutoclickBehaviorViewableDelay\";\nimport AutoclickBehaviorViewableDelayWithReset from \"./behaviors/AutoclickBehaviorViewableDelayWithReset\";\n\nconst behaviorClasses = {\n [AUTOCLICK_TYPE_COMPLETED_DELAY]: AutoclickBehaviorCompletedDelay,\n [AUTOCLICK_TYPE_INTERACTION_COUNT]: AutoclickBehaviorInteractionCount,\n [AUTOCLICK_TYPE_LAST_INTERACTION]: AutoclickBehaviorLastInteraction,\n [AUTOCLICK_TYPE_LAST_INTERACTION_AND_INTERACTION_COUNT]:\n AutoclickBehaviorLastInteractionAndCount,\n [AUTOCLICK_TYPE_LOAD_DELAY]: AutoclickBehaviorLoadDelay,\n [AUTOCLICK_TYPE_VIEWABLE_DELAY]: AutoclickBehaviorViewableDelay,\n [AUTOCLICK_TYPE_VIEWABLE_DELAY_WITH_RESET]:\n AutoclickBehaviorViewableDelayWithReset,\n};\n\nconst MONITORED_EVENTS = {\n INTERACTION_EVENT: \"interactionEvent\",\n COMPLETED: \"completed\",\n ENGAGEMENT: \"engagement\",\n HTML_LOADED: \"htmlLoaded\",\n VIEWABLE: \"viewable\",\n VIEWABLE_CHANGE: \"viewableChange\",\n};\n\nconst AUTOCLICK_EVENT_COUNT_CHANGE = \"countChanged\";\n\n/**\n * @callback ClickthroughHandler\n * @param {object} lastEvent - The last Interaction event.\n */\n\n/**\n * @typedef AutoclickBehaviorConfig\n * @property {string} type - autoclick variant type.\n * @property {number} delay - In ms. Time to wait until opening App Store from\n * autoclick click.\n * @property {number} count - Max occurrences of events as determined by type.\n */\n\n/**\n * Controls App Store On Interaction, aka. autoclick, behavior.\n * @see https://docs.google.com/document/d/1QYHzXt1oxmGIx2F63XErz7dF4SD6pxSi-1mkxxnHsUU/edit#heading=h.bypyxke51ec\n */\nclass Autoclick {\n /**\n *\n * @param {AutoclickBehaviorConfig} behavior - Describes the autoclick behavior.\n * @param {Object} ctx\n * @param {ClickthroughHandler} ctx.clickthroughHandler\n * @returns\n */\n constructor(behavior, { clickthroughHandler }) {\n if (behavior == null) {\n this.disable();\n return;\n }\n this._clickthroughHandler = clickthroughHandler;\n this._lastCount = 0;\n this._lastInteraction = null;\n\n this._behavior = behavior;\n const behaviorType = behavior == null ? null : behavior.type;\n if (behaviorClasses[behaviorType] == null) {\n console.error(`Behavior class not found: ${behaviorType}`);\n this.disable();\n return;\n }\n /** @type {AutoclickBehaviorInteractionCount|AutoclickBehaviorCompletedDelay|AutoclickBehaviorLastInteraction|AutoclickBehaviorLastInteractionAndCount} */\n this.behaviorClass = new behaviorClasses[behaviorType]({\n autoclick: this,\n behavior,\n delayClickthroughHandler: this._handleDelayClickthrough.bind(this),\n });\n\n this._handleDelayClickthrough = this._handleDelayClickthrough.bind(this);\n\n this.eventListeners = {\n [MONITORED_EVENTS.ENGAGEMENT]: [\n this.behaviorClass.onEngagement.bind(this.behaviorClass),\n ],\n [MONITORED_EVENTS.HTML_LOADED]: [\n this.behaviorClass.onHtmlLoaded.bind(this.behaviorClass),\n ],\n [MONITORED_EVENTS.VIEWABLE]: [\n this.behaviorClass.onViewable.bind(this.behaviorClass),\n ],\n [MONITORED_EVENTS.VIEWABLE_CHANGE]: [\n this.behaviorClass.onViewableChange.bind(this.behaviorClass),\n ],\n [MONITORED_EVENTS.COMPLETED]: [\n this.behaviorClass.onCompleted.bind(this.behaviorClass),\n ],\n [MONITORED_EVENTS.INTERACTION_EVENT]:\n // Order matters.\n [\n this._recordLastInteraction.bind(this),\n this.behaviorClass.onInteraction.bind(this.behaviorClass),\n ],\n [AUTOCLICK_EVENT_COUNT_CHANGE]: [],\n };\n }\n\n disable() {\n this.autoclickDisabled = true;\n }\n\n emitInteractionEvent(...args) {\n this.emit(MONITORED_EVENTS.INTERACTION_EVENT, ...args);\n }\n\n emitInteractionPromptReachedEvent(...args) {\n this.emit(MONITORED_EVENTS.COMPLETED, ...args);\n }\n\n emitHtmlLoadedEvent(...args) {\n this.emit(MONITORED_EVENTS.HTML_LOADED, ...args);\n }\n\n emitViewableEvent(...args) {\n this.emit(MONITORED_EVENTS.VIEWABLE, ...args);\n }\n\n emitViewableChangeEvent(...args) {\n this.emit(MONITORED_EVENTS.VIEWABLE_CHANGE, ...args);\n }\n\n _recordLastInteraction(e) {\n this._lastInteraction = e;\n }\n\n _handleDelayClickthrough(delay) {\n clearTimeout(this._delayTimer);\n if (this.autoclickDisabled) return;\n\n this._delayTimer = setTimeout(() => {\n this._clickthrough();\n }, delay || 0);\n }\n\n _clickthrough() {\n if (this.autoclickDisabled) return;\n this._clickthroughHandler(this._lastInteraction);\n this.disable();\n }\n\n emit(eventName, ...args) {\n if (this.autoclickDisabled) return;\n if (!(eventName in this.eventListeners)) {\n throw new Error(`Event ${eventName} not found!`);\n }\n this.eventListeners[eventName].forEach((f) => {\n f(...args);\n });\n }\n}\n\nexport default Autoclick;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/autoclick/Autoclick.js","import AutoclickBehaviorAbstract from \"../AutoclickBehaviorAbstract\";\n\nclass AutoclickBehaviorCompletedDelay extends AutoclickBehaviorAbstract {\n onCompleted() {\n this.delayClickthrough(this.getBehaviorDelay());\n }\n}\n\nexport default AutoclickBehaviorCompletedDelay;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/autoclick/behaviors/AutoclickBehaviorCompletedDelay.js","import AutoclickBehaviorAbstract from \"../AutoclickBehaviorAbstract\";\nimport { intentionalInteractionCounterFn } from \"../autoclick_utils\";\n\nclass AutoclickBehaviorInteractionCount extends AutoclickBehaviorAbstract {\n init() {\n this._counter = intentionalInteractionCounterFn(this.getBehaviorCount());\n this.triggered = false;\n }\n\n onInteraction(e) {\n this.setCurrentCount(this._counter(e));\n\n if (!this.isCountReached() || this.triggered) return;\n this.triggered = true;\n\n this.delayClickthrough(this.getBehaviorDelay());\n }\n}\n\nexport default AutoclickBehaviorInteractionCount;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/autoclick/behaviors/AutoclickBehaviorInteractionCount.js","import AutoclickBehaviorAbstract from \"../AutoclickBehaviorAbstract\";\n\nclass AutoclickBehaviorLastInteraction extends AutoclickBehaviorAbstract {\n onInteraction() {\n this.delayClickthrough(this.getBehaviorDelay());\n }\n}\n\nexport default AutoclickBehaviorLastInteraction;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/autoclick/behaviors/AutoclickBehaviorLastInteraction.js","import AutoclickBehaviorAbstract from \"../AutoclickBehaviorAbstract\";\nimport { intentionalInteractionCounterFn } from \"../autoclick_utils\";\n\nclass AutoclickBehaviorLastInteractionAndCount extends AutoclickBehaviorAbstract {\n init() {\n this._counter = intentionalInteractionCounterFn(this.getBehaviorCount());\n }\n\n onInteraction(e) {\n this.setCurrentCount(this._counter(e));\n\n this.delayClickthrough(this.getBehaviorDelay());\n }\n}\n\nexport default AutoclickBehaviorLastInteractionAndCount;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/autoclick/behaviors/AutoclickBehaviorLastInteractionAndCount.js","import AutoclickBehaviorAbstract from \"../AutoclickBehaviorAbstract\";\n\nclass AutoclickBehaviorLoadDelay extends AutoclickBehaviorAbstract {\n onHtmlLoaded() {\n this.delayClickthrough(this.getBehaviorDelay());\n }\n}\n\nexport default AutoclickBehaviorLoadDelay;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/autoclick/behaviors/AutoclickBehaviorLoadDelay.js","import AutoclickBehaviorAbstract from \"../AutoclickBehaviorAbstract\";\n\nclass AutoclickBehaviorViewableDelay extends AutoclickBehaviorAbstract {\n onViewable() {\n this.delayClickthrough(this.getBehaviorDelay());\n }\n}\n\nexport default AutoclickBehaviorViewableDelay;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/autoclick/behaviors/AutoclickBehaviorViewableDelay.js","import AutoclickBehaviorAbstract from \"../AutoclickBehaviorAbstract\";\n\nclass AutoclickBehaviorViewableDelay extends AutoclickBehaviorAbstract {\n onViewable() {\n this.delayClickthrough(this.getBehaviorDelay());\n }\n\n onViewableChange(isViewable) {\n if (!isViewable) {\n clearTimeout(this._autoclick._delayTimer);\n }\n }\n}\n\nexport default AutoclickBehaviorViewableDelay;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/autoclick/behaviors/AutoclickBehaviorViewableDelayWithReset.js","import { empty } from \"../frontendlib/dom_utils\";\nimport { clone, escapeRegExp, type } from \"../frontendlib/utils\";\nimport EventListener from \"../frontendlib/event_listener\";\n\nimport ClickInteraction from \"../lib/click_interaction\";\n\nimport Container from \"../container\";\nimport { clickAreaTypeFromEvent } from \"./cta\";\nimport LiftoffMRAID from \"./liftoff_mraid\";\nimport addDeadzones from \"./addDeadzones\";\n\nclass Madlib {\n static init() {\n EventListener.pubsubify(this);\n\n this.rootEl = null;\n this.config = null;\n\n this.loaded = false;\n this.containerByID = {};\n this.allContainers = [];\n this.rootContainer = null;\n\n // TODO(vsingh): Remove hacky global once we are more clear on how Madlib resize events should\n // be handled.\n this.didEverApplyLetterboxStyles = false;\n\n this.productIndex = 0;\n\n this.on(\"navigation-click\", (queryParams, clickAreaType) => {\n Liftoff.handleClick(queryParams, clickAreaType);\n });\n }\n\n /**\n * Returns a product cycling indefinitely.\n */\n static getNextProduct() {\n const { products = [] } = Liftoff.env;\n\n const { productIndex } = this;\n this.productIndex += 1;\n\n return products[productIndex % products.length];\n }\n\n static error(e = new Error(\"Unspecified Madlib error.\")) {\n Liftoff.handleMadlibError(e);\n }\n\n static load(rootEl, config) {\n this.rootEl = rootEl;\n this.config = config;\n this.applyExchangePolicies();\n this.loadDOM();\n this.addEventListeners();\n this.coordinate();\n this.layout();\n\n Liftoff.onLoadCompleted();\n }\n\n static applyExchangePolicies() {\n const animationDurationLimit = Liftoff.getAnimationDurationLimit();\n if (animationDurationLimit > 0) {\n setTimeout(() => {\n Madlib.allContainers.forEach((container) => {\n const { content } = container;\n if (content == null) return;\n container.layout().then(() => {\n content.stop();\n });\n });\n }, animationDurationLimit);\n }\n }\n\n static loadDOM() {\n this.layoutEl = document.createElement(\"div\");\n this.layoutEl.id = \"liftoff-layout\";\n this.rootEl.appendChild(this.layoutEl);\n\n this.clickEl = document.createElement(\"div\");\n this.clickEl.id = \"liftoff-click\";\n ClickInteraction.addListeners(this.clickEl, (e) => {\n this.handleNavigationClick(e);\n });\n this.rootEl.appendChild(this.clickEl);\n\n const { is_interstitial, is_reengagement } = Liftoff.bidContext;\n // TODO(oscar): Cleanup test code once crserve-deadzone experiment is over.\n const isDeadzoneExperiment = Liftoff.hasTestGroup(\n \"crserve-deadzone-v2-experiment\"\n );\n const useDeadzones =\n is_interstitial && (!is_reengagement || isDeadzoneExperiment);\n if (useDeadzones) {\n addDeadzones(isDeadzoneExperiment, this.rootEl);\n }\n }\n\n static handleNavigationClick(e, queryParams = {}) {\n this.emit(\"navigation-click\", queryParams, clickAreaTypeFromEvent(e));\n }\n\n static addEventListeners() {\n window.addEventListener(\"resize\", () => {\n this.layout();\n });\n }\n\n static coordinate() {\n this.on(\"wait\", ({ timeMS }) => {\n return new Promise((resolve) => setTimeout(resolve, Number(timeMS)));\n });\n }\n\n static getEvents() {\n return [{ name: \"beforeVisible\" }].map((e) => {\n e.type = \"madlib\";\n return e;\n });\n }\n\n static getActions() {\n return [\n {\n name: \"wait\",\n data: [\"timeMS\"],\n },\n ].map((a) => {\n a.type = \"madlib\";\n return a;\n });\n }\n\n static getCreativeConfig() {\n // TODO(cory) Implement rendering for multiple scenes. For now, all configs have exactly one scene.\n return this.config.scenes[0].layoutContent;\n }\n\n static configureLetterbox(letterboxConfig) {\n const useDarkRootBackground = letterboxConfig.useDarkRootBackground();\n const useLayoutBackground = letterboxConfig.useLayoutBackground();\n\n this.rootEl.classList.toggle(\n \"letterbox-dark-background\",\n useDarkRootBackground\n );\n this.layoutEl.classList.toggle(\n \"letterbox-layout-background\",\n useLayoutBackground\n );\n\n this.didEverApplyLetterboxStyles = true;\n\n Object.assign(\n this.clickEl.style,\n letterboxConfig.getStyleForClickElement()\n );\n }\n\n static layout() {\n if (this.rootContainer != null) {\n this.rootContainer.invalidate();\n }\n\n this.reset();\n\n const letterboxConfig = Liftoff.getLetterboxConfig();\n var rootElementConstraints = null;\n\n if (letterboxConfig.enabled()) {\n this.configureLetterbox(letterboxConfig);\n rootElementConstraints =\n letterboxConfig.getLetterboxConstraintsForMadlibRootElement();\n }\n\n this.parseCreativeConfig(\n this.layoutEl,\n this.getCreativeConfig(),\n rootElementConstraints\n );\n\n const { allContainers, rootContainer } = this;\n\n const loaded = rootContainer.loadContent().catch((e) => this.error(e));\n\n const ready = rootContainer\n .layout()\n .then(() => {\n LiftoffMRAID.onViewable(() => {\n if (rootContainer.invalidated) return;\n allContainers.forEach(({ content }) => {\n if (content) content.start();\n });\n });\n })\n .catch((e) => this.error(e));\n\n Promise.all([loaded, ready]).then(() => {\n if (!this.loaded) {\n this.loaded = true;\n Liftoff.onMadlibLoaded();\n this.emit(\"beforeVisible\");\n Liftoff.onFirstLayoutFinished();\n }\n });\n }\n\n static reset() {\n this.productIndex = 0;\n // TODO(brian): Teardown existing components here.\n Liftoff.resetClickParams();\n this.clickEl.classList.remove(\"active\");\n empty(this.layoutEl);\n if (this.didEverApplyLetterboxStyles) {\n [this.layoutEl, this.clickEl].forEach((el) => {\n [\n \"left\",\n \"top\",\n \"width\",\n \"height\",\n \"right\",\n \"bottom\",\n \"transform\",\n ].forEach((prop) => {\n el.style[prop] = \"\";\n });\n });\n }\n }\n\n static parseCreativeConfig(rootEl, config, rootElementConstraints) {\n const componentParams = config.componentParams;\n\n const { clickTargets, constraints, containers, coordination, css } = config;\n\n const { rootConstraints, rootPostLayoutTransform } =\n rootElementConstraints || {};\n\n const traverse = (parent, { id, children }) => {\n const container = new Container(document.createElement(\"div\"), id);\n container.parent = parent;\n container.children = (children || []).map(traverse.bind(null, container));\n container.css = css[id];\n container.constraints = constraints[id];\n if (componentParams[id] != null) {\n let { component, params } = componentParams[id];\n const subcomponents = [];\n const fixValues = (params) => {\n Object.keys(params).forEach((key) => {\n const { type, value } = params[key];\n if (value != null) {\n switch (type) {\n case \"array\":\n params[key].value = value.map(fixValues);\n break;\n case \"image_original\":\n case \"video_original\":\n params[key].value = Liftoff.resolveAsset(type, value);\n break;\n case \"component\":\n const componentName = value.component;\n const componentParams = fixValues(clone(value.params));\n const component = Liftoff.Component.new(\n componentName,\n componentParams\n );\n params[key].value = component;\n subcomponents.push(component);\n break;\n }\n }\n\n params[key] = params[key].value;\n });\n return params;\n };\n\n params = fixValues(clone(params));\n container.content = Liftoff.Component.new(component, params);\n container.content.on(\"error\", this.error.bind(this));\n // Errors from all subcomponents, regardless of nesting depth, are\n // relayed directly to the top-level component.\n subcomponents.forEach((subcomponent) =>\n subcomponent.relay(container.content, \"error\")\n );\n }\n\n this.containerByID[id] = container;\n this.allContainers.push(container);\n return container;\n };\n\n this.containerByID = {};\n this.allContainers = [];\n this.rootContainer = new Container(rootEl);\n this.rootContainer.parent = new Container(rootEl.parentNode);\n this.rootContainer.children = containers.map(\n traverse.bind(null, this.rootContainer)\n );\n this.rootContainer.css = { overflow: \"hidden\" };\n this.rootContainer.constraints = rootConstraints || {\n width: \"100%\",\n height: \"100%\",\n };\n this.rootContainer.postLayoutTransform = rootPostLayoutTransform;\n\n this.attachAnchors();\n this.configureCoordination(coordination);\n this.configureClickTargets(clickTargets);\n\n this.rootContainer.layout();\n }\n\n static attachAnchors() {\n this.allContainers.forEach((container) => {\n if (container.constraints == null) return;\n container.anchors = [\"top\", \"right\", \"bottom\", \"left\"]\n .filter((edge) => type(container.constraints[edge]) === \"object\")\n .map((edge) => {\n return {\n edge,\n anchor: this.containerByID[container.constraints[edge].anchor],\n };\n });\n });\n }\n\n // Link events with actions.\n static configureCoordination(coordination) {\n coordination\n .filter(({ event }) => event.name != null)\n .forEach(({ event, actions }) => {\n const {\n name: eventName,\n type: eventType,\n source,\n data: eventMacros,\n } = event;\n\n const actors = actions\n .map((action) => {\n const {\n name: actionName,\n type: actionType,\n target,\n data: actionMacros,\n } = action;\n let actor;\n switch (actionType) {\n case \"madlib\":\n actor = this;\n break;\n case \"component\":\n actor = this.containerByID[target].content;\n break;\n case \"container\":\n actor = this.containerByID[target];\n break;\n }\n\n return { actionName, actor, actionMacros };\n })\n .filter(({ actionName }) => actionName != null);\n\n let emitter;\n switch (eventType) {\n case \"madlib\":\n emitter = this;\n break;\n case \"component\":\n emitter = this.containerByID[source].content;\n break;\n case \"container\":\n emitter = this.containerByID[source];\n break;\n }\n\n const getMacroValues = (eventPayload) => {\n const macroValues = {};\n Object.keys(eventMacros).forEach((key) => {\n const macro = eventMacros[key];\n macroValues[macro] = eventPayload[key];\n });\n\n return macroValues;\n };\n\n const expandMacros = (macroValues, actionMacros) => {\n const actionPayload = {};\n Object.keys(actionMacros).forEach((key) => {\n const expansion = Object.keys(macroValues).reduce((s, macro) => {\n // TODO(oscar): Tokenize macro better.\n s = s == null ? \"\" : s;\n const r = escapeRegExp(macro);\n const sub =\n macroValues[macro] == null ? \"\" : String(macroValues[macro]);\n return s.replace(new RegExp(r, \"g\"), sub);\n }, actionMacros[key]);\n\n actionPayload[key] = expansion;\n });\n\n return actionPayload;\n };\n\n const processEventPayload = (eventPayload, actionMacros) => {\n return expandMacros(getMacroValues(eventPayload), actionMacros);\n };\n\n const dispatchActions = (eventPayload = {}) => {\n // \"Waterfall\" the `.emit` Promises to process them serially.\n return actors\n .reduce((promise, { actionName, actor, actionMacros }) => {\n const data = processEventPayload(eventPayload, actionMacros);\n return promise.then(() => actor.emit(actionName, data));\n }, Promise.resolve())\n .catch((e) => this.error(e));\n };\n\n emitter.on(eventName, dispatchActions);\n });\n }\n\n // Setup click listeners.\n static configureClickTargets(clickTargets) {\n if (clickTargets.length > 0) {\n clickTargets.forEach((id) => {\n ClickInteraction.addListeners(this.containerByID[id].el, (e) => {\n this.handleNavigationClick(e);\n });\n });\n }\n // tre HTML endcards have their own way of handling click events.\n else if (!window.Liftoff.env.is_tre || !window.TreSensa) {\n this.clickEl.classList.add(\"active\");\n }\n }\n}\n\nMadlib.init();\n\nMadlib.ClickInteraction = ClickInteraction;\n\nwindow.Madlib = Madlib;\n\nexport default Madlib;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/madlib.js","import {\n getRelativeBoundingClientRect,\n getAggregateBoundingClientRect,\n parseCSSLength,\n} from \"./frontendlib/dom_utils\";\nimport { type } from \"./frontendlib/utils\";\nimport EventListener from \"./frontendlib/event_listener\";\n\nconst EDGE_TO_TYPE = {\n left: \"leading\",\n right: \"trailing\",\n top: \"leading\",\n bottom: \"trailing\",\n};\nconst EDGE_TO_DIMENSION = {\n left: \"width\",\n right: \"width\",\n top: \"height\",\n bottom: \"height\",\n};\n\n// We currently require CTA containers to be prefixed with \"CTA\", but we're\n// more liberal here to support some legacy templates.\nconst ctaContainerRegex = /\\bcta\\b/i;\nconst isCTAContainer = (containerID) => {\n return ctaContainerRegex.test(containerID);\n};\n\nclass Container extends EventListener {\n static getEvents() {\n return [{ name: \"beforeLayout\", system: true }, { name: \"onClick\" }].map(\n (e) => {\n e.type = \"container\";\n return e;\n }\n );\n }\n\n static getActions() {\n return [{ name: \"show\" }, { name: \"hide\" }].map((a) => {\n a.type = \"container\";\n return a;\n });\n }\n\n /** @param {HTMLDivElement} el - The container element. */\n constructor(el, id = \"\") {\n super();\n this.el = el;\n this.el.classList.add(\"madlib-container\");\n if (isCTAContainer(id)) {\n // We tag CTA containers to help us detect when clicks occur on CTAs.\n this.el.classList.add(\"cta-container\");\n }\n // `parent` and `children` refer to other Containers.\n this.parent = null;\n this.children = [];\n\n this.fixedWidth = false;\n this.fixedHeight = false;\n\n this.css = null;\n this.constraints = null;\n this.anchors = [];\n this.content = null;\n\n this.layoutReady = null;\n this.contentReady = null;\n this.hidden = false;\n\n this.postLayoutTransform = null;\n\n this.addEventListeners();\n this.coordinate();\n }\n\n addEventListeners() {\n this.el.addEventListener(\"click\", () => this.emit(\"onClick\"));\n }\n\n coordinate() {\n this.on({\n hide: () => {\n Object.assign(this.el.style, {\n pointerEvents: \"none\",\n visibility: \"hidden\",\n });\n },\n show: () => {\n Object.assign(this.el.style, {\n pointerEvents: (this.css && this.css[\"pointer-events\"]) || \"auto\",\n visibility: (this.css && this.css.visibility) || \"visible\",\n });\n },\n });\n }\n\n loadContent() {\n if (this.contentReady == null) {\n const promises = this.children.map((child) => child.loadContent());\n if (this.content != null) {\n promises.push(this.content.load());\n }\n\n this.contentReady = Promise.all(promises);\n }\n\n return this.contentReady;\n }\n\n layout() {\n if (this.layoutReady == null) {\n // NOTE(oscar): beforeLayout should probably only trigger at most once per\n // container.\n this.emit(\"beforeLayout\");\n }\n if (this.layoutReady == null) {\n if (this.el.parentNode !== this.parent.el) {\n this.parent.el.appendChild(this.el);\n }\n\n if (this.constraints != null) {\n if (\n (this.constraints.left != null && this.constraints.right != null) ||\n this.constraints.width != null\n ) {\n this.fixedWidth = true;\n }\n\n if (\n (this.constraints.top != null && this.constraints.bottom != null) ||\n this.constraints.height != null\n ) {\n this.fixedHeight = true;\n }\n }\n\n // The child components do not layout properly if a transform is active.\n // So, let's reset the transform before we proceed, then apply it later.\n this.resetTransform();\n\n this.style();\n this.position();\n this.layoutReady = this.loadContent()\n .then(() => this.anchor())\n .then(() => this.match())\n .then(() => this.layoutContent())\n .then(() => this.center())\n .then(() => this.applyTransform());\n }\n\n return this.layoutReady;\n }\n\n style() {\n // The zIndex creates a stacking context for the contents of the container\n // element so that they don't interfere with other containers.\n Object.assign(this.el.style, { zIndex: 1 }, this.css);\n }\n\n position() {\n if (this.constraints == null) return;\n const styles = { position: \"absolute\" };\n [\"top\", \"bottom\", \"left\", \"right\", \"width\", \"height\"].forEach((prop) => {\n const value = this.constraints[prop];\n if (value != null && type(value) !== \"object\") {\n styles[prop] = value;\n }\n });\n Object.assign(this.el.style, styles);\n }\n\n resetTransform() {\n if (this.postLayoutTransform != null) {\n this.el.style.transform = \"none\";\n }\n }\n\n applyTransform() {\n if (this.postLayoutTransform != null) {\n this.el.style.transform = this.postLayoutTransform;\n }\n }\n\n anchor() {\n let pRect;\n const promises = this.anchors.map(({ edge: containerEdge, anchor }) => {\n const { distance, edge: anchorEdge } = this.constraints[containerEdge];\n const containerEdgeType = EDGE_TO_TYPE[containerEdge];\n const anchorEdgeType = EDGE_TO_TYPE[anchorEdge];\n const dimension = EDGE_TO_DIMENSION[containerEdge];\n // Block positioning until the anchor is ready.\n return anchor.layout().then(() => {\n if (pRect == null) {\n pRect = this.parent.el.getBoundingClientRect();\n }\n\n const rect = getRelativeBoundingClientRect(anchor.el);\n let offset;\n switch (`${containerEdgeType} ${anchorEdgeType}`) {\n case \"leading leading\":\n offset = rect[anchorEdge];\n break;\n case \"trailing trailing\":\n offset = -rect[anchorEdge];\n break;\n case \"leading trailing\":\n offset = pRect[dimension] + rect[anchorEdge];\n break;\n case \"trailing leading\":\n offset = pRect[dimension] - rect[anchorEdge];\n break;\n }\n\n const { value, units } = parseCSSLength(distance);\n switch (units) {\n case \"px\":\n offset += value;\n break;\n case \"%\":\n offset += (pRect[dimension] * value) / 100;\n break;\n }\n\n this.el.style[containerEdge] = `${offset}px`;\n });\n });\n return Promise.all(promises);\n }\n\n match() {\n if (\n this.constraints == null ||\n !(\n this.constraints.matchWidthToHeight ||\n this.constraints.matchHeightToWidth\n )\n ) {\n return;\n }\n\n const { width, height } = this.el.getBoundingClientRect();\n if (this.constraints.matchWidthToHeight) {\n this.el.style.width = `${height}px`;\n } else if (this.constraints.matchHeightToWidth) {\n this.el.style.height = `${width}px`;\n }\n }\n\n layoutContent() {\n if (this.invalidated) return;\n\n const promises = this.children.map((child) => child.layout());\n if (this.content != null) {\n promises.push(this.content.layout(this.el));\n }\n\n return Promise.all(promises).then(() => {\n // For containers that serve as wrappers for other containers (i.e. do not\n // have content), calculate the aggregate bounding rectangle for all\n // children and resize the container to match the rectangle. This allows\n // centering to work properly.\n if (this.content != null || (this.fixedWidth && this.fixedHeight)) return;\n const rect = getAggregateBoundingClientRect(\n this.children.map((child) => child.el)\n );\n const style = {};\n if (!this.fixedWidth) {\n style.width = `${rect.width}px`;\n }\n\n if (!this.fixedHeight) {\n style.height = `${rect.height}px`;\n }\n\n Object.assign(this.el.style, style);\n });\n }\n\n center() {\n if (\n this.constraints == null ||\n !(this.constraints.centerHorizontal || this.constraints.centerVertical)\n ) {\n return;\n }\n\n const pRect = this.parent.el.getBoundingClientRect();\n const rect = this.el.getBoundingClientRect();\n if (this.constraints.centerHorizontal) {\n this.el.style.left = `${(pRect.width - rect.width) / 2}px`;\n }\n\n if (this.constraints.centerVertical) {\n this.el.style.top = `${(pRect.height - rect.height) / 2}px`;\n }\n }\n\n invalidate() {\n this.invalidated = true;\n\n // NOTE(vsingh):\n // The following is a hack on top of a hack. We invalidate containers when\n // resetting layout, so that any asynchronous process kicked off\n // by those containers will have no further effect.\n // Unfortunately the invalidation hack has holes: there are still\n // cases where side effects are applied to the DOM element\n // associated with the container. Therefore, dissociate the\n // container and the DOM element immediately upon container\n // invalidation.\n this.el = document.createElement(\"div\");\n }\n}\n\nexport default Container;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/container.js","import * as DOMUtils from \"../../frontendlib/dom_utils\";\nimport * as Utils from \"../../frontendlib/utils\";\n\nconst TEMPLATE = `<div class=\"last-chance-endscreen\">\n <svg class=\"back-cta-icon hidden\" width=\"24px\" height=\"24px\" fill=\"white\">\n <path d=\"M12 17.414 3.293 8.707l1.414-1.414L12 14.586l7.293-7.293 1.414 1.414L12 17.414z\"/>\n </svg>\n <div class=\"last-chance-endscreen-container\">\n <div class=\"inner-container hidden\">\n <img class=\"last-chance-logo\" />\n <div class=\"icon-container\"></div>\n <div class=\"caption\"></div>\n <a class=\"liftoff-link liftoff-cta\">\n <img />\n <div class=\"common-cta\"></div>\n </a>\n </div>\n </div>\n</div>`;\n\n/**\n * @typedef AppStoreData\n * @property {string} icon - application icon.\n * @property {string} name - application name.\n * @property {string} company - application company/developer.\n * @property {number} rating - application rating on Google Play store.\n * @property {number} rating_count - number of times the app has been rated on\n * the Google Play store.\n * @property {string | number} download_count - number of times the app has been\n * downloaded from the Google Play store.\n * @property {string} content_rating - app content rating on the Google Play\n * store.\n * @property {string} screenshots - screenshots available for the app.\n * @property {string} description - app description.\n */\n\n/**\n * Creates a Liftoff Last Chance Endscreen component which is displayed to the\n * user as an overlay HTML endscreen.\n *\n * @see https://docs.google.com/presentation/d/15EUBJUVXP2DpFbkA3hB0yE8z-iEy6C1I5tlZ-1h-jBw/edit?usp=sharing\n */\nexport default class LastChanceEndscreen {\n /**\n *\n * @param {AppStoreData} appStoreData\n * @param {Object} parentEl\n * @param {function} handleClick\n * @param {boolean} validateUserClick - if true then CTA is only triggered if\n * click is invoked by the user and not programmatically.\n * @param {Object} env\n */\n constructor(\n appStoreData,\n parentEl,\n handleClick,\n validateUserClick = false,\n env\n ) {\n this.appStoreData = appStoreData;\n this.parentEl = parentEl;\n this.el = DOMUtils.strToElement(TEMPLATE);\n this.handleClick = handleClick;\n this.validateUserClick = validateUserClick;\n this.env = env;\n this.ctaText = env.cta_text || \"INSTALL\";\n this.autoEndCardCallCount = 0;\n this.timeout = null;\n\n if (this.parentEl == null) {\n console.error(\n \"Last chance endscreen was created without a parent container\"\n );\n }\n // Load app icon when the Liftoff Last Chance Endscreen instance is created.\n this.images = this.loadImages([this.appStoreData.icon]);\n }\n\n loadImages(imagePaths) {\n return Utils.loadImages(imagePaths);\n }\n\n prepareAutoEndcard() {\n this.el.querySelector(\".caption\").innerHTML = this.appStoreData.name;\n this.el.querySelector(\".common-cta\").innerHTML = this.ctaText.toUpperCase();\n // Show all elements in the LO last chance endscreen after app icon is\n // loaded on the browser.\n this.images\n .then((values) => {\n values.forEach((img) => {\n img.classList.add(\"icon\");\n this.el.querySelector(\".icon-container\").appendChild(img);\n });\n })\n .catch((error) => {\n console.error(`Error while rendering app icon: ${error.message}`);\n })\n .finally(() => {\n // This will run on success or error.\n this.el.querySelector(\".inner-container\").classList.remove(\"hidden\");\n });\n\n this.parentEl.appendChild(this.el);\n }\n\n showAutoEndcard() {\n if (this.env.has_html_endscreen) {\n if (this.env.platform) {\n // For adding iOS/Android specific styles on the AutoEndcard\n this.el.closest(\"#liftoff-snippet\").classList.add(this.env.platform);\n }\n\n this.el.querySelector(\".back-cta-icon\").classList.remove(\"hidden\");\n this.el.classList.add(\"rolling-up-animation\");\n }\n }\n\n initAutoEndcard() {\n if (this.wasShown) return;\n this.wasShown = true;\n this.prepareAutoEndcard();\n this.showAutoEndcard();\n this.initializeEvents();\n }\n\n initializeEvents() {\n let touchstart = 0;\n\n // Fire CTA if user clicks anywhere on the screen.\n this.el.addEventListener(\"click\", (e) => {\n if (!e.target.closest(\".back-cta-icon\")) {\n const triggerCTA = this.validateUserClick ? e.isTrusted : true;\n if (triggerCTA) {\n this.handleClick(\n !this.useInteractionMonitor ? e : this._lastInteraction\n );\n }\n }\n });\n\n this.el.querySelector(\".back-cta-icon\").addEventListener(\"click\", () => {\n this.el.classList.add(\"rolling-down-animation\");\n });\n\n this.el.addEventListener(\"touchstart\", (e) => {\n touchstart = e.changedTouches[0].screenY;\n });\n\n this.el.addEventListener(\"touchend\", (e) => {\n // Adding 70px buffer to avoid accidental taps on screen\n if (e.changedTouches[0].screenY > touchstart + 70) {\n this.el.classList.add(\"rolling-down-animation\");\n }\n });\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/last_chance_endscreen/last_chance_endscreen.js","import Component from \"./component\";\nimport * as CreativeUtils from \"../creative_utils\";\nimport * as ClickHandling from \"../click_handling\";\nimport LiftoffMRAID from \"./liftoff_mraid\";\nimport { InteractionMonitor } from \"../interaction_monitor\";\nimport LetterboxConfig from \"./letterbox_config\";\nimport Logger from \"./logger\";\nimport WindowResizeLogger from \"./window_resize_logger\";\nimport {\n AUDIO_POLICY_NO_RESTRICTIONS,\n CLICK_METRIC_TYPE_CLOSE,\n CLICK_METRIC_TYPE_CTA,\n CLICK_METRIC_TYPE_DEADZONE,\n CLICK_METRIC_TYPE_UNKNOWN,\n CLICK_OPEN_METHOD_MRAID,\n} from \"../constants\";\nimport * as DOMUtils from \"../frontendlib/dom_utils\";\nimport * as Utils from \"../frontendlib/utils\";\nimport { clickAreaTypeFromEvent, pointInCTA } from \"./cta\";\nimport { getAdexpContextSnapshotFn } from \"./adexp\";\nimport Autoclick from \"./autoclick/Autoclick\";\nimport Madlib from \"./madlib\";\nimport LastChanceEndscreen from \"../lib/last_chance_endscreen/last_chance_endscreen\";\nimport { MESSAGE_TRESENSA_INTERACTION } from \"./csp-env/messages\";\n\n/**\n * NOTE(oscar): After 3 seconds, log what mraid methods/events have been\n * supported. This should be right before users typically close the ad\n * which should give enough time to check what events have triggered or\n * methods used.\n */\nconst logMraidSupport = () => {\n setTimeout(() => {\n Logger.recordLog(\n \"mraid\",\n // TODO(oscar): Use the data param once adexp logs can save it.\n JSON.stringify({\n tag: \"mraidSupport\",\n ...LiftoffMRAID.getSupportedLog(),\n })\n );\n }, 3000);\n};\n\n/**\n * Function used to handle auto-endcard interaction event from TreSensa\n * creatives made from the \"tresensa-snippet\" Madlib component.\n * @param {*} e\n * @param {*} autoEndcard\n * @param {*} lastChanceEndscreenAutoclick\n * @param {*} lastChanceEndscreenInteractionAutoclick\n * TODO(luis): We need to integrate TreSensa interaction events with the\n * InteractionMonitor class.\n */\nconst onTreSensaInteraction = (\n e,\n autoEndcard,\n lastChanceEndscreenAutoclick,\n lastChanceEndscreenInteractionAutoclick,\n vxInteractionListeners\n) => {\n if (e.data === MESSAGE_TRESENSA_INTERACTION) {\n if (lastChanceEndscreenAutoclick) {\n lastChanceEndscreenAutoclick.disable();\n }\n // TODO(Luis): This is a temporary fix to handle the case where the\n // interaction event is triggered from a TreSensa wrapped 3p.\n // Eventually this needs to be deleted and updated so that a\n // tre_interaction event does trigger a global interaction that can be\n // detected by the AutoClick interaction behaviour.\n if (\n autoEndcard &&\n lastChanceEndscreenInteractionAutoclick &&\n lastChanceEndscreenInteractionAutoclick._behavior &&\n lastChanceEndscreenInteractionAutoclick._behavior.delay\n ) {\n // Display auto-endcard after a delay on interaction.\n setTimeout(() => {\n autoEndcard.initAutoEndcard();\n }, lastChanceEndscreenInteractionAutoclick._behavior.delay);\n }\n\n // NOTE(Sangeeth): The onTreSensaInteraction handler is only called for\n // tresensa client wrapped playables. These playables run inside an iframe\n // so we can't detect interaction events for them through the interaction\n // monitor.\n vxInteractionListeners.forEach((cb) => cb());\n }\n};\n\nclass Liftoff {\n static init(env, assets, trackingTags = []) {\n try {\n /** TODO(oscar): Consider logging MRAID support for CSP creatives. */\n logMraidSupport();\n\n if (trackingTags != null) {\n LiftoffMRAID.onViewable(() => {\n const trackingTagHolder = document.getElementById(\n \"tracking-tag-holder\"\n );\n DOMUtils.appendImpressionTags(trackingTagHolder, trackingTags);\n });\n }\n\n this.env = env;\n this.populateAppStoreData();\n // The bid context is often used, giving it an alias saves characters and lines of this JS.\n this.bidContext = env.bid_context;\n this.assets = assets;\n this.testGroups = {};\n this.bidContext.ab_tests.forEach((group) => {\n this.testGroups[group] = true;\n });\n this.lastClickMetric = null;\n this.resetClickParams();\n this.interactionMonitor = new InteractionMonitor();\n this.vxInteractionListeners = [];\n this.interactionMonitor.onInteractionChange((e) => {\n this.vxInteractionListeners.forEach((cb) => cb(e));\n this._autoclickBus.forEach((ac) => ac.emitInteractionEvent(e));\n });\n\n this.snippetEl = null;\n this.updateMRAID();\n this.loadDOM();\n this.loadLogger();\n this.initAutoclickBehaviors();\n Logger.recordMetricV2(\"initial_load_count\", 1);\n this.applyPolicy();\n this.windowResizeLogger = new WindowResizeLogger(\n this.snippetEl,\n this.env.enable_logging\n );\n this.addEventListeners();\n this.madlibLoaded = false;\n this.useAutoendcardBehaviour = null;\n\n LiftoffMRAID.on(\"error\", (e) => Logger.recordError(e));\n } catch (e) {\n Logger.recordError(e);\n }\n }\n\n static populateAppStoreData() {\n if (!this.env.app_store_data) {\n try {\n if (window.parent.VungleHelper) {\n const tokens = window.parent.VungleHelper.tokens;\n if (tokens) {\n this.env.app_store_data = {\n icon: tokens.APP_ICON,\n name: tokens.APP_NAME,\n description: tokens.APP_DESCRIPTION,\n rating: tokens.APP_STORE_RATING,\n };\n }\n }\n } catch (error) {\n console.error(\"Error occurred:\", error.message);\n }\n }\n }\n\n static initAutoclickBehaviors() {\n this._autoclickBus = [];\n LiftoffMRAID.on(\"clickMethodTried\", ({ clickOpenMethod, isAutoclick }) => {\n if (isAutoclick && clickOpenMethod === CLICK_OPEN_METHOD_MRAID) {\n Logger.recordMetricV2(\n \"mraid_autoclick_fired_ms\",\n Date.now() - LIFTOFF_START_TS\n );\n }\n });\n\n this._viewclick = new Autoclick(this.bidContext.viewclick_behavior, {\n clickthroughHandler: (lastEvent) =>\n this.handleClick(\n {\n mac: 1,\n },\n clickAreaTypeFromEvent({\n clientX:\n lastEvent == null ? null : lastEvent.lastInteraction.startX,\n clientY:\n lastEvent == null ? null : lastEvent.lastInteraction.startY,\n })\n ),\n });\n this._autoclickBus.push(this._viewclick);\n\n // We store app store data in this variable for reusability.\n const appStoreData = this.env.app_store_data;\n\n let autoEndcard;\n // Only initialize autoEndcard if there is app store data in the bid context.\n if (appStoreData) {\n autoEndcard = new LastChanceEndscreen(\n appStoreData,\n this.snippetEl,\n (e) => {\n Madlib.handleNavigationClick(e, {\n ae: 1,\n });\n },\n this.bidContext.exchange === \"inmobi\",\n this.env\n );\n }\n\n this.useAutoendcardBehaviour =\n this.bidContext.last_chance_endscreen_autoclick_behavior;\n\n // If exchange is mintegral then only display the auto endcard on delay if\n // platform is ios.\n if (\n this.useAutoendcardBehaviour &&\n (this.bidContext.exchange != \"mintegral\" ||\n this.bidContext.platform === \"ios\")\n ) {\n this._lastChanceEndscreenAutoclick = new Autoclick(\n this.useAutoendcardBehaviour,\n {\n clickthroughHandler: () => {\n if (autoEndcard) {\n autoEndcard.initAutoEndcard();\n }\n },\n }\n );\n this._autoclickBus.push(this._lastChanceEndscreenAutoclick);\n }\n\n this._lastChanceEndscreenInteractionAutoclick = new Autoclick(\n this.bidContext.last_chance_endscreen_interaction_autoclick_behavior,\n {\n clickthroughHandler: () => {\n if (autoEndcard) {\n autoEndcard.initAutoEndcard();\n }\n },\n }\n );\n this._autoclickBus.push(this._lastChanceEndscreenInteractionAutoclick);\n /**\n * Handle cases where the interaction event is triggered from the\n * \"tresensa-snippet\" Madlib component.\n */\n window.addEventListener(\n \"message\",\n (e) => {\n onTreSensaInteraction(\n e,\n autoEndcard,\n this._lastChanceEndscreenAutoclick,\n this._lastChanceEndscreenInteractionAutoclick,\n this.vxInteractionListeners\n );\n },\n true\n );\n }\n\n static setInteractionPromptReached(e) {\n this._autoclickBus.forEach((ac) => ac.emitInteractionPromptReachedEvent(e));\n }\n\n static getAnimationDurationLimit() {\n return this.env.creative_policy.animation_duration_limit;\n }\n\n static handleMadlibError(e) {\n Logger.recordError(e);\n }\n\n static hasTestGroup(group) {\n return !!this.testGroups[group];\n }\n\n static isExchange(exchange) {\n return this.bidContext.exchange.toLowerCase() === exchange.toLowerCase();\n }\n\n static updateMRAID() {\n if (this.bidContext.is_interstitial) {\n const { width, height } = this.bidContext;\n LiftoffMRAID.lockOrientation(width < height ? \"portrait\" : \"landscape\");\n }\n }\n\n static loadLogger() {\n const {\n enable_logging: enableLogging,\n enable_html_return: enableHtmlReturn,\n logging_endpoint: endpoint,\n event_tracking_param: trackingParam,\n html_return_delay: delay,\n } = this.env;\n\n Logger.passContext(\n endpoint,\n trackingParam,\n getAdexpContextSnapshotFn(this.snippetEl, () => {\n return LiftoffMRAID.hasSupport(\"mraid\");\n })\n );\n\n if (!enableLogging) {\n return;\n }\n\n Logger.enable();\n Logger.addErrorListeners();\n\n if (!enableHtmlReturn) {\n return;\n }\n CreativeUtils.configureHTMLReturn(endpoint, delay);\n }\n\n static loadDOM() {\n this.snippetEl = document.createElement(\"div\");\n this.snippetEl.id = \"liftoff-snippet\";\n this.snippetEl.classList.add(this.bidContext.platform.toLowerCase());\n this.snippetEl.classList.add(...this.bidContext.ab_tests);\n document.body.appendChild(this.snippetEl);\n // TreSensa endcards using the adcontainer.js library rely on the\n // \"tre_container\" div being present.\n if (this.env.is_tre) {\n this.treContainerEl = document.createElement(\"div\");\n this.treContainerEl.id = \"tre_container\";\n this.treContainerEl.zIndex = 2;\n this.snippetEl.appendChild(this.treContainerEl);\n }\n }\n\n /**\n * A creative policy is a collection of special requirements the creative must comply with. These tend\n * to be country and/or exchange specific.\n * Creative policies are set in admarkup/core.\n * @param {Object} policy - A series of requirements.\n * @param {boolean} policy.add_border - Adds a border around the creative.\n * @param {string} policy.russian_age_rating - Shows age rating watermark.\n * @param {number} policy.animation_duration_limit - Stops all animation after a set time.\n * @param {boolean} policy.show_chinese_watermark - Shows Chinese watermark.\n * @param {boolean} policy.show_ad_choices - Shows the AdChoices watermark.\n * @param {boolean} policy.block_notifications - Blocks notification icons from appearing on chat banners.\n * @param {boolean} policy.block_strobing - Keeps strobing/blinking animations from happening.\n * @param {boolean} policy.use_custom_close - True iff we should use a custom close button for this\n * impression.\n * @param {number} policy.close_delay - Overrides any previously set close delay duration.\n */\n static applyPolicy(\n {\n add_border,\n russian_age_rating,\n show_chinese_watermark,\n show_ad_choices,\n use_custom_close,\n close_delay,\n } = this.env.creative_policy\n ) {\n const bidContext = this.bidContext;\n CreativeUtils.applyLiftoffPolicy(\n this.snippetEl,\n {\n addBorder: add_border,\n showAdChoices: show_ad_choices,\n russianAgeRating: russian_age_rating,\n showChineseWatermark: show_chinese_watermark,\n useCustomClose: use_custom_close,\n closeDelay: close_delay,\n // NOTE(Casey): `applyLiftoffPolicy` globally modifies audio output of the entire creative. Currently,\n // madlib creatives do not use these global controls -- we depend on components to directly check\n // the audio policy before making sound. We therefore set `audioPolicy` here to `NO_RESTRICTION` to\n // disable the global controls.\n // TODO(Casey): Update this if we decide to use global controls for madlib creatives in the future.\n audioPolicy: AUDIO_POLICY_NO_RESTRICTIONS,\n },\n {\n creativeID: bidContext.creative_id,\n platform: bidContext.platform,\n exchange: bidContext.exchange.toLowerCase(),\n sourceAppName: bidContext.source_app_name,\n sourceAppID: bidContext.source_app_id,\n cdnURL: bidContext.cdnURL,\n }\n );\n }\n\n static onMadlibLoaded() {\n this.madlibLoaded = true;\n }\n\n static resetClickParams() {\n this.clickParams = {};\n }\n\n static mergeClickParams(params) {\n Object.assign(this.clickParams, params);\n }\n\n static getClickParams() {\n return this.clickParams;\n }\n\n /** Handles clickthrough/CTA clicks. */\n static handleClick(queryParams = {}, clickAreaType = null) {\n /**\n * NOTE(oscar): To prevent aggressive behavior, we disable autoclick the\n * first time the store page is opened regardless of how.\n * mac=1 means there will be no UX change.\n */\n if (this._lastChanceEndscreenAutoclick && !queryParams.mac) {\n this._lastChanceEndscreenAutoclick.disable();\n }\n // NOTE(oscar): pv=1 clicks should mean the MMP is not sent a click.\n if (!queryParams.pv) {\n this._viewclick.disable();\n }\n\n const clickTrackingParams = ClickHandling.getClickTrackingQueryParams(\n this.interactionMonitor.getAllInteractionData()\n );\n\n const allQueryParams = {\n cbl: this.madlibLoaded ? 0 : 1,\n ...this.getClickParams(),\n ...clickTrackingParams,\n ...queryParams,\n };\n\n if (clickAreaType != null) {\n allQueryParams.ca = clickAreaType;\n }\n\n const {\n bidContext: bidContext,\n env: { click_config: clickConfig },\n } = this;\n ClickHandling.handleClick({\n clickConfig: {\n clickthroughURL: clickConfig.clickthrough_url,\n clickTrackingURLs: clickConfig.click_tracking_urls,\n },\n queryParams: allQueryParams,\n isReengagement: bidContext.is_reengagement,\n platform: bidContext.platform,\n exchange: bidContext.exchange,\n abTests: bidContext.ab_tests,\n });\n }\n\n static onClickCapture(e) {\n // An array of EventTarget objects, some of which may be instances of Element.\n const path = (e.composedPath && e.composedPath()) || e.path;\n if (path == null) {\n return;\n }\n\n const foundSnippet = path.some((el) => el === this.snippetEl);\n if (!foundSnippet) {\n return;\n }\n\n const rect = this.snippetEl.getBoundingClientRect();\n const clickMetric = {\n x: Math.round(e.pageX - rect.left),\n y: Math.round(e.pageY - rect.top),\n time_ms: Date.now() - LIFTOFF_START_TS,\n // NOTE(vsingh): The click type below must be one of AdexpMetric.ClickType.\n type: CLICK_METRIC_TYPE_UNKNOWN,\n };\n\n // Helper function that returns true if some Elements in `path` satisfy the condition `pred`.\n const someElements = (pred) =>\n path.some(\n (eventtarget) => eventtarget instanceof Element && pred(eventtarget)\n );\n\n if (someElements((el) => el.classList.contains(\"liftoff-close-target\"))) {\n clickMetric.type = CLICK_METRIC_TYPE_CLOSE;\n } else if (pointInCTA(e.clientX, e.clientY)) {\n clickMetric.type = CLICK_METRIC_TYPE_CTA;\n } else if (\n someElements((el) => el.classList.contains(\"liftoff-deadzone\"))\n ) {\n clickMetric.type = CLICK_METRIC_TYPE_DEADZONE;\n } else if (someElements((el) => el.id === \"liftoff-close\")) {\n // NOTE(vsingh): Special/weird case: if we hit liftoff-close but not liftoff-close-target,\n // consider it a deadzone click. There are just a few pixels around the close button that\n // trigger this `if` clause.\n clickMetric.type = CLICK_METRIC_TYPE_DEADZONE;\n }\n\n Logger.recordMetricV2(\"click\", clickMetric);\n this.lastClickMetric = clickMetric;\n }\n\n static addEventListeners() {\n LiftoffMRAID.onViewable(() => {\n Logger.recordMetricV2(\"first_viewable_ms\", Date.now() - LIFTOFF_START_TS);\n });\n LiftoffMRAID.onViewable((e) => {\n this._autoclickBus.forEach((ac) => ac.emitViewableEvent(e));\n }, true);\n LiftoffMRAID.onViewableChange((e) => {\n this._autoclickBus.forEach((ac) => ac.emitViewableChangeEvent(e));\n });\n\n window.addEventListener(\n \"click\",\n (e) => {\n this.onClickCapture(e);\n if (this._lastChanceEndscreenAutoclick) {\n this._lastChanceEndscreenAutoclick.disable();\n }\n },\n true\n );\n }\n\n static onLoadCompleted() {\n // NOTE(oscar): We log the initial dimensions immediately in case no \"resize\" event triggers.\n this.windowResizeLogger.logInitialDims();\n }\n\n static onFirstLayoutFinished() {\n Logger.recordMetricV2(\"load_time_ms\", Date.now() - LIFTOFF_START_TS);\n this._autoclickBus.forEach((ac) => ac.emitHtmlLoadedEvent());\n }\n\n static getLetterboxConfig() {\n return new LetterboxConfig(this.snippetEl);\n }\n\n static resolveAsset(assetType, assetID) {\n const asset = this.assets[`${assetType}s`][assetID];\n if (asset == null) {\n throw new Error(`${assetType}: ${assetID} not found`);\n }\n\n switch (assetType) {\n // NOTE(oscar): By default, we should assume only 1 asset URL per original will be passed to the markup.\n // Occasionally, we will test how we serve our assets, which may entail providing more than 1 version to\n // be selected here.\n\n // The common structure for an original asset is as follows:\n /**\n * {\n * \"id\",\n * \"asset-versions\": [{ \"public-url\", \"version-id\" }, ...]\n * }\n */\n case \"image_original\":\n return asset.image_versions[0][\"public-url\"];\n case \"video_original\":\n return asset.video_versions[0][\"public-url\"];\n }\n\n return asset.url;\n }\n\n /**\n * Enables exclusive format creatives to listen for Madlib interaction events.\n * Note: This method does not register interaction events for Madlib CSPs.\n */\n static addVXInteractionEventListener(cb) {\n this.vxInteractionListeners.push(cb);\n }\n}\n\nObject.assign(Liftoff, {\n Component,\n DOMUtils,\n LiftoffMRAID,\n Logger,\n Utils,\n});\n\nwindow.Liftoff = Liftoff;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/liftoff.js","import EventListener from \"../frontendlib/event_listener\";\nimport Logger from \"./logger\";\n\nconst overrideMethods = {\n layout: true,\n load: true,\n resize: true,\n start: true,\n stop: true,\n restart: true,\n};\n\nclass Component extends EventListener {\n static init() {\n this.registry = {};\n }\n\n static register(name, cls) {\n if (this.registry[name] != null) {\n throw new Error(`ComponentError: ${name} already registered`);\n }\n\n this.assertSubclassed(cls);\n this.registry[name] = cls;\n }\n\n static new(name, config) {\n const cls = this.registry[name];\n if (cls == null) {\n throw new Error(`ComponentError: component \"${name}\" not registered`);\n }\n\n return new cls(config);\n }\n\n static assertSubclassed(cls) {\n const methods = Object.getOwnPropertyNames(this.prototype);\n methods.forEach((method) => {\n if (overrideMethods[method] !== true) return;\n if (cls.prototype[method] === this.prototype[method]) {\n throw new Error(`ComponentError: ${method} must be overridden`);\n }\n });\n }\n\n constructor(config) {\n super();\n this.config = config;\n this.on({\n start: () => this.start(),\n stop: () => this.stop(),\n restart: () => this.restart(),\n });\n }\n\n error(err) {\n this.emit(\"error\", `${this.constructor.name}Error: ${err}`);\n }\n\n // The layout method should prepare the component to take up a stable size and\n // position within the DOM.\n layout(parentNode) {\n this.parentNode = parentNode;\n }\n\n // The load method should load assets. This is intended to capture the time it\n // takes for the component to be fully visible (all images/videos loaded).\n load() {}\n\n resize() {}\n\n start() {}\n\n stop() {}\n\n restart() {}\n\n recordInteraction() {\n Logger.recordMetricV2(\"interaction_count\", 1);\n }\n\n recordInteractionPromptReached() {\n Logger.recordMetricV2(\"interaction_prompt_reached_count\", 1);\n if (\n window.Liftoff != null &&\n window.Liftoff.setInteractionPromptReached != null\n ) {\n window.Liftoff.setInteractionPromptReached();\n }\n }\n}\n\nComponent.init();\n\nexport default Component;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/component.js","/**\n * This config is used for letterboxing Madlib creatives. It works by changing the size\n * of liftoff-layout element (specific to Madlib), and scale it within liftoff-snippet\n * (provided by Liftoff.js).\n *\n * Arguably the better way to implement letterboxing is by controlling the size of\n * liftoff-snippet element based on Madlib configuration (i.e. fixed size or\n * stretchable, in the future), for example, by displaying Madlib creative in\n * an iFrame. If iFrames do not involve performance penalty, it would be\n * preferable since it would be another step to unify Madlib and CSP creatives.\n */\nclass LetterboxConfig {\n /**\n * @typedef {Object} Dimensions\n * @property {number} width - The width of the element.\n * @property {number} height - The height of the element.\n */\n\n /**\n * @typedef {Object} LetterboxConfigData\n * @property {Dimensions} viewportSize - The size of the viewport.\n * @property {Dimensions} bidCreativeSize - The size of the bid creative.\n * @property {boolean} enable - Indicates if the creative should be letterboxed.\n * @property {boolean} useDarkRootBackground - Indicates if the root element should use a dark background.\n * @property {boolean} useLayoutBackground - Indicates if the layout element should use its own light-colored background.\n */\n\n constructor(snippetEl) {\n this.snippetEl = snippetEl;\n\n /** @type {LetterboxConfigData} */\n this.config = this.getLetterboxConfig();\n }\n\n enabled() {\n return this.config.enable;\n }\n\n useDarkRootBackground() {\n return this.config.useDarkRootBackground;\n }\n\n useLayoutBackground() {\n return this.config.useLayoutBackground;\n }\n\n /**\n * Choose the appropriate config based on viewport dimensions.\n * If one orientation's config is missing, default to the other one.\n */\n getCreativePreferredOrientation({ width, height }) {\n return width <= height ? \"portrait\" : \"landscape\";\n }\n\n /**\n * Analyze the viewport and make some decisions about how we will present our\n * creative content.\n * @returns {LetterboxConfigData}\n */\n getLetterboxConfig() {\n const dims = (obj) => ({ width: obj.width, height: obj.height });\n\n const viewportSize = dims(this.snippetEl.getBoundingClientRect());\n const bidCreativeSize = dims(Liftoff.bidContext);\n\n const viewportOrientation =\n viewportSize.width <= viewportSize.height ? \"portrait\" : \"landscape\";\n\n // We are trying to show a portrait creative in a landscape-size viewport, or a landscape creative\n // in a portrait-size viewport.\n const orientationMismatch =\n viewportOrientation !==\n this.getCreativePreferredOrientation(bidCreativeSize);\n\n const isRotated = Liftoff.bidContext.is_interstitial && orientationMismatch;\n\n const useWhiteBars = isRotated;\n const useDarkRootBackground = !useWhiteBars;\n const useLayoutBackground = useDarkRootBackground;\n const enable = useWhiteBars || isRotated;\n\n return {\n viewportSize,\n bidCreativeSize,\n enable,\n useDarkRootBackground,\n useLayoutBackground,\n };\n }\n\n // Returns the scaling factor necessary to scale `contentSize` up to `viewportSize`\n // whilst maintaining the aspect ratio of the content.\n preserveAspectRatioScalingFactor(contentSize, viewportSize) {\n if (\n contentSize.height * viewportSize.width <=\n viewportSize.height * contentSize.width\n ) {\n return viewportSize.width / contentSize.width;\n } else {\n return viewportSize.height / contentSize.height;\n }\n }\n\n // Given a letterbox config, returns information that is useful for laying out the various DOM elements.\n // Returns an object with the following keys:\n // scaleFactor: the scale factor to be applied to the layout element\n // rootContainerSize: the width and height in pixels of the layout element\n // rootContainerOffset: the x and y coordinates in pixels of the layout element\n // rootContainerTransformedArea: expected values in pixels for the x, y, width, and height of the root\n // container after scale and rotation are applied\n getLetterboxLayoutInfo() {\n const { viewportSize, bidCreativeSize } = this.config;\n\n const scaleFactor = this.preserveAspectRatioScalingFactor(\n bidCreativeSize,\n viewportSize\n );\n const rootContainerSize = bidCreativeSize;\n const rootContainerOffset = {\n x: (viewportSize.width - rootContainerSize.width) / 2,\n y: (viewportSize.height - rootContainerSize.height) / 2,\n };\n\n const rootContainerScaled = {\n width: bidCreativeSize.width * scaleFactor,\n height: bidCreativeSize.height * scaleFactor,\n };\n const rootContainerTransformedArea = {\n x: (viewportSize.width - rootContainerScaled.width) / 2,\n y: (viewportSize.height - rootContainerScaled.height) / 2,\n width: rootContainerScaled.width,\n height: rootContainerScaled.height,\n };\n\n return {\n scaleFactor,\n rootContainerSize,\n rootContainerOffset,\n rootContainerTransformedArea,\n };\n }\n\n getLetterboxConstraintsForMadlibRootElement() {\n const { scaleFactor, rootContainerSize, rootContainerOffset } =\n this.getLetterboxLayoutInfo();\n\n return {\n rootConstraints: {\n left: `${rootContainerOffset.x}px`,\n top: `${rootContainerOffset.y}px`,\n width: `${rootContainerSize.width}px`,\n height: `${rootContainerSize.height}px`,\n },\n rootPostLayoutTransform: `scale(${scaleFactor})`,\n };\n }\n\n getStyleForClickElement() {\n const { rootContainerTransformedArea } = this.getLetterboxLayoutInfo();\n return {\n left: `${rootContainerTransformedArea.x}px`,\n top: `${rootContainerTransformedArea.y}px`,\n width: `${rootContainerTransformedArea.width}px`,\n height: `${rootContainerTransformedArea.height}px`,\n right: \"auto\",\n bottom: \"auto\",\n };\n }\n}\n\nexport default LetterboxConfig;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/letterbox_config.js","import Logger from \"./logger\";\nimport { getIn } from \"../frontendlib/utils\";\n\nconst initialScreenAngle = getIn(window, [\"screen\", \"orientation\", \"angle\"]);\n\nconst RESIZE_LOGGING_SAMPLING_FREQUENCY_MULTIPLIER = 0.1;\n\n/**\n * Logs window resize events to Adexp.\n */\nclass WindowResizeLogger {\n constructor(snippetEl, enable_logging) {\n // We log resizes at a lower sampling frequency, because the log messages can be very numerous.\n this.enableResizeLogging = enable_logging\n ? Math.random() < RESIZE_LOGGING_SAMPLING_FREQUENCY_MULTIPLIER\n : false;\n\n this.resizeCount = 0;\n this.resizeLog = [];\n this.snippetEl = snippetEl;\n\n window.addEventListener(\"resize\", () => {\n this.logResizedDims();\n });\n }\n\n _logDims() {\n if (!this.enableResizeLogging) return;\n const { width, height } = this.snippetEl.getBoundingClientRect();\n const data = {\n height,\n width,\n sinceStartMS: Date.now() - LIFTOFF_START_TS,\n \"screen.orientation.angle\": getIn(window, [\n \"screen\",\n \"orientation\",\n \"angle\",\n ]),\n initialScreenAngle,\n resizeCount: this.resizeCount,\n // Check support of rotation events.\n supportsOrientationChange: \"onorientationchange\" in window,\n supportsDeviceOrientation: \"ondeviceorientation\" in window,\n \"window.innerWidth\": window.innerWidth,\n \"window.innerHeight\": window.innerHeight,\n \"documentElement.clientWidth\":\n document.documentElement != null &&\n document.documentElement.clientWidth,\n \"documentElement.clientHeight\":\n document.documentElement != null &&\n document.documentElement.clientHeight,\n };\n this.resizeLog = [...this.resizeLog, data];\n Logger.recordLog(\"resize\", \"resize\", { resizeLog: this.resizeLog });\n }\n\n logInitialDims() {\n this._logDims();\n }\n\n logResizedDims() {\n this.resizeCount += 1;\n this._logDims();\n }\n}\n\nexport default WindowResizeLogger;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/madlib/window_resize_logger.js"],"sourceRoot":""}