{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./player/config/translations.js","webpack:///./player/config.js","webpack:///./player/config/jw-keys.js","webpack:///./player/config/production.js","webpack:///./player/playback/config/status-codes.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/get.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_root.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_getNative.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/isArray.js","webpack:///./utils/script-loader.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_baseGetTag.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/isObject.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_castPath.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_Symbol.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/isObjectLike.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_nativeCreate.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_assocIndexOf.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_getMapData.js","webpack:///./icons/play.svg","webpack:///./icons/pause.svg","webpack:///./icons/audio.svg","webpack:///./icons/audio-muted.svg","webpack:///./icons/chevron-right.svg","webpack:///./utils/module-loader.js","webpack:///./icons/close.svg","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/isSymbol.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_toKey.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/isArguments.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/isLength.js","webpack:///./icons/audio/audio-half.svg","webpack:///./icons/audio/audio-off.svg","webpack:///./icons/audio/audio-on.svg","webpack:///./icons/audio/forward-30.svg","webpack:///./icons/audio/pause.svg","webpack:///./icons/audio/play.svg","webpack:///./icons/audio/replay.svg","webpack:///./icons/audio/rewind-10.svg","webpack:///./icons/audio/playback-rate.svg","webpack:///./icons/audio-half.svg","webpack:///./icons/captions.svg","webpack:///./icons/fullscreen-off.svg","webpack:///./icons/fullscreen-on.svg","webpack:///./icons/info.svg","webpack:///./icons/settings.svg","webpack:///./icons/share.svg","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_baseGet.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_freeGlobal.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/isFunction.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_toSource.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/eq.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_Map.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_defineProperty.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_isIndex.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_isPrototype.js","webpack:///(webpack)/buildin/module.js","webpack:///./icons/error.svg","webpack:///./player/playback/ads/homad-lib.js","webpack:///./player/plugins/pause.html","webpack:///./player/plugins/countdown.html","webpack:///./player/plugins/recommended/recommended.html","webpack:///./player/plugins/recommended/next-asset.html","webpack:///./player/plugins/recommended/grid.html","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/pick.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/isEmpty.js","webpack:///./svp-player.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_isKey.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_getRawTag.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_objectToString.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_stringToPath.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_memoizeCapped.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/memoize.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_MapCache.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_mapCacheClear.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_Hash.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_hashClear.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_baseIsNative.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_isMasked.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_coreJsData.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_getValue.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_hashDelete.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_hashGet.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_hashHas.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_hashSet.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_ListCache.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_listCacheClear.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_listCacheDelete.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_listCacheGet.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_listCacheHas.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_listCacheSet.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_mapCacheDelete.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_isKeyable.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_mapCacheGet.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_mapCacheHas.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_mapCacheSet.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/toString.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_baseToString.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_arrayMap.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_basePick.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_basePickBy.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_baseSet.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_assignValue.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_baseAssignValue.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/hasIn.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_baseHasIn.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_hasPath.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_baseIsArguments.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_flatRest.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/flatten.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_baseFlatten.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_arrayPush.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_isFlattenable.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_overRest.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_apply.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_setToString.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_baseSetToString.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/constant.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/identity.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_shortOut.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_baseKeys.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_nativeKeys.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_overArg.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_getTag.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_DataView.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_Promise.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_Set.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_WeakMap.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/isArrayLike.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/isBuffer.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/stubFalse.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/isTypedArray.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_baseIsTypedArray.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_baseUnary.js","webpack:////var/lib/jenkins/workspace/SVP_web-player_v3.38.15/node_modules/lodash/_nodeUtil.js","webpack:///./utils/underscore.js","webpack:///./utils/backbone.events.js","webpack:///./utils/device.js","webpack:///./utils/merge.js","webpack:///./utils/utils.js","webpack:///./utils/logger.js","webpack:///./utils/server-time.js","webpack:///./player/services/api.js","webpack:///./utils/model.js","webpack:///./player/model/category.js","webpack:///./player/model/asset.js","webpack:///./player/services/api/related.js","webpack:///./player/services/api/asset/mock.js","webpack:///./player/services/api/asset.js","webpack:///./utils/image.js","webpack:///./player/model/stream.js","webpack:///./player/model/next-asset.js","webpack:///./player/model/recommended/list.js","webpack:///./player/model/recommended.js","webpack:///./player/model/locale.js","webpack:///./utils/string.js","webpack:///./player/model/domain.js","webpack:///./player/model/token.js","webpack:///./player/playback/ads/appnexus-tag-builder.js","webpack:///./player/playback/ads/appnexus-jw-config.js","webpack:///./player/playback/ads/appnexus.js","webpack:///./player/playback/config/playlist.js","webpack:///./player/playback/config/sharing.js","webpack:///./player/playback/config/playback.js","webpack:///./player/playback/youbora.js","webpack:///./player/playback/config.js","webpack:///./player/playback/config/captions.js","webpack:///./player/playback/config/jw-youbora.js","webpack:///./player/playback/config/keys.js","webpack:///./player/playback/ads/homad.js","webpack:///./player/playback/ads/homad-jw.js","webpack:///./player/playback/ads/homad-skin.js","webpack:///./player/playback/config/autoplay.js","webpack:///./player/playback/ads/prevent-seeking.js","webpack:///./utils/style-loader.js","webpack:///./player/playback/skin/audioSkinResolver.js","webpack:///./player/playback/skin/icons-loader.js","webpack:///./player/playback/skin/settings-menu.js","webpack:///./player/playback/skin/config-button.js","webpack:///./utils/clipboard.js","webpack:///./player/playback/skin/sharing-box.js","webpack:///./player/playback/skin/container-class.js","webpack:///./player/playback/skin/levels-icon.js","webpack:///./player/playback/skin/nextUp.js","webpack:///./player/playback/skin.js","webpack:///./player/playback/provider.js","webpack:///./utils/eventable.js","webpack:///./utils/mixin.js","webpack:///./player/plugins/model.js","webpack:///./player/plugins.js","webpack:///./player/playback/ads/appnexus-ast.js","webpack:///./player/plugins/pause.js","webpack:///./player/plugins/age-limit.js","webpack:///./player/plugins/sponsor-label.js","webpack:///./player/plugins/podcast-experiment.js","webpack:///./player/plugins/countdown.js","webpack:///./player/plugins/recommended.js","webpack:///./player/plugins/svp-stats/tracker.js","webpack:///./player/plugins/svp-stats.js","webpack:///./player/plugins/pulse-stats/tracker.js","webpack:///./player/plugins/pulse-stats/helpers.js","webpack:///./player/plugins/pulse-stats/ad-events.js","webpack:///./player/plugins/pulse-stats/session.js","webpack:///./player/plugins/pulse-stats/playback-events.js","webpack:///./player/plugins/pulse-stats/ui-events.js","webpack:///./player/model/category-tree.js","webpack:///./player/plugins/pulse-stats.js","webpack:///./player/plugins/podcast-native-link.js","webpack:///./player/player.js","webpack:///./utils/adblock-detect.js","webpack:///./index.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","translations","en","months","Sharing","en_GB","es_ES","nb_NO","sv_SE","ads","admessage","cuetext","skipmessage","skiptext","podmessage","adblock","player","listen","playback","loginToListen","subscribeToListen","seconds","minutes","hours","no","play","pause","volume","prev","next","cast","airplay","fullscreen","playlist","hd","cc","audioTracks","playbackRates","replay","buffer","more","liveBroadcast","loadingAd","rewind","nextUp","nextUpClose","related","close","settings","unmute","copied","forward","se","version","keys","default","ab","adressa","adressabrandstudio","altaposten","ap","bt","brandstudio","folkebladet","fvn","harstad","itromso","podcast","rbnett","riks","ridenews","sa","schibsted","smp","svd","tronderavisa","vgtv","vgtvs","api","url","tokenUrl","thumbnailsUrl","relatedApiUrl","vmapUrl","vendor","identifier","endpoint","joiner","indexOf","this","cb","Math","random","homad","global","client","appnexus","vmap","ptv","cr","ast","debug","cdn","svp","pollyfils","youbora","time","images","servers","sizes","poster","autoHeight","autoWidth","skins","about","link","text","sharing","sites","code","domains","blacklist","whitelist","preview","vendors","locale","ACTIVE","ACTIVE_PREVIEW","NOT_ACTIVE","NOT_ACTIVE_GEOBLOCKED","NOT_FOUND","NOT_ACTIVE_PAST","GENERAL_ERROR","NETWORK_ERROR","TOKEN_FETCH_ERROR","statusMessages","baseGet","path","defaultValue","result","undefined","freeGlobal","freeSelf","self","root","Function","baseIsNative","getValue","isArray","Array","Promise","resolve","reject","onSuccess","onError","script","document","createElement","done","callback","type","src","async","onreadystatechange","onload","readyState","onerror","body","appendChild","loadScript","getRawTag","objectToString","symToStringTag","isKey","stringToPath","toString","nativeCreate","getNative","eq","array","length","isKeyable","map","data","__data__","moduleSrc","window","define","amd","require","baseGetTag","isObjectLike","isSymbol","baseIsArguments","objectProto","propertyIsEnumerable","isArguments","arguments","castPath","toKey","index","isObject","tag","funcToString","func","e","other","Map","reIsUint","test","Ctor","constructor","webpackPolyfill","deprecate","paths","children","isLoaded","exportz","k","b","u","g","a","round","String","fromCharCode","floor","A","h","f","q","charCodeAt","push","toLowerCase","j","isNaN","charAt","fireEvent","createEvent","state","initCustomEvent","dispatchEvent","track","M","isEnabled","T","encodeURIComponent","homad_url_prefix_alias","homad_track_key","homad_track_value","P","setTimeout","v","w","S","message","V","C","O","F","J","G","I","K","H","B","U","R","D","L","N","X","W","z","abs","Date","now","navigator","appCodeName","appName","appVersion","userAgent","platform","language","parseInt","reverse","match","y","conf","startPlayer","eval","fp_error","hd_ready","head","firstChild","insertBefore","setInterval","addEventListener","clearTimeout","getElementsByTagName","parentNode","removeChild","getElementsByClassName","top","hasChildNodes","lastChild","homad_url_suffix_base64","homad_url_suffix","homad_hash_guessed","x","enabled","server","replace","getTime","config","XMLHttpRequest","status","JSON","parse","responseText","open","substr","setRequestHeader","send","location","hostname","onFailure","globalConfig","clientConfig","clearInterval","basePick","pick","flatRest","baseKeys","getTag","isArrayLike","isBuffer","isPrototype","isTypedArray","splice","size","loadSvpLibrary","then","SVP","preInitialize","postInitialize","onReady","onSvpPlayerReady","PLAYER_LIB","jwplayer","loadJwPlayer","library","event","initEvent","reIsDeepProp","reIsPlainProp","nativeObjectToString","isOwn","unmasked","memoizeCapped","rePropName","reEscapeChar","string","number","quote","subString","memoize","cache","clear","MapCache","resolver","TypeError","memoized","args","apply","has","set","Cache","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","entries","entry","Hash","ListCache","hashClear","hashDelete","hashGet","hashHas","hashSet","isFunction","isMasked","toSource","reIsHostCtor","funcProto","reIsNative","RegExp","uid","coreJsData","maskSrcKey","exec","IE_PROTO","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","assocIndexOf","pop","getMapData","baseToString","arrayMap","symbolProto","symbolToString","iteratee","basePickBy","hasIn","baseSet","predicate","assignValue","isIndex","customizer","lastIndex","nested","newValue","objValue","baseAssignValue","baseHasIn","hasPath","isLength","hasFunc","flatten","overRest","setToString","baseFlatten","arrayPush","isFlattenable","depth","isStrict","values","offset","spreadableSymbol","isConcatSpreadable","nativeMax","max","start","transform","otherArgs","thisArg","baseSetToString","shortOut","constant","identity","nativeNow","count","lastCalled","stamp","remaining","nativeKeys","overArg","arg","DataView","Set","WeakMap","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","ArrayBuffer","ctorString","stubFalse","freeExports","nodeType","freeModule","Buffer","baseIsTypedArray","baseUnary","nodeUtil","nodeIsTypedArray","typedArrayTags","freeProcess","process","types","binding","idCounter","_","MAX_ARRAY_INDEX","pow","getLength","obj","isEmpty","isString","uniqueId","prefix","id","Events","eventSplitter","eventsApi","events","opts","names","context","split","on","internalOn","listening","_events","onApi","ctx","_listeners","listenTo","_listenId","listeningTo","_listeningTo","thisId","objId","options","handlers","off","offApi","listeners","stopListening","ids","handler","_callback","once","onceMap","listenToOnce","offer","trigger","triggerApi","objEvents","allEvents","all","slice","triggerEvents","concat","ev","a1","a2","a3","unbind","userAgentMatch","regex","lazyUserAgentMatch","isIETrident","isIPad","isEdge","isIOS","isAppleIOS","isIPhone","isSafari","isAndroid","isIE","isDesktop","isMobile","isTablet","isSamsungInternet","isHermesApp","getChromeVersion","raw","getPixelRatio","devicePixelRatio","getDeviceType","canAutoplay","isMergeableObject","val","cloneIfNecessary","optionsArgument","clone","deepmerge","defaultArrayMerge","target","source","destination","forEach","arrayMerge","mergeObject","Error","reduce","jwUtils","utils","jwUnderscore","extend","merge","ajax","each","isUndefined","isNumber","omit","createNode","addStyleSheet","addClass","removeClass","throttle","sequence","tasks","fn","promise","task","template","tmpl","str","join","getElementById","innerHTML","device","durationToSeconds","shareTimeToSeconds","compact","zeroPad","escape","escapeMap","getTimeFormatted","timestamp","inherit","model","protoProps","staticProps","parent","child","Surrogate","__super__","getScrollSnapPrefix","scrollSnapSupport","documentElement","style","jsonToUrl","startsWith","searchString","position","counters","log","counter","console","error","block","itemKey","localStorage","getItem","unshift","responseTime","fetch","resolveRequest","serverTime","Number","handleErrors","response","ok","makeFetch","json","assetAdditionalData","getUrl","attr","attributes","oldVal","Category","initialize","additional","background","main","image","logo","playerLogo","playerLogoImage","Asset","getVendor","unifyTimestamp","startIndexPoint","ageLimit","sourceFiles","series","season","seasonNumber","episode","episodeNumber","flightTimes","end","created","published","updated","category","chapters","chapter","timeline","nextAsset","tags","_embedded","assign","metadata","isSponsored","sponsored","title","chapterIndex","getChapters","getRelatedAssets","assetId","limit","query","relatedApi","VIDEO","Blob","Uint8Array","requestNumber","currentServerId","getServer","getImageTransform","serversAmount","streamType","streamUrls","hls","URL","createObjectURL","streamConfiguration","properties","getImageQuality","pixelRatio","imageId","width","height","min","cacheKey","maxDimension","idLen","transformType","transformSizes","dimensions","normalizeTransformSize","curr","getClosestSize","getImageSrc","extension","Stream","streams","hds","mp4","mediaType","assetType","snapshots","captions","begin","externalId","duration","disableNextVideo","chunkDuration","isPodcast","showAds","cuePoints","hasProperty","isPast","getTimeToStart","isActive","isOnHttp","protocol","streamUrl","containerWidth","getPoster","getId","supplyType","createResponse","hasPlayNext","asset","assets","fetchNextFromRelatedEngine","getNext","reason","fetchFromRelated","mapResponse","fetchNextById","fetchNext","translate","substitute","setTranslations","getMonthName","date","getMonth","getTranslations","prop","stringify","capitalizeFirstLetter","toUpperCase","isDomainInArray","origin","domain","pos","domainBeginning","len","na","item","fetchToken","params","isFetching","expire","assetAccess","maxBitrate","request","configuration","isValid","expiry","buildUrlString","getVmapTag","stream","overriddenParams","urlParams","URLSearchParams","search","slotName","creativeId","tagId","getOverriddenParams","adSlotConfig","adLabel","adConfig","overriddenId","format","isAudio","getParams","memberId","member","parseAdPlacements","adPlacements","globalParams","placements","placementId","tagOptions","globalOptions","getJwAdSchedule","adSlots","adsConfig","hasNext","setParams","add","preroll","getCuePoints","cuePoint","midroll","postroll","getConfig","getAdsConfig","schedule","getAdPlacements","getClientConfig","adn","hasAdsDisabled","svpAdConfig","publisherName","countryCode","includes","slotIds","svpPlayer","logger","adSchedule","adOptions","getLiveMidrollTag","maxDuration","vmaxduration","createMidroll","startTime","hasEntered","onEnterCallback","setTime","onEnter","description","minDvrWindow","addPlaylistMetadata","playlistItem","mediaId","getExternalId","getPlaybackTime","mediaid","starttime","addSnapshots","hasSnapshots","tracks","file","getSnapshots","kind","addCaptions","getCaptions","caption","label","hasMp4Streams","sources","isMock","preload","isSecure","withCredentials","advertising","autoplayMuted","autoplayadsmuted","vpaidcontrols","preloadAds","adschedule","addAppnexusAds","getVmapApiUrl","globals","defaults","heading","canAutostart","autoplay","hasPlayableSource","autostart","mute","skin","some","slot","hasPreroll","isFuture","autopause","autoPause","viewability","repeat","Plugin","setAdapter","adapters","JWPlayer","Config","node","env","token","jwDefaults","base","horizontalVolumeSlider","getMaxBitrate","rawOptions","getSettings","getRaw","playerContainer","container","clientWidth","clientHeight","isAudioWithoutCustomTitle","getCategory","getChunkDuration","getToken","isLive","isGeoblocked","getStreamUrl","catch","playlistStreams","abouttext","aboutlink","localization","plugins","liveSyncDuration","getLiveSyncDuration","jwConfig","getPlaylistItems","currentStream","setStream","playlistSettings","getPlaylistSettings","playlistOptions","getTitle","getDescription","applyPlaylistAdding","addSharing","native","renderCaptionsNatively","getDuration","content_id","owner","jw","hasRecommended","getRecommended","getPermissions","permissions","freeze","writable","getTagUrl","potOffset","getPlaylist","getAdPotTag","parseHomadEvent","details","detail","containerId","SvpPlayer","Player","isHomadLoaded","homadConfig","skipable","skipAdOnContextChange","runInsideContainer","adjustAdVolumeToContentPlayer","postrollUseCompleteEvent","muteButton","unmuteButton","playButton","pauseButton","skipableButton","adMessages","skipButton","prerollAdTag","midrollAdTag","postrollAdTag","aabConfig","playerId","onAdError","getContainer","hasAdBlocked","adPlayerLoading","classList","remove","pauseReason","onAdBreakStart","currentTime","getCurrentTime","adposition","forwardEvent","eventName","adPlaying","getEvents","adPosition","adId","impression","impressionURL","removeEvents","adPlayer","adPlayerContainer","appendControl","controlsContainer","querySelector","domNode","getControlsContainer","fullScreenButton","fullscreenButton","cloneNode","onClick","handleClick","createFullscreenButton","jwPlayer","setFullscreen","toggleFullscreen","seekBar","progressLoader","setProgress","reset","createProgressBar","setAdPlaying","setAdComplete","playerClassList","adStarted","useClasses","getPlaybackState","volumeBtn","float","adjustVolumePosition","createHomadSkin","MutationObserver","mutations","mutation","nodes","addedNodes","video","observe","childList","characterData","canDeviceAutoplay","supposedCurrentTime","onSeeking","onTimeUpdate","seeking","init","videoElement","removeEventListener","handle","loadedStylesheets","href","rel","loadStylesheet","PLAYBACK_RATES","forwardIcon","audioSkinResolver","useAudioSkin","Boolean","seekForward","getPosition","seek","changePlaybackRate","rate","getPlaybackRate","nextRateIndex","findIndex","currentRate","setPlaybackRate","playbackRate","textContent","toFixed","getControls","getStream","forwardTooltip","displayControl","cover","forwardButton","durationInfo","playbackRateButton","addButton","displayStyle","translatePlayerConfig","setAttribute","display","innerText","iconsMap","info","audioIconsMap","loadIcons","isAudioStream","replaceableIconsMap","customIcon","selector","replaceableIcons","querySelectorAll","replaceableIcon","svpIcon","getAttribute","replaceChild","contains","submenu","right","offsetWidth","offsetLeft","icon","infoNode","dataset","tip","dump","el","left","focus","select","execCommand","err","copyToClipboard","hasMediaId","getSharingLink","updateElement","replaceElement","sourceEl","newEl","updateSharingBox","svpPlayerModel","handleAppnexusClass","levels","handleLevelSettingsIcon","getTitleNode","skinLoader","loader","svpSkin","itemsShown","PlayerModel","isInitalized","isStopped","masterAsset","adBreaks","bindJwMethod","method","warn","getAdPosition","slotId","pre","mid","post","onPlaybackEndAvailable","playbackEnd","onTime","eventData","setup","youboraRatio","getMute","isPreviewMode","accountCode","enableAnalytics","onPlaylistItemLoad","onPlay","onPause","onComplete","onViewable","onAutostartNotAllowed","onMeta","onMetadataCueParsed","getCaptionsList","meta","xml","adSelector","adData","podcount","parseAdData","adbreaks","nextAd","find","ad","disableAutoplay","complete","load","stop","assetData","getVolume","setVolume","setMute","nextStream","getJwConfig","loadStream","force","isAdPlaying","getState","getAdBlock","playerCaptions","newIndex","captionsIndex","setCurrentCaptions","hasValidToken","playlistItemId","onFirstFrameLoad","playbackEndTime","viewable","slotDuration","onTimeChange","adTag","playAd","content","skipAd","TXXX","insertAd","cancelAd","playReason","methods","forwardedMethods","proxyMethod","sourceMethod","Eventable","copyProperties","Reflect","ownKeys","desc","getOwnPropertyDescriptor","super","plugin","getName","CustomPluginModel","scripts","pluginSrc","apntag","firstLoad","tagConfig","targetId","defineTag","loadTags","onEvent","showTag","refresh","dimmensions","resizeAd","offEvent","maxDisplays","displayCounter","withAdTag","adPlacement","withCounter","getBoundingClientRect","resizeTag","appnexusAdId","isAdTagLoaded","show","getViewable","refreshTag","hide","timerId","onSeek","render","adTagOptions","appnexusAdContainerId","closeIcon","closeButton","onResumeClick","stopPropagation","hideAfter","sponsor","pluginName","adFrom","assertUppercased","actual","expected","chooseVariant","variants","rangeNumber","winner","Percentage","percentage","prepareVariantsForExperiment","variantIds","filter","current","isLoginVariantType","variant","Type","loginUrl","subscriptionUrl","articleUrl","OfferButton","isSubscriptionVariantType","provider","useExtendedVariant","getHeight","buttonText","getButtonText","uiElementId","getUiElementId","pulseStatsPlugin","PulseStats","playbackEvents","productType","Offer","OfferHeader","OfferPreamble","redirectUrl","experimentInfo","experimentOverlay","leadingZeros","numValue","numLen","num","streamStart","liveDOM","countdownDOM","isPlaylistRegenerated","intervalId","diff","getDiff","isCountdownActive","currentState","getDate","getHours","getMinutes","newDiff","shouldRegeneratePlaylist","regeneratePlaylist","ceil","playNext","nextAssetSource","disableNext","getThumbnailUrl","initSnapScroll","scrollSnapPrefix","gridItem","getByClass","onGridItemClicked","onPlaybackStart","recommended","getAsset","gridItemsReady","grid","getItems","items","getNextAsset","onInitialize","fetchDuration","countdownTime","isDisabledNextVideo","hasPlaylist","isAssetFromPlaylist","onPlaybackComplete","onTimeNextVisible","onPlayNextVisible","timeout","transitionDuration","onNextAssetReady","Image","getThumbnail","countdown","nextIcon","onGridItemsReady","onGridVisible","onAssetReplay","className","previousEl","sendRequest","queryString","apiUrl","getApiUrl","hypen","trackingInterval","getTrackingInterval","initialStartTime","trackMediaEvent","playerTime","trackStreamEvent","adSlot","PulseTrackerLoader","trackers","pulse","getTracker","storedTracker","PROVIDER_TRACKER_ID","tracker","isCustomIntervalFalsy","customInterval","progressInterval","previousProgressPosition","adSequencePosition","adSequenceCount","beforeUnload","onAdSlotComplete","onPlaylistItem","onAdSlotStart","onAdStarted","onAdProgress","onAdFinished","onAdPause","onAdPlay","onPauseAdVisible","onHomadEvent","adIds","adID","abbAdPlayed","onHdEvent","slotData","previousPosition","sendStopEvent","watchData","previousTime","session","createSession","beforeStreamStart","onBeforeUnload","playMethod","vodInterval","liveInterval","onAssetPlay","onPlayNext","onLiveTime","playbackSource","onRecommendedPlay","jwRelatedPlugin","previousAssetId","getPlugin","defaultInterval","eventInterval","wasViewed","eventTime","trackTimeEvent","onRecommendedVisible","ui","categories","categoryId","parentId","instances","getMediaAssetId","experiment","decorator","intervals","engagementIntervals","embed","adSequenceDuration","playerAsset","accessControl","access","getTags","stories","getStories","originAssetId","categoryPath","categoryTree","getPath","experiments","getCategoryPath","resolveTracker","adEvents","adInterval","vod","live","uiEvents","onAdEvent","onPlaybackEvent","onUiEvent","onAdMeta","onHomadAdMeta","intent","trackingData","muted","getFullscreen","mediaAssetId","toLocaleLowerCase","destroy","linkAnchor","linkSpan","createTextNode","overlay","destroyPlugin","clearError","previousErrorNode","displayError","posterSrc","errorNode","translatedMessage","errorDetails","playNextFromPlaylist","nextAssetData","setAsset","isCompleted","onPlayerEvent","callFunction","onceConfigReady","handleReady","handleError","pluginConfig","addPlugin","onAssetReady","setMasterAsset","getChapter","getAgeLimit","getCategoryTitle","userStatus","isExperiment","experimentId","experimentRange","sessionStorage","setItem","loggedIn","hasProduct","pulseConfig","isStreamPlayable","onAssetError","isBlacklisted","relatedUrl","isPlayNextAvailable","getCurrentCaptions","recommendedPlugin","setPlayer","wasDetected","offsetParent","Plugins","__defaults","configurable","aab","setLocale","svpYoubora","loadYoubora"],"mappings":"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IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,GAAI,GAAI,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,GAAI,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,IAAK,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,GAAI,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,EAAG,IAAK,IAAK,IAAK,EAAG,GAAI,GAAI,EAAG,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,EAAG,EAAG,EAAG,IAAK,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,GAAI,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,GAAI,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,GAAI,IAAK,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","file":"player.next.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 61);\n","/* eslint-disable max-len */\nimport codeToString, * as STATUS_CODES from '../playback/config/status-codes';\n\n// translation configuration for different locales\nconst translations = {\n en: {\n // Countdown plugin\n 'Video will start at': 'Video will start at',\n 'Video will start in': 'Video will start in',\n\n 'ageLimit-0': 'A',\n\n // SponsorOverlay plugin\n 'Ad from': 'Ad from',\n\n // months is special case for translating month to human readable form\n months: [\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'\n ],\n // general troubles, we don't know exactly what had happen\n [codeToString(STATUS_CODES.GENERAL_ERROR)]: 'Sorry. An error occured. Try again later.',\n // stream is available only in certain areas/countries\n [codeToString(STATUS_CODES.NOT_ACTIVE_GEOBLOCKED)]: 'The video failed to play due to geoblock restrictions.',\n // stream is 404 (wrong/deleted from akamai)\n [codeToString(STATUS_CODES.NOT_FOUND)]: 'Sorry. This video is unavailable.',\n // asset is not active\n [codeToString(STATUS_CODES.NOT_ACTIVE)]: 'Sorry. This video is not active.',\n // asset's flight times are in the past\n [codeToString(STATUS_CODES.NOT_ACTIVE_PAST)]: 'Sorry. This video is unavailable.',\n // network error while playing live stream\n [codeToString(STATUS_CODES.NETWORK_ERROR)]: 'Network issues. Please check your internet connection',\n // token can not be retrieved\n [codeToString(STATUS_CODES.TOKEN_FETCH_ERROR)]: 'Sorry. An error occured. Try again later.',\n\n // sharing box heading\n Sharing: 'Share this video',\n 'Live button': 'Live',\n\n // error message\n 'Error code': 'Error code',\n\n // closed captions\n en_GB: 'English',\n es_ES: 'Español',\n nb_NO: 'Bokmål',\n sv_SE: 'Swedish',\n\n 'Audio video switch': 'Audio video switch',\n 'Playing audio only': 'Playing audio only',\n\n ads: {\n // jw ad messages\n admessage: 'The ad will end in xx seconds',\n cuetext: 'Advertisement',\n skipmessage: 'Skip ad in xx',\n skiptext: 'Skip',\n podmessage: 'Ad __AD_POD_CURRENT__ of __AD_POD_LENGTH__'\n },\n\n adblock: {\n admessage: 'The ad will end in [time]s'\n },\n player: {\n listen: 'Listen',\n playback: 'Start playback',\n loginToListen: 'Sign in to listen',\n subscribeToListen: 'Subscribe to listen',\n seconds: 'sec',\n minutes: 'min',\n hours: 'h'\n }\n },\n no: {\n // Countdown plugin\n 'Video will start at': 'Videoen starter',\n 'Video will start in': 'Videoen starter om',\n\n 'ageLimit-0': 'A',\n\n // SponsorOverlay plugin\n 'Ad from': 'Annonse fra',\n\n // months is special case for translating month to human readable form\n months: [\n 'Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'\n ],\n // general troubles, we don't know exactly what had happen\n [codeToString(STATUS_CODES.GENERAL_ERROR)]: 'Beklager, en feil oppstod. Prøv å spill av videoen senere',\n // stream is available only in certain areas/countries\n [codeToString(STATUS_CODES.NOT_ACTIVE_GEOBLOCKED)]: 'Denne videoen er kun tilgjengelig i Norge',\n // stream is 404 (wrong/deleted from akamai)\n [codeToString(STATUS_CODES.NOT_FOUND)]: 'Beklager, videoen er ikke tilgjengelig',\n // asset is not active\n [codeToString(STATUS_CODES.NOT_ACTIVE)]: 'Beklager, videoen er ikke tilgjengelig',\n // asset's flight times are in the past\n [codeToString(STATUS_CODES.NOT_ACTIVE_PAST)]: 'Beklager, vi har ikke rettigheter til å vise videoen lenger',\n // network error while playing live stream\n [codeToString(STATUS_CODES.NETWORK_ERROR)]: 'Kunne ikke spille av video, venligst sjekk internettforbindelsen din',\n // token can not be retrieved\n [codeToString(STATUS_CODES.TOKEN_FETCH_ERROR)]: 'Beklager, en feil oppstod. Prøv å spill av videoen senere',\n\n // jw player error messages\n 'This video cannot be played because of a technical error.': 'Kunne ikke spille av video på grunn av en teknisk feil',\n 'Sorry, the video player failed to load.': 'Kunne ikke spille av video, venligst sjekk
internettforbindelsen din',\n 'This video file cannot be played.': 'Kunne ikke spille av video',\n 'The live stream is either down or has ended.': 'Livesendingen er nede eller er avsluttet',\n 'There was a problem providing access to protected content.': 'Kunne ikke spille av video, venligst sjekk
internettforbindelsen din',\n 'This video cannot be played because of a problem with your internet connection.': 'Kunne ikke spille av video, venligst sjekk
internettforbindelsen din',\n\n // sharing box heading\n Sharing: 'Del denne videoen',\n 'Live button': 'Direkte',\n\n // error message\n 'Error code': 'Feilkode',\n\n // closed captions\n en_GB: 'English',\n es_ES: 'Español',\n nb_NO: 'Bokmål',\n sv_SE: 'Svensk',\n\n ads: {\n admessage: 'Annonsen slutter om xx',\n cuetext: 'Annonse',\n skipmessage: 'Hopp over om xx',\n skiptext: 'Hopp over',\n podmessage: 'Annonse __AD_POD_CURRENT__ av __AD_POD_LENGTH__'\n },\n\n adblock: {\n admessage: 'Annonsen slutter om [time]'\n },\n player: {\n player: 'Videospiller',\n play: 'Spill',\n playback: 'Start avspilling',\n pause: 'Pause',\n volume: 'Volum',\n prev: 'Forrige',\n next: 'Neste',\n cast: 'Chromecast',\n airplay: 'AirPlay',\n fullscreen: 'Fullskjerm',\n playlist: 'Spilleliste',\n hd: 'Kvalitet',\n cc: 'Undertekster',\n audioTracks: 'Lydspor',\n playbackRates: 'Avspillingshastighet',\n replay: 'Spill igjen',\n buffer: 'Laster inn',\n more: 'Mer',\n liveBroadcast: 'Live',\n loadingAd: 'Laster annonse',\n rewind: 'Spol tilbake 10 sekunder',\n nextUp: \"Neste' video\",\n nextUpClose: 'Lukk neste',\n related: 'Relaterte videoer',\n close: 'Lukk',\n settings: ' Innstillinger',\n unmute: 'Slå på lyd',\n copied: 'Kopiert',\n forward: 'Spol fram 30 sekunder',\n loginToListen: 'Logg inn for å lytte',\n subscribeToListen: 'Abonner for å lytte',\n listen: 'Lytt',\n seconds: 'sek',\n minutes: 'min',\n hours: 't'\n }\n },\n\n se: {\n // Countdown plugin\n 'Video will start at': 'Videon är tillgänglig',\n 'Video will start in': 'Videon är tillgänglig om',\n\n 'ageLimit-0': 'A',\n\n // SponsorOverlay plugin\n 'Ad from': 'Annons från',\n\n // months is special case for translating month to human readable form\n months: [\n 'Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'\n ],\n // general troubles, we don't know exactly what had happen\n [codeToString(STATUS_CODES.GENERAL_ERROR)]: 'Något gick fel. Försök igen senare.',\n // stream is available only in certain areas/countries\n [codeToString(STATUS_CODES.NOT_ACTIVE_GEOBLOCKED)]: 'Vi har tyvärr endast rättigheter att spela detta innehåll i Sverige',\n // stream is 404 (wrong/deleted from akamai)\n [codeToString(STATUS_CODES.NOT_FOUND)]: 'Videon är inte tillgänglig',\n // asset is not active\n [codeToString(STATUS_CODES.NOT_ACTIVE)]: 'Videon är inte tillgänglig',\n // asset's flight times are in the past\n [codeToString(STATUS_CODES.NOT_ACTIVE_PAST)]: 'Videon är inte tillgänglig',\n // network error while playing live stream\n [codeToString(STATUS_CODES.NETWORK_ERROR)]: 'Något gick fel. Kolla gärna din internet koppling och försök lite senare',\n // token can not be retrieved\n [codeToString(STATUS_CODES.TOKEN_FETCH_ERROR)]: 'Token kunde inte hämtas',\n\n // jw player error messages\n 'This video cannot be played because of a technical error.': 'Den här videon kan inte spelas på grund av ett tekniskt fel',\n 'Sorry, the video player failed to load.': 'Något gick fel. Försök igen senare',\n 'This video file cannot be played.': 'Det gick inte att spela videon',\n 'The live stream is either down or has ended.': 'Live överföring är antingen nere eller har slutat',\n 'There was a problem providing access to protected content.': 'Något gick fel. Kolla gärna din internet koppling och försök lite senare',\n 'This video cannot be played because of a problem with your internet connection.': 'Något gick fel. Kolla gärna din internet koppling och försök lite senare',\n\n // sharing box heading\n Sharing: 'Dela',\n 'Live button': 'Live',\n\n // error message\n 'Error code': 'Felkod',\n\n // closed captions\n en_GB: 'English',\n es_ES: 'Español',\n nb_NO: 'Bokmål',\n sv_SE: 'Sverige',\n\n ads: {\n admessage: 'Annonsen tar slut om xx sekunder',\n cuetext: 'Annons',\n skipmessage: 'Skippa annons om xx',\n skiptext: 'Skippa',\n podmessage: 'Annons __AD_POD_CURRENT__ av __AD_POD_LENGTH__'\n },\n\n adblock: {\n admessage: 'Annonsen tar slut om [time] sekunder'\n },\n\n player: {\n player: 'Videospelare',\n play: 'Spela',\n playback: 'Spela video',\n pause: 'Pausa',\n volume: 'Volym',\n prev: 'Förra',\n next: 'Nästa',\n cast: 'Chromecast',\n airplay: 'AirPlay',\n fullscreen: 'Fullskärm',\n playlist: 'Spellista',\n hd: 'Kvalitet',\n cc: 'Undertexter',\n audioTracks: 'Ljudspår',\n playbackRates: 'Uppspelningshastighet',\n replay: 'Spela igen',\n buffer: 'Laddar',\n more: 'Mer',\n liveBroadcast: 'Live',\n loadingAd: 'Laddar annons',\n rewind: 'Spola tillbaka 10 sekunder',\n nextUp: 'Nästa',\n nextUpClose: 'Stäng',\n related: 'Fler videos',\n close: 'Stäng',\n settings: 'Inställningar',\n unmute: 'Slå på ljud',\n copied: 'Kopierad',\n forward: 'Spola framåt 30 sekunder',\n loginToListen: 'Logga in för att lyssna',\n subscribeToListen: 'Prenumerera för att lyssna',\n listen: 'Lyssna',\n seconds: 'sek',\n minutes: 'min',\n hours: 't'\n }\n }\n};\n\n/**\n * Get single locale translations hash map\n */\nexport default function (locale) {\n return translations[locale];\n}\n","/* global __BUILD_VERSION__ */\nimport translations from './config/translations';\nimport jwKeys from './config/jw-keys';\n\nconst VERSION = __BUILD_VERSION__;\n\nconst config = {\n version: VERSION,\n player: {\n keys: jwKeys\n },\n /**\n * SVP API configuration\n */\n api: {\n url: '//svp.vg.no/svp/api/v1/',\n tokenUrl: '//svp.vg.no/svp/token/v1/',\n thumbnailsUrl: '//svp.vg.no/svp/thumbnails/v1/',\n relatedApiUrl: 'https://related.stream.schibsted.media',\n vmapUrl: 'https://vmap.stream.schibsted.media',\n\n vendor: null,\n /**\n * API identifier\n */\n identifier: 'svp-player',\n\n /**\n * Get full endpoint url to requested resource\n *\n * @param vendor\n * @param endpoint\n * @returns {string}\n */\n getUrl(vendor, endpoint) {\n const joiner = (endpoint.indexOf('?') > -1) ? '&' : '?';\n let url = `${this.url + vendor + endpoint + joiner}appName=${this.identifier}`;\n\n // enable cachebreaking in preview mode\n if (this.cb === true) {\n url += `&cb=${Math.random() * 10000}`;\n }\n\n return url;\n }\n },\n\n ads: {\n homad: {\n global: 'https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json',\n client: '/homad-config.json'\n },\n\n appnexus: {\n vmap: 'https://ib.adnxs.com/vmap',\n ptv: 'https://ib.adnxs.com/ptv',\n cr: 'https://ib.adnxs.com/cr',\n ast: 'https://acdn.adnxs.com/ast/ast.js',\n debug: false\n }\n },\n\n cdn: {\n svp: `//cdn.stream.schibsted.media/player/${VERSION}`,\n player: '//cdn.stream.schibsted.media/jw/jwplayer-8.21.0',\n pollyfils: '//svp.vgc.no/pollyfils/es6-promise.min.js',\n youbora: 'https://smartplugin.youbora.com/v6/js/adapters/jwplayer/6.5.0/sp.min.js'\n },\n\n time: '//svp.vg.no/svp/api/v1/time',\n\n /**\n * Imbo images server\n */\n images: {\n servers: ['imbo', 'imbo01', 'imbo02', 'imbo03'],\n\n sizes: {\n poster: {\n autoHeight: [\n 380, 480, 580, 680, 780, 800, 980, 1080, 1440, 2048\n ],\n autoWidth: [\n 452, 613, 740, 900, 1080, 1440\n ]\n }\n\n }\n },\n\n /**\n * Default skins for providers\n */\n skins: {\n default: {\n url: `//cdn.stream.schibsted.media/player/${VERSION}/css/player.css`,\n name: 'svp-default jw-skin-seven'\n }\n },\n\n about: {\n vgtv: {\n link: 'http://www.vgtv.no/',\n text: 'VGTV'\n }\n },\n\n sharing: {\n global: {\n sites: ['facebook', 'twitter']\n },\n\n vgtv: {\n link: 'http://www.vgtv.no/#!/MEDIAID',\n // eslint-disable-next-line max-len\n code: ''\n }\n },\n\n domains: {\n blacklist: {\n global: [],\n ab: ['*avpixlat.info', '*exponerat.net']\n },\n\n whitelist: {\n global: [\n '*localhost', '*schibsted.io', '*schibsted.media', '*schibsted.ws', '*schibsted.se', '*smp.no',\n '*plan3dev.se', '*plan3.se',\n '*vg.no', '*vgtv.no', '*vgnett.no',\n '*aftonbladet.se',\n '*aftenposten.no', '*ap.no',\n '*sa.no', '*aftenbladet.no',\n '*vglive.no',\n '*e24.no',\n\n // brandstudio cms\n '*vev.design',\n // stream cluster\n '*pubops.net',\n\n '*adresseavisen.no',\n '*polarismedia.no',\n '*adressa.no',\n '*bt.no',\n '*fvn.no',\n\n '*htmlinstant.com',\n '*ht.no',\n '*rbnett.no',\n '*itromso.no',\n '*folkebladet.no',\n '*framtidinord.no',\n '*osloby.no',\n '*av-avis.no',\n '*medianorge.no',\n '*herokuapp.com',\n '*bergenstidende.no',\n '*bonansa.no',\n '*sysla.no',\n '*bygdanytt.no',\n '*vestnytt.no',\n '*strilen.no',\n '*snd.no', '*fedrelandsvennen.no', '*lister24.no', '*l-a.no', '*lindesnesfyr.no',\n\n // Polaris related newspapers\n // addressa.no\n '*adressa.no', '*avisa-st.no', '*banett.no', '*fosna-folket.no', '*hitra-froya.no', '*innherred.no',\n '*mb.no', '*bladet.no', '*opdalingen.no', '*tronderbladet.no',\n // rbnett\n '*rbnett.no', '*andalsnes-avis.no', '*driva.no',\n // smp newspaper\n '*smp.no', '*dolen.no', '*fjordabladet.no', '*fjt.no', '*fjordingen.no', '*fjuken.no', '*heroynytt.no',\n '*morenytt.no', '*sunnmoringen.no', '*vigga.no', '*vikebladet.no',\n // itromso.no\n '*itromso.no', '*framtidinord.no',\n // ht.no\n '*ht.no', '*vol.no',\n // t-a.no\n '*t-a.no', '*namdalsavisa.no',\n // other polaris newspapers\n '*altaposten.no', '*folkebladet.no',\n '*svd.se',\n // marketplaces\n '*finn.no',\n '*familieklubben.no',\n '*tek.no',\n\n // testing env\n '*mylocal.com'\n ]\n },\n\n preview: {\n global: [\n '*vgnett.no',\n '*svp.schibsted.io',\n '*cms.schibsted.media',\n '*localhost',\n '*pubops.net',\n '*stream.schibsted.media'\n ]\n }\n },\n\n vendors: {\n se: ['ab', 'svd']\n },\n\n translations: translations\n};\n\nexport default config;\n","\nexport default {\n default: 'OjqkBWp9VpYP8utpWdzBZ+eZIJhcfOW5U9g4/w==',\n //\n '100sport': 'Uq5GO7mRz+oxp7pVh3bZEvDEBzEYRTG4h3sr1Q==',\n ab: 'qK+optxkJTV2KblAIiLdoWze6AAGxX5Qxeb57A==',\n adressa: 'BQs7m1EiK0wlK8xAZQgJwU1a4OskbKgoYRSEfA==',\n adressabrandstudio: 'fuz93B3kwPfLDZv+opQh6xasO9nRkraYSbQP0A==',\n altaposten: 'Y0grkUQ6BaCat409fP7mPqr1SbDS+LntWrQIpg==',\n ap: 'ElscszbjUK+A0En7My3UPpJ/4MlOUOn+fiU2/w==',\n bt: 'wgmdmAfgbneZjUBt8ZxqiKTxVCpriTwcC06hzQ==',\n brandstudio: 'uXOJWRxZaxOSRhIisAGWsEbzn3PIhbTlCn99IQ==',\n folkebladet: 'kGoJc75y4Uq1r2kw2n883oYzGk+SrEJ2GEDQUQ==',\n fvn: '88vcnFV8g4crXq1P8jrGz8D7XqMwawGvwFmhJg==',\n harstad: 'C8hK/HIbIL3k9h4dN4xY3lHAPdjLyx7B4WGM/w==',\n itromso: 'QAPvDWM3mHi3lYOZCLqOwHZMstixgFefhc/d1Q==',\n podcast: 'X2K7i+dwWXsIR0BKyX+3C+8s4y9VOWcYgtjeJA==',\n rbnett: 'y7Z4M5Ah6dOyDH7/ZrCQjHZPb3E3xnctwkixbw==',\n riks: 'a5kTQmkeGHV+P2wOaTQvAuXEdivj2lbXoAxTbw==',\n ridenews: '6s5IkHj1LiODLxDOaYr1ze6F7F1Cun92UFuOpA==',\n sa: 'dWpue+L8nJKbDFqh9Ps3o2mxqr92MY2G9tQohg==',\n schibsted: 'Cn+pnRPeR7dlwUgy+QwoSwyu0NXoGUtxD/LVqA==',\n smp: 'eZ34FUhLc6cW3MypHSgtbYwRgbDxKLV/iaABmQ==',\n svd: 'Olwljnb5W0VdUf38yWyv3kjowR9JamQYw4RndA==',\n tronderavisa: '7azVhGsMlCm9EuRPr4EJ8RY6cyVbmAgeS1MkKw==',\n vgtv: 'edF0bFyKcM68omCq24JsMWw/CO/f6cAgS91oiQ==',\n vgtvs: 'D/kRElM9UDSgZxbEqPBESxIKamNBql5PeIabpg=='\n};\n","import config from '../config';\n\nconfig.env = 'production';\nexport default config;\n","export const ACTIVE = 12000;\nexport const ACTIVE_PREVIEW = 12001;\n\nexport const NOT_ACTIVE = 14001;\nexport const NOT_ACTIVE_GEOBLOCKED = 14002;\nexport const NOT_FOUND = 14003;\nexport const NOT_ACTIVE_PAST = 14004;\n\nexport const GENERAL_ERROR = 15000;\nexport const NETWORK_ERROR = 15101;\nexport const TOKEN_FETCH_ERROR = 15102;\n\nconst statusMessages = {\n [ACTIVE]: 'Stream active',\n [ACTIVE_PREVIEW]: 'Preview mode',\n [NOT_ACTIVE]: 'Stream is not active',\n [NOT_ACTIVE_GEOBLOCKED]: 'Stream failed to play due to geoblock restrictions',\n [NOT_FOUND]: 'Stream not found',\n [NOT_ACTIVE_PAST]: 'Stream has been unpublished',\n [GENERAL_ERROR]: 'General error',\n [NETWORK_ERROR]: 'Network error',\n [TOKEN_FETCH_ERROR]: 'Token fetch error'\n};\n\n/**\n * Get localized messages\n */\nexport default (errorCode) => statusMessages[errorCode] || statusMessages[GENERAL_ERROR];\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","function loadScript(path, onSuccess, onError) {\n var script = document.createElement(\"script\"),\n done = false;\n\n const callback = onSuccess || function () {};\n\n script.type = \"text/javascript\";\n script.src = path;\n script.async = true;\n script.onreadystatechange = script.onload = function() {\n if ( !done && (!this.readyState ||\n this.readyState === \"loaded\" || this.readyState === \"complete\") ) {\n done = true;\n callback();\n\n // Handle memory leak in IE\n script.onload = script.onreadystatechange = null;\n }\n };\n\n script.onerror = onError;\n\n document.body.appendChild(script);\n}\n\nexport default (path) => {\n return new Promise((resolve, reject) => loadScript(path, resolve, reject));\n}","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","import scriptLoader from './script-loader';\n\nconst loadModule = (moduleSrc) => {\n const root = window;\n\n if (root.define && root.define.amd) {\n return new Promise((resolve) => {\n root.require([moduleSrc], resolve);\n });\n }\n\n return scriptLoader(moduleSrc);\n};\n\nexport default loadModule;\n","module.exports = \"\"","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","module.exports = \"\"","/* jshint ignore:start */\n/* eslint-disable */\n\nvar isLoaded = false;\nvar exportz = {};\n\nexport default function (conf) {\n if (!isLoaded) {\n isLoaded = true;\n\n (function(k) {\n k = k || {}; (function(l) {\n function b() { this.u = 'setup'; }l.g = b; b.prototype = {\n c: function(a) { a = a && typeof a === 'number' && a > 0 ? Math.round(a) : 10; for (var g = '', e = 0; e < a; e++)g += String.fromCharCode((Math.random() < 0.5 ? 65 : 97) + Math.floor(26 * Math.random())); return g; },\n A: function(a) {\n function g(d) {\n var a = '';\n var c;\n var g;\n for (c = 7; c >= 0; c--)g = d >>> 4 * c & 15, a += g.toString(16);return a;\n }function e(d, a) { return d << a | d >>> 32 - a; }\n var c;\n var h;\n var b = Array(80);\n var l = 1732584193;\n var q = 4023233417;\n var p = 2562383102;\n var k = 271733878;\n var t = 3285377520;\n var f;\n var m;\n var n;\n var r;\n var d;\n a = a && typeof a === 'string'\n ? a : '';f = a.length;var u = [];for (c = 0; c < f - 3; c += 4)h = a.charCodeAt(c) << 24 | a.charCodeAt(c + 1) << 16 | a.charCodeAt(c + 2) << 8 | a.charCodeAt(c + 3), u.push(h);switch (f % 4) { case 0: c = 2147483648; break; case 1: c = a.charCodeAt(f - 1) << 24 | 8388608; break; case 2: c = a.charCodeAt(f - 2) << 24 | a.charCodeAt(f - 1) << 16 | 32768; break; case 3: c = a.charCodeAt(f - 3) << 24 | a.charCodeAt(f - 2) << 16 | a.charCodeAt(f - 1) << 8 | 128; }for (u.push(c); u.length % 16 != 14;)u.push(0);u.push(f >>> 29);u.push(f << 3 & 4294967295);for (a = 0; a < u.length; a += 16) {\n for (c = 0; c < 16; c++)b[c] = u[a + c]; for (c = 16; c <= 79; c++)b[c] = e(b[c - 3] ^ b[c - 8] ^ b[c - 14] ^ b[c - 16], 1); h = l; f = q; m = p; n = k; r = t; for (c = 0; c <= 19; c++)d = e(h, 5) + (f & m | ~f & n) + r + b[c] + 1518500249 & 4294967295, r = n, n = m, m = e(f, 30), f = h, h = d; for (c = 20; c <= 39; c++)d = e(h, 5) + (f ^ m ^ n) + r + b[c] + 1859775393 & 4294967295, r = n, n = m, m = e(f, 30), f = h, h = d; for (c = 40; c <= 59; c++)d = e(h, 5) + (f & m | f & n | m & n) + r + b[c] + 2400959708 & 4294967295, r = n, n = m, m = e(f, 30), f = h, h = d; for (c = 60; c <= 79; c++)d = e(h, 5) + (f ^ m ^ n) + r + b[c] + 3395469782 & 4294967295, r = n, n = m, m = e(f, 30), f = h, h = d; l = l + h & 4294967295; q = q + f & 4294967295; p = p + m & 4294967295; k = k + n\n & 4294967295; t = t + r & 4294967295;\n }return (g(l) + g(q) + g(p) + g(k) + g(t)).toLowerCase();\n },\n j: function(a) {\n for (var g = '', e, c, b, l, k, q, p = 0; p < a.length;) {\n e = a.charCodeAt(p++), c = a.charCodeAt(p++), b = a.charCodeAt(p++), l = e >> 2, e = (e & 3) << 4 | c >> 4, k = (c & 15) << 2 | b >> 6, q = b & 63, isNaN(c) ? k = q = 64 : isNaN(b) && (q = 64), g = g + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.charAt(l) + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.charAt(e) + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.charAt(k)\n + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.charAt(q);\n } return g;\n },\n fireEvent: function(a, g, b) {\n var c = this.u;\n var h = document.createEvent('CustomEvent');\n b.state = c;h.initCustomEvent(g, !1, !1, b);a.dispatchEvent(h);\n },\n l: function(a, g, b) { g || (g = 'hdEvent'); b || (b = window); this.fireEvent(b, g, a); },\n track: function(a, b, e) {\n if (e) {\n if (!homad || !homad.M)window.setTimeout(function() { this.track(a, b, e); }.bind(this), 500); else if (homad.isEnabled) {\n var c = `${homad.T()}?homad_track_key=${encodeURIComponent(a)}&homad_track_value=${\n encodeURIComponent(b)}`; homad.o(c, !0); c = homad.o(c, !0); c.data.homad_url_prefix_alias = ''; c.data.homad_track_key = encodeURIComponent(a); c.data.homad_track_value = encodeURIComponent(b); homad.P(c, function() {});\n }\n }\n }\n };\n }(k)); var v = k.g || v; new v(); var w = new v(); (function(l) {\n function b(a) { this.data = a || {}; }l.f = b; b.S = function(a, b) {\n var e = {};\n var c;\n for (c in b)e[c] = b[c];for (c in a)e[c] = a[c];return e;\n }; b.w = { code: '1000', type: 'penalty', message: '' }; b.V = { code: '1001', type: 'mediaerror', message: '' }; b.C = { code: '1002', type: 'vpaid', message: '' };\n b.O = { code: '1003', type: 'emptyVast', message: '' }; b.F = { code: '1004', type: 'malformattedXML' }; b.J = { code: '1005', type: 'adStart' }; b.G = { code: '1006', type: 'adFirstQuartile' }; b.I = { code: '1007', type: 'adMidPoint' }; b.K = { code: '1008', type: 'adThirdQuartile' }; b.i = { code: '1009', type: 'adComplete' }; b.H = { code: '1010', type: 'adImpressionsCalled' }; b.B = { code: '1011', type: 'vastLoadingFailed' }; b.U = { code: '1012', type: 'noCreative' }; b.R = { code: '1013', type: 'emptyVastFromHomadServerEvent', message: '' }; b.D = {\n code: '1014',\n type: 'wrapperLimitReached',\n message: ''\n }; b.L = { code: '1015', type: 'clickthrough', message: '' }; b.N = { code: '1016', type: 'continueContent', message: '' }; b.X = { code: '1017', type: 'variableDeletedEvent', message: '' }; b.W = { code: '1018', type: 'noVariableSettingEvent', message: '' }; b.prototype = {};\n }(k)); var z = k.f || z; (function(l) {\n function b() {}l.h = b; b.prototype = {\n s: function(a) {\n var b = 0;\n var e;\n var c;\n var h;\n if (a.length == 0) return b;e = 0;for (h = a.length; e < h; e++)c = a.charCodeAt(e), b = (b << 5) - b + c, b |= 0;return Math.abs(b);\n },\n m: function() {\n return Math.round(Date.now() / 1E3 / 3600 / 24) + navigator.appCodeName\n + navigator.appName + navigator.appVersion + navigator.userAgent + navigator.platform + (navigator.language || navigator.i || 'x');\n },\n a: function(a) { a = parseInt(a); if (a >= 65 && a <= 90 || a >= 97 && a <= 122) return String.fromCharCode(a); if (a <= 0) return ''; if (a < 65) return this.a(a + 65); if (a > 90) return this.a(Math.round(a / 2)); },\n reverse: function(a) { for (var b = '', e = a.length - 1, b = ''; e >= 0; b += a[e--]);return b; },\n b: function() {\n for (var a = this.s(`${this.m()}`), a = (`${a}${this.reverse(`${a}`)}`).match(/.{1,2}/g), b = '', e = 0; e < a.length; e++)b += this.a(a[e]); b.length == 0\n && (b = 'zork'); return b;\n },\n v: function() { return `${this.b()}2`; }\n };\n }(k)); var y = k.h || y; (function() {\n function l() {\n if (p)conf.startPlayer && eval(conf.startPlayer), document.fp_error = !0, document.hd_ready = !0; else {\n var d = document.createElement('script');d.type = 'text/javascript';d.src = `https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=${w.c(10)}`;d.onerror = e;document.head.firstChild ? document.head.insertBefore(d, document.head.firstChild) : document.head.appendChild(d);\n var d = new y();\n var a = document.createEvent('CustomEvent');\n conf.version = '20170704_0930_802';a.initCustomEvent(d.b(), !1, !1, conf);window.setInterval(function() { window.dispatchEvent(a); }, 500);b();\n }\n }function b() { var d = new y(); r = window.setTimeout(function() { a(); }, 15E3); window.addEventListener(d.v(), function() { window.clearTimeout(r); }); }function a() {\n for (var d = document.getElementsByTagName('video'), a = 0; a < d.length; a++) { try { d[a] && d[a].pause && typeof d[a].pause === 'function' && d[a].pause(); } catch (b) {}d[a].parentNode.removeChild(d[a]); }d = document.getElementsByTagName('object'); for (a = 0; a < d.length; a++)d[a].parentNode.removeChild(d[a]);\n d = document.getElementsByClassName('video-wrapper'); for (a = 0; a < d.length; a++)d[a] && d[a].parentNode && d[a].parentNode.removeChild(d[a]); d = document.getElementsByClassName('videoplayer'); for (a = 0; a < d.length; a++)d[a] && d[a].parentNode && d[a].parentNode.removeChild(d[a]); if (window.self != window.top) for (d = window.document; d.hasChildNodes();)d.removeChild(d.lastChild);\n }function g() {\n if (t) {\n var d = `fail-init-100.gif${v()}`; k(t, function() {}, function() {}, {\n homad_url_prefix_alias: f,\n homad_url_suffix_base64: w.j(d),\n homad_url_suffix: d,\n homad_hash_guessed: 'true'\n });\n }w.l(z.w); x && typeof x === 'function' ? x() : (a(), window.setInterval(a, 500), window.setTimeout(a, 1500));\n }function e() { var a = document.createElement('script'); a.type = 'text/javascript'; a.src = `https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/hd-main.js?cache=${w.c(10)}`; a.onerror = g; document.head.firstChild ? document.head.insertBefore(a, document.head.firstChild) : document.head.appendChild(a); }function c(a) { p || (p = !q(a.enabled)); l(); }function h(a) {\n a && a.server && a.server[0]\n && (t = (`${a.server[1]}`).replace('[hash]', w.A(`${(new Date()).getTime()}`)), f = 'homadvastimpressions'); p ? l() : (p = !q(a.enabled)) ? l() : k(a.config, c, l);\n }function k(a, b, c, e) {\n var f = new XMLHttpRequest(); f.onreadystatechange = function() { if (b && f.readyState == 4 && f.status == 200) { var a = {}; try { a = JSON.parse(f.responseText); } catch (d) { a.enabled = 'false'; }b(a); }c && f.readyState == 4 && f.status != 200 && c(f); }; try {\n if (e) {\n f.open('POST', a, !0); a = e; e = ''; for (var g in a)e += `&${g}=${encodeURIComponent(a[g])}`; e = e.substr(1); f.setRequestHeader('Content-type',\n 'application/x-www-form-urlencoded'); f.send(e);\n } else f.open('GET', a, !0), f.send();\n } catch (h) { c && c(f); }\n }function v() { var a = '?c=unknown'; window && window.location && window.location.hostname && (a = `?c=${window.location.hostname}`); return a; }function q(a) { return a == 'True' || a == 'true' || a == 1 || a == '1' || a == 1; }\n var p = !1;\n var x = conf.onFailure;\n var t = '';\n var f = '';\n var m = !1;\n var n = 0;\n var r = !1;\n k(conf.globalConfig, function(a) { p ? l() : p = !q(a.enabled); });typeof conf.clientConfig === 'string' ? k(conf.clientConfig, h, function() {\n window.setTimeout(function() {\n k(conf.clientConfig,\n h, function() { window.setTimeout(g, 1500); });\n }, 500);\n }) : m = window.setInterval(function() { var a = ''; try { a = conf.clientConfig(), n++, a ? (h(a), window.clearInterval(m)) : n >= 50 && (window.clearInterval(m), g()); } catch (b) {} }, 100);\n }());\n }).call(exportz, exportz);\n }\n}\n","module.exports = \"
\\n
\\\">
\\n\\n
\\n \\n \\n \\n
\\n\\n \\n
\"","module.exports = \"
\\n
\\n
\\n \\n \\n
\\n
\\n \\n
\\n
\\n
\\n\"","module.exports = \"\\n\"","module.exports = \"\\n <%= closeIcon %>\\n\\n\\n <%= next.getTitle() %>\\n ');\\\">\\n s\\\">\\n Next <%= nextIcon %>\\n );\\\">\\n \\n\\n\"","module.exports = \"\\n\"","var basePick = require('./_basePick'),\n flatRest = require('./_flatRest');\n\n/**\n * Creates an object composed of the picked `object` properties.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pick(object, ['a', 'c']);\n * // => { 'a': 1, 'c': 3 }\n */\nvar pick = flatRest(function(object, paths) {\n return object == null ? {} : basePick(object, paths);\n});\n\nmodule.exports = pick;\n","var baseKeys = require('./_baseKeys'),\n getTag = require('./_getTag'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isArrayLike = require('./isArrayLike'),\n isBuffer = require('./isBuffer'),\n isPrototype = require('./_isPrototype'),\n isTypedArray = require('./isTypedArray');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n setTag = '[object Set]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\nfunction isEmpty(value) {\n if (value == null) {\n return true;\n }\n if (isArrayLike(value) &&\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n return !value.length;\n }\n var tag = getTag(value);\n if (tag == mapTag || tag == setTag) {\n return !value.size;\n }\n if (isPrototype(value)) {\n return !baseKeys(value).length;\n }\n for (var key in value) {\n if (hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n return true;\n}\n\nmodule.exports = isEmpty;\n","import config from 'player/config';\nimport moduleLoader from 'utils/module-loader';\n\n// eslint-disable-next-line\nconst loadSvpLibrary = () => {\n return import(/* webpackMode: \"eager\" */ './index').then((SVP) => [\n SVP.default,\n SVP.preInitialize,\n SVP.postInitialize\n ]);\n};\n\nconst loadJwPlayer = (root) => {\n const PLAYER_LIB = `${config.cdn.player}/jwplayer.js`;\n\n return moduleLoader(PLAYER_LIB).then((jwplayer = root.jwplayer) => {\n root.jwplayer = jwplayer;\n });\n};\n\n(async function (root) {\n const onReady = root.onSvpPlayerReady;\n\n // onSvpPlayerReady is required callback to handle due to SDK async loading\n loadJwPlayer(root)\n .then(loadSvpLibrary)\n .then((library) => {\n const [SVP, preInitialize, postInitialize] = library;\n\n if ((root && !root.SVP) || (root.SVP && root.SVP.isLoaded !== true)) {\n root.SVP = SVP;\n root.SVP.isLoaded = true;\n\n preInitialize();\n\n if (window.dispatchEvent) {\n const event = document.createEvent('Event');\n event.initEvent('onSvpPlayerReady', false, true);\n window.dispatchEvent(event);\n }\n\n if (onReady) {\n onReady();\n }\n\n postInitialize();\n }\n });\n}(window));\n","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","var basePickBy = require('./_basePickBy'),\n hasIn = require('./hasIn');\n\n/**\n * The base implementation of `_.pick` without support for individual\n * property identifiers.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @returns {Object} Returns the new object.\n */\nfunction basePick(object, paths) {\n return basePickBy(object, paths, function(value, path) {\n return hasIn(object, path);\n });\n}\n\nmodule.exports = basePick;\n","var baseGet = require('./_baseGet'),\n baseSet = require('./_baseSet'),\n castPath = require('./_castPath');\n\n/**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\nfunction basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n}\n\nmodule.exports = basePickBy;\n","var assignValue = require('./_assignValue'),\n castPath = require('./_castPath'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n}\n\nmodule.exports = baseSet;\n","var baseAssignValue = require('./_baseAssignValue'),\n eq = require('./eq');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nmodule.exports = assignValue;\n","var defineProperty = require('./_defineProperty');\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nmodule.exports = baseAssignValue;\n","var baseHasIn = require('./_baseHasIn'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","var castPath = require('./_castPath'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isIndex = require('./_isIndex'),\n isLength = require('./isLength'),\n toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","var flatten = require('./flatten'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\nfunction flatRest(func) {\n return setToString(overRest(func, undefined, flatten), func + '');\n}\n\nmodule.exports = flatRest;\n","var baseFlatten = require('./_baseFlatten');\n\n/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\nfunction flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n}\n\nmodule.exports = flatten;\n","var arrayPush = require('./_arrayPush'),\n isFlattenable = require('./_isFlattenable');\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseFlatten;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n","var Symbol = require('./_Symbol'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray');\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n","var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nmodule.exports = overRest;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n","var baseSetToString = require('./_baseSetToString'),\n shortOut = require('./_shortOut');\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n","var constant = require('./constant'),\n defineProperty = require('./_defineProperty'),\n identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nmodule.exports = shortOut;\n","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n","var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nmodule.exports = getTag;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var root = require('./_root'),\n stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","/* jshint ignore:start */\n\n var idCounter = 0;\n\n // we do not include underscore as it is our hard dependency\n var _ = jwplayer._,\n property = function (key) {\n return function (obj) {\n return obj == null ? void 0 : obj[key];\n };\n },\n MAX_ARRAY_INDEX = Math.pow(2, 53) - 1,\n getLength = property('length'),\n isArrayLike = function (collection) {\n var length = getLength(collection);\n return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;\n };\n\n _.isEmpty = function (obj) {\n if (obj == null) return true;\n if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;\n return _.keys(obj).length === 0;\n };\n\n _.uniqueId = function(prefix) {\n var id = ++idCounter + '';\n return prefix ? prefix + id : id;\n };\n\n export default _;\n\n/* jshint ignore:end */\n","/* jshint ignore:start */\nimport _ from './underscore';\n\n // Backbone.Events\n // ---------------\n\n // A module that can be mixed in to *any object* in order to provide it with\n // a custom event channel. You may bind a callback to an event with `on` or\n // remove with `off`; `trigger`-ing an event fires all callbacks in\n // succession.\n //\n // var object = {};\n // _.extend(object, Backbone.Events);\n // object.on('expand', function(){ alert('expanded'); });\n // object.trigger('expand');\n //\n var Events = {};\n\n // Regular expression used to split event strings.\n var eventSplitter = /\\s+/;\n\n // Iterates over the standard `event, callback` (as well as the fancy multiple\n // space-separated events `\"change blur\", callback` and jQuery-style event\n // maps `{event: callback}`).\n var eventsApi = function(iteratee, events, name, callback, opts) {\n var i = 0, names;\n if (name && typeof name === 'object') {\n // Handle event maps.\n if (callback !== void 0 && 'context' in opts && opts.context === void 0) opts.context = callback;\n for (names = _.keys(name); i < names.length ; i++) {\n events = eventsApi(iteratee, events, names[i], name[names[i]], opts);\n }\n } else if (name && eventSplitter.test(name)) {\n // Handle space separated event names by delegating them individually.\n for (names = name.split(eventSplitter); i < names.length; i++) {\n events = iteratee(events, names[i], callback, opts);\n }\n } else {\n // Finally, standard events.\n events = iteratee(events, name, callback, opts);\n }\n return events;\n };\n\n // Bind an event to a `callback` function. Passing `\"all\"` will bind\n // the callback to all events fired.\n Events.on = function(name, callback, context) {\n return internalOn(this, name, callback, context);\n };\n\n // Guard the `listening` argument from the public API.\n var internalOn = function(obj, name, callback, context, listening) {\n obj._events = eventsApi(onApi, obj._events || {}, name, callback, {\n context: context,\n ctx: obj,\n listening: listening\n });\n\n if (listening) {\n var listeners = obj._listeners || (obj._listeners = {});\n listeners[listening.id] = listening;\n }\n\n return obj;\n };\n\n // Inversion-of-control versions of `on`. Tell *this* object to listen to\n // an event in another object... keeping track of what it's listening to\n // for easier unbinding later.\n Events.listenTo = function(obj, name, callback) {\n if (!obj) return this;\n var id = obj._listenId || (obj._listenId = _.uniqueId('l'));\n var listeningTo = this._listeningTo || (this._listeningTo = {});\n var listening = listeningTo[id];\n\n // This object is not listening to any other events on `obj` yet.\n // Setup the necessary references to track the listening callbacks.\n if (!listening) {\n var thisId = this._listenId || (this._listenId = _.uniqueId('l'));\n listening = listeningTo[id] = {obj: obj, objId: id, id: thisId, listeningTo: listeningTo, count: 0};\n }\n\n // Bind callbacks on obj, and keep track of them on listening.\n internalOn(obj, name, callback, this, listening);\n return this;\n };\n\n // The reducing API that adds a callback to the `events` object.\n var onApi = function(events, name, callback, options) {\n if (callback) {\n var handlers = events[name] || (events[name] = []);\n var context = options.context, ctx = options.ctx, listening = options.listening;\n if (listening) listening.count++;\n\n handlers.push({ callback: callback, context: context, ctx: context || ctx, listening: listening });\n }\n return events;\n };\n\n // Remove one or many callbacks. If `context` is null, removes all\n // callbacks with that function. If `callback` is null, removes all\n // callbacks for the event. If `name` is null, removes all bound\n // callbacks for all events.\n Events.off = function(name, callback, context) {\n if (!this._events) return this;\n this._events = eventsApi(offApi, this._events, name, callback, {\n context: context,\n listeners: this._listeners\n });\n return this;\n };\n\n // Tell this object to stop listening to either specific events ... or\n // to every object it's currently listening to.\n Events.stopListening = function(obj, name, callback) {\n var listeningTo = this._listeningTo;\n if (!listeningTo) return this;\n\n var ids = obj ? [obj._listenId] : _.keys(listeningTo);\n\n for (var i = 0; i < ids.length; i++) {\n var listening = listeningTo[ids[i]];\n\n // If listening doesn't exist, this object is not currently\n // listening to obj. Break out early.\n if (!listening) break;\n\n listening.obj.off(name, callback, this);\n }\n if (_.isEmpty(listeningTo)) this._listeningTo = void 0;\n\n return this;\n };\n\n // The reducing API that removes a callback from the `events` object.\n var offApi = function(events, name, callback, options) {\n if (!events) return;\n\n var i = 0, listening;\n var context = options.context, listeners = options.listeners;\n\n // Delete all events listeners and \"drop\" events.\n if (!name && !callback && !context) {\n var ids = _.keys(listeners);\n for (; i < ids.length; i++) {\n listening = listeners[ids[i]];\n delete listeners[listening.id];\n delete listening.listeningTo[listening.objId];\n }\n return;\n }\n\n var names = name ? [name] : _.keys(events);\n for (; i < names.length; i++) {\n name = names[i];\n var handlers = events[name];\n\n // Bail out if there are no events stored.\n if (!handlers) break;\n\n // Replace events if there are any remaining. Otherwise, clean up.\n var remaining = [];\n for (var j = 0; j < handlers.length; j++) {\n var handler = handlers[j];\n if (\n callback && callback !== handler.callback &&\n callback !== handler.callback._callback ||\n context && context !== handler.context\n ) {\n remaining.push(handler);\n } else {\n listening = handler.listening;\n if (listening && --listening.count === 0) {\n delete listeners[listening.id];\n delete listening.listeningTo[listening.objId];\n }\n }\n }\n\n // Update tail event if the list has any events. Otherwise, clean up.\n if (remaining.length) {\n events[name] = remaining;\n } else {\n delete events[name];\n }\n }\n if (_.size(events)) return events;\n };\n\n // Bind an event to only be triggered a single time. After the first time\n // the callback is invoked, its listener will be removed. If multiple events\n // are passed in using the space-separated syntax, the handler will fire\n // once for each event, not once for a combination of all events.\n Events.once = function(name, callback, context) {\n // Map the event into a `{event: once}` object.\n var events = eventsApi(onceMap, {}, name, callback, _.bind(this.off, this));\n return this.on(events, void 0, context);\n };\n\n // Inversion-of-control versions of `once`.\n Events.listenToOnce = function(obj, name, callback) {\n // Map the event into a `{event: once}` object.\n var events = eventsApi(onceMap, {}, name, callback, _.bind(this.stopListening, this, obj));\n return this.listenTo(obj, events);\n };\n\n // Reduces the event callbacks into a map of `{event: onceWrapper}`.\n // `offer` unbinds the `onceWrapper` after it has been called.\n var onceMap = function(map, name, callback, offer) {\n if (callback) {\n var once = map[name] = _.once(function() {\n offer(name, once);\n callback.apply(this, arguments);\n });\n once._callback = callback;\n }\n return map;\n };\n\n // Trigger one or many events, firing all bound callbacks. Callbacks are\n // passed the same arguments as `trigger` is, apart from the event name\n // (unless you're listening on `\"all\"`, which will cause your callback to\n // receive the true name of the event as the first argument).\n Events.trigger = function(name) {\n if (!this._events) return this;\n\n var length = Math.max(0, arguments.length - 1);\n var args = Array(length);\n for (var i = 0; i < length; i++) args[i] = arguments[i + 1];\n\n eventsApi(triggerApi, this._events, name, void 0, args);\n return this;\n };\n\n // Handles triggering the appropriate event callbacks.\n var triggerApi = function(objEvents, name, cb, args) {\n if (objEvents) {\n var events = objEvents[name];\n var allEvents = objEvents.all;\n if (events && allEvents) allEvents = allEvents.slice();\n if (events) triggerEvents(events, args);\n if (allEvents) triggerEvents(allEvents, [name].concat(args));\n }\n return objEvents;\n };\n\n // A difficult-to-believe, but optimized internal dispatch function for\n // triggering events. Tries to keep the usual cases speedy (most internal\n // Backbone events have 3 arguments).\n var triggerEvents = function(events, args) {\n var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];\n switch (args.length) {\n case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return;\n case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return;\n case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return;\n case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return;\n default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); return;\n }\n };\n\n // Aliases for backwards compatibility.\n Events.bind = Events.on;\n Events.unbind = Events.off;\n\n export default Events;\n\n","\nvar { userAgent } = navigator;\n\nfunction userAgentMatch(regex) {\n return userAgent.match(regex) !== null;\n}\n\nfunction lazyUserAgentMatch(regex) {\n return function () {\n return userAgentMatch(regex);\n };\n}\n\nvar isIETrident = lazyUserAgentMatch(/trident\\/.+rv:\\s*11/i);\nvar isIPad = lazyUserAgentMatch(/iPad/i);\nvar isIPhone = lazyUserAgentMatch(/iPhone/i);\n// Check for Facebook App Version to see if it's Facebook\n\nfunction isEdge() {\n return userAgentMatch(/\\sEdge\\/\\d+/i);\n}\n\nfunction isMSIE() {\n return userAgentMatch(/msie/i);\n}\n\nfunction isIE() {\n return isEdge() || isIETrident() || isMSIE();\n}\n\nfunction isSafari() {\n return userAgentMatch(/safari/i) && !userAgentMatch(/(?:Chrome|CriOS|chromium|android)/i);\n}\n\n/** Matches iOS devices * */\nfunction isIOS(version) {\n var isAppleIOS = userAgentMatch(/iP(hone|ad|od)/i),\n result = null;\n\n // check if version matches\n if (isAppleIOS && version) {\n result = /OS ([._\\d]+)/.exec(userAgent);\n\n // get version and parse it\n if (result && parseInt(result[1], 10) === version) {\n return true;\n }\n // didn't match version\n return false;\n }\n\n return isAppleIOS;\n}\n\nfunction isAndroid() {\n return userAgentMatch(/Android/i);\n}\n\nexport default {\n isIOS: isIOS,\n isIPhone: isIPhone,\n isIPad: isIPad,\n isSafari: isSafari,\n isAndroid: isAndroid,\n isEdge: isEdge,\n isIE: isIE,\n\n isDesktop: function () {\n return !this.isMobile() && !this.isTablet();\n },\n\n isSamsungInternet: function () {\n return userAgent.indexOf('SamsungBrowser') !== -1;\n },\n\n isTablet: function () {\n var isTablet = isIPad() || false;\n\n // android tables are when\n if (this.isAndroid() && (userAgent.indexOf('Mobile') === -1)) {\n isTablet = true;\n }\n\n return isTablet;\n },\n\n isMobile: function () {\n return userAgent.match(/(iPhone|iPod|Android(?=.*Mobile).*|HTC|Fennec|IEMobile|BlackBerry|SymbianOS(?=.*AppleWebKit).*|Opera Mobi|Symbian|SonyEricsson|Nokia|SAMSUNG|LG)/i) !== null;\n },\n\n isHermesApp: function () {\n return userAgentMatch(/hermes/i);\n },\n\n getChromeVersion: function () {\n var raw = userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./);\n\n return raw ? parseInt(raw[2], 10) : false;\n },\n\n getPixelRatio: function () {\n var devicePixelRatio = window.devicePixelRatio || 1;\n\n if (devicePixelRatio > 1) {\n devicePixelRatio = 2;\n }\n\n return devicePixelRatio;\n },\n /**\n * Tracking is divided by device type\n *\n * @returns {*}\n */\n getDeviceType: function () {\n if (this.isTablet()) {\n return 'tablet';\n }\n\n if (this.isMobile()) {\n return 'phone';\n }\n\n return 'desktop';\n },\n\n canAutoplay: function () {\n var canAutoplay = 'always';\n\n // default is muted for never ios systems\n if (this.isIOS()) {\n canAutoplay = 'muted';\n }\n\n // iOS 8 and 9 can not autoplay any kind of stream\n // also Android Devices are lacking this\n if (this.isIOS(9) || this.isIOS(8) || (this.isAndroid())) {\n canAutoplay = 'never';\n }\n\n // chrome android can autoplay muted\n if (this.isAndroid() && !this.isSamsungInternet() && this.getChromeVersion() >= 53) {\n canAutoplay = 'muted';\n }\n\n return canAutoplay;\n }\n};\n","/* jshint ignore:start */\n\n function isMergeableObject(val) {\n var nonNullObject = val && typeof val === 'object'\n\n return nonNullObject\n && Object.prototype.toString.call(val) !== '[object RegExp]'\n && Object.prototype.toString.call(val) !== '[object Date]'\n }\n\n function emptyTarget(val) {\n return Array.isArray(val) ? [] : {}\n }\n\n function cloneIfNecessary(value, optionsArgument) {\n var clone = optionsArgument && optionsArgument.clone === true\n return (clone && isMergeableObject(value)) ? deepmerge(emptyTarget(value), value, optionsArgument) : value\n }\n\n function defaultArrayMerge(target, source, optionsArgument) {\n var destination = target.slice()\n source.forEach(function(e, i) {\n if (typeof destination[i] === 'undefined') {\n destination[i] = cloneIfNecessary(e, optionsArgument)\n } else if (isMergeableObject(e)) {\n destination[i] = deepmerge(target[i], e, optionsArgument)\n } else if (target.indexOf(e) === -1) {\n destination.push(cloneIfNecessary(e, optionsArgument))\n }\n })\n return destination\n }\n\n function mergeObject(target, source, optionsArgument) {\n var destination = {}\n if (isMergeableObject(target)) {\n Object.keys(target).forEach(function (key) {\n destination[key] = cloneIfNecessary(target[key], optionsArgument)\n })\n }\n Object.keys(source).forEach(function (key) {\n if (!isMergeableObject(source[key]) || !target[key]) {\n destination[key] = cloneIfNecessary(source[key], optionsArgument)\n } else {\n destination[key] = deepmerge(target[key], source[key], optionsArgument)\n }\n })\n return destination\n }\n\n function deepmerge(target, source, optionsArgument) {\n var array = Array.isArray(source);\n var options = optionsArgument || { arrayMerge: defaultArrayMerge }\n var arrayMerge = options.arrayMerge || defaultArrayMerge\n\n if (array) {\n return Array.isArray(target) ? arrayMerge(target, source, optionsArgument) : cloneIfNecessary(source, optionsArgument)\n } else {\n return mergeObject(target, source, optionsArgument)\n }\n }\n\n deepmerge.all = function deepmergeAll(array, optionsArgument) {\n if (!Array.isArray(array) || array.length < 2) {\n throw new Error('first argument should be an array with at least two elements')\n }\n\n // we are sure there are at least 2 values, so it is safe to have no initial value\n return array.reduce(function(prev, next) {\n return deepmerge(prev, next, optionsArgument)\n })\n }\n\n window.deepmerge = deepmerge;\n\n export default deepmerge;\n\n","/* global jwplayer */\nimport Events from './backbone.events';\nimport device from './device';\nimport merge from './merge';\n\n/**\n * @param {*[]} tasks\n * @param {Function} fn\n * @returns {Promise<*>}\n */\nfunction sequence(tasks, fn) {\n return tasks.reduce((promise, task) => promise.then(() => fn(task)), Promise.resolve());\n}\n\nvar jwUtils = jwplayer.utils,\n jwUnderscore = jwplayer._,\n // jwplayer is hard dependecy here\n utils = {\n Events: Events,\n\n // methods reused from jwplayer core\n extend: jwUtils.extend,\n // merge with deep copy, similar to jQuery extend\n merge: merge,\n\n ajax: jwUtils.ajax,\n\n each: jwUnderscore.each,\n isUndefined: jwUnderscore.isUndefined,\n isNumber: jwUnderscore.isNumber,\n isString: jwUnderscore.isString,\n isArray: jwUnderscore.isArray,\n omit: jwUnderscore.omit,\n memoize: jwUnderscore.memoize,\n\n createNode: jwUtils.createElement,\n addStyleSheet: jwUtils.addStyleSheet,\n addClass: jwUtils.addClass,\n removeClass: jwUtils.removeClass,\n throttle: jwUnderscore.throttle,\n sequence,\n\n /* jshint ignore:start */\n /**\n * Template system borrowed from http://ejohn.org/blog/javascript-micro-templating/\n */\n template: (function () {\n var cache = {};\n\n return function tmpl(str, data) {\n // Figure out if we're getting a template, or if we need to\n // load the template - and be sure to cache the result.\n var fn = !/\\W/.test(str)\n ? cache[str] = cache[str]\n || tmpl(document.getElementById(str).innerHTML)\n\n // Generate a reusable function that will serve as a template\n // generator (and which will be cached).\n : new Function('obj',\n `${'var p=[],print=function(){p.push.apply(p,arguments);};'\n\n // Introduce the data as local variables using with(){}\n + \"with(obj){p.push('\"}${\n\n // Convert the template into pure JavaScript\n str\n .replace(/[\\r\\t\\n]/g, ' ')\n .split('<%').join('\\t')\n .replace(/((^|%>)[^\\t]*)'/g, '$1\\r')\n .replace(/\\t=(.*?)%>/g, \"',$1,'\")\n .split('\\t')\n .join(\"');\")\n .split('%>')\n .join(\"p.push('\")\n .split('\\r')\n .join(\"\\\\'\")\n }');}return p.join('');`);\n\n // Provide some basic currying to the user\n return data ? fn(data) : fn({});\n };\n }()),\n /* jshint ignore:end */\n\n device: device,\n\n time: {\n durationToSeconds: function (time) {\n const [hours, minutes, seconds] = time.split(':').map((i) => parseInt(i, 10));\n return seconds + (60 * minutes) + (60 * 60 * hours);\n },\n\n shareTimeToSeconds: function (time) {\n var hours,\n minutes,\n seconds,\n length;\n\n time = jwUnderscore.compact(time.split(/[msh]/));\n length = time.length; // last is empty\n\n seconds = parseInt(time[length - 1], 10);\n minutes = time[length - 2];\n hours = time[length - 3];\n\n return seconds + (minutes ? parseInt(minutes, 10) * 60 : 0) + (hours ? parseInt(hours, 10) * 3600 : 0);\n }\n },\n\n number: {\n zeroPad: function (number) {\n number = parseInt(number, 10);\n return number < 10 ? `0${number}` : number.toString();\n }\n },\n\n escape: function (str) {\n var escapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`'\n };\n\n return str.replace(/[&<>\"'`]/g, function replaceTag(tag) {\n return escapeMap[tag] || tag;\n });\n },\n\n string: {\n // timestamp [s]\n getTimeFormatted: function (timestamp) {\n var hours = Math.floor(timestamp / 3600),\n minutes = Math.floor((timestamp % 3600) / 60),\n seconds = timestamp % 60;\n\n return `${(hours > 0 ? `${hours}:` : '') + utils.number.zeroPad(minutes)}:${utils.number.zeroPad(seconds)}`;\n }\n },\n\n inherit: function (o) {\n function F() {\n } // Dummy constructor\n\n F.prototype = o;\n return new F();\n },\n\n model: {\n // Helper function to correctly set up the prototype chain, for subclasses.\n // Similar to `goog.inherits`, but uses a hash of prototype properties and\n // class properties to be extended.\n extend: function (protoProps, staticProps) {\n var parent = this;\n var child = function () {\n return parent.apply(this, arguments);\n };\n\n // Add static properties to the constructor function, if supplied.\n utils.extend(child, parent, staticProps);\n\n // Set the prototype chain to inherit from `parent`, without calling\n // `parent`'s constructor function.\n var Surrogate = function () {\n this.constructor = child;\n };\n Surrogate.prototype = parent.prototype;\n child.prototype = new Surrogate();\n\n // Add prototype properties (instance properties) to the subclass,\n // if supplied.\n if (protoProps) {\n utils.extend(child.prototype, protoProps);\n }\n\n // Set a convenience property in case the parent's prototype is needed\n // later.\n child.__super__ = parent.prototype;\n\n return child;\n }\n },\n\n /**\n * Check snap points support\n * @returns {boolean}\n */\n getScrollSnapPrefix: function () {\n var scrollSnapSupport = false;\n\n if ('webkitScrollSnapType' in document.documentElement.style) {\n scrollSnapSupport = '-webkit-';\n } else if ('msScrollSnapType' in document.documentElement.style) {\n scrollSnapSupport = '-ms-';\n } else if ('scrollSnapType' in document.documentElement.style) {\n scrollSnapSupport = '';\n }\n\n return scrollSnapSupport;\n },\n\n loadScript: function (path) {\n return new Promise(function (resolve, reject) {\n var script = document.createElement('script'),\n done = false;\n\n script.type = 'text/javascript';\n script.src = path;\n script.async = true;\n script.onreadystatechange = script.onload = function() {\n if (!done && (!this.readyState\n || this.readyState === 'loaded' || this.readyState === 'complete')) {\n done = true;\n resolve();\n\n // Handle memory leak in IE\n script.onload = script.onreadystatechange = null;\n }\n };\n script.onerror = reject;\n\n document.body.appendChild(script);\n });\n },\n\n jsonToUrl: function (obj) {\n return Object.keys(obj).map(function(key) {\n return `${encodeURIComponent(key)}=${encodeURIComponent(obj[key])}`;\n }).join('&');\n }\n };\n\n/**\n * Polyfill for String.startsWith\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith\n */\n(function() {\n if (!String.prototype.startsWith) {\n String.prototype.startsWith = function(searchString, position) {\n position = position || 0;\n return this.indexOf(searchString, position) === position;\n };\n }\n}());\n\nexport default utils;\n","const counters = {};\n\nconst log = function(...args) {\n const counter = counters[args[0]] || 0;\n counters[args[0]] = counter + 1;\n\n args[0] = `${args[0]}: ${counter} %c\"${args[1]}\"`;\n args[1] = 'color: #ca2117;';\n\n // eslint-disable-next-line no-console\n console.log(...args);\n};\n\nconst isEnabled = function(block) {\n const itemKey = `logSvpPlayer${block}`;\n\n // check global first\n if (window[itemKey] === true) {\n return true;\n }\n\n // fix Safari errors when cookies are disabled\n try {\n if (!window.localStorage) {\n return false;\n }\n\n return window.localStorage.getItem(itemKey);\n } catch (error) {\n return false;\n }\n};\n\nexport default function(block = 'SVP') {\n // eslint-disable-next-line no-console\n const error = (...args) => console.error('SVP Player:', ...args);\n\n if (isEnabled(block)) {\n return {\n log(...args) {\n if (typeof args[0] === 'function') {\n args[0](log.bind(this, block));\n } else {\n args.unshift(block);\n log.apply(this, args);\n }\n },\n error\n };\n }\n\n return {\n log() {},\n error\n };\n}\n","import utils from './utils';\n\n/**\n * Server time helper required for syncing browser time with stream vendors servers (SMP Stream)\n * @type {{time: null, responseTime: null, fetch: Function, getTime: Function}}\n */\nconst ServerTime = {\n time: null,\n responseTime: null,\n\n fetch: function(url) {\n return new Promise((resolve) => {\n const resolveRequest = (time) => {\n this.time = time;\n this.responseTime = new Date().getTime();\n resolve();\n };\n\n utils.ajax(url, function(result) {\n const serverTime = parseInt(result.responseText, 10);\n\n if (Number.isNaN(Number(serverTime))) {\n // set current microtime if server will return value different than int\n resolveRequest(new Date().getTime());\n } else {\n // adjust to miliseconds\n resolveRequest(serverTime * 1000);\n }\n }, function() {\n resolveRequest(new Date().getTime());\n }, true);\n });\n },\n\n getTime: function() {\n return this.time + (new Date().getTime() - this.responseTime);\n }\n};\n\nexport default ServerTime;\n","import config from 'player/config';\n\nfunction handleErrors(response) {\n if (!response.ok) {\n return Promise.reject(response);\n }\n return response;\n}\n\nfunction makeFetch(url) {\n return fetch(url)\n .then(handleErrors)\n .then((response) => response.json());\n}\n\nexport const APPNEXUS_PROVIDER_ID = 'appnexus';\n\nexport const assetAdditionalData = [\n 'settings', 'chapters', 'cuePoints', 'externalId', 'barrels',\n 'externalCategoryId', 'nextAsset', 'sourceFiles', 'subtitles',\n 'metadata', 'access', 'tags', 'stories', 'playlist'\n].join('|');\n\nconst api = (vendor, endpoint) => makeFetch(config.api.getUrl(vendor, endpoint));\n\n/**\n * @param {string} path\n * @param {string} query\n * @returns {Promise}\n */\nexport const relatedApi = ({ path, query }) => {\n const relatedApiUrl = config.api.relatedApiUrl.replace(/\\/$/, '');\n\n return makeFetch(`${relatedApiUrl}/${path}?${query}`);\n};\n\nexport default api;\n","import _ from './underscore';\nimport Events from './backbone.events';\n\nconst SimpleModel = _.extend({\n 'get': function (attr) {\n this.attributes = this.attributes || {};\n return this.attributes[attr];\n },\n 'set': function (attr, val) {\n this.attributes = this.attributes || {};\n\n if (this.attributes[attr] === val) {\n return;\n }\n var oldVal = this.attributes[attr];\n this.attributes[attr] = val;\n this.trigger('change:' + attr, this, val, oldVal);\n },\n 'clone': function () {\n return _.clone(this.attributes);\n }\n}, Events);\n\nexport default SimpleModel;\n","/* eslint-disable no-param-reassign */\nimport utils from 'utils/utils';\nimport Model from 'utils/model';\n\nconst Category = function (options) {\n this.attributes = {\n id: 0\n };\n\n this.initialize(options);\n};\n\nCategory.prototype = {\n initialize(data) {\n utils.extend(this.attributes, this.parse(data));\n },\n\n parse(data) {\n if (data.additional) {\n utils.each(data.additional, (value, key) => {\n if (typeof data[key] === 'undefined') {\n data[key] = value;\n }\n });\n\n data.images = utils.extend({}, data.images || {}, {\n background: data.background,\n main: data.image,\n logo: data.logo,\n playerLogo: data.playerLogoImage\n });\n\n data = utils.omit(data, ['additional', 'background', 'image', 'logo', 'playerLogoImage']);\n }\n\n return data;\n }\n};\n\nutils.extend(Category.prototype, Model);\n\nexport default Category;\n","/* eslint-disable no-param-reassign */\nimport { assetAdditionalData } from 'player/services/api';\nimport utils from 'utils/utils';\nimport Model from 'utils/model';\nimport config from 'player/config';\nimport Category from './category';\n\nfunction handleErrors(response) {\n if (!response.ok) {\n return Promise.reject(response);\n }\n return response;\n}\n\nconst Asset = function (options) {\n this.attributes = {\n id: 0\n };\n\n this.initialize(options);\n};\n\nAsset.prototype = {\n initialize(data) {\n utils.extend(this.attributes, this.parse(data));\n },\n\n url() {\n return config.api.getUrl(\n this.getVendor(),\n `/assets/${this.get('id')}?additional=${assetAdditionalData}`\n );\n },\n\n parse(data) {\n data = data || {};\n\n function unifyTimestamp(time) {\n if (!time) {\n return null;\n }\n\n if (time.toString().length === 10) {\n return time * 1000;\n }\n\n return time;\n }\n\n // rewrite additional fields\n if (data.additional) {\n utils.each(data.additional, (value, key) => {\n // featured chapters are fetched on the lists\n // merge them\n if (key === 'featuredChapters') {\n key = 'chapters';\n }\n\n if (key === 'subtitles') {\n key = 'captions';\n }\n\n if (typeof data[key] === 'undefined') {\n data[key] = value;\n }\n });\n\n if (data.additional.settings) {\n if (data.additional.settings.startIndexPoint) {\n data.startIndexPoint = data.additional.settings.startIndexPoint;\n }\n\n if (!utils.isUndefined(data.additional.settings.ageLimit)) {\n data.ageLimit = data.additional.settings.ageLimit;\n }\n }\n\n if (data.additional.sourceFiles) {\n data.sourceFiles = data.additional.sourceFiles;\n }\n }\n\n if (data.series) {\n data.season = parseInt(data.series.seasonNumber, 10);\n data.episode = parseInt(data.series.episodeNumber, 10);\n\n data = utils.omit(data, 'series');\n }\n\n // multiply timestamps by 1000 to use ms instead of s\n if (data.flightTimes) {\n data.flightTimes = {\n start: (data.flightTimes.start ? unifyTimestamp(data.flightTimes.start) : null),\n end: (data.flightTimes.end ? unifyTimestamp(data.flightTimes.end) : null)\n };\n }\n\n data.created = (data.created ? unifyTimestamp(data.created) : null);\n data.published = (data.published ? unifyTimestamp(data.published) : null);\n data.updated = (data.updated ? unifyTimestamp(data.updated) : null);\n\n if (data.category && !(data.category instanceof Category)) {\n data.category = new Category(data.category);\n }\n\n if (data.chapters) {\n utils.each(data.chapters, (chapter, index) => {\n chapter.time = utils.string.getTimeFormatted(chapter.timeline);\n chapter.index = (index + 1);\n });\n }\n\n // next asset is optional, fill with basic object to avoid undefined errors\n if (!data.nextAsset) {\n data.nextAsset = {};\n }\n\n data.tags = data.tags || [];\n\n // eslint-disable-next-line no-underscore-dangle\n if (data._embedded && data._embedded.tags) {\n // eslint-disable-next-line no-underscore-dangle\n data.tags = data._embedded.tags;\n }\n\n data.playlist = [];\n\n // eslint-disable-next-line no-underscore-dangle\n if (data._embedded && data._embedded.playlist) {\n // eslint-disable-next-line no-underscore-dangle\n data.playlist = data._embedded.playlist;\n }\n\n return data;\n },\n\n fetch() {\n return fetch(this.url())\n .then(handleErrors)\n .then((response) => response.json())\n .then((json) => {\n Object.assign(this.attributes, this.parse(json));\n });\n },\n\n getVendor() {\n return this.get('vendor');\n },\n\n destroy() {\n // in case of any cleanup\n },\n\n getAgeLimit() {\n return utils.isNumber(this.get('ageLimit')) ? this.get('ageLimit') : -1;\n },\n\n isSponsored() {\n const metadata = this.get('metadata');\n\n let isSponsored = false;\n\n /**\n * SVP API metadata values are always strings. There can be different structures serialized to string though.\n */\n if (metadata && metadata.sponsored) {\n try {\n isSponsored = JSON.parse(metadata.sponsored.toLowerCase()) === true;\n } catch (e) {\n // All the cases that fail to be json decoded are treated as false\n }\n }\n\n return isSponsored;\n },\n\n getCategoryTitle() {\n const category = this.get('category');\n const {\n attributes: {\n title\n } = {}\n } = category || {};\n return title;\n },\n\n /**\n * Get chapter by its index (numbered from 1)\n *\n * @param chapterIndex\n * @returns {*} or undefined if not found\n */\n getChapter(chapterIndex) {\n return this.getChapters()[chapterIndex - 1];\n },\n\n /**\n * Get chapters for single stream\n *\n * @returns {*|Array}\n */\n getChapters() {\n return this.get('chapters') || [];\n },\n\n getThumbnail() {\n return this.get('images').main;\n },\n\n getTitle() {\n return this.get('title');\n },\n\n getCategory() {\n return this.get('category');\n },\n\n /**\n * @returns {boolean}\n */\n isAudio() {\n return this.get('assetType') === 'audio';\n }\n};\n\nutils.extend(Asset.prototype, Model);\n\nexport default Asset;\n","import { assetAdditionalData, relatedApi } from '../api';\n\n/**\n * @param {string} vendor\n * @param {number} assetId\n * @param {number | undefined} limit\n * @returns {Promise<>}\n */\nasync function getRelatedAssets({ vendor, assetId, limit }) {\n const query = [`additional=${assetAdditionalData}`];\n if (limit) {\n query.push(`limit=${limit}`);\n }\n\n return relatedApi({ path: `${vendor}/${assetId}`, query: query.join('&') });\n}\n\nexport default {\n getRelatedAssets\n};\n","// eslint-disable-next-line max-len\nconst VIDEO = new Blob([new Uint8Array([0, 0, 0, 28, 102, 116, 121, 112, 105, 115, 111, 109, 0, 0, 2, 0, 105, 115, 111, 109, 105, 115, 111, 50, 109, 112, 52, 49, 0, 0, 0, 8, 102, 114, 101, 101, 0, 0, 2, 239, 109, 100, 97, 116, 33, 16, 5, 32, 164, 27, 255, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 33, 16, 5, 32, 164, 27, 255, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 167, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 2, 194, 109, 111, 111, 118, 0, 0, 0, 108, 109, 118, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 232, 0, 0, 0, 47, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 236, 116, 114, 97, 107, 0, 0, 0, 92, 116, 107, 104, 100, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 101, 100, 116, 115, 0, 0, 0, 28, 101, 108, 115, 116, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 47, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 100, 109, 100, 105, 97, 0, 0, 0, 32, 109, 100, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 68, 0, 0, 8, 0, 85, 196, 0, 0, 0, 0, 0, 45, 104, 100, 108, 114, 0, 0, 0, 0, 0, 0, 0, 0, 115, 111, 117, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 111, 117, 110, 100, 72, 97, 110, 100, 108, 101, 114, 0, 0, 0, 1, 15, 109, 105, 110, 102, 0, 0, 0, 16, 115, 109, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 100, 105, 110, 102, 0, 0, 0, 28, 100, 114, 101, 102, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 117, 114, 108, 32, 0, 0, 0, 1, 0, 0, 0, 211, 115, 116, 98, 108, 0, 0, 0, 103, 115, 116, 115, 100, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 87, 109, 112, 52, 97, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 16, 0, 0, 0, 0, 172, 68, 0, 0, 0, 0, 0, 51, 101, 115, 100, 115, 0, 0, 0, 0, 3, 128, 128, 128, 34, 0, 2, 0, 4, 128, 128, 128, 20, 64, 21, 0, 0, 0, 0, 1, 244, 0, 0, 1, 243, 249, 5, 128, 128, 128, 2, 18, 16, 6, 128, 128, 128, 1, 2, 0, 0, 0, 24, 115, 116, 116, 115, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 4, 0, 0, 0, 0, 28, 115, 116, 115, 99, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 28, 115, 116, 115, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1, 115, 0, 0, 1, 116, 0, 0, 0, 20, 115, 116, 99, 111, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 44, 0, 0, 0, 98, 117, 100, 116, 97, 0, 0, 0, 90, 109, 101, 116, 97, 0, 0, 0, 0, 0, 0, 0, 33, 104, 100, 108, 114, 0, 0, 0, 0, 0, 0, 0, 0, 109, 100, 105, 114, 97, 112, 112, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 105, 108, 115, 116, 0, 0, 0, 37, 169, 116, 111, 111, 0, 0, 0, 29, 100, 97, 116, 97, 0, 0, 0, 1, 0, 0, 0, 0, 76, 97, 118, 102, 53, 54, 46, 52, 48, 46, 49, 48, 49])], { type: 'video/mp4' });\n\nconst getMockAsset = () => ({\n id: 1,\n status: 'active',\n streamType: 'mock',\n streamUrls: {\n hls: URL.createObjectURL(VIDEO)\n },\n\n images: {\n main: null\n },\n\n streamConfiguration: {\n properties: []\n },\n category: {}\n});\n\nexport {\n getMockAsset\n};\n","import api, { assetAdditionalData } from '../api';\nimport { getMockAsset } from './asset/mock';\n\nconst getAssetEndpoint = (id) => `/assets/${id}?additional=${assetAdditionalData}`;\n\nconst getById = async ({ vendor, assetId }) => api(\n vendor,\n getAssetEndpoint(assetId)\n);\n\nexport default {\n getById,\n getMockAsset\n};\n","\n var requestNumber, currentServerId, image, config, getServer, getImageTransform, serversAmount;\n\n getServer = (function() {\n var MAX_REQUEST_PER_SERVER = 6;\n\n return function(imageId) {\n if(!imageId) {\n return '';\n }\n\n if(requestNumber === MAX_REQUEST_PER_SERVER) {\n if(currentServerId === serversAmount) {\n currentServerId = -1;\n }\n\n requestNumber = 0;\n currentServerId++;\n }\n\n requestNumber++;\n\n return imageId.replace(\"imbo\", config.servers[currentServerId]);\n };\n }());\n\n function getImageQuality(pixelRatio) {\n return (pixelRatio >= 2) ? 50 : 80;\n }\n\n function normalizeTransformSize(size, pixelRatio) {\n // return default value\n return [\n size,\n getImageQuality(pixelRatio)\n ];\n }\n\n function getClosestSize(transformSizes, maxDimension) {\n return transformSizes.reduce(function (prev, curr) {\n return (Math.abs(curr - maxDimension) < Math.abs(prev - maxDimension) ? curr : prev);\n });\n }\n\n function getPixelRatio() {\n // we do not support px lower than 1 and bigger than 2\n return Math.max(1, Math.min(2, config.getPixelRatio()));\n }\n\n /**\n * Returns transformation for given image key and width\n * Adjusts the best\n */\n getImageTransform = (function() {\n var cache = {};\n\n return function(key, width, height) {\n var pixelRatio = getPixelRatio(),\n cacheKey = key + width + height + pixelRatio;\n\n // first check if there is cached object\n if(cache[cacheKey]) {\n return cache[cacheKey];\n }\n\n var id = key.split('.'),\n i = 0,\n idLen = id.length,\n transformType = (height > width) ? 'autoWidth' : 'autoHeight',\n transformSizes = config.sizes, transform, maxDimension;\n\n while(i < idLen) {\n transformSizes = transformSizes[id[i]];\n\n if(!transformSizes) {\n throw new Error('Image transformation missing for key ' + key);\n }\n\n i++;\n }\n\n transformSizes = transformSizes[transformType];\n\n // transformation is adjusted to not 'auto' side\n maxDimension = (transformType === 'autoHeight') ? width : height;\n maxDimension = maxDimension * pixelRatio;\n\n var dimensions = normalizeTransformSize(getClosestSize(transformSizes, maxDimension), pixelRatio);\n\n // auto width transform starts with 'x'\n // http://svp.vg.no/svp/api/v1/docs/\n transform = (transformType === 'autoWidth') ? 'x' : '';\n transform = transform + dimensions[0] + 'q' + dimensions[1];\n\n cache[cacheKey] = transform;\n\n return transform;\n };\n }());\n\n image = {\n initialize: function(options) {\n config = options;\n serversAmount = options.servers.length - 1;\n requestNumber = 0;\n currentServerId = 0;\n },\n getImageSrc: function(imageId, key, width, height) {\n if(imageId) {\n var extension = (imageId.indexOf('.jpg') === -1 && imageId.indexOf('.png') === -1 ? '.jpg' : '');\n return getServer(imageId) + extension + '?t[]=' + getImageTransform(key, width, height);\n }\n return null;\n }\n };\n\n export default image;\n\n","import utils from 'utils/utils';\nimport image from 'utils/image';\nimport Model from 'utils/model';\nimport device from 'utils/device';\nimport ServerTime from 'utils/server-time';\nimport config from 'player/config';\n\nconst Stream = function (options) {\n this.attributes = {\n id: 0\n };\n\n this.initialize(options);\n};\n\nStream.prototype = {\n initialize(data) {\n utils.extend(this.attributes, this.parse(data));\n },\n\n /**\n * Parse data from asset\n * Be aware, data went through Asset.parse method\n *\n * @param data\n */\n parse(data) {\n const result = {\n id: data.id,\n vendor: data.vendor,\n title: data.title,\n\n streams: {\n hls: data.streamUrls.hls,\n hds: data.streamUrls.hds,\n mp4: data.streamUrls.mp4 ? [data.streamUrls.mp4] : []\n },\n status: data.status,\n type: data.streamType,\n mediaType: data.assetType,\n streamConfiguration: data.streamConfiguration,\n\n images: {\n main: data.images.main,\n snapshots: data.images.snapshots || null\n },\n\n captions: data.captions || [],\n\n flightTimes: {\n start: null,\n end: null\n },\n\n playback: {\n begin: null,\n end: null\n },\n\n sourceFiles: data.sourceFiles || [],\n externalId: data.externalId || null,\n category: data.category\n };\n\n if (data.duration) {\n result.duration = data.duration / 1000;\n }\n\n if (data.additional && data.additional.metadata) {\n result.disableNextVideo = data.additional.metadata.disableNextVideo;\n result.chunkDuration = Number(data.additional.metadata.chunkDuration);\n result.isPodcast = data.additional.metadata.isPodcast === 'true';\n }\n\n // override start and end if set in api\n if (data.flightTimes) {\n result.flightTimes = {\n start: (data.flightTimes.start ? data.flightTimes.start : null),\n end: (data.flightTimes.end ? data.flightTimes.end : null)\n };\n }\n\n if (data.playback) {\n result.playback = {\n begin: data.playback.begin,\n end: data.playback.end\n };\n }\n\n // additional stream settings\n if (data.settings) {\n result.showAds = data.settings.showAds;\n }\n\n // cue points, empty array if nothing set\n result.cuePoints = data.cuePoints;\n\n // playlist, empty array if nothing set\n result.playlist = data.playlist || [];\n\n // add midroll in 10s TODO remove after tests\n // result.cuePoints = [31];\n return result;\n },\n\n getId() {\n return this.get('id');\n },\n\n getVendor() {\n return this.get('vendor');\n },\n\n getCategory() {\n return this.get('category');\n },\n\n hasProperty(property) {\n return this.get('streamConfiguration').properties.indexOf(property) > -1;\n },\n\n /**\n * Get duration stored in API\n *\n * @returns {*}\n */\n getDuration() {\n return this.get('duration');\n },\n\n getCuePoints() {\n return this.get('cuePoints');\n },\n\n /**\n * Check if stream has Akamai Secure Token\n * @returns {*}\n */\n isSecure() {\n return this.hasProperty('tokenSecured');\n },\n\n /**\n * Check wheter give stream contains mock data to allow embedding player without asset id\n * @return {boolean}\n */\n isMock() {\n return this.get('type') === 'mock';\n },\n\n /**\n * Check if stream is available only in certain areas\n * @returns {*}\n */\n isGeoblocked() {\n return this.hasProperty('geoblocked');\n },\n\n isLive() {\n return this.get('type') === 'live';\n },\n\n wasLive() {\n return this.get('type') === 'wasLive';\n },\n\n isActive() {\n return this.get('status') === 'active' && !this.isPast();\n },\n\n isFuture() {\n return (this.get('flightTimes') && this.get('flightTimes').start\n ? this.get('flightTimes').start > ServerTime.getTime() : false);\n },\n\n isPast() {\n return (this.get('flightTimes') && this.get('flightTimes').end\n ? (this.get('flightTimes').end < ServerTime.getTime()) : false);\n },\n\n hasHds() {\n return this.getUrl('HDS').indexOf('f4m') > -1;\n },\n\n hasPlaylist() {\n return this.get('playlist').length > 0;\n },\n\n isDisabledNextVideo() {\n return !!this.get('disableNextVideo');\n },\n /**\n * Streams might not be available while asset is created\n *\n * @returns {boolean}\n */\n hasPlayableSource() {\n if (this.getTimeToStart() > 0 || !this.isActive()) {\n return false;\n }\n\n return true;\n },\n\n getUrl(streamType) {\n const isOnHttp = window.location.protocol.toLowerCase().startsWith('http:');\n const type = streamType.toLowerCase();\n\n let streamUrl = this.get('streams')[type];\n\n if (utils.device.isIE() && isOnHttp) {\n streamUrl = streamUrl.replace('https', 'http');\n }\n\n return streamUrl;\n },\n\n getPoster() {\n return this.get('images').main;\n },\n\n /**\n * Get chunk duration of live video\n *\n * @returns {number}\n */\n getChunkDuration() {\n return this.get('chunkDuration');\n },\n\n /**\n * Get poster src adjusted to given width\n *\n * @param containerWidth\n * @returns {*}\n */\n getPosterSrc(containerWidth) {\n return image.getImageSrc(this.getPoster(), 'poster', containerWidth);\n },\n\n /**\n * Get snapshots url\n * @returns {*} - url string or null if snapshots not found\n */\n getSnapshots() {\n return `${config.api.thumbnailsUrl + this.getVendor()}/assets/${this.getId()}`;\n },\n\n /**\n * Not every asset has snapshot (lives, wasLives)\n */\n hasSnapshots() {\n return this.get('images').snapshots !== null;\n },\n\n /**\n * Get captions associated with stream\n *\n * @returns {boolean}\n */\n getCaptions() {\n return this.get('captions') || [];\n },\n\n /**\n * Check if mp4 streams are available\n *\n * @returns {boolean}\n */\n hasMp4Streams() {\n return this.get('streams').mp4.length > 0;\n },\n\n /**\n * Check if asset is published\n * Method relay on server time to avoid timezone differences\n *\n * @returns {number} seconds to live\n */\n getTimeToStart() {\n return (this.get('flightTimes').start - ServerTime.getTime()) / 1000;\n },\n\n\n /**\n * Asset can be virually sliced into small chunks\n * These are only indicators and do not slice stream\n *\n * @param position\n * @returns {*}\n */\n getPlaybackTime(position) {\n const playback = this.get('playback');\n\n if (position === 'begin') {\n if (this.get('playAhead') > 0) {\n return this.get('playAhead');\n }\n\n return (playback.begin > 0) ? playback.begin : null;\n }\n\n if (position === 'end' && playback.end > 0) {\n return playback.end;\n }\n\n return null;\n },\n\n /**\n * Check if ads are turned on\n *\n * @returns {boolean}\n */\n hasCreatives() {\n return this.get('na') !== true;\n },\n\n /**\n * External id\n * Used for JW Player statistics\n */\n getExternalId() {\n return this.get('externalId');\n },\n\n /**\n * Check wethever stream has ads disabled\n */\n hasAdsDisabled() {\n return this.get('showAds') === false;\n },\n\n /**\n * @returns {boolean}\n */\n isAudio() {\n return this.get('mediaType') === 'audio';\n },\n\n /**\n * Check if stream is podcast\n * @returns {boolean}\n */\n isPodcast() {\n return this.get('isPodcast') === true;\n },\n\n /**\n * Get VMAP API URL for ads schedule\n * @returns {string}\n */\n getVmapApiUrl() {\n let supplyType = 'web_desktop';\n\n if (device.isMobile()) {\n supplyType = 'web_phone';\n } else if (device.isTablet()) {\n supplyType = 'web_tablet';\n }\n\n return `${config.api.vmapUrl}/${this.getVendor()}/${this.getId()}?supplyType=${supplyType}`;\n }\n};\n\nutils.extend(Stream.prototype, Model);\n\nexport default Stream;\n","/* eslint-disable no-underscore-dangle */\n\nimport relatedService from 'player/services/api/related';\nimport assetService from 'player/services/api/asset';\nimport utils from 'utils/utils';\nimport Stream from './stream';\nimport Asset from './asset';\n\nconst createResponse = ({ nextAsset, source }) => ({\n nextAsset: nextAsset ? new Asset(nextAsset) : null,\n source\n});\n\nconst handlers = {\n /**\n * Check if given asset has next stream\n * Used for setting/disabling postrolls\n *\n * @param asset\n * @returns {boolean}\n */\n hasPlayNext(asset) {\n if (asset.get('streamType') === 'live') {\n return false;\n }\n\n if (asset.get('nextAsset').id) {\n return true;\n }\n\n return false;\n },\n\n /**\n * Fetch next asset by providing it's id\n *\n * @param vendor\n * @param assetId\n * @param source\n * @returns {Promise<{nextAsset, source}>}\n */\n async fetchNextById({ vendor, assetId }) {\n const nextAsset = await assetService.getById({\n vendor,\n assetId\n });\n\n return createResponse({\n source: 'byId',\n nextAsset\n });\n },\n\n async fetchNextFromRelatedEngine({ vendor, assetId }) {\n const assets = await relatedService.getRelatedAssets({\n vendor,\n assetId,\n limit: 1\n });\n\n return createResponse({\n nextAsset: utils.isArray(assets) && assets.length > 0 ? assets[0] : undefined,\n source: 'related'\n });\n },\n\n /**\n * Fetch next for given asset\n * Cascade lookup from direct linkage (nextAsset.id) to retrieving from category\n * Rejected when nextAsset is not found\n *\n * @param asset\n * @returns {Promise}\n */\n async getNext(asset) {\n const vendor = asset.getVendor();\n const assetId = asset.get('id');\n\n return this.fetchNextFromRelatedEngine({\n vendor,\n assetId\n });\n },\n\n /**\n * Fetch next for given asset\n * Cascade lookup from direct linkage (nextAsset.id) to retrieving from category\n * Rejected when nextAsset is not found\n *\n * @param asset\n * @returns {Promise}\n */\n async fetchNext(asset) {\n const { nextAsset, source } = await this.getNext(asset);\n\n if (!nextAsset) {\n return Promise.reject({\n reason: 'nextAssetNotFound',\n source\n });\n }\n\n const stream = new Stream(nextAsset.attributes);\n\n if (!stream.isActive()) {\n return Promise.reject({\n reason: 'nextAssetNotActive',\n source\n });\n }\n\n return {\n nextAsset,\n source\n };\n }\n};\n\nexport default handlers;\n","\nimport relatedService from 'player/services/api/related';\nimport Asset from '../asset';\n\n// eslint-disable-next-line\nconst mapResponse = (vendor, assets) => assets.map((asset) => {\n // add vendor to assets\n return new Asset(Object.assign({\n vendor\n }, asset));\n});\n\n/**\n * @param {string} vendor\n * @param {number} assetId\n * @returns {Promise}\n */\nasync function fetchFromRelated({ vendor, assetId }) {\n const assets = await relatedService.getRelatedAssets({ vendor, assetId });\n return mapResponse(vendor, assets);\n}\n\nexport default {\n fetchFromRelated\n};\n","import nextAsset from './next-asset';\nimport recommendedList from './recommended/list';\n\nclass Recommended {\n constructor({ asset }) {\n this.asset = asset;\n }\n\n /**\n * Fetch next asset\n *\n * @returns {Promise}\n */\n getNextAsset(options = {}) {\n const { asset } = this;\n\n // next asset can be provided in player configuration\n if (options.asset) {\n return nextAsset.fetchNextById({\n // set vendor is specified or use main asset as default\n vendor: options.asset.vendor || asset.getVendor(),\n // asset can be object or number with asset id\n assetId: options.asset.id || options.asset\n });\n }\n\n return nextAsset.fetchNext(asset);\n }\n\n\n /**\n * Fetch recommended asset list\n *\n * @returns {*}\n */\n async getItems() {\n const vendor = this.asset.getVendor();\n const assetId = this.asset.get('id');\n\n return recommendedList.fetchFromRelated({\n vendor,\n assetId\n });\n }\n}\n\nexport default Recommended;\n","let translations = {};\n\nconst setTranslations = (data) => {\n translations = data;\n};\n\nconst getTranslations = () => translations;\n\n// eslint-disable-next-line\nconst translate = (key, substitute) => {\n // typeof to check keys like \"0\"\n return translations[key] || (typeof substitute === 'undefined' ? key : substitute);\n};\n\nconst getMonthName = (date) => {\n const months = translations.months || [];\n return months[date.getMonth()] || date.getMonth();\n};\n\nexport default {\n translate,\n setTranslations,\n getMonthName,\n getTranslations\n};\n","const objectToString = (obj) => {\n // create an array that will later be joined into a string.\n const string = [];\n\n // is object\n // Both arrays and objects seem to return \"object\"\n // when typeof(obj) is applied to them. So instead\n // I am checking to see if they have the property\n // join, which normal objects don't have but\n // arrays do.\n if (obj === undefined) {\n return String(obj);\n } if (typeof (obj) === 'object' && obj !== null && (obj.join === undefined)) {\n for (const prop in obj) {\n if (obj.hasOwnProperty(prop)) string.push(`${prop}: ${objectToString(obj[prop])}`);\n }\n\n return `{${string.join(',')}}`;\n\n // is array\n } if (typeof (obj) === 'object' && obj !== null && !(obj.join === undefined)) {\n for (const prop in obj) {\n string.push(objectToString(obj[prop]));\n }\n return `[${string.join(',')}]`;\n\n // is function\n } if (typeof (obj) === 'function') {\n string.push(obj.toString());\n\n // all other values can be done with JSON.stringify\n } else {\n string.push(JSON.stringify(obj));\n }\n\n return string.join(',');\n};\n\nconst capitalizeFirstLetter = (string) => {\n try {\n return string.charAt(0).toUpperCase() + string.slice(1);\n } catch (e) {\n // return what was sent\n return string;\n }\n};\n\nexport {\n objectToString,\n capitalizeFirstLetter\n};\n","import config from 'player/config';\nimport utils from 'utils/utils';\n\nfunction isDomainInArray(origin, domains) {\n let domain;\n let pos;\n let domainBeginning;\n\n // check if domain has access for given provider\n // otherwise deny it\n // allow all dev builds set settings\n if (config.version === 'dev') {\n return true;\n }\n\n // list is not provided\n if (!utils.isArray(domains)) {\n return false;\n }\n\n const len = domains.length;\n\n for (let i = 0; i < len; i += 1) {\n domain = domains[i];\n\n // subdomain parsing, subdomain has to end with domain\n if (domain[0] === '*') {\n // remove asterisk\n domain = domain.slice(1);\n pos = origin.indexOf(domain);\n\n domainBeginning = origin[origin.length - domain.length - 1];\n\n // check if origin has exactly the same ending of domain\n if (pos > -1 && origin.length - pos === domain.length\n && (domainBeginning === undefined || domainBeginning === '.')) {\n return true;\n }\n\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (domain.indexOf(origin) > -1) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Inherit data from parent array to child\n * Prevents undefined to persist if one of given array is empty\n *\n * @param parent\n * @param child\n * @returns {Array.}\n */\nfunction inherit(parent, child) {\n return (parent || []).concat(child || []);\n}\n\nconst Domain = {\n domain: null,\n\n // default settings configuration\n settings: {\n // boolean Preview of not published videos\n preview: false,\n // completely turn off all ads\n na: false\n },\n\n vendors: {},\n\n initialize(domain) {\n this.domain = domain;\n },\n\n /**\n * Fetch permissions for extended settings\n *\n * @param vendor\n * @returns {*}\n */\n fetch(vendor) {\n if (!this.vendors[vendor]) {\n this.vendors[vendor] = Promise.resolve(config.domains);\n }\n\n return this.vendors[vendor];\n },\n\n /**\n * Check whatever custom settings may be used on current domain or not\n *\n * @param vendor - api key vendor\n * @returns {Promise}\n */\n getPermissions(vendor) {\n return this.fetch(vendor).then((data) => {\n const result = {};\n\n utils.each(data, (item, key) => {\n result[key] = isDomainInArray(\n this.domain,\n inherit(item.global, item[vendor])\n );\n });\n\n return result;\n });\n },\n\n /**\n * Check if current domain is blacklisted\n *\n * @param vendor - api vendor key\n * @returns {*}\n */\n isBlacklisted(vendor) {\n const { blacklist } = config.domains;\n\n // check if domain has access for given provider\n // otherwise deny it\n // allow all dev builds set settings\n if (config.version === 'dev') {\n return false;\n }\n\n return isDomainInArray(this.domain, inherit(blacklist.global, blacklist[vendor]));\n }\n};\n\nexport default Domain;\n","import utils from 'utils/utils';\nimport config from 'player/config';\n\nimport { TOKEN_FETCH_ERROR } from '../playback/config/status-codes';\n\nconst fetchToken = function(params) {\n this.isFetching = true;\n\n return new Promise((resolve, reject) => {\n // fetch new token\n utils.ajax(this.url(params), (response) => {\n this.expire = +new Date() + 1000;\n this.value = response.responseText;\n this.isFetching = false;\n resolve(this.value);\n }, () => {\n this.isFetching = false;\n reject(TOKEN_FETCH_ERROR);\n }, true);\n });\n};\n\nclass Token {\n constructor(assetId, assetAccess, maxBitrate) {\n /**\n * Id of SVP related asset\n */\n this.assetId = assetId;\n\n /**\n * An access level key string\n * See https://svp.vg.no/svp/api/v1/vgtv/assets/access-definitions?appName=docs for available levels\n */\n this.assetAccess = assetAccess;\n\n /**\n * Akamai token value retrieved from SVP api\n * @type {null}\n */\n this.value = null;\n /**\n * Expiration time, timestamp\n * @type {null}\n */\n this.expire = null;\n\n /**\n * Maximum allowed bitrate for stream\n * @type {null}\n */\n this.maxBitrate = maxBitrate || null;\n\n this.request = null;\n this.isFetching = false;\n }\n\n fetch(configuration) {\n if (!this.isValid()) {\n if (this.request && this.isFetching) {\n return this.request;\n }\n\n if (typeof configuration === 'function') {\n this.request = configuration(this.assetId, this.assetAccess).then(fetchToken.bind(this));\n } else {\n this.request = fetchToken.call(this);\n }\n }\n\n return this.request;\n }\n\n url(params) {\n const query = [\n `vendor=${config.api.vendor}`\n ];\n\n if (params && params.expiry && params.value) {\n query.push(`assetId=${this.assetId}`);\n query.push(`expires=${params.expiry}`);\n query.push(`hmac=${params.value}`);\n } else {\n query.push('acl=/*');\n }\n\n if (this.maxBitrate) {\n query.push(`maxBitrate=${this.maxBitrate}`);\n }\n\n return `${config.api.tokenUrl}?${query.join('&')}`;\n }\n\n getValue() {\n return this.value;\n }\n\n isValid() {\n // on load expire is null therefore it will always return false\n return (+new Date() < this.expire);\n }\n}\n\n\nutils.extend(Token.prototype, utils.Events);\n\nexport default Token;\n","import config from 'player/config';\nimport utils from 'utils/utils';\n\n/**\n * @param {string} url\n * @param {Object} params\n */\nfunction buildUrlString(url, params) {\n const cb = Math.round(Math.random() * 100000000000);\n const queryParams = utils.jsonToUrl(utils.extend({ cb }, params));\n return `${url}?${queryParams}`;\n}\n\n/**\n * This is only for overriding/preview ads live on the page\n * @see https://github.schibsted.io/svp/web-player/issues/833\n * @param {string|number} overriddenParams\n * @returns {string}\n */\nexport function getOverriddenCrTag(overriddenId) {\n const overriddenParams = { id: overriddenId, format: 'vast' };\n return buildUrlString(config.ads.appnexus.cr, overriddenParams);\n}\n\n/**\n * @param {Object} params\n * @returns {string}\n */\nexport function getPtvTag(params) {\n return buildUrlString(config.ads.appnexus.ptv, params);\n}\n\n/**\n * @param {Object} params\n * @returns {string}\n */\nexport function getVmapTag(params) {\n return buildUrlString(config.ads.appnexus.vmap, params);\n}\n\n/**\n * @param {Object} tagOptions\n * @param {Object} globalOptions\n * @returns {Object}\n */\nexport function getAstConfig(tagOptions, globalOptions) {\n return utils.extend({}, utils.merge(globalOptions, tagOptions));\n}\n\n/**\n * @param {Stream & Eventable} stream\n * @returns {Object}\n */\nexport function getDefaultParams(stream) {\n const publisherName = stream.getVendor();\n const countryCode = config.vendors.se.includes(publisherName) ? 'se' : 'no';\n const supplyType = `web_${utils.device.getDeviceType()}`;\n return {\n countryCode,\n supplyType,\n publisherName,\n slotIds: { preroll: 1, midroll: 2, postroll: 3 }\n };\n}\n","import utils from 'utils/utils';\nimport * as appnexusTag from './appnexus-tag-builder';\n\nconst OVERRIDE_SEPARATOR = ':';\nconst OVERRIDE_SLOT_PARAM = 'ast_override_slot';\nconst OVERRIDE_SLOT_TAG_ID = 'ast_override_tag_id';\n\n/**\n * @returns {Object|undefined}\n */\nexport function getOverriddenParams() {\n const urlParams = new URLSearchParams(window.location.search);\n\n if (urlParams.has(OVERRIDE_SLOT_PARAM)) {\n const [slotName, creativeId] = urlParams.get(OVERRIDE_SLOT_PARAM).split(OVERRIDE_SEPARATOR);\n return { [slotName]: creativeId };\n }\n\n if (urlParams.has(OVERRIDE_SLOT_TAG_ID)) {\n const [tagId, creativeId] = urlParams.get(OVERRIDE_SLOT_TAG_ID).split(OVERRIDE_SEPARATOR);\n return { [tagId]: creativeId };\n }\n\n return undefined;\n}\n\nexport default class JwAdsConfig {\n /**\n * @param {Stream & Eventable} stream\n */\n constructor(stream) {\n this.stream = stream;\n this.config = {};\n this.params = [];\n this.overriddenParams = getOverriddenParams();\n }\n\n /**\n * @param {Object} params\n */\n setParams(params) {\n this.params = params;\n }\n\n /**\n * @param {object} adSlotConfig\n * @param {string} adLabel\n * @return {string}\n */\n getTag(adSlotConfig, adLabel) {\n const adConfig = utils.merge(this.params, adSlotConfig);\n const overriddenId = this.overriddenParams && (\n this.overriddenParams[adLabel] || (adConfig.id && this.overriddenParams[adConfig.id])\n );\n if (overriddenId) {\n return appnexusTag.getOverriddenCrTag(overriddenId);\n }\n\n if (this.stream.isAudio()) {\n return appnexusTag.getPtvTag(adConfig);\n }\n\n return appnexusTag.getVmapTag(adConfig);\n }\n\n /**\n * @param {object} adSlotConfig\n * @param {string} offset\n * @param {string} adLabel\n */\n add(adSlotConfig, offset, adLabel) {\n // do not add tag when id is empty\n if (adSlotConfig) {\n this.config[adLabel + Math.floor(Math.random() * 100) + 1] = {\n offset: offset,\n tag: this.getTag(adSlotConfig, adLabel)\n };\n }\n }\n\n getConfig() {\n return this.config;\n }\n}\n","import utils from 'utils/utils';\nimport logger from 'utils/logger';\nimport * as appnexusTagBuilder from './appnexus-tag-builder';\nimport JwAdsConfig from './appnexus-jw-config';\n\n// move to appnexus jw\nfunction getAdsConfig(adConfig, stream, settings) {\n const adSlots = adConfig.adSlots || {};\n const params = adConfig.params || [];\n const adsConfig = new JwAdsConfig(stream);\n const { hasNext } = (settings || {});\n\n adsConfig.setParams(params);\n adsConfig.add(adSlots.preroll, 'pre', 'preroll');\n\n utils.each(stream.getCuePoints(), function (cuePoint) {\n if (cuePoint && cuePoint.timeline) {\n adsConfig.add(adSlots.midroll, cuePoint.timeline, 'midroll');\n }\n });\n\n // postroll is disabled when playnext is available\n if (hasNext === false || (hasNext !== true && stream.get('hasNext') === false)) {\n adsConfig.add(adSlots.postroll, 'post', 'postroll');\n }\n\n return adsConfig.getConfig();\n}\n\nfunction getParams(params, memberId) {\n if (memberId) {\n return utils.extend({}, {\n member: memberId\n }, params);\n }\n\n return params;\n}\n\nfunction parseAdPlacements(adPlacements, globalParams) {\n const placements = {};\n\n utils.each(adPlacements, function (values, placementId) {\n placements[placementId] = appnexusTagBuilder.getAstConfig(values, globalParams);\n });\n\n return placements;\n}\n\nfunction getJwAdSchedule(clientConfig, stream, settings) {\n const { adSlots } = clientConfig;\n\n if (adSlots) {\n return getAdsConfig({\n adSlots: adSlots.schedule,\n params: getParams(adSlots.params, clientConfig.member)\n }, stream, settings);\n }\n\n return {};\n}\n\nfunction getAdPlacements(clientConfig) {\n const { adPlacements } = clientConfig;\n\n if (clientConfig.member && adPlacements) {\n return parseAdPlacements(\n adPlacements.schedule,\n getParams(adPlacements.params, clientConfig.member)\n );\n }\n\n return {};\n}\n\nconst getClientConfig = async (stream, settings) => {\n // ads are disabled\n // check stream config also\n const { na, adn } = settings;\n\n if (na === true || !adn || stream.hasAdsDisabled()) {\n return null;\n }\n\n let svpAdConfig = {};\n\n if (typeof adn === 'function') {\n svpAdConfig = await adn(stream, appnexusTagBuilder.getDefaultParams(stream), adn.svpPlayer);\n }\n\n logger('SVP').log('adsConfig', svpAdConfig);\n\n return svpAdConfig;\n};\n\n/**\n * Handle midroll scheduling in player\n *\n * @param tag\n * @param startTime\n * @returns {{onEnter: onEnter, setTime: setTime, onReady: onReady}}\n */\nfunction createMidroll({ tag, startTime }) {\n let hasEntered = false;\n let onEnterCallback = () => {};\n\n const onEnter = (callback) => {\n onEnterCallback = callback;\n };\n\n const onReady = (callback) => {\n if (tag) {\n callback();\n }\n };\n\n const setTime = (time) => {\n if (hasEntered === false && (time >= startTime || startTime === 'NOW')) {\n onEnterCallback(tag);\n hasEntered = true;\n }\n };\n\n return {\n setTime,\n onEnter,\n onReady\n };\n}\n\nfunction getConfig(stream, settings) {\n return getClientConfig(stream, settings).then(function (clientConfig) {\n // null equals to empty ads\n if (clientConfig === null) {\n return {};\n }\n\n return {\n adSchedule: getJwAdSchedule(clientConfig, stream, settings),\n adPlacements: getAdPlacements(clientConfig),\n adOptions: clientConfig.options || {}\n };\n });\n}\n\nfunction getLiveMidrollTag(maxDuration, stream, settings) {\n return getClientConfig(stream, settings).then(function (clientConfig) {\n if (!clientConfig) {\n return undefined;\n }\n\n const { adSlots } = clientConfig;\n const midroll = adSlots && adSlots.schedule && adSlots.schedule.midroll;\n if (!midroll) {\n return undefined;\n }\n\n const params = getParams((adSlots || {}).params, clientConfig.member);\n params.vmaxduration = maxDuration;\n\n return appnexusTagBuilder.getVmapTag(utils.merge(params, midroll));\n });\n}\n\nexport default {\n getConfig,\n getLiveMidrollTag,\n createMidroll\n};\n","import utils from 'utils/utils';\nimport appnexus from 'player/playback/ads/appnexus';\n\nfunction getPlaylist(streamUrl, stream, options, settings) {\n const {\n locale, poster, title, description, minDvrWindow\n } = options;\n\n function addPlaylistMetadata(playlistItem) {\n const mediaId = stream.getExternalId();\n const startTime = stream.getPlaybackTime('begin');\n\n // set media id only if it exists\n if (mediaId) {\n playlistItem.mediaid = mediaId;\n }\n\n // add title\n if (title) {\n playlistItem.title = title;\n }\n\n if (description) {\n playlistItem.description = description;\n }\n\n // seek stream if play ahead time is set\n if (startTime) {\n playlistItem.starttime = startTime;\n }\n\n if (minDvrWindow) {\n playlistItem.minDvrWindow = minDvrWindow;\n }\n return playlistItem;\n }\n\n function addSnapshots(playlistItem) {\n if (stream.hasSnapshots()) {\n // add snapshots for each stream\n playlistItem.tracks.push({\n file: stream.getSnapshots(),\n kind: 'thumbnails'\n });\n }\n\n return playlistItem;\n }\n\n function addCaptions(playlistItem) {\n if (stream.getCaptions().length > 0) {\n utils.each(stream.getCaptions(), function (caption) {\n playlistItem.tracks.push({\n file: caption.url,\n label: locale.translate(caption.language),\n kind: 'captions',\n default: caption.default === true\n });\n });\n }\n\n return playlistItem;\n }\n\n function addAppnexusAds(adConfig, playlistItem) {\n const { adSchedule, adPlacements } = (adConfig || {});\n\n // check if there are ads\n if (adSchedule && Object.keys(adSchedule).length > 0) {\n utils.extend(playlistItem, {\n adschedule: adSchedule\n });\n }\n\n // check if there are ads\n if (adPlacements) {\n playlistItem.adPlacements = adPlacements;\n }\n\n return playlistItem;\n }\n\n return function (config) {\n const type = stream.isAudio() && stream.hasMp4Streams() ? 'mp4' : 'hls';\n return Promise.resolve({\n id: stream.getId(),\n image: poster,\n sources: [{\n file: type === 'mp4' ? stream.getUrl(type) : streamUrl,\n // force stream type for mock stream which contains mp4 blob\n type: stream.isMock() ? 'video/mp4' : type,\n default: true,\n preload: type === 'mp4' ? 'none' : 'auto'\n }],\n mediaType: stream.get('mediaType'),\n tracks: [],\n // firefox requires this flag to be set when playing SecureHD stream\n ...(stream.isSecure() && {\n withCredentials: true\n })\n })\n .then(addPlaylistMetadata)\n .then(addCaptions)\n .then(addSnapshots)\n .then(function (playlistItem) {\n return appnexus.getConfig(stream, settings).then(function (adConfig) {\n const adOptions = adConfig.adOptions || {};\n\n config.advertising = utils.extend({\n client: 'vast'\n }, locale.translate('ads', true));\n\n if (typeof adOptions.autoplayMuted !== 'undefined') {\n config.advertising.autoplayadsmuted = adOptions.autoplayMuted;\n }\n\n if (adOptions.vpaidcontrols === true) {\n config.advertising.vpaidcontrols = true;\n }\n\n if (adOptions.preloadAds === true) {\n config.advertising.preloadAds = true;\n }\n\n // do not add any ads to playlist when it is in preload mode\n if (stream.isMock()) {\n return playlistItem;\n }\n\n // add svp vmap schedule for podcasts\n if (stream.isPodcast() && !stream.hasAdsDisabled() && !settings.na) {\n return utils.extend(playlistItem, {\n adschedule: stream.getVmapApiUrl()\n });\n }\n\n return addAppnexusAds(adConfig, playlistItem);\n });\n })\n .then(function (playlistItem) {\n if (!config.playlist) {\n config.playlist = [];\n }\n config.playlist.push(playlistItem);\n\n playlistItem.svp = {\n stream: stream,\n settings: settings\n };\n\n return config;\n });\n };\n}\n\nexport default getPlaylist;\n","import configuration from 'player/config';\nimport locale from 'player/model/locale';\n/**\n * Create sharing config based on passed options\n *\n * @param options\n * @param stream\n * @param globals\n * @return {*}\n */\nconst getConfig = ({\n options, stream, globals = {\n sharing: configuration.sharing,\n title: locale.translate('Sharing')\n }\n}) => {\n if (options === false) {\n return null;\n }\n\n const defaults = globals.sharing || {};\n const vendor = stream.getVendor();\n\n const sharing = Object.assign({}, defaults.global);\n\n // use provider specific sharing info\n if (defaults[vendor]) {\n Object.assign(sharing, defaults[vendor]);\n }\n\n // extend sharing options when object is provided as param for it\n if (typeof options === 'object') {\n Object.assign(sharing, options);\n } else if (typeof options === 'function') {\n Object.assign(sharing, options(stream.attributes));\n }\n\n // add uri encoding to prevent sharing problems\n if (sharing.code) {\n sharing.code = encodeURIComponent(sharing.code);\n }\n\n if (!sharing.heading) {\n sharing.heading = globals.title;\n }\n\n return sharing;\n};\n\n/**\n * JW configuration adapter\n *\n * @param args\n * @return {function(*): *}\n */\nconst addSharing = (...args) => function (config) {\n const sharing = getConfig(...args);\n\n if (sharing === null) {\n delete config.sharing;\n } else {\n config.sharing = sharing;\n }\n\n return config;\n};\n\nexport {\n getConfig,\n addSharing\n};\n","/**\n * Check if preroll is scheduled in configuration\n *\n * @param config\n * @returns {boolean}\n */\nconst hasPreroll = (config) => {\n const playlistItem = config && config.playlist[0];\n\n // check if preroll exists in array\n if (playlistItem.adschedule) {\n return Object.values(playlistItem.adschedule)\n .some((slot) => slot.offset === 'pre');\n }\n\n return false;\n};\n\nexport default function (stream, options) {\n // additional config options required for playback\n return function (config) {\n let canAutostart = options.autoplay;\n\n // stream is not available yet, display countdown\n if (!stream.hasPlayableSource()) {\n // disable autoplay if stream is not available\n config.preload = 'none';\n config.autostart = false;\n }\n\n // force sound mute when configuration is set\n if (options.mute === true) {\n config.mute = true;\n }\n\n // load skin if available\n if (options.skin) {\n config.skin = options.skin;\n }\n\n // fix jw bug\n // by default you can't play muted ads\n if (hasPreroll(config) && config.advertising.autoplayadsmuted !== true) {\n try {\n if (config.mute === true || localStorage.getItem('jwplayer.mute') === 'true') {\n canAutostart = false;\n // unmute player when autostart is not available\n config.mute = false;\n }\n } catch (error) {\n // for private browsing\n }\n }\n\n // disable autostart for future streams\n if (stream.isFuture()) {\n canAutostart = false;\n }\n\n if (typeof canAutostart !== 'undefined') {\n config.autostart = canAutostart;\n }\n\n // set autopause to viewable\n if (options.autopause === 'viewable') {\n config.autoPause = {\n viewability: true\n };\n }\n\n // set repeat mode\n if (options.repeat === true) {\n config.repeat = options.repeat;\n }\n\n return config;\n };\n}\n","import config from 'player/config';\nimport moduleLoader from 'utils/module-loader';\n\nlet request = null;\n\nconst youboraSdk = {\n state: 'UNLOADED',\n options: {},\n\n load(options = {}) {\n this.options = options;\n if (request === null) {\n this.state = 'LOADING';\n\n request = moduleLoader(config.cdn.youbora);\n request.then((youbora = window.youbora) => {\n this.state = 'READY';\n window.youbora = youbora;\n });\n }\n\n return request;\n },\n\n initialize(player, options = {}) {\n // skip when library is not loaded\n if (this.state !== 'READY' || this.state === 'LOADED') {\n return;\n }\n\n const { youbora } = window;\n\n // skip if youbora sdk does not exist\n if (!youbora) {\n return;\n }\n\n try {\n const plugin = new youbora.Plugin(Object.assign(\n options, this.options\n ));\n\n plugin.setAdapter(new youbora.adapters.JWPlayer(player));\n\n this.state = 'LOADED';\n } catch (e) {\n console.error('Could not load youbora plugin', e);\n }\n }\n};\n\nexport default youboraSdk;\n","import utils from 'utils/utils';\nimport Model from 'utils/model';\nimport image from 'utils/image';\nimport { objectToString } from 'utils/string';\n\nimport config from 'player/config';\nimport Domain from 'player/model/domain';\nimport Token from 'player/model/token';\nimport Asset from 'player/model/asset';\nimport Stream from 'player/model/stream';\n\nimport locale from 'player/model/locale';\n\nimport appnexus from './ads/appnexus';\nimport addPlaylistFactory from './config/playlist';\nimport { addSharing } from './config/sharing';\nimport setPlaybackOptions from './config/playback';\nimport addYoubora from './config/jw-youbora';\nimport setKey from './config/keys';\nimport setCaptions from './config/captions';\n\nimport * as STATUS_CODES from './config/status-codes';\nimport youbora from './youbora';\n\n/**\n * Config instance for player\n * Contains SVP Player options\n * Parses config\n *\n * @param options\n * @constructor\n */\nconst Config = function () {\n this.attributes = {\n // DOM node\n node: null,\n // API vendor\n vendor: null,\n // player environment\n env: 'production',\n // stream object (extracted from asset)\n stream: null,\n // if not provided width will be read from node element\n width: '100%',\n // if not provided height will be read from node element\n height: '100%',\n // start playing from chapter time\n chapter: null,\n // start stream automatically on capable devices (does not work on iPhone and iPad, Android)\n autoplay: false,\n // player poster (image), mixed string (http src)|true|false\n poster: true,\n // display title on poster or change to provided string (default false)\n title: null,\n // play ahead time, format XXhYYmZZs, for example: 02h09m10s\n time: null,\n // repeat mode\n repeat: false,\n // minimum dvr window\n minDvrWindow: null,\n // url to css file with skin\n skin: config.skins.default,\n // right click defualt text and link\n about: {\n text: 'Stream',\n link: ''\n },\n // token function for secured streams\n token: null\n };\n\n /**\n * JW Player Config\n */\n this.jwDefaults = {\n base: config.cdn.player,\n key: config.player.keys.default,\n preload: 'auto',\n horizontalVolumeSlider: true\n };\n\n this.token = null;\n};\n\nConfig.prototype = {\n /**\n * Calculates bitrate value based on given limit\n *\n * maxBitrate is increased by 15% due to VBR encoding\n * @returns {number}\n */\n getMaxBitrate() {\n return this.get('maxBitrate') * 1.15;\n },\n\n setStream(stream) {\n this.stream = stream;\n\n this.token = new Token(stream.get('id'), stream.get('access'), this.getMaxBitrate());\n },\n\n /**\n * Get config passed to SVP Player constructor\n * @returns {*|{}}\n */\n getRaw() {\n return this.rawOptions || {};\n },\n\n isPreviewMode() {\n const settings = this.getSettings();\n return settings.preview || false;\n },\n\n /**\n * Dump Javascript config to a string\n * @returns {string}\n */\n dump() {\n return objectToString(this.getRaw());\n },\n\n /**\n * TODO add tests\n *\n * @param stream\n * @param container\n * @returns {*}\n */\n getPoster(stream, playerContainer) {\n const container = playerContainer || document.getElementById(this.get('node'));\n\n const width = this.get('width');\n const height = this.get('height');\n\n if (utils.isString(this.get('poster'))) {\n return this.get('poster');\n }\n\n if (container && stream) {\n return image.getImageSrc(\n stream.getPoster(),\n 'poster',\n // use width and height if it's set as a number\n utils.isNumber(width) ? width : container.clientWidth,\n utils.isNumber(height) ? height : container.clientHeight\n );\n }\n\n return null;\n },\n\n /**\n * @param {Stream} stream\n * @returns {string|*}\n */\n getTitle(stream) {\n const title = this.get('title');\n const isAudioWithoutCustomTitle = stream.isAudio() && !utils.isString(title);\n\n if (title === true || isAudioWithoutCustomTitle) {\n return stream.get('title');\n }\n\n return title;\n },\n\n /**\n * @param {Stream} stream\n * @returns {string|undefined}\n */\n getDescription(stream) {\n if (stream.isAudio()) {\n return stream.getCategory().get('title');\n }\n\n return undefined;\n },\n\n /**\n * @param {Stream} stream\n * @returns {number|undefined}\n */\n getLiveSyncDuration(stream) {\n const chunkDuration = stream.getChunkDuration();\n if (chunkDuration) {\n // https://github.com/video-dev/hls.js/blob/master/docs/API.md#livesyncduration\n return chunkDuration * 2 + 1;\n }\n return undefined;\n },\n\n /**\n * Retrieve token required for secure streams\n * Token expiry has to match API\n */\n getToken() {\n if (this.stream.isSecure()) {\n return this.token.fetch(this.get('token'));\n }\n\n return Promise.resolve(null);\n },\n\n /**\n * Token is required only for secure streams so for all other types it's valid\n *\n * @returns {boolean}\n */\n hasValidToken() {\n return !this.stream.isSecure() || this.token.isValid();\n },\n\n getStreamUrl(type) {\n // stream not set yet\n if (!this.stream) {\n // eslint-disable-next-line no-console\n console.error('SVP SDK: getStreamUrl() called before stream set');\n return null;\n }\n\n return this.getToken().then((token) => {\n const streamUrl = this.stream.getUrl(type);\n const maxBitrate = this.getMaxBitrate();\n const params = [];\n\n if (type === 'hls' && token) {\n params.push(`hdnea=${encodeURIComponent(token)}`);\n }\n\n if (maxBitrate) {\n params.push(`b=0-${maxBitrate}`);\n }\n\n // only live streams require custom metadata\n // it's used to trigger ads\n if (this.stream.isLive()) {\n params.push('custom-mdt=on');\n }\n\n return streamUrl + ((params.length > 0) ? `?${params.join('&')}` : '');\n });\n },\n\n /**\n * Check if user is eligible to play stream in his geolocation\n *\n * @returns {Promise}\n */\n isStreamPlayable() {\n const { stream } = this;\n const settings = this.getSettings();\n\n return new Promise((resolve, reject) => {\n if (settings.preview === true) {\n resolve(STATUS_CODES.ACTIVE_PREVIEW);\n } else if (stream.isActive()) {\n if (stream.isGeoblocked() && !stream.isFuture()) {\n this.getStreamUrl('hls').then((streamUrl) => {\n // fetch manifest to check user access\n utils.ajax(streamUrl, resolve, function (...args) {\n const response = args[2] || {};\n\n if (response.status === 403) {\n return reject(STATUS_CODES.NOT_ACTIVE_GEOBLOCKED);\n }\n\n return reject(STATUS_CODES.NETWORK_ERROR);\n }, true);\n }).catch(reject);\n } else {\n resolve(STATUS_CODES.ACTIVE);\n }\n } else if (stream.isPast()) {\n reject(STATUS_CODES.NOT_ACTIVE_PAST);\n } else {\n reject(STATUS_CODES.NOT_ACTIVE);\n }\n });\n },\n\n /**\n * @param {Stream} stream\n * @returns {Stream[]}\n */\n getPlaylistItems(stream) {\n if (!stream) {\n return [];\n }\n const vendor = this.get('vendor');\n const playlistStreams = stream.get('playlist')\n .map((data) => {\n const asset = new Asset(data);\n asset.set('vendor', vendor);\n return asset;\n })\n .map((asset) => new Stream(asset.attributes));\n return [stream].concat(playlistStreams);\n },\n\n getJwConfig(stream) {\n const settings = this.getSettings();\n\n return Promise\n .resolve({\n width: this.get('width'),\n height: this.get('height'),\n abouttext: this.get('about').text,\n aboutlink: this.get('about').link,\n sharing: utils.extend({}, config.sharing.global),\n localization: locale.translate('player', true),\n plugins: {},\n cast: {},\n playlist: [],\n liveSyncDuration: this.getLiveSyncDuration(stream)\n })\n .then((jwConfig) => {\n const playlistItems = this.getPlaylistItems(stream);\n const addPlaylistItemsPromise = playlistItems.reduce((promise, currentStream) => {\n const streamUrlPromise = promise.then(() => {\n // change to the current stream object to prepare a valid stream url\n this.setStream(currentStream);\n return this.getStreamUrl('hls');\n });\n\n return streamUrlPromise.then((streamUrl) => {\n const playlistSettings = this.getPlaylistSettings();\n const playlistOptions = {\n poster: this.getPoster(currentStream),\n title: this.getTitle(currentStream),\n description: this.getDescription(currentStream),\n locale: locale,\n minDvrWindow: this.get('minDvrWindow')\n };\n\n const applyPlaylistAdding = addPlaylistFactory(\n streamUrl,\n currentStream,\n playlistOptions,\n playlistSettings\n );\n\n return applyPlaylistAdding(jwConfig);\n });\n }, Promise.resolve());\n\n return addPlaylistItemsPromise.then(() => {\n // revert to the origin stream object\n this.setStream(stream);\n return jwConfig;\n });\n })\n .then(addSharing({\n options: this.get('sharing'),\n stream\n }))\n .then(setCaptions(this.get('captions')))\n .then(setPlaybackOptions(stream, {\n mute: this.get('mute'),\n skin: this.get('skin'),\n autoplay: this.get('autoplay'),\n autopause: this.get('autopause'),\n repeat: this.get('repeat')\n }))\n .then(addYoubora(\n stream,\n youbora.state === 'READY'\n ))\n .then(setKey(this.get('vendor')))\n .then((jwConfig) => utils.merge(utils.extend({}, this.jwDefaults, jwConfig), settings.jw || {}));\n },\n\n /**\n * Check if recommended is available\n */\n hasRecommended() {\n // recommended truned on and repeat truned off\n return this.get('recommended') !== false && this.get('repeat') === false;\n },\n\n getRecommended() {\n return this.get('recommended');\n },\n\n getAgeLimit() {\n return this.get('ageLimit');\n },\n\n hasNext() {\n if (!this.hasRecommended()) {\n return false;\n }\n\n if (this.getRecommended() && (this.getRecommended().next === false\n || typeof this.getRecommended().next === 'undefined')) {\n return false;\n }\n\n return true;\n },\n\n getPlaylistSettings() {\n return utils.extend({\n adn: this.get('adn'),\n hasNext: this.hasNext()\n }, this.getSettings());\n },\n\n getLiveMidrollTag(time) {\n return appnexus.getLiveMidrollTag(\n time,\n this.stream,\n this.getPlaylistSettings()\n );\n },\n\n parse(options) {\n const asset = (options.asset || options.id);\n const about = config.about[options.vendor];\n const skin = utils.extend({}, (config.skins[options.vendor] || config.skins.default));\n\n // set default skin for player if nothing is provided\n if (typeof options.skin === 'object') {\n if (options.skin.name) {\n skin.name += ` ${options.skin.name}`;\n }\n\n if (options.skin.url) {\n skin.url = options.skin.url;\n }\n } else {\n // remove if not valid\n delete options.skin;\n }\n\n\n options.skin = skin;\n\n // override about link/text\n if (!options.about && about) {\n options.about = about;\n }\n\n // delete asset\n if (asset) {\n delete options.asset;\n }\n\n // check if user passed chapter or time\n if (utils.isString(options.chapter) && options.chapter.match(/^\\d+$/)) {\n options.chapter = parseInt(options.chapter, 10);\n }\n\n // legacy support\n if (options.time) {\n options.time = utils.time.shareTimeToSeconds(options.time);\n }\n\n if (options.settings) {\n delete options.settings;\n }\n\n return options;\n }\n};\n\n// Immutable method for restricted settings like preview or na\nObject.defineProperty(Config.prototype, 'initialize', {\n value(options) {\n const { vendor } = options;\n const rawOptions = utils.extend({}, options);\n\n this.rawOptions = rawOptions;\n\n Domain.getPermissions(vendor).then((permissions) => {\n const settings = {};\n\n if (permissions.whitelist === true && options.settings) {\n utils.extend(settings, options.settings);\n } else if (permissions.whitelist === false && options.settings && options.settings.jw) {\n settings.jw = {};\n utils.extend(settings.jw, options.settings.jw);\n }\n\n if (permissions.preview === false) {\n delete settings.preview;\n }\n\n // turn off ads for certain provider\n if (config.ads[vendor] === false) {\n settings.na = true;\n }\n\n Object.defineProperty(this, 'settings', {\n value: Object.freeze(settings),\n writable: false\n });\n\n utils.extend(this.attributes, this.parse(options));\n this.trigger('ready', rawOptions, settings);\n });\n },\n writable: false\n});\n\n// Immutable method for restricted settings like preview or na\nObject.defineProperty(Config.prototype, 'getSettings', {\n value() {\n return this.settings;\n },\n writable: false\n});\n\nutils.extend(Config.prototype, Model);\n\nexport default Config;\n","export default function (options = {}) {\n // additional config options required for playback\n return function (jwConfig) {\n if (options.native === true) {\n jwConfig.renderCaptionsNatively = true;\n delete options.native;\n }\n\n if (Object.keys(options).length > 0) {\n jwConfig.captions = options;\n }\n\n return jwConfig;\n };\n}\n","export default function (stream, isEnabled) {\n // additional config options required for playback\n return function (config) {\n // allow only when account config is available\n if (isEnabled) {\n if (config.playlist && config.playlist[0]) {\n const streamConfiguration = stream.get('streamConfiguration')\n && stream.get('streamConfiguration').properties;\n\n const category = stream.getCategory();\n\n config.playlist[0].youbora = {\n 'content.resource': stream.getUrl('hls'),\n 'content.isLive': stream.isLive(),\n 'content.title': stream.get('title'),\n 'content.duration': stream.getDuration(),\n 'content.cdn': 'AKAMAI',\n 'content.metadata': {\n content_id: stream.getId(),\n owner: stream.getVendor()\n },\n\n 'extraparam.1': stream.getId(),\n 'extraparam.2': stream.getVendor(),\n 'extraparam.3': streamConfiguration.join(','),\n 'extraparam.4': category && category.get('id')\n };\n }\n }\n\n return config;\n };\n}\n","import config from 'player/config';\n\nexport default function (vendor) {\n // additional config options required for playback\n return function (jwConfig) {\n const { keys } = config.player;\n\n jwConfig.key = keys[vendor] || keys.default;\n\n return jwConfig;\n };\n}\n","/* eslint-disable max-len */\nimport utils from 'utils/utils';\nimport locale from 'player/model/locale';\nimport logger from 'utils/logger';\n\nimport playIcon from 'icons/play.svg';\nimport pauseIcon from 'icons/pause.svg';\nimport audioIcon from 'icons/audio.svg';\nimport audioMuted from 'icons/audio-muted.svg';\nimport homad from './homad-lib';\n\nfunction getAdPotTag(offset, adschedule) {\n const keys = Object.keys(adschedule);\n let tag = null;\n\n utils.each(keys, function (key) {\n if (key.indexOf(offset) > -1) {\n // eslint-disable-next-line prefer-destructuring\n tag = adschedule[key].tag;\n }\n });\n\n return tag;\n}\n\nfunction getTagUrl(potOffset) {\n return function (player) {\n const playlistItem = player.getPlaylist()[0];\n let tag = false;\n\n if (playlistItem.adschedule) {\n tag = getAdPotTag(potOffset, playlistItem.adschedule);\n }\n\n if (tag) {\n tag = tag.replace('vmap', 'ssvmap');\n } else {\n tag = false;\n }\n\n return tag;\n };\n}\n\n\nconst getHomadConfig = () => ({\n globalConfig: 'https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json',\n clientConfig: '/homad-config.json',\n admessage() {\n return locale.translate('adblock').admessage;\n },\n skipable: true,\n skipAdOnContextChange: true,\n runInsideContainer: true,\n adjustAdVolumeToContentPlayer: true,\n postrollUseCompleteEvent: false,\n onReady() {\n },\n muteButton: `
${audioIcon}
`,\n unmuteButton: `
${audioMuted}
`,\n playButton: `
${playIcon}
`,\n pauseButton: `
${pauseIcon}
`,\n skipableButton: (function () {\n const adMessages = locale.translate('ads');\n return `
\n ${adMessages.skipmessage.replace('xx', '[time]')}\n \n \n \n
`;\n }()),\n skipButton: (function () {\n const adMessages = locale.translate('ads');\n\n return `
\n ${adMessages.skiptext}\n \n
`;\n }()),\n 'innerWarpper.style': '',\n prerollAdTag: getTagUrl('pre'),\n midrollAdTag: getTagUrl('mid'),\n postrollAdTag: getTagUrl('post')\n});\n\n/**\n * Homad AAB ads have single event bus for all players\n *\n * @param event\n */\nfunction parseHomadEvent(event) {\n // homad event details are under detils property\n const details = event && event.detail;\n logger('HomadPlugin').log('event', details);\n\n // skip parsing when there is missing data or player is not registered\n if (!details || !this.events[details.containerId]) {\n return;\n }\n\n this.events[details.containerId].trigger(details.name, details);\n}\n\nexport default utils.extend({\n // events hashmap playerId -> eventBus\n // each player has its own events bus\n events: {},\n initialize() {\n const SvpPlayer = window.SVP.Player;\n\n if (!SvpPlayer.isHomadLoaded) {\n SvpPlayer.isHomadLoaded = true;\n\n const homadConfig = getHomadConfig();\n\n // override aab config url\n if (SvpPlayer.defaults.aabConfig) {\n homadConfig.clientConfig = SvpPlayer.defaults.aabConfig;\n }\n\n homad(homadConfig);\n\n window.addEventListener('hdEvent', parseHomadEvent.bind(this));\n }\n },\n\n /**\n * Get events for specific player\n * Events are matched by player id\n *\n * @param playerId\n * @returns {*}\n */\n getEvents(playerId) {\n // create event bus for specific player if this doesn't exist\n if (!this.events[playerId]) {\n this.events[playerId] = utils.extend({}, utils.Events);\n }\n\n return this.events[playerId];\n },\n\n /**\n * Remove player events from messaging bus\n * Prevents memory leaks\n *\n * @param playerId\n */\n removeEvents(playerId) {\n if (this.events[playerId]) {\n this.events[playerId].off();\n this.events[playerId].stopListening();\n\n this.events[playerId] = null;\n delete this.events[playerId];\n }\n }\n}, utils.Events);\n","/* global SVP */\nimport utils from 'utils/utils';\nimport logger from 'utils/logger';\nimport HomadAds from './homad';\n\nimport { createHomadSkin } from './homad-skin';\n/**\n * Get Ad Player from player container\n *\n * @param parent\n * @param cb\n */\nfunction getAdPlayer(parent, cb) {\n const observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(mutation) {\n if (mutation.type === 'childList') {\n const nodes = mutation.addedNodes;\n\n if (nodes && nodes[0] && nodes[0].classList.length === 0) {\n const video = nodes[0].querySelector('video');\n\n if (video) {\n cb(video, nodes[0]);\n }\n }\n }\n });\n });\n\n // pass in the target node, as well as the observer options\n observer.observe(parent, {\n attributes: false,\n childList: true,\n characterData: false\n });\n}\n\n/**\n * Initialize ad player\n *\n * @param player\n * @returns {Function}\n */\nfunction initializeAdPlayer(player) {\n /**\n * Called every time ad video player is shown\n */\n return function (adPlayer, adPlayerContainer) {\n adPlayerContainer.classList.add('svp-homad-player');\n player.getContainer().classList.remove('jw-state-buffering');\n createHomadSkin(player, adPlayer, adPlayerContainer);\n };\n}\n\nfunction onAdError() {\n const jw = this.player;\n const container = this.getContainer();\n\n this.hasAdBlocked = true;\n\n // just to be sure\n this.once('adStarted', function () {\n this.adPlayerLoading = false;\n }, this);\n\n this.once('adSlotComplete', function () {\n container.classList.remove('svp-homad-loading');\n }, this);\n\n this.listenToOnce(jw, 'play', function () {\n this.adPlayerLoading = true;\n }, this);\n\n this.listenToOnce(jw, 'pause', function (options) {\n // first external pause is triggered by homad\n // this equals to ad tag loaded and parsed\n if (options && options.pauseReason === 'external') {\n this.adPlayerLoading = false;\n }\n }, this);\n}\n\nfunction onAdBreakStart(data) {\n const duration = this.getDuration();\n const currentTime = this.getCurrentTime();\n const container = this.getContainer();\n\n // homad has strange constraints for midroll\n if ((data && data.adposition !== 'mid') || (currentTime > 30 && duration - currentTime > 30)) {\n container.classList.add('svp-homad-loading');\n\n // clean loading in case of any error\n setTimeout(function () {\n container.classList.remove('svp-homad-loading');\n }, 5000);\n\n this.listenToOnce(this.player, 'adPlay', () => {\n container.classList.remove('svp-homad-loading');\n });\n }\n}\n\n/**\n * Forward events which are the same\n * @param eventName\n */\nfunction forwardEvent(eventName) {\n this.listenTo(this.events, eventName, function () {\n // trigger ad events only while ads are playing\n if (this.adPlaying === true) {\n // clear event data\n this.trigger(eventName);\n }\n }, this);\n}\n\nfunction onReady() {\n if (SVP.Player.isHomadLoaded !== true) {\n return;\n }\n\n // events are matched by player id\n const playerId = this.config.get('node');\n\n this.events = HomadAds.getEvents(playerId);\n\n this.listenTo(this.events, 'contentPlayerPlay', function () {\n this.getContainer().classList.remove('svp-homad-loading');\n }, this);\n\n this.listenTo(this.events, 'all', function (event, data) {\n logger('AAB').log(event, data);\n }, this);\n\n this.listenTo(this.events, 'adStart', function (data) {\n this.adPosition = data.state;\n\n if (this.adPlaying === false) {\n this.trigger('adSlotStart', {\n position: this.adPosition\n });\n\n this.adPlaying = true;\n }\n\n this.trigger('adStarted');\n }, this);\n\n this.listenTo(this.events, 'continueContent', function () {\n this.getContainer().classList.remove('jw-flag-ads');\n\n if (this.adPlaying === true) {\n this.trigger('adSlotComplete', {\n position: this.adPosition\n });\n\n this.adPlaying = false;\n }\n });\n\n this.listenTo(this.events, 'adTime', function (data) {\n if (data.currentTime && this.adPlaying) {\n this.trigger('adProgress', data.currentTime, data.duration);\n }\n }, this);\n\n this.listenTo(this.events, 'adMeta', function (data) {\n if (data) {\n this.trigger('adData', {\n adId: data.adId || null,\n impression: data.impressionURL || null\n });\n }\n }, this);\n\n utils.each(['adComplete', 'adSkipped', 'adPause', 'adPlay'], forwardEvent.bind(this));\n\n // cleanup events\n this.once('remove', HomadAds.removeEvents.bind(HomadAds, playerId));\n\n this.listenTo(this.player, 'adError', onAdError.bind(this));\n this.listenTo(this.player, 'adBreakStart', onAdBreakStart.bind(this));\n\n // turn off ad player loading when there is no ads\n this.listenTo(this.player, 'playlistItem', (playlistItem) => {\n if (playlistItem.item && !playlistItem.item.adschedule) {\n this.adPlaying = false;\n this.adPlayerLoading = false;\n }\n });\n\n // turn off ad player loading when there is no ads\n this.listenTo(this.player, 'adPlay', () => {\n this.adPlaying = true;\n this.adPlayerLoading = false;\n });\n\n this.adPlayerLoading = false;\n\n getAdPlayer(this.getContainer(), initializeAdPlayer(this));\n}\n\nexport default function (Player) {\n const { setup } = Player.prototype;\n\n // anti adblock works only for desktops\n if (!utils.device.isDesktop()) {\n return Player;\n }\n\n /**\n * Proxy player method\n * Call source when adblock is not present\n *\n * @param name\n * @param cb\n */\n function proxyMethod(name, cb) {\n const sourceMethod = Player.prototype[name];\n\n Player.prototype[name] = function () {\n const args = Array.prototype.slice.call(arguments);\n\n if (SVP.Player.isHomadLoaded !== true) {\n return sourceMethod.apply(this, args);\n }\n\n return cb.call(this, sourceMethod, args);\n };\n }\n\n Player.prototype.setup = function () {\n this.once('ready', onReady);\n return setup.call(this);\n };\n\n\n proxyMethod('onFirstFrameLoad', function (onFirstFrameLoad) {\n if (this.hasAdBlocked) {\n this.player.once('play', function () {\n this.player.once('providerFirstFrame', function () {\n onFirstFrameLoad.call(this, this.playlistItemId);\n }, this);\n }, this);\n } else {\n onFirstFrameLoad.call(this, this.playlistItemId);\n }\n });\n\n proxyMethod('onTime', function (onTime, args) {\n if (!this.adPlaying && this.adPlayerLoading === false) {\n onTime.apply(this, args);\n }\n });\n\n // eslint-disable-next-line consistent-return\n proxyMethod('onPlay', function (onPlay, args) {\n if (this.adPlayerLoading === false) {\n return onPlay.apply(this, args);\n }\n });\n\n //\n proxyMethod('onPause', function (onPause, args) {\n if (this.adPlaying === false && this.adPlayerLoading === false) {\n onPause.apply(this, args);\n }\n });\n\n proxyMethod('onComplete', function (onComplete, args) {\n if (this.adPlaying === false && (this.adPlayerLoading === false || this.adPlayerLoading === undefined)) {\n onComplete.apply(this, args);\n } else {\n this.listenToOnce(this.events, 'continueContent', function () {\n onComplete.apply(this, args);\n }, this);\n }\n });\n\n return Player;\n}\n","const getPlaybackState = (container) => {\n const playerClassList = container.classList;\n const adStarted = ['jw-flag-ads', 'svp-homad-playing'];\n\n const useClasses = (add, remove) => {\n playerClassList.add(...add);\n playerClassList.remove(...remove);\n };\n\n return {\n setAdPlaying: () => useClasses(adStarted, ['svp-homad-loading']),\n setAdComplete: () => useClasses([], adStarted)\n };\n};\n\nconst getControlsContainer = (adPlayerContainer) => {\n const controlsContainer = adPlayerContainer.querySelector('.jw-icon').parentNode.parentNode;\n\n const appendControl = (domNode) => {\n controlsContainer.appendChild(domNode);\n };\n\n return {\n appendControl\n };\n};\n\nconst createProgressBar = (container) => {\n const seekBar = container.querySelector('.jw-controlbar').cloneNode(true);\n seekBar.querySelector('.jw-button-container').remove();\n seekBar.querySelector('.jw-progress').style.width = '0%';\n\n const progressLoader = seekBar.querySelector('.jw-progress');\n\n const setProgress = (value) => {\n progressLoader.style.width = `${value}%`;\n };\n\n return {\n domNode: seekBar,\n reset: () => setProgress(0),\n setProgress\n };\n};\n\nconst createFullscreenButton = (container) => {\n const fullscreenButton = container.querySelector('.jw-icon-fullscreen').cloneNode(true);\n const onClick = (handleClick) => {\n fullscreenButton.addEventListener('click', handleClick, true);\n };\n\n return {\n domNode: fullscreenButton,\n onClick\n };\n};\n\nconst toggleFullscreen = (jwPlayer) => {\n try {\n jwPlayer.setFullscreen();\n } catch (e) {\n // fullscreen did not work\n }\n};\n\nconst adjustVolumePosition = (adPlayerContainer) => {\n const volumeBtn = adPlayerContainer.querySelector('.jw-icon-volume');\n\n if (volumeBtn) {\n volumeBtn.parentNode.style.float = 'left';\n }\n};\n\nconst createHomadSkin = (player, adPlayer, adPlayerContainer) => {\n const container = player.getContainer();\n const { appendControl } = getControlsContainer(adPlayerContainer);\n\n const fullScreenButton = createFullscreenButton(container);\n fullScreenButton.onClick(() => toggleFullscreen(player.player));\n appendControl(fullScreenButton.domNode);\n\n const seekBar = createProgressBar(container);\n adPlayer.addEventListener(\n 'timeupdate',\n () => seekBar.setProgress((adPlayer.currentTime / adPlayer.duration) * 100),\n true\n );\n appendControl(seekBar.domNode);\n\n const { setAdPlaying, setAdComplete } = getPlaybackState(container);\n player.once('adSlotStart', seekBar.reset);\n player.once('adSlotStart', setAdPlaying);\n player.once('adSlotComplete', setAdComplete);\n\n adjustVolumePosition(adPlayerContainer);\n};\n\nexport {\n createHomadSkin\n};\n","import utils from 'utils/utils';\n/**\n * Check if preroll is scheduled in configuration\n *\n * @param config\n * @returns {boolean}\n */\nfunction hasPreroll(config) {\n const playlistItem = config && config.playlist[0];\n let result = false;\n\n if (playlistItem.adschedule) {\n utils.each(playlistItem.adschedule, function (slot) {\n if (slot && slot.offset === 'pre') {\n result = true;\n }\n });\n }\n\n return result;\n}\n\n/**\n * Check if given stream can be autoplayed\n * Rules for autoplay depends on device but also on flags given to playback\n *\n * @deprecated new autoplay policies require starting of video to detect if autoplay will work\n * @param config - JW Configuration\n * @returns {boolean}\n */\nfunction canAutoplay(config) {\n var canDeviceAutoplay = utils.device.canAutoplay();\n\n // enable autoplay for devices with disabled ads and at least muted autoplay ability ios10\n var result = (canDeviceAutoplay === 'always');\n\n if (canDeviceAutoplay === 'muted' && !hasPreroll(config)) {\n result = true;\n }\n\n return result;\n}\n\nexport default {\n canAutoplay: canAutoplay\n};\n","const handle = () => {\n let supposedCurrentTime = 0;\n let video = null;\n\n const onSeeking = () => {\n // guard against infinite recursion:\n // user seeks, seeking is fired, currentTime is modified, seeking is fired, current time is modified, ....\n if (Math.abs(video.currentTime - supposedCurrentTime) > 0.01) {\n video.currentTime = supposedCurrentTime;\n }\n };\n\n const onTimeUpdate = () => {\n if (!video.seeking) {\n supposedCurrentTime = video.currentTime;\n }\n };\n\n const init = (videoElement) => {\n video = videoElement;\n\n if (video) {\n // prevent user from seeking\n video.addEventListener('seeking', onSeeking);\n video.addEventListener('timeupdate', onTimeUpdate);\n }\n };\n\n const remove = () => {\n if (video) {\n video.removeEventListener('seeking', onSeeking);\n video.removeEventListener('timeupdate', onTimeUpdate);\n }\n };\n\n return {\n init, remove\n };\n};\n\nconst load = (svpPlayer) => {\n const handler = handle();\n\n /**\n * Get video tag from SVP Player\n *\n * @param player\n * @returns {Element | any}\n */\n const getVideo = (player) => player.getContainer().querySelector('video');\n\n /**\n * Add prevent seeking handler for every adslot\n */\n const onAdSlotStart = () => {\n handler.init(getVideo(svpPlayer));\n };\n\n /**\n * Remove it when ad completes\n */\n const onAdSlotComplete = () => {\n handler.remove();\n };\n\n svpPlayer.on('adSlotStart', onAdSlotStart);\n svpPlayer.on('adError adSlotComplete', onAdSlotComplete);\n};\n\nexport { handle };\nexport default load;\n","const loadedStylesheets = [];\n\nfunction loadStylesheet(href, onSuccess, onError) {\n if(loadedStylesheets.indexOf(href) > -1) {\n return onSuccess();\n }\n\n const callback = onSuccess || function () {};\n const head = document.getElementsByTagName('head')[0];\n const link = document.createElement('link');\n\n link.rel = 'stylesheet';\n link.type = 'text/css';\n link.href = href;\n\n let done = false;\n\n link.onreadystatechange = link.onload = function() {\n if ( !done && (!this.readyState ||\n this.readyState === \"loaded\" || this.readyState === \"complete\") ) {\n done = true;\n callback();\n\n // Handle memory leak in IE\n link.onload = link.onreadystatechange = null;\n }\n };\n\n link.onerror = function () {\n loadedStylesheets.splice(loadedStylesheets.indexOf(href), 1);\n onError();\n };\n\n loadedStylesheets.push(href);\n head.appendChild(link);\n}\n\nexport default (path) => {\n return new Promise((resolve, reject) => loadStylesheet(path, resolve, reject));\n}","import logger from 'utils/logger';\nimport utils from 'utils/utils';\nimport locale from 'player/model/locale';\nimport { forward30Icon, playbackRateIcon } from 'icons/audio';\n\nconst DEFAULT_USE_AUDIO_SKIN = true;\n\nconst CN_FORWARD_BUTTON = 'jw-icon-forward';\nconst CN_DURATION_INFO = 'svp-duration';\nconst CN_PLAYBACK_RATE = 'svp-playback-rate';\n\nconst PLAYBACK_RATES = [1.0, 1.2, 1.5, 1.7, 2.0];\n\n\n/** {string} An icon with proper class names */\nconst forwardIcon = forward30Icon.replace(' {\n const position = jwPlayer.getPosition();\n const duration = jwPlayer.getDuration();\n svpPlayer.seek(Math.min(duration, position + 30));\n };\n\n const changePlaybackRate = () => {\n const rate = jwPlayer.getPlaybackRate();\n const nextRateIndex = PLAYBACK_RATES.findIndex((currentRate) => currentRate === rate);\n jwPlayer.setPlaybackRate(PLAYBACK_RATES[nextRateIndex >= PLAYBACK_RATES.length - 1 ? 0 : nextRateIndex + 1]);\n };\n\n\n svpPlayer.on('playbackRateChanged', ({ playbackRate }) => {\n const container = svpPlayer.getContainer();\n const playbackRateButtonText = container.querySelector(`.jw-controlbar .${CN_PLAYBACK_RATE} text`);\n playbackRateButtonText.textContent = playbackRate.toFixed(1);\n });\n\n svpPlayer.on('playlistItem', () => {\n if (!svpPlayer.player.getControls()) {\n return;\n }\n\n const container = svpPlayer.getContainer();\n const stream = svpPlayer.getStream();\n const isAudio = stream.isAudio();\n const duration = stream.getDuration();\n const forwardTooltip = translate.forward;\n\n const displayControl = container.querySelector('.jw-display-icon-display .jw-icon-display');\n const cover = container.querySelector('.jw-preview .svp-cover');\n let forwardButton = container.querySelector(`.jw-controlbar .${CN_FORWARD_BUTTON}`);\n let durationInfo = container.querySelector(`.jw-title .${CN_DURATION_INFO}`);\n let playbackRateButton = container.querySelector(`.jw-controlbar .${CN_PLAYBACK_RATE}`);\n\n if (!cover) {\n container.querySelector('.jw-preview').appendChild(\n utils.createNode('
')\n );\n }\n\n if (!forwardButton) {\n jwPlayer.addButton(forwardIcon, forwardTooltip, seekForward, 'forward', CN_FORWARD_BUTTON);\n forwardButton = container.querySelector(`.jw-controlbar .${CN_FORWARD_BUTTON}`);\n }\n\n if (!durationInfo) {\n const title = container.querySelector('.jw-title');\n durationInfo = utils.createNode(`
`);\n title.appendChild(durationInfo);\n }\n\n\n if (!playbackRateButton) {\n jwPlayer.addButton(playbackRateIcon, '', changePlaybackRate, 'playback-rate', CN_PLAYBACK_RATE);\n const playbackRateButtonText = container.querySelector(`.jw-controlbar .${CN_PLAYBACK_RATE} text`);\n playbackRateButtonText.textContent = jwPlayer.getPlaybackRate().toFixed(1);\n\n playbackRateButton = container.querySelector(`.jw-controlbar .${CN_PLAYBACK_RATE}`);\n }\n\n const displayStyle = isAudio ? null : 'none';\n const addOrRemoveClass = isAudio ? utils.addClass : utils.removeClass;\n addOrRemoveClass(container, 'svp-flag-media-audio');\n displayControl.setAttribute('aria-label', isAudio ? translate.listen : translate.playback);\n forwardButton.style.display = displayStyle;\n durationInfo.style.display = displayStyle;\n playbackRateButton.style.display = displayStyle;\n durationInfo.innerText = isAudio ? timeToText(duration, translate) : '';\n });\n}\n","import utils from 'utils/utils';\nimport * as icons from 'icons';\nimport * as audioIcons from 'icons/audio';\n\n/** @type {object} */\nconst iconsMap = {\n '.jw-svg-icon-play': icons.play,\n '.jw-svg-icon-pause': icons.pause,\n '.jw-skip-icon .jw-svg-icon-next': icons.chevronRight,\n '.jw-svg-icon-settings': icons.settings,\n '.jw-svg-icon-sharing': icons.share,\n\n '.jw-svg-icon-cc-on': icons.captions,\n '.jw-svg-icon-cc-off': icons.captions,\n\n '.jw-svg-icon-volume-0': icons.audioMuted,\n '.jw-svg-icon-volume-50': icons.audioHalf,\n '.jw-svg-icon-volume-100': icons.audio,\n\n '.jw-svg-icon-fullscreen-on': icons.fullscreenOn,\n '.jw-svg-icon-fullscreen-off': icons.fullscreenOff,\n\n info: icons.info\n};\n\n/** @type {object} */\nconst audioIconsMap = Object.freeze({\n '.jw-svg-icon-play': audioIcons.playIcon,\n '.jw-svg-icon-pause': audioIcons.pauseIcon,\n '.jw-svg-icon-replay': audioIcons.replayIcon,\n '.jw-svg-icon-rewind': audioIcons.rewind10Icon,\n\n '.jw-svg-icon-volume-0': audioIcons.audioOffIcon,\n '.jw-svg-icon-volume-50': audioIcons.audioHalfIcon,\n '.jw-svg-icon-volume-100': audioIcons.audioOnIcon\n});\n\n/**\n * @param {string} name\n */\nexport function getIcon(name) {\n return iconsMap[name];\n}\n\n/**\n * @param withAudioIcons\n * @return {object}\n */\nfunction getReplaceableIconsMap(withAudioIcons) {\n if (!withAudioIcons) {\n return iconsMap;\n }\n\n return utils.merge(iconsMap, audioIconsMap);\n}\n\n/**\n * @param {PlayerModel} svpPlayer\n */\nexport default function loadIcons(svpPlayer) {\n const jwPlayer = svpPlayer.player;\n const stream = svpPlayer.getStream();\n const isAudioStream = stream ? stream.isAudio() : false;\n const replaceableIconsMap = getReplaceableIconsMap(isAudioStream);\n\n jwPlayer.once('playlist', () => {\n const container = svpPlayer.getContainer();\n\n utils.each(replaceableIconsMap, (customIcon, selector) => {\n const replaceableIcons = Array.prototype.slice.call(container.querySelectorAll(selector));\n\n if (!replaceableIcons.length) {\n return;\n }\n\n utils.each(replaceableIcons, (replaceableIcon) => {\n if (!replaceableIcon) {\n return;\n }\n\n const svpIcon = utils.createNode(customIcon);\n svpIcon.setAttribute('class', replaceableIcon.getAttribute('class'));\n replaceableIcon.parentNode.replaceChild(svpIcon, replaceableIcon);\n });\n });\n });\n}\n","const submenuHandler = (container) => {\n container.querySelector('.jw-controlbar .jw-button-container').addEventListener('click', (event) => {\n const { target } = event;\n\n // eslint-disable-next-line no-console\n if (target.classList.contains('jw-settings-submenu-button')\n || target.classList.contains('jw-settings-sharing')) {\n const submenu = container.querySelector('.jw-settings-menu');\n\n // eslint-disable-next-line max-len\n const right = Math.round(\n (container.offsetWidth - (target.offsetLeft + target.offsetWidth / 2)) - submenu.offsetWidth / 2\n );\n\n submenu.style.right = `${right}px`;\n }\n });\n};\n\nexport default (svpPlayer) => {\n if (!svpPlayer.player.getControls()) {\n return;\n }\n\n svpPlayer.on('ready', () => submenuHandler(svpPlayer.getContainer()));\n};\n","import { copyToClipboard } from 'utils/clipboard';\n\nexport default (svpPlayer, { icon }) => {\n if (!svpPlayer.player.getControls()) {\n return;\n }\n\n let isLoaded = false;\n\n svpPlayer.once('ready', () => {\n const container = svpPlayer.getContainer();\n\n container.addEventListener('contextmenu', () => {\n if (isLoaded === false) {\n const item = container.querySelectorAll('.jw-rightclick-list .jw-rightclick-item')[0];\n item.classList.add('svp-config-link');\n\n const infoNode = document.createElement('span');\n infoNode.innerHTML = icon;\n infoNode.classList.add('jw-icon', 'svp-config-info');\n infoNode.dataset.tip = 'Click to copy';\n\n item.appendChild(infoNode);\n\n infoNode.addEventListener('click', async () => {\n const config = svpPlayer.config.dump();\n\n infoNode.classList.add('svp-link-tip');\n infoNode.dataset.tip = 'Copied';\n\n copyToClipboard(config);\n\n setTimeout(() => {\n infoNode.classList.remove('svp-link-tip');\n }, 300);\n }, false);\n\n isLoaded = true;\n }\n }, false);\n });\n};\n","/**\n * Audio video switching button\n *\n */\nconst copyToClipboard = data => {\n const el = document.createElement('textarea');\n el.value = data;\n el.setAttribute('readonly', '');\n el.style.position = 'absolute';\n el.style.left = '-9999px';\n document.body.appendChild(el);\n el.focus();\n el.select();\n\n try {\n document.execCommand('copy');\n } catch (err) {\n console.log('Unable to copy');\n }\n\n document.body.removeChild(el);\n};\n\n\nexport {\n copyToClipboard\n};\n","import { getConfig } from '../config/sharing';\n\nconst FACEBOOK_SHARE_URL = 'http://www.facebook.com/sharer/sharer.php?u=';\nconst TWITTER_SHARE_URL = 'https://twitter.com/intent/tweet?url=';\n\n/**\n * Check if link uses JW MEDIAID replacement\n * @param link\n * @return {*|boolean}\n */\nconst hasMediaId = (link) => link && link.indexOf('MEDIAID') > -1;\n\n/**\n * Create sharing url to services like twitter or facebook\n *\n * @param root\n * @param link\n * @return {string}\n */\nconst getSharingLink = (root, link = window.location.href) => `${root}${encodeURIComponent(link)}`;\n\n/**\n * Update node element only if exists and value is correctly set\n * @param el\n * @param value\n */\nconst updateElement = (el, value) => {\n if (el && value) {\n el.value = value;\n }\n};\n\n/**\n * Replace JW Sharing button event listener\n *\n * @param sourceEl\n * @param link\n */\nconst replaceElement = (sourceEl, link) => {\n if (sourceEl) {\n const newEl = sourceEl.cloneNode(true);\n sourceEl.parentNode.replaceChild(newEl, sourceEl);\n\n newEl.addEventListener('click', () => {\n window.open(link, '_blank');\n }, true);\n }\n};\n\n/**\n * Update JW sharing box to work with our playnext\n *\n * @param container\n * @param stream\n * @param options\n */\nconst updateSharingBox = (container, stream, options) => {\n const { link, code } = getConfig({\n stream,\n options\n }) || { };\n\n // mediaid is supported natively so we do not touch anything when it's passed\n if (code && hasMediaId(code) === false) {\n updateElement(\n container.querySelector('.jw-sharing-copy[aria-label=embed] .jw-sharing-textarea'),\n code\n );\n }\n\n // link can be undefined\n if (link && hasMediaId(link) === false) {\n updateElement(\n container.querySelector('.jw-sharing-copy[aria-label=link] .jw-sharing-textarea'),\n link\n );\n\n // this is tricky way to replace JW sharing buttons\n // facebook and twitter are replaced with custom sharing elements\n // this allows dynamic configuration via function\n replaceElement(\n container.querySelector('.jw-sharing-link[aria-label=facebook]'),\n getSharingLink(FACEBOOK_SHARE_URL, link)\n );\n replaceElement(\n container.querySelector('.jw-sharing-link[aria-label=twitter]'),\n getSharingLink(TWITTER_SHARE_URL, link)\n );\n }\n};\n\nexport default (svpPlayer) => {\n svpPlayer.on('initialPlay', () => updateSharingBox(\n svpPlayer.getContainer(),\n svpPlayer.getStream(),\n svpPlayer.config.get('sharing')\n ));\n};\n","import utils from 'utils/utils';\nimport { APPNEXUS_PROVIDER_ID } from 'player/services/api';\n\nconst APPNEXUS_CLASS_NAME = 'svp-appnxs';\nconst SVP_FLAG_STOPPED = 'svp-flag-stopped';\n\nconst handleAppnexusClass = (container, vendor) => {\n // handle ads only playback\n // class name is scrambled to avoid adblockers\n if (vendor === APPNEXUS_PROVIDER_ID) {\n utils.addClass(container, APPNEXUS_CLASS_NAME);\n } else {\n utils.removeClass(container, APPNEXUS_CLASS_NAME);\n }\n};\n\nexport {\n APPNEXUS_CLASS_NAME,\n SVP_FLAG_STOPPED,\n handleAppnexusClass\n};\n\nexport default function (svpPlayerModel) {\n svpPlayerModel.on('playlistItem', () => {\n const container = svpPlayerModel.getContainer();\n\n handleAppnexusClass(\n container,\n svpPlayerModel.getStream().getVendor()\n );\n\n container.classList.remove(SVP_FLAG_STOPPED);\n });\n\n svpPlayerModel.on('complete', (reason) => {\n const container = svpPlayerModel.getContainer();\n\n if (reason === 'stop') {\n container.classList.add(SVP_FLAG_STOPPED);\n }\n });\n}\n","const getLevelSettingsIcon = (container) => container.querySelector('.jw-icon-settings');\n\nconst handleLevelSettingsIcon = (data, icon) => {\n if (icon) {\n icon.style.display = '';\n\n // hide settings icon when there is only one level available\n // usually this is a case for iOS or when hls has limited bitrate\n if (data && data.levels && data.levels.length === 1) {\n icon.style.display = 'none';\n }\n }\n};\n\nexport default (svpPlayer) => {\n svpPlayer.on('playlistItem', function () {\n this.listenToOnce(\n svpPlayer.player,\n 'levels',\n (levels) => handleLevelSettingsIcon(levels, getLevelSettingsIcon(svpPlayer.getContainer()))\n );\n }, this);\n};\n","/**\n * @param {PlayerModel & Eventable} svpPlayerModel\n * @returns {HTMLDivElement}\n */\nfunction getTitleNode(svpPlayerModel) {\n const container = svpPlayerModel.getContainer();\n return container.getElementsByClassName('jw-nextup-title')[0];\n}\n\n/**\n * @param {PlayerModel & Eventable} svpPlayerModel\n */\nexport default function (svpPlayerModel) {\n const { player: jwPlayer } = svpPlayerModel;\n\n jwPlayer.on('nextShown', (playlistItem) => {\n const nextUpTitle = getTitleNode(svpPlayerModel);\n nextUpTitle.innerHTML = playlistItem.itemsShown[0].svp.stream.get('title');\n });\n\n jwPlayer.on('nextAutoAdvance', () => {\n const nextUpTitle = getTitleNode(svpPlayerModel);\n nextUpTitle.innerHTML = '';\n });\n\n jwPlayer.on('nextClick', () => {\n const nextUpTitle = getTitleNode(svpPlayerModel);\n nextUpTitle.innerHTML = '';\n });\n}\n","import styleLoader from 'utils/style-loader';\n\nimport audioSkinResolver from './skin/audioSkinResolver';\nimport loadIcons, { getIcon } from './skin/icons-loader';\nimport settingsMenu from './skin/settings-menu';\nimport configButton from './skin/config-button';\nimport sharingBox from './skin/sharing-box';\n\nimport containerClass from './skin/container-class';\nimport levelsIcon from './skin/levels-icon';\nimport nextUp from './skin/nextUp';\n\n/**\n * @param {object} jwConfig\n * @param {function} loader\n * @return {object}\n */\nexport function skinLoader(jwConfig, loader = styleLoader) {\n // disable multiple loading of JW skin\n if (jwConfig.skin && jwConfig.skin.url) {\n loader(jwConfig.skin.url);\n\n if (jwConfig.skin.name) {\n jwConfig.skin = {\n name: jwConfig.skin.name\n };\n } else {\n delete jwConfig.skin;\n }\n }\n\n return jwConfig;\n}\n\n/**\n * Load SVP Skin\n *\n * @param {PlayerModel} svpPlayerModel\n */\nexport default function svpSkin(svpPlayerModel) {\n audioSkinResolver(svpPlayerModel);\n settingsMenu(svpPlayerModel);\n configButton(svpPlayerModel, {\n icon: getIcon('info')\n });\n loadIcons(svpPlayerModel);\n sharingBox(svpPlayerModel);\n containerClass(svpPlayerModel);\n levelsIcon(svpPlayerModel);\n nextUp(svpPlayerModel);\n}\n","import utils from 'utils/utils';\nimport device from 'utils/device';\nimport logger from 'utils/logger';\nimport HomadAdsJw from './ads/homad-jw';\nimport autoplay from './config/autoplay';\nimport appnexus from './ads/appnexus';\nimport preventAdSeeking from './ads/prevent-seeking';\n\nimport youbora from './youbora';\nimport svpSkin, { skinLoader } from './skin';\n\nconst PlayerModel = function (config) {\n /**\n * JW Player instance\n * @type {null}\n */\n this.player = null;\n this.stream = null;\n this.config = config;\n\n this.isInitalized = false;\n\n /**\n * Indicates whenever stream was was stopped\n * @type {boolean}\n */\n this.isStopped = false;\n\n /**\n * Current playlist item\n *\n * @type {null}\n */\n this.playlistItem = null;\n\n /**\n * Current time holder for seek and seeked events\n * Fix for JW getPosition bug\n * @type {null}\n */\n this.currentTime = null;\n\n /**\n * Store an asset with playlist to allow load pulse data properly on replay whole playlist\n * @type {Asset|null}\n */\n this.masterAsset = null;\n\n /**\n * Indicates if ads are currently playing\n * @type {boolean}\n */\n this.adPlaying = false;\n\n /**\n * Adposition\n *\n * @type {null} preroll|midroll|postroll\n */\n this.adPosition = null;\n\n /**\n * Ad Breaks - stores the list of all ad breaks\n *\n * @type {array}\n */\n this.adBreaks = [];\n};\n\n/**\n * Forward JW Events without any change of them as they fits our needs\n *\n * List of proxied events\n * 'play', 'pause'\n *\n * @param event\n */\nfunction forwardEvent(event) {\n this.listenTo(this.player, event, this.trigger.bind(this, event));\n}\n\n/**\n * Simple proxy for JW Methods\n *\n * @param method\n * @returns {Function}\n */\nfunction bindJwMethod(method) {\n return function () {\n const args = Array.prototype.slice.call(arguments);\n\n if (!this.player) {\n // eslint-disable-next-line no-console\n console.warn(`Method ${method} called before player has been initialised`);\n return null;\n }\n\n return this.player[method].apply(this, args);\n };\n}\n\n/**\n * Proxy methods from JW\n */\nfunction forwardMethods(methods) {\n const forwardedMethods = {};\n\n utils.each(methods, function (method) {\n forwardedMethods[method] = bindJwMethod.call(this, method);\n }, this);\n\n return forwardedMethods;\n}\n\nfunction getAdPosition(slotId) {\n const slotKeys = { pre: 'preroll', mid: 'midroll', post: 'postroll' };\n\n return slotKeys[slotId];\n}\n\n/**\n * Parse adresponse for each adslot\n *\n * @param xml\n */\nfunction parseAdData(data) {\n const { sequence } = data;\n const xml = data && data.response;\n\n let source = 'WRAPPER';\n let adSelector = 'Ad';\n let adData = null;\n\n if (xml) {\n // only when additional data is given we set source to appnexus\n if (xml.URL === data.tag) {\n source = 'INLINE';\n adSelector = `Ad[sequence=\"${sequence}\"]`;\n }\n\n adData = Array.prototype.slice.call(xml.querySelectorAll(adSelector));\n // get first element if available\n adData = adData && adData[0] ? adData[0] : null;\n }\n\n return {\n sequence: sequence,\n count: data.podcount,\n raw: adData,\n source: source,\n meta: data\n };\n}\n\n/**\n * Initialize playback end method\n * Clear after each completion of stream or playbackEnd reached\n *\n * @param playbackEnd\n */\nfunction onPlaybackEndAvailable(playbackEnd) {\n const onTime = (position) => {\n if (position > playbackEnd) { //\n this.trigger('playbackEnd', Math.round(position));\n }\n };\n\n this.on('time', onTime);\n\n this.once('playbackEnd complete', function () {\n this.off('time', onTime);\n });\n}\n\n/**\n * Extended ready event with info about device autoplay ability\n * @param data\n */\nfunction onReady(options, eventData) {\n this.trigger('ready', utils.extend(options, eventData));\n}\n\nPlayerModel.prototype = {\n initialize() {\n this.player = jwplayer(this.config.get('node'));\n this.trigger('initialize');\n },\n\n setup() {\n this.initialize();\n\n // player could not be setup\n if (!this.player.setup) {\n // eslint-disable-next-line no-console\n console.error(`SVP Player initialization error. DOM ${this.config.get('node')} not found`);\n return;\n }\n\n this.getConfig().then((config) => {\n // speedup lookup\n const { player } = this;\n\n // load youbora only for non-mock streams and 2.5% traffic\n let youboraRatio = Math.random() < 0.025;\n player.setup(config);\n\n svpSkin(this);\n preventAdSeeking(this);\n\n // set 1% of views for muted autoplayed videos\n if (player.getMute() === true && (config.autostart === true || config.autostart === 'viewable')) {\n youboraRatio = Math.random() < 0.01;\n }\n\n if (this.stream && !this.stream.isMock() && !this.config.isPreviewMode()\n && (youboraRatio || this.stream.isSecure())) {\n youbora.initialize(this.player, {\n accountCode: 'schibsted',\n enableAnalytics: true\n });\n }\n logger('JW').log('config', config);\n\n // forward native JW events without changing their behaviour\n utils.each([\n 'seek', 'displayClick', 'captionsChanged', 'adPause', 'adPlay', 'autostartNotAllowed', 'adClick',\n 'fullscreen', 'volume', 'mute', 'nextShown', 'nextAutoAdvance', 'nextClick', 'relatedReady',\n 'playlistComplete', 'playbackRateChanged'\n ], forwardEvent, this);\n\n this.listenTo(player, 'error setupError', this.onError, this);\n this.listenTo(player, 'playlistItem', this.onPlaylistItemLoad, this);\n\n this.listenTo(player, 'play', this.onPlay, this);\n this.listenTo(player, 'pause', this.onPause, this);\n this.listenTo(player, 'complete', this.onComplete, this);\n this.listenTo(player, 'ready', onReady.bind(this, {\n canAutoplay: autoplay.canAutoplay(config)\n }));\n\n this.listenTo(player, 'time', this.onTime, this);\n this.listenTo(player, 'viewable', this.onViewable, this);\n this.listenTo(player, 'autostartNotAllowed', this.onAutostartNotAllowed, this);\n\n this.listenTo(player, 'meta', this.onMeta, this);\n this.listenTo(player, 'metadataCueParsed', this.onMetadataCueParsed, this);\n\n this.listenTo(player, 'seek', function (data) {\n this.currentTime = data.offset;\n }, this);\n this.listenTo(player, 'seeked', function () {\n this.trigger('seeked', this.currentTime);\n // clearing has to occur after seekend event as getCurrentTime needs it\n this.currentTime = null;\n }, this);\n\n this.once('initialPlay', function () {\n this.listenToOnce(player, 'captionsList', function () {\n this.trigger('captionsList', this.getCaptionsList());\n }, this);\n }, this);\n\n this.on('initialPlay', () => {\n this.isStopped = false;\n });\n\n this.listenTo(player, 'adImpression', function (data) {\n if (data && data.adposition) {\n this.adPosition = getAdPosition(data.adposition);\n }\n\n if (this.adPlaying === false) {\n this.trigger('adSlotStart', {\n position: this.adPosition,\n response: data && data.response,\n meta: data\n });\n\n this.adPlaying = true;\n }\n\n this.trigger('adStarted');\n\n if (data && data.response) {\n this.trigger('adData', parseAdData(data));\n }\n }, this);\n\n this.listenTo(player, 'adError', function (data) {\n if (data && data.adposition) {\n this.adPosition = getAdPosition(data.adposition);\n }\n }, this);\n\n this.listenTo(player, 'adTime', function (data) {\n if (data.position && data.duration) {\n this.trigger('adProgress', data.position, data.duration);\n }\n }, this);\n\n this.on('adSlotStart', function () {\n this.listenToOnce(player, 'adBreakEnd', function () {\n if (this.adPlaying === true) {\n this.trigger('adSlotComplete', {\n position: this.adPosition\n });\n\n this.adPlaying = false;\n }\n }, this);\n }, this);\n\n this.listenTo(player, 'adSkipped', function () {\n this.trigger('adSkipped');\n }, this);\n\n this.listenTo(player, 'adComplete', function () {\n this.trigger('adFinished');\n }, this);\n\n this.listenTo(player, 'adSchedule', function (data) {\n this.adBreaks = data.adbreaks || [];\n }, this);\n\n this.listenTo(player, 'adBreakEnd', function ({ offset }) {\n // find the next ad with the distance less or equal 1s to the current one\n const nextAd = this.adBreaks.find((ad) => ad.offset > offset && ad.offset - offset <= 1);\n if (nextAd) {\n // workaround: using setTimeout to make seek work\n setTimeout(() => this.player.seek(nextAd.offset));\n }\n }, this);\n\n this.listenTo(player, 'adLoadedXML', function (data) {\n if (data && data.xml) {\n this.trigger('adLoadedXML', data.xml);\n }\n }, this);\n\n this.isInitalized = true;\n\n logger('JW').log((log) => {\n this.listenTo(player, 'all', function (event) {\n if (['bufferChange'].indexOf(event) < 0) {\n log(event, Array.prototype.slice.call(arguments, 1));\n }\n });\n });\n\n this.trigger('setup');\n });\n },\n\n playNext(stream, { disableAutoplay }) {\n // clear time\n this.stream = stream;\n\n this.complete('playNext');\n\n if (!this.isInitalized) {\n this.setup();\n } else {\n this.getConfig(stream).then((config) => {\n this.player.load(config.playlist);\n\n if (disableAutoplay) {\n return;\n }\n\n // stream is not available yet, display countdown\n if (stream.getTimeToStart() < 0) {\n // enable autoplay if stream is not available\n this.player.play(true);\n } else {\n this.player.stop();\n }\n });\n }\n },\n\n /**\n * @param {Asset|null} [asset=null]\n */\n setMasterAsset(asset = null) {\n this.masterAsset = asset;\n },\n\n /**\n * Checks if the current playlist contains a given asset\n * @param {number} assetId\n * @returns {boolean}\n */\n isAssetFromPlaylist(assetId) {\n return (\n this.masterAsset != null\n && (this.masterAsset.get('id') === assetId\n || this.masterAsset.get('playlist').some((assetData) => assetData.id === assetId))\n );\n },\n\n /**\n * Immediately completes currently playing stream\n */\n complete() {\n this.adPlaying = false;\n\n // trigger complete event only when stream is not finished to prevent double 'complete' event triggering\n if (this.getCurrentTime() > 0 && this.getCurrentTime() !== this.getDuration()) {\n this.trigger('complete');\n }\n },\n\n /**\n * Get DOM Node where player is inserted\n * @returns {*}\n */\n getContainer() {\n return this.player.getContainer();\n },\n\n /**\n * Get playback volume\n * @returns {*}\n */\n getVolume() {\n return this.player.getVolume();\n },\n\n /**\n * Set playback volume\n * @param volume\n */\n setVolume(volume) {\n this.player.setVolume(volume);\n },\n\n /**\n * Get mute flag\n * @return {*|boolean}\n */\n getMute() {\n return this.player.getMute();\n },\n\n /**\n * Set mute param in player\n * @param value\n */\n setMute(value) {\n this.player.setMute(value);\n },\n\n /**\n * Seek\n */\n seek(time) {\n this.player.seek(time);\n },\n\n /**\n * Get player config. Method is asynchronous due to loading info from api\n *\n * @param stream\n */\n getConfig(stream) {\n const nextStream = stream || this.getStream();\n\n return this.config\n .getJwConfig(nextStream)\n .then(skinLoader)\n .catch((reason) => {\n this.trigger('error', reason);\n });\n },\n\n /**\n * Set stream data\n *\n * @param stream\n */\n setStream(stream) {\n this.stream = stream;\n },\n\n /**\n * Get current stream loaded with player\n *\n * @returns {null|Stream|*}\n */\n getStream() {\n return this.stream;\n },\n\n /**\n * Check is ad is playing or not\n */\n isAdPlaying() {\n return this.adPlaying;\n },\n\n /**\n * Load given stream\n * Perform all required checks before stream playback\n *\n * @returns {Promise}\n */\n loadStream() {\n return new Promise((resolve) => {\n // for lazy loaded player\n if (!this.isInitalized) {\n this.setup();\n this.player.on('ready', resolve);\n } else {\n resolve();\n }\n });\n },\n\n /**\n * Play stream\n */\n play() {\n // ensure stream is loaded properly\n this.loadStream()\n .then(this.player.play.bind(this.player));\n },\n\n /**\n * Pause stream\n * @param force state\n */\n pause(force) {\n this.player.pause(force);\n },\n\n /**\n * Stop playback\n */\n async stop() {\n // playlistitemId is set when first frame is shown\n // stop shouldn't change stream when it was not played\n if (this.isStopped === false) {\n this.trigger('complete', 'stop');\n\n const { playlist } = await this.getConfig();\n\n this.player.load(playlist);\n this.player.stop();\n\n // reset playlist item to allow replaying this stream\n this.playlistItem = null;\n\n this.isStopped = true;\n }\n },\n\n /**\n * Destroy the player instance, reset DOM, clean up listeners\n */\n remove() {\n // cleanup any bind listener\n this.off();\n\n if (this.player) {\n this.pause(true);\n\n this.player.off();\n this.player.remove();\n\n this.trigger('remove');\n }\n },\n\n /**\n * Get stream duration\n *\n * @returns {*}\n */\n getDuration() {\n const duration = this.player.getDuration();\n\n if (duration < 0) {\n return -duration;\n }\n\n return duration;\n },\n\n /**\n * Get current playback time\n *\n * @returns {*}\n */\n getCurrentTime() {\n let { currentTime } = this;\n\n if (currentTime) {\n return currentTime;\n }\n\n // player not initialized (error/geoblock)\n // return 0\n if (!this.player) {\n return 0;\n }\n\n currentTime = this.player.getPosition();\n\n if (currentTime < 0) {\n return (this.getDuration() + currentTime);\n }\n\n return this.player.getPosition();\n },\n\n getState() {\n if (this.isAdPlaying()) {\n return 'adPlaying';\n }\n\n return this.player.getState();\n },\n\n // eslint-disable-next-line consistent-return\n getAdBlock() {\n if (this.player) {\n return this.player.getAdBlock();\n }\n },\n\n /**\n * Get poster for current stream\n * Poster may be changed in config\n *\n * @returns {*}\n */\n getPoster(stream, container) {\n return this.config.getPoster(stream, container);\n },\n\n /**\n * Get list of captions extended by data from api\n *\n * @returns {*}\n */\n getCaptionsList() {\n const playerCaptions = this.player.getCaptionsList();\n const captions = this.getStream().getCaptions();\n\n // merge player captions data with result from api\n utils.each(playerCaptions, (caption) => {\n utils.each(captions, (item) => {\n if (caption.id === item.url) {\n caption.language = item.language;\n caption.default = item.default;\n }\n });\n });\n\n return playerCaptions;\n },\n\n /**\n * Set current captions\n * @param index (number|string) - string is language key, number is index in array\n */\n setCurrentCaptions(index) {\n let newIndex = index || 0;\n\n if (!utils.isNumber(index)) {\n utils.each(this.getCaptionsList(), (caption, captionsIndex) => {\n if (caption && caption.language === index) {\n newIndex = captionsIndex;\n }\n });\n\n // fallback to off in case index is not found in captions array\n if (!utils.isNumber(newIndex)) {\n newIndex = 0;\n }\n }\n\n // set captions in player\n this.player.setCurrentCaptions(newIndex);\n },\n\n /**\n * Handle all errors from player\n */\n onError(data) {\n logger('SVP').error(data);\n const { code } = data;\n const message = data.message ? data.message.toString() : '';\n\n /**\n * Some errors do not prevent playback to play\n * thus they should be omitted\n */\n const skipErrors = [\n 'Captions failed to load', // could not load\n 'Casting failed to load' // chrome disabled\n ];\n\n // skip errors\n if (skipErrors.indexOf(message) > -1) {\n return;\n }\n\n this.trigger('error', {\n message,\n code\n });\n },\n\n /**\n * Event triggered before first stream play\n * Useful for statistics\n */\n onPlaylistItemLoad(playlistItem) {\n if (!this.playlistItem || this.playlistItem.file !== playlistItem.item.file) {\n // cleanup any previous beforePlay event (playnext after countdown or error)\n this.stopListening(this.player, 'beforePlay');\n\n if (!this.playlistItem || this.playlistItem.id !== playlistItem.item.id) {\n // trigger this event every time new playlist item is loaded\n this.listenToOnce(this.player, 'beforePlay', function () {\n if (this.stream.getTimeToStart() < 0) {\n this.trigger('initialPlay');\n }\n }, this);\n\n // ads should not if stream has future start time\n // attach event only for secure streams\n if (this.stream.isSecure()) {\n // reload playlist only if token expired\n // play method do this out of the box\n this.listenToOnce(this.player, 'displayClick', function () {\n if (!this.config.hasValidToken() && this.player.getState() !== 'playing') {\n this.play();\n }\n }, this);\n }\n\n this.trigger('playlistItem', playlistItem.item);\n\n // clear ad playing flag for current content\n // important when changing stream while adslot is playing\n this.adPlaying = false;\n\n this.listenToOnce(this.player, 'firstFrame', () => {\n this.playlistItemId = playlistItem.item.id;\n this.onFirstFrameLoad(this.playlistItemId);\n });\n }\n\n this.playlistItem = playlistItem.item;\n\n // for streams which end time is not equal to video length\n const playbackEndTime = this.stream.getPlaybackTime('end');\n\n // attach playback listener\n if (playbackEndTime > 0) {\n onPlaybackEndAvailable.call(this, playbackEndTime);\n }\n }\n },\n\n /**\n * Time\n *\n * @param data.position - current playback time\n * @param data.duration - current stream duration\n */\n onTime(data) {\n if (data.position < 0) {\n this.trigger('time', -(data.duration - data.position), -(data.duration));\n } else {\n this.trigger('time', data.position, data.duration);\n }\n },\n\n /**\n * Triggered on first frame of content playback - after ads\n */\n onFirstFrameLoad(playlistItemId) {\n // first play of stream\n const mediaType = this.stream.get('mediaType');\n const startTime = this.stream.getPlaybackTime('begin') || 0;\n\n if (device.isSamsungInternet() && mediaType === 'video') {\n utils.removeClass(this.getContainer(), 'jw-flag-media-audio');\n }\n\n this.once('time', () => {\n // check if currently set video id is the same as played one\n // it can happen when playnext is called before assetPlay\n if (playlistItemId === this.stream.getId()) {\n this.trigger('assetPlay', startTime);\n }\n });\n },\n\n onViewable(eventData) {\n const { viewable } = eventData;\n\n this.trigger('viewable', {\n viewable\n });\n },\n\n onAutostartNotAllowed(data) {\n const { reason } = data;\n\n if (reason === 'autoplayDisabled') {\n this.player.setMute(false);\n }\n },\n\n /**\n * Schedule midroll to\n * @param slotDuration\n * @param startTime\n * @returns {Promise}\n */\n async createMidroll(slotDuration, startTime) {\n const midroll = appnexus.createMidroll({\n tag: await this.config.getLiveMidrollTag(slotDuration),\n startTime\n });\n\n const onTimeChange = () => midroll.setTime(this.player.getCurrentTime());\n\n midroll.onReady(() => {\n this.on('time', onTimeChange);\n // cleanup when stream has changed or finished\n this.on('complete', () => this.off('time', onTimeChange));\n });\n\n midroll.onEnter(function (adTag) {\n const position = -(Math.abs(this.player.getPosition()));\n this.off('time', onTimeChange);\n\n this.once('adSlotComplete', () => {\n this.listenToOnce(this.player, 'providerFirstFrame', () => {\n this.player.seek(position);\n });\n });\n\n this.player.playAd(adTag);\n }.bind(this));\n },\n\n /**\n * Handling midrolls with scte35 tags in HLS live\n * @param data\n */\n onMetadataCueParsed(data) {\n if (!this.stream.isLive()) {\n return;\n }\n\n const { tag, content, start } = data.metadata || {};\n\n if (tag === 'EXT-X-CUE-OUT') {\n this.createMidroll(parseInt(content, 10), start);\n } else if (tag === 'EXT-X-CUE-IN') {\n this.player.skipAd();\n }\n },\n\n /**\n * Handling midrolls in RTMP live streams\n * @param data\n */\n onMeta(data) {\n if (!this.stream.isLive()) {\n return;\n }\n\n const params = data.metadata && data.metadata.TXXX;\n\n if (params) {\n // Workaround for live midrolls SCTE-35 tags in Safari\n // @see https://github.schibsted.io/svp/platform/issues/328\n if (params.insertAd && device.isSafari()) {\n const duration = parseInt(params.insertAd, 10);\n this.createMidroll(duration, 'NOW');\n }\n\n // Workaround for live midrolls SCTE-35 tags in Safari\n // @see https://github.schibsted.io/svp/platform/issues/328\n if (params.cancelAd === 'now' && device.isSafari()) {\n this.player.skipAd();\n }\n }\n },\n\n onPlay(data) {\n this.trigger('play', {\n playReason: data.playReason\n });\n },\n onPause(data) {\n utils.removeClass(this.getContainer(), 'jw-state-buffering');\n\n this.trigger('pause', data);\n },\n\n /**\n * Correct event flow for end of streaming\n */\n onComplete() {\n // wait until postroll will finish\n this.trigger('complete');\n }\n};\n\n/**\n * Extend player with events\n * Add methods from JW which are used without any rewriting\n */\nutils.extend(PlayerModel.prototype, utils.Events, forwardMethods.call(PlayerModel.prototype, [\n 'getCurrentCaptions'\n]));\n\n/* jshint newcap: false */\nexport default HomadAdsJw(PlayerModel);\n","import BackboneEvents from './backbone.events';\n\n/**\n * Simple syntactic sugar for easier extending objects with events\n */\nclass Eventable {}\nObject.assign(Eventable.prototype, BackboneEvents);\n\nexport default Eventable;","function copyProperties(target, source) {\n for (let key of Reflect.ownKeys(source)) {\n if (key !== \"constructor\" && key !== \"prototype\" && key !== \"name\") {\n let desc = Object.getOwnPropertyDescriptor(source, key);\n Object.defineProperty(target, key, desc);\n }\n }\n}\n\nfunction mix(...mixins) {\n class Mix {}\n\n // Programmatically add all the methods and accessors\n // of the mixins to class Mix.\n for (let mixin of mixins) {\n copyProperties(Mix, mixin);\n copyProperties(Mix.prototype, mixin.prototype);\n }\n\n return Mix;\n}\n\nexport {\n mix,\n copyProperties\n};\n","/* eslint-disable max-classes-per-file */\nimport Eventable from 'utils/eventable';\nimport { copyProperties } from 'utils/mixin';\n\nclass PluginModel extends Eventable {\n constructor(options) {\n super();\n\n this.player = null;\n this.el = null;\n\n if (typeof this.initialize === 'function') {\n this.initialize(options);\n }\n }\n\n // eslint-disable-next-line\n getName() {\n throw new Error('getName() method has to be implemented');\n }\n\n // eslint-disable-next-line\n initialize() {}\n // eslint-disable-next-line\n setup() {}\n // eslint-disable-next-line\n destroy() {}\n\n setPlayer(player) {\n this.player = player;\n this.setup(player);\n }\n}\n\nconst createClass = (plugin) => {\n class CustomPluginModel extends PluginModel {}\n copyProperties(CustomPluginModel.prototype, plugin);\n return CustomPluginModel;\n};\n\nexport {\n createClass\n};\n\nexport default PluginModel;\n","import scriptLoader from 'utils/script-loader';\nimport logger from 'utils/logger';\nimport { createClass as createPluginClass } from 'player/plugins/model';\n\nconst plugins = {};\n\nconst Plugins = {\n register(plugin) {\n const name = plugin.getName();\n\n // register the same plugin only once\n if (!plugins[name]) {\n plugins[name] = createPluginClass(plugin);\n }\n },\n\n load(options) {\n // no plugins provided, complete immediately\n if (!options) {\n // timeout for proper event listener fire\n return Promise.resolve();\n }\n\n const scripts = Object.keys(options);\n\n // do not change this to an arrow function - it breaks iOS playback\n async function loadPlugin(pluginSrc) {\n try {\n await scriptLoader(pluginSrc);\n } catch (error) {\n logger().error(`An error occur while loading ${pluginSrc}`);\n }\n\n return pluginSrc;\n }\n\n return Promise.all(scripts.map(loadPlugin));\n },\n\n get(name) {\n return plugins[name];\n }\n};\n\nexport default Plugins;\n","/* global apntag */\nimport config from 'player/config';\nimport utils from 'utils/utils';\nimport logger from 'utils/logger';\n\nexport default utils.extend({\n isLoaded: null,\n\n load() {\n if (window.apntag) {\n this.isLoaded = true;\n return Promise.resolve();\n }\n if (this.isLoaded === false) {\n // after loading fail we do not retry\n return Promise.reject({\n firstLoad: false\n });\n }\n\n // load this only once\n return utils.loadScript(config.ads.appnexus.ast).then(() => {\n // check if object really exist\n this.isLoaded = typeof window.apntag === 'object';\n }).catch((error) => {\n // appnexus can be blocked by adblock\n this.isLoaded = false;\n\n return Promise.reject({\n firstLoad: true,\n error\n });\n });\n },\n\n defineTag(tagId, tagOptions) {\n return this.load().then(() => {\n const tagConfig = utils.merge({\n targetId: tagId\n }, tagOptions);\n\n apntag.debug = config.ads.appnexus.debug;\n // apntag tag overriden by reference\n apntag.defineTag(utils.extend({}, tagConfig));\n\n apntag.loadTags([tagId]);\n apntag.onEvent('adLoaded', tagId, this.trigger.bind(this, 'adLoaded', tagId));\n }).catch((error) => {\n if (error.firstLoad) {\n logger('SVP').log('Could not load AST tag');\n }\n });\n },\n\n showTag(tagId) {\n if (this.isLoaded) {\n apntag.showTag(tagId);\n }\n },\n\n refreshTag(tagId) {\n if (this.isLoaded) {\n apntag.refresh([tagId]);\n }\n },\n\n resizeTag(tagId, dimmensions) {\n const size = [\n parseInt(dimmensions[0], 10),\n parseInt(dimmensions[1], 10)\n ];\n\n if (this.isLoaded) {\n apntag.resizeAd(tagId, size);\n }\n },\n\n off(targetId) {\n if (this.isLoaded) {\n apntag.offEvent('adLoaded', targetId);\n }\n }\n}, utils.Events);\n","import utils from 'utils/utils';\nimport closeIcon from 'icons/close.svg';\nimport appnexus from 'player/playback/ads/appnexus-ast';\nimport pauseTemplate from './pause.html';\nimport PluginModel from './model';\n\nclass PausePlugin extends PluginModel {\n constructor(options) {\n super(options);\n\n this.maxDisplays = -1;\n this.displayCounter = 0;\n }\n}\n/**\n * Check if ad is loaded\n *\n * @param sourceMethod\n * @returns {Function}\n */\nfunction withAdTag(sourceMethod) {\n // eslint-disable-next-line consistent-return\n return function () {\n if (this.adPlacement) {\n return sourceMethod.apply(this, Array.prototype.slice.call(arguments));\n }\n };\n}\n\nfunction withCounter(sourceMethod) {\n // eslint-disable-next-line consistent-return\n return function () {\n if (this.maxDisplays === -1 || this.displayCounter < this.maxDisplays) {\n return sourceMethod.apply(this, Array.prototype.slice.call(arguments));\n }\n };\n}\n\nutils.extend(PausePlugin.prototype, {\n counter: 0,\n getName() {\n return 'PausePlugin';\n },\n\n resizeAd: withAdTag(function (width, height) {\n let size = (width && height) ? [width, height] : null;\n\n if (!size) {\n size = this.player.getContainer().querySelector('.jw-wrapper').getBoundingClientRect();\n size = [size.width, size.height];\n }\n\n appnexus.resizeTag(this.containerId, size);\n }),\n\n load: withAdTag(function (appnexusAdId) {\n this.listenTo(appnexus, 'adLoaded', function (adId, adData) {\n // different adId\n if (appnexusAdId !== adId) {\n return;\n }\n\n this.resizeAd();\n utils.addClass(this.el, 'svp-pause-view--visible');\n\n this.trigger('adVisible', {\n adId,\n creativeId: adData.creativeId\n });\n\n this.isAdTagLoaded = true;\n }, this);\n\n appnexus.defineTag(\n appnexusAdId,\n this.adPlacement\n ).then(() => {\n appnexus.showTag(appnexusAdId);\n });\n }),\n\n show: withCounter(withAdTag(function (data) {\n const { pauseReason } = data;\n\n // undefined is returned on ie11 win7\n // settingsInteraction is triggered on mobile phones while using quality or share button\n if (pauseReason !== undefined && pauseReason !== 'external' && pauseReason !== 'settingsInteraction'\n && this.player.model.player.getViewable() === 1) {\n this.displayCounter += 1;\n\n if (this.isAdTagLoaded === true) {\n appnexus.refreshTag(this.containerId);\n } else {\n this.load(this.containerId);\n }\n }\n })),\n\n hide: withAdTag(function () {\n utils.removeClass(this.el, 'svp-pause-view--visible');\n }),\n\n /**\n * Fixing pause event triggered while interacting with scrub bar\n * @param data\n */\n onPause: withCounter(function (data) {\n let timerId = null;\n\n function onSeek() {\n if (timerId) {\n clearTimeout(timerId);\n timerId = null;\n }\n }\n\n timerId = setTimeout(() => {\n // cleanup seek listener when seek wasn't performed\n // eg regular pause button click\n this.stopListening(this.player.model, 'seek', onSeek);\n // display pause ad\n this.show(data);\n }, 50);\n\n // prevent to display pause ad when user seeked stream\n this.listenToOnce(this.player.model, 'seek', onSeek);\n }),\n\n onResumeClick() {\n this.player.play();\n utils.removeClass(this.el, 'svp-pause-view--visible');\n },\n\n setup() {\n PausePlugin.prototype.counter += 1;\n this.containerId = `svpPauseContainer${PausePlugin.prototype.counter}`;\n\n this.listenTo(this.player.model, 'playlistItem', function (item) {\n const { adPlacements } = item;\n\n if (adPlacements && adPlacements.pause) {\n // eslint-disable-next-line max-len\n this.maxDisplays = (typeof adPlacements.pause.maxDisplays === 'undefined') ? -1 : parseInt(adPlacements.pause.maxDisplays, 10);\n\n this.displayCounter = 0;\n this.render(adPlacements.pause);\n }\n }, this);\n\n this.listenTo(this.player.model, 'pause', this.onPause, this);\n this.listenTo(this.player, 'play', this.hide, this);\n },\n\n render(adTagOptions) {\n const appnexusAdContainerId = this.containerId;\n\n this.adPlacement = adTagOptions;\n this.el = utils.createNode(utils.template(pauseTemplate, {\n appnexusAdContainerId: appnexusAdContainerId,\n closeIcon: closeIcon\n }));\n\n const playButton = this.el.querySelector('.jw-icon-playback');\n const closeButton = this.el.querySelector('.svp-pause-close');\n\n if (playButton) {\n playButton.addEventListener('click', this.onResumeClick.bind(this), true);\n }\n\n if (closeButton) {\n closeButton.addEventListener('click', (event) => {\n event.stopPropagation();\n this.hide();\n }, true);\n }\n this.player.getContainer().querySelector('.jw-wrapper').appendChild(this.el);\n\n this.listenTo(this.player.model.player, 'resize', function (width, height) {\n if (this.player.getState() === 'paused') {\n this.resizeAd(width, height);\n }\n }, this);\n\n this.trigger('render');\n },\n\n destroy() {\n appnexus.off(this.containerId);\n\n this.stopListening(this.player);\n this.stopListening(this.player.model);\n this.stopListening(appnexus);\n\n this.adPlacement = null;\n this.isAdTagLoaded = false;\n\n if (this.el) {\n this.player.getContainer().querySelector('.jw-wrapper').removeChild(this.el);\n this.el = null;\n }\n }\n\n});\n\nexport default PausePlugin;\n","import utils from 'utils/utils';\nimport locale from 'player/model/locale';\nimport PluginModel from './model';\n\n/**\n * Displays Age Limit labels in player\n *\n * @param options\n * @constructor\n */\nclass AgeLimitPlugin extends PluginModel {\n constructor(options) {\n super(options);\n this.ageLimit = options.ageLimit;\n this.hideAfter = options.settings && options.settings.hideAfter != null ? options.settings.hideAfter : 3000;\n }\n\n // eslint-disable-next-line\n getName() {\n return 'AgeLimitPlugin';\n }\n\n setup() {\n this.listenToOnce(this.player, 'assetPlay', this.render, this);\n\n this.once('render', this.show, this);\n }\n\n render() {\n // return number when there is no translation available\n const ageLimit = locale.translate(`ageLimit-${this.ageLimit}`, this.ageLimit);\n\n this.el = utils.createNode(`
${ageLimit}
`);\n this.player.getContainer().appendChild(this.el);\n\n this.trigger('render');\n }\n\n destroy() {\n this.stopListening(this.player);\n\n if (this.el) {\n this.player.getContainer().removeChild(this.el);\n this.el = null;\n }\n }\n\n show () {\n if (this.ageLimit !== null) {\n utils.addClass(this.player.getContainer(), 'svp-display-age-limit');\n\n if (this.hideAfter) {\n this.listenToOnce(this.player, 'time', setTimeout.bind(null, this.hide.bind(this), this.hideAfter));\n }\n }\n }\n\n hide () {\n utils.removeClass(this.player.getContainer(), 'svp-display-age-limit');\n }\n}\n\nexport default AgeLimitPlugin;\n","import utils from 'utils/utils';\nimport locale from 'player/model/locale';\nimport PluginModel from './model';\n\n/**\n * Displays sponsor label in top left corner of player\n *\n * @param options\n * @constructor\n */\nclass SponsorLabelPlugin extends PluginModel {\n constructor(options) {\n super(options);\n this.sponsor = options.sponsor;\n this.pluginName = 'SponsorLabelPlugin';\n }\n\n getName() {\n return this.pluginName;\n }\n\n setup() {\n this.listenToOnce(this.player, 'viewable', this.render, this);\n }\n\n render() {\n const adFrom = locale.translate('Ad from');\n\n if (this.sponsor) {\n this.el = utils.createNode(`
${adFrom} ${this.sponsor}
`);\n this.player.getContainer().appendChild(this.el);\n }\n }\n\n destroy() {\n this.stopListening(this.player);\n\n if (this.el) {\n this.player.getContainer().removeChild(this.el);\n this.el = null;\n }\n }\n}\n\nexport default SponsorLabelPlugin;\n","import utils from 'utils/utils';\nimport logger from 'utils/logger';\nimport locale from 'player/model/locale';\nimport PluginModel from './model';\n\nconst SVP_FLAG_EXPERIMENT = 'svp-flag-experiment';\nconst SVP_FLAG_EXPERIMENT_EXTENDED = 'svp-flag-experiment-extended';\nconst SVP_LOGIN_OVERLAY = 'svp-login-overlay';\nconst SVP_EXPERIMENT = 'svp-experiment';\n\n/**\n * @param {String} actual\n * @param {String} expected\n */\nfunction assertUppercased(actual, expected) {\n return actual && actual.toUpperCase() === expected;\n}\n\nexport function chooseVariant(variants = {}, rangeNumber) {\n const winner = Object.values(variants)\n .reduce((prev, { id, Percentage }, index) => {\n const percentage = Number(Percentage);\n if (index) {\n return prev.concat({ id, min: prev[index - 1].max, max: prev[index - 1].max + percentage });\n }\n return [{ id, min: 0, max: percentage }];\n }, []).find(({ min, max }) => rangeNumber > min && rangeNumber < max);\n return winner && variants[winner.id];\n}\n\nexport function prepareVariantsForExperiment(metadata = {}) {\n const variantIds = metadata.variants && metadata.variants.split(',');\n const experimentMetadataKeys = Object.keys(metadata)\n .filter((key) => key.match(/^\\d+variant/g));\n\n return experimentMetadataKeys.reduce((prev, current) => {\n const [, id,, key] = /^(\\d+)(variant)(\\D+)/g.exec(current);\n if (variantIds.includes(id)) {\n prev[id] = Object.assign(prev[id] || {}, { id, [key]: metadata[current] });\n }\n return prev;\n }, {});\n}\n\n\nfunction isLoginVariantType(variant = {}) {\n return assertUppercased(variant.Type, 'LOGIN');\n}\n\nfunction isSubscriptionVariantType(variant = {}) {\n return assertUppercased(variant.Type, 'SUBSCRIPTION');\n}\n\nconst getUiElementId = (provider, articleUrl, assetId) => `sdrn:${provider}:article:${articleUrl}:element:${assetId}`;\n\nclass PodcastExperimentPlugin extends PluginModel {\n constructor({ id, variant }, { loginUrl, subscriptionUrl, articleUrl }) {\n super({ id, variant });\n this.id = id;\n this.variant = variant;\n this.loginUrl = loginUrl;\n this.subscriptionUrl = subscriptionUrl;\n this.articleUrl = articleUrl;\n this.pluginName = 'PodcastExperimentPlugin';\n }\n\n getName() {\n return this.pluginName;\n }\n\n setup() {\n logger('ExperimentPlugin').log('setup', this);\n this.listenToOnce(this.player, 'viewable', this.render, this);\n }\n\n /**\n * @returns {string}\n */\n getButtonText() {\n const { variant = {} } = this;\n const translate = locale.translate('player');\n\n if (variant.OfferButton) {\n return variant.OfferButton;\n }\n if (isLoginVariantType(variant)) {\n return translate.loginToListen;\n }\n if (isSubscriptionVariantType(variant)) {\n return translate.subscribeToListen;\n }\n return translate.listen;\n }\n\n render() {\n const {\n variant, loginUrl, subscriptionUrl, articleUrl, player\n } = this;\n const { id, provider } = player.asset.attributes;\n const jwPlayer = player.model.player;\n const useExtendedVariant = jwPlayer.getHeight() > 300;\n const container = jwPlayer.getContainer();\n const buttonText = this.getButtonText();\n const uiElementId = getUiElementId(provider, encodeURIComponent(articleUrl), id);\n const pulseStatsPlugin = player.plugins.PulseStats;\n\n function trackEngagement() {\n if (pulseStatsPlugin) {\n pulseStatsPlugin.track('Engagement podcast experiment', {\n provider: { productType: 'Web' },\n type: 'Engagement',\n object: { '@id': uiElementId, type: 'UIElement', name: buttonText }\n });\n }\n }\n\n if (pulseStatsPlugin) {\n pulseStatsPlugin.playbackEvents.once('Load', () => {\n pulseStatsPlugin.track('View podcast experiment', {\n provider: { productType: 'Web' },\n type: 'View',\n object: { '@id': uiElementId, type: 'UIElement', name: buttonText }\n });\n });\n }\n\n if (!variant) {\n player.once('initialPlay', () => {\n trackEngagement();\n });\n return;\n }\n\n const isOffer = assertUppercased(variant.Offer, 'TRUE');\n if (isOffer) {\n if (useExtendedVariant) {\n utils.addClass(container, SVP_FLAG_EXPERIMENT_EXTENDED);\n }\n utils.addClass(container, SVP_FLAG_EXPERIMENT);\n container.appendChild(\n utils.createNode(`\n
\n
\n ${variant.OfferHeader || ''}\n
\n
\n ${variant.OfferPreamble || ''}\n
\n
\n `)\n );\n }\n\n const redirectUrl = isLoginVariantType(variant) ? loginUrl : subscriptionUrl;\n container.appendChild(\n utils.createNode(`\n \n `)\n );\n }\n\n destroy() {\n this.stopListening(this.player);\n const jwPlayer = this.player.model.player;\n const container = jwPlayer.getContainer();\n\n utils.removeClass(container, SVP_FLAG_EXPERIMENT);\n utils.removeClass(container, SVP_FLAG_EXPERIMENT_EXTENDED);\n\n const experimentInfo = container.querySelector(`.${SVP_EXPERIMENT}`);\n if (experimentInfo) {\n experimentInfo.parentNode.removeChild(experimentInfo);\n }\n\n const experimentOverlay = container.querySelector(`.${SVP_LOGIN_OVERLAY}`);\n if (experimentOverlay) {\n experimentOverlay.parentNode.removeChild(experimentOverlay);\n }\n\n logger('ExperimentPlugin').log('destroy', this);\n }\n}\n\nexport default PodcastExperimentPlugin;\n","import utils from 'utils/utils';\nimport ServerTime from 'utils/server-time';\nimport config from 'player/config';\nimport locale from 'player/model/locale';\n\nimport countdownTemplate from './countdown.html';\nimport PluginModel from './model';\n\nconst PLAYLIST_REGENERATION_THRESHOLD = 5; // in seconds\n\n/**\n * Format number by adding leading zeros eg 7 -> 07\n *\n * @param numValue\n * @param numLen\n * @returns {string}\n */\nconst leadingZeros = (numValue, numLen) => {\n const length = numLen || 2;\n let num = String(numValue);\n\n while (num.length < length) {\n num = `0${num}`;\n }\n\n return num;\n};\n\n/**\n * Renders countdown clock for streams which are not published yet\n *\n * @param options\n * @constructor\n */\nclass CountdownPlugin extends PluginModel {\n constructor(options) {\n super(options);\n\n /**\n * Start date for stream (flightTime.start)\n * Javascript Date object\n */\n this.streamStart = options.streamStart;\n\n this.liveDOM = null;\n this.countdownDOM = null;\n\n this.isPlaylistRegenerated = false;\n }\n\n // eslint-disable-next-line\n getName() {\n return 'countdown';\n }\n\n setup() {\n this.listenTo(this.player, 'playlistItem', this.render, this);\n }\n\n /**\n * Cleanup old node\n */\n destroy() {\n this.stopListening(this.player);\n\n if (this.el) {\n this.player.getContainer().removeChild(this.el);\n this.el = null;\n }\n }\n\n /**\n * Render countdown\n */\n render() {\n try {\n this.player.getContainer();\n } catch (error) {\n return;\n }\n\n this.el = utils.createNode(utils.template(countdownTemplate));\n this.player.getContainer().appendChild(this.el);\n\n utils.addClass(this.player.getContainer(), 'svp-countdown-loaded');\n\n // cached live label dom element\n // eslint-disable-next-line prefer-destructuring\n this.liveDOM = this.el.getElementsByClassName('svp-live-label')[0];\n // eslint-disable-next-line prefer-destructuring\n this.countdownDOM = this.el.getElementsByClassName('svp-countdown-live-timer')[0];\n\n // countdown is ready\n this.trigger('ready');\n // start event runs on first change of countdown\n this.once('change', () => this.trigger('start'));\n\n // interval has to be initialized on\n this.intervalId = setInterval(() => this.refresh(), 1000);\n this.refresh();\n }\n\n /**\n * Refresh state and repaint\n */\n async refresh() {\n if (!this.diff) {\n this.diff = this.getDiff();\n }\n\n if (this.diff <= 0) {\n this.stop();\n }\n\n const string = [];\n\n if (this.isCountdownActive()) {\n const minutes = Math.floor(this.diff / 60) % 60;\n const seconds = this.diff % 60;\n\n string.push(`${leadingZeros(minutes)}:`);\n string.push(`${leadingZeros(seconds)}s`);\n\n if (this.currentState !== 'timer') {\n this.currentState = 'timer';\n this.liveDOM.innerHTML = locale.translate('Video will start in');\n\n utils.addClass(this.player.getContainer(), 'svp-countdown-active');\n }\n } else if (this.currentState !== 'date') {\n this.currentState = 'date';\n\n string.push(`${this.streamStart.getDate()}. ${locale.getMonthName(this.streamStart).toLowerCase()} `);\n string.push(`${leadingZeros(this.streamStart.getHours())}:`);\n string.push((leadingZeros(this.streamStart.getMinutes())));\n\n this.liveDOM.innerHTML = locale.translate('Video will start at');\n }\n\n if (string.length > 0) {\n this.countdownDOM.innerHTML = (string.join(''));\n this.trigger('change', this.streamStart);\n }\n\n // sync server time every 60s\n if (this.diff % 60 === 0) {\n await ServerTime.fetch(config.time);\n const newDiff = this.getDiff();\n if (Math.abs(newDiff - newDiff) > 1) {\n this.diff = newDiff;\n }\n }\n\n if (this.shouldRegeneratePlaylist()) {\n setTimeout(this.regeneratePlaylist.bind(this), 0);\n }\n\n this.diff -= 1;\n }\n\n shouldRegeneratePlaylist() {\n return this.player.model.getStream().isSecure()\n && this.diff <= PLAYLIST_REGENERATION_THRESHOLD\n && !this.isPlaylistRegenerated;\n }\n\n /**\n * Regenerate playlist to update tokens for secured streams\n * @return {Promise}\n */\n async regeneratePlaylist() {\n this.isPlaylistRegenerated = true;\n const { model } = this.player;\n const { playlist } = await model.getConfig();\n model.player.load(playlist);\n }\n\n /**\n * End of countdown\n */\n stop() {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n }\n\n this.intervalId = null;\n this.el.parentNode.removeChild(this.el);\n this.el = null;\n\n utils.removeClass(this.player.getContainer(), ['svp-countdown-active', 'svp-countdown-loaded']);\n\n this.trigger('end');\n }\n\n /**\n * Get difference between stream start and current server time\n * @returns {number}\n */\n getDiff() {\n return Math.ceil((this.streamStart.getTime() - ServerTime.getTime()) / 1000);\n }\n\n /**\n * Check whatever countdown or date should be displayed\n * Countdown is active when less than 1 hour reminded to start\n * @returns {boolean}\n */\n isCountdownActive() {\n // less than 1 hour\n return this.diff < 60 * 60 - 1;\n }\n}\n\nexport default CountdownPlugin;\n","import utils from 'utils/utils';\nimport image from 'utils/image';\nimport Recommended from 'player/model/recommended';\nimport closeIcon from 'icons/close.svg';\nimport nextIcon from 'icons/chevron-right.svg';\nimport recommendedTemplate from './recommended/recommended.html';\nimport nextAssetTemplate from './recommended/next-asset.html';\nimport gridTemplate from './recommended/grid.html';\nimport PluginModel from './model';\n\n/**\n * Play next asset from the list\n *\n * @param {number} assetId - SVP Asset id\n * @param {string} source - source of playnext (auto - when autoplay next, single, grid)\n */\nfunction playNext(assetId, source) {\n const clear = () => {\n utils.removeClass(this.el, ['is-grid-visible', 'is-next-visible', 'is-counting', 'is-next-closing']);\n };\n\n this.stopListening(this.player, 'complete');\n\n // autoplay of asset can be turned off from config\n if (this.settings.autoplay !== false) {\n this.player.playNext(assetId);\n }\n\n // nextAsset case, triggered by autoplay or user\n if (source === 'single' || source === 'auto') {\n this.trigger('nextAssetPlay', this.nextAsset, (source === 'auto') ? 'auto' : 'click', {\n source: this.nextAssetSource\n });\n\n utils.addClass(this.el, 'is-next-closing');\n setTimeout(clear, 700);\n } else {\n // grid click\n this.trigger('playRecommended', assetId);\n clear();\n }\n}\n\n/**\n * Turn off autoplay of recommended next asset\n */\nfunction disableNext() {\n this.trigger('nextAssetClose', this.nextAsset);\n this.nextAsset = null;\n utils.removeClass(this.el, 'is-next-visible is-counting is-next-visible');\n}\n\n/**\n * Retrieve full url for play next and grid assets thumbnails\n *\n * @param {string} key\n * @returns {string|null}\n */\nfunction getThumbnailUrl(key) {\n return image.getImageSrc(key, 'poster', 200);\n}\n\n/**\n * Add snap scroll for mobile grid\n */\nfunction initSnapScroll() {\n const scrollSnapPrefix = utils.getScrollSnapPrefix();\n const gridItem = this.getByClass('svp-player-recommended-item')[0];\n\n // check if snap points are supported\n if (scrollSnapPrefix !== false) {\n this.el.style[`${scrollSnapPrefix}scroll-snap-type`] = 'mandatory';\n this.el.style[`${scrollSnapPrefix}scroll-snap-points-x`] = `repeat(${gridItem.clientWidth}px)`;\n }\n}\n\n/**\n * Click handler for recommended grid\n *\n * @param {HTMLElement} node\n */\nfunction onGridItemClicked(node) {\n utils.addClass(node, 'svp-to-active');\n\n this.listenToOnce(this.player, 'assetPlay', function() {\n utils.removeClass(this.player.getContainer(), 'is-recommended-grid-visible');\n }, this);\n\n setTimeout(() => {\n playNext.call(this, parseInt(node.dataset.id, 10), 'grid');\n utils.removeClass(this.el, 'is-grid-visible');\n }, 500);\n}\n\n/**\n * Fetch recommended assets when player is ready\n */\nfunction onPlaybackStart() {\n const recommended = new Recommended({\n asset: this.player.getAsset()\n });\n\n // restore default state for each new asset\n this.gridItemsReady = false;\n\n // turn off option for grid\n if (this.settings.grid !== false) {\n recommended.getItems().then((items) => {\n if (utils.isArray(items) && items.length > 0) {\n this.gridItemsReady = true;\n this.trigger('gridItemsReady', items);\n } else {\n utils.removeClass(this.player.getContainer(), 'is-recommended-grid-visible');\n }\n }).catch(() => {\n try {\n utils.removeClass(this.player.getContainer(), 'is-recommended-grid-visible');\n } catch (e) {\n // player container not available\n }\n });\n }\n\n // next asset is available by default but can be turned off\n if (this.settings.next !== false) {\n if (this.nextAsset) {\n this.trigger('nextAssetReady', this.nextAsset, {\n source: this.nextAssetSource\n });\n return;\n }\n\n recommended.getNextAsset(this.settings.next).then(({ nextAsset, source }) => {\n this.nextAsset = nextAsset;\n this.nextAssetSource = source;\n\n this.trigger('nextAssetReady', this.nextAsset, {\n source\n });\n }).catch(() => {\n if (this.el) {\n utils.removeClass(this.el, ['is-next-visible', 'is-counting', 'is-next-closing']);\n }\n });\n }\n}\n\n/**\n * Initialize lazy fetching\n */\nfunction onInitialize() {\n // fetch recommended 5s before countdown time\n let fetchDuration = this.player.getDuration() - this.countdownTime - 5;\n\n // for streams shorter than 15s load next in 2s\n if (fetchDuration < 0) {\n fetchDuration = 2;\n }\n const stream = this.player.model.getStream();\n const isLive = stream.isLive();\n const isDisabledNextVideo = stream.isDisabledNextVideo();\n const hasPlaylist = stream.hasPlaylist();\n const isAssetFromPlaylist = this.player.model.isAssetFromPlaylist(stream.getId());\n\n // do not enable recommended for live streams and asset with metadata.disableNextVideo set to true\n if (!isLive && !isDisabledNextVideo && !hasPlaylist && !isAssetFromPlaylist) {\n this.listenTo(this.player, 'time', function (time) {\n if (fetchDuration > 0 && time > fetchDuration) {\n fetchDuration = -1;\n onPlaybackStart.call(this);\n }\n }, this);\n }\n}\n\n/**\n * Handler for stream end (countdown end) event\n * Stream complete can't be used due to circular events triggering\n * @param {string} reason\n */\nfunction onPlaybackComplete(reason) {\n const stream = this.player.model.getStream();\n const isAssetFromPlaylist = this.player.model.isAssetFromPlaylist(stream.getId());\n\n // do not take any action if complete is triggered by playNext\n if (\n stream.hasPlaylist()\n || isAssetFromPlaylist\n || reason === 'manualNext'\n || reason === 'stop'\n ) {\n return;\n }\n\n if (this.nextAsset) {\n this.trigger('nextAssetComplete', this.nextAsset);\n playNext.call(this, this.nextAsset.get('id'), 'auto');\n } else if (this.gridItemsReady) {\n // display grid only when items are available\n utils.addClass(this.el, 'is-grid-visible');\n utils.addClass(this.player.getContainer(), 'is-recommended-grid-visible');\n\n initSnapScroll.call(this);\n this.trigger('gridVisible');\n }\n}\n\n/**\n * Handler for checking time in which playNext should be available\n * @param {number} time\n * @param {number} duration\n */\nfunction onTimeNextVisible(time, duration) {\n if (duration - time < this.countdownTime) {\n this.trigger('playNextVisible', Math.floor(duration - time));\n }\n}\n\n/**\n * Display play next in given time\n *\n * @param {number} timeout - duration of countdown\n */\nfunction onPlayNextVisible(timeout) {\n // Don't present play next for audio assets as it isn't prepared\n const asset = this.player.getAsset();\n if (asset.isAudio()) {\n return;\n }\n\n utils.addClass(this.el, 'is-next-visible is-counting');\n\n this.stopListening(this.player, 'time', onTimeNextVisible);\n // update transition duration as it may be smaller than default due to seek\n this.getByClass('svp-player-recommended-countdown')[0].style.transitionDuration = `${timeout}s`;\n}\n\n/**\n * Handler triggered when nextAsset is available for current stream\n */\nfunction onNextAssetReady() {\n const img = new Image();\n // prefetch image\n img.src = getThumbnailUrl(this.nextAsset.getThumbnail());\n\n this.listenTo(this.player, 'time', onTimeNextVisible, this);\n\n this.getByClass('svp-player-recommended-next')[0].innerHTML = utils.template(nextAssetTemplate, {\n next: this.nextAsset,\n countdown: this.countdownTime, // default countdown\n getThumbnail: getThumbnailUrl,\n closeIcon: closeIcon,\n nextIcon: nextIcon\n });\n\n this.getByClass('svp-player-recommended-image')[0]\n .addEventListener('click', playNext.bind(this, this.nextAsset.get('id'), 'single'));\n\n this.getByClass('svp-player-recommended-close')[0]\n .addEventListener('click', disableNext.bind(this));\n}\n\n/**\n * Triggered when grid items are available\n * @param {Asset[]} recommended\n */\nfunction onGridItemsReady(recommended) {\n this.getByClass('svp-player-recommended-grid')[0].innerHTML = utils.template(gridTemplate, {\n recommended: recommended,\n getThumbnail: getThumbnailUrl,\n utils: utils\n });\n\n utils.each(this.getByClass('svp-player-recommended-item'), (item) => {\n item.addEventListener('click', onGridItemClicked.bind(this, item));\n });\n}\n\n/**\n * Triggered when recommended grid is displayed\n */\nfunction onGridVisible() {\n // replay asset triggers play\n // clicking on grid not intersects with this\n this.listenToOnce(this.player, 'play', this.trigger.bind(this, 'assetReplay'));\n}\n\n/**\n * Event fired when user decided to restart video\n */\nfunction onAssetReplay() {\n // attach events to allow again display of grid\n this.setup();\n // cleanup state\n utils.removeClass(this.player.getContainer(), 'is-recommended-grid-visible');\n utils.removeClass(this.el, ['is-grid-visible', 'is-next-visible', 'is-counting', 'is-next-closing']);\n}\n\n\n/**\n * Renders countdown clock for streams which are not published yet\n *\n * @param options\n * @constructor\n */\nclass RecommendedPlugin extends PluginModel {\n constructor(options) {\n super(options);\n\n // time in seconds from end of stream\n this.countdownTime = (options.settings && options.settings.next && options.settings.next.countdown) || 10;\n this.nextAsset = null;\n this.settings = utils.extend({\n grid: true,\n next: {}\n }, options.settings);\n\n // check if grid items are available\n this.gridItemsReady = false;\n }\n\n // eslint-disable-next-line\n getName() {\n return 'RecommendedPlugin';\n }\n\n setup() {\n // assetPlay\n this.stopListening(this.player);\n this.listenToOnce(this.player, 'assetPlay', this.render, this);\n this.listenToOnce(this.player, 'assetPlay', onInitialize, this);\n this.listenToOnce(this.player, 'complete', onPlaybackComplete, this);\n\n\n this.once('playNextVisible', onPlayNextVisible, this);\n this.once('nextAssetReady', onNextAssetReady, this);\n this.once('gridItemsReady', onGridItemsReady, this);\n this.once('gridVisible', onGridVisible, this);\n this.once('assetReplay', onAssetReplay, this);\n }\n\n /**\n * Get current element child node by class name\n *\n * @param className\n * @returns {NodeList|*}\n */\n getByClass(className) {\n return this.el.getElementsByClassName(className);\n }\n\n /**\n * Render default view holder for play next and recommended\n *\n */\n render() {\n const container = this.player.getContainer();\n const previousEl = container.getElementsByClassName('svp-player-recommended-box');\n\n // clean if previously grid was displayed\n utils.removeClass(this.player.getContainer(), 'is-recommended-grid-visible');\n\n // cleanup old element\n // recommended is \"async\" so it can't be destroyed like normal plugin\n if (previousEl.length > 0) {\n container.removeChild(previousEl[0]);\n }\n\n this.el = utils.createNode(utils.template(recommendedTemplate));\n\n container.appendChild(this.el);\n }\n}\n\nexport default RecommendedPlugin;\n","import utils from 'utils/utils';\n\nconst ClickTracker = {\n vendor: null,\n\n mode: 'TRACK',\n url: '//click.vgnett.no/svp.gif?s=',\n\n /**\n * Track media event\n *\n * @param data\n */\n trackMediaEvent(data) {\n const query = [];\n\n query.push(`d=${this.getDeviceType()}`);\n query.push(`v=${data.assetId}`);\n\n this.sendRequest('media', query.join('&'));\n },\n\n /**\n * Track playback events in certain time\n *\n * @param data\n */\n trackStreamEvent(data) {\n const query = [];\n\n query.push(`d=${this.getDeviceType()}`);\n query.push(`v=${data.assetId}`);\n query.push(`p=${data.time}`);\n\n // randomize request time for avoiding api peaks\n setTimeout(this.sendRequest.bind(this, 'stream', query.join('&')), Math.floor((Math.random() * 100) + 1));\n },\n\n /**\n * Send API request using 1x1px image\n *\n * @param type\n * @param queryString\n */\n sendRequest(type, queryString) {\n const image = new Image();\n const apiUrl = this.getApiUrl(type);\n const hypen = apiUrl.indexOf('?') > -1 ? '&' : '?';\n\n // track only if tracker is initialized\n if (this.vendor) {\n if (this.mode === 'LOG') {\n // eslint-disable-next-line no-console\n console.log('SVP STATS: ', [\n queryString,\n `${apiUrl + hypen + queryString}&cb=${Math.random() * 10000}`\n ]);\n }\n\n image.src = `${apiUrl + hypen + queryString}&cb=${Math.random() * 10000}`;\n }\n\n return image;\n },\n\n /**\n * Return full API endpoint url\n *\n * @returns {string}\n */\n getApiUrl(type) {\n if (this.vendor === 'vgtv' && type === 'media') {\n return '//click.vgnett.no/vgtv.gif';\n }\n\n return this.url + this.vendor;\n },\n\n /**\n * Tracking is divided by device type\n *\n * @returns {*}\n */\n getDeviceType() {\n if (utils.device.isTablet()) {\n return 'tablet';\n }\n\n if (utils.device.isMobile()) {\n return 'mobile';\n }\n\n return 'desktop';\n }\n};\n\nexport default ClickTracker;\n","import ClickTracker from './svp-stats/tracker';\nimport PluginModel from './model';\n\n/**\n * Seconds intervals for tracking\n * @returns {number}\n */\nfunction getTrackingInterval(duration) {\n // if duration is not set then do not track it\n if (duration > 0) {\n // for streams shorter than 250s tracking interval is 5seconds\n if (duration < 250) {\n return 5;\n }\n\n // otherwise it's every 2% of stream\n return Math.floor(duration * 0.02);\n }\n\n return -1;\n}\n\n\n/**\n * Basic SVP statistics tool\n *\n * @param options\n * @constructor\n */\nclass SvpStatsPlugin extends PluginModel {\n constructor(options) {\n super(options);\n\n this.env = options.env;\n this.vendor = options.vendor;\n this.mode = options.mode;\n }\n\n // eslint-disable-next-line\n getName() {\n return 'SvpStatsPlugin';\n }\n\n setup() {\n // stats can be turned off only on non production env\n if (this.mode === 'OFF' && this.env !== 'production') {\n return;\n }\n\n ClickTracker.mode = this.mode;\n ClickTracker.vendor = this.vendor;\n\n this.listenTo(this.player, 'assetPlay', function (startTime) {\n const asset = this.player.getAsset();\n const assetId = asset.get('id');\n const duration = this.player.getDuration();\n const trackingInterval = getTrackingInterval(duration);\n\n let initialStartTime = startTime || -1;\n let currentTime = -1;\n\n ClickTracker.trackMediaEvent({\n assetId: assetId\n });\n\n // tracking interval maybe invalid when stream is live or do not have proper duration\n if (trackingInterval > 0 && asset.get('streamType') !== 'live') {\n // assetPlay prevents from sending events when it has start time\n this.listenTo(this.player, 'time', (playerTime) => {\n const time = Math.floor(playerTime);\n\n // engagement tracking\n if (time !== currentTime && time % trackingInterval === 0 && time > initialStartTime) {\n currentTime = time;\n // reset start time counter for tracking seek before start point in indexed stream\n initialStartTime = -1;\n\n // prevent requests outside stream size\n if (time > -1 && time <= duration) {\n ClickTracker.trackStreamEvent({\n assetId: assetId,\n time: time\n });\n }\n }\n });\n }\n });\n\n this.listenTo(this.player, 'adSlotStart', function (adSlot) {\n if (adSlot.position === 'preroll') {\n ClickTracker.trackStreamEvent({\n assetId: this.player.getAsset().get('id'),\n time: -1\n });\n }\n });\n\n this.listenTo(this.player, 'adSlotComplete', function (adSlot) {\n if (adSlot.position === 'preroll') {\n ClickTracker.trackStreamEvent({\n assetId: this.player.getAsset().get('id'),\n time: -2\n });\n }\n });\n }\n\n destroy() {\n ClickTracker.vendor = null;\n this.stopListening(this.player);\n }\n}\n\n\nexport default SvpStatsPlugin;\n","import scriptLoader from 'utils/script-loader';\n\nconst TRACKER_ID = 'svp-tracker';\n\nconst PulseTrackerLoader = {\n request: null,\n\n trackers: {},\n\n /**\n * Load pulse library only once per page\n *\n * @returns {null}\n */\n load() {\n if (!this.request) {\n if (!window.pulse) {\n // a global pulse object has to be present to avoid autoloader errors\n window.pulse = window.pulse || function() {\n window.pulse.q = window.pulse.q || [];\n window.pulse.q.push(arguments);\n };\n\n this.request = scriptLoader('//sdk.pulse.schibsted.com/pulse.min.js');\n } else {\n // pulse is already available\n this.request = Promise.resolve();\n }\n }\n\n return this.request;\n },\n\n init(provider) {\n return this.load()\n .then(() => this.getTracker(provider))\n .then((storedTracker) => {\n const PROVIDER_TRACKER_ID = `${TRACKER_ID}-${provider}`;\n\n // initialize pulse only once per page per provider\n if (!storedTracker) {\n // we need to name the tracker to avoid tracking conflicts when embedding the player\n window.pulse('init', provider, null, null, PROVIDER_TRACKER_ID);\n\n const promise = new Promise((resolve) => {\n window.pulse(PROVIDER_TRACKER_ID, (tracker) => resolve(tracker));\n });\n\n PulseTrackerLoader.trackers[provider] = promise;\n\n return promise;\n }\n\n return storedTracker;\n });\n },\n\n getTracker(provider) {\n return PulseTrackerLoader.trackers[provider] || Promise.resolve(null);\n }\n};\n\nexport default PulseTrackerLoader;\n","/**\n * Returns true when custom interval is set to false, null or 0\n * @param customInterval\n * @return {boolean}\n */\nexport function isCustomIntervalFalsy(customInterval) {\n return customInterval !== undefined && !customInterval;\n}\n","import Eventable from 'utils/eventable';\nimport get from 'lodash/get';\nimport { isCustomIntervalFalsy } from './helpers';\n\n/**\n * Parse SVP Player events and tailor data to pulse requirements\n *\n * Available events: Play, Pause, Stop, Watch\n */\nclass AdEvents extends Eventable {\n constructor(player, options) {\n super();\n this.player = player;\n this.progressInterval = get(options, 'adInterval');\n this.previousProgressPosition = 0;\n this.adData = {};\n this.adSequencePosition = 0;\n this.adSequenceCount = 0;\n this.beforeUnload = ['onpagehide' in window.self\n ? 'pagehide' : 'beforeunload', this.onAdSlotComplete.bind(this), true];\n\n this.listenTo(this.player, 'playlistItem', this.onPlaylistItem, this);\n this.listenTo(this.player, 'adSlotStart', this.onAdSlotStart, this);\n this.listenTo(this.player, 'adStarted', this.onAdStarted, this);\n this.listenTo(this.player, 'adProgress', this.onAdProgress, this);\n this.listenTo(this.player, 'adSlotComplete', this.onAdSlotComplete, this);\n this.listenTo(this.player, 'adFinished', this.onAdFinished, this);\n\n this.listenTo(this.player, 'adPause', this.onAdPause, this);\n this.listenTo(this.player, 'adPlay', this.onAdPlay, this);\n\n this.listenTo(this.player, 'PausePlugin:adVisible', this.onPauseAdVisible, this);\n\n if (get(window, ['SVP', 'Player', 'isHomadLoaded']) === true) {\n window.addEventListener('hdEvent', this.onHomadEvent.bind(this));\n }\n\n window.addEventListener(...this.beforeUnload);\n }\n\n /**\n * Homad AAB ads have single event bus for all players\n *\n * @param event\n */\n onHomadEvent(event) {\n const details = event && event.detail;\n\n if (details.type === 'adRequest' && details.adIds) {\n this.adSequencePosition = 0;\n }\n\n if (details.type === 'adComplete' && details.adIds) {\n this.onAdFinished();\n }\n\n if (details.type === 'adStart' && details.adIds) {\n if (!this.adSequencePosition) {\n this.adSequenceCount = details.adIds.length;\n }\n\n this.adSequencePosition += 1;\n this.adIds = [...details.adIds];\n const { adID } = this.adIds[this.adIds.length - 1];\n\n Object.assign(this.adData, {\n type: details.state,\n duration: details.duration,\n id: adID,\n sequence: this.adSequencePosition,\n count: this.adSequenceCount,\n position: 0\n });\n\n this.trigger('homadAdMeta', this.adData);\n\n return this.onAdPlay();\n }\n\n return false;\n }\n\n onPlaylistItem() {\n this.adSequencePosition = 0;\n this.adSequenceCount = 0;\n this.listenToOnce(this.player, 'complete', this.onAdSlotComplete, this);\n this.listenTo(this.player.model.player, 'adImpression', (adData) => {\n Object.assign(this.adData, {\n duration: Math.round(adData.duration)\n });\n });\n }\n\n onHdEvent(event) {\n if (event && event.detail && event.detail.name === 'contentPlayerPlay') {\n this.abbAdPlayed = true;\n\n this.trigger('Play', Object.assign(this.eventData, {\n start: true,\n duration: 0\n }));\n return window.removeEventListener('hdEvent', this.onHdEvent);\n }\n return false;\n }\n\n onAdSlotStart(slotData) {\n Object.assign(this.adData, {\n type: slotData.position\n });\n }\n\n onAdStarted() {\n this.previousProgressPosition = 0;\n\n Object.assign(this.adData, {\n start: true\n });\n\n this.listenToOnce(this.player.model.player, 'adMeta', (adData) => {\n let adId = null;\n\n try {\n const adXml = adData.response.querySelectorAll('Ad')[adData.sequence - 1];\n adId = adXml.id;\n } catch (e) {\n // could not find Ad element\n }\n\n Object.assign(this.adData, {\n id: adId,\n sequence: adData.sequence,\n count: adData.podcount,\n position: 0\n });\n });\n }\n\n onAdProgress(time) {\n if (!this.adData.id) {\n return;\n }\n\n const position = Math.floor(time);\n const previousPosition = this.adData.position;\n\n Object.assign(this.adData, {\n position\n });\n\n // skip when custom interval is turned off\n if (isCustomIntervalFalsy(this.progressInterval)) {\n return;\n }\n\n // skip when no custom interval provided and position is the same as previousPosition\n if (previousPosition === position && !this.progressInterval) {\n return;\n }\n\n // skip when custom interval provided isn't valid and position is the same as previousPosition\n if (previousPosition === position\n || (this.progressInterval && position - this.previousProgressPosition < this.progressInterval)) {\n return;\n }\n\n this.previousProgressPosition = position;\n this.trigger('Watch', this.adData);\n }\n\n onAdSlotComplete() {\n this.sendStopEvent();\n window.removeEventListener(...this.beforeUnload);\n }\n\n onAdFinished() {\n this.sendStopEvent();\n }\n\n onAdPlay() {\n this.trigger('Play', this.adData);\n // start indicates first play of ad\n this.adData.start = false;\n }\n\n onAdPause() {\n this.trigger('Pause', this.adData);\n }\n\n onPauseAdVisible(data) {\n this.trigger('View', {\n id: data.creativeId,\n type: 'Pausead'\n });\n }\n\n sendStopEvent() {\n if (this.adData.id) {\n this.trigger('Stop', Object.assign({}, this.adData, { duration: this.adData.position }));\n this.adData = {};\n }\n }\n\n destroy() {\n window.removeEventListener(...this.beforeUnload);\n this.stopListening();\n }\n}\n\nexport default AdEvents;\n","export default {};\n","import Eventable from 'utils/eventable';\nimport utils from 'utils/utils';\nimport get from 'lodash/get';\nimport session from './session';\nimport { isCustomIntervalFalsy } from './helpers';\n\n/**\n * Parse SVP Player events and tailor data to pulse requirements\n *\n * Available events: Play, Pause, Stop, Watch\n */\nclass PlaybackEvents extends Eventable {\n constructor(player, options) {\n super();\n this.player = player;\n this.watchData = {\n time: 0,\n duration: -1\n };\n this.isHomadLoaded = get(window, ['SVP', 'Player', 'isHomadLoaded']);\n\n this.previousTime = -1;\n\n this.session = this.createSession();\n this.beforeStreamStart = true;\n this.abbAdPlayed = false;\n this.beforeUnload = ['onpagehide' in window.self\n ? 'pagehide' : 'beforeunload', this.onBeforeUnload.bind(this), true];\n this.playMethod = null;\n\n this.vodInterval = get(options, 'vodInterval');\n this.liveInterval = get(options, 'liveInterval');\n\n this.listenTo(this.player, 'playlistItem', this.onPlaylistItem, this);\n this.listenTo(this.player, 'assetPlay', this.onAssetPlay, this);\n this.listenTo(this.player, 'pause', this.onPause, this);\n this.listenTo(this.player, 'play', this.onPlay, this);\n this.listenTo(this.player, 'playNext', this.onPlayNext, this);\n\n if (this.stream.isLive()) {\n this.listenTo(this.player, 'time', this.onLiveTime, this);\n } else {\n this.listenTo(this.player, 'time', this.onTime, this);\n }\n\n this.listenTo(this.player, 'RecommendedPlugin:nextAssetPlay', (asset, mode, opts) => {\n let playbackSource = mode === 'auto' ? 'autoplayNext' : 'manualNext';\n if (opts.source && opts.source !== 'byId') {\n playbackSource += `-${opts.source}`;\n }\n return this.onRecommendedPlay(playbackSource);\n });\n\n this.listenTo(this.player, 'nextAutoAdvance', () => (\n this.onRecommendedPlay('autoplayNext-playlist')\n ));\n\n this.listenTo(this.player, 'nextClick', () => (\n this.onRecommendedPlay('manualNext-playlist')\n ));\n\n this.listenTo(this.player, 'relatedReady', () => {\n if (!this.jwRelatedPlugin) {\n return;\n }\n this.jwRelatedPlugin.on('feedClick', () => {\n this.beforeStreamStart = false;\n this.onComplete();\n this.onRecommendedPlay('manualNext-playlist');\n });\n });\n\n this.listenTo(this.player, 'playlistComplete', () => {\n this.listenToOnce(this.player, 'displayClick', () => (\n this.onRecommendedPlay('manualNext-playlist')\n ));\n });\n\n this.listenTo(this.player, 'RecommendedPlugin:playRecommended', () => {\n this.onRecommendedPlay('manualNext-grid');\n });\n\n this.listenToOnce(this.player, 'play', ({ playReason }) => {\n this.playMethod = playReason;\n });\n\n window.addEventListener(...this.beforeUnload);\n }\n\n get eventData() {\n const data = {\n playMethod: this.playMethod\n };\n const { previousAssetId } = this.session;\n\n if (previousAssetId) {\n data.previousAssetId = previousAssetId;\n data.playbackSource = this.session.playbackSource;\n }\n\n data.duration = this.watchData.duration;\n\n try {\n data.position = Math.floor(this.player.getCurrentTime());\n } catch (e) {\n // could not parse time\n // do not set any value in this case\n }\n\n return data;\n }\n\n get stream() {\n try {\n return this.player.config.stream || {};\n } catch (e) {\n return {};\n }\n }\n\n get jw() {\n try {\n return this.player.model.player || {};\n } catch (e) {\n return {};\n }\n }\n\n get jwRelatedPlugin() {\n try {\n return this.jw.getPlugin('related') || null;\n } catch (e) {\n return null;\n }\n }\n\n getPosition() {\n try {\n return Math.floor(this.player.getCurrentTime());\n } catch (e) {\n return 0;\n }\n }\n\n createSession() {\n // node is unique player identifier\n const node = this.player.config.get('node');\n const id = node.id || node;\n\n /**\n * Initialize session object to keep reference\n */\n if (!session[id]) {\n session[id] = {};\n }\n\n return session[id];\n }\n\n trackTimeEvent(time, defaultInterval = 1, customInterval) {\n const eventInterval = utils.isNumber(customInterval) ? customInterval : defaultInterval;\n\n // track event data with one second interval\n if (time % 1 === 0 && this.previousTime !== time) {\n this.watchData.duration += 1;\n this.previousTime = time;\n }\n\n if (time % eventInterval === 0 && this.watchData.time !== time) {\n this.watchData.time = time;\n\n // skip when custom interval is turned off\n if (isCustomIntervalFalsy(customInterval)) {\n return;\n }\n\n this.trigger('Watch', Object.assign(this.eventData, {\n position: time\n }));\n }\n }\n\n onBeforeUnload() {\n if (this.beforeStreamStart === false) {\n this.onComplete();\n }\n }\n\n onPlaylistItem() {\n this.listenToOnce(this.player, 'complete nextClick', this.onComplete, this);\n const track = this.trigger.bind(this, 'Load', Object.assign(this.eventData, {\n position: this.stream.getPlaybackTime('begin') || 0,\n duration: 0\n }));\n\n /**\n * Only first playback has to wait for viewable event\n * Playnext/grid will work without it\n */\n if (this.session.wasViewed === true) {\n track();\n } else {\n // wait for player to be viewable\n this.listenTo(this.player.model.player, 'viewable', (data) => {\n if (data.viewable) {\n track();\n this.stopListening(this.player.model.player, 'viewable');\n this.session.wasViewed = true;\n }\n });\n }\n\n this.previousAssetId = null;\n }\n\n onHdEvent(event) {\n if (event && event.detail && event.detail.name === 'contentPlayerPlay') {\n this.abbAdPlayed = true;\n\n this.trigger('Play', Object.assign(this.eventData, {\n start: true,\n duration: 0\n }));\n return window.removeEventListener('hdEvent', this.onHdEvent);\n }\n return false;\n }\n\n onAssetPlay() {\n if (this.isHomadLoaded && !this.abbAdPlayed) {\n return window.addEventListener('hdEvent', this.onHdEvent.bind(this));\n }\n\n this.beforeStreamStart = false;\n\n return this.trigger('Play', Object.assign(this.eventData, {\n start: true,\n duration: 0\n }));\n }\n\n onPause() {\n // pause can't be triggered before ABB adPlay\n if (!(this.isHomadLoaded && !this.abbAdPlayed)) {\n this.trigger('Pause', this.eventData);\n }\n }\n\n onPlay() {\n // play can't be triggered before assetPlay\n if (!this.beforeStreamStart) {\n this.trigger('Play', this.eventData);\n }\n }\n\n /**\n * Intervals for VOD are defined as follow\n *\n * every 1s - during the first 10 seconds of content playback (no matter of where playback has started\n * every 5s - for rest of content playback, after seeking intervals should be triggered in same time\n * seek 42, then first trigger should be in 45\n */\n onTime(eventTime) {\n const time = Math.floor(eventTime);\n const eventInterval = time > 10 ? 5 : 1;\n\n this.trackTimeEvent(time, eventInterval, this.vodInterval);\n }\n\n /**\n * Track live events by checking time from flight time to current date\n * DVR seek is also included in calculations\n */\n onLiveTime() {\n // after playback stars time to start will be negative\n // add DVR shift from playback\n const eventTime = Math.floor((this.stream.getTimeToStart() * -1) + this.jw.getPosition());\n // constant tracking interval\n this.trackTimeEvent(eventTime, 5, this.liveInterval);\n }\n\n onComplete(reason) {\n if (reason === 'manualNext') {\n this.onRecommendedPlay('manualNext');\n }\n\n /**\n * Track stop event only when playback has started\n */\n if (this.beforeStreamStart === false) {\n this.trigger('Stop', this.eventData);\n // store asset id in memory to attach it to play next video\n this.session.previousAssetId = this.stream.getId();\n }\n this.beforeStreamStart = true;\n }\n\n /**\n * @param {Number} id\n * @param {Object} [options]\n * @param {Object} [options.pulse]\n * @param {String} [options.source] - A source that will be added as a playback source for pulse metrics\n */\n onPlayNext(id, options) {\n if (options && options.pulse) {\n Object.assign(this.session, options.pulse);\n }\n }\n\n onRecommendedPlay(playbackSource) {\n this.session.playbackSource = playbackSource;\n }\n\n destroy() {\n window.removeEventListener(...this.beforeUnload);\n this.stopListening();\n }\n}\n\nexport default PlaybackEvents;\n","import Eventable from 'utils/eventable';\n\n/**\n * Parse SVP Player events and tailor data to pulse requirements\n *\n * Available events: Play, Pause, Stop, Watch\n */\nclass UiEvents extends Eventable {\n constructor(player) {\n super();\n this.player = player;\n this.listenTo(this.player, 'ready', this.onReady, this);\n\n this.listenTo(\n this.player,\n 'RecommendedPlugin:playNextVisible',\n this.onRecommendedVisible,\n this\n );\n\n this.listenTo(this.player, 'nextShown', this.onRecommendedVisible, this);\n }\n\n onRecommendedVisible(event) {\n if (event.ui === 'nextup') {\n this.trigger('UiElement', {\n id: this.player.getAsset().get('id'),\n name: 'nextAssetCountdown'\n });\n }\n }\n\n destroy() {\n this.stopListening();\n }\n}\n\nexport default UiEvents;\n","import config from 'player/config';\n\nclass CategoryTree {\n constructor(vendor) {\n this.vendor = vendor;\n }\n\n fetch() {\n if (!this.request) {\n this.request = fetch(config.api.getUrl(this.vendor, '/categories'))\n .then((response) => response.json())\n .then((response) => {\n // eslint-disable-next-line\n if (response && response._embedded.categories) {\n // eslint-disable-next-line\n return response._embedded.categories;\n }\n\n return [];\n })\n .then((categories) => {\n this.categories = new Map(categories.map((category) => [category.id, category]));\n });\n }\n return this.request;\n }\n\n getPath(categoryId) {\n const path = [];\n let category = this.categories.get(categoryId);\n\n if (category) {\n path.push(category);\n\n while (category.parentId !== 0) {\n category = this.categories.get(category.parentId);\n path.unshift(category);\n }\n }\n\n return path;\n }\n}\n\n\nconst instances = {};\n\nexport default (vendor) => {\n if (!instances[vendor]) {\n instances[vendor] = new CategoryTree(vendor);\n }\n\n return instances[vendor];\n};\n","import { capitalizeFirstLetter } from 'utils/string';\nimport logger from 'utils/logger';\nimport get from 'lodash/get';\nimport pick from 'lodash/pick';\nimport isObject from 'lodash/isObject';\nimport isEmpty from 'lodash/isEmpty';\nimport configuration from 'player/config';\nimport PluginModel from './model';\nimport PulseTracker from './pulse-stats/tracker';\nimport AdEvents from './pulse-stats/ad-events';\nimport PlaybackEvents from './pulse-stats/playback-events';\nimport UiEvents from './pulse-stats/ui-events';\nimport CategoryTree from '../model/category-tree';\nimport utils from '../../utils/utils';\n\n/**\n * Retrieve tags from asset\n * @param asset\n */\nconst getTags = (asset) => (asset.get('tags') || [])\n .filter((tag) => isObject(tag) || !isEmpty(tag.tag))\n .map(({ tag }) => tag);\n\n/**\n * Get array of plan3 stories ids\n *\n * @param asset\n * @returns {*|Array}\n */\nconst getStories = (asset) => (asset.get('stories') || []);\n\nexport const getMediaAssetId = (provider, mediaId) => `sdrn:${provider}:mediaasset:${mediaId}`;\n\n/**\n * Integration with Pulse Tracker\n * https://github.schibsted.io/spt-dataanalytics/pulse-autotracker\n *\n * @param options\n * @constructor\n */\nclass PulseStatsPlugin extends PluginModel {\n constructor(options, experiment) {\n super(options);\n this.provider = options.provider;\n this.decorator = options.decorator || ((data) => data);\n this.intervals = pick(options.engagementIntervals, 'ad', 'live', 'vod');\n this.embed = options.embed === true;\n this.previousAssetId = options.previousAssetId;\n this.tracker = null;\n this.experiment = experiment;\n this.adSequenceDuration = false;\n this.isHomadLoaded = (utils.device.isDesktop() && get(window, ['SVP', 'Player', 'defaults', 'aab']))\n ? get(window, ['SVP', 'Player', 'isHomadLoaded'], false)\n : undefined;\n }\n // eslint-disable-next-line\n getName() {\n return 'PulseStats';\n }\n\n get jw() {\n try {\n return this.player.model.player || {};\n } catch (e) {\n return {};\n }\n }\n\n get asset() {\n const asset = this.playerAsset;\n const additional = asset.get('additional') || {};\n const accessControl = Object.keys(additional.access || {});\n const tags = getTags(asset);\n const stories = getStories(asset);\n\n const data = {\n assetType: asset.get('assetType') === 'video' ? 'Video' : 'Audio',\n title: asset.get('title'),\n // duration should be in seconds\n duration: Math.round(asset.get('duration') / 1000)\n };\n\n if (accessControl.length > 0) {\n data.accessControl = accessControl.join(',');\n }\n\n if (tags.length > 0) {\n data.tags = tags;\n }\n\n if (stories.length > 0) {\n // disable stories until there is not id->title translation\n // data.stories = stories;\n }\n\n // check if stream has category\n if (asset.getCategory()) {\n data.category = asset.getCategory().get('id');\n }\n\n // delete duration from live assets\n if (asset.get('streamType') === 'live') {\n delete data.duration;\n }\n\n if (additional.originAssetId) {\n data.originAssetId = additional.originAssetId;\n }\n\n return data;\n }\n\n get apiUrl() {\n const { url } = configuration.api;\n const asset = this.playerAsset;\n const protocol = !url.startsWith('http') ? 'https:' : '';\n return `${protocol}${url}${asset.getVendor()}/assets/${asset.get('id')}?appName=linkpulse`;\n }\n\n getCategoryPath(categoryId) {\n if (typeof categoryId !== 'number') {\n return null;\n }\n\n // check if id exist and create category path\n if (!this.categoryPath) {\n this.categoryPath = this.categoryTree.getPath(categoryId)\n .map((category) => (category.title.toLowerCase()))\n .join(' > ');\n }\n\n return this.categoryPath;\n }\n\n /**\n * Track Pulse event\n * Defer tracking when Pulse library is not loaded yet\n */\n async track(eventName, eventData) {\n const tracker = await this.getTracker();\n const data = {};\n Object.assign(data, eventData, this.experiment && {\n experiments: [{\n id: this.experiment.id,\n variant: this.experiment.variant ? this.experiment.variant.id : '0',\n platform: this.provider\n }]\n });\n logger('Pulse').log(JSON.stringify(data, null, 4));\n tracker.track(eventName, data);\n }\n\n async trackMediaEvent(data) {\n try {\n await this.categoryTree.fetch();\n\n // category data is available on ready event\n const categoryPath = this.getCategoryPath(data.object.category);\n\n if (categoryPath) {\n // eslint-disable-next-line\n data.object.category = categoryPath;\n }\n await this.track('engagementEvent', this.decorator(data, this.playerAsset));\n } catch (e) {\n // nothing to do\n logger('Pulse').log('Could not track event');\n }\n }\n\n getTracker() {\n return new Promise((resolve) => {\n const resolveTracker = () => resolve(this.tracker);\n\n if (this.tracker === null) {\n this.once('ready', resolveTracker);\n } else {\n resolveTracker();\n }\n });\n }\n\n setup() {\n // prevent asset to be changed with playnext before stream completes\n this.playerAsset = this.player.getAsset();\n\n this.categoryTree = CategoryTree(this.playerAsset.getVendor());\n\n this.adEvents = new AdEvents(this.player, {\n adInterval: this.intervals.ad\n });\n this.playbackEvents = new PlaybackEvents(this.player, {\n vodInterval: this.intervals.vod,\n liveInterval: this.intervals.live\n });\n this.uiEvents = new UiEvents(this.player);\n\n // initialize only once\n Promise.all([\n PulseTracker.init(this.provider),\n this.categoryTree.fetch()\n ]).then((data) => this.onReady(data));\n\n this.listenTo(this.adEvents, 'all', this.onAdEvent, this);\n this.listenTo(this.playbackEvents, 'all', this.onPlaybackEvent, this);\n this.listenTo(this.uiEvents, 'all', this.onUiEvent, this);\n this.listenTo(this.player, 'adStarted', () => {\n this.listenToOnce(this.player.model.player, 'adMeta', this.onAdMeta);\n });\n this.listenTo(this.adEvents, 'homadAdMeta', this.onHomadAdMeta, this);\n // eslint-disable-next-line no-return-assign\n this.listenTo(this.player, 'playlistItem', () => this.adSequenceDuration = false);\n }\n\n onReady(data) {\n const [tracker] = data;\n\n this.tracker = tracker;\n this.trigger('ready');\n this.listenTo(this.adEvents, 'adStarted');\n }\n\n onHomadAdMeta(adData) {\n if (!this.adSequenceDuration) {\n this.adSequenceDuration = Array(adData.count);\n }\n\n // skip midroll and postroll\n if (adData.type !== 'preroll') {\n return;\n }\n\n this.adSequenceDuration[adData.sequence - 1] = adData.duration;\n this.adSequenceCount = this.adSequenceDuration.length;\n }\n\n onAdMeta(adData) {\n if (!this.adSequenceDuration) {\n this.adSequenceDuration = Array(adData.podcount);\n }\n\n // skip midroll and postroll\n if (get(adData, 'adschedule.offset') !== 'pre') {\n return;\n }\n\n const { textContent: duration } = adData.response\n .querySelector(`Ad:nth-of-type(${adData.sequence}) InLine Creatives Linear Duration`) || {};\n if (duration) {\n this.adSequenceDuration[adData.sequence - 1] = utils.time.durationToSeconds(duration);\n }\n }\n\n onPlaybackEvent(intent, data = {}) {\n const asset = this.playerAsset;\n const { config } = this.player;\n\n /**\n * Autoplay is not set for load method thus we use value set in player constructor\n * For other events method of playback start is checked\n * Autoplay is set to true when player actually autostarts or when its started with external call (.play())\n */\n const trackingData = {\n intent,\n '@type': 'Engagement',\n position: data.position,\n // duration is in ms\n duration: data.duration * 1000,\n object: Object.assign({\n '@id': getMediaAssetId(this.provider, asset.get('id')),\n '@type': 'MediaAsset',\n name: asset.getTitle(),\n muted: this.jw.getMute(),\n fullscreen: this.jw.getFullscreen(),\n autoplay: data.playMethod === null\n ? (config.get('autoplay') === true)\n : (data.playMethod === 'autostart' || data.playMethod === 'external'),\n adSequenceCount: data.count,\n embed: this.embed,\n streamType: asset.get('streamType'),\n adblock: this.isHomadLoaded,\n apiUrl: this.apiUrl\n }, this.asset)\n };\n\n if (this.adSequenceDuration) {\n trackingData.object.adSequenceDuration = this.adSequenceDuration;\n trackingData.object.adSequenceCount = this.adSequenceDuration.length;\n }\n\n if (data.start === true) {\n trackingData.start = true;\n }\n\n if (data.previousAssetId) {\n trackingData.object.previousAssetId = getMediaAssetId(this.provider, data.previousAssetId);\n trackingData.object.playbackSource = data.playbackSource;\n } else if (this.previousAssetId) {\n trackingData.object.previousAssetId = getMediaAssetId(this.provider, this.previousAssetId);\n trackingData.object.playbackSource = 'config';\n }\n\n this.trackMediaEvent(trackingData);\n }\n\n onAdEvent(intent, data) {\n // do not track homadAdMeta events\n if (intent === 'homadAdMeta') {\n return false;\n }\n\n const asset = this.playerAsset;\n const trackingData = {\n intent,\n '@type': 'Engagement',\n position: data.position,\n // position and duration are equal because ads does not allow to seek through content\n // duration is in ms\n duration: data.position && data.position * 1000,\n object: {\n '@id': `sdrn:${this.provider}:mediaad:${data.id}`,\n '@type': 'MediaAd',\n assetType: capitalizeFirstLetter(data.type),\n muted: this.jw.getMute(),\n fullscreen: this.jw.getFullscreen(),\n mediaAssetId: getMediaAssetId(this.provider, asset.get('id')),\n adSequenceCount: data.count,\n adblock: this.isHomadLoaded,\n apiUrl: this.apiUrl\n }\n };\n\n if (this.adSequenceDuration) {\n trackingData.object.adSequenceDuration = this.adSequenceDuration;\n trackingData.object.adSequenceCount = this.adSequenceDuration.length;\n }\n\n if (data.sequence) {\n trackingData.object.adSequencePosition = data.sequence;\n }\n\n if (data.duration) {\n trackingData.object.duration = data.duration;\n }\n\n if (data.start === true) {\n trackingData.start = true;\n }\n\n if (asset.getCategory()) {\n trackingData.object.category = this.categoryTree.getPath(asset.getCategory().attributes.id)\n .map((i) => i.title)\n .join(' > ')\n .toLocaleLowerCase();\n }\n\n return this.trackMediaEvent(trackingData);\n }\n\n async onUiEvent(eventName, data) {\n const trackingData = {\n '@type': 'View',\n object: Object.assign(data, {\n '@id': getMediaAssetId(this.provider, data.id),\n '@type': 'UIElement',\n apiUrl: this.apiUrl\n })\n };\n\n this.track('viewEvent', trackingData);\n }\n\n destroy() {\n this.stopListening();\n\n this.adEvents.destroy();\n this.playbackEvents.destroy();\n }\n}\n\nexport default PulseStatsPlugin;\n","import utils from 'utils/utils';\nimport locale from 'player/model/locale';\nimport PluginModel from './model';\n\nconst SVP_FLAG_NATIVE_LINK = 'svp-flag-native-link';\nconst SVP_NATIVE_LINK_OVERLAY = 'svp-native-link-overlay';\nconst SVP_NATIVE_LINK_BUTTON = 'svp-native-link-button';\nconst SVP_LOGIN_OVERLAY = 'svp-login-overlay';\n\n/**\n * Allowing using native link for playing podcasts on hermes apps\n *\n * @param options\n * @constructor\n */\nclass PodcastNativeLinkPlugin extends PluginModel {\n constructor(options) {\n super(options);\n this.link = null;\n }\n\n // eslint-disable-next-line\n getName() {\n return 'PodcastNativeLinkPlugin';\n }\n\n setup() {\n const asset = this.player.getAsset();\n\n if (utils.device.isHermesApp()) {\n if (utils.device.isIOS()) {\n this.link = `audio:${asset.getVendor()}:${asset.get('id')}`;\n } else if (utils.device.isAndroid()) {\n // TODO: Android support\n }\n }\n\n this.listenToOnce(this.player, 'viewable', this.render, this);\n }\n\n render() {\n if (!this.link) {\n return;\n }\n\n const translations = locale.getTranslations();\n const container = this.player.getContainer();\n\n // do not show when there is login overlay\n const loginOverlay = container.querySelector(`.${SVP_LOGIN_OVERLAY}`);\n if (loginOverlay) {\n return;\n }\n\n // Native link has unsupported format and cannot be created using JW utils.createElement\n // @see https://github.schibsted.io/svp/web-player/issues/1003\n const linkAnchor = document.createElement('a');\n const linkSpan = document.createElement('span');\n linkSpan.classList.add(SVP_NATIVE_LINK_BUTTON);\n linkSpan.appendChild(document.createTextNode(translations.player.listen));\n linkAnchor.appendChild(linkSpan);\n linkAnchor.classList.add(SVP_NATIVE_LINK_OVERLAY);\n linkAnchor.setAttribute('href', this.link);\n\n this.el = linkAnchor;\n\n utils.addClass(container, SVP_FLAG_NATIVE_LINK);\n container.appendChild(this.el);\n }\n\n destroy() {\n if (this.el) {\n const container = this.player.getContainer();\n\n utils.removeClass(container, SVP_FLAG_NATIVE_LINK);\n\n const overlay = container.querySelector(`.${SVP_NATIVE_LINK_OVERLAY}`);\n if (overlay) {\n overlay.parentNode.removeChild(overlay);\n }\n }\n }\n}\n\nexport default PodcastNativeLinkPlugin;\n","import utils from 'utils/utils';\nimport logger from 'utils/logger';\nimport ServerTime from 'utils/server-time';\nimport config from 'player/config';\nimport errorIcon from 'icons/error.svg';\nimport Asset from './model/asset';\nimport Recommended from './model/recommended';\nimport NextAsset from './model/next-asset';\nimport Stream from './model/stream';\nimport locale from './model/locale';\nimport Config from './playback/config';\nimport Provider from './playback/provider';\nimport { APPNEXUS_PROVIDER_ID } from './services/api';\nimport assetService from './services/api/asset';\nimport Domain from './model/domain';\nimport SvpPlugins from './plugins';\nimport PausePlugin from './plugins/pause';\nimport AgeLimitPlugin from './plugins/age-limit';\nimport SponsorLabelPlugin from './plugins/sponsor-label';\nimport PodcastExperimentPlugin, { prepareVariantsForExperiment, chooseVariant } from './plugins/podcast-experiment';\nimport CountdownPlugin from './plugins/countdown';\nimport RecommendedPlugin from './plugins/recommended';\nimport SvpStatsPlugin from './plugins/svp-stats';\nimport PulseTracker from './plugins/pulse-stats/tracker';\nimport PulseStatsPlugin from './plugins/pulse-stats';\nimport PodcastNativeLinkPlugin from './plugins/podcast-native-link';\n\nimport statusCode, { NOT_FOUND, GENERAL_ERROR, NOT_ACTIVE } from './playback/config/status-codes';\n\n/**\n * Remove single plugin instance\n * Clear all listeners\n * Remove from plugins hashmap\n *\n * @param {PluginModel} plugin\n */\nfunction destroyPlugin(plugin) {\n if (plugin.off) {\n plugin.off();\n }\n plugin.destroy();\n\n this.stopListening(plugin);\n delete this.plugins[plugin.getName()];\n}\n\n\n/**\n * Clear error message\n * @param {HTMLElement} node\n */\nfunction clearError(node) {\n const previousErrorNode = node.getElementsByClassName('svp-player-error-wrapper');\n\n // clear old node\n if (previousErrorNode.length > 0) {\n utils.removeClass(node, ['svp-player-error', 'svp-player-error-hasImage']);\n\n if (previousErrorNode[0].parentNode) {\n previousErrorNode[0].parentNode.removeChild(previousErrorNode[0]);\n }\n }\n}\n\n/**\n * Display error message in given node\n * @param node\n * @param message\n * @param code\n */\nfunction displayError(node, message, code = null) {\n let template = `
${errorIcon}${message}`;\n\n if (code) {\n template += `
${locale.translate('Error code')}: ${code}
`;\n }\n\n template += '
';\n\n const posterSrc = this.model && this.model.getStream() && this.model.getPoster(this.model.getStream(), node);\n\n clearError(node);\n utils.addClass(node, 'svp-player-error');\n\n // add image\n if (posterSrc) {\n utils.addClass(node, 'svp-player-error-hasImage');\n template += `
`;\n }\n\n const errorNode = utils.createNode(`
${template}
`);\n\n node.appendChild(errorNode);\n\n this.once('complete', function () {\n utils.removeClass(node, ['svp-player-error', 'svp-player-error-hasImage']);\n\n if (errorNode.parentNode) {\n errorNode.parentNode.removeChild(errorNode);\n }\n }, this);\n}\n\n/**\n * Display error message\n *\n * @param {Error} [details]\n */\nfunction onError(details) {\n logger('SVP').error(details);\n const node = document.getElementById(this.config.get('node'));\n const { code, message } = details || {};\n\n let translatedMessage = locale.translate(message);\n\n // translation not found\n if (translatedMessage === message) {\n translatedMessage = locale.translate(statusCode(GENERAL_ERROR));\n }\n\n // details - message in english\n // message - localized, displayed message\n const errorDetails = {\n code,\n details: message,\n message: translatedMessage\n };\n\n if (details.type) {\n errorDetails.type = details.type;\n }\n\n displayError.call(this, node, translatedMessage, code);\n\n if (this.model.player) {\n this.model.player.stop();\n }\n\n this.trigger('error', errorDetails);\n}\n\n/**\n * @param {Object} playlistItem\n * @param {number} playlistItem.id\n */\nfunction playNextFromPlaylist(playlistItem) {\n const { asset } = this;\n const { masterAsset } = this.model;\n\n if (!asset || !masterAsset || asset.get('id') === playlistItem.id) {\n return;\n }\n\n const nextAssetData = masterAsset.get('id') === playlistItem.id\n ? utils.extend({}, masterAsset.attributes)\n : masterAsset.get('playlist').find((assetData) => assetData.id === playlistItem.id);\n\n if (!nextAssetData) {\n return;\n }\n\n this.setAsset(nextAssetData);\n}\n\n/**\n * Player initialized and single playlistItem is laoded\n * @param {Object} playlistItem\n */\nfunction onPlaylistItem(playlistItem) {\n const container = this.getContainer();\n // add class for live streams\n\n utils.removeClass(container, 'svp-player-live');\n\n if (this.model.getStream().isLive()) {\n utils.addClass(container, 'svp-player-live');\n // add translation for live button via data-label\n container.getElementsByClassName('jw-icon-display')[0]\n .setAttribute('data-label', locale.translate('Live button'));\n }\n\n playNextFromPlaylist.call(this, playlistItem);\n\n this.trigger('playlistItem');\n}\n\n/**\n * Stream completed, fired for every item in playlist\n * Clear settings which are only for one stream\n */\nfunction onComplete(reason) {\n if (!this.isCompleted) {\n this.isCompleted = true;\n\n this.config.set('time', null);\n this.config.set('chapter', null);\n\n this.trigger('complete', reason);\n }\n}\n\n/**\n * Proxy player events\n */\nfunction onPlayerEvent(event, ...args) {\n let callFunction;\n\n switch (event) {\n case 'playlistItem':\n callFunction = onPlaylistItem.bind(this, ...args);\n break;\n case 'complete':\n callFunction = onComplete.bind(this, ...args);\n break;\n case 'error':\n callFunction = onError.bind(this, ...args);\n break;\n default:\n callFunction = this.trigger.bind(this, event, ...args);\n }\n\n callFunction();\n}\n\n/**\n * @param {Object} options - Caution, param is bound in constructor\n * @param {Object} settings\n */\nfunction onceConfigReady(options, settings) {\n this.model = new Provider(this.config);\n\n // important listeners has to be attached before setup\n this.listenTo(this.model, 'all', onPlayerEvent, this);\n\n this.listenTo(this.model, 'play', function () {\n this.isCompleted = false;\n }, this);\n\n // turn on cachebreaker for preview mode\n if (settings && settings.preview === true) {\n config.api.cb = true;\n }\n\n // once per player instance error append stylesheet\n this.once('error', function () {\n utils.addStyleSheet(this.config.get('skin').url);\n }, this);\n\n Promise.all([\n new Promise((resolve) => {\n const handleReady = () => {\n resolve();\n this.off('assetError', handleError); // eslint-disable-line no-use-before-define\n };\n\n const handleError = (error) => {\n resolve(error);\n this.off('assetError', handleReady);\n };\n\n this.once('assetReady', handleReady);\n this.once('assetError', handleError);\n }),\n SvpPlugins.load(options.plugins)\n ]).then(([error]) => {\n utils.each(options.plugins, (pluginConfig, plugin) => {\n const Plugin = SvpPlugins.get(pluginConfig.name || plugin);\n\n if (Plugin) {\n // support for new loading method\n this.addPlugin(new Plugin(pluginConfig.config || pluginConfig));\n }\n });\n\n if (!error) {\n this.model.setup();\n }\n });\n\n // asset can be passed as id or an object\n this.setAsset((options.asset || options.id));\n}\n\n/**\n * this always points to Player object\n */\nfunction onAssetReady() {\n const { config: configuration } = this;\n\n const stream = new Stream(this.asset.attributes);\n const settings = configuration.getSettings();\n const node = document.getElementById(configuration.get('node'));\n const hasPlaylist = stream.hasPlaylist();\n\n if (node) {\n clearError(node);\n }\n\n const isAssetFromPlaylist = this.model.isAssetFromPlaylist(stream.getId());\n\n if (!isAssetFromPlaylist) {\n const masterAsset = hasPlaylist ? new Asset(utils.extend({}, this.asset.attributes)) : null;\n this.model.setMasterAsset(masterAsset);\n }\n\n // add hasNext checking\n stream.set(\n 'hasNext',\n !hasPlaylist || !isAssetFromPlaylist || !stream.isDisabledNextVideo() || NextAsset.hasPlayNext(this.asset)\n );\n\n if (this.asset.get('access')) {\n const access = Object.keys(this.asset.get('access'))[0] || null;\n stream.set('access', access);\n }\n\n configuration.setStream(stream);\n\n // cleanup plugins as they maybe not required for new stream\n utils.each(this.plugins, destroyPlugin, this);\n\n // set start time if chapter is provided (not applicable for playlists)\n if (!hasPlaylist && !isAssetFromPlaylist && configuration.get('chapter')) {\n const chapter = this.asset.getChapter(configuration.get('chapter'));\n\n if (chapter) {\n stream.set('playAhead', chapter.timeline);\n }\n }\n\n // set playahead time\n if (!isAssetFromPlaylist && configuration.get('time')) {\n stream.set('playAhead', configuration.get('time'));\n }\n\n if (configuration.hasRecommended()) {\n this.addPlugin(new RecommendedPlugin({\n settings: configuration.getRecommended()\n }));\n }\n\n // stream is not available yet, display countdown\n if (stream.getTimeToStart() > 0) {\n // countdown is disable in preview mode on non live streams\n if (settings.preview !== true || stream.isLive()) {\n this.addPlugin(new CountdownPlugin({\n streamStart: new Date((ServerTime.getTime()) + stream.getTimeToStart() * 1000)\n }));\n\n // play stream after countdown ends\n this.on('countdown:end', this.play, this);\n }\n }\n\n if (this.asset.getAgeLimit() > -1) {\n this.addPlugin(new AgeLimitPlugin({\n ageLimit: this.asset.getAgeLimit(),\n settings: configuration.getAgeLimit()\n }));\n }\n\n if (configuration.get('showSponsorLabel') && this.asset.isSponsored()) {\n this.addPlugin(new SponsorLabelPlugin({\n sponsor: this.asset.getCategoryTitle()\n }));\n }\n\n const metadata = this.asset.get('metadata') || {};\n const userStatus = configuration.get('userStatus') || {};\n\n let experiment;\n let isExperiment;\n // do not load an experiment feature when the player is in preview mode\n const isPodcastWithExperiment = settings.preview !== true && metadata.experimentId && metadata.isPodcast === 'true';\n\n if (isPodcastWithExperiment) {\n try {\n let experimentRange = JSON.parse(sessionStorage.getItem('svpExperimentRange'));\n if (!experimentRange) {\n experimentRange = Math.random() * 100;\n sessionStorage.setItem('svpExperimentRange', JSON.stringify(experimentRange));\n }\n experiment = {\n id: metadata.experimentId,\n variant: chooseVariant(prepareVariantsForExperiment(metadata), experimentRange)\n };\n\n if (userStatus.loggedIn && !userStatus.hasProduct && experiment.variant.Type === 'Subscription') {\n isExperiment = true;\n } else if (userStatus.loggedIn) {\n isExperiment = false;\n } else {\n isExperiment = true;\n }\n\n if (isExperiment) {\n this.addPlugin(new PodcastExperimentPlugin(experiment,\n {\n loginUrl: configuration.get('loginUrl'),\n subscriptionUrl: configuration.get('subscriptionUrl'),\n articleUrl: configuration.get('articleUrl')\n }));\n }\n } catch (error) {\n logger('ExperimentPlugin').error('An error occur while initializing experiment', error);\n }\n }\n\n\n /**\n * Disable Pulse tracking for mock/ads only playback\n */\n\n const pulseConfig = configuration.get('pulse');\n if (pulseConfig && pulseConfig.provider && stream.isMock() === false) {\n this.addPlugin(new PulseStatsPlugin(pulseConfig, isExperiment ? experiment : null));\n }\n\n /**\n * Disable SVP Stats for mock\n */\n if (stream.isMock() === false) {\n this.addPlugin(new SvpStatsPlugin({\n vendor: configuration.get('vendor'),\n mode: configuration.get('stats'),\n env: configuration.get('env')\n }));\n }\n\n this.addPlugin(new PausePlugin());\n\n if (stream.isPodcast() && configuration.get('nativeLink') !== false) {\n this.addPlugin(new PodcastNativeLinkPlugin());\n }\n\n // set stream to display error\n this.model.setStream(stream);\n\n configuration.isStreamPlayable().then(() => {\n // restart asset state\n // this.isCompleted = false;\n this.trigger('assetReady');\n }).catch((code) => {\n this.trigger('assetError', {\n message: statusCode(code),\n code\n });\n\n onError.call(this, {\n type: 'assetError',\n // message is translated in next functions\n message: statusCode(code),\n code\n });\n });\n}\n\n/**\n * Asset fetch failed. Usually happens when network issue occurred\n * @param {Error} error\n */\nfunction onAssetError(error) {\n let code = GENERAL_ERROR;\n\n if (error) {\n if (error.status === 404) {\n code = NOT_FOUND;\n } else if (error.status === 401) {\n code = NOT_ACTIVE;\n }\n }\n\n const details = {\n message: statusCode(code),\n code\n };\n\n this.trigger('assetError', details);\n\n // load stylesheet as player is not attached\n onError.call(this, Object.assign({\n type: 'assetFetchError'\n }, details));\n\n logger('SVP').error('error', error);\n\n // display errors in development mode\n if (config.env === 'development') {\n throw error;\n }\n}\n\nconst Player = function (configuration) {\n const options = Object.assign({}, configuration);\n\n // Little bit of monkey patching\n config.api.vendor = options.vendor || 'vgtv';\n config.env = (config.env === 'production') ? 'production' : (options.env || config.env || 'production');\n\n // Restrict player on blacklisted domains\n if (Domain.isBlacklisted(options.vendor)) {\n return;\n }\n\n logger('SVP').log('config', utils.extend({}, options));\n\n /**\n * Allow to embed player without asset\n * This can be useful for preloading player\n * Appnexus vendor is for displaying ads only playback\n */\n if (options.vendor === APPNEXUS_PROVIDER_ID || options.id === -1) {\n options.asset = assetService.getMockAsset();\n delete options.id;\n }\n\n // load locales for player\n // norwegian by default\n if (typeof options.locale === 'string') {\n locale.setTranslations(config.translations(options.locale));\n }\n\n // bind player api to pass it as last argument in adn function\n if (options.adn) {\n options.adn.svpPlayer = this;\n }\n\n // create configuration for SVP player\n this.config = new Config();\n this.listenToOnce(this.config, 'ready', onceConfigReady, this);\n\n this.config.initialize(options);\n\n // set dynamic api url\n if (options.api) {\n config.api.url = options.api;\n }\n\n // set dynamic related api url\n if (options.relatedUrl) {\n config.api.relatedApiUrl = options.relatedUrl;\n }\n\n // allow to override token api url\n if (options.tokenUrl) {\n config.api.tokenUrl = options.tokenUrl;\n } else if (options.api) {\n config.api.tokenUrl = options.api.replace('api/v1/', 'token/v1/');\n }\n\n // allow to override thumbnails api url\n if (options.thumbnailsUrl) {\n config.api.thumbnailsUrl = options.thumbnailsUrl;\n } else if (options.api) {\n config.api.thumbnailsUrl = options.api.replace('api/v1', 'thumbnails/v1');\n }\n\n if (options.vmapUrl) {\n config.api.vmapUrl = options.vmapUrl;\n }\n\n /**\n * Available plugins\n * PausePlugin, EndposterPlugin, ChaptersPlugin, ContinuePlayingPlugin\n *\n * Plugins registered by default (can not be removed)\n * CountdownPlugin, AgeLimitPlugin\n * @type {Object}\n */\n this.plugins = {};\n\n /**\n * Check if stream has completed playback\n * @type {boolean}\n */\n this.isCompleted = false;\n\n this.isPlayNextAvailable = true;\n\n // sync browser time with server\n if (!options.serverTime) {\n ServerTime.fetch(config.time);\n }\n\n // fetch config for privileged settings to speedup setup\n if (options.settings) {\n Domain.fetch(options.vendor);\n }\n\n /**\n * Prefetch Pulse tracking library\n */\n if (options.pulse && options.pulse.provider) {\n PulseTracker.load();\n }\n\n logger('SVP').log(function (message) {\n this.on('all', function (event) {\n message(event, Array.prototype.slice.call(arguments, 1));\n });\n }.bind(this));\n};\n\n/**\n * Player public API\n */\nPlayer.prototype = {\n /**\n * Play\n * @param position - seconds (int)\n */\n play(position) {\n // stream will play only if publication date is valid\n const stream = this.model.getStream();\n if (stream.getTimeToStart() < 0 && !stream.isPast()) {\n if (position) {\n this.once('play', this.seek.bind(this, position));\n }\n\n this.model.play();\n }\n },\n\n /**\n * Pause playback\n * @param force - toggle playback when param is omitted\n */\n pause(force) {\n // pause with force can start stream which is wrong\n if (this.model.getStream().getTimeToStart() < 0) {\n this.model.pause(!force);\n }\n },\n\n /**\n * Seek in seconds\n * @param time\n */\n seek(time) {\n this.model.seek(time);\n },\n\n /**\n * Destroy the player instance, reset DOM, clean up listeners\n */\n remove() {\n this.stopListening();\n\n if (this.model) {\n this.model.remove();\n }\n },\n\n /**\n * Play next asset by given id\n *\n * @param {number} id\n * @param {Object} [options]\n * @param {Object} [options.pulse]\n * @param {number} [options.time]\n * @param {boolean} [options.disableAutoplay]\n */\n playNext(id, options = {}) {\n const onNextAssetReady = function () {\n const stream = this.model.getStream();\n const { disableAutoplay, time } = options;\n\n if (time) {\n stream.set('playAhead', time);\n }\n\n // trick to avoid create of new stream as it's set in assetReady\n this.model.playNext(stream, { disableAutoplay });\n this.isPlayNextAvailable = true;\n }.bind(this);\n\n if (this.isPlayNextAvailable) {\n const reason = (options.pulse && options.pulse.playbackSource) || 'manualNext';\n // complete current stream\n onComplete.call(this, reason);\n\n // block multiple occurences\n this.isPlayNextAvailable = false;\n\n this.once('assetReady', onNextAssetReady, this);\n\n this.once('assetError', function () {\n if (this.model && this.model.player) {\n this.pause();\n }\n\n this.isPlayNextAvailable = true;\n this.off('assetReady', onNextAssetReady);\n }, this);\n\n // trigger play next always after complete to keep event order the same\n // for videos which completed or has been interrupted with play next\n this.trigger('playNext', id, options);\n this.setAsset(id);\n }\n },\n\n /**\n * Set playback volume\n *\n * @param volume - number between 0 and 100\n */\n setVolume(volume) {\n this.model.setVolume(volume);\n },\n\n /**\n * Get playback volume\n * @returns {*}\n */\n getVolume() {\n return this.model.getVolume();\n },\n\n /**\n * Set mute value for playback\n * Toggling this param will preserve volume value\n *\n * @param value\n */\n setMute(value = true) {\n this.model.setMute(value);\n },\n\n /**\n * Get playback volume\n * @returns {*}\n */\n getMute() {\n return this.model.getMute();\n },\n\n /**\n * Get player state\n */\n getState() {\n return this.model.getState();\n },\n\n /**\n * Get stream duration\n *\n * @returns {*}\n */\n getDuration() {\n return this.model.getDuration();\n },\n\n /**\n * Get current playback time\n */\n getCurrentTime() {\n return this.model.getCurrentTime();\n },\n\n /**\n * Get quarter of stream.\n * Can be used for tracking\n *\n * @returns {number}\n */\n getCurrentQuartile() {\n return Math.ceil((this.getCurrentTime() / this.getDuration()) / 0.25);\n },\n\n /**\n * Get device type\n *\n * @returns {*}\n */\n getDeviceType() {\n if (utils.device.isIPhone()) {\n return 'iPhone';\n }\n\n if (utils.device.isIPad()) {\n return 'iPad';\n }\n\n if (utils.device.isAndroid()) {\n return 'android';\n }\n\n return 'desktop';\n },\n\n /**\n * Get current captions list\n */\n getCaptionsList() {\n return this.model.getCaptionsList();\n },\n\n /**\n * Get currently playing captions\n */\n getCurrentCaptions() {\n return this.model.getCurrentCaptions();\n },\n\n /**\n * Set current captions by passing its index\n * Setting 0 will hide all captions\n */\n setCurrentCaptions(index) {\n return this.model.setCurrentCaptions(index);\n },\n\n /**\n * Get Player DOM Node\n *\n * @returns {*}\n */\n getContainer() {\n return this.model.getContainer();\n },\n\n stop() {\n return this.model.stop();\n },\n\n /**\n * Set asset resource\n * @param asset - Asset model or stream id\n */\n async setAsset(asset) {\n // cleanup old asset\n if (this.asset) {\n this.stopListening(this.asset);\n this.asset.destroy();\n this.asset = null;\n }\n\n // change asset to object if it is a number\n if (utils.isNumber(asset)) {\n // eslint-disable-next-line no-param-reassign\n asset = {\n id: asset\n };\n }\n\n this.asset = (asset instanceof Asset) ? asset : new Asset(asset);\n\n // set vendor for player's default if nothing has been passed\n if (!this.asset.get('vendor')) {\n this.asset.set('vendor', this.config.get('vendor'));\n }\n\n // asset is ready if status field is in response\n if (this.asset.get('status')) {\n onAssetReady.call(this);\n } else {\n try {\n await this.asset.fetch();\n onAssetReady.call(this);\n } catch (error) {\n onAssetError.call(this, error);\n }\n }\n },\n\n /**\n * Get currently loaded asset\n * @returns {Asset|null}\n */\n getAsset() {\n return this.asset;\n },\n\n /**\n * Get next asset\n * @return {Promise}\n */\n async getNextAsset() {\n const { next } = this.config.getRecommended() || {};\n if (next === false) {\n return null;\n }\n\n const recommendedPlugin = this.getPlugin('RecommendedPlugin');\n if (!recommendedPlugin) {\n return null;\n }\n if (recommendedPlugin.nextAsset) {\n return recommendedPlugin.nextAsset;\n }\n\n const recommended = new Recommended({\n asset: this.getAsset()\n });\n const { nextAsset, source } = await recommended.getNextAsset(next);\n recommendedPlugin.nextAsset = nextAsset;\n recommendedPlugin.nextAssetSource = source;\n\n return recommendedPlugin.nextAsset;\n },\n\n /**\n * Add plugin to the player\n *\n * @param plugin\n */\n addPlugin(plugin) {\n const proxyPluginEvent = function (event, ...args) {\n this.trigger(`${plugin.getName()}:${event}`, ...args);\n };\n\n plugin.setPlayer(this);\n this.listenTo(plugin, 'all', proxyPluginEvent, this);\n\n this.plugins[plugin.getName()] = plugin;\n },\n\n /**\n * Get plugin by name\n *\n * @param plugin - name of the plugin\n * @returns {*}\n */\n getPlugin(plugin) {\n return this.plugins[plugin];\n }\n};\n\n/**\n * Checks if device can autoplay stream\n *\n * @returns {*}\n */\nPlayer.canDeviceAutoplay = function () {\n // eslint-disable-next-line no-console\n if (console && console.warn) {\n // eslint-disable-next-line no-console\n console.warn('SVP Player SKD deprecation warning. '\n + 'Due to changes in browser policies, player will detect itself if it can autoplay.');\n }\n\n return utils.device.canAutoplay();\n};\n\nutils.extend(Player.prototype, utils.Events);\n\nexport default Player;\n","const hasAdblock = () => {\n const el = document.createElement('div');\n\n el.className = 'afs_ads';\n el.innerHTML = ' ';\n el.style.width = '1px';\n el.style.height = '1px';\n el.style.position = 'absolute';\n el.style.background = 'transparent';\n\n document.body.appendChild(el);\n\n const wasDetected = !document.body.contains(el)\n || el.offsetParent === null\n || el.className !== 'afs_ads'\n || el.innerHTML === ''\n || el.clientHeight === 0;\n\n document.body.removeChild(el);\n\n return wasDetected;\n};\n\nexport default hasAdblock;\n","import config from 'player/config';\nimport Player from 'player/player';\nimport image from 'utils/image';\nimport utils from 'utils/utils';\nimport hasAdblock from 'utils/adblock-detect';\n\nimport locale from 'player/model/locale';\nimport Domain from 'player/model/domain';\nimport HomadAds from 'player/playback/ads/homad';\n\nimport youbora from 'player/playback/youbora';\nimport SvpPlugins from './player/plugins';\n\nconst SVP = {};\nSVP.Player = Player;\nSVP.Player.Plugins = SvpPlugins;\nSVP.Player.version = config.version;\n\n// by default antiadblock is turned off\nObject.defineProperty(SVP.Player, 'defaults', {\n get() {\n // eslint-disable-next-line no-underscore-dangle\n return this.__defaults || {};\n },\n set(value) {\n // if params are not object then\n // override and force to object\n if (value !== Object(value)) {\n value = {};\n }\n\n Object.defineProperty(SVP.Player, '__defaults', {\n value: value,\n enumerable: false,\n configurable: false,\n writable: false\n });\n }\n});\n\n/**\n * Load youbora plugin unless it is turn off in SVP.default\n * @type {boolean}\n */\nconst loadYoubora = (options) => {\n // youbora plugin can be disabled completely\n try {\n if (localStorage.svpYoubora === 'true' || options !== false) {\n youbora.load(options);\n }\n } catch (e) {\n // could not load youbora plugin\n }\n};\n\nconst setLocale = (language = 'no') => {\n locale.setTranslations(config.translations(language));\n};\n\nconst preInitialize = () => {\n image.initialize(utils.extend(config.images, {\n getPixelRatio: utils.device.getPixelRatio\n }));\n\n Domain.initialize(window.location.hostname);\n};\n\nconst postInitialize = () => {\n const { aab } = SVP.Player.defaults;\n\n // set locale for all players\n setLocale(SVP.Player.defaults.locale);\n\n // load homad only for desktop\n // detect if adblock exist for \"auto\" mode\n // force loading when mode is set to \"true\" (forces for all desktops)\n if (utils.device.getDeviceType() === 'desktop' && ((aab === 'auto' && hasAdblock() === true) || aab === true)) {\n HomadAds.initialize();\n }\n\n loadYoubora(SVP.Player.defaults.youbora);\n};\n\nexport default SVP;\nexport { preInitialize, postInitialize };\n"],"sourceRoot":""}