If you are not using a VPN, please click the button below
\n \n{body}
\nextends React.Component
{\n static ctrls;\n static ctrlsStateCache;\n\n protected _logger = console;\n protected _allocator: AllocatorVideo;\n\n public player: iPlayer;\n public playerContainerId: string;\n public playing: boolean;\n public livePlayList;\n\n constructor(props) {\n super(props);\n if (typeof window === \"undefined\") {\n return;\n }\n\n this._init();\n PlayerCtrl.ctrls = PlayerCtrl.ctrls || [];\n PlayerCtrl.ctrls.push(this);\n }\n\n static batchCtrlState(batchResumePlay?: boolean) {\n PlayerCtrl.ctrls = PlayerCtrl.ctrls || [];\n PlayerCtrl.ctrlsStateCache = PlayerCtrl.ctrlsStateCache || [];\n\n PlayerCtrl.ctrls.forEach((ctrl: PlayerCtrl Up Next In 5 Seconds Autoplay: ${title} ${airDate} ${description} More For You ${title} ${airDate}\n
\n
\n * this object defines data standard of multiple data model about page, media and ads.\n *
\n * this definition does not care the value, if value is unexpected empty, should be fixed in each player's \"DataMod\" method\n * @mixin\n */\n\nexport let triggeredErrors = [];\n\nexport interface iPageInfo {\n page_nav_title: string;\n page_name: string;\n content_type: string;\n content_title: string;\n content_id: string;\n platform: string;\n tv_channel: string;\n tv_show: string;\n section: string;\n sub_section_1?: any;\n sub_section_2?: any;\n sub_section_3?: any;\n sub_section_4?: any;\n sub_section_5?: any;\n sub_section_6?: any\n}\n\nexport interface iMediaInfo_CustomFields {\n alt_media_id: string;\n clip_title: string;\n tv_show: string;\n series_crid_id?: string;\n episode_crid_id?: string;\n video_type_long_form?: string;\n tv_channel?: string;\n tv_episode?: string;\n episode_name?: string;\n expiry_date?: string;\n program_classification?: string;\n web_content_url?: string;\n clip_category?: string;\n market?: string;\n publisherid?: string\n tv_season?: string\n}\n\nexport interface iVideo {\n ShowGenre: string | null,\n ShowProgramClassification: string | null,\n isMemberGatedLive: boolean\n}\n\nexport interface iMediaInfo {\n id: string;\n name: string;\n account_id?: string;\n description?: string;\n long_description?: string;\n duration?: string;\n head_position: string;\n created_at?: string;\n published_at?: string;\n updated_at?: string;\n reference_id?: string;\n publisher_id?: string;\n custom_fields: iMediaInfo_CustomFields // live returns customFields;\n video?: iVideo\n preroll?: any; // reference of brightcove player.ima3.currentAdEventInfo\n}\n\nexport interface iAdInfo {\n type: string;\n asset_id: string;\n head_position: string;\n index?: string;\n duration?: string\n}\n\nexport const dataModels = {\n /**\n * Data model definition of page view event\n * @enum{number}\n */\n pageInfo: {\n platformName: 1,\n platformPostfix: 1,\n pageTitle: 0,\n pageId: 1,\n platform: 0,\n category: 0,\n section: 0,\n subSection: 0\n },\n\n /**\n * Data model definition of video content events
\n * This model is defined base on data structure of brightcove response
\n * live player (YO) should follow this structure and modify/insert data if necessary
\n * @param {string} videoType Its value will be \"Full Episode\", \"Live\" or others\n * @return {object}\n */\n mediaInfo: function (videoType) {\n let isFullEpisode = typeof videoType === \"string\" && \"full episode\" === videoType.toLowerCase();\n let isLive = typeof videoType === \"string\" && \"live\" === videoType.toLowerCase();\n /**\n * \n *
\n */\n return {\n id: 1,\t\t\t\t\t// VOD; YO;\n name: 1,\t\t\t\t// VOD; YO;\n account_id: 0,\t\t\t// VOD; YO: accountId\n description: 0,\t\t\t// VOD; YO: shortDescription\n long_description: 0,\t// VOD; YO: longDescription\n duration: 0,\t\t\t// VOD; YO = \"86400\"\n head_position: 1,\t\t// VOD, get from player.currentTime(); YO: local date()\n created_at: 0,\t\t\t// VOD; YO: creationDate\n published_at: 0,\t\t// VOD; YO: publishedDate\n updated_at: 0,\t\t\t// VOD; YO: lastModifiedDate\n reference_id: 0,\t\t// VOD; YO: referenceId\n custom_fields: {\n alt_media_id: 1,\t\t\t// inserted; VOD -> id; YO -> E.timedMetadata.crid\n clip_title: 1,\t\t\t\t// VOD; YO -> name -> tv_show\n tv_show: 0,\t\t\t\t\t// VOD; YO;\n // VOD; YO -> E.timedMetadata.crid.pA\n series_crid_id: isLive ? 1 : 0,\n // VOD; YO -> E.timedMetadata.crid.pB\n episode_crid_id: isLive ? 1 : 0,\n // VOD = \"Full Episode\"; YO = \"Live\";\n video_type_long_form: isFullEpisode || isLive ? 1 : 0,\n // VOD; YO;\n tv_channel: 0,\n tv_episode: 0,\t\t\t\t// VOD;\n episode_name: 0,\t\t\t// VOD;\n expiry_date: 0,\t\t\t\t// VOD;\n program_classification: 0,\t// VOD;\n web_content_url: 0,\t\t\t// VOD;\n clip_category: 0,\t\t\t// YO = \"Live Hub Market\";\n market: 0,\t\t\t\t\t// YO;\n publisherid: 0\t\t\t\t// YO;\n },\n preroll: 0,\n video:{\n ShowGenre: 0,\n ShowProgramClassification: 0,\n isMemberGatedLive: 0\n }\n }\n },\n /**\n * Data model definition of ads events\n * @enum{number}\n */\n adInfo: {\n type: 1,\n asset_id: 1,\n index: 0,\n duration: 0,\n head_position: 1\n }\n};\n\n/**\n * util includes methods which would be helpful when generating standard tracking data\n * @mixin\n */\nexport const dataModelUtil = {\n /**\n * This method will evaluate given dataObject structure based on given data model.\n *\n * @param {Object} model object of {@link tenTrack.dataModels}\n * @param {Object} dataObject data source of REST response\n * @return {boolean}\n */\n matchModel: function (model, dataObject) {\n if (typeof model !== \"object\" || model.constructor !== Object) {\n let errorMsg = \"Given data model is not object\";\n if (triggeredErrors.indexOf(errorMsg) === -1) {\n console.error(errorMsg);\n triggeredErrors.push(errorMsg);\n }\n return false;\n }\n\n for (let key in model) {\n // check if given dataObject has each property, does not care about the value\n if (model[key] === 1 && !(key in dataObject)) {\n let errorMsg = \"Important tracking data is missing - \" + key;\n if (triggeredErrors.indexOf(errorMsg) === -1) {\n console.error(errorMsg, model, dataObject);\n triggeredErrors.push(errorMsg);\n }\n return false;\n }\n if (model[key].constructor === Object) {\n if (!this.matchModel(model[key], dataObject[key])) {\n return false;\n }\n }\n }\n\n return true;\n },\n\n /**\n * This method will create data object, try to get values of all given model's properties from given \"dataObject\".
\n * This method normally should be called first, then the player should modify and complete the generated object to make sure it matches given model's requirement, then call the matchModel() method to test if all required properties have value.\n *\n * @param {Object} model object of {@link tenTrack.dataModels}\n * @param {Object} dataObject data source of REST response\n * @param {Object} mapping Object defines property names used in given dataObject which means same thing.\n * @return {*}\n */\n makeData: function (model, dataObject, mapping?):iMediaInfo {\n if (typeof model !== \"object\" || model.constructor !== Object) {\n let errorMsg = \"Given data model is not object\";\n if (triggeredErrors.indexOf(errorMsg) === -1) {\n console.error(errorMsg);\n triggeredErrors.push(errorMsg);\n }\n return undefined;\n }\n\n let tmp = {} as iMediaInfo;\n for (let key in model) {\n let mappedKey = key;\n // if mapping object is given, replace key with given value of each key\n if (mapping && mappedKey in mapping) {\n mappedKey = mapping[key];\n }\n\n if (typeof model[key] === \"object\" && model[key].constructor === Object) {\n tmp[key] = this.makeData(model[key], dataObject[mappedKey], mapping ? mapping[key + \"_mapping\"] : undefined);\n } else if (mappedKey in dataObject) {\n tmp[key] = dataObject[mappedKey];\n }\n }\n return tmp;\n }\n};","/**\n * @namespace\n */\nimport {Allocator_Video} from \"./track.allocator.video\";\nimport {cookies, generateUUID} from \"../ten/env.util\";\nimport {dataModels, dataModelUtil} from \"./track.dataModel\";\nimport {eLocalStorage_tenUser} from \"../tenMember/jwt/enum\";\n\nexport interface iTenTrack {\n deviceId: string,\n userId_ten: string,\n userId_oztam: string,\n userId_nielsen: string,\n\n /**\n * legacy properties\n */\n meta: any,\n dataModels: any,\n dataModelUtil: any,\n Allocator: any,\n}\n\nlet tenTrackTmp: iTenTrack = {} as any;\n\nif (typeof window !== \"undefined\"){\n tenTrackTmp.deviceId = (function() {\n if (window.navigator.cookieEnabled) {\n let tmpDeviceId = cookies.getCookie(\"ten_deviceId\");\n if (tmpDeviceId) {\n return tmpDeviceId;\n } else {\n let newCookieDeviceId = generateUUID();\n cookies.setCookie(\"ten_deviceId\", newCookieDeviceId, 365 * 10);\n return newCookieDeviceId;\n }\n } else {\n // todo if we need to use fingerprint to handle cookie disabled case, then add figerprint logic in here. [DTECH-724]\n return undefined;\n }\n })();\n tenTrackTmp.userId_ten = localStorage.getItem(eLocalStorage_tenUser.tu_userid) || undefined;\n tenTrackTmp.userId_oztam = localStorage.getItem(eLocalStorage_tenUser.tu_oztamid) || undefined;\n tenTrackTmp.userId_nielsen = localStorage.getItem(\"tu_nielsenid\") || generateUUID();\n\n\n /**\n * get page and video info from meta tag. There are bt:type, bt:genre, etc. can be used to send data to tracking tools.\n */\n tenTrackTmp.meta = (function () {\n let metaObject = {};\n\n let metaDOMs = document.querySelectorAll('meta[property*=\"bt:\"]');\n for (let i = 0; i < metaDOMs.length; i++) {\n let meta = metaDOMs[i];\n metaObject[meta.getAttribute(\"property\")] = meta.getAttribute(\"content\");\n }\n\n\n metaDOMs = document.querySelectorAll('meta[name*=\"gcontent-\"]');\n for (let i = 0; i < metaDOMs.length; i++) {\n let meta = metaDOMs[i];\n metaObject[meta.getAttribute(\"name\")] = meta.getAttribute(\"content\");\n }\n\n return metaObject;\n })();\n tenTrackTmp.dataModels = dataModels;\n tenTrackTmp.dataModelUtil = dataModelUtil;\n tenTrackTmp.Allocator = Allocator_Video;\n}\n\nexport const tenTrack = tenTrackTmp;","import {Player} from \"../../@types/bc.interface\";\nimport {Allocator_Video} from \"../../tenTrack/track.allocator.video\";\n\nexport enum eIMAEvent {\n /**\n * ad event - needs ima plugin\n */\n AdsRequest = \"ads-request\",\n AdsLoad = \"ads-load\",\n AdsAdStarted = \"ads-ad-started\",\n AdsAdEnded = \"ads-ad-ended\",\n AdsPause = \"ads-pause\",\n AdsPlay = \"ads-play\",\n AdsFirstQuartile = \"ads-first-quartile\",\n AdsMidpoint = \"ads-midpoint\",\n AdsThirdQuartile = \"ads-third-quartile\",\n AdsClick = \"ads-click\",\n AdsVolumechange = \"ads-volumechange\",\n AdsPodStarted = \"ads-pod-started\",\n AdsPodEnded = \"ads-pod-ended\",\n AdsAllpodsCompleted = \"ads-allpods-completed\",\n /**\n * Error events\n */\n ima3Ready = \"ima3-ready\",\n ima3Error = \"ima3error\",\n ima3AdError = \"ima3-ad-error\"\n}\n\ninterface iIMAConfig {\n\n}\n\nexport interface iIMAAds {\n adType: string, // lower case\n ad: {\n id: string,\n type: string, // upper case\n index: number,\n duration: number\n },\n state: \"content-set\"\n}\n\nexport interface iVodPlayer extends Player{\n autoplay?: boolean;\n load?: () => void;\n ads?: iIMAAds;\n trackingFirstPlayEvents: () => void;\n}\n\n// these events are not listed on ima3 page, but triggered in ad related logic\nexport enum BrightcoveIMABackendEvent {\n NoPreRoll = \"nopreroll\",\n AdTimeout = \"adtimeout\",\n ReadyForPreRoll = \"readyforpreroll\",\n IMA3ContentResumeRequested = \"ima3-content-resume-requested\"\n}","import {iVodPlayer} from \"../@types/bc.interface\";\nimport {Log} from \"../../ten/env.util\";\nimport {eDebug_Title} from \"../../ten/env.enum\";\n\nexport function drmFilter(): void {\n const player: iVodPlayer = this;\n const catalogLoad = player.catalog.load;\n const logger = new Log(eDebug_Title.player);\n\n player.catalog.load = function(mediaInfo) {\n const useDrmValue = (mediaInfo.customFields && mediaInfo.customFields.video_type_drm_only) ||\n (mediaInfo.custom_fields && mediaInfo.custom_fields.video_type_drm_only);\n const useDrm = [\"true\", \"TRUE\", \"True\"].indexOf(useDrmValue) >= 0;\n\n const sources = mediaInfo.sources;\n if (Array.isArray(sources) && sources.length > 0) {\n const filtered = sources.filter(function(source) {\n const isDrmSource = (source.key_systems || source.keySystems) && source.src.indexOf(\"http://\") === -1;\n const isNotDrmSource = !source.key_systems && !source.keySystems;\n return (useDrm && isDrmSource) || (!useDrm && isNotDrmSource);\n });\n\n if (filtered.length !== sources.length) {\n mediaInfo.sources = filtered;\n logger.log(\"UPDATED SOURCE - \", filtered);\n }\n }\n\n catalogLoad(mediaInfo);\n }\n};","export function vjsErrorHandler():void {\n\n}","import {iVodPlayer} from \"../@types/bc.interface\";\n\nexport function vjsEventHandler(): void {\n let player: iVodPlayer= this;\n}","import {iVodPlayer} from \"../@types/bc.interface\";\n\nexport function vjsOverlayUI(): void {\n let player: iVodPlayer = this;\n\n player.on(\"loadedmetadata\", () => {\n const mediainfo = player.mediainfo;\n if (!mediainfo) {\n return;\n }\n if (!Array.isArray(mediainfo.cue_points)) {\n return;\n }\n\n const brightcoveControlledDiv = player.el();\n if (!brightcoveControlledDiv && !brightcoveControlledDiv.querySelector) {\n return;\n }\n const progressHolder = brightcoveControlledDiv.querySelector(\".vjs-progress-control > .vjs-progress-holder\");\n const progressBar = brightcoveControlledDiv.querySelector(\".vjs-progress-control > .vjs-progress-holder > .vjs-play-progress\");\n if (progressHolder === null || progressBar === null) {\n return;\n }\n\n const cuePointClass = \"vjs-progress-cue-point\";\n progressHolder.querySelectorAll(`.${cuePointClass}`).forEach(cue => {\n cue.remove();\n });\n\n const duration = player.duration();\n const cuePoints = mediainfo.cue_points;\n cuePoints.forEach((cue) => {\n const div = document.createElement(\"div\");\n div.classList.add(cuePointClass);\n div.style.left = (cue.time / duration) * 100 + \"%\";\n progressHolder.insertBefore(div, progressBar);\n });\n\n const style = document.createElement(\"style\");\n style.type = \"text/css\";\n style.innerHTML = `\n .${cuePointClass} {\n width: 4px;\n height: 100%;\n position: absolute;\n top: 0;\n bottom: 0;\n background-color: rgba(255,255,255,0.2);\n }\n `;\n document.head.appendChild(style);\n });\n}\n","import {Allocator_Video, eAllocatorEvent} from \"../../tenTrack/track.allocator.video\";\nimport {dataModels, dataModelUtil, iAdInfo, iMediaInfo} from \"../../tenTrack/track.dataModel\";\nimport {Log} from \"../../ten/env.util\";\nimport {eDebug_Title} from \"../../ten/env.enum\";\nimport {BrightcoveCustomEvent, BrightcoveEvent} from \"../../@types/bc.interface\";\nimport {BrightcoveIMABackendEvent, eIMAEvent, iVodPlayer} from \"../@types/bc.interface\";\n\nfunction getTrackingServiceState() {\n return {\n loadedMetadata: false,\n paused: undefined,\n playedAds: 0,\n };\n}\n\nexport function trackingService(): void {\n let player: iVodPlayer= this;\n let eventLog: Log = new Log(eDebug_Title.player_event);\n\n let previousSegment: number;\n let state = getTrackingServiceState();\n\n let previousPosition = getTimeInSec();\n player.on(BrightcoveEvent.Timeupdate, ()=>{\n // timeupdate in sec\n let nowSec = getTimeInSec();\n if (player.hasStarted() && previousPosition !== nowSec) {\n previousPosition = nowSec;\n player.trigger(BrightcoveCustomEvent.TimeupdateSec);\n }\n\n // watchPosition update\n setTimeout(()=>{\n this.watchPosition = player.currentTime();\n },500);\n });\n\n player.on(BrightcoveEvent.Play, () => {\n eventLog.log(`Called ${BrightcoveEvent.Play}`);\n if (state.paused) {\n eventLog.log(`Tracking ${Allocator_Video.Events.UN_PAUSE}`);\n this.allocator.track(\n Allocator_Video.Events.UN_PAUSE,\n getMediaData(player),\n player\n )\n }\n state.paused = false;\n });\n\n player.on(BrightcoveEvent.Pause, () => {\n if (!state.paused) {\n eventLog.log(`Called ${BrightcoveEvent.Pause}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.PAUSE}`);\n this.allocator.track(\n Allocator_Video.Events.PAUSE,\n getMediaData(player),\n player\n );\n }\n state.paused = true;\n });\n\n player.on(BrightcoveEvent.Resume, () => {\n eventLog.log(`Called ${BrightcoveEvent.Resume}`);\n });\n\n\n player.on(BrightcoveEvent.Seeking, () => {\n eventLog.log(`Called ${BrightcoveEvent.Seeking}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.SEEKING}`);\n this.allocator.track(\n Allocator_Video.Events.SEEKING,\n getMediaData(player),\n player\n )\n });\n\n player.on(BrightcoveEvent.Seeked, () => {\n eventLog.log(`Called ${BrightcoveEvent.Seeked}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.SEEKED}`);\n this.allocator.track(\n Allocator_Video.Events.SEEKED,\n getMediaData(player),\n player\n );\n });\n\n window.addEventListener(\"beforeunload\", ()=>{\n eventLog.log(`Called window beforeunload`);\n eventLog.log(`Tracking ${Allocator_Video.Events.BEFORE_UNLOAD_PAGE}`);\n this.allocator.track(\n Allocator_Video.Events.BEFORE_UNLOAD_PAGE\n )\n });\n\n if (player.ima3) {\n state.playedAds = 0;\n if (player.dataAttrs[\"data-video-ima-url\"]) {\n player.on(eIMAEvent.AdsPlay, () => {\n eventLog.log(`Called ${eIMAEvent.AdsPlay}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.AD_RESUME}`);\n this.allocator.track(\n Allocator_Video.Events.AD_RESUME,\n getAdData(player.ads),\n player.ima3.adPlayer\n )\n });\n player.on(eIMAEvent.AdsPause, () => {\n eventLog.log(`Called ${eIMAEvent.AdsPause}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.AD_PAUSE}`);\n this.allocator.track(\n Allocator_Video.Events.AD_PAUSE,\n getAdData(player.ads, player.ima3.adPlayer.currentTime()),\n player.ima3.adPlayer\n )\n });\n // single ad start/end events\n player.on(eIMAEvent.AdsAdStarted, () => {\n state.playedAds++;\n\n eventLog.log(`Called ${eIMAEvent.AdsAdStarted}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.AD_BEGIN}`);\n this.allocator.track(\n Allocator_Video.Events.AD_BEGIN,\n getAdData(player.ads),\n player.ima3.adPlayer\n )\n });\n player.on(eIMAEvent.AdsAdEnded, () => {\n if (state.playedAds) {\n eventLog.log(`Called ${eIMAEvent.AdsAdEnded}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.AD_COMPLETE}`);\n this.allocator.track(\n Allocator_Video.Events.AD_COMPLETE,\n getAdCompleteData(player.ads)\n )\n }\n });\n // ad break start/end events\n player.on(eIMAEvent.AdsPodStarted, () => {\n eventLog.log(`Called ${eIMAEvent.AdsAdStarted}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.AD_BEGIN}`);\n this.allocator.track(\n Allocator_Video.Events.AD_BREAK_START,\n getMediaData(player),\n player\n )\n });\n player.on(eIMAEvent.AdsPodEnded, () => {\n eventLog.log(`Called ${eIMAEvent.AdsAdEnded}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.AD_COMPLETE}`);\n this.allocator.track(\n Allocator_Video.Events.AD_BREAK_END,\n getMediaData(player),\n player\n )\n });\n }\n }\n\n player.on(BrightcoveCustomEvent.TimeupdateSec, () => {\n // trigger close to the video end event, for OzTam\n if (closeTheEnd(player.currentTime(), player.duration())) {\n eventLog.log(`Tracking ${Allocator_Video.Events.CLOSE_THE_END}`);\n player.trigger(BrightcoveCustomEvent.CloseTheEnd);\n }\n\n // checking segment frequently, call segment change, segment view after it changed\n let mediaCues = getCues(player);\n let currentSegment = getSegmentId(player.currentTime(), mediaCues);\n if (previousSegment !== currentSegment) {\n previousSegment = currentSegment;\n player.trigger(BrightcoveCustomEvent.SegmentChanged);\n }\n });\n\n player.on(BrightcoveCustomEvent.SegmentChanged, () => {\n eventLog.log(`Called ${BrightcoveCustomEvent.SegmentChanged}`);\n player.trigger(BrightcoveCustomEvent.SegmentView);\n });\n\n player.on(BrightcoveCustomEvent.SegmentView, () => {\n eventLog.log(`Called ${BrightcoveCustomEvent.SegmentView}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.SEGMENT_VIEW}`);\n this.allocator.track(\n Allocator_Video.Events.SEGMENT_VIEW,\n previousSegment,\n player\n )\n });\n\n // event handlers that should be triggered once for each video (exclude replay)\n trackingSingletonEvents(player, state);\n player.trackingFirstPlayEvents = () => {\n trackingFirstPlayEvents(player, state);\n };\n player.trackingFirstPlayEvents();\n}\n\nexport function getSingletonEventHandlers (player, state) {\n let eventLog: Log = new Log(eDebug_Title.player_event);\n return {\n loadedMetadata: () => {\n eventLog.log(`Called ${BrightcoveEvent.Loadedmetadata}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.LOADED_METADATA}`);\n player.allocator.track(\n Allocator_Video.Events.LOADED_METADATA,\n getMediaData(player),\n player\n );\n },\n firstPlay: () => {\n state.paused = false;\n eventLog.log(`Called ${BrightcoveEvent.FirstPlay}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.START}`);\n player.allocator.track(\n Allocator_Video.Events.START,\n getMediaData(player),\n player\n );\n player.trigger(BrightcoveCustomEvent.PlayerStarted);\n },\n realFirstPlay: () => {\n eventLog.log(`Called ${BrightcoveCustomEvent.RealFirstPlay}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.FIRST_PLAY}`);\n player.allocator.track(\n Allocator_Video.Events.FIRST_PLAY,\n getMediaData(player),\n player\n )\n },\n closeTheEnd: () => {\n eventLog.log(`Called ${BrightcoveCustomEvent.CloseTheEnd}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.CLOSE_THE_END}`);\n player.allocator.track(\n Allocator_Video.Events.CLOSE_THE_END\n )\n },\n ended: () => {\n eventLog.log(`Called ${BrightcoveEvent.Ended}`);\n eventLog.log(`Tracking ${Allocator_Video.Events.COMPLETE}`);\n player.allocator.track(\n Allocator_Video.Events.COMPLETE,\n getMediaData(player)\n )\n }\n };\n}\n\nexport function trackingSingletonEvents(player, state) {\n // on some platform such as chromecast, some of these event handlers should be removed from listener so they won't affect platform specific logic.\n player.singletonEventsHandler = getSingletonEventHandlers(player, state);\n let handlers = player.singletonEventsHandler;\n\n player.on(BrightcoveEvent.Loadedmetadata, ()=>{\n handlers.loadedMetadata();\n player.one(BrightcoveEvent.Play, ()=> {\n handlers.firstPlay();\n });\n });\n // vod player other than using ima3 ad plugin, need to trigger realfirstplay in their specific logic, in player.one(BrightcoveCustomEvent.PlayerStarted) callback\n player.on(BrightcoveCustomEvent.RealFirstPlay, handlers.realFirstPlay);\n player.on(BrightcoveCustomEvent.CloseTheEnd, handlers.closeTheEnd);\n player.on(BrightcoveEvent.Ended, handlers.ended);\n}\n\nexport function trackingFirstPlayEvents(player, state) {\n let eventLog: Log = new Log(eDebug_Title.player_event);\n let realFirstPlayTriggered = false;\n\n function triggerRealFirstPlay() {\n if (realFirstPlayTriggered) {\n return;\n }\n realFirstPlayTriggered = true;\n eventLog.log(\"+++ \" + BrightcoveCustomEvent.RealFirstPlay);\n player.trigger(BrightcoveCustomEvent.RealFirstPlay);\n }\n function adsPodEndedCallback() {\n if (state.playedAds) {\n triggerRealFirstPlay();\n }\n }\n function silentAdTimeout() {\n /**\n * no scheduled ad\n */\n let waitingAd = setInterval(()=> {\n if (state.playedAds) {\n clearInterval(waitingAd);\n }\n if (state.playedAds === 0 && player.currentTime() > 1) {\n clearInterval(waitingAd);\n player.off(eIMAEvent.AdsPodEnded, adsPodEndedCallback);\n triggerRealFirstPlay();\n }\n }, 500);\n\n /**\n * with ad\n */\n player.one(eIMAEvent.AdsPodEnded, adsPodEndedCallback);\n player.one(BrightcoveIMABackendEvent.AdTimeout, function(){\n eventLog.log(\"+++ \" + BrightcoveIMABackendEvent.AdTimeout);\n player.off(eIMAEvent.AdsPodEnded, adsPodEndedCallback);\n triggerRealFirstPlay();\n });\n }\n\n if (player.ima3) {\n state.playedAds = 0;\n\n if (player.dataAttrs[\"data-video-ima-url\"]) {\n // ima error - empty VAST, etc.\n player.one(eIMAEvent.ima3AdError, function(){\n eventLog.log(\"+++ \" + eIMAEvent.ima3AdError);\n player.one(BrightcoveCustomEvent.PlayerStarted, triggerRealFirstPlay);\n });\n\n // ima served, normal process\n player.one(BrightcoveCustomEvent.PlayerStarted, silentAdTimeout);\n } else {\n player.one(BrightcoveCustomEvent.PlayerStarted, triggerRealFirstPlay)\n }\n\n // once real first play triggered, remove all other \"one\" listener\n player.one(BrightcoveCustomEvent.RealFirstPlay, function(){\n player.off(BrightcoveCustomEvent.PlayerStarted, silentAdTimeout);\n player.off(BrightcoveCustomEvent.PlayerStarted, triggerRealFirstPlay);\n player.off(eIMAEvent.AdsPodEnded, adsPodEndedCallback);\n });\n player.one(\"switchingSource\", ()=>{\n realFirstPlayTriggered = true; // if user switch source and ima3 url, make true so all events for previous source will be ignored.\n player.off(BrightcoveCustomEvent.PlayerStarted, silentAdTimeout);\n player.off(BrightcoveCustomEvent.PlayerStarted, triggerRealFirstPlay);\n player.off(eIMAEvent.AdsPodEnded, adsPodEndedCallback);\n player.allocator.track(eAllocatorEvent.BEFORE_CHANGE_SOURCE);\n });\n }\n}\n\n\nfunction getCues (player) {\n return player.mediainfo.cuePoints || player.mediainfo.cue_points || [];\n}\n\nfunction getSegmentId(currentPosition, cues) {\n for (let i = 0; i < cues.length; i++) {\n cues[i].startTime = i > 0 ? cues[i - 1].time : 0;\n cues[i].endTime = cues[i].time;\n if (i === 0 && currentPosition < cues[i].startTime) {\n return 1;\n } else if (currentPosition >= cues[i].startTime && currentPosition < cues[i].endTime) {\n return i + 2;\n }\n }\n return 1;\n}\n\nfunction closeTheEnd (playerCurrentTime, videoDuration) {\n let secondsToTheEnd = 7;\n let percentageToTheEnd = 0.02;\n if (videoDuration <= 5 * 60) {\n // short episode close to the end seconds\n if (playerCurrentTime + secondsToTheEnd >= videoDuration) {\n return true;\n }\n } else {\n // long episode check close to the end by percentage\n if ((videoDuration - playerCurrentTime)/videoDuration <= percentageToTheEnd) {\n return true;\n }\n }\n\n return false;\n}\n\n\nexport function getMediaData(player) {\n const media = player.mediainfo;\n const headPosition = player.currentTime();\n const mediainfoMapping = player.mediainfoMapping;\n let videoType = media && typeof media.custom_fields === \"object\" ?\n media.custom_fields.video_type_long_form : undefined;\n let mediaInfo: iMediaInfo = dataModelUtil.makeData(dataModels.mediaInfo(videoType), media, mediainfoMapping);\n mediaInfo.head_position = headPosition;\n\n mediaInfo.custom_fields.alt_media_id = mediaInfo.id;\n\n if (mediaInfo.custom_fields && mediaInfo.name && !mediaInfo.custom_fields.clip_title) {\n mediaInfo.custom_fields.clip_title = mediaInfo.name;\n }\n\n if (!dataModelUtil.matchModel(dataModels.mediaInfo(videoType), mediaInfo)) {\n console.error(\"Generated data not match standard of videoJs player data model\");\n }\n return mediaInfo;\n}\n\n/**\n * @param {object} adsObject ads object which is part of player object\n * @param currentPosition\n * @return {*}\n */\nexport function getAdData(adsObject, currentPosition?): iAdInfo {\n if (typeof adsObject !== \"object\") {\n return {} as iAdInfo;\n }\n\n let adTypes = [\"preroll\", \"midroll\"];\n let adMeta = adsObject && adsObject.ad ? adsObject.ad : {};\n let adInfo = {\n type: adMeta.type.toLowerCase(),\n asset_id: adMeta.id,\n index: adMeta.index,\n duration: adMeta.duration,\n head_position: currentPosition ? currentPosition : 0\n };\n\n if (adTypes.indexOf(adInfo.type) < 0 &&\n typeof adsObject.adType === \"string\" &&\n adTypes.indexOf(adsObject.adType.toLowerCase()) > -1) {\n adInfo.type = adsObject.adType.toLowerCase();\n }\n\n return adInfo;\n}\n\n/**\n * when ad complete event called, player.currentTime returns 0. Head position should be same as duration after ad finished\n */\nexport function getAdCompleteData(adsObject) {\n let adInfo = getAdData(adsObject);\n adInfo.head_position = adInfo.duration;\n return adInfo;\n}\n\nfunction getTimeInSec() {\n return Math.floor(Date.now() / 1000);\n}","export function vjsVideoPlaySync():void {\n\n}","export function vjsVolumeSync():void {\n\n}"],"names":["root","factory","exports","module","define","amd","self","getNextVideos","urlCode","fetchUrl","resp","fetch","json","loadVideo","destinationUrl","data","video","link","history","pushState","type","window","location","search","StandardPlayerEvent","Progress","Waiting","Playing","Error","Loadstart","Loadedmetadata","Loadeddata","Play","Pause","Seeking","Seeked","Ended","Volumechange","Timeupdate","Stalled","CustomPlayerEvent","TimeupdateSec","PlayerStarted","SegmentChanged","SegmentView","RealFirstPlay","StartPlayFromResume","CloseTheEnd","BrightcoveEvent","BcCatalogError","Ratechange","FirstPlay","Resume","Resize","Fullscreenchange","BrightcoveCustomEvent","userAgentFilter","find","filterName","index","regex","regIndex","test","navigator","userAgent","deviceType","toLowerCase","includes","FLAG_KEY","ADOPS_KEY","PERCENTAGE_KEY","getFlagFromLocalStorage","key","value","localStorage","getItem","setFlagInLocalStorage","setItem","toString","logger","message","env","isProduction","console","log","percentage","warn","validatePercentage","newPercentage","currentPercentage","parseFloat","removeItem","resetFlagsIfPercentageChanges","isFlagged","newFlagValue","Math","random","markAdOps","removeAdOps","checkIsFlagged","constructor","_servicesConfig","this","eAllocatorServices","AllocatorVideo","Allocator","firstRoundPlay","bool","_state","isFirstRoundPlay","initTealium","initOztam","initExtraInfo","super","defaultAllocatorVideoState","trackingOnHold","resetTrackingState","stopTracking","eventTimestamp","calledFirstPlay","calledPreRollBreakStart","_validationHolder","updateEventTimestamp","eventName","Date","now","updateExtraInfo","extraInfo","Object","keys","forEach","serviceName","addExtraVideoInfo","resetTrackingService","tealium","oztam","track","event","playerRef","otherData","eAllocatorEvent","LOAD","START","FIRST_PLAY","PLAY","PAUSE","UN_PAUSE","RESUME","COMPLETE","AD_BREAK_START","AD_BREAK_END","BEFORE_UNLOAD_PAGE","INIT_PROGRESS_INTERVAL","indexOf","AD_BEGIN","AD_PAUSE","AD_RESUME","AD_COMPLETE","SEEKED","currentTime","error","cancelEventTrack","onLoad","LOADED_METADATA","onLoadedMetadata","onStart","onFirstPlay","onPause","onUnpause","onResume","PROGRESS","onProgress","SEGMENT_VIEW","onSegmentView","CLOSE_THE_END","onCloseTheEnd","onComplete","SEEKING","onSeeking","onSeeked","onAdBegin","onAdPause","onAdResume","onAdComplete","onAdBreakStart","onAdBreakEnd","beforeUnloadPage","BEFORE_CHANGE_SOURCE","beforeChangeSource","initProgressInterval","_validate","i","length","validation","registerValidation","events","validatorCB","push","mediainfo","load","onReplay","firstPlay","onInitProgress","pause","onUnPause","segmentView","finished","seeking","adInfo","adStart","adEnd","onChangeVideo","onExit","tealiumEvtOverride","source","undefined","latest","pauseDurationBeforeNewId3","pauseDurationBeforeNewId3_nielsen","generateId3Info","TXXX","id3Info","cueType","CRID","EpochTime","Rating","StreamID","parseInt","floor","LocalTime","matches","match","series_id","episode_id","update","cueData","eCueType","updateTimestamp","PRIV","TDRL","replace","timestamp","getTime","err","player","_log","callback","textTracks","addEventListener","kind","mode","unusedEvent","activeCues","cue","cueObject","JSON","stringify","cueObjectSource","cueObj","isIOS","parse","info","trigger","e","txxxObject","eOzTamEvent","eOztamTrigger","DeviceType","eOzTamField","args","getEventData","eventType","triggerType","fromPosition","toPosition","assign","_eventBuilder","BEGIN","getFields","media","oztamConfig","_registeredSessionId","sessionId","UUID_v4","protocolVersion","vendorVersion","plugin","timezoneOffset","abs","getTimezoneOffset","publisherId","publisherName","mediaId","mediaType","mediaDuration","url","hasIntervalRunning","_progressInterval","startProgressInterval","stopProgressInterval","setInterval","trackProgress","PROGRESS_INTERVAL","clearInterval","dispatch","fields","canDispatch","requestSend","method","_oztamConfig","serverTarget","headers","eventObj","preventDispatch","missingPosition","nanPosition","isNaN","flagPass","startSession","eventBuilder","_media","resetSessionId","trackLoad","trackBegin","properties","trackAdStart","AD_EVENT","trackAdComplete","trackComplete","trackingConfig","_extraInfo","duringAdBreak","_oztamService","OzTamServiceV2","_storedProgressPosition","positionFloat","__storedProgressPosition","toFixed","_storedProgressPositionTimestamp","defineGetMediaDurationFn","mediaInfo","duration","TrackJS","id","defineGetMediaPositionFn","lastPlayTimestamp","round","contentTime","defineGetMediaTypeFn","defineGetPublisherId","meta","account_id","publisher_id","sessionStart","defineTrackingMedia","defineTrackingEvent","defineTrackingProperties","ALT_MEDIA_ID","SERIES_ID","custom_fields","series_crid_id","EPISODE_ID","episode_crid_id","SERIES_NAME","tv_show","EPISODE_NAME","episode_name","CHANNEL","tv_channel","CLASSIFICATION","program_classification","DEVICE_ID","tenTrack","deviceId","DEMO1","oztam_userId","alt_media_id","href","genre","ShowGenre","positions","DISPOSE","getContentPositionFromPayloadPosition","watchPosition","dispose","Tealium","CallStack","variable","property","videoHasStarted","utag","static","getMediaGenre","utag_data","eUtag","showGenre","Array","isArray","join","getMediaGenreSecondary","showGenreSecondary","genreSecondary","getGeneralData","channelDisplayName","video_fields","jwtMember","getUserDetail","fastChannelTrackData","showContentMarket","showProgramClassification","ShowProgramClassification","isMemberGatedLive","trackingData","showName","showNameTargeting","n10adId","showKey","tvEpisode","tv_episode","subStringAsKeyMatch","showEpisodeName","clip_title","showEpisodeVideoType","video_type_long_form","showContentId","showContentCategory","showId","showContentName","document","title","showContentVideoId","showChannel","showContentVideoType","showContentSeason","season","showContentFormatType","videoDuration","adType","adDuration","adIndex","adTitle","oztamPublisherId","oztamSessionId","autoPlayFlag","getAutoplaySetting","call_type","platform","device","adobeECID","deviceIdAdobe","getAdData","adDataIsEmpty","isEmptyObj","generalData","setMediaInfo","mediaTrackingInfo","tealium_event","matadata","adData","extraData","customExitData","playbackTime","getRoundedMinutes","trackingServiceConfig","enabled","config","staging","production","mux","envTemp","productionHostName","prodDomain","hostname","isStaging","OztamClass","TealiumClass","getDomain","s4","substring","param","body","keepalive","then","response","ok","text","catch","request","XMLHttpRequest","open","headerNames","headerName","setRequestHeader","successCallback","onreadystatechange","readyState","status","responseText","failCallback","onerror","send","some","exactPlatformString","obj","roundedDuration","startTime","endTime","timerId","start","remaining","paused","pausedTime","resume","clearTimeout","setTimeout","Promise","resolve","reject","res","ip","callbacks","ms","watch","fn","isReady","onReady","interval","apiKey","authToken","baseUrl","requestToken","post","PublisherName","access_token","handleError","ensureAuthToken","retryRequest","func","retries","attempt","code","delay","postAuthenticatedData","endpoint","makeAuthenticatedPostRequest","Authorization","postUnauthenticatedData","mapBvodDataToOztamParams","bvodData","oztamParamsArray","item","BvodId","Demo","BvodIdSalt","addCustParamsCsi","resource","bcodData","ad","csai","adCallUrl","URL","params","URLSearchParams","custParams","get","custParamsObj","split","newCustParams","entries","map","set","origin","pathname","addCustParamsSsi","ssai","adParameters","cust_params","apiUrl","ApiVideo","Api","attachApiUrl","freeWheelEnabled","drmEnabled","refreshResult","jwtRefreshToken","eJwtRefreshToken","active","accessToken","getAccessToken","getPlaybackInfoPath","statusText","streamSignature","daiAuthToken","responseData","getVideoUapPath","avia","PlayerEvent","createConsumerAdvice","services","options","consumerAdviceOptions","dom","isLive","consumerAdviceTimer","consumerAdviceActive","panel","main","consumerAdviceTimerId","container","debug","searchParams","startConsumerAdviceTimer","style","opacity","display","removeConsumerAdvice","hideConsumerAdvice","showConsumerAdvice","remove","handlePlayerEvent","evt","isAd","PLAYBACK_STATE_CHANGE","detail","playbackState","ACTIVE_STATE_CHANGE","activeState","AD_BREAK_COMPLETE","eventTypes","on","STREAM_METADATA","assetKey","shouldExclude","classification","consumerAdvice","displayOverlay","metadata","createElement","classList","add","position","transition","adviceContainer","wrapper","divider","innerHTML","appendChild","CONTENT_START","querySelector","children","optionalParams","getId","ConsumerAdvice","destroy","values","off","accountID","PlayerStates","PlayerCtrl","VodCtrl","LiveCtrl","ignore","createLogoDisplayOverlayPlugin","listening","styles","maxWidth","onContentStart","logoUrl","zIndex","level","top","left","padding","boxShadow","imageTag","getElementsByTagName","onEnded","removeChild","fadeIn","element","fadeOutInterval","fadeOut","fadeInInterval","READY","dir","CONTENT_SEGMENT_START","CONTENT_SEGMENT_END","LOGODISPLAYOVERLAY","onclick","ID","createPlugin","logoOverlay","createOverlayPlugin","getPlugin","PLUGIN_EVENT","RESOURCE_END","panelElement","playback","attachResource","render","once","CONTENT_PROGRESS","LIVE_PRESENTATION_STOPPED","OVERLAY","overlay","props","_resources","_initMockProgress","_firstLoad","_beginTimeStamp","_storedEvents","_oztamServiceConfig","adEventData","_playbackTime","_serverTimeOffset","updateInterval","hasTimestamp","currentStreamTime","customEpochStartingStreamTime","customEpochStartingTimeCheckpoint","customEpochLastCueUpdateTimeCheckpoint","id3EventCuedataOffsetTime","initializeVariables","resetVariables","offsetTime","calculateOffsetTimeInMs","stopIntervals","_initPlayer","playerShouldBeBlocked","_playerShouldBeBlocked","memberGated","loggedIn","_logger","getConsumerAdvice","_createPlayer","_updatePlayerState","DetectWindows7","GeoBlocked","AdBlockerOn","_onPlayerReady","getLogoUrl","_trackEvent","_handleEvent","watcherClickedLink","handleLIVEData","getLiveFields","authHandler","beginUpdateInterval","getPlayerCurrentTime","getCurrentTime","minimumTimeBeforeFirstCustomCueInSeconds","updateCue","setCustomEpochStartingTimes","_id3Wrapper","toISOString","min","max","canBeParsedAsDate","val","setServerTimeOffset","handleUserLogin","imsAPI","invalidateCache","logFreewheelDebug","string","qs","queryString","markAdOperations","_noAds","noads","playerContainerId","containerId","setOztamConfig","bvodApiKey","bvodPublisherName","AuthenticatedEndpointHandler","IMSAPIIntegration","globalSettings","globalFWEnable","experiments","rolloutPercentage","initializeUserFlag","playerMuted","state","playerState","PreInitialize","isMemberGated","liveChannels","componentDidMount","LiveCtrlUtils","detectTouchDevice","addBeforeUnloadListener","componentDidUpdate","prevProps","customFields","google_dai_key","_resetSession","_resetResources","componentWillUnmount","removeEventListener","percent","checkUserFlag","className","newPlayerState","setState","_updateOverlayState","slateUrl","stateOverlayFactory","OverlayFactory","ui","_createResources","playerOptions","createPlayerOptions","autoplay","Autoplay","ATTEMPT_UNMUTED","getId3Wrapper","resetAllocator","createVideoPlayer","initRecording","_playResources","filteredLiveChannels","filter","subArray","channel","channelUrl","relativeUrl","logo","_updateResource","playList","PLAYLIST","livePlayList","clear","_handleResources","slateTime","_displaySlateAndExecute","_clearSponsorLogo","_startPlaylistWithResources","_handlePlaylistCompleteEvent","DisplaySlateImage","childContainer","resources","addResources","next","_allocator","allocatorLiveEventMapping","videoWatchedDuration","getRecordedTime","stop","addWatcherToLink","links","querySelectorAll","from","getAttribute","target","defaultPrevented","extra","userId","eLocalStorage_tenUser","tu_oztamid","convertToVideoTrackObj","ipAddress","getUserIp","AdEventId","DeviceId","Genre","IpAddress","MediaId","MediaType","PublisherId","RegistrationId","SessionId","TimeStamp","UserAgent","VendorVersion","activeChannels","isLivePrerollDisabled","isChannelPreRollDisabled","flatMap","channels","isPreRollDisabled","_playBackInfo","getPlaybackInfo","prerollDisabled","imsData","prerollSource","createPrerollResource","fetchIMSDataAndLog","contentSource","createLiveStreamResource","_addCueListener","cueWatcher","getTxxxGoogleAdData","getCueDataFromId3Event","cueDataTime","cueDataTimeWithOffset","dateTimeDifference","maxTime","cueObjectDataAdjusted","toUpperCase","cueObjectInfoAdjusted","ArrayBuffer","String","fromCharCode","apply","Uint8Array","reset","_resetId3","AllocatorLive","id3","_checkId3","mediaInfoNew","publisherid","newCustomFields","show_title","mockOztamProgress","currentTimestamp","delayDuration","fullProgressEvents","partialProgressDuration","timeToFullProgress","latestEpochTime","epochStartTime","timeOffset","mockedPartialProgressEvents","offsetTimestamps","postProgressEvents","mockedProgressEvents","mockProgressData","mockedProgressEvent","storeEvents","fullProgress","partialDuration","fromSeconds","to","offset","eventArray","setEventFields","numFullEvents","isPartial","eventStartEpoch","dataFields","mapMediaInfo","updatedOztamConfig","trackingFields","progressFetch","eType","allocatorEvent","allocatorVideoObj","RESOURCE_START","CONTENT_PLAYING","CONTENT_PAUSED","lastPausedTimestamp","reload","AD_PAUSED","AD_PLAYING","muted","AD_START","adPosition","adObject","ads","podInfo","j","adPodInfo","generateAdData","MUTE_CHANGE","coppaFlag","userIp","coppa","getIMSData","programClassification","showRatingClassification","playbackSettings","consumerAdviceDisplayTime","poster","theme","html","isDesktop","getElementById","renderTextTrackNatively","useNativeFullscreen","enableMoat","overrides","liveStreamPausable","plugins","compactViewBreakpoint","hls","gam","playlist","consumeradvice","prerollResource","createResourceConfig","videoAdConfig","setVideoAdConfig","imaAdCallUrl","formatIMAServerUrl","showPrerollOnNonZeroStart","loadVideoTimeoutMs","preloadContentAtEndOfPreRoll","enableAdPreloading","fwParameters","playBackInfo","liveStreamResource","account","site","cmsID","requestParams","customParams","fwParamsToSpread","csidPrefix","FW_SITE_SECTION_ID","fw","fwSiteSectionId","imafw_csid","adParams","gr","eLocalStorage_tenUser_info","tu_gr","ge","tu_ge","collection","videoContentCategories","showGenres","pcode","tu_memberPostcode","session","sub","tu_n10adId","tvid","oztamozsid","additionalParams","plabackInfo","miscData","imafw_mode","transformedData","freeWheelParams","generateGoogleAdTagParams","enableFreeWheel","dai","contentSourceId","fms_params","reduce","object","format","VideoFormat","HLS","iu","cmsid","generateCustomParams","ppid","generateRequestParams","vpmute","viewabilityTracking","partner","viewGuid","pageType","kv","reqParams","retrievedLocalStorageState","tvid_callback","companionAds","isCompanionAds","adSizes","hasOwnProperty","beginTimeStamp","intervalId","metadataCuePointTimeout","elapsedWatchTime","isPaused","messageColors","color","currentTimeStamp","roundSecondsToNearestMinute","totalSeconds","totalMinutes","bind","OztamV2AviaLive","TealiumAvia","OzTamV2","onHoldProgressFields","delayProgressLogic","originalCanDispatch","originalCanDispatchFlag","newEpochtime","thisProgressFromEpochtime","batchProgressTrack","newEpochTime","playEpochtime","progressFromPosition","field","splice","pauseTimestamp","id3Wrapper","ceil","syncedEpoch","isTokenCached","tu_accesstoken","tu_refreshtoken","getTokenList","refreshToken","expiresIn","tu_expiresin","expiresAt","tu_expiresat","removeTokenList","getSocialStatus","socialLinks","tu_socialLinks","isExpired","isLoggedIn","isLoggedOut","setUserDetail","userDetail","getUserFavouriteShows","eLocalSotrage_tenUser_favourites","tu_shows","getUserFavouriteRecipes","tu_recipes","setUserFavouriteShows","shows","setUserFavouriteRecipes","recipes","removeFavouriteShows","removeFavouriteRecipes","setMemberId","jwt","tu_memberid","memberId","getMemberId","setAutoplaySetting","eLocalSotrage_tenUser_autoplay","tu_autoplay","setMemberEmailHashed","tu_memberEmailHashed","memberEmailHash","getMemberEmailHashed","setTokenList","setSocialStatus","statusList","socialStatus","socialSite","linkSocialStatus","socialName","unlinkSocialStatus","unlinkIndex","removeAllCache","localStorage_remain","eLocalSotrage_tenUser_progress","tu_progress","eLocalStorage_tenUser_display","tu_name","tu_firstname","tu_lastname","tu_email","eLocalStorage_tenUser_backend","tu_username","tu_userid","tu_datecreated","tu_geo","tu_vpn","tu_vpn_switch","eLocalStorage_tenUser_token","tu_tokentimestamp","eLocalStorage_tenTrack","tt_deviceid","eLocalStorage","_player","heading","rel","onClick","ProxyCheck","storageClean","vpnStorageCleanUp","ErrorFetchingVideo","ErrorFetchingAd","backgroundImage","State","ORIGIN_PROD","ORIGIN_DEV","freeWheelConfig","contentId","cmsId","ImsApiParameters","getStateFromPostcode","postcode","numericPostcode","matchedState","range","ACT","NT","NSW","VIC","QLD","SA","WA","TAS","globalParams","defaultSitePage","sitePage","globalInterfaceParams","imafw__fw_coppa","imafw__fw_site_page","imafw__fw_h_x_country","imafw__fw_content_id","getGlobalParams","customInterfaceParams","imafw_ge","imafw_gr","imafw_pcode","imafw__fw_h_x_postal_code","imafw_sub","imafw_session","imafw_tvid","imafw_state","bvodParams","getBvodCustomParams","getCustomParams","extraParams","videoData","generateExtraFreeWheelParams","adTagParams","createAdTagParams","Component","_bypassAdBlockDetection","bypassShows","bypassDetection","_init","ctrls","batchResumePlay","ctrlsStateCache","ctrl","ePlayerCtrlState","play","playing","notPlay","_initVTG","vtg","OzTam","serverInfo","vodKey","liveKey","bypassAdBlockDetection","geoBlockResponse","adBlockResponse","vpnBlockResponse","promiseAllSettled","Geo","isGeoBlocked","isAdBlock","vpnCheck","isAdBlocked","isVpnBlocked","_deniedGeoBlocker","ePlayerBlockedReason","geoBlocker","isWindows7","_deniedWindows7","win7Blocker","_deniedAdBlocker","adBlocker","OzTamSessionID","name","clipTitle","description","long_description","head_position","created_at","published","published_at","updated_at","reference_id","referenceId","altId","tvChannel","tvShow","episode","tv_season","episodeCrid","seriesCrid","expiry_date","expiry","videoTypeLongForm","market","allocatorVideo","playerEventStateMap","Paused","CONTENT_COMPLETE","End","ERROR","ErrorOccurred","AD_PROGRESS","AdPlaying","result","memberEmailHashed","memberLoginStatus","memberGender","getMemberGender","memberAge","getMemberAge","memberPostcode","getMemberPostcode","memberFavouriteGenre","getMemberFavouriteGenre","isBlocked","tryRequest","appVersion","clientWidth","clientHeight","detectBrowser","version","browserName","mimeTypes","enabledPlugin","ActiveXObject","d","c","r","results","RegExp","exec","urlUtil","paramKeys","paramStr","substr","paramArray","getOffsetTop","nodeName","offsetTop","offsetParent","lazyCallback","slotElement","pixelOffset","callbackWrapper","eventCallback","windowScrollTop","pageYOffset","scrollY","windowScrollBottom","innerHeight","slotOffsetTop","slotOffsetBottom","cookies","expireAllCookies","paths","expires","toUTCString","cookie","l","deleteCookie","setCookie","getCookie","reg","encodeURIComponent","time","date","days","setTime","hours","mins","seconds","storages","getJSONFromLocalStorage","storageData","setJSONToLocalStorage","stringifyData","documentElement","documentClientWidth","documentClientHeight","isMobile","isTablet","isMobileWidth","isTabletWidth","isDesktopWidth","videoId","urlString","size","additionalParam","paramMappings","path","paramMapping","ind","paramOut","mappingKey","mappingValue","findIndex","extensionOut","out","extensionValue","extensionReplaceMapping","replaceKV","processParamMapping","Set","generateAdditionalParam","categoryPath","appendingCustomParams","hasShowVideo","isShowPage","createUpNext","panelEnd","panelNext","nextVideos","videoEndPanelTemplate","upNextCardTemplate","upNextAutoplay","countdownSeconds","countdownHandler","isOpen","vodPlayList","killUpNextPanel","altMediaId","videoEndPanel","upNextCard","createVideoEndPanel","handlePanelClick","handleAutoplay","isFullscreenMode","dataIndex","playNextVideo","tenService","pageAllocator","AutoplayClass","ON","OFF","exitFullscreen","countDownContainer","offBtn","onBtn","updateCountDownText","updateCountdown","countDownElement","tileIndex","dispatchPluginEvent","killVideoEndPanel","contains","compressIcon","offsetWidth","hideCompressionIcon","contentDuration","image","videoArray","upNext","moreVideos","airDate","videos","createDisplayPlugin","onResourceEnd","handlePluginEvent","killPanel","DISPLAY","AllocatorVod","serviceConfig","OztamV2AviaVod","TealiumAviaVod","allocatorVodEventMapping","SEEK_START","SEEK_COMPLETE","PLAYBACK_SUSPENDED","watchPercentageCounter","WatchPercentageCounter","watchedPercentage","eventPercentage","shouldTrack","tealiumData","TealiumData","breakpoints","trackedPercentage","shouldTrackBreakpoint","breakpoint","VPEnums","progressApiTmp","FETCH_URL","REFRESH_URL","progressApi","VideoProgressManager","getAllProgress","progressObj","progressItem","videoCode","progress","nowTimestamp","requestedTimestamp","getProgressInterval","VPQuery","fetchVideoProgress","_endProgressFired","needSync","_interactionWatcher","_syncIntervalWatcher","_closeToEndWatcher","_prevSyncTimestamp","timeChecking","_checkTimer","dateNow","INPUT_DURATION","_syncProgress","initVideoWatcher","_resetWatcher","_urlCode","_registerCurrentProgress","_syncingWatchInterval","_closeToEndInterval","_currentProgressItem","INTERVAL_DURATION","THRESHHOLD_SECONDS","END_INTERVAL","msProgress","syncServerProgress","getHeaders","tenAuth","CONTENT_TYPE","header","videoObject","textTrackContainer","textTrackStartTime","textTrackEndTime","ccText","textTrackElement","textTrackEnabled","TEXT_TRACK_AVAILABLE","TEXT_TRACK_ENABLED_CHANGE","removeTextTrackElement","FULLSCREEN_CHANGE","fullscreen","showTextTrackElement","height","updateTextTrack","textCuePoint","activeCue","createTextTrackElement","hasChildNodes","cssBoxContainer","width","cssBoxInner","setAttribute","textTrack","backgroundColor","fontWeight","fontSize","elementId","timeDifference","ticker","parentElement","tickerCountDown","updateTextTrackFontSize","ccBoxContainer","desiredFontSize","_adLoadTimeout","_isFirstPlay","isDaiEnabled","_changeResource","videoChangeHandler","initPlayer","newVideo","_video","noAds","disableAds","_updateVideoNoAds","_updateVideo","_progressMag","playerUIEffects","textTrackManager","videoTextTrackManager","_onPlayerEvent","playerId","upNextPlaying","remainingString","textCuepoint","removeVideoPlayer","_overlayFactories","vodCreatePlayer","ATTEMPT_UNMUTED_THEN_MUTED","onPlayerReady","videoResource","_getVideoResource","adResource","_getAdResource","playbackInfo","videoInfo","playbackInfoResponse","videoInfoResponse","all","getVideoUapInfo","drm","_videoInfo","myResource","progressDuration","getVideoProgress","videoPercentage","cleanTextTrackUrl","captionUrl","propUrlCode","resourceDuration","mediaUrl","textTrackUrl","videoIdForTracking","videoIdForAdCalls","seriesId","episodeId","seriesName","episodeName","demo1","getVODFields","detectDeviceType","isIos","handleVODData","signature","commonParams","imafw__fw_continuous_play","custPram","isSafari","isBrowserEnvironment","drmConfig","laType","playready","laUrl","priority","audioRobustness","videoRobustness","widevine","fairplay","appCertUrl","cert","licenseUrl","ckc","enableStalledAdCheck","vastLoadTimeout","stalledAdThreshold","DASH","filterOutPremiumAudioCodecs","_playerEventToState","onPlayerStateChange","fatal","category","ErrorCategory","RESOURCE","ErrorMessage","IMA_SDK_MISSING","AD","ErrorCode","DAI_DATA_ERROR","AD_STALLED","secondsRemaining","Next","calculateRemainingTime","addRemaingTimeAttribute","AUTOPLAY_BLOCKED","TEXT_CUEPOINT","PlaybackState","PAUSED","PLAYING","playCount","playingCheck","onPlayerEvent","restartVideoWithoutAds","restartPlayerCSAI","remainingText","remainderSeconds","remainingMinutes","checkExist","playBtn","slider","volCtrl","getUrlParam","paramName","performanceMode","PerformanceMode","AUTO","playsInline","enableOm","posterImageUrl","activeMode","ActiveMode","enableMobileCaptionsAndSettings","dash","upnext","enabledFlash","isFlashPlayerEnabled","metaObject","metaDOMs","playerConfig","trackingService","adsServiceConfig","retrievedLocalStorageStte","targettedPageCategories","isTargetedCategoryPage","getShowName","isHubPage","hubName","siteSubSection1","isShow","siteSection","getFeatureAdConfig","pos","sizeAny","parent","insert","into","successLoadCallback","c06_handleSuccessLoad","blankAdCallback","c06_handleBlankLoad","adServiceConfig","staticAdConfig","lazyLoading","pagePathInfo","foundEmptyItem","subUrlPath","sections","n","getUpdatedSections","subUrl","PagePathInfo","pathRule","ptypeRule","clearEnding","pathName","content","pageContentType","section","siteSubSection3","keyValueRule","A_Range","keyValueRules","k","v","pv0","pv24","currentPV","sessionCookie","oneDayCookie","addShowName","addRecipeCollection","recipeCollection","addContentTags","addHubName","addChannelName","collections","concat","exclusionRule","general","extraTargeting","articleTags","recipeTags","adsUtil","replaceSpecChar_cid","recipeTitle","articleTitle","cbsSession","genericSlots","before","mrec_handleSuccessLoad","mrec_handleBlankLoad","desktopSlots","preloadCallback","skin_handlePreload","skin_handleSuccessLoad","skin_handleBlankLoad","adhesion_handlePreload","adhesion_handleSuccessLoad","adhesion_handleBlankLoad","mobileSlots","cidString","DrmFilter","drmFilter","ErrorHandler","vjsErrorHandler","EventHandler","vjsEventHandler","TrackingService","OverlayUI","vjsOverlayUI","VideoPlaySync","vjsVideoPlaySync","VolumeSync","vjsVolumeSync","attributes","baseCustEnv","omniture","namespace","server","nielsen","sfcode","apid","apn","nsdkv","nol_devDebug","eDebug_Title","getIOSVersion","matchResult","gup","isIOSWebkitBrowser","ios","iphone","ipad","desktop","src","Log","debugServiceName","debugConfig","debugUrlParam","ignoreBoolean","formatOutputArgs","arrArgs","convertArgumentToArray","arr","arguments","logCatch","tenDebug","intervalStock","addInterval","baseURL","COPPA_CACHE_KEY","cacheKey","cacheResponse","ttl","getCachedResponse","cachedData","parsedData","isIosPlatform","generateFallbackParams","identifiers","appInfo","imafw__fw_vcid2","userid","getOrCreateUserId","imafw_fms_vcid2type","emailhash","imafw_fms_emailhash","fetchIMSData","deviceInfo","cachedResponse","payload","app","fms_id_ttl","getCachedCoppaStatus","updateCoppaStatus","webhost","googledai","region","lat","ua","rawIdentifiers","subscriberid","removeEmptyStringProperties","isFreewheelDebugEnabled","setCoppaStatus","currentStatus","oldStatus","newStatus","pagePath","pageStructureMap","getPathNameAsArray","getPathPattern","getContentId","getShow","lastSubPath","subSection","reachTheEndOfMenu","nextLevelName","show","slice","adhesionTemplate","divTmp","getAdhesion","adParent","adEvent","createEvent","initEvent","dispatchEvent","handleSuccess","handleBlank","handleSuccessOfCarousel","handleBlankOfCarousel","imgStyleUrlAttrName","adSkinLeft","adSkinRight","firstChildDiv","parentNode","insertBefore","checkAdImgInterval","adSkinBGImage","getComputedStyle","prevStyle","prevImg","initedSkinHandler","bodyWidth","innerWidth","head","marquee","carousel","slick","marginLeft","currentLeft","newLeft","removeMarginLeft","syncPosition","initSkinHandler","updateSkinImg","eAllocatorService","allocator","Allocator_Video","_firstRoundPlay","initOmniture","initNielsen","calledPrerollBreakStart","validationHost","videoType","dataModelUtil","matchModel","dataModels","eventWillBeHandled","validate","videoLoadMetadata","triggerevent","hasPreroll","videoStartMetadata","videoFirstPlayMetadata","videoPause","videoUnpause","onSegment","videoEndMetadata","adPlayMetadata","onAdStart","adPause","adResume","adStopMetadata","setHasPreroll","adBreakStart","adBreakEnd","onAdBreakComplete","Events","triggeredErrors","pageInfo","platformName","platformPostfix","pageTitle","pageId","isFullEpisode","web_content_url","clip_category","preroll","asset_id","model","dataObject","errorMsg","makeData","mapping","tmp","mappedKey","tenTrackTmp","cookieEnabled","tmpDeviceId","newCookieDeviceId","generateUUID","userId_ten","userId_oztam","userId_nielsen","BrightcoveIMABackendEvent","eIMAEvent","catalogLoad","catalog","useDrmValue","video_type_drm_only","useDrm","sources","filtered","isDrmSource","key_systems","keySystems","isNotDrmSource","cue_points","brightcoveControlledDiv","el","progressHolder","progressBar","cuePointClass","div","getSingletonEventHandlers","eventLog","player_event","loadedMetadata","getMediaData","realFirstPlay","closeTheEnd","ended","trackingSingletonEvents","singletonEventsHandler","handlers","one","trackingFirstPlayEvents","realFirstPlayTriggered","triggerRealFirstPlay","adsPodEndedCallback","playedAds","silentAdTimeout","waitingAd","AdsPodEnded","AdTimeout","ima3","dataAttrs","ima3AdError","headPosition","mediainfoMapping","adsObject","currentPosition","adTypes","adMeta","getAdCompleteData","getTimeInSec","previousSegment","previousPosition","nowSec","hasStarted","AdsPlay","adPlayer","AdsPause","AdsAdStarted","AdsAdEnded","AdsPodStarted","playerCurrentTime","mediaCues","cuePoints","getCues","currentSegment","cues","getSegmentId"],"sourceRoot":""}