{"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/players/HlsPlayer.cjs","../../src/players/HlsPlayer.tsx","../../src/sdk/hlsAdPlayer.ts","../../src/sdk/pal.ts","../../src/utils/mqttConfig.ts","../../src/utils/mqttClient.ts","../../src/utils/vastEnvironmentSignals.ts","../../src/utils/tracking.ts","../../src/utils/polyfills.ts","../../src/utils/vastMacros.ts","../../src/utils/browserCompat.ts","../../src/player/Scte35Parser.ts","../../src/player/Scte35CueManager.ts","../../src/player/AdConfigManager.ts","../../src/player/AdTimingService.ts","../../src/player/PlaceholderLayer.ts","../../src/player/HlsEngine.ts"],"names":["create","__create","Object","__defProp","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__getProtoOf","getPrototypeOf","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toESM","mod","isNodeMode","__esModule","value","__toCommonJS","HlsPlayer_exports","default","MAX_VAST_WRAPPER_DEPTH","originalMutedState","HlsPlayer","exports","import_react","require","import_hls","adPlaying","originalVolume","Math","max","min","contentVideo","volume","listeners","licenseKey","options","Map","mainHlsInstance","adHls","currentAd","sessionId","preloadedAds","preloadingAds","destroyed","pendingTimeouts","trackingFired","impression","start","firstQuartile","thirdQuartile","complete","emit","event","payload","set","Array","fn","error","console","log","trackingUrl","generateSessionId","Date","now","random","toString","substr","fireTrackingPixels","urls","length","forEach","url","includes","img","Image","src","warn","levels","currentLevel","autoLevel","loadLevel","level","width","height","bitrate","selectBestMediaFile","mediaFiles","Error","firstFile","mainQuality","getMainStreamQuality","scoredFiles","map","file","widthDiff","abs","heightDiff","resolutionDiff","fileBitrate","bitrateDiff","score","sort","a","b","bestMatch","resolution","isHlsMediaFile","mediaFile","type","toLowerCase","isProgressiveMediaFile","startsWith","endsWith","createEmptyTrackingUrls","midpoint","mute","unmute","pause","resume","fullscreen","exitFullscreen","skip","extractTrackingUrls","scope","trackingUrls","querySelectorAll","el","textContent","trim","push","getAttribute","eventKey","mergeTrackingUrls","source","keys","parseVastXml","xmlString","xmlDoc","parser","DOMParser","parseFromString","parserError","querySelector","adElement","adId","title","clickThrough","wrapperUri","vastAdTagUri","isNoAdAvailable","durationText","durationParts","split","duration","parseInt","mediaFileElements","mf","index","bitrateAttr","bitrateValue","ad","id","parseAdElement","credentials","requestVast","response","creds","fetch","vastTagUrl","mode","headers","referrerPolicy","ok","statusText","text","fetchAndParseVastAd","depth","accumulatedTracking","vastXml","parsed","fetchVastXml","substring","fetchAndParsePod","adElements","ads","resolved","aSeq","bSeq","aVal","Number","isFinite","MAX_SAFE_INTEGER","bVal","createAdVideoElement","video","document","createElement","style","left","top","objectFit","backgroundColor","playsInline","muted","setupAdEventListeners","adVideoElement","addEventListener","progress","currentTime","podIndex","podAds","advanceToNextPodAd","handleAdComplete","e","handleAdError","ended","setAdPlayingFlag","isPlaying","dataset","stormcloudAdPlaying","resetQuartileTracking","preserveImpression","loadCurrentAdMedia","isHlsAd","Hls","isSupported","destroy","enableWorker","lowLatencyMode","loadSource","attachMedia","on","Events","MANIFEST_PARSED","play","catch","ERROR","_event","data","fatal","load","total","adContainerEl","display","pointerEvents","continueLiveStreamDuringAds","paused","initialize","container","position","right","bottom","alignItems","justifyContent","zIndex","parentElement","appendChild","requestAds","preloaded","Promise","reject","has","delete","resolve","contentVolume","stop","previousMutedState","visibility","opacity","timeoutId","clearTimeout","remove","removeChild","clear","isAdPlaying","resize","listener","Set","add","off","updateOriginalMutedState","nextVolume","isNaN","getOriginalMutedState","getOriginalVolume","setAdVolume","clamped","getAdVolume","showPlaceholder","hidePlaceholder","getLoadedAdDuration","getLoadedAdId","getPodAdCount","getPodTotalDurationMs","reduce","PAL_SDK_URL","_nonceLoader","loadPalSdk","window","goog","pal","_palLoadPromise","existing","timeout","setTimeout","script","async","setAttribute","onload","getOrCreateNonceLoader","consentSettings","onerror","head","ConsentSettings","allowStorage","NonceLoader","createPalNonceManager","currentNonce","currentNonceManager","generateNonce","loader","request","manager","NonceRequest","adWillAutoPlay","adWillPlayMuted","playerVolume","continuousPlayback","descriptionUrl","location","href","iconsSupported","playerType","playerVersion","supportedApiFrameworks","videoWidth","videoHeight","ppid","loadNonceManager","getNonce","getCurrentNonce","injectNonce","URL","searchParams","base","replace","sep","encodeURIComponent","sendPlaybackStart","sendPlaybackEnd","sendAdClick","sendAdTouch","reset","DEFAULT_MQTT_CONFIG","brokerAddress","topicPrefix","mqttConfig","import_mqtt","LOG","brokerPort","wsPort","username","password","qos","isMQTTEnabled","brokerUrl","buildPlayerTopic","channel","client","status","initMQTTClient","buildMQTTBrokerUrl","clientId","slice","mqtt","connect","keepalive","clean","reconnectPeriod","connectTimeout","queueQoSZero","err","info","message","ensureMQTTClient","publish","topic","JSON","stringify","AIRY_TIZEN_APP_ID","AIRY_ANDROID_APP_ID","AIRY_WEBOS_APP_ID","AIRY_ROKU_APP_ID","AIRY_APP_NAME","AIRY_DEFAULT_CONTENT_URL","LG_TEST_APP_ID","LG_TEST_APP_NAME","_lgTestDeviceId","getLgTestDeviceId","createUuid","isLgWebOS","navigator","test","userAgent","ua","DEVICE_ID_STORAGE_KEYS","ANDROID_ID_TYPES","platformLat","bridgeSignals","readNativeBridgeSignals","deviceId","platformDevice","readPlatformNativeDeviceId","readStoredDeviceId","lg","limitAdTracking","deviceIdType","readStoredString","inferDeviceIdType","readStoredLimitAdTracking","contentUrl","LG_TEST_CONTENT_URL","appId","getDefaultAppId","appName","getOrCreateCtvSessionId","deviceTypeHint","isEquivalentDeviceIdType","tagType","runtimeType","tag","runtime","resolveNativeDeviceId","isMacroPlaceholder","isZeroedAdId","getOrCreateStoredUuid","storageKey","readPersistentId","writePersistentId","CTV_SESSION_STORAGE_KEY","readCookie","localStorage","setItem","writeCookie","PERSISTENT_ID_COOKIE_MAX_AGE","prefix","parts","cookie","part","entry","decodeURIComponent","bytes","crypto","randomUUID","Uint8Array","getRandomValues","seed","floor","performanceNow","i","hex","padStart","performance","adinfo","webapis","tifa","getTIFA","lat","isLATEnabled","webOSDev","lgudid","LGUDID","roku","Roku","rida","getPublisherUniqueId","ZEROED_AD_ID_PATTERNS","t","candidates","__STORMCLOUD_CTV_AD_INFO__","__STORMCLOUD_CTV__","stormcloudCtv","AiryTV","Android","webOS","tizen","amazon","filter","Boolean","readBridgeValue","readBridgeBoolean","result","normalized","normalizeBoolean","getItem","cachedBrowserId","buildAnalyticsContext","config","context","debugAdTiming","isLiveStream","inputStreamType","getClientInfo","screen","platform","vendor","maxTouchPoints","memory","deviceMemory","hardwareConcurrency","screenInfo","availWidth","availHeight","orientation","pixelDepth","deviceType","brand","model","isSmartTV","isAndroid","isWebView","isWebApp","webosMatch","match","os","tizenMatch","tvMatch","androidModelMatch","outerHeight","outerWidth","matchMedia","matches","standalone","angle","domain","hostname","origin","path","pathname","language","languages","join","cookieEnabled","doNotTrack","referrer","visibilityState","sha256Hex","input","encodedData","utf8","buffer","hashBuffer","hash","char","fallbackHash","timestamp","subtle","digest","TextEncoder","encode","unescape","charCodeAt","padEnd","resolvePlayerIdentitySeed","clientInfo","nativeDeviceId","persistedId","PLAYER_ID_STORAGE_KEY","getBrowserID","canPublish","buildPlayerMetricEvent","flags","playerId","captureAt","toISOString","player_id","device_type","ad_loaded","adLoaded","ad_detect","adDetect","capture_at","input_stream_type","publishTracking","body","publishMQTT","sendInitialTracking","metricEvent","events","adDetectInfo","sendHeartbeat","sendAdLoadedTracking","adLoadedInfo","sendAdImpressionTracking","adImpressionInfo","ad_played_count","ad_url","adUrl","heartbeatData","polyfillURLSearchParams","URLSearchParams","URLSearchParamsPolyfill","params","init","parseQueryString","append","query","cleanQuery","param","decodedKey","safeDecodeURIComponent","decodedValue","str","values","String","getAll","callback","polyfillTextEncoder","TextEncoderPolyfill","charcode","polyfillPromiseFinally","finally","constructor","then","reason","polyfillObjectAssign","assign","sources","TypeError","nextSource","nextKey","polyfillArrayFrom","arrayLike","mapFn","thisArg","items","len","polyfillStringStartsWith","search","pos","polyfillStringEndsWith","polyfillStringIncludes","indexOf","initializePolyfills","UNEXPANDED_MACRO_PATTERN","INVALID_VAST_PARAM_KEY","EXAMPLE_COM_URL","CTV_UNSUPPORTED_PARAMS","INLINE_DEVICE_MACRO_REPLACEMENTS","getValue","ctx","pattern","trimmed","generateCorrelator","buf","Uint32Array","expandInlineMacroPlaceholders","baseUrl","applyDeviceIdentityParams","runtimeId","tagRdid","tagLat","latValue","tagRdidValid","tagTypeValid","removeBrokenAppNameOrphans","_value","toDelete","suffix","trimStart","normalizeVastTagUrl","raw","anValue","orphanFragments","reconstructed","trimEnd","_match","val","applyVastMacros","expandedUrl","replaceCorrelatorFallback","correlator","streamCorrelator","isCtv","pod","podMinDurationMs","round","podMaxDurationMs","podMaxAds","requestUrl","pageUrl","fetchConsentSignals","consent","staleKeys","existingUrl","gdpr","gdprConsent","usPrivacy","adTest","correlatorRegex","timeoutMs","signals","tasks","tcfApi","settled","tcData","success","eventStatus","gdprApplies","tcString","listenerId","uspApi","__uspapi","uspString","getChromeVersion","getWebKitVersion","getPlatform","userAgentData","detectBrowser","version","majorVersion","isLegacyTV","supportsModernJS","webOSVersion","tizenVersion","chromeVersionNum","chromeVersion","webkitVersion","getBrowserConfigOverrides","browser","overrides","allowNativeHls","logBrowserInfo","debug","parseCueOutDuration","num","parseFloat","dStr","d","parseCueOutCont","res","durationMatch","elapsedMatch","elapsed","slashMatch","parseAttributeList","attrs","regex","exec","rawVal","toNumber","n","isManifestBasedMarker","marker","id3","splice_command_type","decodeId3ValueToText","decoder","TextDecoder","decode","out","fromCharCode","getFragmentStartSeconds","frag","startPTS","candidate","parseScte35FromId3","cueOutMatch","arg","dur","ptsSeconds","durationSeconds","cueOutContMatch","cont","cueInMatch","daterangeMatch","hasScteOut","hasScteIn","klass","bin","parseScte35Binary","normalizeFragmentPayload","ArrayBuffer","isView","view","byteOffset","byteLength","detectTsPacketFormat","packetSizes","packetSize","tsPayloadOffset","offset","matchedPackets","packetStart","getPsiSectionStart","payloadUnitStart","pointerField","sectionStart","getPsiSectionLength","parsePatSection","pmtPids","sectionLength","sectionEnd","programNumber","pid","descriptorsIdentifyScte35","end","descriptorEnd","descriptorStart","registration","parsePmtSection","tsScte35Pids","programInfoLength","streamType","elementaryPid","esInfoLength","hasProcessedTsScte35Section","section","processedSections","checksum","size","firstKey","next","addScte35SectionMarker","markers","appendScte35Bytes","assemblers","assembler","expectedLength","collectScte35SectionsFromPayload","previousAssembler","subarray","tableId","totalLength","parseScte35FromTsPackets","packetInfo","sectionAssemblers","tsStart","secondByte","thirdByte","fourthByte","adaptationFieldControl","hasPayload","payloadStart","adaptationLength","payloadEnd","BitReader","bytePos","bitPos","readBits","numBits","remainingInByte","toRead","currentByte","shift","mask","bits","skipBits","bytePosition","readSpliceTime","r","ptsAdjustmentTicks","timeSpecifiedFlag","high","low","ptsTicks","markerTypeFromSegmentationTypeId","segmentationTypeId","parseScte35SegmentationDescriptor","descriptor","identifier","segmentationEventId","cancelIndicator","segmentationDurationFlag","programSegmentationFlag","componentCount","durationTicks","markerType","parseScte35SegmentationDescriptors","descriptorLoopLength","descriptorOffset","descriptorTag","descriptorLength","descriptorDataStart","descriptorDataEnd","descriptorMarker","ptsAdjHigh","cancel","ptsAdjLow","spliceCommandLength","spliceCommandType","spliceEventId","commandBodyStart","outOfNetwork","programSpliceFlag","spliceImmediateFlag","componentPtsSeconds","durationFlag","expectedDescriptorOffset","splice_event_id","segmentation_event_id","Scte35CueManager","callbacks","recentScte35CueKeys","recentScte35CueLimit","processedTsScte35Sections","pendingScte35CueKey","pendingScte35CueKeyValue","activeScte35BreakKey","scheduledScte35BreakKey","scheduledScte35BreakKeyValue","createScte35CueContext","readiness","sn","fragmentSn","fragmentStartSec","fragmentStartSeconds","onScte35Cue","cue","createScte35Cue","pendingKey","getPendingScte35CueKey","pendingScte35Cues","trimRecentScte35CueMaps","onEarlyStartCue","shouldAcceptScte35EndCue","activeScte35BreakKeyValue","inAdBreak","isInAdBreak","markScte35CueHandled","onPlaybackCue","activatePendingScte35CuesForFragment","matchingCues","entries","getScte35CueKey","getScte35MarkerRaw","toIdentityString","daterangeId","ID","scteValue","isStrongScte35CueKey","hasRecentlyHandledScte35Cue","recentKey","AdConfigManager","vmapBreaks","consumedVmapBreakIds","viewCorrelator","consentSignals","podCounter","podAssignedByPrefetch","defaultPodMaxAds","defaultPodMaxDurationMs","isVmapEnabled","isVmap","vmapUrl","fetchAdConfiguration","vastMode","vastEndpoint","apiUrl","imaPayload","decodedPayload","numberAds","fetchAndParseVmap","apiVastTagUrl","json","ima","vast","cue_tones","number_ads","apiNumberAds","vmapXml","parseVmapToBreaks","adBreakNodes","doc","VMAP_NS","getElementsByTagNameNS","getElementsByTagName","localName","node","timeOffsetRaw","startTimeMs","parseVmapTimeOffsetToMs","adTagNode","adTagUrl","breakId","hms","aStart","bStart","timeOffset","hh","mm","ss","ms","hours","minutes","seconds","millis","percent","ratio","durationSec","getAdBreakKey","adBreak","resolveBreakStartMs","findCurrentOrNextBreak","nowMs","schedule","tol","driftToleranceMs","breakStartMs","findBreakForTime","durationMs","selectVastTagsForBreak","s","resolvePodParams","maxDurationMs","minDurationMs","beginNewAdPod","breakDurationMs","maxAds","podExactDuration","generatePodVastUrl","podParams","adPlayer","palNonce","sendHeartbeatIfNeeded","envSignals","resolveVastEnvironmentSignals","ctvAdRequest","urlWithMacros","autoplay","finalUrl","initializeTracking","heartbeatInterval","setInterval","lastHeartbeatTime","destroyTracking","clearInterval","AdTimingService","defaultMinRemainingMsToStartAd","globalNoFillCooldownUntil","adRequestWatchdogToken","adFailsafeToken","ptsDriftEmaMs","adBreakPlayedDurationMs","adBreakEpoch","adRequestTokenCounter","activeAdRequestToken","currentAdIndex","totalAdsInBreak","totalAdRequestsInBreak","maxTotalAdRequestsPerBreak","lastAdRequestTime","consecutiveFailures","maxConsecutiveFailures","minAdRequestIntervalMs","backoffBaseMs","maxBackoffMs","failedVastUrls","temporaryFailureUrls","globalConsecutiveNoFills","globalNoFillThreshold","globalNoFillBackoffBaseMs","globalNoFillBackoffMaxMs","globalLastGamRequestTime","globalMinGamIntervalMs","scheduleAdStopCountdown","remainingMs","clearAdStopTimer","ensureAdStoppedByTimer","adStopTimerId","onAdStopTimerFired","scheduleAdStartIn","delayMs","cueKey","onAdStartTimerFired","scteAdBreakEndWallClockMs","currentAdBreakStartWallClockMs","adStartTimerId","clearAdStartTimer","updatePtsDrift","ptsSecondsSample","sampleMs","alpha","resolveScteBreakStartWallClockMs","nowWallClockMs","estimatedCurrentPtsMs","deltaMs","setAdBreakDurationBoundary","expectedAdBreakDurationMs","scheduleAdStopAtBreakBoundary","getWallClockRemainingAdMs","endWallClockMs","getAdBreakEndWallClockMs","getDurationBudgetRemainingMs","getLoadedAdDurationMs","adController","adFitsRemainingBudget","logAdDurationDecision","accepted","remainingBudget","recordPlayedAdDuration","ensureLoadedAdFitsBudget","fits","rejectLoadedAdForDuration","markAdStarted","notePodAdStarted","getRemainingAdMs","wallClockRemaining","budgetRemaining","getMinRemainingMsToStartAd","configured","minRemainingMsToStartAd","hasTimeToStartAnotherAd","minRemaining","isTemporaryAdError","isUrlInCooldown","failureTime","cleanupTemporaryFailures","temporaryFailureCooldownMs","isGamInCooldown","recordGamNoFill","backoff","pow","exponent","resetGamNoFillCounter","enforceGlobalRateLimit","waitMs","startAdRequestWatchdog","token","clearAdRequestWatchdog","adFailsafeTimeoutMs","adRequestWatchdogId","logAdState","onWatchdogTimeout","failsafeMs","startAdFailsafeTimer","clearAdFailsafeTimer","adFailsafeTimerId","videoPaused","onFailsafeTimeout","extra","showAds","resetForBreakEnd","PlaceholderLayer","ensureContainer","transition","show","wasHidden","offsetHeight","requestAnimationFrame","hide","HlsEngine","cueManager","timing","nativeHlsMode","videoSrcProtection","bufferedSegmentsCount","shouldAutoplayAfterBuffering","shouldUseNativeHls","getStreamType","canNative","canPlayType","setupNativeHls","adBehavior","isLive","setupHls","hls","import_hls2","backBufferLength","liveDurationInfinity","maxLiveSyncPlaybackRate","liveSyncDuration","maxBufferLength","maxMaxBufferLength","maxBufferSize","maxBufferHole","highBufferWatchdogPeriod","nudgeOffset","nudgeMaxRetry","startPosition","MEDIA_ATTACHED","_","_data","minSegments","some","details","live","onManifestParsed","hasInitialBufferCompleted","minSegmentsBeforePlay","LEVEL_LOADED","_evt","hasPendingAdBreak","fragments","fragmentsToScan","tagList","isArray","idx","earlyDetection","FRAG_BUFFERED","FRAG_PARSING_METADATA","id3Tags","samples","pts","onId3Tag","FRAG_LOADED","processFragmentScte35Payload","FRAG_DECRYPTED","FRAG_CHANGED","activatePendingCuesForFragment","prog"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n  for (var name in all)\n    __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n  if (from && typeof from === \"object\" || typeof from === \"function\") {\n    for (let key of __getOwnPropNames(from))\n      if (!__hasOwnProp.call(to, key) && key !== except)\n        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n  }\n  return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n  // If the importer is in node compatibility mode or this is not an ESM\n  // file that has been converted to a CommonJS file using a Babel-\n  // compatible transform (i.e. \"__esModule\" has not been set), then set\n  // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n  isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n  mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/players/HlsPlayer.tsx\nvar HlsPlayer_exports = {};\n__export(HlsPlayer_exports, {\n  default: () => HlsPlayer\n});\nmodule.exports = __toCommonJS(HlsPlayer_exports);\nvar import_react = require(\"react\");\n\n// src/sdk/hlsAdPlayer.ts\nvar import_hls = __toESM(require(\"hls.js\"), 1);\nvar MAX_VAST_WRAPPER_DEPTH = 5;\nfunction createHlsAdPlayer(contentVideo, options) {\n  let adPlaying = false;\n  let originalMutedState = false;\n  let originalVolume = Math.max(0, Math.min(1, contentVideo.volume || 1));\n  const listeners = /* @__PURE__ */ new Map();\n  const licenseKey = options?.licenseKey;\n  const mainHlsInstance = options?.mainHlsInstance;\n  let adVideoElement;\n  let adHls;\n  let adContainerEl;\n  let currentAd;\n  let podAds = [];\n  let podIndex = 0;\n  let sessionId;\n  const preloadedAds = /* @__PURE__ */ new Map();\n  const preloadingAds = /* @__PURE__ */ new Map();\n  let destroyed = false;\n  let pendingTimeouts = [];\n  let trackingFired = {\n    impression: false,\n    start: false,\n    firstQuartile: false,\n    midpoint: false,\n    thirdQuartile: false,\n    complete: false\n  };\n  function emit(event, payload) {\n    const set = listeners.get(event);\n    if (!set) return;\n    for (const fn of Array.from(set)) {\n      try {\n        fn(payload);\n      } catch (error) {\n        console.warn(\n          `[HlsAdPlayer] Error in event listener for ${event}:`,\n          error\n        );\n      }\n    }\n  }\n  function generateSessionId() {\n    return `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n  }\n  function fireTrackingPixels(urls) {\n    if (!urls || urls.length === 0) return;\n    urls.forEach((url) => {\n      try {\n        let trackingUrl = url;\n        if (sessionId) {\n          trackingUrl = `${trackingUrl}${trackingUrl.includes(\"?\") ? \"&\" : \"?\"}session_id=${sessionId}`;\n        }\n        if (licenseKey) {\n          trackingUrl = `${trackingUrl}${trackingUrl.includes(\"?\") ? \"&\" : \"?\"}license_key=${licenseKey}`;\n        }\n        const img = new Image(1, 1);\n        img.src = trackingUrl;\n        console.log(`[HlsAdPlayer] Fired tracking pixel: ${trackingUrl}`);\n      } catch (error) {\n        console.warn(`[HlsAdPlayer] Error firing tracking pixel:`, error);\n      }\n    });\n  }\n  function getMainStreamQuality() {\n    if (!mainHlsInstance || !mainHlsInstance.levels) {\n      return null;\n    }\n    const currentLevel = mainHlsInstance.currentLevel;\n    if (currentLevel === -1 || !mainHlsInstance.levels[currentLevel]) {\n      const autoLevel = mainHlsInstance.loadLevel;\n      if (autoLevel !== -1 && mainHlsInstance.levels[autoLevel]) {\n        const level2 = mainHlsInstance.levels[autoLevel];\n        return {\n          width: level2.width || 1920,\n          height: level2.height || 1080,\n          bitrate: level2.bitrate || 5e6\n        };\n      }\n      return null;\n    }\n    const level = mainHlsInstance.levels[currentLevel];\n    return {\n      width: level.width || 1920,\n      height: level.height || 1080,\n      bitrate: level.bitrate || 5e6\n    };\n  }\n  function selectBestMediaFile(mediaFiles) {\n    if (mediaFiles.length === 0) {\n      throw new Error(\"No media files available\");\n    }\n    const firstFile = mediaFiles[0];\n    if (!firstFile) {\n      throw new Error(\"No media files available\");\n    }\n    if (mediaFiles.length === 1) {\n      return firstFile;\n    }\n    const mainQuality = getMainStreamQuality();\n    if (!mainQuality) {\n      console.log(\n        \"[HlsAdPlayer] No main stream quality info, using first media file\"\n      );\n      return firstFile;\n    }\n    console.log(\"[HlsAdPlayer] Main stream quality:\", mainQuality);\n    const scoredFiles = mediaFiles.map((file) => {\n      const widthDiff = Math.abs(file.width - mainQuality.width);\n      const heightDiff = Math.abs(file.height - mainQuality.height);\n      const resolutionDiff = widthDiff + heightDiff;\n      const fileBitrate = (file.bitrate || 5e3) * 1e3;\n      const bitrateDiff = Math.abs(fileBitrate - mainQuality.bitrate);\n      const score = resolutionDiff * 2 + bitrateDiff / 1e3;\n      return { file, score, resolutionDiff, bitrateDiff };\n    });\n    scoredFiles.sort((a, b) => a.score - b.score);\n    const bestMatch = scoredFiles[0];\n    if (!bestMatch) {\n      console.log(\"[HlsAdPlayer] No best match found, using first media file\");\n      return firstFile;\n    }\n    console.log(\"[HlsAdPlayer] Selected media file:\", {\n      url: bestMatch.file.url,\n      resolution: `${bestMatch.file.width}x${bestMatch.file.height}`,\n      bitrate: bestMatch.file.bitrate,\n      score: bestMatch.score,\n      resolutionDiff: bestMatch.resolutionDiff,\n      bitrateDiff: bestMatch.bitrateDiff\n    });\n    return bestMatch.file;\n  }\n  function isHlsMediaFile(mediaFile) {\n    const type = mediaFile.type.toLowerCase();\n    const url = mediaFile.url.toLowerCase();\n    return type === \"application/x-mpegurl\" || type === \"application/vnd.apple.mpegurl\" || type.includes(\"mpegurl\") || url.includes(\".m3u8\");\n  }\n  function isProgressiveMediaFile(mediaFile) {\n    const type = mediaFile.type.toLowerCase();\n    const url = mediaFile.url.toLowerCase();\n    return type.startsWith(\"video/\") || url.endsWith(\".mp4\") || url.includes(\".mp4?\");\n  }\n  function createEmptyTrackingUrls() {\n    return {\n      impression: [],\n      start: [],\n      firstQuartile: [],\n      midpoint: [],\n      thirdQuartile: [],\n      complete: [],\n      mute: [],\n      unmute: [],\n      pause: [],\n      resume: [],\n      fullscreen: [],\n      exitFullscreen: [],\n      skip: [],\n      error: []\n    };\n  }\n  function extractTrackingUrls(scope) {\n    const trackingUrls = createEmptyTrackingUrls();\n    scope.querySelectorAll(\"Impression\").forEach((el) => {\n      const url = el.textContent?.trim();\n      if (url) trackingUrls.impression.push(url);\n    });\n    scope.querySelectorAll(\"Tracking\").forEach((el) => {\n      const event = el.getAttribute(\"event\");\n      const url = el.textContent?.trim();\n      if (event && url) {\n        const eventKey = event;\n        if (trackingUrls[eventKey]) {\n          trackingUrls[eventKey].push(url);\n        }\n      }\n    });\n    scope.querySelectorAll(\"Error\").forEach((el) => {\n      const url = el.textContent?.trim();\n      if (url) trackingUrls.error.push(url);\n    });\n    return trackingUrls;\n  }\n  function mergeTrackingUrls(target, source) {\n    Object.keys(target).forEach((key) => {\n      if (source[key] && source[key].length > 0) {\n        target[key] = target[key].concat(source[key]);\n      }\n    });\n    return target;\n  }\n  function parseVastXml(xmlString) {\n    try {\n      const parser = new DOMParser();\n      const xmlDoc = parser.parseFromString(xmlString, \"text/xml\");\n      const parserError = xmlDoc.querySelector(\"parsererror\");\n      if (parserError) {\n        console.error(\n          \"[HlsAdPlayer] XML parsing error (malformed VAST XML):\",\n          parserError.textContent\n        );\n        return { type: \"empty\" };\n      }\n      const adElement = xmlDoc.querySelector(\"Ad\");\n      if (!adElement) {\n        console.warn(\"[HlsAdPlayer] No Ad element found in VAST XML\");\n        return { type: \"empty\" };\n      }\n      const adId = adElement.getAttribute(\"id\") || \"unknown\";\n      const title = xmlDoc.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n      const clickThrough = xmlDoc.querySelector(\"ClickThrough\")?.textContent?.trim();\n      const wrapperUri = xmlDoc.querySelector(\"VASTAdTagURI\")?.textContent?.trim();\n      if (wrapperUri) {\n        console.log(\n          `[HlsAdPlayer] VAST wrapper detected, following VASTAdTagURI: ${wrapperUri}`\n        );\n        return {\n          type: \"wrapper\",\n          vastAdTagUri: wrapperUri,\n          trackingUrls: extractTrackingUrls(xmlDoc),\n          clickThrough\n        };\n      }\n      const isNoAdAvailable = adId === \"empty\" || title.toLowerCase().includes(\"no ad available\") || title.toLowerCase() === \"no ad available\";\n      const durationText = xmlDoc.querySelector(\"Duration\")?.textContent || \"00:00:30\";\n      const durationParts = durationText.split(\":\");\n      const duration = parseInt(durationParts[0] || \"0\", 10) * 3600 + parseInt(durationParts[1] || \"0\", 10) * 60 + parseInt(durationParts[2] || \"0\", 10);\n      const mediaFileElements = xmlDoc.querySelectorAll(\"MediaFile\");\n      const mediaFiles = [];\n      console.log(\n        `[HlsAdPlayer] Found ${mediaFileElements.length} MediaFile element(s) in VAST XML`\n      );\n      mediaFileElements.forEach((mf, index) => {\n        const type = mf.getAttribute(\"type\") || \"\";\n        const url = mf.textContent?.trim() || \"\";\n        const width = mf.getAttribute(\"width\") || \"\";\n        const height = mf.getAttribute(\"height\") || \"\";\n        console.log(\n          `[HlsAdPlayer] MediaFile ${index}: type=\"${type}\", url=\"${url}\", width=\"${width}\", height=\"${height}\"`\n        );\n        const mediaFile = {\n          url,\n          type,\n          width: parseInt(width || \"1920\", 10),\n          height: parseInt(height || \"1080\", 10),\n          bitrate: void 0\n        };\n        if (!url) {\n          console.warn(`[HlsAdPlayer] MediaFile ${index} has empty URL`);\n          return;\n        }\n        const bitrateAttr = mf.getAttribute(\"bitrate\");\n        const bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;\n        mediaFile.bitrate = bitrateValue && bitrateValue > 0 ? bitrateValue : void 0;\n        if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n          mediaFiles.push(mediaFile);\n          console.log(\n            `[HlsAdPlayer] Added ${isHlsMediaFile(mediaFile) ? \"HLS\" : \"progressive\"} MediaFile: ${url}`\n          );\n        } else {\n          console.log(\n            `[HlsAdPlayer] MediaFile ${index} ignored (type=\"${type}\" is not supported)`\n          );\n        }\n      });\n      if (mediaFiles.length === 0) {\n        if (isNoAdAvailable) {\n          console.warn(\n            \"[HlsAdPlayer] No ads available (VAST response indicates no ads)\"\n          );\n        } else {\n          console.warn(\"[HlsAdPlayer] No supported media files found in VAST XML\");\n        }\n        return { type: \"empty\" };\n      }\n      return {\n        type: \"inline\",\n        ad: {\n          id: adId,\n          title,\n          duration,\n          mediaFiles,\n          trackingUrls: extractTrackingUrls(xmlDoc),\n          clickThrough\n        }\n      };\n    } catch (error) {\n      console.error(\"[HlsAdPlayer] Error parsing VAST XML:\", error);\n      return { type: \"empty\" };\n    }\n  }\n  function parseAdElement(adElement) {\n    try {\n      const adId = adElement.getAttribute(\"id\") || \"unknown\";\n      const title = adElement.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n      const clickThrough = adElement.querySelector(\"ClickThrough\")?.textContent?.trim();\n      const wrapperUri = adElement.querySelector(\"VASTAdTagURI\")?.textContent?.trim();\n      if (wrapperUri) {\n        return {\n          type: \"wrapper\",\n          vastAdTagUri: wrapperUri,\n          trackingUrls: extractTrackingUrls(adElement),\n          clickThrough\n        };\n      }\n      const isNoAdAvailable = adId === \"empty\" || title.toLowerCase().includes(\"no ad available\") || title.toLowerCase() === \"no ad available\";\n      const durationText = adElement.querySelector(\"Duration\")?.textContent || \"00:00:30\";\n      const durationParts = durationText.split(\":\");\n      const duration = parseInt(durationParts[0] || \"0\", 10) * 3600 + parseInt(durationParts[1] || \"0\", 10) * 60 + parseInt(durationParts[2] || \"0\", 10);\n      const mediaFileElements = adElement.querySelectorAll(\"MediaFile\");\n      const mediaFiles = [];\n      mediaFileElements.forEach((mf) => {\n        const type = mf.getAttribute(\"type\") || \"\";\n        const url = mf.textContent?.trim() || \"\";\n        const width = mf.getAttribute(\"width\") || \"\";\n        const height = mf.getAttribute(\"height\") || \"\";\n        if (!url) return;\n        const bitrateAttr = mf.getAttribute(\"bitrate\");\n        const bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;\n        const mediaFile = {\n          url,\n          type,\n          width: parseInt(width || \"1920\", 10),\n          height: parseInt(height || \"1080\", 10),\n          bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : void 0\n        };\n        if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n          mediaFiles.push(mediaFile);\n        }\n      });\n      if (mediaFiles.length === 0) {\n        if (isNoAdAvailable) {\n          console.warn(\n            \"[HlsAdPlayer] Pod <Ad> indicates no ad available\"\n          );\n        } else {\n          console.warn(\"[HlsAdPlayer] No supported media files in pod <Ad>\");\n        }\n        return { type: \"empty\" };\n      }\n      return {\n        type: \"inline\",\n        ad: {\n          id: adId,\n          title,\n          duration,\n          mediaFiles,\n          trackingUrls: extractTrackingUrls(adElement),\n          clickThrough\n        }\n      };\n    } catch (error) {\n      console.error(\"[HlsAdPlayer] Error parsing pod <Ad> element:\", error);\n      return { type: \"empty\" };\n    }\n  }\n  async function fetchVastXml(vastTagUrl, credentials = \"include\") {\n    const requestVast = (creds) => fetch(vastTagUrl, {\n      mode: \"cors\",\n      credentials: creds,\n      headers: {\n        \"Accept\": \"application/xml, text/xml, */*\"\n      },\n      referrerPolicy: \"no-referrer-when-downgrade\"\n    });\n    let response;\n    try {\n      response = await requestVast(credentials);\n    } catch (error) {\n      if (credentials !== \"omit\") {\n        console.warn(\n          `[HlsAdPlayer] VAST fetch failed with credentials=\"${credentials}\", retrying without credentials:`,\n          error\n        );\n        response = await requestVast(\"omit\");\n      } else {\n        throw error;\n      }\n    }\n    if (!response.ok) {\n      throw new Error(`Failed to fetch VAST: ${response.statusText}`);\n    }\n    return response.text();\n  }\n  async function fetchAndParseVastAd(vastTagUrl, depth = 0, accumulatedTracking = createEmptyTrackingUrls()) {\n    const vastXml = await fetchVastXml(\n      vastTagUrl,\n      depth === 0 ? \"include\" : \"omit\"\n    );\n    console.log(\"[HlsAdPlayer] VAST XML received\");\n    console.log(\n      \"[HlsAdPlayer] VAST XML content (first 2000 chars):\",\n      vastXml.substring(0, 2e3)\n    );\n    const parsed = parseVastXml(vastXml);\n    if (parsed.type === \"empty\") {\n      return null;\n    }\n    if (parsed.type === \"wrapper\") {\n      if (depth >= MAX_VAST_WRAPPER_DEPTH) {\n        console.warn(\n          `[HlsAdPlayer] VAST wrapper depth limit (${MAX_VAST_WRAPPER_DEPTH}) reached, aborting redirect chain`\n        );\n        return null;\n      }\n      mergeTrackingUrls(accumulatedTracking, parsed.trackingUrls);\n      return fetchAndParseVastAd(\n        parsed.vastAdTagUri,\n        depth + 1,\n        accumulatedTracking\n      );\n    }\n    mergeTrackingUrls(parsed.ad.trackingUrls, accumulatedTracking);\n    return parsed.ad;\n  }\n  async function fetchAndParsePod(vastTagUrl) {\n    const vastXml = await fetchVastXml(vastTagUrl);\n    console.log(\"[HlsAdPlayer] Pod VAST XML received\");\n    const parser = new DOMParser();\n    const xmlDoc = parser.parseFromString(vastXml, \"text/xml\");\n    if (xmlDoc.querySelector(\"parsererror\")) {\n      console.error(\"[HlsAdPlayer] Pod VAST XML parsing error (malformed)\");\n      return [];\n    }\n    const adElements = Array.from(xmlDoc.querySelectorAll(\"Ad\"));\n    if (adElements.length === 0) {\n      console.warn(\"[HlsAdPlayer] No <Ad> elements found in pod VAST response\");\n      return [];\n    }\n    adElements.sort((a, b) => {\n      const aSeq = parseInt(a.getAttribute(\"sequence\") || \"\", 10);\n      const bSeq = parseInt(b.getAttribute(\"sequence\") || \"\", 10);\n      const aVal = Number.isFinite(aSeq) ? aSeq : Number.MAX_SAFE_INTEGER;\n      const bVal = Number.isFinite(bSeq) ? bSeq : Number.MAX_SAFE_INTEGER;\n      return aVal - bVal;\n    });\n    const ads = [];\n    for (const adElement of adElements) {\n      const parsed = parseAdElement(adElement);\n      if (parsed.type === \"inline\") {\n        ads.push(parsed.ad);\n      } else if (parsed.type === \"wrapper\") {\n        try {\n          const resolved = await fetchAndParseVastAd(\n            parsed.vastAdTagUri,\n            1,\n            parsed.trackingUrls\n          );\n          if (resolved) {\n            ads.push(resolved);\n          }\n        } catch (error) {\n          console.warn(\n            \"[HlsAdPlayer] Failed to resolve wrapper <Ad> in pod:\",\n            error\n          );\n        }\n      }\n    }\n    console.log(`[HlsAdPlayer] Parsed ${ads.length} ad(s) from pod VAST response`);\n    return ads;\n  }\n  function createAdVideoElement() {\n    const video = document.createElement(\"video\");\n    video.style.position = \"absolute\";\n    video.style.left = \"0\";\n    video.style.top = \"0\";\n    video.style.width = \"100%\";\n    video.style.height = \"100%\";\n    video.style.objectFit = \"contain\";\n    video.style.backgroundColor = \"#000\";\n    video.playsInline = true;\n    video.muted = false;\n    video.volume = 1;\n    console.log(\n      `[HlsAdPlayer] Created ad video element with volume ${video.volume}`\n    );\n    return video;\n  }\n  function setupAdEventListeners() {\n    if (!adVideoElement || !currentAd) return;\n    adVideoElement.addEventListener(\"timeupdate\", () => {\n      if (!currentAd || !adVideoElement) return;\n      const progress = adVideoElement.currentTime / currentAd.duration;\n      if (progress >= 0.25 && !trackingFired.firstQuartile) {\n        trackingFired.firstQuartile = true;\n        fireTrackingPixels(currentAd.trackingUrls.firstQuartile);\n      }\n      if (progress >= 0.5 && !trackingFired.midpoint) {\n        trackingFired.midpoint = true;\n        fireTrackingPixels(currentAd.trackingUrls.midpoint);\n      }\n      if (progress >= 0.75 && !trackingFired.thirdQuartile) {\n        trackingFired.thirdQuartile = true;\n        fireTrackingPixels(currentAd.trackingUrls.thirdQuartile);\n      }\n    });\n    adVideoElement.addEventListener(\"playing\", () => {\n      if (!currentAd || trackingFired.start) return;\n      trackingFired.start = true;\n      fireTrackingPixels(currentAd.trackingUrls.start);\n      console.log(\"[HlsAdPlayer] Ad started playing\");\n    });\n    adVideoElement.addEventListener(\"ended\", () => {\n      if (!currentAd || trackingFired.complete) return;\n      trackingFired.complete = true;\n      fireTrackingPixels(currentAd.trackingUrls.complete);\n      console.log(\"[HlsAdPlayer] Ad completed\");\n      if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n        return;\n      }\n      handleAdComplete();\n    });\n    adVideoElement.addEventListener(\"error\", (e) => {\n      if (!adPlaying) return;\n      console.error(\"[HlsAdPlayer] Ad video error:\", e);\n      if (currentAd) {\n        fireTrackingPixels(currentAd.trackingUrls.error);\n      }\n      if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n        return;\n      }\n      handleAdError();\n    });\n    adVideoElement.addEventListener(\"volumechange\", () => {\n      if (!currentAd) return;\n      if (adVideoElement.muted) {\n        fireTrackingPixels(currentAd.trackingUrls.mute);\n      } else {\n        fireTrackingPixels(currentAd.trackingUrls.unmute);\n      }\n    });\n    adVideoElement.addEventListener(\"pause\", () => {\n      if (currentAd && !adVideoElement.ended) {\n        fireTrackingPixels(currentAd.trackingUrls.pause);\n      }\n    });\n    adVideoElement.addEventListener(\"play\", () => {\n      if (currentAd && adVideoElement.currentTime > 0) {\n        fireTrackingPixels(currentAd.trackingUrls.resume);\n      }\n    });\n  }\n  function setAdPlayingFlag(isPlaying) {\n    if (isPlaying) {\n      contentVideo.dataset.stormcloudAdPlaying = \"true\";\n    } else {\n      delete contentVideo.dataset.stormcloudAdPlaying;\n    }\n  }\n  function resetQuartileTracking(preserveImpression) {\n    trackingFired = {\n      impression: preserveImpression ? trackingFired.impression : false,\n      start: false,\n      firstQuartile: false,\n      midpoint: false,\n      thirdQuartile: false,\n      complete: false\n    };\n  }\n  function loadCurrentAdMedia() {\n    if (!adVideoElement || !currentAd) {\n      throw new Error(\"No ad video element or ad to load\");\n    }\n    const mediaFile = selectBestMediaFile(currentAd.mediaFiles);\n    if (!mediaFile) {\n      throw new Error(\"No media file available for ad\");\n    }\n    const isHlsAd = isHlsMediaFile(mediaFile);\n    console.log(\n      `[HlsAdPlayer] Loading ${isHlsAd ? \"HLS\" : \"progressive\"} ad (pod ${podIndex + 1}/${podAds.length || 1}) from: ${mediaFile.url}`\n    );\n    if (isHlsAd && import_hls.default.isSupported()) {\n      if (adHls) {\n        adHls.destroy();\n      }\n      adHls = new import_hls.default({\n        enableWorker: true,\n        lowLatencyMode: false\n      });\n      adHls.loadSource(mediaFile.url);\n      adHls.attachMedia(adVideoElement);\n      adHls.on(import_hls.default.Events.MANIFEST_PARSED, () => {\n        console.log(\"[HlsAdPlayer] HLS manifest parsed, starting playback\");\n        adVideoElement.play().catch((error) => {\n          console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n          handleAdError();\n        });\n      });\n      adHls.on(import_hls.default.Events.ERROR, (_event, data) => {\n        console.error(\"[HlsAdPlayer] HLS error:\", data);\n        if (data.fatal) {\n          handleAdError();\n        }\n      });\n    } else if (isHlsAd && adVideoElement.canPlayType(\"application/vnd.apple.mpegurl\")) {\n      adVideoElement.src = mediaFile.url;\n      adVideoElement.play().catch((error) => {\n        console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n        handleAdError();\n      });\n    } else if (!isHlsAd && isProgressiveMediaFile(mediaFile)) {\n      if (adHls) {\n        adHls.destroy();\n        adHls = void 0;\n      }\n      adVideoElement.src = mediaFile.url;\n      adVideoElement.load();\n      adVideoElement.play().catch((error) => {\n        console.error(\"[HlsAdPlayer] Error starting progressive ad playback:\", error);\n        handleAdError();\n      });\n    } else {\n      throw new Error(`Unsupported ad media file type: ${mediaFile.type}`);\n    }\n  }\n  function advanceToNextPodAd() {\n    if (podIndex >= podAds.length - 1) {\n      return false;\n    }\n    podIndex++;\n    currentAd = podAds[podIndex];\n    resetQuartileTracking(false);\n    if (currentAd) {\n      fireTrackingPixels(currentAd.trackingUrls.impression);\n      trackingFired.impression = true;\n      console.log(\n        `[HlsAdPlayer] Advancing to next pod ad (${podIndex + 1}/${podAds.length}): ${currentAd.title}, duration: ${currentAd.duration}s`\n      );\n    }\n    try {\n      loadCurrentAdMedia();\n      emit(\"pod_ad_started\", { index: podIndex, total: podAds.length });\n      return true;\n    } catch (error) {\n      console.error(\"[HlsAdPlayer] Failed to load next pod ad:\", error);\n      return false;\n    }\n  }\n  function handleAdComplete() {\n    console.log(\"[HlsAdPlayer] Handling ad completion\");\n    adPlaying = false;\n    setAdPlayingFlag(false);\n    contentVideo.muted = true;\n    if (adContainerEl) {\n      adContainerEl.style.display = \"none\";\n      adContainerEl.style.pointerEvents = \"none\";\n    }\n    if (options?.continueLiveStreamDuringAds) {\n      if (contentVideo.paused) {\n        console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback\");\n        contentVideo.play().catch(() => {\n        });\n      } else {\n        console.log(\"[HlsAdPlayer] Content video already playing in live mode\");\n      }\n    }\n    emit(\"content_resume\");\n  }\n  function handleAdError() {\n    console.log(\"[HlsAdPlayer] Handling ad error\");\n    adPlaying = false;\n    setAdPlayingFlag(false);\n    contentVideo.muted = true;\n    if (adContainerEl) {\n      adContainerEl.style.display = \"none\";\n      adContainerEl.style.pointerEvents = \"none\";\n    }\n    emit(\"ad_error\");\n  }\n  return {\n    initialize() {\n      console.log(\"[HlsAdPlayer] Initializing\");\n      if (!adContainerEl) {\n        const container = document.createElement(\"div\");\n        container.style.position = \"absolute\";\n        container.style.left = \"0\";\n        container.style.top = \"0\";\n        container.style.right = \"0\";\n        container.style.bottom = \"0\";\n        container.style.display = \"none\";\n        container.style.alignItems = \"center\";\n        container.style.justifyContent = \"center\";\n        container.style.pointerEvents = \"none\";\n        container.style.zIndex = \"30\";\n        container.style.backgroundColor = \"#000\";\n        contentVideo.parentElement?.appendChild(container);\n        adContainerEl = container;\n      }\n    },\n    async requestAds(vastTagUrl) {\n      console.log(\"[HlsAdPlayer] Requesting ads:\", vastTagUrl);\n      if (adPlaying) {\n        console.warn(\n          \"[HlsAdPlayer] Cannot request new ads while an ad is playing\"\n        );\n        return Promise.reject(new Error(\"Ad already playing\"));\n      }\n      try {\n        sessionId = generateSessionId();\n        let ads = [];\n        if (preloadedAds.has(vastTagUrl)) {\n          const preloaded = preloadedAds.get(vastTagUrl);\n          preloadedAds.delete(vastTagUrl);\n          if (preloaded) {\n            ads = [preloaded];\n          }\n          console.log(\n            \"[HlsAdPlayer] Using preloaded VAST response:\",\n            vastTagUrl\n          );\n        } else {\n          ads = await fetchAndParsePod(vastTagUrl);\n        }\n        if (!ads.length) {\n          console.warn(\"[HlsAdPlayer] No ads available from VAST response\");\n          emit(\"ad_error\");\n          return Promise.reject(new Error(\"No ads available from VAST response\"));\n        }\n        podAds = ads;\n        podIndex = 0;\n        currentAd = ads[0];\n        console.log(\n          `[HlsAdPlayer] Pod parsed: ${ads.length} ad(s), first=\"${currentAd?.title}\", duration=${currentAd?.duration}s`\n        );\n        if (currentAd) {\n          fireTrackingPixels(currentAd.trackingUrls.impression);\n          trackingFired.impression = true;\n        }\n        return Promise.resolve();\n      } catch (error) {\n        console.error(\"[HlsAdPlayer] Error requesting ads:\", error);\n        emit(\"ad_error\");\n        return Promise.reject(error);\n      }\n    },\n    async play() {\n      if (!currentAd) {\n        console.warn(\n          \"[HlsAdPlayer] Cannot play: No ad loaded (no ads available)\"\n        );\n        return Promise.reject(new Error(\"No ad loaded\"));\n      }\n      console.log(\"[HlsAdPlayer] Starting ad playback\");\n      try {\n        if (!adVideoElement) {\n          adVideoElement = createAdVideoElement();\n          adContainerEl?.appendChild(adVideoElement);\n          setupAdEventListeners();\n        }\n        resetQuartileTracking(true);\n        const contentVolume = contentVideo.volume;\n        originalVolume = Math.max(\n          0,\n          Math.min(1, contentVolume || originalVolume)\n        );\n        if (!options?.continueLiveStreamDuringAds) {\n          contentVideo.pause();\n          console.log(\"[HlsAdPlayer] Content paused (VOD mode)\");\n        } else {\n          console.log(\"[HlsAdPlayer] Content continues (Live mode)\");\n        }\n        console.log(\"[HlsAdPlayer] FORCE MUTING main video\");\n        contentVideo.muted = true;\n        adPlaying = true;\n        setAdPlayingFlag(true);\n        if (adVideoElement) {\n          adVideoElement.volume = Math.max(0, Math.min(1, originalVolume));\n          adVideoElement.muted = originalMutedState;\n          console.log(\n            `[HlsAdPlayer] Set ad video volume to ${adVideoElement.volume}, muted: ${adVideoElement.muted}, originalMutedState: ${originalMutedState}, contentVolume: ${contentVolume}`\n          );\n        }\n        if (adContainerEl) {\n          adContainerEl.style.display = \"flex\";\n          adContainerEl.style.pointerEvents = \"auto\";\n        }\n        emit(\"content_pause\");\n        loadCurrentAdMedia();\n        return Promise.resolve();\n      } catch (error) {\n        console.error(\"[HlsAdPlayer] Error playing ad:\", error);\n        handleAdError();\n        return Promise.reject(error);\n      }\n    },\n    pause() {\n      if (!adPlaying || !adVideoElement) {\n        return;\n      }\n      try {\n        if (adVideoElement && !adVideoElement.paused) {\n          adVideoElement.pause();\n        }\n      } catch (error) {\n        console.warn(\"[HlsAdPlayer] Error pausing ad:\", error);\n      }\n    },\n    resume() {\n      if (!adPlaying || !adVideoElement) {\n        return;\n      }\n      try {\n        if (adVideoElement && adVideoElement.paused) {\n          adVideoElement.play().catch(() => {\n          });\n        }\n      } catch (error) {\n        console.warn(\"[HlsAdPlayer] Error resuming ad:\", error);\n      }\n    },\n    async stop() {\n      console.log(\"[HlsAdPlayer] Stopping ad\");\n      adPlaying = false;\n      setAdPlayingFlag(false);\n      const previousMutedState = contentVideo.muted;\n      contentVideo.muted = originalMutedState;\n      contentVideo.volume = Math.max(0, Math.min(1, originalVolume));\n      console.log(\n        `[HlsAdPlayer] Restored mute state on stop: ${previousMutedState} -> ${originalMutedState}, volume: ${contentVideo.volume}`\n      );\n      if (adContainerEl) {\n        adContainerEl.style.display = \"none\";\n        adContainerEl.style.pointerEvents = \"none\";\n      }\n      contentVideo.style.visibility = \"visible\";\n      contentVideo.style.opacity = \"1\";\n      if (options?.continueLiveStreamDuringAds) {\n        if (contentVideo.paused) {\n          console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback on stop\");\n          contentVideo.play().catch(() => {\n          });\n        }\n      }\n      if (adHls) {\n        adHls.destroy();\n        adHls = void 0;\n      }\n      if (adVideoElement) {\n        adVideoElement.pause();\n        adVideoElement.src = \"\";\n      }\n      currentAd = void 0;\n      podAds = [];\n      podIndex = 0;\n    },\n    destroy() {\n      console.log(\"[HlsAdPlayer] Destroying\");\n      destroyed = true;\n      for (const timeoutId of pendingTimeouts) {\n        clearTimeout(timeoutId);\n      }\n      pendingTimeouts = [];\n      adPlaying = false;\n      setAdPlayingFlag(false);\n      contentVideo.muted = originalMutedState;\n      contentVideo.volume = Math.max(0, Math.min(1, originalVolume));\n      if (adHls) {\n        adHls.destroy();\n        adHls = void 0;\n      }\n      if (adVideoElement) {\n        adVideoElement.pause();\n        adVideoElement.src = \"\";\n        adVideoElement.remove();\n        adVideoElement = void 0;\n      }\n      if (adContainerEl?.parentElement) {\n        adContainerEl.parentElement.removeChild(adContainerEl);\n      }\n      adContainerEl = void 0;\n      currentAd = void 0;\n      podAds = [];\n      podIndex = 0;\n      listeners.clear();\n      preloadedAds.clear();\n      preloadingAds.clear();\n    },\n    isAdPlaying() {\n      return adPlaying;\n    },\n    resize(width, height) {\n      console.log(`[HlsAdPlayer] Resizing to ${width}x${height}`);\n      if (adContainerEl) {\n        adContainerEl.style.width = `${width}px`;\n        adContainerEl.style.height = `${height}px`;\n      }\n      if (adVideoElement) {\n        adVideoElement.style.width = `${width}px`;\n        adVideoElement.style.height = `${height}px`;\n      }\n    },\n    on(event, listener) {\n      if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());\n      listeners.get(event).add(listener);\n    },\n    off(event, listener) {\n      listeners.get(event)?.delete(listener);\n    },\n    updateOriginalMutedState(muted, volume) {\n      const nextVolume = typeof volume === \"number\" && !Number.isNaN(volume) ? Math.max(0, Math.min(1, volume)) : originalVolume;\n      console.log(\n        `[HlsAdPlayer] updateOriginalMutedState called: { muted: ${originalMutedState} -> ${muted}, volume: ${originalVolume} -> ${nextVolume} }`\n      );\n      originalMutedState = muted;\n      originalVolume = nextVolume;\n    },\n    getOriginalMutedState() {\n      return originalMutedState;\n    },\n    getOriginalVolume() {\n      return originalVolume;\n    },\n    setAdVolume(volume) {\n      if (adVideoElement && adPlaying) {\n        const clamped = Math.max(0, Math.min(1, volume));\n        adVideoElement.volume = clamped;\n        adVideoElement.muted = clamped === 0;\n      }\n    },\n    getAdVolume() {\n      if (adVideoElement && adPlaying) {\n        return adVideoElement.volume;\n      }\n      return 1;\n    },\n    showPlaceholder() {\n      contentVideo.style.opacity = \"0\";\n      contentVideo.style.visibility = \"hidden\";\n      if (!adContainerEl) {\n        const container = document.createElement(\"div\");\n        container.style.position = \"absolute\";\n        container.style.left = \"0\";\n        container.style.top = \"0\";\n        container.style.right = \"0\";\n        container.style.bottom = \"0\";\n        container.style.display = \"none\";\n        container.style.alignItems = \"center\";\n        container.style.justifyContent = \"center\";\n        container.style.pointerEvents = \"none\";\n        container.style.zIndex = \"10\";\n        container.style.backgroundColor = \"#000\";\n        contentVideo.parentElement?.appendChild(container);\n        adContainerEl = container;\n      }\n      if (adContainerEl) {\n        adContainerEl.style.display = \"flex\";\n        adContainerEl.style.pointerEvents = \"auto\";\n      }\n    },\n    hidePlaceholder() {\n      if (adContainerEl) {\n        adContainerEl.style.display = \"none\";\n        adContainerEl.style.pointerEvents = \"none\";\n      }\n      if (!adPlaying) {\n        contentVideo.style.visibility = \"visible\";\n        contentVideo.style.opacity = \"1\";\n      }\n    },\n    getLoadedAdDuration() {\n      return currentAd?.duration;\n    },\n    getLoadedAdId() {\n      return currentAd?.id;\n    },\n    getPodAdCount() {\n      return podAds.length;\n    },\n    getPodTotalDurationMs() {\n      return podAds.reduce(\n        (total, ad) => total + (ad.duration > 0 ? ad.duration * 1e3 : 0),\n        0\n      );\n    }\n  };\n}\n\n// src/sdk/pal.ts\nvar PAL_SDK_URL = \"https://imasdk.googleapis.com/pal/sdkloader/pal.js\";\nvar _nonceLoader;\nvar _palLoadPromise;\nfunction loadPalSdk() {\n  if (typeof window !== \"undefined\" && window.goog?.pal) {\n    return Promise.resolve();\n  }\n  if (_palLoadPromise) return _palLoadPromise;\n  _palLoadPromise = new Promise((resolve, reject) => {\n    const existing = document.querySelector(\n      'script[data-pal=\"true\"]'\n    );\n    if (existing) {\n      if (window.goog?.pal) {\n        resolve();\n        return;\n      }\n      const timeout = setTimeout(\n        () => reject(new Error(\"PAL SDK load timeout\")),\n        1e4\n      );\n      existing.addEventListener(\"load\", () => {\n        clearTimeout(timeout);\n        resolve();\n      });\n      existing.addEventListener(\"error\", () => {\n        clearTimeout(timeout);\n        reject(new Error(\"PAL SDK load failed\"));\n      });\n      return;\n    }\n    const script = document.createElement(\"script\");\n    script.src = PAL_SDK_URL;\n    script.async = true;\n    script.setAttribute(\"data-pal\", \"true\");\n    script.onload = () => resolve();\n    script.onerror = () => reject(new Error(\"PAL SDK load failed\"));\n    document.head.appendChild(script);\n  });\n  return _palLoadPromise;\n}\nfunction getOrCreateNonceLoader() {\n  if (_nonceLoader) return _nonceLoader;\n  const goog = window.goog;\n  const consentSettings = new goog.pal.ConsentSettings();\n  consentSettings.allowStorage = true;\n  _nonceLoader = new goog.pal.NonceLoader(consentSettings);\n  return _nonceLoader;\n}\nfunction createPalNonceManager() {\n  let currentNonce = \"\";\n  let currentNonceManager;\n  return {\n    async generateNonce(options = {}) {\n      try {\n        await loadPalSdk();\n        const loader = getOrCreateNonceLoader();\n        const goog = window.goog;\n        const request = new goog.pal.NonceRequest();\n        request.adWillAutoPlay = options.adWillAutoPlay ?? true;\n        request.adWillPlayMuted = options.adWillPlayMuted ?? false;\n        request.playerVolume = options.playerVolume ?? (request.adWillPlayMuted ? 0 : 1);\n        request.continuousPlayback = options.continuousPlayback ?? true;\n        request.descriptionUrl = options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\");\n        request.iconsSupported = true;\n        request.playerType = \"StormcloudVideoPlayer\";\n        request.playerVersion = \"1.0\";\n        request.supportedApiFrameworks = \"2,7,9\";\n        request.url = options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\");\n        request.videoWidth = options.videoWidth || 640;\n        request.videoHeight = options.videoHeight || 480;\n        if (options.ppid) request.ppid = options.ppid;\n        if (options.sessionId) request.sessionId = options.sessionId;\n        console.log(\"[PAL] NonceRequest before generateNonce:\", {\n          adWillAutoPlay: request.adWillAutoPlay,\n          adWillPlayMuted: request.adWillPlayMuted,\n          playerVolume: request.playerVolume,\n          continuousPlayback: request.continuousPlayback,\n          descriptionUrl: request.descriptionUrl,\n          iconsSupported: request.iconsSupported,\n          playerType: request.playerType,\n          playerVersion: request.playerVersion,\n          supportedApiFrameworks: request.supportedApiFrameworks,\n          url: request.url,\n          videoWidth: request.videoWidth,\n          videoHeight: request.videoHeight,\n          ppid: request.ppid,\n          sessionId: request.sessionId\n        });\n        const manager = await loader.loadNonceManager(request);\n        currentNonceManager = manager;\n        currentNonce = manager.getNonce();\n        console.log(\"[PAL] Nonce generated successfully\");\n        return currentNonce;\n      } catch (error) {\n        console.warn(\"[PAL] Failed to generate nonce:\", error);\n        currentNonce = \"\";\n        currentNonceManager = void 0;\n        return \"\";\n      }\n    },\n    getCurrentNonce() {\n      return currentNonce;\n    },\n    injectNonce(vastTagUrl) {\n      if (!currentNonce || !vastTagUrl) return vastTagUrl;\n      try {\n        const url = new URL(vastTagUrl);\n        url.searchParams.delete(\"paln\");\n        url.searchParams.set(\"givn\", currentNonce);\n        return url.toString();\n      } catch {\n        let base = vastTagUrl.replace(/([?&])paln=[^&]*/g, \"\").replace(/[?&]$/, \"\");\n        const sep = base.includes(\"?\") ? \"&\" : \"?\";\n        return `${base}${sep}givn=${encodeURIComponent(currentNonce)}`;\n      }\n    },\n    sendPlaybackStart() {\n      try {\n        currentNonceManager?.sendPlaybackStart();\n      } catch {\n      }\n    },\n    sendPlaybackEnd() {\n      try {\n        currentNonceManager?.sendPlaybackEnd();\n      } catch {\n      }\n    },\n    sendAdClick() {\n      try {\n        currentNonceManager?.sendAdClick();\n      } catch {\n      }\n    },\n    sendAdTouch(event) {\n      try {\n        currentNonceManager?.sendAdTouch(event);\n      } catch {\n      }\n    },\n    reset() {\n      currentNonce = \"\";\n      currentNonceManager = void 0;\n    }\n  };\n}\n\n// src/utils/mqttConfig.ts\nvar DEFAULT_MQTT_CONFIG = {\n  enabled: true,\n  brokerAddress: \"vecbae77.ala.us-east-1.emqxsl.com\",\n  brokerPort: 8883,\n  wsPort: 8084,\n  username: \"for-sonifi\",\n  password: \"sonifi-mqtt\",\n  topicPrefix: \"adstorm/players\",\n  qos: 1\n};\nvar mqttConfig = { ...DEFAULT_MQTT_CONFIG };\nfunction isMQTTEnabled() {\n  return mqttConfig.enabled;\n}\nfunction buildMQTTBrokerUrl() {\n  if (mqttConfig.brokerUrl) return mqttConfig.brokerUrl;\n  return `wss://${mqttConfig.brokerAddress}:${mqttConfig.wsPort}/mqtt`;\n}\nfunction buildPlayerTopic(licenseKey, channel) {\n  return `${mqttConfig.topicPrefix}/${licenseKey}/${channel}`;\n}\n\n// src/utils/mqttClient.ts\nvar import_mqtt = __toESM(require(\"mqtt\"), 1);\nvar LOG = \"[StormcloudVideoPlayer][MQTT]\";\nvar client = null;\nvar status = \"disconnected\";\nfunction initMQTTClient() {\n  if (client || !isMQTTEnabled()) return;\n  const url = buildMQTTBrokerUrl();\n  status = \"connecting\";\n  const clientId = `stormcloud-vp-${Math.random().toString(36).slice(2, 9)}`;\n  try {\n    client = import_mqtt.default.connect(url, {\n      clientId,\n      username: mqttConfig.username,\n      password: mqttConfig.password,\n      keepalive: 60,\n      clean: true,\n      reconnectPeriod: 5e3,\n      connectTimeout: 1e4,\n      queueQoSZero: false\n    });\n  } catch (err) {\n    status = \"error\";\n    console.warn(`${LOG} connect() threw:`, err);\n    return;\n  }\n  client.on(\"connect\", () => {\n    status = \"connected\";\n    console.info(`${LOG} connected to ${url}`);\n  });\n  client.on(\"reconnect\", () => {\n    status = \"connecting\";\n    console.info(`${LOG} reconnecting\\u2026`);\n  });\n  client.on(\"offline\", () => {\n    status = \"disconnected\";\n    console.warn(`${LOG} offline`);\n  });\n  client.on(\"error\", (err) => {\n    status = \"error\";\n    console.warn(`${LOG} error:`, err.message);\n  });\n  client.on(\"close\", () => {\n    if (status === \"connected\") {\n      status = \"disconnected\";\n    }\n  });\n}\nfunction ensureMQTTClient() {\n  if (isMQTTEnabled() && !client) {\n    initMQTTClient();\n  }\n}\nfunction publishMQTT(topic, payload) {\n  if (!isMQTTEnabled()) {\n    return false;\n  }\n  ensureMQTTClient();\n  if (!client) {\n    return false;\n  }\n  try {\n    client.publish(topic, JSON.stringify(payload), { qos: mqttConfig.qos });\n    return true;\n  } catch (err) {\n    console.warn(`${LOG} publish failed on ${topic}:`, err);\n    return false;\n  }\n}\n\n// src/utils/vastEnvironmentSignals.ts\nvar AIRY_ANDROID_APP_ID = \"com.freeairytv.android\";\nvar AIRY_WEBOS_APP_ID = \"com.freeairytv.webos\";\nvar AIRY_TIZEN_APP_ID = \"com.freeairytv.samsung\";\nvar AIRY_ROKU_APP_ID = \"com.freeairytv.roku\";\nvar AIRY_APP_NAME = \"AiryTV Movies & TV\";\nvar AIRY_DEFAULT_CONTENT_URL = \"https://live.airy.tv\";\nvar CTV_SESSION_STORAGE_KEY = \"stormcloud.ctv.sid\";\nvar PLAYER_ID_STORAGE_KEY = \"stormcloud.player.id\";\nvar LG_TEST_APP_ID = \"com.hulu.plus\";\nvar LG_TEST_APP_NAME = \"Hulu\";\nvar LG_TEST_CONTENT_URL = \"https://www.hulu.com/live-tv\";\nvar _lgTestDeviceId;\nfunction getLgTestDeviceId() {\n  if (!_lgTestDeviceId) _lgTestDeviceId = createUuid();\n  return _lgTestDeviceId;\n}\nfunction isLgWebOS() {\n  if (typeof navigator === \"undefined\") return false;\n  return /Web0S|webOS|LG Browser|LGSTB|LGE/i.test(navigator.userAgent);\n}\nfunction getDefaultAppId() {\n  if (typeof navigator === \"undefined\") return AIRY_ANDROID_APP_ID;\n  const ua = navigator.userAgent;\n  if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return AIRY_WEBOS_APP_ID;\n  if (/Tizen|Samsung/i.test(ua)) return AIRY_TIZEN_APP_ID;\n  if (/Roku/i.test(ua)) return AIRY_ROKU_APP_ID;\n  return AIRY_ANDROID_APP_ID;\n}\nvar DEVICE_ID_STORAGE_KEYS = [\n  \"rdid\",\n  \"ifa\",\n  \"advertisingId\",\n  \"advertising_id\",\n  \"deviceAdvertisingId\",\n  \"aaid\",\n  \"adid\",\n  \"rida\",\n  \"tifa\",\n  \"lgudid\"\n];\nvar ANDROID_ID_TYPES = /* @__PURE__ */ new Set([\"aaid\", \"adid\"]);\nfunction resolveVastEnvironmentSignals(isCtv) {\n  const bridgeSignals = readNativeBridgeSignals();\n  const platformDevice = readPlatformNativeDeviceId();\n  const lg = isCtv && isLgWebOS();\n  const deviceId = bridgeSignals.deviceId || readStoredDeviceId() || platformDevice.deviceId || (lg && platformDevice.limitAdTracking !== true ? getLgTestDeviceId() : void 0);\n  const deviceIdType = bridgeSignals.deviceIdType || readStoredString(\"deviceIdType\") || readStoredString(\"idtype\") || platformDevice.deviceIdType || inferDeviceIdType() || (lg ? \"lgudid\" : void 0);\n  const platformLat = bridgeSignals.deviceId ? bridgeSignals.limitAdTracking : platformDevice.limitAdTracking;\n  const limitAdTracking = deviceId != null ? platformLat ?? readStoredLimitAdTracking() ?? false : void 0;\n  if (isCtv) {\n    return {\n      isCtv: true,\n      contentUrl: bridgeSignals.contentUrl || readStoredString(\"contentUrl\") || (lg ? LG_TEST_CONTENT_URL : AIRY_DEFAULT_CONTENT_URL),\n      appId: bridgeSignals.appId || readStoredString(\"appId\") || readStoredString(\"msid\") || (lg ? LG_TEST_APP_ID : getDefaultAppId()),\n      appName: bridgeSignals.appName || readStoredString(\"appName\") || readStoredString(\"an\") || (lg ? LG_TEST_APP_NAME : AIRY_APP_NAME),\n      sessionId: getOrCreateCtvSessionId(),\n      ...deviceId ? { deviceId } : {},\n      ...deviceIdType ? { deviceIdType } : {},\n      ...limitAdTracking != null ? { limitAdTracking } : {},\n      deviceTypeHint: 5\n    };\n  }\n  return {\n    isCtv: false,\n    ...deviceId ? { deviceId } : {},\n    ...deviceIdType ? { deviceIdType } : {},\n    ...limitAdTracking != null ? { limitAdTracking } : {}\n  };\n}\nfunction inferDeviceIdType() {\n  if (typeof navigator === \"undefined\") {\n    return void 0;\n  }\n  const ua = navigator.userAgent;\n  if (/Roku/i.test(ua)) return \"rida\";\n  if (/Tizen|Samsung/i.test(ua)) return \"tifa\";\n  if (/AppleTV|Apple TV/i.test(ua)) return \"tvOS\";\n  if (/AFT|Fire TV|Amazon/i.test(ua)) return \"afai\";\n  if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return \"lgudid\";\n  if (/Android|Google TV/i.test(ua)) return \"aaid\";\n  if (/iPhone|iPad|iPod/i.test(ua)) return \"idfa\";\n  return void 0;\n}\nfunction isEquivalentDeviceIdType(tagType, runtimeType) {\n  if (!tagType || !runtimeType) return false;\n  const tag = tagType.toLowerCase();\n  const runtime = runtimeType.toLowerCase();\n  if (tag === runtime) return true;\n  return ANDROID_ID_TYPES.has(tag) && ANDROID_ID_TYPES.has(runtime);\n}\nfunction resolveNativeDeviceId() {\n  const bridgeSignals = readNativeBridgeSignals();\n  const platformDevice = readPlatformNativeDeviceId();\n  const deviceId = bridgeSignals.deviceId || readStoredDeviceId() || platformDevice.deviceId;\n  if (!deviceId || isMacroPlaceholder(deviceId) || isZeroedAdId(deviceId)) {\n    return void 0;\n  }\n  return deviceId;\n}\nfunction getOrCreateStoredUuid(storageKey) {\n  if (typeof window === \"undefined\") {\n    return void 0;\n  }\n  const existing = readPersistentId(storageKey);\n  if (existing) {\n    writePersistentId(storageKey, existing);\n    return existing;\n  }\n  const id = createUuid();\n  writePersistentId(storageKey, id);\n  return id;\n}\nfunction getOrCreateCtvSessionId() {\n  const existing = readPersistentId(CTV_SESSION_STORAGE_KEY);\n  if (existing) {\n    writePersistentId(CTV_SESSION_STORAGE_KEY, existing);\n    return existing;\n  }\n  const sessionId = createUuid();\n  writePersistentId(CTV_SESSION_STORAGE_KEY, sessionId);\n  return sessionId;\n}\nfunction readPersistentId(storageKey) {\n  return readStoredString(storageKey) || readCookie(storageKey);\n}\nfunction writePersistentId(storageKey, value) {\n  try {\n    window.localStorage?.setItem(storageKey, value);\n  } catch {\n  }\n  writeCookie(storageKey, value);\n}\nvar PERSISTENT_ID_COOKIE_MAX_AGE = 60 * 60 * 24 * 365 * 5;\nfunction readCookie(name) {\n  if (typeof document === \"undefined\") {\n    return void 0;\n  }\n  try {\n    const prefix = encodeURIComponent(name) + \"=\";\n    const parts = document.cookie ? document.cookie.split(\";\") : [];\n    for (const part of parts) {\n      const entry = part.trim();\n      if (entry.startsWith(prefix)) {\n        return decodeURIComponent(entry.slice(prefix.length)) || void 0;\n      }\n    }\n  } catch {\n  }\n  return void 0;\n}\nfunction writeCookie(name, value) {\n  if (typeof document === \"undefined\") {\n    return;\n  }\n  try {\n    document.cookie = encodeURIComponent(name) + \"=\" + encodeURIComponent(value) + \";path=/;max-age=\" + PERSISTENT_ID_COOKIE_MAX_AGE + \";SameSite=Lax\";\n  } catch {\n  }\n}\nfunction createUuid() {\n  if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n    return crypto.randomUUID();\n  }\n  const bytes = new Uint8Array(16);\n  if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n    crypto.getRandomValues(bytes);\n  } else {\n    let seed = Date.now() ^ Math.floor(performanceNow() * 1e3);\n    for (let i = 0; i < 16; i++) {\n      seed = seed * 1103515245 + 12345 & 2147483647;\n      bytes[i] = (seed ^ Math.floor(Math.random() * 256)) & 255;\n    }\n  }\n  bytes[6] = (bytes[6] ?? 0) & 15 | 64;\n  bytes[8] = (bytes[8] ?? 0) & 63 | 128;\n  let hex = \"\";\n  for (let i = 0; i < 16; i++) {\n    hex += (bytes[i] ?? 0).toString(16).padStart(2, \"0\");\n  }\n  return hex.slice(0, 8) + \"-\" + hex.slice(8, 12) + \"-\" + hex.slice(12, 16) + \"-\" + hex.slice(16, 20) + \"-\" + hex.slice(20, 32);\n}\nfunction performanceNow() {\n  try {\n    if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n      return performance.now();\n    }\n  } catch {\n  }\n  return 0;\n}\nfunction readPlatformNativeDeviceId() {\n  if (typeof window === \"undefined\") return {};\n  try {\n    const adinfo = window.webapis?.adinfo;\n    if (adinfo) {\n      const tifa = typeof adinfo.getTIFA === \"function\" ? adinfo.getTIFA() : adinfo.tifa;\n      if (typeof tifa === \"string\" && tifa && !isMacroPlaceholder(tifa)) {\n        const lat = typeof adinfo.isLATEnabled === \"function\" ? adinfo.isLATEnabled() : void 0;\n        return {\n          deviceId: tifa,\n          deviceIdType: \"tifa\",\n          ...typeof lat === \"boolean\" ? { limitAdTracking: lat } : {}\n        };\n      }\n    }\n  } catch {\n  }\n  try {\n    const webOSDev = window.webOSDev;\n    if (webOSDev) {\n      const lgudid = typeof webOSDev.LGUDID === \"function\" ? webOSDev.LGUDID() : webOSDev.lgudid ?? webOSDev.LGUDID;\n      if (typeof lgudid === \"string\" && lgudid) {\n        if (isZeroedAdId(lgudid)) {\n          return { deviceIdType: \"lgudid\", limitAdTracking: true };\n        }\n        if (!isMacroPlaceholder(lgudid)) {\n          return { deviceId: lgudid, deviceIdType: \"lgudid\", limitAdTracking: false };\n        }\n      }\n    }\n  } catch {\n  }\n  try {\n    const roku = window.Roku;\n    if (roku) {\n      const rida = typeof roku.getPublisherUniqueId === \"function\" ? roku.getPublisherUniqueId() : roku.rida;\n      if (typeof rida === \"string\" && rida && !isMacroPlaceholder(rida)) {\n        return { deviceId: rida, deviceIdType: \"rida\", limitAdTracking: false };\n      }\n    }\n  } catch {\n  }\n  return {};\n}\nvar ZEROED_AD_ID_PATTERNS = /* @__PURE__ */ new Set([\n  \"38400000-8cf0-11bd-b23e-10b96e40000d\",\n  \"00000000-0000-0000-0000-000000000000\"\n]);\nfunction isMacroPlaceholder(value) {\n  const t = value.trim();\n  return !t || /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/.test(t) || /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(t) || ZEROED_AD_ID_PATTERNS.has(t.toLowerCase());\n}\nfunction isZeroedAdId(value) {\n  return ZEROED_AD_ID_PATTERNS.has(value.trim().toLowerCase());\n}\nfunction readNativeBridgeSignals() {\n  if (typeof window === \"undefined\") {\n    return {};\n  }\n  const candidates = [\n    window.__STORMCLOUD_CTV_AD_INFO__,\n    window.__STORMCLOUD_CTV__,\n    window.stormcloudCtv,\n    window.AiryTV,\n    window.Android,\n    window.webOS,\n    window.tizen,\n    window.amazon\n  ].filter(Boolean);\n  for (const source of candidates) {\n    const contentUrl = readBridgeValue(source, [\"contentUrl\", \"url\", \"videoUrl\", \"canonicalUrl\"]) || void 0;\n    const appId = readBridgeValue(source, [\"appId\", \"msid\", \"applicationId\", \"packageName\"]) || void 0;\n    const appName = readBridgeValue(source, [\"appName\", \"an\", \"applicationName\"]) || void 0;\n    const deviceId = readBridgeValue(source, [\n      \"rdid\",\n      \"ifa\",\n      \"advertisingId\",\n      \"adId\",\n      \"deviceId\",\n      \"lgudid\",\n      \"LGUDID\",\n      \"tifa\",\n      \"rida\",\n      \"afai\",\n      \"aaid\"\n    ]) || void 0;\n    if (!contentUrl && !deviceId && !appId && !appName) continue;\n    const deviceIdType = readBridgeValue(source, [\n      \"idtype\",\n      \"deviceIdType\",\n      \"advertisingIdType\",\n      \"idType\"\n    ]) || inferDeviceIdType();\n    const limitAdTracking = readBridgeBoolean(source, [\n      \"is_lat\",\n      \"limitAdTracking\",\n      \"limitedAdTracking\",\n      \"lat\"\n    ]);\n    return {\n      ...contentUrl ? { contentUrl } : {},\n      ...appId ? { appId } : {},\n      ...appName ? { appName } : {},\n      ...deviceId ? { deviceId } : {},\n      ...deviceId && deviceIdType ? { deviceIdType } : {},\n      ...deviceId && limitAdTracking != null ? { limitAdTracking } : {}\n    };\n  }\n  return {};\n}\nfunction readBridgeValue(source, keys) {\n  for (const key of keys) {\n    const value = source?.[key];\n    if (typeof value === \"string\" && value) {\n      return value;\n    }\n    if (typeof value === \"function\") {\n      try {\n        const result = value.call(source);\n        if (typeof result === \"string\" && result) {\n          return result;\n        }\n      } catch {\n      }\n    }\n  }\n  return void 0;\n}\nfunction readBridgeBoolean(source, keys) {\n  for (const key of keys) {\n    const value = source?.[key];\n    const normalized = normalizeBoolean(value);\n    if (normalized != null) {\n      return normalized;\n    }\n    if (typeof value === \"function\") {\n      try {\n        const result = normalizeBoolean(value.call(source));\n        if (result != null) {\n          return result;\n        }\n      } catch {\n      }\n    }\n  }\n  return void 0;\n}\nfunction readStoredDeviceId() {\n  for (const key of DEVICE_ID_STORAGE_KEYS) {\n    const value = readStoredString(key);\n    if (value) {\n      return value;\n    }\n  }\n  return void 0;\n}\nfunction readStoredString(key) {\n  if (typeof window === \"undefined\") {\n    return void 0;\n  }\n  try {\n    const value = window.localStorage?.getItem(key);\n    return value || void 0;\n  } catch {\n    return void 0;\n  }\n}\nfunction readStoredLimitAdTracking() {\n  return normalizeBoolean(\n    readStoredString(\"limitAdTracking\") || readStoredString(\"limitedAdTracking\") || readStoredString(\"is_lat\")\n  );\n}\nfunction normalizeBoolean(value) {\n  if (typeof value === \"boolean\") {\n    return value;\n  }\n  if (typeof value === \"number\") {\n    return value === 1;\n  }\n  if (typeof value === \"string\") {\n    const normalized = value.toLowerCase();\n    if (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\") {\n      return true;\n    }\n    if (normalized === \"0\" || normalized === \"false\" || normalized === \"no\") {\n      return false;\n    }\n  }\n  return void 0;\n}\n\n// src/utils/tracking.ts\nvar cachedBrowserId = null;\nfunction buildAnalyticsContext(config) {\n  const context = {};\n  if (config.debugAdTiming) {\n    context.debugAdTiming = true;\n  }\n  if (config.isLiveStream !== void 0) {\n    context.inputStreamType = config.isLiveStream ? \"live\" : \"vod\";\n  }\n  return context;\n}\nfunction getClientInfo() {\n  const ua = navigator.userAgent;\n  const platform = navigator.platform;\n  const vendor = navigator.vendor || \"\";\n  const maxTouchPoints = navigator.maxTouchPoints || 0;\n  const memory = navigator.deviceMemory || null;\n  const hardwareConcurrency = navigator.hardwareConcurrency || 1;\n  const screenInfo = {\n    width: screen?.width,\n    height: screen?.height,\n    availWidth: screen?.availWidth,\n    availHeight: screen?.availHeight,\n    orientation: screen?.orientation?.type || \"\",\n    pixelDepth: screen?.pixelDepth\n  };\n  let deviceType = \"desktop\";\n  let brand = \"Unknown\";\n  let os = \"Unknown\";\n  let model = \"\";\n  let isSmartTV = false;\n  let isAndroid = false;\n  let isWebView = false;\n  let isWebApp = false;\n  if (ua.includes(\"Web0S\")) {\n    brand = \"LG\";\n    os = \"webOS\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n    const webosMatch = ua.match(/Web0S\\/([^\\s]+)/);\n    model = webosMatch ? `webOS ${webosMatch[1]}` : \"webOS TV\";\n  } else if (ua.includes(\"Tizen\")) {\n    brand = \"Samsung\";\n    os = \"Tizen\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n    const tizenMatch = ua.match(/Tizen\\/([^\\s]+)/);\n    const tvMatch = ua.match(/(?:Smart-TV|SMART-TV|TV)/i) ? \"Smart TV\" : \"\";\n    model = tizenMatch ? `Tizen ${tizenMatch[1]} ${tvMatch}`.trim() : \"Tizen TV\";\n  } else if (ua.includes(\"Philips\")) {\n    brand = \"Philips\";\n    os = \"Saphi\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (ua.includes(\"Sharp\") || ua.includes(\"AQUOS\")) {\n    brand = \"Sharp\";\n    os = \"Android TV\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (ua.includes(\"Android\") && (ua.includes(\"Sony\") || vendor.includes(\"Sony\"))) {\n    brand = \"Sony\";\n    os = \"Android TV\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (ua.includes(\"Android\") && (ua.includes(\"NetCast\") || ua.includes(\"LG\"))) {\n    brand = \"LG\";\n    os = \"Android TV\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (ua.includes(\" Roku\") || ua.includes(\"Roku/\")) {\n    brand = \"Roku\";\n    os = \"Roku OS\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (ua.includes(\"AppleTV\")) {\n    brand = \"Apple\";\n    os = \"tvOS\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  }\n  if (ua.includes(\"Android\")) {\n    isAndroid = true;\n    os = \"Android\";\n    deviceType = /Mobile/.test(ua) ? \"mobile\" : \"tablet\";\n    if (ua.includes(\"Android\") && (maxTouchPoints === 0 || ua.includes(\"Google TV\") || ua.includes(\"XiaoMi\"))) {\n      deviceType = \"tv\";\n      isSmartTV = true;\n      brand = brand === \"Unknown\" ? \"Android TV\" : brand;\n    }\n    const androidModelMatch = ua.match(/\\(([^)]*Android[^)]*)\\)/);\n    if (androidModelMatch && androidModelMatch[1]) {\n      model = androidModelMatch[1];\n    }\n  }\n  if (/iPad|iPhone|iPod/.test(ua)) {\n    os = \"iOS\";\n    deviceType = \"mobile\";\n    brand = \"Apple\";\n    if (navigator.maxTouchPoints > 1 && /iPad/.test(ua)) {\n      deviceType = \"tablet\";\n    }\n  }\n  if (!isAndroid && !isSmartTV && !/Mobile/.test(ua)) {\n    if (ua.includes(\"Windows\")) {\n      os = \"Windows\";\n      deviceType = \"desktop\";\n    } else if (ua.includes(\"Mac\") && !/iPhone/.test(ua)) {\n      os = \"macOS\";\n      deviceType = \"desktop\";\n      if (maxTouchPoints > 1) deviceType = \"tablet\";\n    } else if (ua.includes(\"Linux\")) {\n      os = \"Linux\";\n      deviceType = \"desktop\";\n    }\n  }\n  if (brand === \"Unknown\") {\n    if (vendor.includes(\"Google\") || ua.includes(\"Chrome\")) brand = \"Google\";\n    if (vendor.includes(\"Apple\")) brand = \"Apple\";\n    if (vendor.includes(\"Samsung\") || ua.includes(\"SM-\")) brand = \"Samsung\";\n  }\n  isWebView = /wv|WebView|Linux; U;/.test(ua);\n  if (window?.outerHeight === 0 && window?.outerWidth === 0) {\n    isWebView = true;\n  }\n  isWebApp = window.matchMedia(\"(display-mode: standalone)\").matches || window.navigator.standalone === true || window.screen?.orientation?.angle !== void 0;\n  return {\n    brand,\n    os,\n    model: model || ua.substring(0, 50) + \"...\",\n    deviceType,\n    isSmartTV,\n    isAndroid,\n    isWebView,\n    isWebApp,\n    domain: window.location.hostname,\n    origin: window.location.origin,\n    path: window.location.pathname,\n    userAgent: ua,\n    vendor,\n    platform,\n    screen: screenInfo,\n    hardwareConcurrency,\n    deviceMemory: memory,\n    maxTouchPoints,\n    language: navigator.language,\n    languages: navigator.languages?.join(\",\") || \"\",\n    cookieEnabled: navigator.cookieEnabled,\n    doNotTrack: navigator.doNotTrack || \"\",\n    referrer: document.referrer,\n    visibilityState: document.visibilityState\n  };\n}\nasync function sha256Hex(input) {\n  if (typeof crypto !== \"undefined\" && crypto.subtle?.digest) {\n    try {\n      await crypto.subtle.digest(\"SHA-256\", new Uint8Array([1, 2, 3]));\n      let encodedData;\n      if (typeof TextEncoder !== \"undefined\") {\n        encodedData = new TextEncoder().encode(input);\n      } else {\n        const utf8 = unescape(encodeURIComponent(input));\n        const buffer = new Uint8Array(utf8.length);\n        for (let i = 0; i < utf8.length; i++) {\n          buffer[i] = utf8.charCodeAt(i);\n        }\n        encodedData = buffer;\n      }\n      const hashBuffer = await crypto.subtle.digest(\"SHA-256\", encodedData);\n      return Array.from(new Uint8Array(hashBuffer)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n    } catch {\n      console.warn(\n        \"[StormcloudVideoPlayer] crypto.subtle not supported, using fallback hash\"\n      );\n    }\n  }\n  let hash = 0;\n  for (let i = 0; i < input.length; i++) {\n    const char = input.charCodeAt(i);\n    hash = (hash << 5) - hash + char;\n    hash = hash & hash;\n  }\n  const fallbackHash = Math.abs(hash).toString(16).padStart(8, \"0\");\n  const timestamp = Date.now().toString(16).padStart(12, \"0\");\n  const random = Math.random().toString(16).substring(2, 14).padStart(12, \"0\");\n  return (fallbackHash + timestamp + random).padEnd(64, \"0\");\n}\nfunction resolvePlayerIdentitySeed(clientInfo) {\n  const nativeDeviceId = resolveNativeDeviceId();\n  if (nativeDeviceId) {\n    return `device:${nativeDeviceId}`;\n  }\n  const persistedId = getOrCreateStoredUuid(PLAYER_ID_STORAGE_KEY);\n  if (persistedId) {\n    return `persisted:${persistedId}`;\n  }\n  return `fingerprint:${JSON.stringify(clientInfo)}`;\n}\nasync function getBrowserID(clientInfo) {\n  if (cachedBrowserId) {\n    return cachedBrowserId;\n  }\n  cachedBrowserId = await sha256Hex(resolvePlayerIdentitySeed(clientInfo));\n  return cachedBrowserId;\n}\nfunction canPublish(licenseKey) {\n  return Boolean(isMQTTEnabled() && licenseKey);\n}\nasync function buildPlayerMetricEvent(context = {}, flags = {}) {\n  const clientInfo = getClientInfo();\n  const debugAdTiming = !!context.debugAdTiming;\n  if (debugAdTiming) {\n    console.log(\"[StormcloudVideoPlayer] clientInfo: \", JSON.stringify(clientInfo, null, 2));\n  }\n  const playerId = await getBrowserID(clientInfo);\n  if (debugAdTiming) {\n    console.log(\"[StormcloudVideoPlayer] playerId: \", playerId);\n  }\n  const captureAt = flags.captureAt ?? (/* @__PURE__ */ new Date()).toISOString();\n  return {\n    player_id: playerId,\n    device_type: clientInfo.deviceType,\n    os: clientInfo.os.toLowerCase(),\n    ad_loaded: flags.adLoaded ?? false,\n    ad_detect: flags.adDetect ?? false,\n    capture_at: captureAt,\n    ...context.inputStreamType ? { input_stream_type: context.inputStreamType } : {}\n  };\n}\nfunction publishTracking(licenseKey, channel, body) {\n  ensureMQTTClient();\n  publishMQTT(buildPlayerTopic(licenseKey, channel), body);\n}\nasync function sendInitialTracking(licenseKey, context = {}) {\n  if (!canPublish(licenseKey)) return;\n  try {\n    const metricEvent = await buildPlayerMetricEvent(context, {\n      adLoaded: false,\n      adDetect: false\n    });\n    publishTracking(licenseKey, \"metrics\", {\n      events: [metricEvent]\n    });\n  } catch (error) {\n    console.error(\n      \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n      error\n    );\n  }\n}\nasync function sendAdDetectTracking(licenseKey, adDetectInfo, context = {}) {\n  try {\n    await sendHeartbeat(licenseKey, context, {\n      adDetect: true,\n      captureAt: adDetectInfo.timestamp\n    });\n  } catch (error) {\n    console.error(\n      \"[StormcloudVideoPlayer] Error sending ad detect tracking:\",\n      error\n    );\n  }\n}\nasync function sendAdLoadedTracking(licenseKey, adLoadedInfo, context = {}) {\n  try {\n    await sendHeartbeat(licenseKey, context, {\n      adLoaded: true,\n      captureAt: adLoadedInfo.timestamp\n    });\n  } catch (error) {\n    console.error(\n      \"[StormcloudVideoPlayer] Error sending ad loaded tracking:\",\n      error\n    );\n  }\n}\nasync function sendAdImpressionTracking(licenseKey, adImpressionInfo, context = {}) {\n  if (!canPublish(licenseKey)) return;\n  try {\n    const metricEvent = await buildPlayerMetricEvent(context, {\n      captureAt: adImpressionInfo.timestamp\n    });\n    publishTracking(licenseKey, \"heartbeat\", metricEvent);\n    publishTracking(licenseKey, \"impressions\", {\n      events: [\n        {\n          player_id: metricEvent.player_id,\n          ad_played_count: 1,\n          ad_url: adImpressionInfo.adUrl,\n          capture_at: adImpressionInfo.timestamp\n        }\n      ]\n    });\n  } catch (error) {\n    console.error(\n      \"[StormcloudVideoPlayer] Error sending ad impression tracking:\",\n      error\n    );\n  }\n}\nasync function sendHeartbeat(licenseKey, context = {}, flags = {}) {\n  if (!canPublish(licenseKey)) return;\n  try {\n    const heartbeatData = await buildPlayerMetricEvent(context, flags);\n    publishTracking(licenseKey, \"heartbeat\", heartbeatData);\n  } catch (error) {\n    console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n  }\n}\n\n// src/utils/polyfills.ts\nfunction polyfillURLSearchParams() {\n  if (typeof URLSearchParams !== \"undefined\") {\n    return;\n  }\n  class URLSearchParamsPolyfill {\n    constructor(init) {\n      this.params = /* @__PURE__ */ new Map();\n      if (typeof init === \"string\") {\n        this.parseQueryString(init);\n      } else if (init instanceof URLSearchParamsPolyfill) {\n        init.forEach((value, key) => {\n          this.append(key, value);\n        });\n      }\n    }\n    parseQueryString(query) {\n      const cleanQuery = query.startsWith(\"?\") ? query.slice(1) : query;\n      if (!cleanQuery) return;\n      cleanQuery.split(\"&\").forEach((param) => {\n        const [key, value] = param.split(\"=\");\n        if (key) {\n          const decodedKey = this.safeDecodeURIComponent(key);\n          const decodedValue = value ? this.safeDecodeURIComponent(value) : \"\";\n          this.append(decodedKey, decodedValue);\n        }\n      });\n    }\n    safeDecodeURIComponent(str) {\n      try {\n        return decodeURIComponent(str.replace(/\\+/g, \" \"));\n      } catch (e) {\n        return str;\n      }\n    }\n    append(name, value) {\n      const values = this.params.get(name) || [];\n      values.push(String(value));\n      this.params.set(name, values);\n    }\n    delete(name) {\n      this.params.delete(name);\n    }\n    get(name) {\n      const values = this.params.get(name);\n      return values && values.length > 0 && values[0] !== void 0 ? values[0] : null;\n    }\n    getAll(name) {\n      return this.params.get(name) || [];\n    }\n    has(name) {\n      return this.params.has(name);\n    }\n    set(name, value) {\n      this.params.set(name, [String(value)]);\n    }\n    forEach(callback) {\n      this.params.forEach((values, key) => {\n        values.forEach((value) => {\n          callback(value, key, this);\n        });\n      });\n    }\n    toString() {\n      const parts = [];\n      this.params.forEach((values, key) => {\n        values.forEach((value) => {\n          parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n        });\n      });\n      return parts.join(\"&\");\n    }\n  }\n  window.URLSearchParams = URLSearchParamsPolyfill;\n}\nfunction polyfillTextEncoder() {\n  if (typeof TextEncoder !== \"undefined\") {\n    return;\n  }\n  class TextEncoderPolyfill {\n    constructor() {\n      this.encoding = \"utf-8\";\n    }\n    encode(str) {\n      const utf8 = [];\n      for (let i = 0; i < str.length; i++) {\n        let charcode = str.charCodeAt(i);\n        if (charcode < 128) {\n          utf8.push(charcode);\n        } else if (charcode < 2048) {\n          utf8.push(192 | charcode >> 6, 128 | charcode & 63);\n        } else if (charcode < 55296 || charcode >= 57344) {\n          utf8.push(\n            224 | charcode >> 12,\n            128 | charcode >> 6 & 63,\n            128 | charcode & 63\n          );\n        } else {\n          i++;\n          charcode = 65536 + ((charcode & 1023) << 10 | str.charCodeAt(i) & 1023);\n          utf8.push(\n            240 | charcode >> 18,\n            128 | charcode >> 12 & 63,\n            128 | charcode >> 6 & 63,\n            128 | charcode & 63\n          );\n        }\n      }\n      return new Uint8Array(utf8);\n    }\n  }\n  window.TextEncoder = TextEncoderPolyfill;\n}\nfunction polyfillPromiseFinally() {\n  if (typeof Promise !== \"undefined\" && !Promise.prototype.finally) {\n    Promise.prototype.finally = function(callback) {\n      const constructor = this.constructor;\n      return this.then(\n        (value) => constructor.resolve(callback()).then(() => value),\n        (reason) => constructor.resolve(callback()).then(() => {\n          throw reason;\n        })\n      );\n    };\n  }\n}\nfunction polyfillObjectAssign() {\n  if (typeof Object.assign !== \"function\") {\n    Object.assign = function(target, ...sources) {\n      if (target == null) {\n        throw new TypeError(\"Cannot convert undefined or null to object\");\n      }\n      const to = Object(target);\n      for (let i = 0; i < sources.length; i++) {\n        const nextSource = sources[i];\n        if (nextSource != null) {\n          for (const nextKey in nextSource) {\n            if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n              to[nextKey] = nextSource[nextKey];\n            }\n          }\n        }\n      }\n      return to;\n    };\n  }\n}\nfunction polyfillArrayFrom() {\n  if (!Array.from) {\n    Array.from = function(arrayLike, mapFn, thisArg) {\n      const items = Object(arrayLike);\n      if (arrayLike == null) {\n        throw new TypeError(\"Array.from requires an array-like object\");\n      }\n      const len = items.length >>> 0;\n      const result = new Array(len);\n      for (let i = 0; i < len; i++) {\n        if (mapFn) {\n          result[i] = mapFn.call(thisArg, items[i], i);\n        } else {\n          result[i] = items[i];\n        }\n      }\n      return result;\n    };\n  }\n}\nfunction polyfillStringStartsWith() {\n  if (!String.prototype.startsWith) {\n    String.prototype.startsWith = function(search, pos) {\n      pos = !pos || pos < 0 ? 0 : +pos;\n      return this.substring(pos, pos + search.length) === search;\n    };\n  }\n}\nfunction polyfillStringEndsWith() {\n  if (!String.prototype.endsWith) {\n    String.prototype.endsWith = function(search, length) {\n      if (length === void 0 || length > this.length) {\n        length = this.length;\n      }\n      return this.substring(length - search.length, length) === search;\n    };\n  }\n}\nfunction polyfillStringIncludes() {\n  if (!String.prototype.includes) {\n    String.prototype.includes = function(search, start) {\n      if (typeof start !== \"number\") {\n        start = 0;\n      }\n      if (start + search.length > this.length) {\n        return false;\n      }\n      return this.indexOf(search, start) !== -1;\n    };\n  }\n}\nfunction initializePolyfills() {\n  polyfillObjectAssign();\n  polyfillArrayFrom();\n  polyfillStringStartsWith();\n  polyfillStringEndsWith();\n  polyfillStringIncludes();\n  polyfillURLSearchParams();\n  polyfillTextEncoder();\n  polyfillPromiseFinally();\n}\n\n// src/utils/vastMacros.ts\nvar UNEXPANDED_MACRO_PATTERN = /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/;\nvar INVALID_VAST_PARAM_KEY = /^\\s|\\s$/;\nvar EXAMPLE_COM_URL = /example\\.com/i;\nvar CTV_UNSUPPORTED_PARAMS = [\n  \"description_url\",\n  \"tfcd\",\n  \"npa\",\n  \"min_ad_duration\",\n  \"max_ad_duration\",\n  \"unviewed_position_start\",\n  \"impl\",\n  \"vad_type\",\n  \"gdpr\",\n  \"gdpr_consent\",\n  \"us_privacy\"\n];\nvar INLINE_DEVICE_MACRO_REPLACEMENTS = [\n  { pattern: /\\[RDID\\]/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\[IFA\\]/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\[ADVERTISING[_-]?ID(?:ENTIFIER)?\\]/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\[DEVICE[_-]?ID\\]/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\[IDTYPE\\]/gi, getValue: (ctx) => ctx.deviceIdType },\n  { pattern: /\\{rdid\\}/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\{device[_-]?id\\}/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\{idtype\\}/gi, getValue: (ctx) => ctx.deviceIdType },\n  { pattern: /%%ADVERTISING_IDENTIFIER_PLAIN%%/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /%%ADVERTISING_ID_OPT_OUT%%/gi, getValue: (ctx) => ctx.limitAdTracking != null ? ctx.limitAdTracking ? \"1\" : \"0\" : void 0 },\n  { pattern: /%%ADVERTISING_ID_TYPE%%/gi, getValue: (ctx) => ctx.deviceIdType },\n  { pattern: /%%ADVERTISING_ID%%/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /%%LIMIT_AD_TRACKING%%/gi, getValue: (ctx) => ctx.limitAdTracking != null ? ctx.limitAdTracking ? \"1\" : \"0\" : void 0 },\n  { pattern: /%%MSID%%/gi, getValue: (ctx) => ctx.appId },\n  { pattern: /%%APP_NAME%%/gi, getValue: (ctx) => ctx.appName },\n  { pattern: /%%SESSION_ID%%/gi, getValue: (ctx) => ctx.sessionId },\n  { pattern: /%%CORRELATOR%%/gi, getValue: (ctx) => ctx.correlator }\n];\nfunction isMacroPlaceholder2(value) {\n  if (value == null) return true;\n  const trimmed = value.trim();\n  if (!trimmed) return true;\n  if (UNEXPANDED_MACRO_PATTERN.test(trimmed)) return true;\n  return /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(trimmed);\n}\nfunction generateCorrelator() {\n  if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n    try {\n      const buf = new Uint32Array(2);\n      crypto.getRandomValues(buf);\n      const value = (buf[0] ?? 0) * 2097152 + ((buf[1] ?? 0) & 2097151);\n      if (value > 0) {\n        return String(value);\n      }\n    } catch {\n    }\n  }\n  return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);\n}\nfunction expandInlineMacroPlaceholders(baseUrl, ctx) {\n  let url = baseUrl;\n  for (const { pattern, getValue } of INLINE_DEVICE_MACRO_REPLACEMENTS) {\n    const value = getValue(ctx);\n    if (value != null && value !== \"\") {\n      url = url.replace(pattern, encodeURIComponent(value));\n    }\n  }\n  return url;\n}\nfunction applyDeviceIdentityParams(params, ctx) {\n  const runtimeId = ctx.deviceId?.trim();\n  const runtimeType = ctx.deviceIdType?.trim() || inferDeviceIdType();\n  const tagRdid = params.get(\"rdid\");\n  const tagType = params.get(\"idtype\");\n  const tagLat = params.get(\"is_lat\");\n  const latValue = ctx.limitAdTracking != null ? ctx.limitAdTracking ? \"1\" : \"0\" : void 0;\n  if (runtimeId) {\n    params.set(\"rdid\", runtimeId);\n    params.set(\"idtype\", runtimeType || tagType || \"aaid\");\n    params.set(\"is_lat\", latValue ?? (isMacroPlaceholder2(tagLat) ? \"0\" : tagLat));\n    return;\n  }\n  const tagRdidValid = Boolean(tagRdid && !isMacroPlaceholder2(tagRdid));\n  const tagTypeValid = Boolean(tagType && !isMacroPlaceholder2(tagType));\n  if (tagRdidValid && tagTypeValid && runtimeType && !isEquivalentDeviceIdType(tagType, runtimeType)) {\n    params.delete(\"rdid\");\n    params.delete(\"idtype\");\n    params.delete(\"is_lat\");\n    return;\n  }\n  if (tagRdidValid) {\n    if (isMacroPlaceholder2(tagType) && runtimeType) {\n      params.set(\"idtype\", runtimeType);\n    }\n    if (isMacroPlaceholder2(tagLat)) {\n      params.set(\"is_lat\", latValue ?? \"0\");\n    }\n    return;\n  }\n  params.delete(\"rdid\");\n  params.delete(\"idtype\");\n  params.delete(\"is_lat\");\n}\nfunction removeBrokenAppNameOrphans(params, appName) {\n  const toDelete = [];\n  params.forEach((_value, key) => {\n    if (!key || INVALID_VAST_PARAM_KEY.test(key)) {\n      toDelete.push(key);\n    }\n  });\n  if (appName && appName.includes(\"&\")) {\n    for (const suffix of appName.split(\"&\").slice(1)) {\n      const trimmed = suffix.trimStart();\n      if (!trimmed) continue;\n      toDelete.push(suffix, ` ${trimmed}`, trimmed);\n    }\n  }\n  for (const key of new Set(toDelete)) {\n    if (key) params.delete(key);\n  }\n}\nfunction normalizeVastTagUrl(raw) {\n  if (!raw) return raw;\n  try {\n    const url = new URL(raw);\n    const anValue = url.searchParams.get(\"an\");\n    if (anValue !== null) {\n      const orphanFragments = [];\n      url.searchParams.forEach((_value, key) => {\n        if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n          orphanFragments.push(key.trim());\n        }\n      });\n      if (orphanFragments.length > 0) {\n        const reconstructed = [anValue.trimEnd(), ...orphanFragments].filter(Boolean).join(\" & \");\n        url.searchParams.forEach((_value, key) => {\n          if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n            url.searchParams.delete(key);\n          }\n        });\n        url.searchParams.set(\"an\", reconstructed);\n        return url.toString().replace(\n          /([?&]an=)([^&]*)/,\n          (_match, prefix, val) => prefix + val.replace(/\\+/g, \"%20\")\n        );\n      }\n    }\n    removeBrokenAppNameOrphans(url.searchParams);\n    return url.toString();\n  } catch {\n    return raw;\n  }\n}\nfunction applyVastMacros(baseUrl, ctx) {\n  const expandedUrl = expandInlineMacroPlaceholders(baseUrl, ctx);\n  let url;\n  try {\n    url = new URL(normalizeVastTagUrl(expandedUrl));\n  } catch {\n    return replaceCorrelatorFallback(expandedUrl, ctx.correlator);\n  }\n  const params = url.searchParams;\n  removeBrokenAppNameOrphans(params, ctx.appName);\n  params.set(\"correlator\", ctx.correlator);\n  params.set(\"scor\", ctx.streamCorrelator);\n  if (ctx.isCtv) {\n    for (const key of CTV_UNSUPPORTED_PARAMS) {\n      params.delete(key);\n    }\n  }\n  if (ctx.pod != null) {\n    params.set(\"pod\", String(ctx.pod));\n  }\n  params.delete(\"ppos\");\n  params.delete(\"lip\");\n  if (ctx.podMinDurationMs != null) {\n    params.set(\"pmnd\", String(Math.max(0, Math.round(ctx.podMinDurationMs))));\n  }\n  if (ctx.podMaxDurationMs != null) {\n    params.set(\"pmxd\", String(Math.max(0, Math.round(ctx.podMaxDurationMs))));\n  }\n  if (ctx.podMaxAds != null) {\n    params.set(\"pmad\", String(Math.max(1, Math.round(ctx.podMaxAds))));\n  }\n  const requestUrl = ctx.contentUrl || ctx.pageUrl;\n  if (requestUrl) {\n    params.set(\"url\", requestUrl);\n    if (!ctx.isCtv) {\n      params.set(\"description_url\", requestUrl);\n    }\n  } else {\n    const existingUrl = params.get(\"url\") || \"\";\n    if (EXAMPLE_COM_URL.test(existingUrl)) {\n      params.delete(\"url\");\n      params.delete(\"description_url\");\n    }\n  }\n  if (ctx.adWillPlayMuted != null) {\n    params.set(\"vpmute\", ctx.adWillPlayMuted ? \"1\" : \"0\");\n  }\n  if (ctx.adWillAutoPlay != null) {\n    params.set(\"vpa\", ctx.adWillAutoPlay ? \"auto\" : \"click\");\n  }\n  if (ctx.appId) {\n    params.set(\"msid\", ctx.appId);\n  }\n  if (ctx.appName) {\n    removeBrokenAppNameOrphans(params, ctx.appName);\n    params.set(\"an\", ctx.appName);\n  }\n  if (ctx.sessionId) {\n    params.set(\"sid\", ctx.sessionId);\n  }\n  if (ctx.deviceTypeHint != null) {\n    params.set(\"dth\", String(ctx.deviceTypeHint));\n  } else if (ctx.isCtv) {\n    params.set(\"dth\", \"5\");\n  }\n  applyDeviceIdentityParams(params, ctx);\n  if (!ctx.isCtv) {\n    const consent = ctx.consent;\n    if (consent?.gdpr != null) {\n      params.set(\"gdpr\", consent.gdpr);\n    }\n    if (consent?.gdprConsent != null) {\n      params.set(\"gdpr_consent\", consent.gdprConsent);\n    }\n    if (consent?.usPrivacy != null) {\n      params.set(\"us_privacy\", consent.usPrivacy);\n    }\n  }\n  if (ctx.adTest) {\n    params.set(\"adtest\", \"on\");\n  }\n  const staleKeys = [];\n  params.forEach((value, key) => {\n    if (isMacroPlaceholder2(value)) {\n      staleKeys.push(key);\n    }\n  });\n  for (const key of staleKeys) {\n    params.delete(key);\n  }\n  removeBrokenAppNameOrphans(params, ctx.appName);\n  return url.toString();\n}\nfunction replaceCorrelatorFallback(baseUrl, correlator) {\n  const correlatorRegex = /([?&])correlator=([^&]*)/;\n  if (correlatorRegex.test(baseUrl)) {\n    return baseUrl.replace(correlatorRegex, `$1correlator=${correlator}`);\n  }\n  const sep = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n  return `${baseUrl}${sep}correlator=${correlator}`;\n}\nfunction fetchConsentSignals(timeoutMs = 1500) {\n  const signals = {};\n  if (typeof window === \"undefined\") {\n    return Promise.resolve(signals);\n  }\n  const tasks = [];\n  const tcfApi = window.__tcfapi;\n  if (typeof tcfApi === \"function\") {\n    tasks.push(\n      new Promise((resolve) => {\n        let settled = false;\n        try {\n          tcfApi(\"addEventListener\", 2, (tcData, success) => {\n            if (settled) return;\n            if (success && tcData && (tcData.eventStatus === \"tcloaded\" || tcData.eventStatus === \"useractioncomplete\")) {\n              settled = true;\n              signals.gdpr = tcData.gdprApplies ? \"1\" : \"0\";\n              if (typeof tcData.tcString === \"string\" && tcData.tcString) {\n                signals.gdprConsent = tcData.tcString;\n              }\n              try {\n                tcfApi(\"removeEventListener\", 2, () => {\n                }, tcData.listenerId);\n              } catch {\n              }\n              resolve();\n            }\n          });\n        } catch {\n          resolve();\n        }\n        setTimeout(() => {\n          if (!settled) {\n            settled = true;\n            resolve();\n          }\n        }, timeoutMs);\n      })\n    );\n  }\n  const uspApi = window.__uspapi;\n  if (typeof uspApi === \"function\") {\n    tasks.push(\n      new Promise((resolve) => {\n        try {\n          uspApi(\"getUSPData\", 1, (data, success) => {\n            if (success && typeof data?.uspString === \"string\" && data.uspString) {\n              signals.usPrivacy = data.uspString;\n            }\n            resolve();\n          });\n        } catch {\n          resolve();\n        }\n        setTimeout(resolve, timeoutMs);\n      })\n    );\n  }\n  if (tasks.length === 0) {\n    return Promise.resolve(signals);\n  }\n  return Promise.all(tasks).then(() => signals);\n}\n\n// src/utils/browserCompat.ts\nfunction getChromeVersion(ua) {\n  const match = ua.match(/Chrome\\/(\\d+)/);\n  return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getWebKitVersion(ua) {\n  const match = ua.match(/AppleWebKit\\/(\\d+)/);\n  return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getPlatform() {\n  if (\"userAgentData\" in navigator && navigator.userAgentData?.platform) {\n    return navigator.userAgentData.platform;\n  }\n  const ua = navigator.userAgent;\n  if (/Mac|iPhone|iPad|iPod/i.test(ua)) {\n    return /iPhone|iPad|iPod/i.test(ua) ? \"iPhone\" : \"MacIntel\";\n  }\n  if (/Win/i.test(ua)) {\n    return \"Win32\";\n  }\n  if (/Linux/i.test(ua)) {\n    return /Android/i.test(ua) ? \"Linux armv8l\" : \"Linux x86_64\";\n  }\n  if (/CrOS/i.test(ua)) {\n    return \"CrOS\";\n  }\n  return navigator.platform || \"Unknown\";\n}\nfunction detectBrowser() {\n  const ua = navigator.userAgent;\n  const platform = getPlatform();\n  let name = \"Unknown\";\n  let version = \"0\";\n  let majorVersion = 0;\n  let isSmartTV = false;\n  let isLegacyTV = false;\n  let supportsModernJS = true;\n  let webOSVersion;\n  let tizenVersion;\n  let chromeVersionNum;\n  const chromeVersion = getChromeVersion(ua);\n  const webkitVersion = getWebKitVersion(ua);\n  chromeVersionNum = chromeVersion > 0 ? chromeVersion : void 0;\n  if (/Web0S|webOS|LG Browser|LGSTB/i.test(ua)) {\n    name = \"LG WebOS\";\n    isSmartTV = true;\n    let match = ua.match(/Web0S[/\\s]*([\\d.]+)/i) || ua.match(/webOS[/\\s]*([\\d.]+)/i);\n    if (!match || !match[1]) {\n      match = ua.match(/webOSTV[/\\s-]*([\\d.]+)/i) || ua.match(/webOS\\.TV[/\\s-]*([\\d.]+)/i);\n    }\n    if (match && match[1]) {\n      version = match[1];\n      const parts = version.split(\".\");\n      majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n      webOSVersion = majorVersion;\n    } else if (chromeVersion > 0) {\n      if (chromeVersion >= 79) {\n        webOSVersion = 6;\n        version = \"6.0\";\n        majorVersion = 6;\n      } else if (chromeVersion >= 68) {\n        webOSVersion = 5;\n        version = \"5.0\";\n        majorVersion = 5;\n      } else if (chromeVersion >= 53) {\n        webOSVersion = 4;\n        version = \"4.0\";\n        majorVersion = 4;\n      } else if (chromeVersion >= 38) {\n        webOSVersion = 3;\n        version = \"3.0\";\n        majorVersion = 3;\n      } else {\n        webOSVersion = 2;\n        version = \"2.0\";\n        majorVersion = 2;\n      }\n    } else {\n      version = \"Unknown\";\n      webOSVersion = void 0;\n    }\n    isLegacyTV = webOSVersion !== void 0 && webOSVersion < 3;\n  } else if (/Tizen/i.test(ua)) {\n    name = \"Samsung Tizen\";\n    isSmartTV = true;\n    const match = ua.match(/Tizen[/\\s]*([\\d.]+)/i);\n    version = match && match[1] ? match[1] : \"Unknown\";\n    if (version !== \"Unknown\") {\n      const parts = version.split(\".\");\n      majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n      tizenVersion = majorVersion;\n    }\n    isLegacyTV = tizenVersion !== void 0 && tizenVersion < 3;\n  } else if (/SMART-TV|SmartTV/i.test(ua)) {\n    name = \"Smart TV\";\n    isSmartTV = true;\n    isLegacyTV = chromeVersion > 0 && chromeVersion < 53;\n  } else if (/NetCast/i.test(ua)) {\n    name = \"LG NetCast\";\n    isSmartTV = true;\n    isLegacyTV = true;\n  } else if (/BRAVIA/i.test(ua)) {\n    name = \"Sony BRAVIA\";\n    isSmartTV = true;\n    isLegacyTV = chromeVersion > 0 && chromeVersion < 53;\n  } else {\n    if (chromeVersion > 0) {\n      name = \"Chrome\";\n      version = chromeVersion.toString();\n      majorVersion = chromeVersion;\n      if (chromeVersion < 50) {\n        supportsModernJS = false;\n      }\n    }\n    if (webkitVersion > 0 && webkitVersion < 600) {\n      supportsModernJS = false;\n    }\n  }\n  if (typeof Promise === \"undefined\" || typeof Map === \"undefined\" || typeof Set === \"undefined\") {\n    supportsModernJS = false;\n  }\n  if (typeof URLSearchParams === \"undefined\") {\n    supportsModernJS = false;\n  }\n  return {\n    name,\n    version,\n    majorVersion,\n    isSmartTV,\n    isLegacyTV,\n    platform,\n    supportsModernJS,\n    webOSVersion,\n    tizenVersion,\n    chromeVersion: chromeVersionNum\n  };\n}\nfunction getBrowserConfigOverrides() {\n  const browser = detectBrowser();\n  const overrides = {};\n  if (browser.isSmartTV) {\n    overrides.allowNativeHls = true;\n  }\n  return overrides;\n}\nfunction logBrowserInfo(debug = false) {\n  if (!debug) return;\n  const browser = detectBrowser();\n  console.log(\"[StormcloudVideoPlayer] Browser Compatibility Info:\", {\n    browser: `${browser.name} ${browser.version}`,\n    platform: browser.platform,\n    isSmartTV: browser.isSmartTV,\n    isLegacyTV: browser.isLegacyTV,\n    supportsModernJS: browser.supportsModernJS,\n    ...browser.webOSVersion !== void 0 ? { webOSVersion: browser.webOSVersion } : {},\n    ...browser.tizenVersion !== void 0 ? { tizenVersion: browser.tizenVersion } : {},\n    ...browser.chromeVersion !== void 0 ? { chromeVersion: browser.chromeVersion } : {},\n    userAgent: navigator.userAgent\n  });\n}\n\n// src/player/Scte35Parser.ts\nfunction parseCueOutDuration(value) {\n  const num = parseFloat(value.trim());\n  if (!Number.isNaN(num)) return num;\n  const match = value.match(/(?:^|[,\\s])DURATION\\s*=\\s*([0-9.]+)/i) || value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n  if (match && match[1] != null) {\n    const dStr = match[1];\n    const d = parseFloat(dStr);\n    return Number.isNaN(d) ? void 0 : d;\n  }\n  return void 0;\n}\nfunction parseCueOutCont(value) {\n  const res = {};\n  const elapsedMatch = value.match(/Elapsed\\s*=\\s*([0-9.]+)/i);\n  const durationMatch = value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n  if (elapsedMatch && elapsedMatch[1] != null) {\n    const e = parseFloat(elapsedMatch[1]);\n    if (!Number.isNaN(e)) res.elapsed = e;\n  }\n  if (durationMatch && durationMatch[1] != null) {\n    const d = parseFloat(durationMatch[1]);\n    if (!Number.isNaN(d)) res.duration = d;\n  }\n  if (!(\"elapsed\" in res) || !(\"duration\" in res)) {\n    const slashMatch = value.match(/([0-9.]+)\\s*\\/\\s*([0-9.]+)/);\n    if (slashMatch && slashMatch[1] && slashMatch[2]) {\n      const elapsed = parseFloat(slashMatch[1]);\n      const duration = parseFloat(slashMatch[2]);\n      if (!Number.isNaN(elapsed) && !(\"elapsed\" in res)) res.elapsed = elapsed;\n      if (!Number.isNaN(duration) && !(\"duration\" in res)) res.duration = duration;\n    }\n  }\n  if (\"elapsed\" in res || \"duration\" in res) return res;\n  return void 0;\n}\nfunction parseAttributeList(value) {\n  const attrs = {};\n  const regex = /([A-Z0-9-]+)=((\"[^\"]*\")|([^\",]*))(?:,|$)/gi;\n  let match;\n  while ((match = regex.exec(value)) !== null) {\n    const key = match[1] ?? \"\";\n    let rawVal = match[3] ?? match[4] ?? \"\";\n    if (rawVal.startsWith('\"') && rawVal.endsWith('\"')) {\n      rawVal = rawVal.slice(1, -1);\n    }\n    if (key) {\n      attrs[key] = rawVal;\n    }\n  }\n  return attrs;\n}\nfunction toNumber(val) {\n  if (val == null) return void 0;\n  const n = typeof val === \"string\" ? parseFloat(val) : Number(val);\n  return Number.isNaN(n) ? void 0 : n;\n}\nfunction isManifestBasedMarker(marker) {\n  const raw = marker.raw;\n  if (!raw) return false;\n  if (raw.tag) {\n    const tag = String(raw.tag);\n    return tag.includes(\"EXT-X-CUE-OUT\") || tag.includes(\"EXT-X-CUE-IN\") || tag.includes(\"EXT-X-DATERANGE\");\n  }\n  if (raw.id3) return false;\n  if (raw.splice_command_type) return false;\n  return false;\n}\nfunction decodeId3ValueToText(value) {\n  try {\n    if (typeof value === \"string\") return value;\n    const decoder = new TextDecoder(\"utf-8\", { fatal: false });\n    const text = decoder.decode(value);\n    if (text && /[\\x20-\\x7E]/.test(text)) return text;\n    let out = \"\";\n    for (let i = 0; i < value.length; i++)\n      out += String.fromCharCode(value[i]);\n    return out;\n  } catch {\n    return void 0;\n  }\n}\nfunction getFragmentStartSeconds(frag) {\n  const candidates = [frag?.start, frag?.startPTS];\n  for (const candidate of candidates) {\n    if (typeof candidate === \"number\" && Number.isFinite(candidate)) {\n      return candidate;\n    }\n  }\n  return void 0;\n}\nfunction parseScte35FromId3(tag) {\n  const text = decodeId3ValueToText(tag.value);\n  if (!text) return void 0;\n  const cueOutMatch = text.match(/EXT-X-CUE-OUT(?::([^\\r\\n]*))?/i) || text.match(/CUE-OUT(?::([^\\r\\n]*))?/i);\n  if (cueOutMatch) {\n    const arg = (cueOutMatch[1] ?? \"\").trim();\n    const dur = parseCueOutDuration(arg);\n    const marker = {\n      type: \"start\",\n      ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n      ...dur !== void 0 ? { durationSeconds: dur } : {},\n      raw: { id3: text }\n    };\n    return marker;\n  }\n  const cueOutContMatch = text.match(/EXT-X-CUE-OUT-CONT:([^\\r\\n]*)/i);\n  if (cueOutContMatch) {\n    const arg = (cueOutContMatch[1] ?? \"\").trim();\n    const cont = parseCueOutCont(arg);\n    const marker = {\n      type: \"progress\",\n      ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n      ...cont?.duration !== void 0 ? { durationSeconds: cont.duration } : {},\n      raw: { id3: text }\n    };\n    return marker;\n  }\n  const cueInMatch = text.match(/EXT-X-CUE-IN\\b/i) || text.match(/CUE-IN\\b/i);\n  if (cueInMatch) {\n    const marker = {\n      type: \"end\",\n      ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n      raw: { id3: text }\n    };\n    return marker;\n  }\n  const daterangeMatch = text.match(/EXT-X-DATERANGE:([^\\r\\n]*)/i);\n  if (daterangeMatch) {\n    const attrs = parseAttributeList(daterangeMatch[1] ?? \"\");\n    const hasScteOut = \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== void 0;\n    const hasScteIn = \"SCTE35-IN\" in attrs || attrs[\"SCTE35-IN\"] !== void 0;\n    const klass = String(attrs[\"CLASS\"] ?? \"\");\n    const duration = toNumber(attrs[\"DURATION\"]);\n    if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n      const marker = {\n        type: \"start\",\n        ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n        ...duration !== void 0 ? { durationSeconds: duration } : {},\n        raw: { id3: text, attrs }\n      };\n      return marker;\n    }\n    if (hasScteIn) {\n      const marker = {\n        type: \"end\",\n        ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n        raw: { id3: text, attrs }\n      };\n      return marker;\n    }\n  }\n  if (/SCTE35-OUT/i.test(text)) {\n    const marker = {\n      type: \"start\",\n      ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n      raw: { id3: text }\n    };\n    return marker;\n  }\n  if (/SCTE35-IN/i.test(text)) {\n    const marker = {\n      type: \"end\",\n      ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n      raw: { id3: text }\n    };\n    return marker;\n  }\n  if (tag.value instanceof Uint8Array) {\n    const bin = parseScte35Binary(tag.value);\n    if (bin) return bin;\n  }\n  return void 0;\n}\nfunction normalizeFragmentPayload(payload) {\n  if (payload instanceof Uint8Array) {\n    return payload;\n  }\n  if (payload instanceof ArrayBuffer) {\n    return new Uint8Array(payload);\n  }\n  if (ArrayBuffer.isView(payload)) {\n    const view = payload;\n    return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n  }\n  return void 0;\n}\nfunction detectTsPacketFormat(data) {\n  const packetSizes = [188, 192, 204];\n  for (const packetSize of packetSizes) {\n    const tsPayloadOffset = packetSize === 192 ? 4 : 0;\n    for (let offset = 0; offset < packetSize; offset++) {\n      let matchedPackets = 0;\n      for (let packetStart = offset; packetStart + tsPayloadOffset < data.length && matchedPackets < 5; packetStart += packetSize) {\n        if (data[packetStart + tsPayloadOffset] !== 71) {\n          break;\n        }\n        matchedPackets++;\n      }\n      if (matchedPackets >= 2) {\n        return { offset, packetSize, tsPayloadOffset };\n      }\n    }\n  }\n  return void 0;\n}\nfunction getPsiSectionStart(payload, payloadUnitStart) {\n  if (!payloadUnitStart) {\n    return void 0;\n  }\n  const pointerField = payload[0];\n  if (pointerField == null) {\n    return void 0;\n  }\n  const sectionStart = 1 + pointerField;\n  return sectionStart < payload.length ? sectionStart : void 0;\n}\nfunction getPsiSectionLength(data, offset) {\n  return ((data[offset + 1] ?? 0) & 15) << 8 | (data[offset + 2] ?? 0);\n}\nfunction parsePatSection(payload, payloadUnitStart, pmtPids) {\n  const sectionStart = getPsiSectionStart(payload, payloadUnitStart);\n  if (sectionStart == null || sectionStart + 8 >= payload.length) {\n    return;\n  }\n  if (payload[sectionStart] !== 0) {\n    return;\n  }\n  const sectionLength = getPsiSectionLength(payload, sectionStart);\n  const sectionEnd = Math.min(\n    payload.length,\n    sectionStart + 3 + sectionLength\n  );\n  for (let offset = sectionStart + 8; offset + 4 <= sectionEnd - 4; offset += 4) {\n    const programNumber = (payload[offset] ?? 0) << 8 | (payload[offset + 1] ?? 0);\n    const pid = ((payload[offset + 2] ?? 0) & 31) << 8 | (payload[offset + 3] ?? 0);\n    if (programNumber !== 0) {\n      pmtPids.add(pid);\n    }\n  }\n}\nfunction descriptorsIdentifyScte35(data, start, end) {\n  let offset = start;\n  while (offset + 2 <= end) {\n    const tag = data[offset] ?? 0;\n    const length = data[offset + 1] ?? 0;\n    const descriptorStart = offset + 2;\n    const descriptorEnd = descriptorStart + length;\n    if (descriptorEnd > end) {\n      return false;\n    }\n    const registration = length >= 4 ? String.fromCharCode(\n      data[descriptorStart] ?? 0,\n      data[descriptorStart + 1] ?? 0,\n      data[descriptorStart + 2] ?? 0,\n      data[descriptorStart + 3] ?? 0\n    ) : \"\";\n    if (tag === 138 || registration === \"CUEI\" || registration === \"SCTE\") {\n      return true;\n    }\n    offset = descriptorEnd;\n  }\n  return false;\n}\nfunction parsePmtSection(payload, payloadUnitStart, tsScte35Pids) {\n  const sectionStart = getPsiSectionStart(payload, payloadUnitStart);\n  if (sectionStart == null || sectionStart + 12 >= payload.length) {\n    return;\n  }\n  if (payload[sectionStart] !== 2) {\n    return;\n  }\n  const sectionLength = getPsiSectionLength(payload, sectionStart);\n  const sectionEnd = Math.min(\n    payload.length,\n    sectionStart + 3 + sectionLength\n  );\n  const programInfoLength = ((payload[sectionStart + 10] ?? 0) & 15) << 8 | (payload[sectionStart + 11] ?? 0);\n  let offset = sectionStart + 12 + programInfoLength;\n  while (offset + 5 <= sectionEnd - 4) {\n    const streamType = payload[offset] ?? 0;\n    const elementaryPid = ((payload[offset + 1] ?? 0) & 31) << 8 | (payload[offset + 2] ?? 0);\n    const esInfoLength = ((payload[offset + 3] ?? 0) & 15) << 8 | (payload[offset + 4] ?? 0);\n    const descriptorStart = offset + 5;\n    const descriptorEnd = Math.min(descriptorStart + esInfoLength, sectionEnd - 4);\n    if (streamType === 134 || streamType === 6 && descriptorsIdentifyScte35(payload, descriptorStart, descriptorEnd)) {\n      tsScte35Pids.add(elementaryPid);\n    }\n    offset = descriptorStart + esInfoLength;\n  }\n}\nfunction hasProcessedTsScte35Section(section, processedSections) {\n  let checksum = 0;\n  for (let i = 0; i < section.length; i++) {\n    checksum = checksum * 31 + (section[i] ?? 0) >>> 0;\n  }\n  const key = `${section.length}:${checksum}`;\n  if (processedSections.has(key)) {\n    return true;\n  }\n  processedSections.add(key);\n  if (processedSections.size > 200) {\n    const firstKey = processedSections.values().next().value;\n    if (firstKey) {\n      processedSections.delete(firstKey);\n    }\n  }\n  return false;\n}\nfunction addScte35SectionMarker(section, markers, processedSections) {\n  if (section[0] !== 252 || hasProcessedTsScte35Section(section, processedSections)) {\n    return;\n  }\n  const marker = parseScte35Binary(section);\n  if (!marker) {\n    return;\n  }\n  marker.raw = {\n    ...typeof marker.raw === \"object\" && marker.raw ? marker.raw : {},\n    source: \"ts-packet\"\n  };\n  markers.push(marker);\n}\nfunction appendScte35Bytes(pid, bytes, assemblers, markers, processedSections) {\n  const assembler = assemblers.get(pid);\n  if (!assembler) {\n    return;\n  }\n  for (let i = 0; i < bytes.length && assembler.bytes.length < assembler.expectedLength; i++) {\n    assembler.bytes.push(bytes[i] ?? 0);\n  }\n  if (assembler.bytes.length >= assembler.expectedLength) {\n    assemblers.delete(pid);\n    addScte35SectionMarker(new Uint8Array(assembler.bytes), markers, processedSections);\n  }\n}\nfunction collectScte35SectionsFromPayload(pid, payload, payloadUnitStart, assemblers, markers, processedSections) {\n  if (payload.length === 0) {\n    return;\n  }\n  let offset = 0;\n  if (payloadUnitStart) {\n    const pointerField = payload[0] ?? 0;\n    const previousAssembler = assemblers.get(pid);\n    if (previousAssembler && pointerField > 0) {\n      appendScte35Bytes(\n        pid,\n        payload.subarray(1, Math.min(1 + pointerField, payload.length)),\n        assemblers,\n        markers,\n        processedSections\n      );\n    }\n    assemblers.delete(pid);\n    offset = 1 + pointerField;\n  } else {\n    appendScte35Bytes(pid, payload, assemblers, markers, processedSections);\n    return;\n  }\n  while (offset + 3 <= payload.length) {\n    const tableId = payload[offset];\n    if (tableId == null || tableId === 255) {\n      return;\n    }\n    const sectionLength = getPsiSectionLength(payload, offset);\n    const totalLength = 3 + sectionLength;\n    if (sectionLength <= 0 || totalLength <= 3) {\n      return;\n    }\n    if (offset + totalLength <= payload.length) {\n      addScte35SectionMarker(\n        payload.subarray(offset, offset + totalLength),\n        markers,\n        processedSections\n      );\n      offset += totalLength;\n    } else {\n      assemblers.set(pid, {\n        bytes: Array.from(payload.subarray(offset)),\n        expectedLength: totalLength\n      });\n      return;\n    }\n  }\n}\nfunction parseScte35FromTsPackets(data, tsScte35Pids, pmtPids, processedSections) {\n  const packetInfo = detectTsPacketFormat(data);\n  if (!packetInfo) {\n    return [];\n  }\n  const markers = [];\n  const sectionAssemblers = /* @__PURE__ */ new Map();\n  for (let packetStart = packetInfo.offset; packetStart + packetInfo.packetSize <= data.length; packetStart += packetInfo.packetSize) {\n    const tsStart = packetStart + packetInfo.tsPayloadOffset;\n    if (data[tsStart] !== 71) {\n      continue;\n    }\n    const secondByte = data[tsStart + 1];\n    const thirdByte = data[tsStart + 2];\n    const fourthByte = data[tsStart + 3];\n    if (secondByte == null || thirdByte == null || fourthByte == null || (secondByte & 128) !== 0) {\n      continue;\n    }\n    const payloadUnitStart = (secondByte & 64) !== 0;\n    const pid = (secondByte & 31) << 8 | thirdByte;\n    const adaptationFieldControl = fourthByte >> 4 & 3;\n    const hasPayload = adaptationFieldControl === 1 || adaptationFieldControl === 3;\n    if (!hasPayload) {\n      continue;\n    }\n    let payloadStart = tsStart + 4;\n    if (adaptationFieldControl === 3) {\n      const adaptationLength = data[payloadStart];\n      if (adaptationLength == null) {\n        continue;\n      }\n      payloadStart += 1 + adaptationLength;\n    }\n    const payloadEnd = Math.min(tsStart + 188, data.length);\n    if (payloadStart >= payloadEnd || payloadStart >= data.length) {\n      continue;\n    }\n    const payload = data.subarray(payloadStart, payloadEnd);\n    if (pid === 0) {\n      parsePatSection(payload, payloadUnitStart, pmtPids);\n    } else if (pmtPids.has(pid)) {\n      parsePmtSection(payload, payloadUnitStart, tsScte35Pids);\n    } else if (tsScte35Pids.has(pid)) {\n      collectScte35SectionsFromPayload(\n        pid,\n        payload,\n        payloadUnitStart,\n        sectionAssemblers,\n        markers,\n        processedSections\n      );\n    }\n  }\n  return markers;\n}\nvar BitReader = class {\n  constructor(buf) {\n    this.buf = buf;\n    this.bytePos = 0;\n    this.bitPos = 0;\n  }\n  readBits(numBits) {\n    let result = 0;\n    while (numBits > 0) {\n      if (this.bytePos >= this.buf.length) return result;\n      const remainingInByte = 8 - this.bitPos;\n      const toRead = Math.min(numBits, remainingInByte);\n      const currentByte = this.buf[this.bytePos];\n      const shift = remainingInByte - toRead;\n      const mask = (1 << toRead) - 1 & 255;\n      const bits = currentByte >> shift & mask;\n      result = result << toRead | bits;\n      this.bitPos += toRead;\n      if (this.bitPos >= 8) {\n        this.bitPos = 0;\n        this.bytePos += 1;\n      }\n      numBits -= toRead;\n    }\n    return result >>> 0;\n  }\n  skipBits(n) {\n    this.readBits(n);\n  }\n  get bytePosition() {\n    return this.bitPos === 0 ? this.bytePos : this.bytePos + 1;\n  }\n};\nfunction readSpliceTime(r, ptsAdjustmentTicks) {\n  const timeSpecifiedFlag = r.readBits(1) === 1;\n  if (!timeSpecifiedFlag) {\n    r.readBits(7);\n    return void 0;\n  }\n  r.readBits(6);\n  const high = r.readBits(1);\n  const low = r.readBits(32);\n  const ptsTicks = (high * 4294967296 + low + ptsAdjustmentTicks) % 8589934592;\n  return ptsTicks / 9e4;\n}\nfunction markerTypeFromSegmentationTypeId(segmentationTypeId) {\n  switch (segmentationTypeId) {\n    case 16:\n    case 34:\n    case 48:\n    case 50:\n    case 52:\n    case 54:\n      return \"start\";\n    case 17:\n    case 35:\n    case 49:\n    case 51:\n    case 53:\n    case 55:\n      return \"end\";\n    default:\n      return void 0;\n  }\n}\nfunction parseScte35SegmentationDescriptor(descriptor) {\n  if (descriptor.length < 11) {\n    return void 0;\n  }\n  const identifier = String.fromCharCode(\n    descriptor[0] ?? 0,\n    descriptor[1] ?? 0,\n    descriptor[2] ?? 0,\n    descriptor[3] ?? 0\n  );\n  if (identifier !== \"CUEI\") {\n    return void 0;\n  }\n  const segmentationEventId = (descriptor[4] ?? 0) * 16777216 + ((descriptor[5] ?? 0) << 16) + ((descriptor[6] ?? 0) << 8) + (descriptor[7] ?? 0);\n  const cancelIndicator = ((descriptor[8] ?? 0) & 128) !== 0;\n  if (cancelIndicator) {\n    return void 0;\n  }\n  const flags = descriptor[9] ?? 0;\n  const programSegmentationFlag = (flags & 128) !== 0;\n  const segmentationDurationFlag = (flags & 64) !== 0;\n  let offset = 10;\n  if (!programSegmentationFlag) {\n    const componentCount = descriptor[offset] ?? 0;\n    offset += 1 + componentCount * 6;\n    if (offset > descriptor.length) {\n      return void 0;\n    }\n  }\n  let durationSeconds = void 0;\n  if (segmentationDurationFlag) {\n    if (offset + 5 > descriptor.length) {\n      return void 0;\n    }\n    const durationTicks = (descriptor[offset] ?? 0) * 4294967296 + (descriptor[offset + 1] ?? 0) * 16777216 + ((descriptor[offset + 2] ?? 0) << 16) + ((descriptor[offset + 3] ?? 0) << 8) + (descriptor[offset + 4] ?? 0);\n    durationSeconds = durationTicks / 9e4;\n    offset += 5;\n  }\n  if (offset + 2 > descriptor.length) {\n    return void 0;\n  }\n  offset += 1;\n  const segmentationUpidLength = descriptor[offset] ?? 0;\n  offset += 1 + segmentationUpidLength;\n  if (offset >= descriptor.length) {\n    return void 0;\n  }\n  const segmentationTypeId = descriptor[offset] ?? 0;\n  const markerType = markerTypeFromSegmentationTypeId(segmentationTypeId);\n  if (!markerType) {\n    return void 0;\n  }\n  return {\n    type: markerType,\n    ...durationSeconds !== void 0 ? { durationSeconds } : {},\n    segmentationEventId\n  };\n}\nfunction parseScte35SegmentationDescriptors(data, offset) {\n  if (offset + 2 > data.length) {\n    return void 0;\n  }\n  const descriptorLoopLength = (data[offset] ?? 0) << 8 | (data[offset + 1] ?? 0);\n  let descriptorOffset = offset + 2;\n  const descriptorEnd = Math.min(\n    data.length,\n    descriptorOffset + descriptorLoopLength\n  );\n  while (descriptorOffset + 2 <= descriptorEnd) {\n    const descriptorTag = data[descriptorOffset] ?? 0;\n    const descriptorLength = data[descriptorOffset + 1] ?? 0;\n    const descriptorDataStart = descriptorOffset + 2;\n    const descriptorDataEnd = descriptorDataStart + descriptorLength;\n    if (descriptorDataEnd > descriptorEnd) {\n      return void 0;\n    }\n    if (descriptorTag === 2) {\n      const descriptorMarker = parseScte35SegmentationDescriptor(\n        data.subarray(descriptorDataStart, descriptorDataEnd)\n      );\n      if (descriptorMarker) {\n        return descriptorMarker;\n      }\n    }\n    descriptorOffset = descriptorDataEnd;\n  }\n  return void 0;\n}\nfunction parseScte35Binary(data) {\n  const r = new BitReader(data);\n  const tableId = r.readBits(8);\n  if (tableId !== 252) return void 0;\n  r.readBits(1);\n  r.readBits(1);\n  r.readBits(2);\n  const sectionLength = r.readBits(12);\n  if (sectionLength <= 0 || data.length < 3 + sectionLength) {\n    return void 0;\n  }\n  r.readBits(8);\n  r.readBits(1);\n  r.readBits(6);\n  const ptsAdjHigh = r.readBits(1);\n  const ptsAdjLow = r.readBits(32);\n  const ptsAdjustmentTicks = ptsAdjHigh * 4294967296 + ptsAdjLow;\n  r.readBits(8);\n  r.readBits(12);\n  const spliceCommandLength = r.readBits(12);\n  const spliceCommandType = r.readBits(8);\n  let markerType;\n  let durationSeconds = void 0;\n  let ptsSeconds = void 0;\n  let spliceEventId = void 0;\n  const commandBodyStart = r.bytePosition;\n  if (spliceCommandType === 5) {\n    spliceEventId = r.readBits(32);\n    const cancel = r.readBits(1) === 1;\n    r.readBits(7);\n    if (cancel) return void 0;\n    const outOfNetwork = r.readBits(1) === 1;\n    const programSpliceFlag = r.readBits(1) === 1;\n    const durationFlag = r.readBits(1) === 1;\n    const spliceImmediateFlag = r.readBits(1) === 1;\n    r.readBits(4);\n    markerType = outOfNetwork ? \"start\" : \"end\";\n    if (programSpliceFlag && !spliceImmediateFlag) {\n      ptsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n    } else if (!programSpliceFlag) {\n      const componentCount = r.readBits(8);\n      for (let i = 0; i < componentCount; i++) {\n        r.readBits(8);\n        if (!spliceImmediateFlag) {\n          const componentPtsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n          if (ptsSeconds === void 0) {\n            ptsSeconds = componentPtsSeconds;\n          }\n        }\n      }\n    }\n    if (durationFlag) {\n      r.readBits(6);\n      r.readBits(1);\n      const high = r.readBits(1);\n      const low = r.readBits(32);\n      const durationTicks = high * 4294967296 + low;\n      durationSeconds = durationTicks / 9e4;\n    }\n    r.readBits(16);\n    r.readBits(8);\n    r.readBits(8);\n  } else if (spliceCommandType === 6) {\n    ptsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n  } else {\n    return void 0;\n  }\n  const expectedDescriptorOffset = spliceCommandLength === 4095 ? r.bytePosition : commandBodyStart + spliceCommandLength;\n  const descriptorMarker = parseScte35SegmentationDescriptors(\n    data,\n    expectedDescriptorOffset\n  );\n  if (descriptorMarker) {\n    markerType = descriptorMarker.type;\n    if (durationSeconds === void 0) {\n      durationSeconds = descriptorMarker.durationSeconds;\n    }\n  }\n  if (!markerType) {\n    return void 0;\n  }\n  const marker = {\n    type: markerType,\n    ...ptsSeconds !== void 0 ? { ptsSeconds } : {},\n    ...durationSeconds !== void 0 ? { durationSeconds } : {},\n    raw: {\n      splice_command_type: spliceCommandType,\n      ...spliceEventId !== void 0 ? { splice_event_id: spliceEventId } : {},\n      ...descriptorMarker?.segmentationEventId !== void 0 ? { segmentation_event_id: descriptorMarker.segmentationEventId } : {}\n    }\n  };\n  return marker;\n}\n\n// src/player/Scte35CueManager.ts\nvar Scte35CueManager = class {\n  constructor(debug, callbacks) {\n    this.pendingScte35Cues = /* @__PURE__ */ new Map();\n    this.recentScte35CueKeys = /* @__PURE__ */ new Map();\n    this.recentScte35CueLimit = 200;\n    this.tsScte35Pids = /* @__PURE__ */ new Set();\n    this.pmtPids = /* @__PURE__ */ new Set();\n    this.processedTsScte35Sections = /* @__PURE__ */ new Set();\n    this.debug = debug;\n    this.callbacks = callbacks;\n  }\n  get pendingScte35CueKey() {\n    return this.pendingScte35CueKeyValue;\n  }\n  set pendingScte35CueKey(value) {\n    this.pendingScte35CueKeyValue = value;\n  }\n  get activeScte35BreakKey() {\n    return this.activeScte35BreakKeyValue;\n  }\n  set activeScte35BreakKey(value) {\n    this.activeScte35BreakKeyValue = value;\n  }\n  get scheduledScte35BreakKey() {\n    return this.scheduledScte35BreakKeyValue;\n  }\n  set scheduledScte35BreakKey(value) {\n    this.scheduledScte35BreakKeyValue = value;\n  }\n  createScte35CueContext(source, readiness, frag) {\n    const context = { source, readiness };\n    if (typeof frag?.sn === \"number\") {\n      context.fragmentSn = frag.sn;\n    }\n    const fragmentStartSec = getFragmentStartSeconds(frag);\n    if (fragmentStartSec !== void 0) {\n      context.fragmentStartSeconds = fragmentStartSec;\n    }\n    return context;\n  }\n  onScte35Cue(marker, context) {\n    const cue = this.createScte35Cue(marker, context);\n    const pendingKey = this.getPendingScte35CueKey(cue);\n    if (context.readiness === \"early\") {\n      this.pendingScte35Cues.set(pendingKey, cue);\n      this.trimRecentScte35CueMaps();\n      if (marker.type === \"start\") {\n        this.callbacks.onEarlyStartCue(marker, context.fragmentSn, cue.key);\n      }\n      return;\n    }\n    if (marker.type === \"end\" && !this.shouldAcceptScte35EndCue(cue)) {\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Ignoring SCTE-35 end cue\", {\n          key: cue.key,\n          activeScte35BreakKey: this.activeScte35BreakKeyValue,\n          inAdBreak: this.callbacks.isInAdBreak(),\n          source: cue.source\n        });\n      }\n      return;\n    }\n    if (marker.type === \"start\" && this.hasRecentlyHandledScte35Cue(cue)) {\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Ignoring duplicate SCTE-35 start cue\", {\n          key: cue.key,\n          source: cue.source\n        });\n      }\n      return;\n    }\n    this.pendingScte35Cues.delete(pendingKey);\n    this.markScte35CueHandled(cue);\n    this.callbacks.onPlaybackCue(marker, cue.key);\n  }\n  activatePendingScte35CuesForFragment(frag) {\n    const fragmentSn = typeof frag?.sn === \"number\" ? frag.sn : void 0;\n    if (fragmentSn === void 0) {\n      return;\n    }\n    const matchingCues = Array.from(this.pendingScte35Cues.entries()).filter(\n      ([, cue]) => cue.fragmentSn === fragmentSn\n    );\n    matchingCues.forEach(([pendingKey, cue]) => {\n      this.pendingScte35Cues.delete(pendingKey);\n      const context = {\n        source: cue.source,\n        readiness: \"playback\"\n      };\n      context.fragmentSn = fragmentSn;\n      const fragmentStartSec = cue.fragmentStartSeconds ?? getFragmentStartSeconds(frag);\n      if (fragmentStartSec !== void 0) {\n        context.fragmentStartSeconds = fragmentStartSec;\n      }\n      this.onScte35Cue(cue.marker, context);\n    });\n  }\n  createScte35Cue(marker, context) {\n    const cue = {\n      marker,\n      source: context.source,\n      readiness: context.readiness,\n      key: this.getScte35CueKey(marker, context)\n    };\n    if (context.fragmentSn !== void 0) {\n      cue.fragmentSn = context.fragmentSn;\n    }\n    if (context.fragmentStartSeconds !== void 0) {\n      cue.fragmentStartSeconds = context.fragmentStartSeconds;\n    }\n    return cue;\n  }\n  getScte35CueKey(marker, context) {\n    const raw = this.getScte35MarkerRaw(marker);\n    const spliceEventId = this.toIdentityString(raw?.splice_event_id);\n    if (spliceEventId) {\n      return `splice:${spliceEventId}`;\n    }\n    const segmentationEventId = this.toIdentityString(raw?.segmentation_event_id);\n    if (segmentationEventId) {\n      return `segmentation:${segmentationEventId}`;\n    }\n    const daterangeId = this.toIdentityString(raw?.attrs?.ID);\n    if (daterangeId) {\n      return `daterange:${daterangeId}`;\n    }\n    const scteValue = this.toIdentityString(raw?.attrs?.[\"SCTE35-OUT\"]) || this.toIdentityString(raw?.attrs?.[\"SCTE35-IN\"]);\n    if (scteValue) {\n      return `daterange-scte:${scteValue}`;\n    }\n    if (typeof marker.ptsSeconds === \"number\" && Number.isFinite(marker.ptsSeconds)) {\n      return `pts:${Math.round(marker.ptsSeconds * 2) / 2}`;\n    }\n    if (context.fragmentSn !== void 0) {\n      return `fragment:${context.fragmentSn}`;\n    }\n    return `${context.source}:wallclock:${Math.floor(Date.now() / 1e3)}`;\n  }\n  getPendingScte35CueKey(cue) {\n    return `${cue.marker.type}:${cue.key}:${cue.fragmentSn !== void 0 ? cue.fragmentSn : \"unknown\"}`;\n  }\n  getScte35MarkerRaw(marker) {\n    return typeof marker.raw === \"object\" && marker.raw !== null ? marker.raw : {};\n  }\n  toIdentityString(value) {\n    if (typeof value === \"number\" && Number.isFinite(value)) {\n      return String(value);\n    }\n    if (typeof value === \"string\" && value.trim().length > 0) {\n      return value.trim();\n    }\n    return void 0;\n  }\n  isStrongScte35CueKey(key) {\n    return !!(key && (key.startsWith(\"splice:\") || key.startsWith(\"segmentation:\") || key.startsWith(\"daterange:\") || key.startsWith(\"daterange-scte:\")));\n  }\n  hasRecentlyHandledScte35Cue(cue) {\n    if (this.activeScte35BreakKeyValue === cue.key || this.scheduledScte35BreakKeyValue === cue.key) {\n      return true;\n    }\n    const recentKey = `${cue.marker.type}:${cue.key}`;\n    return this.recentScte35CueKeys.has(recentKey);\n  }\n  markScte35CueHandled(cue) {\n    this.recentScte35CueKeys.set(`${cue.marker.type}:${cue.key}`, Date.now());\n    this.trimRecentScte35CueMaps();\n  }\n  trimRecentScte35CueMaps() {\n    while (this.recentScte35CueKeys.size > this.recentScte35CueLimit) {\n      const firstKey = this.recentScte35CueKeys.keys().next().value;\n      if (!firstKey) {\n        break;\n      }\n      this.recentScte35CueKeys.delete(firstKey);\n    }\n    while (this.pendingScte35Cues.size > this.recentScte35CueLimit) {\n      const firstKey = this.pendingScte35Cues.keys().next().value;\n      if (!firstKey) {\n        break;\n      }\n      this.pendingScte35Cues.delete(firstKey);\n    }\n  }\n  shouldAcceptScte35EndCue(cue) {\n    if (!this.callbacks.isInAdBreak()) {\n      return false;\n    }\n    if (this.isStrongScte35CueKey(this.activeScte35BreakKeyValue) && this.isStrongScte35CueKey(cue.key) && this.activeScte35BreakKeyValue !== cue.key) {\n      return false;\n    }\n    return true;\n  }\n};\n\n// src/player/AdConfigManager.ts\nvar AdConfigManager = class {\n  constructor(config, video) {\n    this.vmapBreaks = [];\n    this.consumedVmapBreakIds = /* @__PURE__ */ new Set();\n    this.streamCorrelator = generateCorrelator();\n    this.viewCorrelator = generateCorrelator();\n    this.consentSignals = {};\n    this.podCounter = 0;\n    this.podAssignedByPrefetch = false;\n    this.lastHeartbeatTime = 0;\n    this.defaultPodMaxAds = 6;\n    this.defaultPodMaxDurationMs = 12e4;\n    this.config = config;\n    this.video = video;\n  }\n  get debug() {\n    return !!this.config.debugAdTiming;\n  }\n  isVmapEnabled() {\n    return !!(this.config.isVmap && this.config.vmapUrl?.trim());\n  }\n  async fetchAdConfiguration() {\n    if (this.isVmapEnabled()) {\n      await this.fetchAndParseVmap(this.config.vmapUrl);\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] VMAP mode enabled\");\n      }\n      return;\n    }\n    const vastMode = this.config.vastMode || \"default\";\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] VAST mode:\", vastMode);\n    }\n    if (vastMode === \"adstorm\") {\n      if (!this.config.licenseKey) {\n        if (this.debug) {\n          console.warn(\n            \"[StormcloudVideoPlayer] AdStorm mode requires a license key\"\n          );\n        }\n        return;\n      }\n      const vastEndpoint = `https://adstorm.co/api-adstorm-dev/adstorm/vast/${this.config.licenseKey}`;\n      this.apiVastTagUrl = vastEndpoint;\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Using AdStorm VAST endpoint (adstorm mode):\",\n          vastEndpoint\n        );\n      }\n      return;\n    }\n    if (this.config.vastTagUrl) {\n      this.apiVastTagUrl = normalizeVastTagUrl(this.config.vastTagUrl);\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Using custom VAST tag URL:\",\n          this.apiVastTagUrl\n        );\n      }\n      return;\n    }\n    const apiUrl = \"https://adstorm.co/api-adstorm-dev/adstorm/ads/web\";\n    if (this.debug) {\n      console.log(\n        \"[StormcloudVideoPlayer] Fetching ad configuration from:\",\n        apiUrl\n      );\n    }\n    const headers = {};\n    if (this.config.licenseKey) {\n      headers[\"Authorization\"] = `Bearer ${this.config.licenseKey}`;\n    }\n    const response = await fetch(apiUrl, { headers });\n    if (!response.ok) {\n      if (this.debug) {\n        console.warn(\n          `[StormcloudVideoPlayer] Failed to fetch ad configuration: ${response.status}`\n        );\n      }\n      return;\n    }\n    const data = await response.json();\n    const imaPayload = data.response?.ima?.[\"publisherdesk.ima\"]?.payload;\n    if (imaPayload) {\n      let decodedPayload = imaPayload;\n      try {\n        decodedPayload = decodeURIComponent(imaPayload);\n      } catch {\n        console.warn(\"[StormcloudVideoPlayer] imaPayload was not URI-encoded; using as-is:\", imaPayload);\n      }\n      console.log(\"[StormcloudVideoPlayer] Raw VAST tag URL (from API):\", decodedPayload);\n      this.apiVastTagUrl = normalizeVastTagUrl(decodedPayload);\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Normalized VAST tag URL:\",\n          this.apiVastTagUrl\n        );\n      }\n    } else {\n      if (this.debug) {\n        console.warn(\n          \"[StormcloudVideoPlayer] No VAST tag URL found in /ads/web response\"\n        );\n      }\n    }\n    const numberAds = data.response?.options?.vast?.cue_tones?.number_ads;\n    if (numberAds != null && numberAds > 0) {\n      this.apiNumberAds = numberAds;\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Number of ads per break from API:\",\n          this.apiNumberAds\n        );\n      }\n    }\n  }\n  async fetchAndParseVmap(vmapUrl) {\n    if (!vmapUrl.trim()) {\n      return;\n    }\n    try {\n      const response = await fetch(vmapUrl);\n      if (!response.ok) {\n        throw new Error(`Failed to fetch VMAP (${response.status})`);\n      }\n      const vmapXml = await response.text();\n      this.vmapBreaks = this.parseVmapToBreaks(vmapXml);\n      this.consumedVmapBreakIds.clear();\n      if (this.debug) {\n        console.log(\n          `[StormcloudVideoPlayer] Loaded ${this.vmapBreaks.length} VMAP ad break(s) from:`,\n          vmapUrl\n        );\n      }\n    } catch (error) {\n      this.vmapBreaks = [];\n      this.consumedVmapBreakIds.clear();\n      if (this.debug) {\n        console.warn(\"[StormcloudVideoPlayer] Failed to load VMAP:\", error);\n      }\n    }\n  }\n  parseVmapToBreaks(vmapXml) {\n    if (typeof DOMParser === \"undefined\") {\n      return [];\n    }\n    const doc = new DOMParser().parseFromString(vmapXml, \"application/xml\");\n    if (doc.querySelector(\"parsererror\")) {\n      if (this.debug) {\n        console.warn(\"[StormcloudVideoPlayer] Invalid VMAP XML received\");\n      }\n      return [];\n    }\n    const VMAP_NS = \"http://www.iab.net/videosuite/vmap\";\n    let adBreakNodes = Array.from(doc.getElementsByTagNameNS(VMAP_NS, \"AdBreak\"));\n    if (adBreakNodes.length === 0) {\n      adBreakNodes = Array.from(\n        doc.querySelectorAll(\"AdBreak, vmap\\\\:AdBreak\")\n      );\n    }\n    if (adBreakNodes.length === 0) {\n      adBreakNodes = Array.from(doc.getElementsByTagName(\"*\")).filter(\n        (el) => el.localName === \"AdBreak\"\n      );\n    }\n    const parsed = [];\n    adBreakNodes.forEach((node, index) => {\n      const timeOffsetRaw = (node.getAttribute(\"timeOffset\") || \"\").trim();\n      const startTimeMs = this.parseVmapTimeOffsetToMs(timeOffsetRaw);\n      if (startTimeMs == null) {\n        return;\n      }\n      let adTagNode = node.getElementsByTagNameNS(VMAP_NS, \"AdTagURI\")[0];\n      if (!adTagNode) {\n        adTagNode = node.querySelector(\"AdTagURI, vmap\\\\:AdTagURI\") ?? void 0;\n      }\n      const adTagUrl = (adTagNode?.textContent || \"\").trim();\n      if (!adTagUrl) {\n        return;\n      }\n      const breakId = node.getAttribute(\"breakId\") || `vmap-break-${index}-${timeOffsetRaw || \"unknown\"}`;\n      parsed.push({\n        id: breakId,\n        startTimeMs,\n        vastTagUrl: adTagUrl\n      });\n    });\n    parsed.sort((a, b) => {\n      const aStart = a.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : a.startTimeMs;\n      const bStart = b.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : b.startTimeMs;\n      return aStart - bStart;\n    });\n    return parsed;\n  }\n  parseVmapTimeOffsetToMs(timeOffset) {\n    if (!timeOffset) {\n      return void 0;\n    }\n    const normalized = timeOffset.trim().toLowerCase();\n    if (normalized === \"start\") {\n      return 0;\n    }\n    if (normalized === \"end\") {\n      return -1;\n    }\n    const hms = timeOffset.match(\n      /^(\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d{1,3}))?$/\n    );\n    if (hms) {\n      const [, hh, mm, ss, ms = \"0\"] = hms;\n      const hours = Number(hh);\n      const minutes = Number(mm);\n      const seconds = Number(ss);\n      const millis = Number(ms.padEnd(3, \"0\").slice(0, 3));\n      return (hours * 3600 + minutes * 60 + seconds) * 1e3 + millis;\n    }\n    const percent = timeOffset.match(/^(\\d+(?:\\.\\d+)?)%$/);\n    if (percent) {\n      const ratio = Number(percent[1]) / 100;\n      const durationSec = this.video.duration;\n      if (Number.isFinite(durationSec) && durationSec > 0) {\n        return Math.floor(durationSec * 1e3 * ratio);\n      }\n      return void 0;\n    }\n    return void 0;\n  }\n  getAdBreakKey(adBreak) {\n    if (adBreak.id) {\n      return adBreak.id;\n    }\n    return `${adBreak.startTimeMs}-${adBreak.vastTagUrl || \"\"}`;\n  }\n  resolveBreakStartMs(adBreak) {\n    if (adBreak.startTimeMs >= 0) {\n      return adBreak.startTimeMs;\n    }\n    if (adBreak.startTimeMs === -1) {\n      const durationSec = this.video.duration;\n      if (Number.isFinite(durationSec) && durationSec > 0) {\n        return Math.floor(durationSec * 1e3);\n      }\n    }\n    return void 0;\n  }\n  findCurrentOrNextBreak(nowMs) {\n    const schedule = this.vmapBreaks;\n    let candidate;\n    const tol = this.config.driftToleranceMs ?? 1e3;\n    for (const b of schedule) {\n      if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {\n        continue;\n      }\n      const breakStartMs = this.resolveBreakStartMs(b);\n      if (breakStartMs == null) {\n        continue;\n      }\n      if (breakStartMs <= nowMs + tol && (candidate == null || breakStartMs > (this.resolveBreakStartMs(candidate) ?? 0))) {\n        candidate = b;\n      }\n    }\n    return candidate;\n  }\n  findBreakForTime(nowMs) {\n    const schedule = this.vmapBreaks;\n    for (const b of schedule) {\n      if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {\n        continue;\n      }\n      const breakStartMs = this.resolveBreakStartMs(b);\n      if (breakStartMs == null) {\n        continue;\n      }\n      if (b.durationMs) {\n        const end = breakStartMs + b.durationMs;\n        if (nowMs >= breakStartMs && nowMs < end) {\n          return b;\n        }\n        continue;\n      }\n      if (nowMs >= breakStartMs) {\n        return b;\n      }\n    }\n    return void 0;\n  }\n  selectVastTagsForBreak(b) {\n    if (!b || !b.vastTagUrl) return void 0;\n    if (b.vastTagUrl.includes(\",\")) {\n      return b.vastTagUrl.split(\",\").map((s) => s.trim()).filter((s) => s.length > 0);\n    }\n    return [b.vastTagUrl];\n  }\n  beginNewAdPod() {\n    this.podCounter++;\n  }\n  resolvePodParams(breakDurationMs) {\n    const maxDurationMs = breakDurationMs != null && breakDurationMs > 0 ? breakDurationMs : this.config.podMaxDurationMs != null && this.config.podMaxDurationMs > 0 ? this.config.podMaxDurationMs : this.defaultPodMaxDurationMs;\n    const maxAds = this.config.podMaxAds && this.config.podMaxAds > 0 ? this.config.podMaxAds : this.apiNumberAds && this.apiNumberAds > 0 ? this.apiNumberAds : this.defaultPodMaxAds;\n    const minDurationMs = this.config.podExactDuration && maxDurationMs != null ? maxDurationMs : 0;\n    return { maxAds, minDurationMs, maxDurationMs };\n  }\n  generatePodVastUrl(baseUrl, podParams, adPlayer, palNonce, inAdBreak) {\n    const adWillPlayMuted = inAdBreak ? adPlayer.getOriginalMutedState() : this.video.muted;\n    const envSignals = resolveVastEnvironmentSignals(!!this.config.ctvAdRequest);\n    const urlWithMacros = applyVastMacros(baseUrl, {\n      correlator: this.viewCorrelator,\n      streamCorrelator: this.streamCorrelator,\n      pod: this.podCounter > 0 ? this.podCounter : void 0,\n      podMaxAds: podParams.maxAds,\n      podMinDurationMs: podParams.minDurationMs,\n      podMaxDurationMs: podParams.maxDurationMs,\n      isCtv: envSignals.isCtv,\n      contentUrl: envSignals.contentUrl,\n      pageUrl: !envSignals.isCtv && typeof window !== \"undefined\" ? window.location.href : void 0,\n      adWillPlayMuted,\n      adWillAutoPlay: !!this.config.autoplay,\n      appId: envSignals.appId,\n      appName: envSignals.appName,\n      sessionId: envSignals.sessionId,\n      deviceId: envSignals.deviceId,\n      deviceIdType: envSignals.deviceIdType,\n      limitAdTracking: envSignals.limitAdTracking,\n      deviceTypeHint: envSignals.deviceTypeHint,\n      adTest: this.config.adTest,\n      consent: this.consentSignals\n    });\n    const finalUrl = palNonce.injectNonce(urlWithMacros);\n    console.log(\n      `[StormcloudVideoPlayer] Resolved optimized-pod request URL (pod=${this.podCounter}, pmad=${podParams.maxAds}, pmnd=${podParams.minDurationMs}, pmxd=${podParams.maxDurationMs ?? \"?\"}):`,\n      finalUrl\n    );\n    return finalUrl;\n  }\n  // --- Tracking ---\n  initializeTracking() {\n    sendInitialTracking(this.config.licenseKey, buildAnalyticsContext(this.config)).then(() => {\n      this.heartbeatInterval = window.setInterval(() => {\n        this.sendHeartbeatIfNeeded();\n      }, 5e3);\n    }).catch((error) => {\n      if (this.debug) {\n        console.warn(\n          \"[StormcloudVideoPlayer] Failed to send initial tracking:\",\n          error\n        );\n      }\n      this.heartbeatInterval = window.setInterval(() => {\n        this.sendHeartbeatIfNeeded();\n      }, 5e3);\n    });\n  }\n  sendHeartbeatIfNeeded() {\n    const now = Date.now();\n    if (!this.lastHeartbeatTime || now - this.lastHeartbeatTime > 3e4) {\n      this.lastHeartbeatTime = now;\n      sendHeartbeat(this.config.licenseKey, buildAnalyticsContext(this.config)).catch((error) => {\n        if (this.debug) {\n          console.warn(\n            \"[StormcloudVideoPlayer] Failed to send heartbeat:\",\n            error\n          );\n        }\n      });\n    }\n  }\n  destroyTracking() {\n    if (this.heartbeatInterval) {\n      clearInterval(this.heartbeatInterval);\n      this.heartbeatInterval = void 0;\n    }\n  }\n};\n\n// src/player/AdTimingService.ts\nvar AdTimingService = class {\n  constructor(config, video, callbacks) {\n    this.adRequestWatchdogToken = null;\n    this.adFailsafeToken = null;\n    this.ptsDriftEmaMs = 0;\n    this.adBreakPlayedDurationMs = 0;\n    this.adBreakEpoch = 0;\n    this.adRequestTokenCounter = 0;\n    this.activeAdRequestToken = null;\n    this.currentAdIndex = 0;\n    this.totalAdsInBreak = 0;\n    this.totalAdRequestsInBreak = 0;\n    this.maxTotalAdRequestsPerBreak = 10;\n    this.lastAdRequestTime = 0;\n    this.consecutiveFailures = 0;\n    this.maxConsecutiveFailures = 5;\n    this.minAdRequestIntervalMs = 3e3;\n    this.backoffBaseMs = 1e3;\n    this.maxBackoffMs = 15e3;\n    this.defaultMinRemainingMsToStartAd = 4e3;\n    this.failedVastUrls = /* @__PURE__ */ new Set();\n    this.temporaryFailureUrls = /* @__PURE__ */ new Map();\n    this.temporaryFailureCooldownMs = 3e4;\n    this.globalConsecutiveNoFills = 0;\n    this.globalNoFillThreshold = 3;\n    this.globalNoFillCooldownUntil = 0;\n    this.globalNoFillBackoffBaseMs = 5e3;\n    this.globalNoFillBackoffMaxMs = 6e4;\n    this.globalLastGamRequestTime = 0;\n    this.globalMinGamIntervalMs = 3e3;\n    this.config = config;\n    this.video = video;\n    this.callbacks = callbacks;\n  }\n  get debug() {\n    return !!this.config.debugAdTiming;\n  }\n  // --- Ad stop timer ---\n  scheduleAdStopCountdown(remainingMs) {\n    this.clearAdStopTimer();\n    const ms = Math.max(0, Math.floor(remainingMs));\n    if (ms === 0) {\n      this.ensureAdStoppedByTimer();\n      return;\n    }\n    this.adStopTimerId = window.setTimeout(() => {\n      this.ensureAdStoppedByTimer();\n    }, ms);\n  }\n  clearAdStopTimer() {\n    if (this.adStopTimerId != null) {\n      clearTimeout(this.adStopTimerId);\n      this.adStopTimerId = void 0;\n    }\n  }\n  ensureAdStoppedByTimer() {\n    this.adStopTimerId = void 0;\n    this.callbacks.onAdStopTimerFired();\n  }\n  // --- Ad start timer ---\n  scheduleAdStartIn(delayMs, marker = { type: \"start\" }, cueKey) {\n    this.clearAdStartTimer();\n    const ms = Math.max(0, Math.floor(delayMs));\n    if (ms === 0) {\n      this.callbacks.onAdStartTimerFired(marker, cueKey);\n      return;\n    }\n    this.adStartTimerId = window.setTimeout(() => {\n      this.callbacks.onAdStartTimerFired(marker, cueKey);\n    }, ms);\n  }\n  clearAdStartTimer() {\n    if (this.adStartTimerId != null) {\n      clearTimeout(this.adStartTimerId);\n      this.adStartTimerId = void 0;\n    }\n  }\n  // --- PTS drift ---\n  updatePtsDrift(ptsSecondsSample) {\n    const sampleMs = (this.video.currentTime - ptsSecondsSample) * 1e3;\n    if (!Number.isFinite(sampleMs) || Math.abs(sampleMs) > 6e4) return;\n    const alpha = 0.1;\n    this.ptsDriftEmaMs = this.ptsDriftEmaMs * (1 - alpha) + sampleMs * alpha;\n  }\n  resolveScteBreakStartWallClockMs(marker) {\n    const nowWallClockMs = Date.now();\n    if (typeof marker.ptsSeconds !== \"number\") {\n      return nowWallClockMs;\n    }\n    const nowMs = this.video.currentTime * 1e3;\n    const estimatedCurrentPtsMs = nowMs - this.ptsDriftEmaMs;\n    const deltaMs = marker.ptsSeconds * 1e3 - estimatedCurrentPtsMs;\n    if (!Number.isFinite(deltaMs)) {\n      return nowWallClockMs;\n    }\n    return nowWallClockMs + Math.floor(deltaMs);\n  }\n  // --- Duration boundary ---\n  setAdBreakDurationBoundary(durationMs) {\n    this.expectedAdBreakDurationMs = durationMs;\n    if (durationMs != null && this.currentAdBreakStartWallClockMs != null) {\n      this.scteAdBreakEndWallClockMs = this.currentAdBreakStartWallClockMs + durationMs;\n    } else {\n      this.scteAdBreakEndWallClockMs = void 0;\n    }\n  }\n  scheduleAdStopAtBreakBoundary() {\n    if (this.expectedAdBreakDurationMs == null) {\n      return;\n    }\n    this.scheduleAdStopCountdown(this.getWallClockRemainingAdMs());\n  }\n  // --- Duration budget ---\n  getWallClockRemainingAdMs() {\n    const endWallClockMs = this.getAdBreakEndWallClockMs();\n    if (endWallClockMs != null) {\n      return Math.max(0, endWallClockMs - Date.now());\n    }\n    return 0;\n  }\n  getAdBreakEndWallClockMs() {\n    if (this.scteAdBreakEndWallClockMs != null) {\n      return this.scteAdBreakEndWallClockMs;\n    }\n    if (this.expectedAdBreakDurationMs == null || this.currentAdBreakStartWallClockMs == null) {\n      return void 0;\n    }\n    return this.currentAdBreakStartWallClockMs + this.expectedAdBreakDurationMs;\n  }\n  getDurationBudgetRemainingMs() {\n    if (this.expectedAdBreakDurationMs == null) {\n      return 0;\n    }\n    return Math.max(0, this.expectedAdBreakDurationMs - this.adBreakPlayedDurationMs);\n  }\n  getLoadedAdDurationMs(adController) {\n    const durationSec = adController.getLoadedAdDuration?.();\n    if (durationSec == null || durationSec <= 0) {\n      return 0;\n    }\n    return Math.round(durationSec * 1e3);\n  }\n  adFitsRemainingBudget(durationMs) {\n    if (durationMs <= 0) {\n      return true;\n    }\n    return durationMs <= this.getDurationBudgetRemainingMs();\n  }\n  logAdDurationDecision(accepted, durationMs, adController) {\n    if (!this.debug) {\n      return;\n    }\n    const remainingBudget = this.getDurationBudgetRemainingMs();\n    const adId = adController.getLoadedAdId?.() ?? \"unknown\";\n    if (accepted) {\n      console.log(\n        `[AD-DURATION] Accepted ad id=${adId}, duration=${durationMs}ms, budget remaining after play=${Math.max(0, remainingBudget - durationMs)}ms`\n      );\n    } else {\n      console.log(\n        `[AD-DURATION] Rejected ad id=${adId}, duration=${durationMs}ms exceeds remaining budget=${remainingBudget}ms \\u2014 requesting another ad`\n      );\n    }\n  }\n  recordPlayedAdDuration(adController) {\n    const durationMs = this.getLoadedAdDurationMs(adController);\n    if (durationMs <= 0) {\n      return;\n    }\n    this.adBreakPlayedDurationMs += durationMs;\n    if (this.debug) {\n      console.log(\n        `[AD-DURATION] Played ${durationMs}ms \\u2014 total played=${this.adBreakPlayedDurationMs}ms / ${this.expectedAdBreakDurationMs ?? \"?\"}ms`\n      );\n    }\n  }\n  ensureLoadedAdFitsBudget(adController) {\n    const durationMs = this.getLoadedAdDurationMs(adController);\n    const fits = this.adFitsRemainingBudget(durationMs);\n    this.logAdDurationDecision(fits, durationMs, adController);\n    return fits;\n  }\n  rejectLoadedAdForDuration(adController) {\n    try {\n      adController.destroy();\n    } catch {\n    }\n  }\n  markAdStarted() {\n    this.currentAdIndex++;\n    this.totalAdsInBreak = this.currentAdIndex;\n    this.totalAdRequestsInBreak++;\n    this.lastAdRequestTime = Date.now();\n  }\n  notePodAdStarted() {\n    this.currentAdIndex++;\n    this.totalAdsInBreak = this.currentAdIndex;\n  }\n  getRemainingAdMs() {\n    const wallClockRemaining = this.getWallClockRemainingAdMs();\n    const budgetRemaining = this.getDurationBudgetRemainingMs();\n    if (this.expectedAdBreakDurationMs == null) {\n      return wallClockRemaining;\n    }\n    return Math.min(wallClockRemaining, budgetRemaining);\n  }\n  getMinRemainingMsToStartAd() {\n    const configured = this.config.minRemainingMsToStartAd;\n    if (typeof configured === \"number\" && configured >= 0) {\n      return configured;\n    }\n    return this.defaultMinRemainingMsToStartAd;\n  }\n  hasTimeToStartAnotherAd() {\n    const minRemaining = this.getMinRemainingMsToStartAd();\n    return this.getWallClockRemainingAdMs() > minRemaining && this.getDurationBudgetRemainingMs() > minRemaining;\n  }\n  // --- Circuit breaker ---\n  isTemporaryAdError(error) {\n    const message = error?.message?.toLowerCase() || \"\";\n    if (message.includes(\"no ads available\") || message.includes(\"no fill\") || message.includes(\"nofill\")) {\n      return true;\n    }\n    if (message.includes(\"timeout\")) {\n      return true;\n    }\n    if (message.includes(\"rate limit\") || message.includes(\"too many requests\")) {\n      return true;\n    }\n    if (message.includes(\"ad playback error\")) {\n      return true;\n    }\n    return false;\n  }\n  isUrlInCooldown(vastTagUrl) {\n    const failureTime = this.temporaryFailureUrls.get(vastTagUrl);\n    if (failureTime == null) {\n      return false;\n    }\n    const elapsed = Date.now() - failureTime;\n    if (elapsed >= this.temporaryFailureCooldownMs) {\n      this.temporaryFailureUrls.delete(vastTagUrl);\n      return false;\n    }\n    return true;\n  }\n  cleanupTemporaryFailures() {\n    const now = Date.now();\n    for (const [url, timestamp] of this.temporaryFailureUrls) {\n      if (now - timestamp >= this.temporaryFailureCooldownMs) {\n        this.temporaryFailureUrls.delete(url);\n      }\n    }\n  }\n  isGamInCooldown() {\n    return Date.now() < this.globalNoFillCooldownUntil;\n  }\n  recordGamNoFill() {\n    this.globalConsecutiveNoFills++;\n    if (this.globalConsecutiveNoFills >= this.globalNoFillThreshold) {\n      const exponent = this.globalConsecutiveNoFills - this.globalNoFillThreshold;\n      const backoff = Math.min(\n        this.globalNoFillBackoffBaseMs * Math.pow(2, exponent),\n        this.globalNoFillBackoffMaxMs\n      );\n      this.globalNoFillCooldownUntil = Date.now() + backoff;\n      if (this.debug) {\n        console.log(\n          `[CIRCUIT-BREAKER] GAM cooldown activated: ${backoff}ms (${this.globalConsecutiveNoFills} consecutive no-fills)`\n        );\n      }\n    }\n  }\n  resetGamNoFillCounter() {\n    if (this.globalConsecutiveNoFills > 0 && this.debug) {\n      console.log(\n        `[CIRCUIT-BREAKER] Resetting no-fill counter (was ${this.globalConsecutiveNoFills})`\n      );\n    }\n    this.globalConsecutiveNoFills = 0;\n    this.globalNoFillCooldownUntil = 0;\n  }\n  async enforceGlobalRateLimit() {\n    const now = Date.now();\n    const elapsed = now - this.globalLastGamRequestTime;\n    if (elapsed < this.globalMinGamIntervalMs) {\n      const waitMs = this.globalMinGamIntervalMs - elapsed;\n      if (this.debug) {\n        console.log(`[RATE-LIMIT] Waiting ${waitMs}ms before next GAM request`);\n      }\n      await new Promise((resolve) => setTimeout(resolve, waitMs));\n    }\n    this.globalLastGamRequestTime = Date.now();\n  }\n  // --- Watchdog ---\n  startAdRequestWatchdog(token) {\n    this.clearAdRequestWatchdog();\n    const timeoutMs = this.config.adFailsafeTimeoutMs ?? 1e4;\n    this.adRequestWatchdogToken = token;\n    this.adRequestWatchdogId = window.setTimeout(() => {\n      if (this.adRequestWatchdogToken !== token) {\n        return;\n      }\n      this.adRequestWatchdogId = void 0;\n      this.adRequestWatchdogToken = null;\n      if (this.activeAdRequestToken === token) {\n        this.activeAdRequestToken = null;\n      }\n      this.logAdState(\"ad_request_timeout\", { token, timeoutMs });\n      this.callbacks.onWatchdogTimeout();\n    }, timeoutMs);\n    this.logAdState(\"ad_request_watchdog_started\", { token, timeoutMs });\n  }\n  clearAdRequestWatchdog() {\n    if (this.adRequestWatchdogId != null) {\n      clearTimeout(this.adRequestWatchdogId);\n      this.adRequestWatchdogId = void 0;\n    }\n    if (this.adRequestWatchdogToken != null) {\n      this.logAdState(\"ad_request_watchdog_cleared\", {\n        token: this.adRequestWatchdogToken\n      });\n      this.adRequestWatchdogToken = null;\n    }\n  }\n  // --- Failsafe ---\n  startAdFailsafeTimer(token) {\n    this.clearAdFailsafeTimer();\n    const failsafeMs = this.config.adFailsafeTimeoutMs ?? 1e4;\n    this.adFailsafeToken = token;\n    this.adFailsafeTimerId = window.setTimeout(() => {\n      if (this.adFailsafeToken !== token) {\n        return;\n      }\n      this.adFailsafeTimerId = void 0;\n      this.adFailsafeToken = null;\n      if (this.activeAdRequestToken === token) {\n        this.activeAdRequestToken = null;\n      }\n      this.logAdState(\"ad_failsafe_triggered\", {\n        token,\n        failsafeMs,\n        videoPaused: this.video.paused\n      });\n      this.callbacks.onFailsafeTimeout();\n    }, failsafeMs);\n    this.logAdState(\"ad_failsafe_started\", { token, failsafeMs });\n  }\n  clearAdFailsafeTimer() {\n    if (this.adFailsafeTimerId != null) {\n      clearTimeout(this.adFailsafeTimerId);\n      this.logAdState(\"ad_failsafe_cleared\", { token: this.adFailsafeToken });\n      this.adFailsafeTimerId = void 0;\n    }\n    this.adFailsafeToken = null;\n  }\n  logAdState(event, extra = {}, adPlayer, inAdBreak, showAds) {\n    if (!this.debug) {\n      return;\n    }\n    console.log(\"[StormcloudVideoPlayer][AdState]\", {\n      event,\n      timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n      showAds: showAds ?? false,\n      adPlaying: adPlayer?.isAdPlaying() ?? false,\n      inAdBreak: inAdBreak ?? false,\n      activeAdRequestToken: this.activeAdRequestToken,\n      ...extra\n    });\n  }\n  // --- Reset for ad break end ---\n  resetForBreakEnd() {\n    this.clearAdStopTimer();\n    this.clearAdStartTimer();\n    this.clearAdRequestWatchdog();\n    this.clearAdFailsafeTimer();\n    this.activeAdRequestToken = null;\n    this.expectedAdBreakDurationMs = void 0;\n    this.currentAdBreakStartWallClockMs = void 0;\n    this.scteAdBreakEndWallClockMs = void 0;\n    this.adBreakPlayedDurationMs = 0;\n    this.currentAdIndex = 0;\n    this.totalAdsInBreak = 0;\n    this.consecutiveFailures = 0;\n    this.globalConsecutiveNoFills = 0;\n    this.adBreakEpoch++;\n  }\n  destroy() {\n    this.clearAdStopTimer();\n    this.clearAdStartTimer();\n    this.clearAdFailsafeTimer();\n    this.clearAdRequestWatchdog();\n  }\n};\n\n// src/player/PlaceholderLayer.ts\nvar PlaceholderLayer = class {\n  constructor(video, debug) {\n    this.video = video;\n    this.debug = debug;\n  }\n  ensureContainer() {\n    if (this.container) {\n      return;\n    }\n    const el = document.createElement(\"div\");\n    el.style.position = \"absolute\";\n    el.style.left = \"0\";\n    el.style.top = \"0\";\n    el.style.right = \"0\";\n    el.style.bottom = \"0\";\n    el.style.display = \"none\";\n    el.style.alignItems = \"center\";\n    el.style.justifyContent = \"center\";\n    el.style.pointerEvents = \"none\";\n    el.style.zIndex = \"5\";\n    el.style.backgroundColor = \"#000\";\n    el.style.transition = \"opacity 0.3s ease-in-out\";\n    el.style.opacity = \"0\";\n    if (!this.video.parentElement) {\n      if (this.debug) {\n        console.warn(\"[StormcloudVideoPlayer] Video element has no parent for placeholder container\");\n      }\n      return;\n    }\n    this.video.parentElement.appendChild(el);\n    this.container = el;\n  }\n  show() {\n    this.ensureContainer();\n    if (!this.container) {\n      return;\n    }\n    if (!this.video.muted) {\n      this.video.muted = true;\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Muted video when showing placeholder\");\n      }\n    }\n    const wasHidden = this.container.style.display === \"none\" || this.container.style.opacity === \"0\";\n    if (wasHidden) {\n      this.container.style.transition = \"none\";\n    } else {\n      this.container.style.transition = \"opacity 0.3s ease-in-out\";\n    }\n    this.container.style.backgroundColor = \"#000\";\n    this.container.style.display = \"flex\";\n    this.container.offsetHeight;\n    this.container.style.opacity = \"1\";\n    this.container.style.pointerEvents = \"auto\";\n    if (wasHidden) {\n      requestAnimationFrame(() => {\n        if (this.container) {\n          this.container.style.transition = \"opacity 0.3s ease-in-out\";\n        }\n      });\n    }\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] Showing placeholder layer (between content and ad layer)\");\n    }\n  }\n  hide() {\n    if (!this.container) {\n      return;\n    }\n    this.container.style.opacity = \"0\";\n    setTimeout(() => {\n      if (this.container) {\n        this.container.style.display = \"none\";\n        this.container.style.pointerEvents = \"none\";\n        this.container.style.backgroundColor = \"#000\";\n      }\n    }, 300);\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] Hiding placeholder layer\");\n    }\n  }\n  destroy() {\n    if (this.container) {\n      if (this.container.parentElement) {\n        this.container.parentElement.removeChild(this.container);\n      }\n      this.container = void 0;\n    }\n  }\n};\n\n// src/player/HlsEngine.ts\nvar import_hls2 = __toESM(require(\"hls.js\"), 1);\nvar HlsEngine = class {\n  constructor(config, video, cueManager, timing, callbacks) {\n    this.isLiveStream = false;\n    this.nativeHlsMode = false;\n    this.videoSrcProtection = null;\n    this.bufferedSegmentsCount = 0;\n    this.shouldAutoplayAfterBuffering = false;\n    this.hasInitialBufferCompleted = false;\n    this.config = config;\n    this.video = video;\n    this.cueManager = cueManager;\n    this.timing = timing;\n    this.callbacks = callbacks;\n  }\n  get debug() {\n    return !!this.config.debugAdTiming;\n  }\n  shouldUseNativeHls(getStreamType) {\n    const streamType = getStreamType();\n    if (streamType === \"other\") {\n      return true;\n    }\n    const canNative = this.video.canPlayType(\"application/vnd.apple.mpegurl\");\n    return !!(this.config.allowNativeHls && canNative);\n  }\n  async setupNativeHls() {\n    this.nativeHlsMode = true;\n    this.videoSrcProtection = this.config.src;\n    this.video.src = this.config.src;\n    this.isLiveStream = this.config.isLiveStream ?? (this.config.lowLatencyMode ?? false);\n    if (this.debug) {\n      const adBehavior = this.isLiveStream ? \"live (main video continues muted during ads)\" : \"vod (main video pauses during ads)\";\n      console.log(\n        \"[StormcloudVideoPlayer] Using native HLS playback:\",\n        {\n          isLive: this.isLiveStream,\n          allowNativeHls: this.config.allowNativeHls,\n          adBehavior\n        }\n      );\n    }\n    if (this.config.autoplay) {\n      await this.video.play()?.catch(() => {\n      });\n    }\n  }\n  setupHls() {\n    this.hls = new import_hls2.default({\n      enableWorker: true,\n      backBufferLength: 30,\n      liveDurationInfinity: true,\n      lowLatencyMode: !!this.config.lowLatencyMode,\n      maxLiveSyncPlaybackRate: this.config.lowLatencyMode ? 1.5 : 1,\n      ...this.config.lowLatencyMode ? { liveSyncDuration: 2 } : {},\n      maxBufferLength: 30,\n      maxMaxBufferLength: 600,\n      maxBufferSize: 60 * 1e3 * 1e3,\n      maxBufferHole: 0.5,\n      highBufferWatchdogPeriod: 2,\n      nudgeOffset: 0.1,\n      nudgeMaxRetry: 3,\n      startPosition: -1\n    });\n    this.hls.on(import_hls2.default.Events.MEDIA_ATTACHED, () => {\n      this.hls?.loadSource(this.config.src);\n    });\n    this.hls.on(import_hls2.default.Events.MANIFEST_PARSED, async (_, _data) => {\n      this.isLiveStream = this.config.isLiveStream ?? (this.hls?.levels?.some(\n        (level) => level?.details?.live === true || level?.details?.type === \"LIVE\"\n      ) ?? false);\n      await this.callbacks.onManifestParsed(this.isLiveStream);\n      this.bufferedSegmentsCount = 0;\n      this.hasInitialBufferCompleted = false;\n      this.shouldAutoplayAfterBuffering = !!this.config.autoplay;\n      const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Waiting for\",\n          minSegments,\n          \"segments to buffer before playback\"\n        );\n      }\n      if (minSegments === 0 || !this.config.autoplay) {\n        this.hasInitialBufferCompleted = true;\n        if (this.config.autoplay) {\n          await this.video.play()?.catch(() => {\n          });\n        }\n      }\n    });\n    this.hls.on(import_hls2.default.Events.LEVEL_LOADED, (_evt, data) => {\n      if (this.callbacks.isInAdBreak() || this.callbacks.hasPendingAdBreak()) {\n        return;\n      }\n      const details = data?.details;\n      if (!details || !details.fragments || details.fragments.length === 0) {\n        return;\n      }\n      const fragmentsToScan = Math.min(5, details.fragments.length);\n      for (let i = 0; i < fragmentsToScan; i++) {\n        const frag = details.fragments[i];\n        const tagList = frag?.tagList;\n        if (!Array.isArray(tagList)) continue;\n        for (const entry of tagList) {\n          let tag = \"\";\n          let value = \"\";\n          if (Array.isArray(entry)) {\n            tag = String(entry[0] ?? \"\");\n            value = String(entry[1] ?? \"\");\n          } else if (typeof entry === \"string\") {\n            const idx = entry.indexOf(\":\");\n            if (idx >= 0) {\n              tag = entry.substring(0, idx);\n              value = entry.substring(idx + 1);\n            } else {\n              tag = entry;\n            }\n          }\n          if (!tag) continue;\n          if (tag.includes(\"EXT-X-CUE-OUT\") || tag.includes(\"EXT-X-DATERANGE\")) {\n            const attrs = tag.includes(\"EXT-X-DATERANGE\") ? parseAttributeList(value) : {};\n            const hasScteOut = tag.includes(\"EXT-X-CUE-OUT\") || \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== void 0;\n            if (hasScteOut) {\n              const durationSeconds = parseCueOutDuration(value);\n              const marker = {\n                type: \"start\",\n                ...durationSeconds !== void 0 ? { durationSeconds } : {},\n                raw: { tag, value, earlyDetection: true }\n              };\n              if (this.debug) {\n                console.log(\"[StormcloudVideoPlayer] EARLY SCTE-35 DETECTION: Ad break marker found in fragment\", i, \"- starting pre-fetch (NOT playing yet)\");\n              }\n              this.callbacks.onScte35Cue(marker, {\n                ...this.cueManager.createScte35CueContext(\"manifest\", \"early\", frag)\n              });\n              return;\n            }\n          }\n        }\n      }\n    });\n    this.hls.on(import_hls2.default.Events.FRAG_BUFFERED, async (_evt, _data) => {\n      if (this.hasInitialBufferCompleted) {\n        return;\n      }\n      this.bufferedSegmentsCount++;\n      const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n      if (this.debug) {\n        console.log(\n          `[StormcloudVideoPlayer] Buffered segment ${this.bufferedSegmentsCount}/${minSegments}`\n        );\n      }\n      if (this.bufferedSegmentsCount >= minSegments) {\n        this.hasInitialBufferCompleted = true;\n        if (this.shouldAutoplayAfterBuffering) {\n          if (this.debug) {\n            console.log(\n              `[StormcloudVideoPlayer] Initial buffer complete (${this.bufferedSegmentsCount} segments). Starting playback.`\n            );\n          }\n          await this.video.play()?.catch((err) => {\n            if (this.debug) {\n              console.warn(\"[StormcloudVideoPlayer] Autoplay failed:\", err);\n            }\n          });\n        }\n      }\n    });\n    this.hls.on(import_hls2.default.Events.FRAG_PARSING_METADATA, (_evt, data) => {\n      const id3Tags = (data?.samples || []).map((s) => ({\n        key: \"ID3\",\n        value: s?.data,\n        ptsSeconds: s?.pts\n      }));\n      id3Tags.forEach((tag) => this.onId3Tag(tag));\n    });\n    this.hls.on(import_hls2.default.Events.FRAG_LOADED, (_evt, data) => {\n      this.processFragmentScte35Payload(\n        data?.payload,\n        typeof data?.frag?.sn === \"number\" ? data.frag.sn : void 0,\n        getFragmentStartSeconds(data?.frag)\n      );\n    });\n    this.hls.on(import_hls2.default.Events.FRAG_DECRYPTED, (_evt, data) => {\n      this.processFragmentScte35Payload(\n        data?.payload,\n        typeof data?.frag?.sn === \"number\" ? data.frag.sn : void 0,\n        getFragmentStartSeconds(data?.frag)\n      );\n    });\n    this.hls.on(import_hls2.default.Events.FRAG_CHANGED, (_evt, data) => {\n      const frag = data?.frag;\n      const tagList = frag?.tagList;\n      if (!Array.isArray(tagList)) {\n        this.callbacks.activatePendingCuesForFragment(frag);\n        return;\n      }\n      for (const entry of tagList) {\n        let tag = \"\";\n        let value = \"\";\n        if (Array.isArray(entry)) {\n          tag = String(entry[0] ?? \"\");\n          value = String(entry[1] ?? \"\");\n        } else if (typeof entry === \"string\") {\n          const idx = entry.indexOf(\":\");\n          if (idx >= 0) {\n            tag = entry.substring(0, idx);\n            value = entry.substring(idx + 1);\n          } else {\n            tag = entry;\n            value = \"\";\n          }\n        }\n        if (!tag) continue;\n        if (tag.includes(\"EXT-X-CUE-OUT-CONT\")) {\n          const prog = parseCueOutCont(value);\n          const marker = {\n            type: \"progress\",\n            ...prog?.duration !== void 0 ? { durationSeconds: prog.duration } : {},\n            ...prog?.elapsed !== void 0 ? { ptsSeconds: prog.elapsed } : {},\n            raw: { tag, value }\n          };\n          this.callbacks.onScte35Cue(marker, {\n            ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n          });\n        } else if (tag.includes(\"EXT-X-CUE-OUT\")) {\n          const durationSeconds = parseCueOutDuration(value);\n          const marker = {\n            type: \"start\",\n            ...durationSeconds !== void 0 ? { durationSeconds } : {},\n            raw: { tag, value }\n          };\n          this.callbacks.onScte35Cue(marker, {\n            ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n          });\n        } else if (tag.includes(\"EXT-X-CUE-IN\")) {\n          this.callbacks.onScte35Cue(\n            { type: \"end\", raw: { tag, value } },\n            {\n              ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n            }\n          );\n        } else if (tag.includes(\"EXT-X-DATERANGE\")) {\n          const attrs = parseAttributeList(value);\n          const hasScteOut = \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== void 0;\n          const hasScteIn = \"SCTE35-IN\" in attrs || attrs[\"SCTE35-IN\"] !== void 0;\n          const klass = String(attrs[\"CLASS\"] ?? \"\");\n          const duration = toNumber(attrs[\"DURATION\"]);\n          if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n            const marker = {\n              type: \"start\",\n              ...duration !== void 0 ? { durationSeconds: duration } : {},\n              raw: { tag, value, attrs }\n            };\n            this.callbacks.onScte35Cue(marker, {\n              ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n            });\n          }\n          if (hasScteIn) {\n            this.callbacks.onScte35Cue(\n              { type: \"end\", raw: { tag, value, attrs } },\n              {\n                ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n              }\n            );\n          }\n        }\n      }\n      this.callbacks.activatePendingCuesForFragment(frag);\n    });\n    this.hls.on(import_hls2.default.Events.ERROR, (_evt, data) => {\n      if (data?.fatal) {\n        switch (data.type) {\n          case import_hls2.default.ErrorTypes.NETWORK_ERROR:\n            this.hls?.startLoad();\n            break;\n          case import_hls2.default.ErrorTypes.MEDIA_ERROR:\n            this.hls?.recoverMediaError();\n            break;\n          default:\n            this.callbacks.onFatalDestroy();\n            break;\n        }\n      }\n    });\n    this.hls.attachMedia(this.video);\n  }\n  onId3Tag(tag) {\n    if (typeof tag.ptsSeconds === \"number\") {\n      this.timing.updatePtsDrift(tag.ptsSeconds);\n    }\n    const marker = parseScte35FromId3(tag);\n    if (marker) {\n      this.callbacks.onScte35Cue(marker, {\n        source: \"id3\",\n        readiness: \"playback\"\n      });\n    }\n  }\n  processFragmentScte35Payload(payloadData, fragmentSn, fragmentStartSeconds) {\n    const payload = normalizeFragmentPayload(payloadData);\n    if (!payload) {\n      return;\n    }\n    const markers = parseScte35FromTsPackets(\n      payload,\n      this.cueManager.tsScte35Pids,\n      this.cueManager.pmtPids,\n      this.cueManager.processedTsScte35Sections\n    );\n    markers.forEach((marker) => {\n      const context = {\n        source: \"ts\",\n        readiness: \"early\"\n      };\n      if (fragmentSn !== void 0) {\n        context.fragmentSn = fragmentSn;\n      }\n      if (fragmentStartSeconds !== void 0) {\n        context.fragmentStartSeconds = fragmentStartSeconds;\n      }\n      this.callbacks.onScte35Cue(marker, context);\n    });\n  }\n  getLiveSyncPosition() {\n    const pos = this.hls?.liveSyncPosition;\n    return typeof pos === \"number\" && Number.isFinite(pos) ? pos : void 0;\n  }\n  destroy() {\n    this.hls?.destroy();\n    this.hls = void 0;\n  }\n};\n\n// src/player/PlayerControls.ts\nfunction getAdAudioVolume(adPlayer) {\n  return adPlayer.getOriginalMutedState() ? 0 : adPlayer.getOriginalVolume();\n}\nfunction toggleMute(video, adPlayer, debug) {\n  if (adPlayer.isAdPlaying()) {\n    const newMutedState = !adPlayer.getOriginalMutedState();\n    const restoreVolume = adPlayer.getOriginalVolume() || 1;\n    adPlayer.updateOriginalMutedState(newMutedState, video.volume);\n    adPlayer.setAdVolume(newMutedState ? 0 : restoreVolume);\n    if (debug) {\n      console.log(\n        \"[StormcloudVideoPlayer] Mute toggle during ad - immediately applied:\",\n        newMutedState\n      );\n    }\n  } else {\n    video.muted = !video.muted;\n    adPlayer.updateOriginalMutedState(video.muted, video.volume);\n    if (debug) {\n      console.log(\"[StormcloudVideoPlayer] Muted:\", video.muted);\n    }\n  }\n}\nfunction toggleFullscreen(video, debug) {\n  return new Promise((resolve, reject) => {\n    if (!document.fullscreenElement) {\n      const container = video.parentElement;\n      if (!container) {\n        reject(new Error(\"No parent container found for fullscreen\"));\n        return;\n      }\n      container.requestFullscreen().then(() => {\n        if (debug) {\n          console.log(\"[StormcloudVideoPlayer] Entered fullscreen\");\n        }\n        resolve();\n      }).catch((err) => {\n        if (debug) {\n          console.error(\"[StormcloudVideoPlayer] Fullscreen error:\", err);\n        }\n        reject(err);\n      });\n    } else {\n      document.exitFullscreen().then(() => {\n        if (debug) {\n          console.log(\"[StormcloudVideoPlayer] Exited fullscreen\");\n        }\n        resolve();\n      }).catch((err) => {\n        if (debug) {\n          console.error(\n            \"[StormcloudVideoPlayer] Exit fullscreen error:\",\n            err\n          );\n        }\n        reject(err);\n      });\n    }\n  });\n}\nfunction isMuted(video, adPlayer) {\n  if (adPlayer.isAdPlaying()) {\n    return adPlayer.getOriginalMutedState();\n  }\n  return video.muted;\n}\nfunction setMuted(video, adPlayer, muted, debug) {\n  const adPlaying = adPlayer.isAdPlaying();\n  if (adPlaying && muted === video.muted) {\n    if (debug) {\n      console.log(\n        \"[StormcloudVideoPlayer] setMuted reflective update during ad ignored\",\n        { muted }\n      );\n    }\n    return;\n  }\n  video.muted = muted;\n  if (adPlaying) {\n    adPlayer.updateOriginalMutedState(muted, video.volume);\n    adPlayer.setAdVolume(muted ? 0 : 1);\n    if (debug) {\n      console.log(\"[StormcloudVideoPlayer] setMuted applied during ad\", {\n        muted\n      });\n    }\n    return;\n  }\n  adPlayer.updateOriginalMutedState(muted, video.volume);\n  if (debug) {\n    console.log(\"[StormcloudVideoPlayer] setMuted called:\", muted);\n  }\n}\nfunction setVolume(video, adPlayer, volume, debug) {\n  const clampedVolume = Math.max(0, Math.min(1, volume));\n  const adPlaying = adPlayer.isAdPlaying();\n  if (adPlaying) {\n    adPlayer.setAdVolume(clampedVolume);\n    adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n    if (debug) {\n      console.log(\"[StormcloudVideoPlayer] setVolume applied during ad\", {\n        volume: clampedVolume\n      });\n    }\n  } else {\n    video.volume = clampedVolume;\n    video.muted = clampedVolume === 0;\n    adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n    if (debug) {\n      console.log(\"[StormcloudVideoPlayer] setVolume called:\", clampedVolume);\n    }\n  }\n}\nfunction getVolume(video, adPlayer) {\n  const adPlaying = adPlayer.isAdPlaying();\n  if (adPlaying) {\n    return adPlayer.getAdVolume();\n  }\n  return video.volume;\n}\nfunction isFullscreen() {\n  return !!document.fullscreenElement;\n}\nfunction resizePlayer(video, adPlayer, debug) {\n  if (debug) {\n    console.log(\"[StormcloudVideoPlayer] Resizing player\");\n  }\n  if (adPlayer && adPlayer.isAdPlaying()) {\n    const width = video.clientWidth || 640;\n    const height = video.clientHeight || 480;\n    if (debug) {\n      console.log(\n        `[StormcloudVideoPlayer] Resizing ads manager to ${width}x${height}`\n      );\n    }\n    adPlayer.resize(width, height);\n  }\n}\n\n// src/player/AdBreakOrchestrator.ts\nvar AdBreakOrchestrator = class {\n  constructor(host, timing, adConfig, cueManager, placeholder) {\n    this.inAdBreak = false;\n    this.showAds = false;\n    this.isShowingPlaceholder = false;\n    this.adDetectSentForCurrentBreak = false;\n    this.continuousFetchingActive = false;\n    this.continuousFetchLoopRunning = false;\n    this.adRequestQueue = [];\n    this.adPodQueue = [];\n    this.maxPlaceholderDurationMs = 5e3;\n    this.pendingAdBreak = null;\n    this.host = host;\n    this.timing = timing;\n    this.adConfig = adConfig;\n    this.cueManager = cueManager;\n    this.placeholder = placeholder;\n  }\n  get debug() {\n    return !!this.host.config.debugAdTiming;\n  }\n  get analyticsContext() {\n    return buildAnalyticsContext(this.host.config);\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  IMA event listeners\n  // ───────────────────────────────────────────────────────────────\n  /**\n   * Produces the next pod ad-request URL for the current break. Every request\n   * (initial and continuous-fetch top-up) carries pod macros (pmad/pmnd/pmxd,\n   * no ppos); pmxd tracks the remaining break time so top-up pods only ask for\n   * what still fits.\n   */\n  nextAdRequestUrl(baseVastUrl) {\n    const remaining = Math.min(\n      this.timing.getWallClockRemainingAdMs(),\n      this.timing.getDurationBudgetRemainingMs()\n    );\n    const breakDurationMs = remaining > 0 ? remaining : void 0;\n    return this.host.generatePodVastUrl(baseVastUrl, breakDurationMs);\n  }\n  attachImaEventListeners() {\n    const adPlayer = this.host.getAdPlayer();\n    adPlayer.on(\"pod_ad_started\", (payload) => {\n      this.timing.notePodAdStarted();\n      if (this.debug) {\n        console.log(\n          `[POD] Playing pod ad ${payload?.index != null ? payload.index + 1 : \"?\"}/${payload?.total ?? \"?\"}`\n        );\n      }\n    });\n    adPlayer.on(\"all_ads_completed\", () => {\n      sendAdImpressionTracking(\n        this.host.config.licenseKey,\n        { source: \"hls\", adIndex: this.timing.currentAdIndex, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n        this.analyticsContext\n      ).catch(() => {\n      });\n      this.timing.recordPlayedAdDuration(this.host.getAdPlayer());\n      const remaining = this.timing.getRemainingAdMs();\n      this.timing.consecutiveFailures = 0;\n      if (this.debug) {\n        console.log(\n          `[StormcloudVideoPlayer] all_ads_completed event received - remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}`,\n          this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n        );\n      }\n      if (this.inAdBreak) {\n        if (this.timing.hasTimeToStartAnotherAd()) {\n          this.tryNextAvailableAdWithRateLimit();\n        } else {\n          this.handleAdPodComplete();\n        }\n      }\n    });\n    adPlayer.on(\"ad_error\", (errorPayload) => {\n      let errorMessage = \"Ad playback failed\";\n      if (errorPayload) {\n        const errorCode = errorPayload.code || errorPayload.errorCode || \"unknown\";\n        const vastErrorCode = errorPayload.vastErrorCode;\n        const message = errorPayload.message || errorPayload.errorMessage || \"Unknown error\";\n        const cause = errorPayload.cause || errorPayload.innerError || errorPayload.error;\n        errorMessage = `Ad error: AdError ${errorCode}: ${message}`;\n        if (vastErrorCode && vastErrorCode !== \"N/A\" && vastErrorCode !== errorCode) {\n          errorMessage += ` (VAST Error Code: ${vastErrorCode})`;\n        }\n        if (cause) {\n          const causeMessage = typeof cause === \"string\" ? cause : cause.message || String(cause);\n          errorMessage += `. Caused by: ${causeMessage}`;\n        }\n      }\n      console.error(\"[AD-ERROR]\", errorMessage, errorPayload || \"\");\n      this.handleAdFailure();\n    });\n    adPlayer.on(\"content_pause\", () => {\n      this.timing.clearAdFailsafeTimer();\n      this.timing.clearAdRequestWatchdog();\n      this.timing.activeAdRequestToken = null;\n      this.showAds = true;\n      this.timing.resetGamNoFillCounter();\n      if (this.inAdBreak && this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n        this.timing.scheduleAdStopAtBreakBoundary();\n        if (this.debug) {\n          console.log(\"[StormcloudVideoPlayer] Starting ad break timer on content_pause (first ad starting)\");\n        }\n      }\n      this.host.getAdPlayer().setAdVolume(getAdAudioVolume(this.host.getAdPlayer()));\n      if (this.isShowingPlaceholder) {\n        if (this.debug) {\n          console.log(\"[StormcloudVideoPlayer] Hiding placeholder - new ads starting\");\n        }\n        this.host.getAdPlayer().hidePlaceholder();\n        this.isShowingPlaceholder = false;\n      }\n    });\n    adPlayer.on(\"content_resume\", () => {\n      sendAdImpressionTracking(\n        this.host.config.licenseKey,\n        { source: \"hls\", adIndex: this.timing.currentAdIndex, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n        this.analyticsContext\n      ).catch(() => {\n      });\n      if (!this.host.video.muted) {\n        this.host.video.muted = true;\n        if (this.debug) {\n          console.log(\"[StormcloudVideoPlayer] Muted video on content_resume (ad ended, gap between ads)\");\n        }\n      }\n      this.timing.clearAdFailsafeTimer();\n      this.timing.clearAdRequestWatchdog();\n      this.timing.activeAdRequestToken = null;\n      this.showAds = false;\n      if (!this.inAdBreak) {\n        return;\n      }\n      this.timing.consecutiveFailures = 0;\n      this.timing.recordPlayedAdDuration(this.host.getAdPlayer());\n      const remaining = this.timing.getRemainingAdMs();\n      if (this.debug) {\n        console.log(\n          `[CONTINUOUS-FETCH] content_resume event: remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}`,\n          this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n        );\n      }\n      if (this.timing.hasTimeToStartAnotherAd()) {\n        this.tryNextAvailableAdWithRateLimit();\n      } else {\n        this.handleAdPodComplete();\n      }\n    });\n  }\n  recreateAdController() {\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] Recreating AdController for new ad\");\n    }\n    const shouldShowPlaceholder = this.inAdBreak && this.showAds;\n    const adPlayer = this.host.getAdPlayer();\n    if (shouldShowPlaceholder && adPlayer) {\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Showing placeholder before destroying old AdController\");\n      }\n      this.placeholder.show();\n      adPlayer.showPlaceholder();\n      this.isShowingPlaceholder = true;\n    }\n    const preservedMutedState = adPlayer.getOriginalMutedState();\n    const preservedVolumeState = adPlayer.getOriginalVolume();\n    if (adPlayer) {\n      try {\n        adPlayer.destroy();\n        this.host.video.muted = true;\n      } catch (error) {\n        if (this.debug) {\n          console.warn(\"[StormcloudVideoPlayer] Error destroying old AdController:\", error);\n        }\n      }\n    }\n    const continueLiveStreamDuringAds = this.host.shouldContinueLiveStreamDuringAds();\n    const newAdPlayer = this.host.createAdPlayer(continueLiveStreamDuringAds);\n    this.host.setAdPlayer(newAdPlayer);\n    newAdPlayer.initialize();\n    newAdPlayer.updateOriginalMutedState(preservedMutedState, preservedVolumeState);\n    this.attachImaEventListeners();\n    if (shouldShowPlaceholder) {\n      this.placeholder.show();\n      newAdPlayer.showPlaceholder();\n      this.isShowingPlaceholder = true;\n    }\n  }\n  clearPendingAdBreak() {\n    if (this.prefetchTimerId != null) {\n      clearTimeout(this.prefetchTimerId);\n      this.prefetchTimerId = void 0;\n    }\n    this.pendingAdBreak = null;\n    this.cueManager.pendingScte35CueKey = void 0;\n    this.adConfig.podAssignedByPrefetch = false;\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Ad break start\n  // ───────────────────────────────────────────────────────────────\n  async handleAdStart(_marker) {\n    const scheduled = this.adConfig.findCurrentOrNextBreak(\n      this.host.video.currentTime * 1e3\n    );\n    if (scheduled) {\n      this.adConfig.consumedVmapBreakIds.add(this.adConfig.getAdBreakKey(scheduled));\n    }\n    const tags = this.adConfig.selectVastTagsForBreak(scheduled);\n    let baseVastUrl;\n    if (tags && tags.length > 0 && tags[0]) {\n      baseVastUrl = tags[0];\n    } else if (this.adConfig.apiVastTagUrl) {\n      baseVastUrl = this.adConfig.apiVastTagUrl;\n    } else {\n      this.clearPendingAdBreak();\n      return;\n    }\n    const adBreakDurationMs = _marker.durationSeconds != null ? _marker.durationSeconds * 1e3 : scheduled?.durationMs;\n    if (this.debug) {\n      const mode = this.host.config.isLiveStream ? \"LIVE\" : \"VOD\";\n      console.log(\n        `[CONTINUOUS-FETCH] ${mode} MODE: Target duration=${adBreakDurationMs}ms`\n      );\n    }\n    this.timing.failedVastUrls.clear();\n    this.timing.temporaryFailureUrls.clear();\n    this.timing.consecutiveFailures = 0;\n    this.continuousFetchingActive = true;\n    this.isShowingPlaceholder = false;\n    this.timing.totalAdRequestsInBreak = 0;\n    if (this.adConfig.podAssignedByPrefetch) {\n      this.adConfig.podAssignedByPrefetch = false;\n    } else {\n      this.adConfig.beginNewAdPod();\n    }\n    const currentMuted = this.host.video.muted;\n    const currentVolume = this.host.video.volume;\n    this.host.getAdPlayer().updateOriginalMutedState(currentMuted, currentVolume);\n    this.inAdBreak = true;\n    this.timing.adBreakPlayedDurationMs = 0;\n    this.timing.currentAdIndex = 0;\n    this.timing.totalAdsInBreak = 0;\n    this.adPodQueue = [];\n    this.showAds = false;\n    if (this.timing.expectedAdBreakDurationMs == null && adBreakDurationMs != null) {\n      this.timing.expectedAdBreakDurationMs = adBreakDurationMs;\n    }\n    const podPlayed = await this.startOptimizedPod(\n      baseVastUrl,\n      adBreakDurationMs,\n      currentMuted,\n      currentVolume\n    );\n    if (!podPlayed) {\n      if (this.debug) {\n        console.log(\"[POD] Initial pod request did not fill; attempting top-up pod request\");\n      }\n      this.continuousFetchingActive = true;\n      this.startContinuousFetching(baseVastUrl);\n      await this.tryNextAvailableAdWithRateLimit();\n    }\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Optimized pod (single multi-ad request)\n  // ───────────────────────────────────────────────────────────────\n  async startOptimizedPod(baseVastUrl, breakDurationMs, currentMuted, currentVolume) {\n    let podUrl;\n    if (this.pendingAdBreak && this.pendingAdBreak.vastUrls.length > 0) {\n      podUrl = this.pendingAdBreak.vastUrls[0];\n      this.clearPendingAdBreak();\n    } else {\n      podUrl = this.host.generatePodVastUrl(baseVastUrl, breakDurationMs);\n    }\n    if (!podUrl) {\n      return false;\n    }\n    this.continuousFetchingActive = false;\n    this.recreateAdController();\n    const adPlayer = this.host.getAdPlayer();\n    const requestToken = ++this.timing.adRequestTokenCounter;\n    this.timing.activeAdRequestToken = requestToken;\n    this.timing.startAdRequestWatchdog(requestToken);\n    try {\n      await this.timing.enforceGlobalRateLimit();\n      this.timing.lastAdRequestTime = Date.now();\n      await adPlayer.requestAds(podUrl);\n      this.timing.clearAdRequestWatchdog();\n      if (this.timing.activeAdRequestToken !== requestToken) {\n        return true;\n      }\n      const podCount = adPlayer.getPodAdCount?.() ?? 1;\n      if (podCount < 1) {\n        return false;\n      }\n      if (this.debug) {\n        console.log(\n          podCount === 1 ? \"[POD] Response contained a single ad; playing it and enabling pod top-up\" : `[POD] Optimized pod returned ${podCount} ads; playing pod in one controller`\n        );\n      }\n      sendAdLoadedTracking(\n        this.host.config.licenseKey,\n        { source: \"hls\", vastUrl: podUrl, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n        this.analyticsContext\n      ).catch(() => {\n      });\n      this.timing.startAdFailsafeTimer(requestToken);\n      await adPlayer.play();\n      this.timing.markAdStarted();\n      if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n        this.timing.scheduleAdStopAtBreakBoundary();\n      }\n      adPlayer.setAdVolume(currentMuted ? 0 : currentVolume);\n      this.timing.consecutiveFailures = 0;\n      this.continuousFetchingActive = true;\n      this.startContinuousFetching(baseVastUrl);\n      return true;\n    } catch (error) {\n      this.timing.clearAdRequestWatchdog();\n      this.timing.clearAdFailsafeTimer();\n      if (this.timing.activeAdRequestToken === requestToken) {\n        this.timing.activeAdRequestToken = null;\n      }\n      if (this.debug) {\n        console.warn(\"[POD] Optimized pod request/play failed:\", error);\n      }\n      if (this.timing.isTemporaryAdError(error)) {\n        this.timing.temporaryFailureUrls.set(podUrl, Date.now());\n      }\n      this.continuousFetchingActive = true;\n      this.recreateAdController();\n      return false;\n    }\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Continuous fetching\n  // ───────────────────────────────────────────────────────────────\n  startContinuousFetching(baseVastUrl) {\n    if (!this.continuousFetchingActive) {\n      return;\n    }\n    if (this.continuousFetchLoopRunning) {\n      if (this.debug) {\n        console.log(\"[CONTINUOUS-FETCH] Fetch loop already running, skipping duplicate start\");\n      }\n      return;\n    }\n    if (this.debug) {\n      console.log(\"[CONTINUOUS-FETCH] Starting continuous ad fetching loop\");\n    }\n    this.continuousFetchLoopRunning = true;\n    this.continuousFetchLoop(baseVastUrl);\n  }\n  async continuousFetchLoop(baseVastUrl) {\n    const epoch = this.timing.adBreakEpoch;\n    while (this.continuousFetchingActive && this.inAdBreak && epoch === this.timing.adBreakEpoch) {\n      const remaining = Math.min(\n        this.timing.getWallClockRemainingAdMs(),\n        this.timing.getDurationBudgetRemainingMs()\n      );\n      if (remaining <= this.timing.getMinRemainingMsToStartAd()) {\n        if (this.debug) {\n          console.log(`[CONTINUOUS-FETCH] Not enough ad break time left (wall=${this.timing.getWallClockRemainingAdMs()}ms, budget=${this.timing.getDurationBudgetRemainingMs()}ms), stopping URL generation`);\n        }\n        break;\n      }\n      if (this.timing.isGamInCooldown()) {\n        if (this.debug) {\n          console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, stopping URL generation\");\n        }\n        break;\n      }\n      if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n        if (this.debug) {\n          console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), stopping URL generation`);\n        }\n        break;\n      }\n      if (this.timing.totalAdRequestsInBreak >= this.timing.maxTotalAdRequestsPerBreak) {\n        if (this.debug) {\n          console.log(`[CONTINUOUS-FETCH] Maximum ad requests reached (${this.timing.maxTotalAdRequestsPerBreak}), stopping`);\n        }\n        break;\n      }\n      const maxQueueSize = 5;\n      if (this.adRequestQueue.length >= maxQueueSize) {\n        if (this.debug) {\n          console.log(`[CONTINUOUS-FETCH] URL queue full (${this.adRequestQueue.length}), waiting...`);\n        }\n        await new Promise((resolve) => setTimeout(resolve, 1e3));\n        continue;\n      }\n      const newAdUrl = this.nextAdRequestUrl(baseVastUrl);\n      if (!newAdUrl || this.timing.failedVastUrls.has(newAdUrl) || this.timing.isUrlInCooldown(newAdUrl)) {\n        await new Promise((resolve) => setTimeout(resolve, 500));\n        continue;\n      }\n      if (this.debug) {\n        const queuedUrlsPreview = [...this.adRequestQueue, newAdUrl];\n        console.log(\n          `[CONTINUOUS-FETCH] Queued VAST URL (queue size: ${queuedUrlsPreview.length})`,\n          { queuedUrls: queuedUrlsPreview }\n        );\n      }\n      this.adRequestQueue.push(newAdUrl);\n      const generationDelay = this.timing.consecutiveFailures > 0 ? Math.min(1e3 * Math.pow(2, this.timing.consecutiveFailures), 5e3) : 500;\n      await new Promise((resolve) => setTimeout(resolve, generationDelay));\n    }\n    this.continuousFetchLoopRunning = false;\n    if (this.debug) {\n      console.log(\n        `[CONTINUOUS-FETCH] URL generation loop ended (queued: ${this.adRequestQueue.length})`,\n        this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n      );\n    }\n  }\n  stopContinuousFetching() {\n    this.continuousFetchingActive = false;\n    this.continuousFetchLoopRunning = false;\n    this.placeholder.hide();\n    if (this.debug) {\n      console.log(\"[CONTINUOUS-FETCH] Stopping continuous ad fetching\");\n    }\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Ad iteration\n  // ───────────────────────────────────────────────────────────────\n  async tryNextAvailableAdWithRateLimit() {\n    if (!this.inAdBreak) {\n      return;\n    }\n    const epoch = this.timing.adBreakEpoch;\n    if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n      if (this.debug) {\n        console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), ending ad break gracefully`);\n      }\n      this.handleAdPodComplete();\n      return;\n    }\n    const backoffMultiplier = Math.pow(2, this.timing.consecutiveFailures);\n    const backoffDelay = Math.min(this.timing.backoffBaseMs * backoffMultiplier, this.timing.maxBackoffMs);\n    const effectiveMinInterval = this.timing.minAdRequestIntervalMs + (this.timing.consecutiveFailures > 0 ? backoffDelay : 0);\n    const timeSinceLastRequest = Date.now() - this.timing.lastAdRequestTime;\n    if (timeSinceLastRequest < effectiveMinInterval) {\n      const waitTime = effectiveMinInterval - timeSinceLastRequest;\n      if (this.debug) {\n        console.log(`[CONTINUOUS-FETCH] Rate limiting: waiting ${waitTime}ms before next request (backoff: ${this.timing.consecutiveFailures} failures)`);\n      }\n      await new Promise((resolve) => setTimeout(resolve, waitTime));\n    }\n    if (!this.inAdBreak || epoch !== this.timing.adBreakEpoch) {\n      return;\n    }\n    return this.tryNextAvailableAd(0);\n  }\n  async tryNextAvailableAd(retryCount = 0) {\n    if (!this.inAdBreak) {\n      return;\n    }\n    const remaining = this.timing.getRemainingAdMs();\n    if (!this.timing.hasTimeToStartAnotherAd()) {\n      if (this.debug) {\n        console.log(`[CONTINUOUS-FETCH] Not enough time remaining (${remaining}ms) to start another ad, ending ad break`);\n      }\n      this.handleAdPodComplete();\n      return;\n    }\n    if (this.timing.isGamInCooldown()) {\n      if (this.debug) {\n        console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, ending ad break gracefully\");\n      }\n      this.handleAdPodComplete();\n      return;\n    }\n    if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n      if (this.debug) {\n        console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), ending ad break`);\n      }\n      this.handleAdPodComplete();\n      return;\n    }\n    this.timing.cleanupTemporaryFailures();\n    while (this.adRequestQueue.length > 0) {\n      const nextAdUrl = this.adRequestQueue.shift();\n      if (!nextAdUrl) continue;\n      if (this.timing.failedVastUrls.has(nextAdUrl)) {\n        if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping permanently-failed URL, trying next...\");\n        continue;\n      }\n      if (this.timing.isUrlInCooldown(nextAdUrl)) {\n        if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping URL in cooldown (recent no-fill), trying next...\");\n        continue;\n      }\n      if (this.debug) {\n        console.log(`[CONTINUOUS-FETCH] Requesting next ad via HLS ad player (${this.timing.currentAdIndex + 1}, ${this.adRequestQueue.length} remaining in queue)`);\n      }\n      try {\n        await this.playSingleAd(nextAdUrl);\n        this.timing.consecutiveFailures = 0;\n      } catch (error) {\n        const errorMessage = error.message;\n        if (this.debug) console.log(\"[CONTINUOUS-FETCH] Ad request failed:\", errorMessage);\n        if (errorMessage.includes(\"ad_duration_exceeds_budget\")) {\n          await this.tryNextAvailableAdWithRateLimit();\n          return;\n        }\n        if (!errorMessage.includes(\"permanently failed\") && !errorMessage.includes(\"in cooldown\")) {\n          this.timing.consecutiveFailures++;\n        }\n        await this.tryNextAvailableAdWithRateLimit();\n      }\n      return;\n    }\n    const maxRetries = 3;\n    if (this.continuousFetchingActive && retryCount < maxRetries && remaining > 2e3) {\n      if (this.debug) {\n        console.log(`[CONTINUOUS-FETCH] Queue empty, waiting for URLs... (${retryCount + 1}/${maxRetries})`);\n      }\n      await new Promise((resolve) => setTimeout(resolve, 500));\n      await this.tryNextAvailableAd(retryCount + 1);\n      return;\n    }\n    if (!this.isShowingPlaceholder && remaining > 1e3) {\n      this.showPlaceholderAndWaitForAds();\n    } else {\n      if (this.debug) console.log(\"[CONTINUOUS-FETCH] No more ads available, ending ad break\");\n      this.handleAdPodComplete();\n    }\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Single ad playback\n  // ───────────────────────────────────────────────────────────────\n  async playSingleAd(vastTagUrl) {\n    const adPlayer = this.host.getAdPlayer();\n    if (adPlayer.isAdPlaying()) return;\n    if (this.timing.failedVastUrls.has(vastTagUrl)) {\n      if (this.debug) console.warn(\"[AD-ERROR] Skipping permanently-failed VAST URL:\", vastTagUrl);\n      throw new Error(\"VAST URL permanently failed\");\n    }\n    if (this.timing.isUrlInCooldown(vastTagUrl)) {\n      if (this.debug) console.warn(\"[AD-ERROR] Skipping URL in cooldown (recent no-fill):\", vastTagUrl);\n      throw new Error(\"VAST URL in cooldown after no-fill\");\n    }\n    if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n      if (this.debug) console.warn(\"[AD-ERROR] Too many consecutive failures, not requesting more ads\");\n      throw new Error(\"Too many consecutive failures\");\n    }\n    if (this.timing.isGamInCooldown()) {\n      if (this.debug) console.warn(\"[CIRCUIT-BREAKER] GAM in cooldown, skipping ad request\");\n      throw new Error(\"GAM in cooldown\");\n    }\n    this.recreateAdController();\n    const requestToken = ++this.timing.adRequestTokenCounter;\n    this.timing.activeAdRequestToken = requestToken;\n    this.timing.startAdRequestWatchdog(requestToken);\n    try {\n      await this.timing.enforceGlobalRateLimit();\n      this.timing.lastAdRequestTime = Date.now();\n      const ap = this.host.getAdPlayer();\n      await ap.requestAds(vastTagUrl);\n      sendAdLoadedTracking(\n        this.host.config.licenseKey,\n        { source: \"hls\", vastUrl: vastTagUrl, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n        this.analyticsContext\n      ).catch(() => {\n      });\n      this.timing.clearAdRequestWatchdog();\n      if (this.timing.activeAdRequestToken !== requestToken) return;\n      if (!this.timing.ensureLoadedAdFitsBudget(ap)) {\n        this.timing.rejectLoadedAdForDuration(ap);\n        this.recreateAdController();\n        throw new Error(\"ad_duration_exceeds_budget\");\n      }\n      try {\n        this.timing.startAdFailsafeTimer(requestToken);\n        await ap.play();\n        this.timing.markAdStarted();\n        if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n          this.timing.scheduleAdStopAtBreakBoundary();\n        }\n        ap.setAdVolume(getAdAudioVolume(ap));\n        this.timing.consecutiveFailures = 0;\n        this.timing.temporaryFailureUrls.delete(vastTagUrl);\n      } catch (playError) {\n        if (this.debug) console.error(\"[AD-ERROR] Failed to play ad:\", playError);\n        if (this.timing.isTemporaryAdError(playError)) {\n          this.timing.temporaryFailureUrls.set(vastTagUrl, Date.now());\n          if (this.debug) console.log(\"[AD-ERROR] Temporary play error - URL can be retried after cooldown\");\n        } else {\n          this.timing.failedVastUrls.add(vastTagUrl);\n          if (this.debug) console.log(\"[AD-ERROR] Permanent play error - URL blacklisted\");\n        }\n        this.timing.clearAdFailsafeTimer();\n        if (this.timing.activeAdRequestToken === requestToken) {\n          this.timing.activeAdRequestToken = null;\n        }\n        throw playError;\n      }\n    } catch (error) {\n      const errorMessage = error?.message || \"\";\n      if (this.debug) console.error(\"[AD-ERROR] Ad request failed:\", errorMessage);\n      if (this.timing.isTemporaryAdError(error)) {\n        this.timing.temporaryFailureUrls.set(vastTagUrl, Date.now());\n        if (this.debug) console.log(\"[AD-ERROR] Temporary error (no-fill/timeout) - URL can be retried after cooldown\");\n      } else {\n        this.timing.failedVastUrls.add(vastTagUrl);\n        if (this.debug) console.log(\"[AD-ERROR] Permanent error - URL blacklisted:\", errorMessage);\n      }\n      this.timing.clearAdRequestWatchdog();\n      this.timing.clearAdFailsafeTimer();\n      if (this.timing.activeAdRequestToken === requestToken) {\n        this.timing.activeAdRequestToken = null;\n      }\n      throw error;\n    }\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Placeholder wait\n  // ───────────────────────────────────────────────────────────────\n  async showPlaceholderAndWaitForAds() {\n    const remaining = this.timing.getRemainingAdMs();\n    const waitTime = Math.min(this.maxPlaceholderDurationMs, remaining);\n    if (this.timing.isGamInCooldown()) {\n      if (this.debug) console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, skipping placeholder wait\");\n      this.handleAdPodComplete();\n      return;\n    }\n    if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n      if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping placeholder - too many consecutive failures\");\n      this.handleAdPodComplete();\n      return;\n    }\n    if (waitTime < 1e3) {\n      this.handleAdPodComplete();\n      return;\n    }\n    if (this.debug) {\n      console.log(`[CONTINUOUS-FETCH] Showing placeholder for ${waitTime}ms while waiting for ad URLs`);\n    }\n    this.isShowingPlaceholder = true;\n    this.host.getAdPlayer().showPlaceholder();\n    const checkInterval = 300;\n    const maxChecks = Math.floor(waitTime / checkInterval);\n    for (let i = 0; i < maxChecks; i++) {\n      await new Promise((resolve) => setTimeout(resolve, checkInterval));\n      if (!this.inAdBreak) return;\n      if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n        if (this.debug) console.log(\"[CONTINUOUS-FETCH] Too many failures during placeholder wait\");\n        break;\n      }\n      if (!this.timing.hasTimeToStartAnotherAd()) {\n        if (this.debug) console.log(\"[CONTINUOUS-FETCH] Not enough time remaining during placeholder wait, ending ad break\");\n        break;\n      }\n      while (this.adRequestQueue.length > 0) {\n        if (!this.timing.hasTimeToStartAnotherAd()) break;\n        const nextAdUrl = this.adRequestQueue.shift();\n        if (!nextAdUrl) continue;\n        if (this.timing.failedVastUrls.has(nextAdUrl)) continue;\n        if (this.timing.isUrlInCooldown(nextAdUrl)) continue;\n        if (this.debug) console.log(\"[CONTINUOUS-FETCH] Ad URL available, requesting via HLS ad player\");\n        this.isShowingPlaceholder = false;\n        this.host.getAdPlayer().hidePlaceholder();\n        try {\n          await this.playSingleAd(nextAdUrl);\n          this.timing.consecutiveFailures = 0;\n        } catch (error) {\n          const errorMessage = error.message;\n          if (errorMessage.includes(\"ad_duration_exceeds_budget\")) {\n            await this.tryNextAvailableAdWithRateLimit();\n            return;\n          }\n          if (!errorMessage.includes(\"permanently failed\") && !errorMessage.includes(\"in cooldown\")) {\n            this.timing.consecutiveFailures++;\n          }\n          await this.tryNextAvailableAdWithRateLimit();\n        }\n        return;\n      }\n    }\n    if (this.debug) console.log(\"[CONTINUOUS-FETCH] Placeholder timeout, ending ad break\");\n    this.isShowingPlaceholder = false;\n    this.host.getAdPlayer().hidePlaceholder();\n    this.handleAdPodComplete();\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Ad break completion\n  // ───────────────────────────────────────────────────────────────\n  handleAdPodComplete() {\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] Ad pod complete - cleaning up\");\n    }\n    this.timing.resetForBreakEnd();\n    this.stopContinuousFetching();\n    this.clearPendingAdBreak();\n    if (this.isShowingPlaceholder) {\n      this.host.getAdPlayer().hidePlaceholder();\n      this.isShowingPlaceholder = false;\n    }\n    this.adRequestQueue = [];\n    this.inAdBreak = false;\n    this.adDetectSentForCurrentBreak = false;\n    this.cueManager.activeScte35BreakKey = void 0;\n    this.cueManager.scheduledScte35BreakKey = void 0;\n    this.adPodQueue = [];\n    this.showAds = false;\n    this.host.getAdPlayer().stop().catch(() => {\n    });\n    const restoredMuted = this.host.getAdPlayer().getOriginalMutedState();\n    const restoredVolume = this.host.getAdPlayer().getOriginalVolume();\n    if (this.host.video.muted !== restoredMuted) {\n      this.host.video.muted = restoredMuted;\n    }\n    if (Math.abs(this.host.video.volume - restoredVolume) > 0.01) {\n      this.host.video.volume = restoredVolume;\n    }\n    if (this.host.shouldContinueLiveStreamDuringAds()) {\n      const liveSyncPos = this.host.getLiveSyncPosition();\n      if (liveSyncPos != null && liveSyncPos > this.host.video.currentTime) {\n        if (this.debug) {\n          console.log(\n            `[StormcloudVideoPlayer] Live break end \\u2014 snapping to live edge: ${this.host.video.currentTime.toFixed(2)}s \\u2192 ${liveSyncPos.toFixed(2)}s`\n          );\n        }\n        this.host.video.currentTime = liveSyncPos;\n      }\n      if (this.host.video.paused) {\n        if (this.debug) console.log(\"[StormcloudVideoPlayer] Content video paused in live mode after ads, resuming playback\");\n        this.host.video.play()?.catch(() => {\n        });\n      } else {\n        if (this.debug) console.log(\"[StormcloudVideoPlayer] Content video already playing in live mode after ads\");\n      }\n    } else if (this.host.video.paused) {\n      this.host.video.play()?.catch(() => {\n      });\n    }\n  }\n  handleAdFailure() {\n    this.timing.consecutiveFailures++;\n    this.timing.recordGamNoFill();\n    const remaining = this.timing.getRemainingAdMs();\n    if (this.debug) {\n      console.log(\n        `[CONTINUOUS-FETCH] Ad failure: remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}, consecutiveFailures=${this.timing.consecutiveFailures}`,\n        this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n      );\n    }\n    if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n      if (this.debug) console.log(`[CONTINUOUS-FETCH] Max consecutive failures reached (${this.timing.consecutiveFailures}), ending ad break gracefully`);\n      this.handleAdPodComplete();\n      return;\n    }\n    if (this.timing.hasTimeToStartAnotherAd()) {\n      this.tryNextAvailableAdWithRateLimit();\n    } else {\n      if (this.debug) console.log(\"[AD-ERROR] Ad failed and not enough time remaining for another ad. Failed URLs:\", this.timing.failedVastUrls.size);\n      this.handleAdPodComplete();\n    }\n  }\n};\n\n// src/player/StormcloudVideoPlayer.ts\nvar StormcloudVideoPlayer = class {\n  constructor(config) {\n    this.attached = false;\n    this.palPlaybackStarted = false;\n    initializePolyfills();\n    const browserOverrides = getBrowserConfigOverrides();\n    this.config = { ...browserOverrides, ...config };\n    this.video = config.videoElement;\n    logBrowserInfo(config.debugAdTiming);\n    this.adPlayer = this.createAdPlayer(false);\n    this.palNonce = createPalNonceManager();\n    this.cueManager = new Scte35CueManager(!!this.config.debugAdTiming, {\n      onEarlyStartCue: (marker, fragmentSn, cueKey) => {\n        this.startAdPrefetch(marker, fragmentSn, cueKey);\n      },\n      onPlaybackCue: (marker, cueKey) => {\n        this.onScte35Marker(marker, cueKey);\n      },\n      isInAdBreak: () => this.adBreak.inAdBreak\n    });\n    this.adConfig = new AdConfigManager(this.config, this.video);\n    this.timing = new AdTimingService(this.config, this.video, {\n      onAdStopTimerFired: () => this.onAdStopTimerFired(),\n      onAdStartTimerFired: (marker, cueKey) => {\n        this.startScte35AdBreak(\n          marker,\n          cueKey,\n          marker.durationSeconds != null ? marker.durationSeconds * 1e3 : this.timing.expectedAdBreakDurationMs\n        );\n      },\n      onWatchdogTimeout: () => this.adBreak.handleAdFailure(),\n      onFailsafeTimeout: () => this.adBreak.handleAdFailure()\n    });\n    this.placeholder = new PlaceholderLayer(this.video, !!this.config.debugAdTiming);\n    this.hlsEngine = new HlsEngine(this.config, this.video, this.cueManager, this.timing, {\n      onManifestParsed: async (isLive) => this.onManifestParsed(isLive),\n      onScte35Cue: (marker, context) => this.cueManager.onScte35Cue(marker, context),\n      activatePendingCuesForFragment: (frag) => this.cueManager.activatePendingScte35CuesForFragment(frag),\n      onFatalDestroy: () => this.destroy(),\n      isInAdBreak: () => this.adBreak.inAdBreak,\n      hasPendingAdBreak: () => this.adBreak.pendingAdBreak !== null\n    });\n    this.adBreak = new AdBreakOrchestrator(\n      {\n        config: this.config,\n        video: this.video,\n        getAdPlayer: () => this.adPlayer,\n        setAdPlayer: (p) => {\n          this.adPlayer = p;\n        },\n        createAdPlayer: (c) => this.createAdPlayer(c),\n        shouldContinueLiveStreamDuringAds: () => this.shouldContinueLiveStreamDuringAds(),\n        getLiveSyncPosition: () => this.hlsEngine.getLiveSyncPosition(),\n        generatePodVastUrl: (base, breakDurationMs) => this.generatePodVastUrl(base, breakDurationMs)\n      },\n      this.timing,\n      this.adConfig,\n      this.cueManager,\n      this.placeholder\n    );\n  }\n  get debug() {\n    return !!this.config.debugAdTiming;\n  }\n  createAdPlayer(continueLiveStreamDuringAds) {\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] Creating HLS ad player\");\n    }\n    return createHlsAdPlayer(this.video, {\n      continueLiveStreamDuringAds,\n      ...this.config.licenseKey ? { licenseKey: this.config.licenseKey } : {},\n      ...this.hlsEngine?.hls ? { mainHlsInstance: this.hlsEngine.hls } : {}\n    });\n  }\n  generatePodVastUrl(baseUrl, breakDurationMs) {\n    const podParams = this.adConfig.resolvePodParams(breakDurationMs);\n    return this.adConfig.generatePodVastUrl(\n      baseUrl,\n      podParams,\n      this.adPlayer,\n      this.palNonce,\n      this.adBreak.inAdBreak\n    );\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Lifecycle\n  // ───────────────────────────────────────────────────────────────\n  async load() {\n    if (!this.attached) {\n      this.attach();\n    }\n    try {\n      await this.adConfig.fetchAdConfiguration();\n    } catch (error) {\n      if (this.debug) {\n        console.warn(\n          \"[StormcloudVideoPlayer] Failed to fetch ad configuration:\",\n          error\n        );\n      }\n    }\n    this.palNonce.generateNonce({\n      videoWidth: this.video.offsetWidth || this.video.clientWidth || 640,\n      videoHeight: this.video.offsetHeight || this.video.clientHeight || 480,\n      adWillAutoPlay: !!this.config.autoplay,\n      adWillPlayMuted: true,\n      playerVolume: 0,\n      continuousPlayback: this.config.lowLatencyMode ?? false\n    }).catch(() => {\n    });\n    fetchConsentSignals().then((signals) => {\n      this.adConfig.consentSignals = signals;\n    }).catch(() => {\n    });\n    this.adConfig.initializeTracking();\n    if (this.hlsEngine.shouldUseNativeHls(() => this.getStreamType())) {\n      await this.hlsEngine.setupNativeHls();\n      const continueLiveStreamDuringAds = this.shouldContinueLiveStreamDuringAds();\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Native HLS ad behavior:\", {\n          isLive: this.hlsEngine.isLiveStream,\n          continueLiveStreamDuringAds\n        });\n      }\n      this.adPlayer.destroy();\n      this.adPlayer = this.createAdPlayer(continueLiveStreamDuringAds);\n      this.adPlayer.initialize();\n      return;\n    }\n    this.hlsEngine.setupHls();\n  }\n  async onManifestParsed(isLive) {\n    if (!this.adConfig.isVmapEnabled() && !isLive && this.adConfig.vmapBreaks.length === 0 && this.adConfig.apiVastTagUrl) {\n      const prerollKey = \"synthetic-vod-preroll\";\n      if (!this.adConfig.consumedVmapBreakIds.has(prerollKey)) {\n        this.adConfig.vmapBreaks = [\n          { id: prerollKey, startTimeMs: 0, vastTagUrl: this.adConfig.apiVastTagUrl }\n        ];\n        if (this.debug) {\n          console.log(\n            \"[StormcloudVideoPlayer] Injected synthetic VOD preroll from apiVastTagUrl\"\n          );\n        }\n      }\n    }\n    if (this.debug) {\n      const adBehavior = this.shouldContinueLiveStreamDuringAds() ? \"live (main video continues muted during ads)\" : \"vod (main video pauses during ads)\";\n      console.log(\"[StormcloudVideoPlayer] Stream type detected:\", {\n        isLive,\n        allowNativeHls: this.config.allowNativeHls,\n        adBehavior\n      });\n    }\n    this.adPlayer.destroy();\n    this.adPlayer = this.createAdPlayer(this.shouldContinueLiveStreamDuringAds());\n    this.adPlayer.initialize();\n  }\n  attach() {\n    if (this.attached) return;\n    this.attached = true;\n    this.video.autoplay = !!this.config.autoplay;\n    this.video.muted = !!this.config.muted;\n    this.adPlayer.initialize();\n    this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n    this.adBreak.attachImaEventListeners();\n    this.video.addEventListener(\"play\", () => {\n      if (!this.palPlaybackStarted && !this.adPlayer.isAdPlaying()) {\n        this.palPlaybackStarted = true;\n        this.palNonce.sendPlaybackStart();\n      }\n    });\n    this.endedHandler = () => {\n      if (this.palPlaybackStarted) {\n        this.palPlaybackStarted = false;\n        this.palNonce.sendPlaybackEnd();\n      }\n      this.onVideoEnded();\n    };\n    this.video.addEventListener(\"ended\", this.endedHandler);\n    this.video.addEventListener(\"mousedown\", (e) => {\n      this.palNonce.sendAdTouch(e);\n    });\n    this.video.addEventListener(\"touchstart\", (e) => {\n      this.palNonce.sendAdTouch(e);\n    });\n    this.timeUpdateHandler = () => {\n      this.onTimeUpdate(this.video.currentTime);\n    };\n    this.video.addEventListener(\"timeupdate\", this.timeUpdateHandler);\n    this.emptiedHandler = () => {\n      if (this.hlsEngine.nativeHlsMode && this.hlsEngine.videoSrcProtection && !this.adPlayer.isAdPlaying()) {\n        if (this.debug) {\n          console.log(\n            \"[StormcloudVideoPlayer] Video src was cleared, restoring:\",\n            this.hlsEngine.videoSrcProtection\n          );\n        }\n        const currentTime = this.video.currentTime;\n        const wasPaused = this.video.paused;\n        this.video.src = this.hlsEngine.videoSrcProtection;\n        this.video.currentTime = currentTime;\n        if (!wasPaused) {\n          this.video.play().catch(() => {\n          });\n        }\n      }\n    };\n    this.video.addEventListener(\"emptied\", this.emptiedHandler);\n  }\n  shouldContinueLiveStreamDuringAds() {\n    if (this.hlsEngine.isLiveStream) {\n      return true;\n    }\n    const duration = this.video.duration;\n    if (!Number.isFinite(duration) || duration === Infinity) {\n      return true;\n    }\n    return false;\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  SCTE-35 marker orchestration\n  // ───────────────────────────────────────────────────────────────\n  onScte35Marker(marker, cueKey) {\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] SCTE-35 marker detected:\", {\n        type: marker.type,\n        ptsSeconds: marker.ptsSeconds,\n        durationSeconds: marker.durationSeconds,\n        currentTime: this.video.currentTime,\n        raw: marker.raw,\n        hasPendingAdBreak: !!this.adBreak.pendingAdBreak\n      });\n    }\n    if (marker.type === \"start\") {\n      if (this.adBreak.inAdBreak) {\n        if (marker.durationSeconds != null) {\n          const newDurationMs = marker.durationSeconds * 1e3;\n          if (this.timing.expectedAdBreakDurationMs == null || newDurationMs > this.timing.expectedAdBreakDurationMs) {\n            this.timing.setAdBreakDurationBoundary(newDurationMs);\n            this.timing.scheduleAdStopAtBreakBoundary();\n            if (this.debug) {\n              console.log(\n                `[StormcloudVideoPlayer] Updated ad break duration from subsequent marker: ${newDurationMs}ms, remaining: ${this.timing.getWallClockRemainingAdMs()}ms`\n              );\n            }\n          }\n        }\n        return;\n      }\n      if (!this.adBreak.adDetectSentForCurrentBreak) {\n        this.adBreak.adDetectSentForCurrentBreak = true;\n        const detectPayload = {};\n        if (marker.durationSeconds != null) detectPayload.durationSeconds = marker.durationSeconds;\n        if (marker.ptsSeconds != null) detectPayload.ptsSeconds = marker.ptsSeconds;\n        sendAdDetectTracking(this.config.licenseKey, { source: \"scte35\", timestamp: (/* @__PURE__ */ new Date()).toISOString(), ...detectPayload }, buildAnalyticsContext(this.config)).catch(() => {\n        });\n      }\n      const hasPrefetchedAds = this.adBreak.pendingAdBreak && this.adBreak.pendingAdBreak.vastUrls.length > 0;\n      const durationMs = marker.durationSeconds != null ? marker.durationSeconds * 1e3 : this.adBreak.pendingAdBreak?.marker.durationSeconds != null ? this.adBreak.pendingAdBreak.marker.durationSeconds * 1e3 : void 0;\n      const isManifest = isManifestBasedMarker(marker);\n      const forceImmediate = this.config.immediateManifestAds ?? true;\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Ad start decision:\", {\n          isManifestMarker: isManifest,\n          forceImmediate,\n          hasPts: typeof marker.ptsSeconds === \"number\",\n          hasPrefetchedAds\n        });\n      }\n      if (isManifest && forceImmediate) {\n        if (this.debug) {\n          console.log(\n            `[StormcloudVideoPlayer] Starting ad immediately (manifest-based)${hasPrefetchedAds ? \" with prefetched ads\" : \"\"}`\n          );\n        }\n        this.timing.clearAdStartTimer();\n        this.startScte35AdBreak(marker, cueKey, durationMs);\n      } else if (typeof marker.ptsSeconds === \"number\") {\n        const tol = this.config.driftToleranceMs ?? 1e3;\n        const nowMs = this.video.currentTime * 1e3;\n        const estCurrentPtsMs = nowMs - this.timing.ptsDriftEmaMs;\n        const deltaMs = Math.floor(marker.ptsSeconds * 1e3 - estCurrentPtsMs);\n        if (this.debug) {\n          console.log(\"[StormcloudVideoPlayer] PTS-based timing calculation:\", {\n            nowMs,\n            estCurrentPtsMs,\n            markerPtsMs: marker.ptsSeconds * 1e3,\n            deltaMs,\n            tolerance: tol\n          });\n        }\n        if (deltaMs > tol) {\n          if (this.debug) {\n            console.log(`[StormcloudVideoPlayer] Scheduling ad start in ${deltaMs}ms`);\n          }\n          this.timing.expectedAdBreakDurationMs = durationMs;\n          this.cueManager.scheduledScte35BreakKey = cueKey;\n          this.timing.scheduleAdStartIn(deltaMs, marker, cueKey);\n        } else {\n          if (this.debug) {\n            console.log(\"[StormcloudVideoPlayer] Starting ad immediately (within tolerance)\");\n          }\n          this.timing.clearAdStartTimer();\n          this.startScte35AdBreak(marker, cueKey, durationMs);\n        }\n      } else {\n        if (this.debug) {\n          console.log(\"[StormcloudVideoPlayer] Starting ad immediately (fallback)\");\n        }\n        this.timing.clearAdStartTimer();\n        this.startScte35AdBreak(marker, cueKey, durationMs);\n      }\n      return;\n    }\n    if (marker.type === \"progress\" && this.adBreak.inAdBreak) {\n      if (marker.durationSeconds != null) {\n        this.timing.setAdBreakDurationBoundary(marker.durationSeconds * 1e3);\n      }\n      this.timing.scheduleAdStopAtBreakBoundary();\n      if (!this.adPlayer.isAdPlaying() && this.timing.activeAdRequestToken === null && this.adBreak.adRequestQueue.length > 0 && this.timing.hasTimeToStartAnotherAd()) {\n        this.adBreak.tryNextAvailableAdWithRateLimit();\n      }\n      return;\n    }\n    if (marker.type === \"end\") {\n      if (!this.video.muted) {\n        this.video.muted = true;\n        if (this.debug) {\n          console.log(\"[StormcloudVideoPlayer] Muted video on SCTE end marker\");\n        }\n      }\n      const remaining = this.timing.getRemainingAdMs();\n      const adPlaying = this.adPlayer.isAdPlaying();\n      const hasQueuedAds = this.adBreak.adRequestQueue.length > 0;\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] SCTE-35 end marker received:\", {\n          remaining,\n          adPlaying,\n          hasQueuedAds,\n          activeAdRequest: this.timing.activeAdRequestToken !== null\n        });\n      }\n      this.timing.scteAdBreakEndWallClockMs = Date.now();\n      this.timing.clearAdStartTimer();\n      this.timing.clearAdStopTimer();\n      if (adPlaying) {\n        this.adPlayer.stop().catch(() => {\n        });\n      }\n      this.adBreak.handleAdPodComplete();\n      return;\n    }\n  }\n  startScte35AdBreak(marker, cueKey, durationMs) {\n    this.adBreak.inAdBreak = true;\n    this.cueManager.activeScte35BreakKey = cueKey ?? this.cueManager.pendingScte35CueKey;\n    this.cueManager.scheduledScte35BreakKey = void 0;\n    this.timing.currentAdBreakStartWallClockMs = this.timing.resolveScteBreakStartWallClockMs(marker);\n    this.timing.setAdBreakDurationBoundary(durationMs);\n    this.adBreak.handleAdStart(marker);\n    this.timing.scheduleAdStopAtBreakBoundary();\n  }\n  onAdStopTimerFired() {\n    if (!this.adBreak.inAdBreak) return;\n    const adPlaying = this.adPlayer.isAdPlaying();\n    const checkIntervalMs = Math.max(\n      250,\n      Math.floor(this.config.adBreakCheckIntervalMs ?? 1e3)\n    );\n    const maxExtensionMsConfig = this.config.maxAdBreakExtensionMs;\n    const maxExtensionMs = typeof maxExtensionMsConfig === \"number\" && maxExtensionMsConfig > 0 ? maxExtensionMsConfig : 0;\n    const endWallClockMs = this.timing.getAdBreakEndWallClockMs() ?? Date.now();\n    const overrunMs = Math.max(0, Date.now() - endWallClockMs);\n    const shouldExtendAdBreak = adPlaying && overrunMs < maxExtensionMs;\n    if (shouldExtendAdBreak) {\n      this.timing.scheduleAdStopCountdown(checkIntervalMs);\n      return;\n    }\n    if (this.debug) {\n      console.log(\n        `[StormcloudVideoPlayer] Ad break boundary reached (overrun=${overrunMs}ms) - hard-stopping ads and resuming stream`\n      );\n    }\n    if (adPlaying) {\n      this.adPlayer.stop().catch(() => {\n      });\n    }\n    this.adBreak.handleAdPodComplete();\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Ad prefetch\n  // ───────────────────────────────────────────────────────────────\n  startAdPrefetch(marker, fragmentSn, cueKey) {\n    if (this.adBreak.pendingAdBreak || this.adBreak.inAdBreak) return;\n    const scheduled = this.adConfig.findCurrentOrNextBreak(this.video.currentTime * 1e3);\n    const tags = this.adConfig.selectVastTagsForBreak(scheduled);\n    let baseVastUrl;\n    if (tags && tags.length > 0 && tags[0]) {\n      baseVastUrl = tags[0];\n    } else if (this.adConfig.apiVastTagUrl) {\n      baseVastUrl = this.adConfig.apiVastTagUrl;\n    } else {\n      if (this.debug) console.warn(\"[StormcloudVideoPlayer] No VAST URL available for prefetch\");\n      return;\n    }\n    this.adConfig.beginNewAdPod();\n    this.adConfig.podAssignedByPrefetch = true;\n    const breakDurationMs = marker.durationSeconds != null ? marker.durationSeconds * 1e3 : void 0;\n    const generatedUrls = [this.generatePodVastUrl(baseVastUrl, breakDurationMs)];\n    this.adBreak.pendingAdBreak = {\n      marker,\n      ...fragmentSn !== void 0 ? { detectedAtFragmentSn: fragmentSn } : {},\n      vastUrls: generatedUrls,\n      isFetching: false,\n      fetchStartTime: Date.now()\n    };\n    this.cueManager.pendingScte35CueKey = cueKey;\n    this.adBreak.adDetectSentForCurrentBreak = true;\n    const detectPayload = {};\n    if (marker.durationSeconds != null) detectPayload.durationSeconds = marker.durationSeconds;\n    if (marker.ptsSeconds != null) detectPayload.ptsSeconds = marker.ptsSeconds;\n    if (fragmentSn !== void 0) detectPayload.detectedAtFragmentSn = fragmentSn;\n    sendAdDetectTracking(this.config.licenseKey, { source: \"scte35\", timestamp: (/* @__PURE__ */ new Date()).toISOString(), ...detectPayload }, buildAnalyticsContext(this.config)).catch(() => {\n    });\n    if (this.debug) {\n      console.log(\"[PREFETCH] Starting ad prefetch for upcoming ad break\");\n      console.log(`[PREFETCH] Pre-generated pod request URL`);\n    }\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  VMAP time-based ad breaks\n  // ───────────────────────────────────────────────────────────────\n  onTimeUpdate(currentTimeSec) {\n    if (!this.adConfig.isVmapEnabled() || this.adConfig.vmapBreaks.length === 0) return;\n    if (this.adPlayer.isAdPlaying() || this.adBreak.inAdBreak) return;\n    const nowMs = currentTimeSec * 1e3;\n    const breakToPlay = this.adConfig.findBreakForTime(nowMs);\n    if (breakToPlay) {\n      void this.handleVmapAdBreak(breakToPlay, nowMs).catch((error) => {\n        if (this.debug) {\n          console.warn(\"[StormcloudVideoPlayer] VMAP ad break failed gracefully:\", error);\n        }\n      });\n    }\n  }\n  onVideoEnded() {\n    if (!this.adConfig.isVmapEnabled() || this.adConfig.vmapBreaks.length === 0) return;\n    if (this.adPlayer.isAdPlaying() || this.adBreak.inAdBreak) return;\n    const durationMs = Number.isFinite(this.video.duration) ? Math.floor(this.video.duration * 1e3) : 0;\n    const postroll = this.adConfig.vmapBreaks.find(\n      (b) => b.startTimeMs === -1 && !this.adConfig.consumedVmapBreakIds.has(this.adConfig.getAdBreakKey(b))\n    );\n    if (postroll) {\n      void this.handleVmapAdBreak(postroll, durationMs).catch((error) => {\n        if (this.debug) {\n          console.warn(\"[StormcloudVideoPlayer] VMAP post-roll failed gracefully:\", error);\n        }\n      });\n    }\n  }\n  async handleVmapAdBreak(adBreak, nowMs) {\n    const key = this.adConfig.getAdBreakKey(adBreak);\n    if (this.adConfig.consumedVmapBreakIds.has(key)) return;\n    const breakStartMs = this.adConfig.resolveBreakStartMs(adBreak);\n    if (breakStartMs == null) return;\n    const durationMs = adBreak.durationMs ?? 0;\n    const endMs = breakStartMs + durationMs;\n    const inWindow = durationMs > 0 ? nowMs >= breakStartMs && nowMs < endMs : nowMs >= breakStartMs;\n    if (inWindow) {\n      this.adConfig.consumedVmapBreakIds.add(key);\n      const tags = this.adConfig.selectVastTagsForBreak(adBreak);\n      if (!tags || tags.length === 0) return;\n      const first = tags[0];\n      const rest = tags.slice(1);\n      this.adBreak.adPodQueue = rest;\n      this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n      this.adBreak.showAds = true;\n      this.adBreak.inAdBreak = true;\n      this.timing.currentAdBreakStartWallClockMs = Date.now();\n      try {\n        await this.adBreak.playSingleAd(first);\n      } catch (error) {\n        this.adBreak.adPodQueue = [];\n        this.adBreak.inAdBreak = false;\n        this.adBreak.showAds = false;\n        if (this.debug) {\n          console.warn(\"[StormcloudVideoPlayer] VMAP ad request failed:\", error);\n        }\n      }\n    }\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Public API\n  // ───────────────────────────────────────────────────────────────\n  getCurrentAdIndex() {\n    return this.timing.currentAdIndex;\n  }\n  getTotalAdsInBreak() {\n    return this.timing.totalAdsInBreak;\n  }\n  getAdRemainingMs() {\n    return this.timing.getRemainingAdMs();\n  }\n  isAdPlaying() {\n    return this.adBreak.inAdBreak && this.adPlayer.isAdPlaying();\n  }\n  isShowingAds() {\n    return this.adBreak.showAds;\n  }\n  getStreamType() {\n    const url = this.config.src.toLowerCase();\n    if (url.includes(\".m3u8\") || url.includes(\"/hls/\") || url.includes(\"application/vnd.apple.mpegurl\")) {\n      return \"hls\";\n    }\n    return \"other\";\n  }\n  shouldShowNativeControls() {\n    const streamType = this.getStreamType();\n    if (streamType === \"other\") {\n      return !(this.config.showCustomControls ?? false);\n    }\n    return !!(this.config.allowNativeHls && !(this.config.showCustomControls ?? false));\n  }\n  isLive() {\n    return this.hlsEngine.isLiveStream;\n  }\n  get videoElement() {\n    return this.video;\n  }\n  toggleMute() {\n    toggleMute(this.video, this.adPlayer, this.debug);\n  }\n  toggleFullscreen() {\n    return toggleFullscreen(this.video, this.debug);\n  }\n  isMuted() {\n    return isMuted(this.video, this.adPlayer);\n  }\n  setMuted(muted) {\n    setMuted(this.video, this.adPlayer, muted, this.debug);\n  }\n  setVolume(volume) {\n    setVolume(this.video, this.adPlayer, volume, this.debug);\n  }\n  getVolume() {\n    return getVolume(this.video, this.adPlayer);\n  }\n  isFullscreen() {\n    return isFullscreen();\n  }\n  resize() {\n    resizePlayer(this.video, this.adPlayer, this.debug);\n  }\n  // ───────────────────────────────────────────────────────────────\n  //  Destroy\n  // ───────────────────────────────────────────────────────────────\n  destroy() {\n    this.adBreak.stopContinuousFetching();\n    this.timing.destroy();\n    this.adBreak.clearPendingAdBreak();\n    this.placeholder.destroy();\n    if (this.timeUpdateHandler) {\n      this.video.removeEventListener(\"timeupdate\", this.timeUpdateHandler);\n      delete this.timeUpdateHandler;\n    }\n    if (this.endedHandler) {\n      this.video.removeEventListener(\"ended\", this.endedHandler);\n      delete this.endedHandler;\n    }\n    if (this.emptiedHandler) {\n      this.video.removeEventListener(\"emptied\", this.emptiedHandler);\n      delete this.emptiedHandler;\n    }\n    this.adConfig.destroyTracking();\n    this.hlsEngine.destroy();\n    this.adPlayer?.destroy();\n    if (this.palPlaybackStarted) {\n      this.palPlaybackStarted = false;\n      this.palNonce.sendPlaybackEnd();\n    }\n    this.palNonce.reset();\n    this.adBreak.adRequestQueue = [];\n    this.timing.consecutiveFailures = 0;\n  }\n};\n\n// src/patterns.ts\nvar HLS_EXTENSIONS = /\\.(m3u8)($|\\?)/i;\nvar HLS_PATHS = /\\/hls\\//i;\nvar DASH_EXTENSIONS = /\\.(mpd)($|\\?)/i;\nvar VIDEO_EXTENSIONS = /\\.(mp4|webm|ogg|avi|mov|wmv|flv|mkv)($|\\?)/i;\nvar AUDIO_EXTENSIONS = /\\.(mp3|wav|ogg|aac|wma|flac|m4a)($|\\?)/i;\nvar canPlay = {\n  hls: (url) => {\n    if (!url || typeof url !== \"string\") return false;\n    return HLS_EXTENSIONS.test(url) || HLS_PATHS.test(url);\n  },\n  dash: (url) => {\n    if (!url || typeof url !== \"string\") return false;\n    return DASH_EXTENSIONS.test(url);\n  },\n  video: (url) => {\n    if (!url || typeof url !== \"string\") return false;\n    return VIDEO_EXTENSIONS.test(url);\n  },\n  audio: (url) => {\n    if (!url || typeof url !== \"string\") return false;\n    return AUDIO_EXTENSIONS.test(url);\n  },\n  file: (url) => {\n    if (!url || typeof url !== \"string\") return false;\n    return VIDEO_EXTENSIONS.test(url) || AUDIO_EXTENSIONS.test(url);\n  }\n};\n\n// src/players/HlsPlayer.tsx\nvar HlsPlayer = class extends import_react.Component {\n  constructor() {\n    super(...arguments);\n    this.player = null;\n    this.mounted = false;\n    this.load = async () => {\n      if (!this.props.videoElement || !this.props.src) return;\n      try {\n        if (this.player) {\n          this.player.destroy();\n          this.player = null;\n        }\n        const config = {\n          src: this.props.src,\n          videoElement: this.props.videoElement\n        };\n        if (this.props.autoplay !== void 0)\n          config.autoplay = this.props.autoplay;\n        if (this.props.muted !== void 0) config.muted = this.props.muted;\n        if (this.props.lowLatencyMode !== void 0)\n          config.lowLatencyMode = this.props.lowLatencyMode;\n        if (this.props.allowNativeHls !== void 0)\n          config.allowNativeHls = this.props.allowNativeHls;\n        if (this.props.isLiveStream !== void 0)\n          config.isLiveStream = this.props.isLiveStream;\n        if (this.props.driftToleranceMs !== void 0)\n          config.driftToleranceMs = this.props.driftToleranceMs;\n        if (this.props.immediateManifestAds !== void 0)\n          config.immediateManifestAds = this.props.immediateManifestAds;\n        if (this.props.debugAdTiming !== void 0)\n          config.debugAdTiming = this.props.debugAdTiming;\n        if (this.props.showCustomControls !== void 0)\n          config.showCustomControls = this.props.showCustomControls;\n        if (this.props.onVolumeToggle !== void 0)\n          config.onVolumeToggle = this.props.onVolumeToggle;\n        if (this.props.onFullscreenToggle !== void 0)\n          config.onFullscreenToggle = this.props.onFullscreenToggle;\n        if (this.props.onControlClick !== void 0)\n          config.onControlClick = this.props.onControlClick;\n        if (this.props.licenseKey !== void 0)\n          config.licenseKey = this.props.licenseKey;\n        if (this.props.adFailsafeTimeoutMs !== void 0)\n          config.adFailsafeTimeoutMs = this.props.adFailsafeTimeoutMs;\n        if (this.props.minSegmentsBeforePlay !== void 0)\n          config.minSegmentsBeforePlay = this.props.minSegmentsBeforePlay;\n        if (this.props.ctvAdRequest !== void 0)\n          config.ctvAdRequest = this.props.ctvAdRequest;\n        this.player = new StormcloudVideoPlayer(config);\n        this.props.onMount?.(this);\n        await this.player.load();\n        if (this.mounted) {\n          this.props.onReady?.();\n        }\n      } catch (error) {\n        if (this.mounted) {\n          this.props.onError?.(error);\n        }\n      }\n    };\n    this.play = () => {\n      if (this.props.videoElement) {\n        const video = this.props.videoElement;\n        const hasValidSource = video.src || video.currentSrc && video.currentSrc !== \"\" || video.readyState >= 1;\n        if (hasValidSource) {\n          video.play()?.catch((error) => {\n            console.error(\"[HlsPlayer] Failed to play:\", error);\n            this.props.onError?.(error);\n          });\n          this.props.onPlay?.();\n        } else {\n          console.warn(\"[HlsPlayer] Cannot play: video has no valid source\");\n        }\n      }\n    };\n    this.pause = () => {\n      if (this.props.videoElement) {\n        this.props.videoElement.pause();\n        this.props.onPause?.();\n      }\n    };\n    this.stop = () => {\n      this.pause();\n      if (this.props.videoElement) {\n        this.props.videoElement.currentTime = 0;\n      }\n    };\n    this.seekTo = (seconds, keepPlaying) => {\n      if (this.props.videoElement) {\n        this.props.videoElement.currentTime = seconds;\n        if (!keepPlaying) {\n          this.pause();\n        }\n      }\n    };\n    this.setVolume = (volume) => {\n      if (this.props.videoElement) {\n        this.props.videoElement.volume = Math.max(0, Math.min(1, volume));\n      }\n    };\n    this.mute = () => {\n      if (this.props.videoElement) {\n        this.props.videoElement.muted = true;\n      }\n    };\n    this.unmute = () => {\n      if (this.props.videoElement) {\n        this.props.videoElement.muted = false;\n      }\n    };\n    this.setPlaybackRate = (rate) => {\n      if (this.props.videoElement && rate > 0) {\n        this.props.videoElement.playbackRate = rate;\n      }\n    };\n    this.getDuration = () => {\n      if (this.props.videoElement && isFinite(this.props.videoElement.duration)) {\n        return this.props.videoElement.duration;\n      }\n      return null;\n    };\n    this.getCurrentTime = () => {\n      if (this.props.videoElement && isFinite(this.props.videoElement.currentTime)) {\n        return this.props.videoElement.currentTime;\n      }\n      return null;\n    };\n    this.getSecondsLoaded = () => {\n      if (this.props.videoElement && this.props.videoElement.buffered.length > 0) {\n        return this.props.videoElement.buffered.end(\n          this.props.videoElement.buffered.length - 1\n        );\n      }\n      return null;\n    };\n    this.getInternalPlayer = (key = \"player\") => {\n      if (key === \"player\") return this.player;\n      if (key === \"video\") return this.props.videoElement;\n      if (key === \"hls\" && this.player) return this.player.hls;\n      return null;\n    };\n  }\n  componentDidMount() {\n    this.mounted = true;\n    this.load();\n  }\n  componentWillUnmount() {\n    this.mounted = false;\n    if (this.player) {\n      this.player.destroy();\n      this.player = null;\n    }\n  }\n  componentDidUpdate(prevProps) {\n    if (prevProps.src !== this.props.src) {\n      this.load();\n    }\n  }\n  render() {\n    return null;\n  }\n};\nHlsPlayer.displayName = \"HlsPlayer\";\nHlsPlayer.canPlay = canPlay.hls;\n","import { Component } from \"react\";\nimport { StormcloudVideoPlayer } from \"../player/StormcloudVideoPlayer\";\nimport type { StormcloudVideoPlayerConfig } from \"../types\";\nimport { canPlay } from \"../patterns\";\n\nexport interface HlsPlayerProps extends StormcloudVideoPlayerConfig {\n  onMount?: (player: any) => void;\n  onReady?: () => void;\n  onPlay?: () => void;\n  onPause?: () => void;\n  onEnded?: () => void;\n  onLoaded?: () => void;\n  onError?: (error: any) => void;\n}\n\nexport default class HlsPlayer extends Component<HlsPlayerProps> {\n  static displayName = \"HlsPlayer\";\n\n  static canPlay = canPlay.hls;\n\n  private player: StormcloudVideoPlayer | null = null;\n  private mounted = false;\n\n  componentDidMount() {\n    this.mounted = true;\n    this.load();\n  }\n\n  componentWillUnmount() {\n    this.mounted = false;\n    if (this.player) {\n      this.player.destroy();\n      this.player = null;\n    }\n  }\n\n  componentDidUpdate(prevProps: HlsPlayerProps) {\n    if (prevProps.src !== this.props.src) {\n      this.load();\n    }\n  }\n\n  load = async () => {\n    if (!this.props.videoElement || !this.props.src) return;\n\n    try {\n      if (this.player) {\n        this.player.destroy();\n        this.player = null;\n      }\n\n      const config: StormcloudVideoPlayerConfig = {\n        src: this.props.src,\n        videoElement: this.props.videoElement,\n      };\n\n      if (this.props.autoplay !== undefined)\n        config.autoplay = this.props.autoplay;\n      if (this.props.muted !== undefined) config.muted = this.props.muted;\n      if (this.props.lowLatencyMode !== undefined)\n        config.lowLatencyMode = this.props.lowLatencyMode;\n      if (this.props.allowNativeHls !== undefined)\n        config.allowNativeHls = this.props.allowNativeHls;\n      if (this.props.isLiveStream !== undefined)\n        config.isLiveStream = this.props.isLiveStream;\n      if (this.props.driftToleranceMs !== undefined)\n        config.driftToleranceMs = this.props.driftToleranceMs;\n      if (this.props.immediateManifestAds !== undefined)\n        config.immediateManifestAds = this.props.immediateManifestAds;\n      if (this.props.debugAdTiming !== undefined)\n        config.debugAdTiming = this.props.debugAdTiming;\n      if (this.props.showCustomControls !== undefined)\n        config.showCustomControls = this.props.showCustomControls;\n      if (this.props.onVolumeToggle !== undefined)\n        config.onVolumeToggle = this.props.onVolumeToggle;\n      if (this.props.onFullscreenToggle !== undefined)\n        config.onFullscreenToggle = this.props.onFullscreenToggle;\n      if (this.props.onControlClick !== undefined)\n        config.onControlClick = this.props.onControlClick;\n      if (this.props.licenseKey !== undefined)\n        config.licenseKey = this.props.licenseKey;\n      if (this.props.adFailsafeTimeoutMs !== undefined)\n        config.adFailsafeTimeoutMs = this.props.adFailsafeTimeoutMs;\n      if (this.props.minSegmentsBeforePlay !== undefined)\n        config.minSegmentsBeforePlay = this.props.minSegmentsBeforePlay;\n      if (this.props.ctvAdRequest !== undefined)\n        config.ctvAdRequest = this.props.ctvAdRequest;\n\n      this.player = new StormcloudVideoPlayer(config);\n\n      this.props.onMount?.(this);\n\n      await this.player.load();\n\n      if (this.mounted) {\n        this.props.onReady?.();\n      }\n    } catch (error) {\n      if (this.mounted) {\n        this.props.onError?.(error);\n      }\n    }\n  };\n\n  play = () => {\n    if (this.props.videoElement) {\n      const video = this.props.videoElement;\n      const hasValidSource =\n        video.src ||\n        (video.currentSrc && video.currentSrc !== \"\") ||\n        video.readyState >= 1;\n\n      if (hasValidSource) {\n        video.play()?.catch((error) => {\n          console.error(\"[HlsPlayer] Failed to play:\", error);\n          this.props.onError?.(error);\n        });\n        this.props.onPlay?.();\n      } else {\n        console.warn(\"[HlsPlayer] Cannot play: video has no valid source\");\n      }\n    }\n  };\n\n  pause = () => {\n    if (this.props.videoElement) {\n      this.props.videoElement.pause();\n      this.props.onPause?.();\n    }\n  };\n\n  stop = () => {\n    this.pause();\n    if (this.props.videoElement) {\n      this.props.videoElement.currentTime = 0;\n    }\n  };\n\n  seekTo = (seconds: number, keepPlaying?: boolean) => {\n    if (this.props.videoElement) {\n      this.props.videoElement.currentTime = seconds;\n      if (!keepPlaying) {\n        this.pause();\n      }\n    }\n  };\n\n  setVolume = (volume: number) => {\n    if (this.props.videoElement) {\n      this.props.videoElement.volume = Math.max(0, Math.min(1, volume));\n    }\n  };\n\n  mute = () => {\n    if (this.props.videoElement) {\n      this.props.videoElement.muted = true;\n    }\n  };\n\n  unmute = () => {\n    if (this.props.videoElement) {\n      this.props.videoElement.muted = false;\n    }\n  };\n\n  setPlaybackRate = (rate: number) => {\n    if (this.props.videoElement && rate > 0) {\n      this.props.videoElement.playbackRate = rate;\n    }\n  };\n\n  getDuration = (): number | null => {\n    if (this.props.videoElement && isFinite(this.props.videoElement.duration)) {\n      return this.props.videoElement.duration;\n    }\n    return null;\n  };\n\n  getCurrentTime = (): number | null => {\n    if (\n      this.props.videoElement &&\n      isFinite(this.props.videoElement.currentTime)\n    ) {\n      return this.props.videoElement.currentTime;\n    }\n    return null;\n  };\n\n  getSecondsLoaded = (): number | null => {\n    if (\n      this.props.videoElement &&\n      this.props.videoElement.buffered.length > 0\n    ) {\n      return this.props.videoElement.buffered.end(\n        this.props.videoElement.buffered.length - 1\n      );\n    }\n    return null;\n  };\n\n  getInternalPlayer = (key = \"player\") => {\n    if (key === \"player\") return this.player;\n    if (key === \"video\") return this.props.videoElement;\n    if (key === \"hls\" && this.player) return (this.player as any).hls;\n    return null;\n  };\n\n  render() {\n    return null;\n  }\n}\n","import type { AdController } from \"../types\";\nimport Hls from \"hls.js\";\n\ninterface VastMediaFile {\n  url: string;\n  type: string;\n  width: number;\n  height: number;\n  bitrate?: number | undefined;\n}\n\ninterface VastTrackingUrls {\n  impression: string[];\n  start: string[];\n  firstQuartile: string[];\n  midpoint: string[];\n  thirdQuartile: string[];\n  complete: string[];\n  mute: string[];\n  unmute: string[];\n  pause: string[];\n  resume: string[];\n  fullscreen: string[];\n  exitFullscreen: string[];\n  skip: string[];\n  error: string[];\n}\n\ninterface VastAd {\n  id: string;\n  title: string;\n  duration: number;\n  mediaFiles: VastMediaFile[];\n  trackingUrls: VastTrackingUrls;\n  clickThrough?: string | undefined;\n}\n\ntype VastParseResult =\n  | { type: \"inline\"; ad: VastAd }\n  | {\n      type: \"wrapper\";\n      vastAdTagUri: string;\n      trackingUrls: VastTrackingUrls;\n      clickThrough?: string | undefined;\n    }\n  | { type: \"empty\" };\n\nconst MAX_VAST_WRAPPER_DEPTH = 5;\n\nexport function createHlsAdPlayer(\n  contentVideo: HTMLVideoElement,\n  options?: {\n    continueLiveStreamDuringAds?: boolean;\n    licenseKey?: string;\n    mainHlsInstance?: Hls;\n  }\n): AdController {\n  let adPlaying = false;\n  let originalMutedState = false;\n  let originalVolume = Math.max(0, Math.min(1, contentVideo.volume || 1));\n  const listeners = new Map<string, Set<(payload?: any) => void>>();\n  const licenseKey = options?.licenseKey;\n  const mainHlsInstance = options?.mainHlsInstance;\n\n  let adVideoElement: HTMLVideoElement | undefined;\n  let adHls: Hls | undefined;\n  let adContainerEl: HTMLDivElement | undefined;\n  let currentAd: VastAd | undefined;\n  let podAds: VastAd[] = [];\n  let podIndex = 0;\n  let sessionId: string | undefined;\n  const preloadedAds = new Map<string, VastAd>();\n  const preloadingAds = new Map<string, Promise<void>>();\n  let destroyed = false;\n  let pendingTimeouts: number[] = [];\n\n  let trackingFired = {\n    impression: false,\n    start: false,\n    firstQuartile: false,\n    midpoint: false,\n    thirdQuartile: false,\n    complete: false,\n  };\n\n  function emit(event: string, payload?: any): void {\n    const set = listeners.get(event);\n    if (!set) return;\n    for (const fn of Array.from(set)) {\n      try {\n        fn(payload);\n      } catch (error) {\n        console.warn(\n          `[HlsAdPlayer] Error in event listener for ${event}:`,\n          error\n        );\n      }\n    }\n  }\n\n  function generateSessionId(): string {\n    return `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n  }\n\n  function fireTrackingPixels(urls: string[]): void {\n    if (!urls || urls.length === 0) return;\n\n    urls.forEach((url) => {\n      try {\n        let trackingUrl = url;\n\n        if (sessionId) {\n          trackingUrl = `${trackingUrl}${\n            trackingUrl.includes(\"?\") ? \"&\" : \"?\"\n          }session_id=${sessionId}`;\n        }\n\n        if (licenseKey) {\n          trackingUrl = `${trackingUrl}${\n            trackingUrl.includes(\"?\") ? \"&\" : \"?\"\n          }license_key=${licenseKey}`;\n        }\n\n        const img = new Image(1, 1);\n        img.src = trackingUrl;\n        console.log(`[HlsAdPlayer] Fired tracking pixel: ${trackingUrl}`);\n      } catch (error) {\n        console.warn(`[HlsAdPlayer] Error firing tracking pixel:`, error);\n      }\n    });\n  }\n\n  function getMainStreamQuality(): {\n    width: number;\n    height: number;\n    bitrate: number;\n  } | null {\n    if (!mainHlsInstance || !mainHlsInstance.levels) {\n      return null;\n    }\n\n    const currentLevel = mainHlsInstance.currentLevel;\n    if (currentLevel === -1 || !mainHlsInstance.levels[currentLevel]) {\n      const autoLevel = mainHlsInstance.loadLevel;\n      if (autoLevel !== -1 && mainHlsInstance.levels[autoLevel]) {\n        const level = mainHlsInstance.levels[autoLevel];\n        return {\n          width: level.width || 1920,\n          height: level.height || 1080,\n          bitrate: level.bitrate || 5000000,\n        };\n      }\n      return null;\n    }\n\n    const level = mainHlsInstance.levels[currentLevel];\n    return {\n      width: level.width || 1920,\n      height: level.height || 1080,\n      bitrate: level.bitrate || 5000000,\n    };\n  }\n\n  function selectBestMediaFile(mediaFiles: VastMediaFile[]): VastMediaFile {\n    if (mediaFiles.length === 0) {\n      throw new Error(\"No media files available\");\n    }\n\n    const firstFile = mediaFiles[0];\n    if (!firstFile) {\n      throw new Error(\"No media files available\");\n    }\n\n    if (mediaFiles.length === 1) {\n      return firstFile;\n    }\n\n    const mainQuality = getMainStreamQuality();\n    if (!mainQuality) {\n      console.log(\n        \"[HlsAdPlayer] No main stream quality info, using first media file\"\n      );\n      return firstFile;\n    }\n\n    console.log(\"[HlsAdPlayer] Main stream quality:\", mainQuality);\n\n    const scoredFiles = mediaFiles.map((file) => {\n      const widthDiff = Math.abs(file.width - mainQuality.width);\n      const heightDiff = Math.abs(file.height - mainQuality.height);\n      const resolutionDiff = widthDiff + heightDiff;\n\n      const fileBitrate = (file.bitrate || 5000) * 1000;\n      const bitrateDiff = Math.abs(fileBitrate - mainQuality.bitrate);\n\n      const score = resolutionDiff * 2 + bitrateDiff / 1000;\n\n      return { file, score, resolutionDiff, bitrateDiff };\n    });\n\n    scoredFiles.sort((a, b) => a.score - b.score);\n\n    const bestMatch = scoredFiles[0];\n    if (!bestMatch) {\n      console.log(\"[HlsAdPlayer] No best match found, using first media file\");\n      return firstFile;\n    }\n\n    console.log(\"[HlsAdPlayer] Selected media file:\", {\n      url: bestMatch.file.url,\n      resolution: `${bestMatch.file.width}x${bestMatch.file.height}`,\n      bitrate: bestMatch.file.bitrate,\n      score: bestMatch.score,\n      resolutionDiff: bestMatch.resolutionDiff,\n      bitrateDiff: bestMatch.bitrateDiff,\n    });\n\n    return bestMatch.file;\n  }\n\n  function isHlsMediaFile(mediaFile: VastMediaFile): boolean {\n    const type = mediaFile.type.toLowerCase();\n    const url = mediaFile.url.toLowerCase();\n    return (\n      type === \"application/x-mpegurl\" ||\n      type === \"application/vnd.apple.mpegurl\" ||\n      type.includes(\"mpegurl\") ||\n      url.includes(\".m3u8\")\n    );\n  }\n\n  function isProgressiveMediaFile(mediaFile: VastMediaFile): boolean {\n    const type = mediaFile.type.toLowerCase();\n    const url = mediaFile.url.toLowerCase();\n    return (\n      type.startsWith(\"video/\") ||\n      url.endsWith(\".mp4\") ||\n      url.includes(\".mp4?\")\n    );\n  }\n\n  function createEmptyTrackingUrls(): VastTrackingUrls {\n    return {\n      impression: [],\n      start: [],\n      firstQuartile: [],\n      midpoint: [],\n      thirdQuartile: [],\n      complete: [],\n      mute: [],\n      unmute: [],\n      pause: [],\n      resume: [],\n      fullscreen: [],\n      exitFullscreen: [],\n      skip: [],\n      error: [],\n    };\n  }\n\n  function extractTrackingUrls(scope: Document | Element): VastTrackingUrls {\n    const trackingUrls = createEmptyTrackingUrls();\n\n    scope.querySelectorAll(\"Impression\").forEach((el) => {\n      const url = el.textContent?.trim();\n      if (url) trackingUrls.impression.push(url);\n    });\n\n    scope.querySelectorAll(\"Tracking\").forEach((el) => {\n      const event = el.getAttribute(\"event\");\n      const url = el.textContent?.trim();\n      if (event && url) {\n        const eventKey = event as keyof VastTrackingUrls;\n        if (trackingUrls[eventKey]) {\n          trackingUrls[eventKey].push(url);\n        }\n      }\n    });\n\n    scope.querySelectorAll(\"Error\").forEach((el) => {\n      const url = el.textContent?.trim();\n      if (url) trackingUrls.error.push(url);\n    });\n\n    return trackingUrls;\n  }\n\n  function mergeTrackingUrls(\n    target: VastTrackingUrls,\n    source: VastTrackingUrls\n  ): VastTrackingUrls {\n    (Object.keys(target) as Array<keyof VastTrackingUrls>).forEach((key) => {\n      if (source[key] && source[key].length > 0) {\n        target[key] = target[key].concat(source[key]);\n      }\n    });\n    return target;\n  }\n\n  function parseVastXml(xmlString: string): VastParseResult {\n    try {\n      const parser = new DOMParser();\n      const xmlDoc = parser.parseFromString(xmlString, \"text/xml\");\n\n      const parserError = xmlDoc.querySelector(\"parsererror\");\n      if (parserError) {\n        console.error(\n          \"[HlsAdPlayer] XML parsing error (malformed VAST XML):\",\n          parserError.textContent\n        );\n        return { type: \"empty\" };\n      }\n\n      const adElement = xmlDoc.querySelector(\"Ad\");\n      if (!adElement) {\n        console.warn(\"[HlsAdPlayer] No Ad element found in VAST XML\");\n        return { type: \"empty\" };\n      }\n\n      const adId = adElement.getAttribute(\"id\") || \"unknown\";\n      const title = xmlDoc.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n\n      const clickThrough = xmlDoc\n        .querySelector(\"ClickThrough\")\n        ?.textContent?.trim();\n\n      const wrapperUri = xmlDoc\n        .querySelector(\"VASTAdTagURI\")\n        ?.textContent?.trim();\n      if (wrapperUri) {\n        console.log(\n          `[HlsAdPlayer] VAST wrapper detected, following VASTAdTagURI: ${wrapperUri}`\n        );\n        return {\n          type: \"wrapper\",\n          vastAdTagUri: wrapperUri,\n          trackingUrls: extractTrackingUrls(xmlDoc),\n          clickThrough,\n        };\n      }\n\n      const isNoAdAvailable =\n        adId === \"empty\" ||\n        title.toLowerCase().includes(\"no ad available\") ||\n        title.toLowerCase() === \"no ad available\";\n\n      const durationText =\n        xmlDoc.querySelector(\"Duration\")?.textContent || \"00:00:30\";\n      const durationParts = durationText.split(\":\");\n      const duration =\n        parseInt(durationParts[0] || \"0\", 10) * 3600 +\n        parseInt(durationParts[1] || \"0\", 10) * 60 +\n        parseInt(durationParts[2] || \"0\", 10);\n\n      const mediaFileElements = xmlDoc.querySelectorAll(\"MediaFile\");\n      const mediaFiles: VastMediaFile[] = [];\n\n      console.log(\n        `[HlsAdPlayer] Found ${mediaFileElements.length} MediaFile element(s) in VAST XML`\n      );\n\n      mediaFileElements.forEach((mf, index) => {\n        const type = mf.getAttribute(\"type\") || \"\";\n        const url = mf.textContent?.trim() || \"\";\n        const width = mf.getAttribute(\"width\") || \"\";\n        const height = mf.getAttribute(\"height\") || \"\";\n\n        console.log(\n          `[HlsAdPlayer] MediaFile ${index}: type=\"${type}\", url=\"${url}\", width=\"${width}\", height=\"${height}\"`\n        );\n\n        const mediaFile: VastMediaFile = {\n          url,\n          type,\n          width: parseInt(width || \"1920\", 10),\n          height: parseInt(height || \"1080\", 10),\n          bitrate: undefined,\n        };\n\n        if (!url) {\n          console.warn(`[HlsAdPlayer] MediaFile ${index} has empty URL`);\n          return;\n        }\n\n        const bitrateAttr = mf.getAttribute(\"bitrate\");\n        const bitrateValue = bitrateAttr\n          ? parseInt(bitrateAttr, 10)\n          : undefined;\n        mediaFile.bitrate =\n          bitrateValue && bitrateValue > 0 ? bitrateValue : undefined;\n\n        if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n          mediaFiles.push(mediaFile);\n          console.log(\n            `[HlsAdPlayer] Added ${isHlsMediaFile(mediaFile) ? \"HLS\" : \"progressive\"} MediaFile: ${url}`\n          );\n        } else {\n          console.log(\n            `[HlsAdPlayer] MediaFile ${index} ignored (type=\"${type}\" is not supported)`\n          );\n        }\n      });\n\n      if (mediaFiles.length === 0) {\n        if (isNoAdAvailable) {\n          console.warn(\n            \"[HlsAdPlayer] No ads available (VAST response indicates no ads)\"\n          );\n        } else {\n          console.warn(\"[HlsAdPlayer] No supported media files found in VAST XML\");\n        }\n        return { type: \"empty\" };\n      }\n\n      return {\n        type: \"inline\",\n        ad: {\n          id: adId,\n          title,\n          duration,\n          mediaFiles,\n          trackingUrls: extractTrackingUrls(xmlDoc),\n          clickThrough,\n        },\n      };\n    } catch (error) {\n      console.error(\"[HlsAdPlayer] Error parsing VAST XML:\", error);\n      return { type: \"empty\" };\n    }\n  }\n\n  function parseAdElement(adElement: Element): VastParseResult {\n    try {\n      const adId = adElement.getAttribute(\"id\") || \"unknown\";\n      const title = adElement.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n\n      const clickThrough = adElement\n        .querySelector(\"ClickThrough\")\n        ?.textContent?.trim();\n\n      const wrapperUri = adElement\n        .querySelector(\"VASTAdTagURI\")\n        ?.textContent?.trim();\n      if (wrapperUri) {\n        return {\n          type: \"wrapper\",\n          vastAdTagUri: wrapperUri,\n          trackingUrls: extractTrackingUrls(adElement),\n          clickThrough,\n        };\n      }\n\n      const isNoAdAvailable =\n        adId === \"empty\" ||\n        title.toLowerCase().includes(\"no ad available\") ||\n        title.toLowerCase() === \"no ad available\";\n\n      const durationText =\n        adElement.querySelector(\"Duration\")?.textContent || \"00:00:30\";\n      const durationParts = durationText.split(\":\");\n      const duration =\n        parseInt(durationParts[0] || \"0\", 10) * 3600 +\n        parseInt(durationParts[1] || \"0\", 10) * 60 +\n        parseInt(durationParts[2] || \"0\", 10);\n\n      const mediaFileElements = adElement.querySelectorAll(\"MediaFile\");\n      const mediaFiles: VastMediaFile[] = [];\n\n      mediaFileElements.forEach((mf) => {\n        const type = mf.getAttribute(\"type\") || \"\";\n        const url = mf.textContent?.trim() || \"\";\n        const width = mf.getAttribute(\"width\") || \"\";\n        const height = mf.getAttribute(\"height\") || \"\";\n\n        if (!url) return;\n\n        const bitrateAttr = mf.getAttribute(\"bitrate\");\n        const bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : undefined;\n\n        const mediaFile: VastMediaFile = {\n          url,\n          type,\n          width: parseInt(width || \"1920\", 10),\n          height: parseInt(height || \"1080\", 10),\n          bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : undefined,\n        };\n\n        if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n          mediaFiles.push(mediaFile);\n        }\n      });\n\n      if (mediaFiles.length === 0) {\n        if (isNoAdAvailable) {\n          console.warn(\n            \"[HlsAdPlayer] Pod <Ad> indicates no ad available\"\n          );\n        } else {\n          console.warn(\"[HlsAdPlayer] No supported media files in pod <Ad>\");\n        }\n        return { type: \"empty\" };\n      }\n\n      return {\n        type: \"inline\",\n        ad: {\n          id: adId,\n          title,\n          duration,\n          mediaFiles,\n          trackingUrls: extractTrackingUrls(adElement),\n          clickThrough,\n        },\n      };\n    } catch (error) {\n      console.error(\"[HlsAdPlayer] Error parsing pod <Ad> element:\", error);\n      return { type: \"empty\" };\n    }\n  }\n\n  async function fetchVastXml(\n    vastTagUrl: string,\n    credentials: RequestCredentials = \"include\"\n  ): Promise<string> {\n    const requestVast = (creds: RequestCredentials) =>\n      fetch(vastTagUrl, {\n        mode: \"cors\",\n        credentials: creds,\n        headers: {\n          \"Accept\": \"application/xml, text/xml, */*\",\n        },\n        referrerPolicy: \"no-referrer-when-downgrade\",\n      });\n\n    let response: Response;\n    try {\n      response = await requestVast(credentials);\n    } catch (error) {\n      if (credentials !== \"omit\") {\n        console.warn(\n          `[HlsAdPlayer] VAST fetch failed with credentials=\"${credentials}\", retrying without credentials:`,\n          error\n        );\n        response = await requestVast(\"omit\");\n      } else {\n        throw error;\n      }\n    }\n\n    if (!response.ok) {\n      throw new Error(`Failed to fetch VAST: ${response.statusText}`);\n    }\n    return response.text();\n  }\n\n  async function fetchAndParseVastAd(\n    vastTagUrl: string,\n    depth = 0,\n    accumulatedTracking: VastTrackingUrls = createEmptyTrackingUrls()\n  ): Promise<VastAd | null> {\n    const vastXml = await fetchVastXml(\n      vastTagUrl,\n      depth === 0 ? \"include\" : \"omit\"\n    );\n    console.log(\"[HlsAdPlayer] VAST XML received\");\n    console.log(\n      \"[HlsAdPlayer] VAST XML content (first 2000 chars):\",\n      vastXml.substring(0, 2000)\n    );\n\n    const parsed = parseVastXml(vastXml);\n\n    if (parsed.type === \"empty\") {\n      return null;\n    }\n\n    if (parsed.type === \"wrapper\") {\n      if (depth >= MAX_VAST_WRAPPER_DEPTH) {\n        console.warn(\n          `[HlsAdPlayer] VAST wrapper depth limit (${MAX_VAST_WRAPPER_DEPTH}) reached, aborting redirect chain`\n        );\n        return null;\n      }\n\n      mergeTrackingUrls(accumulatedTracking, parsed.trackingUrls);\n      return fetchAndParseVastAd(\n        parsed.vastAdTagUri,\n        depth + 1,\n        accumulatedTracking\n      );\n    }\n\n    mergeTrackingUrls(parsed.ad.trackingUrls, accumulatedTracking);\n    return parsed.ad;\n  }\n\n  async function fetchAndParsePod(vastTagUrl: string): Promise<VastAd[]> {\n    const vastXml = await fetchVastXml(vastTagUrl);\n    console.log(\"[HlsAdPlayer] Pod VAST XML received\");\n\n    const parser = new DOMParser();\n    const xmlDoc = parser.parseFromString(vastXml, \"text/xml\");\n\n    if (xmlDoc.querySelector(\"parsererror\")) {\n      console.error(\"[HlsAdPlayer] Pod VAST XML parsing error (malformed)\");\n      return [];\n    }\n\n    const adElements = Array.from(xmlDoc.querySelectorAll(\"Ad\"));\n    if (adElements.length === 0) {\n      console.warn(\"[HlsAdPlayer] No <Ad> elements found in pod VAST response\");\n      return [];\n    }\n\n    adElements.sort((a, b) => {\n      const aSeq = parseInt(a.getAttribute(\"sequence\") || \"\", 10);\n      const bSeq = parseInt(b.getAttribute(\"sequence\") || \"\", 10);\n      const aVal = Number.isFinite(aSeq) ? aSeq : Number.MAX_SAFE_INTEGER;\n      const bVal = Number.isFinite(bSeq) ? bSeq : Number.MAX_SAFE_INTEGER;\n      return aVal - bVal;\n    });\n\n    const ads: VastAd[] = [];\n    for (const adElement of adElements) {\n      const parsed = parseAdElement(adElement);\n\n      if (parsed.type === \"inline\") {\n        ads.push(parsed.ad);\n      } else if (parsed.type === \"wrapper\") {\n        try {\n          const resolved = await fetchAndParseVastAd(\n            parsed.vastAdTagUri,\n            1,\n            parsed.trackingUrls\n          );\n          if (resolved) {\n            ads.push(resolved);\n          }\n        } catch (error) {\n          console.warn(\n            \"[HlsAdPlayer] Failed to resolve wrapper <Ad> in pod:\",\n            error\n          );\n        }\n      }\n    }\n\n    console.log(`[HlsAdPlayer] Parsed ${ads.length} ad(s) from pod VAST response`);\n    return ads;\n  }\n\n  function createAdVideoElement(): HTMLVideoElement {\n    const video = document.createElement(\"video\");\n    video.style.position = \"absolute\";\n    video.style.left = \"0\";\n    video.style.top = \"0\";\n    video.style.width = \"100%\";\n    video.style.height = \"100%\";\n    video.style.objectFit = \"contain\";\n    video.style.backgroundColor = \"#000\";\n    video.playsInline = true;\n    video.muted = false;\n\n    video.volume = 1.0;\n    console.log(\n      `[HlsAdPlayer] Created ad video element with volume ${video.volume}`\n    );\n\n    return video;\n  }\n\n  function setupAdEventListeners(): void {\n    if (!adVideoElement || !currentAd) return;\n\n    adVideoElement.addEventListener(\"timeupdate\", () => {\n      if (!currentAd || !adVideoElement) return;\n\n      const progress = adVideoElement.currentTime / currentAd.duration;\n\n      if (progress >= 0.25 && !trackingFired.firstQuartile) {\n        trackingFired.firstQuartile = true;\n        fireTrackingPixels(currentAd.trackingUrls.firstQuartile);\n      }\n\n      if (progress >= 0.5 && !trackingFired.midpoint) {\n        trackingFired.midpoint = true;\n        fireTrackingPixels(currentAd.trackingUrls.midpoint);\n      }\n\n      if (progress >= 0.75 && !trackingFired.thirdQuartile) {\n        trackingFired.thirdQuartile = true;\n        fireTrackingPixels(currentAd.trackingUrls.thirdQuartile);\n      }\n    });\n\n    adVideoElement.addEventListener(\"playing\", () => {\n      if (!currentAd || trackingFired.start) return;\n      trackingFired.start = true;\n      fireTrackingPixels(currentAd.trackingUrls.start);\n      console.log(\"[HlsAdPlayer] Ad started playing\");\n    });\n\n    adVideoElement.addEventListener(\"ended\", () => {\n      if (!currentAd || trackingFired.complete) return;\n      trackingFired.complete = true;\n      fireTrackingPixels(currentAd.trackingUrls.complete);\n      console.log(\"[HlsAdPlayer] Ad completed\");\n\n      if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n        return;\n      }\n\n      handleAdComplete();\n    });\n\n    adVideoElement.addEventListener(\"error\", (e) => {\n      if (!adPlaying) return;\n      console.error(\"[HlsAdPlayer] Ad video error:\", e);\n      if (currentAd) {\n        fireTrackingPixels(currentAd.trackingUrls.error);\n      }\n\n      if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n        return;\n      }\n\n      handleAdError();\n    });\n\n    adVideoElement.addEventListener(\"volumechange\", () => {\n      if (!currentAd) return;\n      if (adVideoElement!.muted) {\n        fireTrackingPixels(currentAd.trackingUrls.mute);\n      } else {\n        fireTrackingPixels(currentAd.trackingUrls.unmute);\n      }\n    });\n\n    adVideoElement.addEventListener(\"pause\", () => {\n      if (currentAd && !adVideoElement!.ended) {\n        fireTrackingPixels(currentAd.trackingUrls.pause);\n      }\n    });\n\n    adVideoElement.addEventListener(\"play\", () => {\n      if (currentAd && adVideoElement!.currentTime > 0) {\n        fireTrackingPixels(currentAd.trackingUrls.resume);\n      }\n    });\n  }\n\n  function setAdPlayingFlag(isPlaying: boolean): void {\n    if (isPlaying) {\n      contentVideo.dataset.stormcloudAdPlaying = \"true\";\n    } else {\n      delete contentVideo.dataset.stormcloudAdPlaying;\n    }\n  }\n\n  function resetQuartileTracking(preserveImpression: boolean): void {\n    trackingFired = {\n      impression: preserveImpression ? trackingFired.impression : false,\n      start: false,\n      firstQuartile: false,\n      midpoint: false,\n      thirdQuartile: false,\n      complete: false,\n    };\n  }\n\n  function loadCurrentAdMedia(): void {\n    if (!adVideoElement || !currentAd) {\n      throw new Error(\"No ad video element or ad to load\");\n    }\n\n    const mediaFile = selectBestMediaFile(currentAd.mediaFiles);\n    if (!mediaFile) {\n      throw new Error(\"No media file available for ad\");\n    }\n\n    const isHlsAd = isHlsMediaFile(mediaFile);\n    console.log(\n      `[HlsAdPlayer] Loading ${isHlsAd ? \"HLS\" : \"progressive\"} ad (pod ${podIndex + 1}/${podAds.length || 1}) from: ${mediaFile.url}`\n    );\n\n    if (isHlsAd && Hls.isSupported()) {\n      if (adHls) {\n        adHls.destroy();\n      }\n\n      adHls = new Hls({\n        enableWorker: true,\n        lowLatencyMode: false,\n      });\n\n      adHls.loadSource(mediaFile.url);\n      adHls.attachMedia(adVideoElement);\n\n      adHls.on(Hls.Events.MANIFEST_PARSED, () => {\n        console.log(\"[HlsAdPlayer] HLS manifest parsed, starting playback\");\n        adVideoElement!.play().catch((error) => {\n          console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n          handleAdError();\n        });\n      });\n\n      adHls.on(Hls.Events.ERROR, (_event, data) => {\n        console.error(\"[HlsAdPlayer] HLS error:\", data);\n        if (data.fatal) {\n          handleAdError();\n        }\n      });\n    } else if (\n      isHlsAd &&\n      adVideoElement.canPlayType(\"application/vnd.apple.mpegurl\")\n    ) {\n      adVideoElement.src = mediaFile.url;\n      adVideoElement.play().catch((error) => {\n        console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n        handleAdError();\n      });\n    } else if (!isHlsAd && isProgressiveMediaFile(mediaFile)) {\n      if (adHls) {\n        adHls.destroy();\n        adHls = undefined;\n      }\n\n      adVideoElement.src = mediaFile.url;\n      adVideoElement.load();\n      adVideoElement.play().catch((error) => {\n        console.error(\"[HlsAdPlayer] Error starting progressive ad playback:\", error);\n        handleAdError();\n      });\n    } else {\n      throw new Error(`Unsupported ad media file type: ${mediaFile.type}`);\n    }\n  }\n\n  function advanceToNextPodAd(): boolean {\n    if (podIndex >= podAds.length - 1) {\n      return false;\n    }\n\n    podIndex++;\n    currentAd = podAds[podIndex];\n    resetQuartileTracking(false);\n\n    if (currentAd) {\n      fireTrackingPixels(currentAd.trackingUrls.impression);\n      trackingFired.impression = true;\n      console.log(\n        `[HlsAdPlayer] Advancing to next pod ad (${podIndex + 1}/${podAds.length}): ${currentAd.title}, duration: ${currentAd.duration}s`\n      );\n    }\n\n    try {\n      loadCurrentAdMedia();\n      emit(\"pod_ad_started\", { index: podIndex, total: podAds.length });\n      return true;\n    } catch (error) {\n      console.error(\"[HlsAdPlayer] Failed to load next pod ad:\", error);\n      return false;\n    }\n  }\n\n  function handleAdComplete(): void {\n    console.log(\"[HlsAdPlayer] Handling ad completion\");\n    adPlaying = false;\n    setAdPlayingFlag(false);\n\n    contentVideo.muted = true;\n\n    if (adContainerEl) {\n      adContainerEl.style.display = \"none\";\n      adContainerEl.style.pointerEvents = \"none\";\n    }\n    \n    if (options?.continueLiveStreamDuringAds) {\n      if (contentVideo.paused) {\n        console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback\");\n        contentVideo.play().catch(() => {});\n      } else {\n        console.log(\"[HlsAdPlayer] Content video already playing in live mode\");\n      }\n    }\n\n    emit(\"content_resume\");\n  }\n\n  function handleAdError(): void {\n    console.log(\"[HlsAdPlayer] Handling ad error\");\n    adPlaying = false;\n    setAdPlayingFlag(false);\n\n    contentVideo.muted = true;\n\n    if (adContainerEl) {\n      adContainerEl.style.display = \"none\";\n      adContainerEl.style.pointerEvents = \"none\";\n    }\n\n    emit(\"ad_error\");\n  }\n\n  return {\n    initialize() {\n      console.log(\"[HlsAdPlayer] Initializing\");\n\n      if (!adContainerEl) {\n        const container = document.createElement(\"div\");\n        container.style.position = \"absolute\";\n        container.style.left = \"0\";\n        container.style.top = \"0\";\n        container.style.right = \"0\";\n        container.style.bottom = \"0\";\n        container.style.display = \"none\";\n        container.style.alignItems = \"center\";\n        container.style.justifyContent = \"center\";\n        container.style.pointerEvents = \"none\";\n        container.style.zIndex = \"30\";\n        container.style.backgroundColor = \"#000\";\n\n        contentVideo.parentElement?.appendChild(container);\n        adContainerEl = container;\n      }\n    },\n\n    async requestAds(vastTagUrl: string) {\n      console.log(\"[HlsAdPlayer] Requesting ads:\", vastTagUrl);\n\n      if (adPlaying) {\n        console.warn(\n          \"[HlsAdPlayer] Cannot request new ads while an ad is playing\"\n        );\n        return Promise.reject(new Error(\"Ad already playing\"));\n      }\n\n      try {\n        sessionId = generateSessionId();\n        let ads: VastAd[] = [];\n\n        if (preloadedAds.has(vastTagUrl)) {\n          const preloaded = preloadedAds.get(vastTagUrl);\n          preloadedAds.delete(vastTagUrl);\n          if (preloaded) {\n            ads = [preloaded];\n          }\n          console.log(\n            \"[HlsAdPlayer] Using preloaded VAST response:\",\n            vastTagUrl\n          );\n        } else {\n          ads = await fetchAndParsePod(vastTagUrl);\n        }\n\n        if (!ads.length) {\n          console.warn(\"[HlsAdPlayer] No ads available from VAST response\");\n          emit(\"ad_error\");\n          return Promise.reject(new Error(\"No ads available from VAST response\"));\n        }\n\n        podAds = ads;\n        podIndex = 0;\n        currentAd = ads[0];\n        console.log(\n          `[HlsAdPlayer] Pod parsed: ${ads.length} ad(s), first=\"${currentAd?.title}\", duration=${currentAd?.duration}s`\n        );\n\n        if (currentAd) {\n          fireTrackingPixels(currentAd.trackingUrls.impression);\n          trackingFired.impression = true;\n        }\n\n        return Promise.resolve();\n      } catch (error) {\n        console.error(\"[HlsAdPlayer] Error requesting ads:\", error);\n        emit(\"ad_error\");\n        return Promise.reject(error);\n      }\n    },\n    async play() {\n      if (!currentAd) {\n        console.warn(\n          \"[HlsAdPlayer] Cannot play: No ad loaded (no ads available)\"\n        );\n        return Promise.reject(new Error(\"No ad loaded\"));\n      }\n\n      console.log(\"[HlsAdPlayer] Starting ad playback\");\n\n      try {\n        if (!adVideoElement) {\n          adVideoElement = createAdVideoElement();\n          adContainerEl?.appendChild(adVideoElement);\n          setupAdEventListeners();\n        }\n\n        resetQuartileTracking(true);\n\n        const contentVolume = contentVideo.volume;\n        originalVolume = Math.max(\n          0,\n          Math.min(1, contentVolume || originalVolume)\n        );\n\n        if (!options?.continueLiveStreamDuringAds) {\n          contentVideo.pause();\n          console.log(\"[HlsAdPlayer] Content paused (VOD mode)\");\n        } else {\n          console.log(\"[HlsAdPlayer] Content continues (Live mode)\");\n        }\n\n        console.log(\"[HlsAdPlayer] FORCE MUTING main video\");\n        contentVideo.muted = true;\n        adPlaying = true;\n        setAdPlayingFlag(true);\n\n        if (adVideoElement) {\n          adVideoElement.volume = Math.max(0, Math.min(1, originalVolume));\n          adVideoElement.muted = originalMutedState;\n          console.log(\n            `[HlsAdPlayer] Set ad video volume to ${adVideoElement.volume}, muted: ${adVideoElement.muted}, originalMutedState: ${originalMutedState}, contentVolume: ${contentVolume}`\n          );\n        }\n\n        if (adContainerEl) {\n          adContainerEl.style.display = \"flex\";\n          adContainerEl.style.pointerEvents = \"auto\";\n        }\n\n        emit(\"content_pause\");\n\n        loadCurrentAdMedia();\n\n        return Promise.resolve();\n      } catch (error) {\n        console.error(\"[HlsAdPlayer] Error playing ad:\", error);\n        handleAdError();\n        return Promise.reject(error);\n      }\n    },\n    pause() {\n      if (!adPlaying || !adVideoElement) {\n        return;\n      }\n\n      try {\n        if (adVideoElement && !adVideoElement.paused) {\n          adVideoElement.pause();\n        }\n      } catch (error) {\n        console.warn(\"[HlsAdPlayer] Error pausing ad:\", error);\n      }\n    },\n    resume() {\n      if (!adPlaying || !adVideoElement) {\n        return;\n      }\n\n      try {\n        if (adVideoElement && adVideoElement.paused) {\n          adVideoElement.play().catch(() => {});\n        }\n      } catch (error) {\n        console.warn(\"[HlsAdPlayer] Error resuming ad:\", error);\n      }\n    },\n    async stop() {\n      console.log(\"[HlsAdPlayer] Stopping ad\");\n      adPlaying = false;\n      setAdPlayingFlag(false);\n\n      const previousMutedState = contentVideo.muted;\n      contentVideo.muted = originalMutedState;\n      contentVideo.volume = Math.max(0, Math.min(1, originalVolume));\n      console.log(\n        `[HlsAdPlayer] Restored mute state on stop: ${previousMutedState} -> ${originalMutedState}, volume: ${contentVideo.volume}`\n      );\n\n      if (adContainerEl) {\n        adContainerEl.style.display = \"none\";\n        adContainerEl.style.pointerEvents = \"none\";\n      }\n\n      contentVideo.style.visibility = \"visible\";\n      contentVideo.style.opacity = \"1\";\n\n      if (options?.continueLiveStreamDuringAds) {\n        if (contentVideo.paused) {\n          console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback on stop\");\n          contentVideo.play().catch(() => {});\n        }\n      }\n\n      if (adHls) {\n        adHls.destroy();\n        adHls = undefined;\n      }\n\n      if (adVideoElement) {\n        adVideoElement.pause();\n        adVideoElement.src = \"\";\n      }\n\n      currentAd = undefined;\n      podAds = [];\n      podIndex = 0;\n    },\n\n    destroy() {\n      console.log(\"[HlsAdPlayer] Destroying\");\n      destroyed = true;\n      \n      for (const timeoutId of pendingTimeouts) {\n        clearTimeout(timeoutId);\n      }\n      pendingTimeouts = [];\n      \n      adPlaying = false;\n      setAdPlayingFlag(false);\n      contentVideo.muted = originalMutedState;\n      contentVideo.volume = Math.max(0, Math.min(1, originalVolume));\n\n      if (adHls) {\n        adHls.destroy();\n        adHls = undefined;\n      }\n\n      if (adVideoElement) {\n        adVideoElement.pause();\n        adVideoElement.src = \"\";\n        adVideoElement.remove();\n        adVideoElement = undefined;\n      }\n\n      if (adContainerEl?.parentElement) {\n        adContainerEl.parentElement.removeChild(adContainerEl);\n      }\n\n      adContainerEl = undefined;\n      currentAd = undefined;\n      podAds = [];\n      podIndex = 0;\n      listeners.clear();\n      preloadedAds.clear();\n      preloadingAds.clear();\n    },\n\n    isAdPlaying() {\n      return adPlaying;\n    },\n\n    resize(width: number, height: number) {\n      console.log(`[HlsAdPlayer] Resizing to ${width}x${height}`);\n\n      if (adContainerEl) {\n        adContainerEl.style.width = `${width}px`;\n        adContainerEl.style.height = `${height}px`;\n      }\n\n      if (adVideoElement) {\n        adVideoElement.style.width = `${width}px`;\n        adVideoElement.style.height = `${height}px`;\n      }\n    },\n\n    on(event: string, listener: (payload?: any) => void) {\n      if (!listeners.has(event)) listeners.set(event, new Set());\n      listeners.get(event)!.add(listener);\n    },\n\n    off(event: string, listener: (payload?: any) => void) {\n      listeners.get(event)?.delete(listener);\n    },\n\n    updateOriginalMutedState(muted: boolean, volume?: number) {\n      const nextVolume =\n        typeof volume === \"number\" && !Number.isNaN(volume)\n          ? Math.max(0, Math.min(1, volume))\n          : originalVolume;\n      console.log(\n        `[HlsAdPlayer] updateOriginalMutedState called: { muted: ${originalMutedState} -> ${muted}, volume: ${originalVolume} -> ${nextVolume} }`\n      );\n      originalMutedState = muted;\n      originalVolume = nextVolume;\n    },\n\n    getOriginalMutedState() {\n      return originalMutedState;\n    },\n    getOriginalVolume() {\n      return originalVolume;\n    },\n\n    setAdVolume(volume: number) {\n      if (adVideoElement && adPlaying) {\n        const clamped = Math.max(0, Math.min(1, volume));\n        adVideoElement.volume = clamped;\n        adVideoElement.muted = clamped === 0;\n      }\n    },\n\n    getAdVolume(): number {\n      if (adVideoElement && adPlaying) {\n        return adVideoElement.volume;\n      }\n      return 1;\n    },\n    showPlaceholder() {\n      contentVideo.style.opacity = \"0\";\n      contentVideo.style.visibility = \"hidden\";\n      \n      if (!adContainerEl) {\n        const container = document.createElement(\"div\");\n        container.style.position = \"absolute\";\n        container.style.left = \"0\";\n        container.style.top = \"0\";\n        container.style.right = \"0\";\n        container.style.bottom = \"0\";\n        container.style.display = \"none\";\n        container.style.alignItems = \"center\";\n        container.style.justifyContent = \"center\";\n        container.style.pointerEvents = \"none\";\n        container.style.zIndex = \"10\";\n        container.style.backgroundColor = \"#000\";\n\n        contentVideo.parentElement?.appendChild(container);\n        adContainerEl = container;\n      }\n\n      if (adContainerEl) {\n        adContainerEl.style.display = \"flex\";\n        adContainerEl.style.pointerEvents = \"auto\";\n      }\n    },\n    hidePlaceholder() {\n      if (adContainerEl) {\n        adContainerEl.style.display = \"none\";\n        adContainerEl.style.pointerEvents = \"none\";\n      }\n      \n      if (!adPlaying) {\n        contentVideo.style.visibility = \"visible\";\n        contentVideo.style.opacity = \"1\";\n      }\n    },\n    getLoadedAdDuration() {\n      return currentAd?.duration;\n    },\n    getLoadedAdId() {\n      return currentAd?.id;\n    },\n    getPodAdCount() {\n      return podAds.length;\n    },\n    getPodTotalDurationMs() {\n      return podAds.reduce(\n        (total, ad) => total + (ad.duration > 0 ? ad.duration * 1000 : 0),\n        0\n      );\n    },\n  };\n}\n","declare global {\n  interface Window {\n    goog?: any;\n  }\n}\n\nconst PAL_SDK_URL =\n  \"https://imasdk.googleapis.com/pal/sdkloader/pal.js\";\n\nlet _nonceLoader: any | undefined;\nlet _palLoadPromise: Promise<void> | undefined;\n\nfunction loadPalSdk(): Promise<void> {\n  if (typeof window !== \"undefined\" && window.goog?.pal) {\n    return Promise.resolve();\n  }\n\n  if (_palLoadPromise) return _palLoadPromise;\n\n  _palLoadPromise = new Promise<void>((resolve, reject) => {\n    const existing = document.querySelector(\n      'script[data-pal=\"true\"]'\n    ) as HTMLScriptElement | null;\n\n    if (existing) {\n      if (window.goog?.pal) {\n        resolve();\n        return;\n      }\n      const timeout = setTimeout(\n        () => reject(new Error(\"PAL SDK load timeout\")),\n        10000\n      );\n      existing.addEventListener(\"load\", () => {\n        clearTimeout(timeout);\n        resolve();\n      });\n      existing.addEventListener(\"error\", () => {\n        clearTimeout(timeout);\n        reject(new Error(\"PAL SDK load failed\"));\n      });\n      return;\n    }\n\n    const script = document.createElement(\"script\");\n    script.src = PAL_SDK_URL;\n    script.async = true;\n    script.setAttribute(\"data-pal\", \"true\");\n    script.onload = () => resolve();\n    script.onerror = () => reject(new Error(\"PAL SDK load failed\"));\n    document.head.appendChild(script);\n  });\n\n  return _palLoadPromise;\n}\n\nfunction getOrCreateNonceLoader(): any {\n  if (_nonceLoader) return _nonceLoader;\n  const goog = window.goog;\n  const consentSettings = new goog.pal.ConsentSettings();\n  consentSettings.allowStorage = true;\n  _nonceLoader = new goog.pal.NonceLoader(consentSettings);\n  return _nonceLoader;\n}\n\nexport interface PalNonceOptions {\n  videoWidth?: number;\n  videoHeight?: number;\n  descriptionUrl?: string;\n  ppid?: string;\n  sessionId?: string;\n  adWillAutoPlay?: boolean;\n  adWillPlayMuted?: boolean;\n  playerVolume?: number;\n  continuousPlayback?: boolean;\n}\n\nexport interface PalNonceManager {\n  generateNonce(options?: PalNonceOptions): Promise<string>;\n\n  getCurrentNonce(): string;\n\n  injectNonce(vastTagUrl: string): string;\n\n  sendPlaybackStart(): void;\n\n  sendPlaybackEnd(): void;\n\n  sendAdClick(): void;\n\n  sendAdTouch(event: MouseEvent | TouchEvent): void;\n\n  reset(): void;\n}\n\nexport function createPalNonceManager(): PalNonceManager {\n  let currentNonce = \"\";\n  let currentNonceManager: any | undefined;\n\n  return {\n    async generateNonce(options: PalNonceOptions = {}): Promise<string> {\n      try {\n        await loadPalSdk();\n\n        const loader = getOrCreateNonceLoader();\n        const goog = window.goog;\n\n        const request = new goog.pal.NonceRequest();\n        request.adWillAutoPlay = options.adWillAutoPlay ?? true;\n        request.adWillPlayMuted = options.adWillPlayMuted ?? false;\n        request.playerVolume =\n          options.playerVolume ?? (request.adWillPlayMuted ? 0 : 1);\n        request.continuousPlayback = options.continuousPlayback ?? true;\n        request.descriptionUrl =\n          options.descriptionUrl ||\n          (typeof window !== \"undefined\" ? window.location.href : \"\");\n        request.iconsSupported = true;\n        request.playerType = \"StormcloudVideoPlayer\";\n        request.playerVersion = \"1.0\";\n        request.supportedApiFrameworks = \"2,7,9\";\n        request.url =\n          options.descriptionUrl ||\n          (typeof window !== \"undefined\" ? window.location.href : \"\");\n        request.videoWidth = options.videoWidth || 640;\n        request.videoHeight = options.videoHeight || 480;\n\n        if (options.ppid) request.ppid = options.ppid;\n        if (options.sessionId) request.sessionId = options.sessionId;\n\n        console.log(\"[PAL] NonceRequest before generateNonce:\", {\n          adWillAutoPlay: request.adWillAutoPlay,\n          adWillPlayMuted: request.adWillPlayMuted,\n          playerVolume: request.playerVolume,\n          continuousPlayback: request.continuousPlayback,\n          descriptionUrl: request.descriptionUrl,\n          iconsSupported: request.iconsSupported,\n          playerType: request.playerType,\n          playerVersion: request.playerVersion,\n          supportedApiFrameworks: request.supportedApiFrameworks,\n          url: request.url,\n          videoWidth: request.videoWidth,\n          videoHeight: request.videoHeight,\n          ppid: request.ppid,\n          sessionId: request.sessionId,\n        });\n\n        const manager = await loader.loadNonceManager(request);\n        currentNonceManager = manager;\n        currentNonce = manager.getNonce() as string;\n\n        console.log(\"[PAL] Nonce generated successfully\");\n        return currentNonce;\n      } catch (error) {\n        console.warn(\"[PAL] Failed to generate nonce:\", error);\n        currentNonce = \"\";\n        currentNonceManager = undefined;\n        return \"\";\n      }\n    },\n\n    getCurrentNonce(): string {\n      return currentNonce;\n    },\n\n    injectNonce(vastTagUrl: string): string {\n      if (!currentNonce || !vastTagUrl) return vastTagUrl;\n\n      try {\n        const url = new URL(vastTagUrl);\n        url.searchParams.delete(\"paln\");\n        url.searchParams.set(\"givn\", currentNonce);\n        return url.toString();\n      } catch {\n        let base = vastTagUrl\n          .replace(/([?&])paln=[^&]*/g, \"\")\n          .replace(/[?&]$/, \"\");\n        const sep = base.includes(\"?\") ? \"&\" : \"?\";\n        return `${base}${sep}givn=${encodeURIComponent(currentNonce)}`;\n      }\n    },\n\n    sendPlaybackStart(): void {\n      try {\n        currentNonceManager?.sendPlaybackStart();\n      } catch {}\n    },\n\n    sendPlaybackEnd(): void {\n      try {\n        currentNonceManager?.sendPlaybackEnd();\n      } catch {}\n    },\n\n    sendAdClick(): void {\n      try {\n        currentNonceManager?.sendAdClick();\n      } catch {}\n    },\n\n    sendAdTouch(event: MouseEvent | TouchEvent): void {\n      try {\n        currentNonceManager?.sendAdTouch(event);\n      } catch {}\n    },\n\n    reset(): void {\n      currentNonce = \"\";\n      currentNonceManager = undefined;\n    },\n  };\n}\n","export const MQTT_CA_CERT_FILE = \"src/certs/emqxsl-ca.crt\";\n\nexport type MQTTConfig = {\n  enabled: boolean;\n  brokerAddress: string;\n  brokerPort: number;\n  wsPort: number;\n  username: string;\n  password: string;\n  topicPrefix: string;\n  qos: 0 | 1 | 2;\n  brokerUrl?: string;\n};\n\nexport const DEFAULT_MQTT_CONFIG: MQTTConfig = {\n  enabled: true,\n  brokerAddress: \"vecbae77.ala.us-east-1.emqxsl.com\",\n  brokerPort: 8883,\n  wsPort: 8084,\n  username: \"for-sonifi\",\n  password: \"sonifi-mqtt\",\n  topicPrefix: \"adstorm/players\",\n  qos: 1,\n};\n\nexport const mqttConfig: MQTTConfig = { ...DEFAULT_MQTT_CONFIG };\n\nexport function applyMQTTConfig(overrides: Partial<MQTTConfig>): void {\n  Object.assign(mqttConfig, overrides);\n}\n\nexport function isMQTTEnabled(): boolean {\n  return mqttConfig.enabled;\n}\n\nexport function buildMQTTBrokerUrl(): string {\n  if (mqttConfig.brokerUrl) return mqttConfig.brokerUrl;\n  return `wss://${mqttConfig.brokerAddress}:${mqttConfig.wsPort}/mqtt`;\n}\n\nexport function buildPlayerTopic(\n  licenseKey: string,\n  channel: \"metrics\" | \"impressions\" | \"heartbeat\"\n): string {\n  return `${mqttConfig.topicPrefix}/${licenseKey}/${channel}`;\n}\n","import mqtt from \"mqtt\";\nimport type { MqttClient } from \"mqtt\";\nimport {\n  applyMQTTConfig,\n  buildMQTTBrokerUrl,\n  isMQTTEnabled,\n  mqttConfig,\n} from \"./mqttConfig\";\nimport type { MQTTConfig } from \"./mqttConfig\";\n\nconst LOG = \"[StormcloudVideoPlayer][MQTT]\";\n\nexport type MQTTStatus = \"disconnected\" | \"connecting\" | \"connected\" | \"error\";\n\nlet client: MqttClient | null = null;\nlet status: MQTTStatus = \"disconnected\";\n\nexport function getMQTTStatus(): MQTTStatus {\n  return status;\n}\n\nexport function isMQTTConnected(): boolean {\n  return status === \"connected\" && client !== null && client.connected;\n}\n\nexport function isMQTTConfigured(): boolean {\n  return isMQTTEnabled();\n}\n\nexport function configureMQTT(overrides: Partial<MQTTConfig>): void {\n  applyMQTTConfig(overrides);\n  disconnectMQTT();\n}\n\nexport function initMQTTClient(): void {\n  if (client || !isMQTTEnabled()) return;\n\n  const url = buildMQTTBrokerUrl();\n  status = \"connecting\";\n\n  const clientId = `stormcloud-vp-${Math.random().toString(36).slice(2, 9)}`;\n\n  try {\n    client = mqtt.connect(url, {\n      clientId,\n      username: mqttConfig.username,\n      password: mqttConfig.password,\n      keepalive: 60,\n      clean: true,\n      reconnectPeriod: 5000,\n      connectTimeout: 10_000,\n      queueQoSZero: false,\n    });\n  } catch (err) {\n    status = \"error\";\n    console.warn(`${LOG} connect() threw:`, err);\n    return;\n  }\n\n  client.on(\"connect\", () => {\n    status = \"connected\";\n    console.info(`${LOG} connected to ${url}`);\n  });\n\n  client.on(\"reconnect\", () => {\n    status = \"connecting\";\n    console.info(`${LOG} reconnecting…`);\n  });\n\n  client.on(\"offline\", () => {\n    status = \"disconnected\";\n    console.warn(`${LOG} offline`);\n  });\n\n  client.on(\"error\", (err) => {\n    status = \"error\";\n    console.warn(`${LOG} error:`, err.message);\n  });\n\n  client.on(\"close\", () => {\n    if (status === \"connected\") {\n      status = \"disconnected\";\n    }\n  });\n}\n\nexport function ensureMQTTClient(): void {\n  if (isMQTTEnabled() && !client) {\n    initMQTTClient();\n  }\n}\n\nexport function publishMQTT(\n  topic: string,\n  payload: Record<string, unknown>\n): boolean {\n  if (!isMQTTEnabled()) {\n    return false;\n  }\n\n  ensureMQTTClient();\n\n  if (!client) {\n    return false;\n  }\n\n  try {\n    client.publish(topic, JSON.stringify(payload), { qos: mqttConfig.qos });\n    return true;\n  } catch (err) {\n    console.warn(`${LOG} publish failed on ${topic}:`, err);\n    return false;\n  }\n}\n\nexport function disconnectMQTT(): void {\n  if (client) {\n    client.end(true);\n    client = null;\n    status = \"disconnected\";\n  }\n}\n","export interface VastEnvironmentSignals {\n  isCtv: boolean;\n  contentUrl?: string;\n  appId?: string;\n  appName?: string;\n  sessionId?: string;\n  deviceId?: string;\n  deviceIdType?: string;\n  limitAdTracking?: boolean;\n  deviceTypeHint?: number;\n}\n\nconst AIRY_ANDROID_APP_ID = \"com.freeairytv.android\";\nconst AIRY_WEBOS_APP_ID    = \"com.freeairytv.webos\";\nconst AIRY_TIZEN_APP_ID    = \"com.freeairytv.samsung\";\nconst AIRY_ROKU_APP_ID     = \"com.freeairytv.roku\";\nconst AIRY_APP_NAME = \"AiryTV Movies & TV\";\nconst AIRY_DEFAULT_CONTENT_URL = \"https://live.airy.tv\";\nconst CTV_SESSION_STORAGE_KEY = \"stormcloud.ctv.sid\";\nexport const PLAYER_ID_STORAGE_KEY = \"stormcloud.player.id\";\n\nconst LG_TEST_APP_ID      = \"com.hulu.plus\";\nconst LG_TEST_APP_NAME    = \"Hulu\";\nconst LG_TEST_CONTENT_URL = \"https://www.hulu.com/live-tv\";\n\nlet _lgTestDeviceId: string | undefined;\nfunction getLgTestDeviceId(): string {\n  if (!_lgTestDeviceId) _lgTestDeviceId = createUuid();\n  return _lgTestDeviceId;\n}\n\nfunction isLgWebOS(): boolean {\n  if (typeof navigator === \"undefined\") return false;\n  return /Web0S|webOS|LG Browser|LGSTB|LGE/i.test(navigator.userAgent);\n}\n\nfunction getDefaultAppId(): string {\n  if (typeof navigator === \"undefined\") return AIRY_ANDROID_APP_ID;\n  const ua = navigator.userAgent;\n  if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return AIRY_WEBOS_APP_ID;\n  if (/Tizen|Samsung/i.test(ua))                       return AIRY_TIZEN_APP_ID;\n  if (/Roku/i.test(ua))                                return AIRY_ROKU_APP_ID;\n  return AIRY_ANDROID_APP_ID;\n}\n\nconst DEVICE_ID_STORAGE_KEYS = [\n  \"rdid\",\n  \"ifa\",\n  \"advertisingId\",\n  \"advertising_id\",\n  \"deviceAdvertisingId\",\n  \"aaid\",\n  \"adid\",\n  \"rida\",\n  \"tifa\",\n  \"lgudid\",\n];\n\nconst ANDROID_ID_TYPES = new Set([\"aaid\", \"adid\"]);\n\nexport function resolveVastEnvironmentSignals(isCtv: boolean): VastEnvironmentSignals {\n  const bridgeSignals  = readNativeBridgeSignals();\n  const platformDevice = readPlatformNativeDeviceId();\n  const lg = isCtv && isLgWebOS();\n\n  const deviceId =\n    bridgeSignals.deviceId  ||\n    readStoredDeviceId()    ||\n    platformDevice.deviceId ||\n    (lg && platformDevice.limitAdTracking !== true ? getLgTestDeviceId() : undefined);\n  const deviceIdType =\n    bridgeSignals.deviceIdType  ||\n    readStoredString(\"deviceIdType\") ||\n    readStoredString(\"idtype\") ||\n    platformDevice.deviceIdType ||\n    inferDeviceIdType() ||\n    (lg ? \"lgudid\" : undefined);\n  const platformLat = bridgeSignals.deviceId\n    ? bridgeSignals.limitAdTracking\n    : platformDevice.limitAdTracking;\n  const limitAdTracking =\n    deviceId != null\n      ? platformLat ?? readStoredLimitAdTracking() ?? false\n      : undefined;\n\n  if (isCtv) {\n    return {\n      isCtv: true,\n      contentUrl:\n        bridgeSignals.contentUrl ||\n        readStoredString(\"contentUrl\") ||\n        (lg ? LG_TEST_CONTENT_URL : AIRY_DEFAULT_CONTENT_URL),\n      appId:\n        bridgeSignals.appId ||\n        readStoredString(\"appId\") ||\n        readStoredString(\"msid\") ||\n        (lg ? LG_TEST_APP_ID : getDefaultAppId()),\n      appName:\n        bridgeSignals.appName ||\n        readStoredString(\"appName\") ||\n        readStoredString(\"an\") ||\n        (lg ? LG_TEST_APP_NAME : AIRY_APP_NAME),\n      sessionId: getOrCreateCtvSessionId(),\n      ...(deviceId ? { deviceId } : {}),\n      ...(deviceIdType ? { deviceIdType } : {}),\n      ...(limitAdTracking != null ? { limitAdTracking } : {}),\n      deviceTypeHint: 5,\n    };\n  }\n\n  return {\n    isCtv: false,\n    ...(deviceId ? { deviceId } : {}),\n    ...(deviceIdType ? { deviceIdType } : {}),\n    ...(limitAdTracking != null ? { limitAdTracking } : {}),\n  };\n}\n\nexport function inferDeviceIdType(): string | undefined {\n  if (typeof navigator === \"undefined\") {\n    return undefined;\n  }\n\n  const ua = navigator.userAgent;\n  if (/Roku/i.test(ua)) return \"rida\";\n  if (/Tizen|Samsung/i.test(ua)) return \"tifa\";\n  if (/AppleTV|Apple TV/i.test(ua)) return \"tvOS\";\n  if (/AFT|Fire TV|Amazon/i.test(ua)) return \"afai\";\n  if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return \"lgudid\";\n  if (/Android|Google TV/i.test(ua)) return \"aaid\";\n  if (/iPhone|iPad|iPod/i.test(ua)) return \"idfa\";\n  return undefined;\n}\n\nexport function isEquivalentDeviceIdType(\n  tagType: string | undefined,\n  runtimeType: string | undefined\n): boolean {\n  if (!tagType || !runtimeType) return false;\n  const tag = tagType.toLowerCase();\n  const runtime = runtimeType.toLowerCase();\n  if (tag === runtime) return true;\n  return ANDROID_ID_TYPES.has(tag) && ANDROID_ID_TYPES.has(runtime);\n}\n\nexport function resolveNativeDeviceId(): string | undefined {\n  const bridgeSignals = readNativeBridgeSignals();\n  const platformDevice = readPlatformNativeDeviceId();\n  const deviceId =\n    bridgeSignals.deviceId ||\n    readStoredDeviceId() ||\n    platformDevice.deviceId;\n\n  if (!deviceId || isMacroPlaceholder(deviceId) || isZeroedAdId(deviceId)) {\n    return undefined;\n  }\n\n  return deviceId;\n}\n\nexport function getOrCreateStoredUuid(storageKey: string): string | undefined {\n  if (typeof window === \"undefined\") {\n    return undefined;\n  }\n\n  const existing = readPersistentId(storageKey);\n  if (existing) {\n    writePersistentId(storageKey, existing);\n    return existing;\n  }\n\n  const id = createUuid();\n  writePersistentId(storageKey, id);\n  return id;\n}\n\nfunction getOrCreateCtvSessionId(): string {\n  const existing = readPersistentId(CTV_SESSION_STORAGE_KEY);\n  if (existing) {\n    writePersistentId(CTV_SESSION_STORAGE_KEY, existing);\n    return existing;\n  }\n\n  const sessionId = createUuid();\n  writePersistentId(CTV_SESSION_STORAGE_KEY, sessionId);\n  return sessionId;\n}\n\nfunction readPersistentId(storageKey: string): string | undefined {\n  return readStoredString(storageKey) || readCookie(storageKey);\n}\n\nfunction writePersistentId(storageKey: string, value: string): void {\n  try {\n    window.localStorage?.setItem(storageKey, value);\n  } catch {}\n  writeCookie(storageKey, value);\n}\n\nconst PERSISTENT_ID_COOKIE_MAX_AGE = 60 * 60 * 24 * 365 * 5; // ~5 years\n\nfunction readCookie(name: string): string | undefined {\n  if (typeof document === \"undefined\") {\n    return undefined;\n  }\n\n  try {\n    const prefix = encodeURIComponent(name) + \"=\";\n    const parts = document.cookie ? document.cookie.split(\";\") : [];\n    for (const part of parts) {\n      const entry = part.trim();\n      if (entry.startsWith(prefix)) {\n        return decodeURIComponent(entry.slice(prefix.length)) || undefined;\n      }\n    }\n  } catch {}\n\n  return undefined;\n}\n\nfunction writeCookie(name: string, value: string): void {\n  if (typeof document === \"undefined\") {\n    return;\n  }\n\n  try {\n    document.cookie =\n      encodeURIComponent(name) +\n      \"=\" +\n      encodeURIComponent(value) +\n      \";path=/;max-age=\" +\n      PERSISTENT_ID_COOKIE_MAX_AGE +\n      \";SameSite=Lax\";\n  } catch {}\n}\n\nfunction createUuid(): string {\n  if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n    return crypto.randomUUID();\n  }\n\n  const bytes = new Uint8Array(16);\n  if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n    crypto.getRandomValues(bytes);\n  } else {\n    let seed = Date.now() ^ Math.floor(performanceNow() * 1e3);\n    for (let i = 0; i < 16; i++) {\n      seed = (seed * 1103515245 + 12345) & 0x7fffffff;\n      bytes[i] = (seed ^ Math.floor(Math.random() * 256)) & 0xff;\n    }\n  }\n\n  bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x40;\n  bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80;\n\n  let hex = \"\";\n  for (let i = 0; i < 16; i++) {\n    hex += (bytes[i] ?? 0).toString(16).padStart(2, \"0\");\n  }\n\n  return (\n    hex.slice(0, 8) +\n    \"-\" +\n    hex.slice(8, 12) +\n    \"-\" +\n    hex.slice(12, 16) +\n    \"-\" +\n    hex.slice(16, 20) +\n    \"-\" +\n    hex.slice(20, 32)\n  );\n}\n\nfunction performanceNow(): number {\n  try {\n    if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n      return performance.now();\n    }\n  } catch {}\n  return 0;\n}\n\nfunction readPlatformNativeDeviceId(): {\n  deviceId?: string;\n  deviceIdType?: string;\n  limitAdTracking?: boolean;\n} {\n  if (typeof window === \"undefined\") return {};\n\n  try {\n    const adinfo = (window as any).webapis?.adinfo;\n    if (adinfo) {\n      const tifa: unknown =\n        typeof adinfo.getTIFA === \"function\" ? adinfo.getTIFA() : adinfo.tifa;\n      if (typeof tifa === \"string\" && tifa && !isMacroPlaceholder(tifa)) {\n        const lat: unknown =\n          typeof adinfo.isLATEnabled === \"function\"\n            ? adinfo.isLATEnabled()\n            : undefined;\n        return {\n          deviceId: tifa,\n          deviceIdType: \"tifa\",\n          ...(typeof lat === \"boolean\" ? { limitAdTracking: lat } : {}),\n        };\n      }\n    }\n  } catch {}\n\n  try {\n    const webOSDev = (window as any).webOSDev;\n    if (webOSDev) {\n      const lgudid: unknown =\n        typeof webOSDev.LGUDID === \"function\"\n          ? webOSDev.LGUDID()\n          : webOSDev.lgudid ?? webOSDev.LGUDID;\n      if (typeof lgudid === \"string\" && lgudid) {\n        if (isZeroedAdId(lgudid)) {\n          return { deviceIdType: \"lgudid\", limitAdTracking: true };\n        }\n        if (!isMacroPlaceholder(lgudid)) {\n          return { deviceId: lgudid, deviceIdType: \"lgudid\", limitAdTracking: false };\n        }\n      }\n    }\n  } catch {}\n\n  try {\n    const roku = (window as any).Roku;\n    if (roku) {\n      const rida: unknown =\n        typeof roku.getPublisherUniqueId === \"function\"\n          ? roku.getPublisherUniqueId()\n          : roku.rida;\n      if (typeof rida === \"string\" && rida && !isMacroPlaceholder(rida)) {\n        return { deviceId: rida, deviceIdType: \"rida\", limitAdTracking: false };\n      }\n    }\n  } catch {}\n\n  return {};\n}\n\nconst ZEROED_AD_ID_PATTERNS: ReadonlySet<string> = new Set([\n  \"38400000-8cf0-11bd-b23e-10b96e40000d\",\n  \"00000000-0000-0000-0000-000000000000\",\n]);\n\nfunction isMacroPlaceholder(value: string): boolean {\n  const t = value.trim();\n  return !t ||\n    /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/.test(t) ||\n    /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(t) ||\n    ZEROED_AD_ID_PATTERNS.has(t.toLowerCase());\n}\n\nfunction isZeroedAdId(value: string): boolean {\n  return ZEROED_AD_ID_PATTERNS.has(value.trim().toLowerCase());\n}\n\nfunction readNativeBridgeSignals(): {\n  contentUrl?: string;\n  appId?: string;\n  appName?: string;\n  deviceId?: string;\n  deviceIdType?: string;\n  limitAdTracking?: boolean;\n} {\n  if (typeof window === \"undefined\") {\n    return {};\n  }\n\n  const candidates = [\n    (window as any).__STORMCLOUD_CTV_AD_INFO__,\n    (window as any).__STORMCLOUD_CTV__,\n    (window as any).stormcloudCtv,\n    (window as any).AiryTV,\n    (window as any).Android,\n    (window as any).webOS,\n    (window as any).tizen,\n    (window as any).amazon,\n  ].filter(Boolean);\n\n  for (const source of candidates) {\n    const contentUrl =\n      readBridgeValue(source, [\"contentUrl\", \"url\", \"videoUrl\", \"canonicalUrl\"]) ||\n      undefined;\n    const appId =\n      readBridgeValue(source, [\"appId\", \"msid\", \"applicationId\", \"packageName\"]) ||\n      undefined;\n    const appName =\n      readBridgeValue(source, [\"appName\", \"an\", \"applicationName\"]) || undefined;\n    const deviceId =\n      readBridgeValue(source, [\n        \"rdid\",\n        \"ifa\",\n        \"advertisingId\",\n        \"adId\",\n        \"deviceId\",\n        \"lgudid\",\n        \"LGUDID\",\n        \"tifa\",\n        \"rida\",\n        \"afai\",\n        \"aaid\",\n      ]) || undefined;\n\n    if (!contentUrl && !deviceId && !appId && !appName) continue;\n\n    const deviceIdType =\n      readBridgeValue(source, [\n        \"idtype\",\n        \"deviceIdType\",\n        \"advertisingIdType\",\n        \"idType\",\n      ]) || inferDeviceIdType();\n    const limitAdTracking = readBridgeBoolean(source, [\n      \"is_lat\",\n      \"limitAdTracking\",\n      \"limitedAdTracking\",\n      \"lat\",\n    ]);\n\n    return {\n      ...(contentUrl ? { contentUrl } : {}),\n      ...(appId ? { appId } : {}),\n      ...(appName ? { appName } : {}),\n      ...(deviceId ? { deviceId } : {}),\n      ...(deviceId && deviceIdType ? { deviceIdType } : {}),\n      ...(deviceId && limitAdTracking != null ? { limitAdTracking } : {}),\n    };\n  }\n\n  return {};\n}\n\nfunction readBridgeValue(source: any, keys: string[]): string | undefined {\n  for (const key of keys) {\n    const value = source?.[key];\n    if (typeof value === \"string\" && value) {\n      return value;\n    }\n    if (typeof value === \"function\") {\n      try {\n        const result = value.call(source);\n        if (typeof result === \"string\" && result) {\n          return result;\n        }\n      } catch {}\n    }\n  }\n  return undefined;\n}\n\nfunction readBridgeBoolean(source: any, keys: string[]): boolean | undefined {\n  for (const key of keys) {\n    const value = source?.[key];\n    const normalized = normalizeBoolean(value);\n    if (normalized != null) {\n      return normalized;\n    }\n    if (typeof value === \"function\") {\n      try {\n        const result = normalizeBoolean(value.call(source));\n        if (result != null) {\n          return result;\n        }\n      } catch {}\n    }\n  }\n  return undefined;\n}\n\nfunction readStoredDeviceId(): string | undefined {\n  for (const key of DEVICE_ID_STORAGE_KEYS) {\n    const value = readStoredString(key);\n    if (value) {\n      return value;\n    }\n  }\n  return undefined;\n}\n\nfunction readStoredString(key: string): string | undefined {\n  if (typeof window === \"undefined\") {\n    return undefined;\n  }\n\n  try {\n    const value = window.localStorage?.getItem(key);\n    return value || undefined;\n  } catch {\n    return undefined;\n  }\n}\n\nfunction readStoredLimitAdTracking(): boolean | undefined {\n  return normalizeBoolean(\n    readStoredString(\"limitAdTracking\") ||\n      readStoredString(\"limitedAdTracking\") ||\n      readStoredString(\"is_lat\")\n  );\n}\n\nfunction normalizeBoolean(value: unknown): boolean | undefined {\n  if (typeof value === \"boolean\") {\n    return value;\n  }\n  if (typeof value === \"number\") {\n    return value === 1;\n  }\n  if (typeof value === \"string\") {\n    const normalized = value.toLowerCase();\n    if (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\") {\n      return true;\n    }\n    if (normalized === \"0\" || normalized === \"false\" || normalized === \"no\") {\n      return false;\n    }\n  }\n  return undefined;\n}\n","import type {\n  ClientInfo,\n  AdDetectInfo,\n  AdLoadedInfo,\n  AdImpressionInfo,\n  PlayerAnalyticsContext,\n  StormcloudVideoPlayerConfig,\n} from \"../types\";\n\nimport { buildPlayerTopic, isMQTTEnabled } from \"./mqttConfig\";\nimport { ensureMQTTClient, publishMQTT } from \"./mqttClient\";\nimport {\n  getOrCreateStoredUuid,\n  PLAYER_ID_STORAGE_KEY,\n  resolveNativeDeviceId,\n} from \"./vastEnvironmentSignals\";\n\nlet cachedBrowserId: string | null = null;\n\nexport function buildAnalyticsContext(\n  config: Pick<StormcloudVideoPlayerConfig, \"debugAdTiming\" | \"isLiveStream\">\n): PlayerAnalyticsContext {\n  const context: PlayerAnalyticsContext = {};\n  if (config.debugAdTiming) {\n    context.debugAdTiming = true;\n  }\n  if (config.isLiveStream !== undefined) {\n    context.inputStreamType = config.isLiveStream ? \"live\" : \"vod\";\n  }\n  return context;\n}\n\nexport function getClientInfo(): ClientInfo {\n  const ua = navigator.userAgent;\n  const platform = navigator.platform;\n  const vendor = navigator.vendor || \"\";\n  const maxTouchPoints = navigator.maxTouchPoints || 0;\n  const memory = (navigator as any).deviceMemory || null;\n  const hardwareConcurrency = navigator.hardwareConcurrency || 1;\n\n  const screenInfo = {\n    width: screen?.width,\n    height: screen?.height,\n    availWidth: screen?.availWidth,\n    availHeight: screen?.availHeight,\n    orientation: (screen?.orientation as any)?.type || \"\",\n    pixelDepth: screen?.pixelDepth,\n  };\n\n  let deviceType: \"tv\" | \"mobile\" | \"tablet\" | \"desktop\" = \"desktop\";\n  let brand = \"Unknown\";\n  let os = \"Unknown\";\n  let model = \"\";\n  let isSmartTV = false;\n  let isAndroid = false;\n  let isWebView = false;\n  let isWebApp = false;\n\n  if (ua.includes(\"Web0S\")) {\n    brand = \"LG\";\n    os = \"webOS\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n    const webosMatch = ua.match(/Web0S\\/([^\\s]+)/);\n    model = webosMatch ? `webOS ${webosMatch[1]}` : \"webOS TV\";\n  } else if (ua.includes(\"Tizen\")) {\n    brand = \"Samsung\";\n    os = \"Tizen\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n    const tizenMatch = ua.match(/Tizen\\/([^\\s]+)/);\n    const tvMatch = ua.match(/(?:Smart-TV|SMART-TV|TV)/i) ? \"Smart TV\" : \"\";\n    model = tizenMatch\n      ? `Tizen ${tizenMatch[1]} ${tvMatch}`.trim()\n      : \"Tizen TV\";\n  } else if (ua.includes(\"Philips\")) {\n    brand = \"Philips\";\n    os = \"Saphi\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (ua.includes(\"Sharp\") || ua.includes(\"AQUOS\")) {\n    brand = \"Sharp\";\n    os = \"Android TV\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (\n    ua.includes(\"Android\") &&\n    (ua.includes(\"Sony\") || vendor.includes(\"Sony\"))\n  ) {\n    brand = \"Sony\";\n    os = \"Android TV\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (\n    ua.includes(\"Android\") &&\n    (ua.includes(\"NetCast\") || ua.includes(\"LG\"))\n  ) {\n    brand = \"LG\";\n    os = \"Android TV\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (ua.includes(\" Roku\") || ua.includes(\"Roku/\")) {\n    brand = \"Roku\";\n    os = \"Roku OS\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  } else if (ua.includes(\"AppleTV\")) {\n    brand = \"Apple\";\n    os = \"tvOS\";\n    isSmartTV = true;\n    deviceType = \"tv\";\n  }\n\n  if (ua.includes(\"Android\")) {\n    isAndroid = true;\n    os = \"Android\";\n    deviceType = /Mobile/.test(ua) ? \"mobile\" : \"tablet\";\n\n    if (\n      ua.includes(\"Android\") &&\n      (maxTouchPoints === 0 ||\n        ua.includes(\"Google TV\") ||\n        ua.includes(\"XiaoMi\"))\n    ) {\n      deviceType = \"tv\";\n      isSmartTV = true;\n      brand = brand === \"Unknown\" ? \"Android TV\" : brand;\n    }\n\n    const androidModelMatch = ua.match(/\\(([^)]*Android[^)]*)\\)/);\n    if (androidModelMatch && androidModelMatch[1]) {\n      model = androidModelMatch[1];\n    }\n  }\n\n  if (/iPad|iPhone|iPod/.test(ua)) {\n    os = \"iOS\";\n    deviceType = \"mobile\";\n    brand = \"Apple\";\n    if (navigator.maxTouchPoints > 1 && /iPad/.test(ua)) {\n      deviceType = \"tablet\";\n    }\n  }\n\n  if (!isAndroid && !isSmartTV && !/Mobile/.test(ua)) {\n    if (ua.includes(\"Windows\")) {\n      os = \"Windows\";\n      deviceType = \"desktop\";\n    } else if (ua.includes(\"Mac\") && !/iPhone/.test(ua)) {\n      os = \"macOS\";\n      deviceType = \"desktop\";\n      if (maxTouchPoints > 1) deviceType = \"tablet\";\n    } else if (ua.includes(\"Linux\")) {\n      os = \"Linux\";\n      deviceType = \"desktop\";\n    }\n  }\n\n  if (brand === \"Unknown\") {\n    if (vendor.includes(\"Google\") || ua.includes(\"Chrome\")) brand = \"Google\";\n    if (vendor.includes(\"Apple\")) brand = \"Apple\";\n    if (vendor.includes(\"Samsung\") || ua.includes(\"SM-\")) brand = \"Samsung\";\n  }\n\n  isWebView = /wv|WebView|Linux; U;/.test(ua);\n\n  if (window?.outerHeight === 0 && window?.outerWidth === 0) {\n    isWebView = true;\n  }\n\n  isWebApp =\n    window.matchMedia(\"(display-mode: standalone)\").matches ||\n    (window.navigator as any).standalone === true ||\n    window.screen?.orientation?.angle !== undefined;\n\n  return {\n    brand,\n    os,\n    model: model || ua.substring(0, 50) + \"...\",\n    deviceType,\n    isSmartTV,\n    isAndroid,\n    isWebView,\n    isWebApp,\n    domain: window.location.hostname,\n    origin: window.location.origin,\n    path: window.location.pathname,\n    userAgent: ua,\n    vendor,\n    platform,\n    screen: screenInfo,\n    hardwareConcurrency,\n    deviceMemory: memory,\n    maxTouchPoints,\n    language: navigator.language,\n    languages: navigator.languages?.join(\",\") || \"\",\n    cookieEnabled: navigator.cookieEnabled,\n    doNotTrack: navigator.doNotTrack || \"\",\n    referrer: document.referrer,\n    visibilityState: document.visibilityState,\n  };\n}\n\nasync function sha256Hex(input: string): Promise<string> {\n  if (typeof crypto !== \"undefined\" && crypto.subtle?.digest) {\n    try {\n      await crypto.subtle.digest(\"SHA-256\", new Uint8Array([1, 2, 3]));\n\n      let encodedData: BufferSource;\n      if (typeof TextEncoder !== \"undefined\") {\n        encodedData = new TextEncoder().encode(input);\n      } else {\n        const utf8 = unescape(encodeURIComponent(input));\n        const buffer = new Uint8Array(utf8.length);\n        for (let i = 0; i < utf8.length; i++) {\n          buffer[i] = utf8.charCodeAt(i);\n        }\n        encodedData = buffer;\n      }\n\n      const hashBuffer = await crypto.subtle.digest(\"SHA-256\", encodedData);\n      return Array.from(new Uint8Array(hashBuffer))\n        .map((b) => b.toString(16).padStart(2, \"0\"))\n        .join(\"\");\n    } catch {\n      console.warn(\n        \"[StormcloudVideoPlayer] crypto.subtle not supported, using fallback hash\"\n      );\n    }\n  }\n\n  let hash = 0;\n  for (let i = 0; i < input.length; i++) {\n    const char = input.charCodeAt(i);\n    hash = (hash << 5) - hash + char;\n    hash = hash & hash;\n  }\n\n  const fallbackHash = Math.abs(hash).toString(16).padStart(8, \"0\");\n  const timestamp = Date.now().toString(16).padStart(12, \"0\");\n  const random = Math.random().toString(16).substring(2, 14).padStart(12, \"0\");\n\n  return (fallbackHash + timestamp + random).padEnd(64, \"0\");\n}\n\nfunction resolvePlayerIdentitySeed(clientInfo: ClientInfo): string {\n  const nativeDeviceId = resolveNativeDeviceId();\n  if (nativeDeviceId) {\n    return `device:${nativeDeviceId}`;\n  }\n\n  const persistedId = getOrCreateStoredUuid(PLAYER_ID_STORAGE_KEY);\n  if (persistedId) {\n    return `persisted:${persistedId}`;\n  }\n\n  return `fingerprint:${JSON.stringify(clientInfo)}`;\n}\n\nexport async function getBrowserID(clientInfo: ClientInfo): Promise<string> {\n  if (cachedBrowserId) {\n    return cachedBrowserId;\n  }\n\n  cachedBrowserId = await sha256Hex(resolvePlayerIdentitySeed(clientInfo));\n  return cachedBrowserId;\n}\n\ntype PlayerMetricFlags = {\n  adLoaded?: boolean;\n  adDetect?: boolean;\n  captureAt?: string;\n};\n\nfunction canPublish(licenseKey: string | undefined): licenseKey is string {\n  return Boolean(isMQTTEnabled() && licenseKey);\n}\n\nasync function buildPlayerMetricEvent(\n  context: PlayerAnalyticsContext = {},\n  flags: PlayerMetricFlags = {}\n): Promise<Record<string, unknown>> {\n  const clientInfo = getClientInfo();\n\n  const debugAdTiming = !!context.debugAdTiming;\n  if (debugAdTiming) {\n    console.log(\"[StormcloudVideoPlayer] clientInfo: \", JSON.stringify(clientInfo, null, 2));\n  }\n\n  const playerId = await getBrowserID(clientInfo);\n\n  if (debugAdTiming) {\n    console.log(\"[StormcloudVideoPlayer] playerId: \", playerId);\n  }\n\n  const captureAt = flags.captureAt ?? new Date().toISOString();\n\n  return {\n    player_id: playerId,\n    device_type: clientInfo.deviceType,\n    os: clientInfo.os.toLowerCase(),\n    ad_loaded: flags.adLoaded ?? false,\n    ad_detect: flags.adDetect ?? false,\n    capture_at: captureAt,\n    ...(context.inputStreamType\n      ? { input_stream_type: context.inputStreamType }\n      : {}),\n  };\n}\n\nfunction publishTracking(\n  licenseKey: string,\n  channel: \"metrics\" | \"impressions\" | \"heartbeat\",\n  body: Record<string, unknown>\n): void {\n  ensureMQTTClient();\n  publishMQTT(buildPlayerTopic(licenseKey, channel), body);\n}\n\nexport async function sendInitialTracking(\n  licenseKey?: string,\n  context: PlayerAnalyticsContext = {}\n): Promise<void> {\n  if (!canPublish(licenseKey)) return;\n\n  try {\n    const metricEvent = await buildPlayerMetricEvent(context, {\n      adLoaded: false,\n      adDetect: false,\n    });\n\n    publishTracking(licenseKey, \"metrics\", {\n      events: [metricEvent],\n    });\n  } catch (error) {\n    console.error(\n      \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n      error\n    );\n  }\n}\n\nexport async function sendAdDetectTracking(\n  licenseKey: string | undefined,\n  adDetectInfo: AdDetectInfo,\n  context: PlayerAnalyticsContext = {}\n): Promise<void> {\n  try {\n    await sendHeartbeat(licenseKey, context, {\n      adDetect: true,\n      captureAt: adDetectInfo.timestamp,\n    });\n  } catch (error) {\n    console.error(\n      \"[StormcloudVideoPlayer] Error sending ad detect tracking:\",\n      error\n    );\n  }\n}\n\nexport async function sendAdLoadedTracking(\n  licenseKey: string | undefined,\n  adLoadedInfo: AdLoadedInfo,\n  context: PlayerAnalyticsContext = {}\n): Promise<void> {\n  try {\n    await sendHeartbeat(licenseKey, context, {\n      adLoaded: true,\n      captureAt: adLoadedInfo.timestamp,\n    });\n  } catch (error) {\n    console.error(\n      \"[StormcloudVideoPlayer] Error sending ad loaded tracking:\",\n      error\n    );\n  }\n}\n\nexport async function sendAdImpressionTracking(\n  licenseKey: string | undefined,\n  adImpressionInfo: AdImpressionInfo,\n  context: PlayerAnalyticsContext = {}\n): Promise<void> {\n  if (!canPublish(licenseKey)) return;\n\n  try {\n    const metricEvent = await buildPlayerMetricEvent(context, {\n      captureAt: adImpressionInfo.timestamp,\n    });\n\n    publishTracking(licenseKey, \"heartbeat\", metricEvent);\n    publishTracking(licenseKey, \"impressions\", {\n      events: [\n        {\n          player_id: metricEvent.player_id,\n          ad_played_count: 1,\n          ad_url: adImpressionInfo.adUrl,\n          capture_at: adImpressionInfo.timestamp,\n        },\n      ],\n    });\n  } catch (error) {\n    console.error(\n      \"[StormcloudVideoPlayer] Error sending ad impression tracking:\",\n      error\n    );\n  }\n}\n\nexport async function sendHeartbeat(\n  licenseKey?: string,\n  context: PlayerAnalyticsContext = {},\n  flags: PlayerMetricFlags = {}\n): Promise<void> {\n  if (!canPublish(licenseKey)) return;\n\n  try {\n    const heartbeatData = await buildPlayerMetricEvent(context, flags);\n    publishTracking(licenseKey, \"heartbeat\", heartbeatData);\n  } catch (error) {\n    console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n  }\n}\n","export function polyfillURLSearchParams(): void {\n  if (typeof URLSearchParams !== 'undefined') {\n    return;\n  }\n\n  class URLSearchParamsPolyfill {\n    private params: Map<string, string[]>;\n\n    constructor(init?: string | URLSearchParamsPolyfill) {\n      this.params = new Map();\n\n      if (typeof init === 'string') {\n        this.parseQueryString(init);\n      } else if (init instanceof URLSearchParamsPolyfill) {\n        init.forEach((value, key) => {\n          this.append(key, value);\n        });\n      }\n    }\n\n    private parseQueryString(query: string): void {\n      const cleanQuery = query.startsWith('?') ? query.slice(1) : query;\n      if (!cleanQuery) return;\n\n      cleanQuery.split('&').forEach((param) => {\n        const [key, value] = param.split('=');\n        if (key) {\n          const decodedKey = this.safeDecodeURIComponent(key);\n          const decodedValue = value ? this.safeDecodeURIComponent(value) : '';\n          this.append(decodedKey, decodedValue);\n        }\n      });\n    }\n\n    private safeDecodeURIComponent(str: string): string {\n      try {\n        return decodeURIComponent(str.replace(/\\+/g, ' '));\n      } catch (e) {\n        return str;\n      }\n    }\n\n    append(name: string, value: string): void {\n      const values = this.params.get(name) || [];\n      values.push(String(value));\n      this.params.set(name, values);\n    }\n\n    delete(name: string): void {\n      this.params.delete(name);\n    }\n\n    get(name: string): string | null {\n      const values = this.params.get(name);\n      return values && values.length > 0 && values[0] !== undefined ? values[0] : null;\n    }\n\n    getAll(name: string): string[] {\n      return this.params.get(name) || [];\n    }\n\n    has(name: string): boolean {\n      return this.params.has(name);\n    }\n\n    set(name: string, value: string): void {\n      this.params.set(name, [String(value)]);\n    }\n\n    forEach(callback: (value: string, key: string, parent: URLSearchParamsPolyfill) => void): void {\n      this.params.forEach((values, key) => {\n        values.forEach((value) => {\n          callback(value, key, this);\n        });\n      });\n    }\n\n    toString(): string {\n      const parts: string[] = [];\n      this.params.forEach((values, key) => {\n        values.forEach((value) => {\n          parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n        });\n      });\n      return parts.join('&');\n    }\n  }\n\n  // @ts-ignore\n  window.URLSearchParams = URLSearchParamsPolyfill;\n}\n\nexport function polyfillTextEncoder(): void {\n  if (typeof TextEncoder !== 'undefined') {\n    return;\n  }\n\n  class TextEncoderPolyfill {\n    encoding = 'utf-8';\n\n    encode(str: string): Uint8Array {\n      const utf8: number[] = [];\n      for (let i = 0; i < str.length; i++) {\n        let charcode = str.charCodeAt(i);\n        if (charcode < 0x80) {\n          utf8.push(charcode);\n        } else if (charcode < 0x800) {\n          utf8.push(0xc0 | (charcode >> 6), 0x80 | (charcode & 0x3f));\n        } else if (charcode < 0xd800 || charcode >= 0xe000) {\n          utf8.push(\n            0xe0 | (charcode >> 12),\n            0x80 | ((charcode >> 6) & 0x3f),\n            0x80 | (charcode & 0x3f)\n          );\n        } else {\n          i++;\n          charcode = 0x10000 + (((charcode & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));\n          utf8.push(\n            0xf0 | (charcode >> 18),\n            0x80 | ((charcode >> 12) & 0x3f),\n            0x80 | ((charcode >> 6) & 0x3f),\n            0x80 | (charcode & 0x3f)\n          );\n        }\n      }\n      return new Uint8Array(utf8);\n    }\n  }\n\n  // @ts-ignore\n  window.TextEncoder = TextEncoderPolyfill;\n}\n\nexport function polyfillPromiseFinally(): void {\n  if (typeof Promise !== 'undefined' && !Promise.prototype.finally) {\n    Promise.prototype.finally = function (callback: () => void) {\n      const constructor = this.constructor as PromiseConstructor;\n      return this.then(\n        (value) => constructor.resolve(callback()).then(() => value),\n        (reason) =>\n          constructor.resolve(callback()).then(() => {\n            throw reason;\n          })\n      );\n    };\n  }\n}\n\nexport function polyfillObjectAssign(): void {\n  if (typeof Object.assign !== 'function') {\n    Object.assign = function (target: any, ...sources: any[]) {\n      if (target == null) {\n        throw new TypeError('Cannot convert undefined or null to object');\n      }\n\n      const to = Object(target);\n\n      for (let i = 0; i < sources.length; i++) {\n        const nextSource = sources[i];\n\n        if (nextSource != null) {\n          for (const nextKey in nextSource) {\n            if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n              to[nextKey] = nextSource[nextKey];\n            }\n          }\n        }\n      }\n\n      return to;\n    };\n  }\n}\n\nexport function polyfillArrayFrom(): void {\n  if (!Array.from) {\n    Array.from = function (arrayLike: any, mapFn?: any, thisArg?: any) {\n      const items = Object(arrayLike);\n      if (arrayLike == null) {\n        throw new TypeError('Array.from requires an array-like object');\n      }\n\n      const len = items.length >>> 0;\n      const result = new Array(len);\n\n      for (let i = 0; i < len; i++) {\n        if (mapFn) {\n          result[i] = mapFn.call(thisArg, items[i], i);\n        } else {\n          result[i] = items[i];\n        }\n      }\n\n      return result;\n    };\n  }\n}\n\nexport function polyfillStringStartsWith(): void {\n  if (!String.prototype.startsWith) {\n    String.prototype.startsWith = function (search: string, pos?: number) {\n      pos = !pos || pos < 0 ? 0 : +pos;\n      return this.substring(pos, pos + search.length) === search;\n    };\n  }\n}\n\nexport function polyfillStringEndsWith(): void {\n  if (!String.prototype.endsWith) {\n    String.prototype.endsWith = function (search: string, length?: number) {\n      if (length === undefined || length > this.length) {\n        length = this.length;\n      }\n      return this.substring(length - search.length, length) === search;\n    };\n  }\n}\n\nexport function polyfillStringIncludes(): void {\n  if (!String.prototype.includes) {\n    String.prototype.includes = function (search: string, start?: number) {\n      if (typeof start !== 'number') {\n        start = 0;\n      }\n      if (start + search.length > this.length) {\n        return false;\n      }\n      return this.indexOf(search, start) !== -1;\n    };\n  }\n}\n\nexport function initializePolyfills(): void {\n  polyfillObjectAssign();\n  polyfillArrayFrom();\n  polyfillStringStartsWith();\n  polyfillStringEndsWith();\n  polyfillStringIncludes();\n  polyfillURLSearchParams();\n  polyfillTextEncoder();\n  polyfillPromiseFinally();\n}\n\n","import {\n  inferDeviceIdType,\n  isEquivalentDeviceIdType,\n} from \"./vastEnvironmentSignals\";\n\nexport interface VastConsentSignals {\n  gdpr?: string | undefined;\n  gdprConsent?: string | undefined;\n  usPrivacy?: string | undefined;\n}\n\nexport interface VastMacroContext {\n  correlator: string;\n  streamCorrelator: string;\n  pod?: number | undefined;\n  podMaxAds?: number | undefined;\n  podMinDurationMs?: number | undefined;\n  podMaxDurationMs?: number | undefined;\n  isCtv?: boolean | undefined;\n  contentUrl?: string | undefined;\n  pageUrl?: string | undefined;\n  adWillPlayMuted?: boolean | undefined;\n  adWillAutoPlay?: boolean | undefined;\n  appId?: string | undefined;\n  appName?: string | undefined;\n  sessionId?: string | undefined;\n  deviceId?: string | undefined;\n  deviceIdType?: string | undefined;\n  limitAdTracking?: boolean | undefined;\n  deviceTypeHint?: number | undefined;\n  adTest?: boolean | undefined;\n  consent?: VastConsentSignals | undefined;\n}\n\nconst UNEXPANDED_MACRO_PATTERN = /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/;\nconst INVALID_VAST_PARAM_KEY = /^\\s|\\s$/;\nconst EXAMPLE_COM_URL = /example\\.com/i;\nconst CTV_UNSUPPORTED_PARAMS = [\n  \"description_url\",\n  \"tfcd\",\n  \"npa\",\n  \"min_ad_duration\",\n  \"max_ad_duration\",\n  \"unviewed_position_start\",\n  \"impl\",\n  \"vad_type\",\n  \"gdpr\",\n  \"gdpr_consent\",\n  \"us_privacy\",\n];\n\nconst INLINE_DEVICE_MACRO_REPLACEMENTS: Array<{\n  pattern: RegExp;\n  getValue: (ctx: VastMacroContext) => string | undefined;\n}> = [\n  { pattern: /\\[RDID\\]/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\[IFA\\]/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\[ADVERTISING[_-]?ID(?:ENTIFIER)?\\]/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\[DEVICE[_-]?ID\\]/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\[IDTYPE\\]/gi, getValue: (ctx) => ctx.deviceIdType },\n  { pattern: /\\{rdid\\}/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\{device[_-]?id\\}/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /\\{idtype\\}/gi, getValue: (ctx) => ctx.deviceIdType },\n  { pattern: /%%ADVERTISING_IDENTIFIER_PLAIN%%/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /%%ADVERTISING_ID_OPT_OUT%%/gi, getValue: (ctx) =>\n      ctx.limitAdTracking != null ? (ctx.limitAdTracking ? \"1\" : \"0\") : undefined },\n  { pattern: /%%ADVERTISING_ID_TYPE%%/gi, getValue: (ctx) => ctx.deviceIdType },\n  { pattern: /%%ADVERTISING_ID%%/gi, getValue: (ctx) => ctx.deviceId },\n  { pattern: /%%LIMIT_AD_TRACKING%%/gi, getValue: (ctx) =>\n      ctx.limitAdTracking != null ? (ctx.limitAdTracking ? \"1\" : \"0\") : undefined },\n  { pattern: /%%MSID%%/gi, getValue: (ctx) => ctx.appId },\n  { pattern: /%%APP_NAME%%/gi, getValue: (ctx) => ctx.appName },\n  { pattern: /%%SESSION_ID%%/gi, getValue: (ctx) => ctx.sessionId },\n  { pattern: /%%CORRELATOR%%/gi, getValue: (ctx) => ctx.correlator },\n];\n\nexport function isMacroPlaceholder(value: string | null | undefined): boolean {\n  if (value == null) return true;\n  const trimmed = value.trim();\n  if (!trimmed) return true;\n  if (UNEXPANDED_MACRO_PATTERN.test(trimmed)) return true;\n  return /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(trimmed);\n}\n\nexport function generateCorrelator(): string {\n  if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n    try {\n      const buf = new Uint32Array(2);\n      crypto.getRandomValues(buf);\n      const value = (buf[0] ?? 0) * 0x200000 + ((buf[1] ?? 0) & 0x1fffff);\n      if (value > 0) {\n        return String(value);\n      }\n    } catch {\n    }\n  }\n  return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);\n}\n\nfunction expandInlineMacroPlaceholders(baseUrl: string, ctx: VastMacroContext): string {\n  let url = baseUrl;\n  for (const { pattern, getValue } of INLINE_DEVICE_MACRO_REPLACEMENTS) {\n    const value = getValue(ctx);\n    if (value != null && value !== \"\") {\n      url = url.replace(pattern, encodeURIComponent(value));\n    }\n  }\n  return url;\n}\n\nfunction applyDeviceIdentityParams(\n  params: URLSearchParams,\n  ctx: VastMacroContext\n): void {\n  const runtimeId = ctx.deviceId?.trim();\n  const runtimeType = ctx.deviceIdType?.trim() || inferDeviceIdType();\n  const tagRdid = params.get(\"rdid\");\n  const tagType = params.get(\"idtype\");\n  const tagLat = params.get(\"is_lat\");\n  const latValue =\n    ctx.limitAdTracking != null ? (ctx.limitAdTracking ? \"1\" : \"0\") : undefined;\n\n  if (runtimeId) {\n    params.set(\"rdid\", runtimeId);\n    params.set(\"idtype\", runtimeType || tagType || \"aaid\");\n    params.set(\"is_lat\", latValue ?? (isMacroPlaceholder(tagLat) ? \"0\" : tagLat!));\n    return;\n  }\n\n  const tagRdidValid = Boolean(tagRdid && !isMacroPlaceholder(tagRdid));\n  const tagTypeValid = Boolean(tagType && !isMacroPlaceholder(tagType));\n\n  if (\n    tagRdidValid &&\n    tagTypeValid &&\n    runtimeType &&\n    !isEquivalentDeviceIdType(tagType!, runtimeType)\n  ) {\n    params.delete(\"rdid\");\n    params.delete(\"idtype\");\n    params.delete(\"is_lat\");\n    return;\n  }\n\n  if (tagRdidValid) {\n    if (isMacroPlaceholder(tagType) && runtimeType) {\n      params.set(\"idtype\", runtimeType);\n    }\n    if (isMacroPlaceholder(tagLat)) {\n      params.set(\"is_lat\", latValue ?? \"0\");\n    }\n    return;\n  }\n\n  params.delete(\"rdid\");\n  params.delete(\"idtype\");\n  params.delete(\"is_lat\");\n}\n\nfunction removeBrokenAppNameOrphans(\n  params: URLSearchParams,\n  appName?: string\n): void {\n  const toDelete: string[] = [];\n\n  params.forEach((_value, key) => {\n    if (!key || INVALID_VAST_PARAM_KEY.test(key)) {\n      toDelete.push(key);\n    }\n  });\n\n  if (appName && appName.includes(\"&\")) {\n    for (const suffix of appName.split(\"&\").slice(1)) {\n      const trimmed = suffix.trimStart();\n      if (!trimmed) continue;\n      toDelete.push(suffix, ` ${trimmed}`, trimmed);\n    }\n  }\n\n  for (const key of new Set(toDelete)) {\n    if (key) params.delete(key);\n  }\n}\n\nexport function normalizeVastTagUrl(raw: string): string {\n  if (!raw) return raw;\n\n  try {\n    const url = new URL(raw);\n\n    const anValue = url.searchParams.get(\"an\");\n    if (anValue !== null) {\n      const orphanFragments: string[] = [];\n      url.searchParams.forEach((_value, key) => {\n        if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n          orphanFragments.push(key.trim());\n        }\n      });\n      if (orphanFragments.length > 0) {\n        const reconstructed = [anValue.trimEnd(), ...orphanFragments]\n          .filter(Boolean)\n          .join(\" & \");\n\n        url.searchParams.forEach((_value, key) => {\n          if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n            url.searchParams.delete(key);\n          }\n        });\n        url.searchParams.set(\"an\", reconstructed);\n\n        return url.toString().replace(\n          /([?&]an=)([^&]*)/,\n          (_match, prefix, val) => prefix + val.replace(/\\+/g, \"%20\")\n        );\n      }\n    }\n\n    removeBrokenAppNameOrphans(url.searchParams);\n    return url.toString();\n  } catch {\n    return raw;\n  }\n}\n\nexport function applyVastMacros(\n  baseUrl: string,\n  ctx: VastMacroContext\n): string {\n  const expandedUrl = expandInlineMacroPlaceholders(baseUrl, ctx);\n  let url: URL;\n  try {\n    url = new URL(normalizeVastTagUrl(expandedUrl));\n  } catch {\n    return replaceCorrelatorFallback(expandedUrl, ctx.correlator);\n  }\n\n  const params = url.searchParams;\n\n  removeBrokenAppNameOrphans(params, ctx.appName);\n\n  params.set(\"correlator\", ctx.correlator);\n  params.set(\"scor\", ctx.streamCorrelator);\n  if (ctx.isCtv) {\n    for (const key of CTV_UNSUPPORTED_PARAMS) {\n      params.delete(key);\n    }\n  }\n\n  if (ctx.pod != null) {\n    params.set(\"pod\", String(ctx.pod));\n  }\n\n  params.delete(\"ppos\");\n  params.delete(\"lip\");\n  if (ctx.podMinDurationMs != null) {\n    params.set(\"pmnd\", String(Math.max(0, Math.round(ctx.podMinDurationMs))));\n  }\n  if (ctx.podMaxDurationMs != null) {\n    params.set(\"pmxd\", String(Math.max(0, Math.round(ctx.podMaxDurationMs))));\n  }\n  if (ctx.podMaxAds != null) {\n    params.set(\"pmad\", String(Math.max(1, Math.round(ctx.podMaxAds))));\n  }\n\n  const requestUrl = ctx.contentUrl || ctx.pageUrl;\n  if (requestUrl) {\n    params.set(\"url\", requestUrl);\n    if (!ctx.isCtv) {\n      params.set(\"description_url\", requestUrl);\n    }\n  } else {\n    const existingUrl = params.get(\"url\") || \"\";\n    if (EXAMPLE_COM_URL.test(existingUrl)) {\n      params.delete(\"url\");\n      params.delete(\"description_url\");\n    }\n  }\n\n  if (ctx.adWillPlayMuted != null) {\n    params.set(\"vpmute\", ctx.adWillPlayMuted ? \"1\" : \"0\");\n  }\n  if (ctx.adWillAutoPlay != null) {\n    params.set(\"vpa\", ctx.adWillAutoPlay ? \"auto\" : \"click\");\n  }\n\n  if (ctx.appId) {\n    params.set(\"msid\", ctx.appId);\n  }\n  if (ctx.appName) {\n    removeBrokenAppNameOrphans(params, ctx.appName);\n    params.set(\"an\", ctx.appName);\n  }\n  if (ctx.sessionId) {\n    params.set(\"sid\", ctx.sessionId);\n  }\n  if (ctx.deviceTypeHint != null) {\n    params.set(\"dth\", String(ctx.deviceTypeHint));\n  } else if (ctx.isCtv) {\n    params.set(\"dth\", \"5\");\n  }\n\n  applyDeviceIdentityParams(params, ctx);\n\n  if (!ctx.isCtv) {\n    const consent = ctx.consent;\n    if (consent?.gdpr != null) {\n      params.set(\"gdpr\", consent.gdpr);\n    }\n    if (consent?.gdprConsent != null) {\n      params.set(\"gdpr_consent\", consent.gdprConsent);\n    }\n    if (consent?.usPrivacy != null) {\n      params.set(\"us_privacy\", consent.usPrivacy);\n    }\n  }\n\n  if (ctx.adTest) {\n    params.set(\"adtest\", \"on\");\n  }\n\n  const staleKeys: string[] = [];\n  params.forEach((value, key) => {\n    if (isMacroPlaceholder(value)) {\n      staleKeys.push(key);\n    }\n  });\n  for (const key of staleKeys) {\n    params.delete(key);\n  }\n\n  removeBrokenAppNameOrphans(params, ctx.appName);\n\n  return url.toString();\n}\n\nfunction replaceCorrelatorFallback(baseUrl: string, correlator: string): string {\n  const correlatorRegex = /([?&])correlator=([^&]*)/;\n  if (correlatorRegex.test(baseUrl)) {\n    return baseUrl.replace(correlatorRegex, `$1correlator=${correlator}`);\n  }\n  const sep = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n  return `${baseUrl}${sep}correlator=${correlator}`;\n}\n\nexport function fetchConsentSignals(\n  timeoutMs: number = 1500\n): Promise<VastConsentSignals> {\n  const signals: VastConsentSignals = {};\n  if (typeof window === \"undefined\") {\n    return Promise.resolve(signals);\n  }\n\n  const tasks: Promise<void>[] = [];\n\n  const tcfApi = (window as any).__tcfapi;\n  if (typeof tcfApi === \"function\") {\n    tasks.push(\n      new Promise<void>((resolve) => {\n        let settled = false;\n        try {\n          tcfApi(\"addEventListener\", 2, (tcData: any, success: boolean) => {\n            if (settled) return;\n            if (\n              success &&\n              tcData &&\n              (tcData.eventStatus === \"tcloaded\" ||\n                tcData.eventStatus === \"useractioncomplete\")\n            ) {\n              settled = true;\n              signals.gdpr = tcData.gdprApplies ? \"1\" : \"0\";\n              if (typeof tcData.tcString === \"string\" && tcData.tcString) {\n                signals.gdprConsent = tcData.tcString;\n              }\n              try {\n                tcfApi(\"removeEventListener\", 2, () => {}, tcData.listenerId);\n              } catch {}\n              resolve();\n            }\n          });\n        } catch {\n          resolve();\n        }\n        setTimeout(() => {\n          if (!settled) {\n            settled = true;\n            resolve();\n          }\n        }, timeoutMs);\n      })\n    );\n  }\n\n  const uspApi = (window as any).__uspapi;\n  if (typeof uspApi === \"function\") {\n    tasks.push(\n      new Promise<void>((resolve) => {\n        try {\n          uspApi(\"getUSPData\", 1, (data: any, success: boolean) => {\n            if (success && typeof data?.uspString === \"string\" && data.uspString) {\n              signals.usPrivacy = data.uspString;\n            }\n            resolve();\n          });\n        } catch {\n          resolve();\n        }\n        setTimeout(resolve, timeoutMs);\n      })\n    );\n  }\n\n  if (tasks.length === 0) {\n    return Promise.resolve(signals);\n  }\n\n  return Promise.all(tasks).then(() => signals);\n}\n","interface NavigatorUAData {\n  platform?: string;\n  brands?: Array<{ brand: string; version: string }>;\n  mobile?: boolean;\n}\n\ndeclare global {\n  interface Navigator {\n    userAgentData?: NavigatorUAData;\n  }\n}\n\nexport interface BrowserInfo {\n  name: string;\n  version: string;\n  majorVersion: number;\n  isSmartTV: boolean;\n  isLegacyTV: boolean;\n  platform: string;\n  supportsModernJS: boolean;\n  webOSVersion?: number | undefined;\n  tizenVersion?: number | undefined;\n  chromeVersion?: number | undefined;\n}\n\nfunction getChromeVersion(ua: string): number {\n  const match = ua.match(/Chrome\\/(\\d+)/);\n  return match && match[1] ? parseInt(match[1], 10) : 0;\n}\n\nfunction getWebKitVersion(ua: string): number {\n  const match = ua.match(/AppleWebKit\\/(\\d+)/);\n  return match && match[1] ? parseInt(match[1], 10) : 0;\n}\n\nfunction getPlatform(): string {\n  if ('userAgentData' in navigator && navigator.userAgentData?.platform) {\n    return navigator.userAgentData.platform;\n  }\n\n  const ua = navigator.userAgent;\n  if (/Mac|iPhone|iPad|iPod/i.test(ua)) {\n    return /iPhone|iPad|iPod/i.test(ua) ? 'iPhone' : 'MacIntel';\n  }\n  if (/Win/i.test(ua)) {\n    return 'Win32';\n  }\n  if (/Linux/i.test(ua)) {\n    return /Android/i.test(ua) ? 'Linux armv8l' : 'Linux x86_64';\n  }\n  if (/CrOS/i.test(ua)) {\n    return 'CrOS';\n  }\n\n  // eslint-disable-next-line deprecation/deprecation\n  return (navigator as any).platform || 'Unknown';\n}\n\nexport function detectBrowser(): BrowserInfo {\n  const ua = navigator.userAgent;\n  const platform = getPlatform();\n\n  let name = 'Unknown';\n  let version = '0';\n  let majorVersion = 0;\n  let isSmartTV = false;\n  let isLegacyTV = false;\n  let supportsModernJS = true;\n  let webOSVersion: number | undefined;\n  let tizenVersion: number | undefined;\n  let chromeVersionNum: number | undefined;\n\n  const chromeVersion = getChromeVersion(ua);\n  const webkitVersion = getWebKitVersion(ua);\n  chromeVersionNum = chromeVersion > 0 ? chromeVersion : undefined;\n\n  if (/Web0S|webOS|LG Browser|LGSTB/i.test(ua)) {\n    name = 'LG WebOS';\n    isSmartTV = true;\n\n    let match = ua.match(/Web0S[/\\s]*([\\d.]+)/i) || ua.match(/webOS[/\\s]*([\\d.]+)/i);\n\n    if (!match || !match[1]) {\n      match = ua.match(/webOSTV[/\\s-]*([\\d.]+)/i) || ua.match(/webOS\\.TV[/\\s-]*([\\d.]+)/i);\n    }\n\n    if (match && match[1]) {\n      version = match[1];\n      const parts = version.split('.');\n      majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n      webOSVersion = majorVersion;\n    } else if (chromeVersion > 0) {\n      if (chromeVersion >= 79) {\n        webOSVersion = 6;\n        version = '6.0';\n        majorVersion = 6;\n      } else if (chromeVersion >= 68) {\n        webOSVersion = 5;\n        version = '5.0';\n        majorVersion = 5;\n      } else if (chromeVersion >= 53) {\n        webOSVersion = 4;\n        version = '4.0';\n        majorVersion = 4;\n      } else if (chromeVersion >= 38) {\n        webOSVersion = 3;\n        version = '3.0';\n        majorVersion = 3;\n      } else {\n        webOSVersion = 2;\n        version = '2.0';\n        majorVersion = 2;\n      }\n    } else {\n      version = 'Unknown';\n      webOSVersion = undefined;\n    }\n\n    isLegacyTV = webOSVersion !== undefined && webOSVersion < 3;\n  } else if (/Tizen/i.test(ua)) {\n    name = 'Samsung Tizen';\n    isSmartTV = true;\n    const match = ua.match(/Tizen[/\\s]*([\\d.]+)/i);\n    version = match && match[1] ? match[1] : 'Unknown';\n    if (version !== 'Unknown') {\n      const parts = version.split('.');\n      majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n      tizenVersion = majorVersion;\n    }\n\n    isLegacyTV = tizenVersion !== undefined && tizenVersion < 3;\n  } else if (/SMART-TV|SmartTV/i.test(ua)) {\n    name = 'Smart TV';\n    isSmartTV = true;\n    isLegacyTV = chromeVersion > 0 && chromeVersion < 53;\n  } else if (/NetCast/i.test(ua)) {\n    name = 'LG NetCast';\n    isSmartTV = true;\n    isLegacyTV = true;\n  } else if (/BRAVIA/i.test(ua)) {\n    name = 'Sony BRAVIA';\n    isSmartTV = true;\n    isLegacyTV = chromeVersion > 0 && chromeVersion < 53;\n  } else {\n    if (chromeVersion > 0) {\n      name = 'Chrome';\n      version = chromeVersion.toString();\n      majorVersion = chromeVersion;\n\n      if (chromeVersion < 50) {\n        supportsModernJS = false;\n      }\n    }\n\n    if (webkitVersion > 0 && webkitVersion < 600) {\n      supportsModernJS = false;\n    }\n  }\n\n  if (typeof Promise === 'undefined' ||\n      typeof Map === 'undefined' ||\n      typeof Set === 'undefined') {\n    supportsModernJS = false;\n  }\n\n  if (typeof URLSearchParams === 'undefined') {\n    supportsModernJS = false;\n  }\n\n  return {\n    name,\n    version,\n    majorVersion,\n    isSmartTV,\n    isLegacyTV,\n    platform,\n    supportsModernJS,\n    webOSVersion,\n    tizenVersion,\n    chromeVersion: chromeVersionNum,\n  };\n}\n\nexport function getBrowserConfigOverrides(): {\n  allowNativeHls?: boolean;\n} {\n  const browser = detectBrowser();\n  const overrides: { allowNativeHls?: boolean } = {};\n\n  if (browser.isSmartTV) {\n    overrides.allowNativeHls = true;\n  }\n\n  return overrides;\n}\n\nexport function supportsModernJS(): boolean {\n  try {\n    return (\n      typeof Promise !== 'undefined' &&\n      typeof Map !== 'undefined' &&\n      typeof Set !== 'undefined' &&\n      typeof Array.from !== 'undefined' &&\n      typeof Object.assign !== 'undefined' &&\n      typeof Array.prototype.forEach !== 'undefined' &&\n      typeof String.prototype.includes !== 'undefined'\n    );\n  } catch (e) {\n    return false;\n  }\n}\n\nexport function logBrowserInfo(debug: boolean = false): void {\n  if (!debug) return;\n\n  const browser = detectBrowser();\n\n  console.log('[StormcloudVideoPlayer] Browser Compatibility Info:', {\n    browser: `${browser.name} ${browser.version}`,\n    platform: browser.platform,\n    isSmartTV: browser.isSmartTV,\n    isLegacyTV: browser.isLegacyTV,\n    supportsModernJS: browser.supportsModernJS,\n    ...(browser.webOSVersion !== undefined ? { webOSVersion: browser.webOSVersion } : {}),\n    ...(browser.tizenVersion !== undefined ? { tizenVersion: browser.tizenVersion } : {}),\n    ...(browser.chromeVersion !== undefined ? { chromeVersion: browser.chromeVersion } : {}),\n    userAgent: navigator.userAgent,\n  });\n}\n\nexport function supportsFeature(feature: string): boolean {\n  switch (feature) {\n    case 'urlsearchparams':\n      return typeof URLSearchParams !== 'undefined';\n    case 'textencoder':\n      return typeof TextEncoder !== 'undefined';\n    case 'promises':\n      return typeof Promise !== 'undefined';\n    case 'fetch':\n      return typeof fetch !== 'undefined';\n    case 'crypto':\n      return typeof crypto !== 'undefined' && typeof crypto.subtle !== 'undefined';\n    default:\n      return false;\n  }\n}\n","import type { Scte35Marker, Id3TagInfo } from \"../types\";\n\nexport function parseCueOutDuration(value: string): number | undefined {\n  const num = parseFloat(value.trim());\n  if (!Number.isNaN(num)) return num;\n  const match =\n    value.match(/(?:^|[,\\s])DURATION\\s*=\\s*([0-9.]+)/i) ||\n    value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n  if (match && match[1] != null) {\n    const dStr = match[1];\n    const d = parseFloat(dStr);\n    return Number.isNaN(d) ? undefined : d;\n  }\n  return undefined;\n}\n\nexport function parseCueOutCont(\n  value: string\n): { elapsed?: number; duration?: number } | undefined {\n  const res: { elapsed?: number; duration?: number } = {};\n\n  const elapsedMatch = value.match(/Elapsed\\s*=\\s*([0-9.]+)/i);\n  const durationMatch = value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n  if (elapsedMatch && elapsedMatch[1] != null) {\n    const e = parseFloat(elapsedMatch[1]);\n    if (!Number.isNaN(e)) res.elapsed = e;\n  }\n  if (durationMatch && durationMatch[1] != null) {\n    const d = parseFloat(durationMatch[1]);\n    if (!Number.isNaN(d)) res.duration = d;\n  }\n\n  if (!(\"elapsed\" in res) || !(\"duration\" in res)) {\n    const slashMatch = value.match(/([0-9.]+)\\s*\\/\\s*([0-9.]+)/);\n    if (slashMatch && slashMatch[1] && slashMatch[2]) {\n      const elapsed = parseFloat(slashMatch[1]);\n      const duration = parseFloat(slashMatch[2]);\n      if (!Number.isNaN(elapsed) && !(\"elapsed\" in res)) res.elapsed = elapsed;\n      if (!Number.isNaN(duration) && !(\"duration\" in res)) res.duration = duration;\n    }\n  }\n\n  if (\"elapsed\" in res || \"duration\" in res) return res;\n  return undefined;\n}\n\nexport function parseAttributeList(value: string): Record<string, string> {\n  const attrs: Record<string, string> = {};\n  const regex = /([A-Z0-9-]+)=((\"[^\"]*\")|([^\",]*))(?:,|$)/gi;\n  let match: RegExpExecArray | null;\n  while ((match = regex.exec(value)) !== null) {\n    const key: string = (match[1] ?? \"\") as string;\n    let rawVal: string = (match[3] ?? match[4] ?? \"\") as string;\n    if (rawVal.startsWith('\"') && rawVal.endsWith('\"')) {\n      rawVal = rawVal.slice(1, -1);\n    }\n    if (key) {\n      attrs[key] = rawVal;\n    }\n  }\n  return attrs;\n}\n\nexport function toNumber(val: unknown): number | undefined {\n  if (val == null) return undefined;\n  const n = typeof val === \"string\" ? parseFloat(val) : Number(val);\n  return Number.isNaN(n) ? undefined : n;\n}\n\nexport function isManifestBasedMarker(marker: Scte35Marker): boolean {\n  const raw = marker.raw as any;\n  if (!raw) return false;\n\n  if (raw.tag) {\n    const tag = String(raw.tag);\n    return (\n      tag.includes(\"EXT-X-CUE-OUT\") ||\n      tag.includes(\"EXT-X-CUE-IN\") ||\n      tag.includes(\"EXT-X-DATERANGE\")\n    );\n  }\n\n  if (raw.id3) return false;\n\n  if (raw.splice_command_type) return false;\n\n  return false;\n}\n\nexport function decodeId3ValueToText(value: string | Uint8Array): string | undefined {\n  try {\n    if (typeof value === \"string\") return value;\n    const decoder = new TextDecoder(\"utf-8\", { fatal: false });\n    const text = decoder.decode(value);\n    if (text && /[\\x20-\\x7E]/.test(text)) return text;\n    let out = \"\";\n    for (let i = 0; i < value.length; i++)\n      out += String.fromCharCode(value[i]!);\n    return out;\n  } catch {\n    return undefined;\n  }\n}\n\nexport function getFragmentStartSeconds(frag: any): number | undefined {\n  const candidates = [frag?.start, frag?.startPTS];\n  for (const candidate of candidates) {\n    if (typeof candidate === \"number\" && Number.isFinite(candidate)) {\n      return candidate;\n    }\n  }\n  return undefined;\n}\n\nexport function parseScte35FromId3(tag: Id3TagInfo): Scte35Marker | undefined {\n  const text = decodeId3ValueToText(tag.value);\n  if (!text) return undefined;\n\n  const cueOutMatch =\n    text.match(/EXT-X-CUE-OUT(?::([^\\r\\n]*))?/i) ||\n    text.match(/CUE-OUT(?::([^\\r\\n]*))?/i);\n  if (cueOutMatch) {\n    const arg = (cueOutMatch[1] ?? \"\").trim();\n    const dur = parseCueOutDuration(arg);\n    const marker: Scte35Marker = {\n      type: \"start\",\n      ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n      ...(dur !== undefined ? { durationSeconds: dur } : {}),\n      raw: { id3: text },\n    } as Scte35Marker;\n    return marker;\n  }\n\n  const cueOutContMatch = text.match(/EXT-X-CUE-OUT-CONT:([^\\r\\n]*)/i);\n  if (cueOutContMatch) {\n    const arg = (cueOutContMatch[1] ?? \"\").trim();\n    const cont = parseCueOutCont(arg);\n    const marker: Scte35Marker = {\n      type: \"progress\",\n      ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n      ...(cont?.duration !== undefined\n        ? { durationSeconds: cont.duration }\n        : {}),\n      raw: { id3: text },\n    } as Scte35Marker;\n    return marker;\n  }\n\n  const cueInMatch = text.match(/EXT-X-CUE-IN\\b/i) || text.match(/CUE-IN\\b/i);\n  if (cueInMatch) {\n    const marker: Scte35Marker = {\n      type: \"end\",\n      ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n      raw: { id3: text },\n    } as Scte35Marker;\n    return marker;\n  }\n\n  const daterangeMatch = text.match(/EXT-X-DATERANGE:([^\\r\\n]*)/i);\n  if (daterangeMatch) {\n    const attrs = parseAttributeList(daterangeMatch[1] ?? \"\");\n    const hasScteOut =\n      \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== undefined;\n    const hasScteIn =\n      \"SCTE35-IN\" in attrs || attrs[\"SCTE35-IN\"] !== undefined;\n    const klass = String(attrs[\"CLASS\"] ?? \"\");\n    const duration = toNumber(attrs[\"DURATION\"]);\n    if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n      const marker: Scte35Marker = {\n        type: \"start\",\n        ...(tag.ptsSeconds !== undefined\n          ? { ptsSeconds: tag.ptsSeconds }\n          : {}),\n        ...(duration !== undefined ? { durationSeconds: duration } : {}),\n        raw: { id3: text, attrs },\n      } as Scte35Marker;\n      return marker;\n    }\n    if (hasScteIn) {\n      const marker: Scte35Marker = {\n        type: \"end\",\n        ...(tag.ptsSeconds !== undefined\n          ? { ptsSeconds: tag.ptsSeconds }\n          : {}),\n        raw: { id3: text, attrs },\n      } as Scte35Marker;\n      return marker;\n    }\n  }\n\n  if (/SCTE35-OUT/i.test(text)) {\n    const marker: Scte35Marker = {\n      type: \"start\",\n      ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n      raw: { id3: text },\n    } as Scte35Marker;\n    return marker;\n  }\n  if (/SCTE35-IN/i.test(text)) {\n    const marker: Scte35Marker = {\n      type: \"end\",\n      ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n      raw: { id3: text },\n    } as Scte35Marker;\n    return marker;\n  }\n\n  if (tag.value instanceof Uint8Array) {\n    const bin = parseScte35Binary(tag.value);\n    if (bin) return bin;\n  }\n\n  return undefined;\n}\n\nexport function normalizeFragmentPayload(payload: unknown): Uint8Array | undefined {\n  if (payload instanceof Uint8Array) {\n    return payload;\n  }\n  if (payload instanceof ArrayBuffer) {\n    return new Uint8Array(payload);\n  }\n  if (ArrayBuffer.isView(payload)) {\n    const view = payload as ArrayBufferView;\n    return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n  }\n  return undefined;\n}\n\n// --- Transport Stream SCTE-35 parsing ---\n\nexport function detectTsPacketFormat(\n  data: Uint8Array\n): { offset: number; packetSize: number; tsPayloadOffset: number } | undefined {\n  const packetSizes = [188, 192, 204];\n  for (const packetSize of packetSizes) {\n    const tsPayloadOffset = packetSize === 192 ? 4 : 0;\n    for (let offset = 0; offset < packetSize; offset++) {\n      let matchedPackets = 0;\n      for (\n        let packetStart = offset;\n        packetStart + tsPayloadOffset < data.length &&\n        matchedPackets < 5;\n        packetStart += packetSize\n      ) {\n        if (data[packetStart + tsPayloadOffset] !== 0x47) {\n          break;\n        }\n        matchedPackets++;\n      }\n      if (matchedPackets >= 2) {\n        return { offset, packetSize, tsPayloadOffset };\n      }\n    }\n  }\n  return undefined;\n}\n\nfunction getPsiSectionStart(\n  payload: Uint8Array,\n  payloadUnitStart: boolean\n): number | undefined {\n  if (!payloadUnitStart) {\n    return undefined;\n  }\n  const pointerField = payload[0];\n  if (pointerField == null) {\n    return undefined;\n  }\n  const sectionStart = 1 + pointerField;\n  return sectionStart < payload.length ? sectionStart : undefined;\n}\n\nfunction getPsiSectionLength(data: Uint8Array, offset: number): number {\n  return (((data[offset + 1] ?? 0) & 0x0f) << 8) | (data[offset + 2] ?? 0);\n}\n\nfunction parsePatSection(\n  payload: Uint8Array,\n  payloadUnitStart: boolean,\n  pmtPids: Set<number>\n): void {\n  const sectionStart = getPsiSectionStart(payload, payloadUnitStart);\n  if (sectionStart == null || sectionStart + 8 >= payload.length) {\n    return;\n  }\n  if (payload[sectionStart] !== 0x00) {\n    return;\n  }\n\n  const sectionLength = getPsiSectionLength(payload, sectionStart);\n  const sectionEnd = Math.min(\n    payload.length,\n    sectionStart + 3 + sectionLength\n  );\n\n  for (let offset = sectionStart + 8; offset + 4 <= sectionEnd - 4; offset += 4) {\n    const programNumber =\n      ((payload[offset] ?? 0) << 8) | (payload[offset + 1] ?? 0);\n    const pid =\n      (((payload[offset + 2] ?? 0) & 0x1f) << 8) |\n      (payload[offset + 3] ?? 0);\n    if (programNumber !== 0) {\n      pmtPids.add(pid);\n    }\n  }\n}\n\nfunction descriptorsIdentifyScte35(\n  data: Uint8Array,\n  start: number,\n  end: number\n): boolean {\n  let offset = start;\n  while (offset + 2 <= end) {\n    const tag = data[offset] ?? 0;\n    const length = data[offset + 1] ?? 0;\n    const descriptorStart = offset + 2;\n    const descriptorEnd = descriptorStart + length;\n    if (descriptorEnd > end) {\n      return false;\n    }\n\n    const registration =\n      length >= 4\n        ? String.fromCharCode(\n            data[descriptorStart] ?? 0,\n            data[descriptorStart + 1] ?? 0,\n            data[descriptorStart + 2] ?? 0,\n            data[descriptorStart + 3] ?? 0\n          )\n        : \"\";\n    if (tag === 0x8a || registration === \"CUEI\" || registration === \"SCTE\") {\n      return true;\n    }\n\n    offset = descriptorEnd;\n  }\n  return false;\n}\n\nfunction parsePmtSection(\n  payload: Uint8Array,\n  payloadUnitStart: boolean,\n  tsScte35Pids: Set<number>\n): void {\n  const sectionStart = getPsiSectionStart(payload, payloadUnitStart);\n  if (sectionStart == null || sectionStart + 12 >= payload.length) {\n    return;\n  }\n  if (payload[sectionStart] !== 0x02) {\n    return;\n  }\n\n  const sectionLength = getPsiSectionLength(payload, sectionStart);\n  const sectionEnd = Math.min(\n    payload.length,\n    sectionStart + 3 + sectionLength\n  );\n  const programInfoLength =\n    (((payload[sectionStart + 10] ?? 0) & 0x0f) << 8) |\n    (payload[sectionStart + 11] ?? 0);\n\n  let offset = sectionStart + 12 + programInfoLength;\n  while (offset + 5 <= sectionEnd - 4) {\n    const streamType = payload[offset] ?? 0;\n    const elementaryPid =\n      (((payload[offset + 1] ?? 0) & 0x1f) << 8) |\n      (payload[offset + 2] ?? 0);\n    const esInfoLength =\n      (((payload[offset + 3] ?? 0) & 0x0f) << 8) |\n      (payload[offset + 4] ?? 0);\n    const descriptorStart = offset + 5;\n    const descriptorEnd = Math.min(descriptorStart + esInfoLength, sectionEnd - 4);\n\n    if (\n      streamType === 0x86 ||\n      (streamType === 0x06 &&\n        descriptorsIdentifyScte35(payload, descriptorStart, descriptorEnd))\n    ) {\n      tsScte35Pids.add(elementaryPid);\n    }\n\n    offset = descriptorStart + esInfoLength;\n  }\n}\n\nfunction hasProcessedTsScte35Section(\n  section: Uint8Array,\n  processedSections: Set<string>\n): boolean {\n  let checksum = 0;\n  for (let i = 0; i < section.length; i++) {\n    checksum = (checksum * 31 + (section[i] ?? 0)) >>> 0;\n  }\n\n  const key = `${section.length}:${checksum}`;\n  if (processedSections.has(key)) {\n    return true;\n  }\n\n  processedSections.add(key);\n  if (processedSections.size > 200) {\n    const firstKey = processedSections.values().next().value;\n    if (firstKey) {\n      processedSections.delete(firstKey);\n    }\n  }\n  return false;\n}\n\nfunction addScte35SectionMarker(\n  section: Uint8Array,\n  markers: Scte35Marker[],\n  processedSections: Set<string>\n): void {\n  if (section[0] !== 0xfc || hasProcessedTsScte35Section(section, processedSections)) {\n    return;\n  }\n\n  const marker = parseScte35Binary(section);\n  if (!marker) {\n    return;\n  }\n\n  marker.raw = {\n    ...(typeof marker.raw === \"object\" && marker.raw ? marker.raw : {}),\n    source: \"ts-packet\",\n  };\n  markers.push(marker);\n}\n\nfunction appendScte35Bytes(\n  pid: number,\n  bytes: Uint8Array,\n  assemblers: Map<number, { bytes: number[]; expectedLength: number }>,\n  markers: Scte35Marker[],\n  processedSections: Set<string>\n): void {\n  const assembler = assemblers.get(pid);\n  if (!assembler) {\n    return;\n  }\n\n  for (let i = 0; i < bytes.length && assembler.bytes.length < assembler.expectedLength; i++) {\n    assembler.bytes.push(bytes[i] ?? 0);\n  }\n\n  if (assembler.bytes.length >= assembler.expectedLength) {\n    assemblers.delete(pid);\n    addScte35SectionMarker(new Uint8Array(assembler.bytes), markers, processedSections);\n  }\n}\n\nfunction collectScte35SectionsFromPayload(\n  pid: number,\n  payload: Uint8Array,\n  payloadUnitStart: boolean,\n  assemblers: Map<number, { bytes: number[]; expectedLength: number }>,\n  markers: Scte35Marker[],\n  processedSections: Set<string>\n): void {\n  if (payload.length === 0) {\n    return;\n  }\n\n  let offset = 0;\n  if (payloadUnitStart) {\n    const pointerField = payload[0] ?? 0;\n    const previousAssembler = assemblers.get(pid);\n    if (previousAssembler && pointerField > 0) {\n      appendScte35Bytes(\n        pid,\n        payload.subarray(1, Math.min(1 + pointerField, payload.length)),\n        assemblers,\n        markers,\n        processedSections\n      );\n    }\n    assemblers.delete(pid);\n    offset = 1 + pointerField;\n  } else {\n    appendScte35Bytes(pid, payload, assemblers, markers, processedSections);\n    return;\n  }\n\n  while (offset + 3 <= payload.length) {\n    const tableId = payload[offset];\n    if (tableId == null || tableId === 0xff) {\n      return;\n    }\n\n    const sectionLength = getPsiSectionLength(payload, offset);\n    const totalLength = 3 + sectionLength;\n    if (sectionLength <= 0 || totalLength <= 3) {\n      return;\n    }\n\n    if (offset + totalLength <= payload.length) {\n      addScte35SectionMarker(\n        payload.subarray(offset, offset + totalLength),\n        markers,\n        processedSections\n      );\n      offset += totalLength;\n    } else {\n      assemblers.set(pid, {\n        bytes: Array.from(payload.subarray(offset)),\n        expectedLength: totalLength,\n      });\n      return;\n    }\n  }\n}\n\nexport function parseScte35FromTsPackets(\n  data: Uint8Array,\n  tsScte35Pids: Set<number>,\n  pmtPids: Set<number>,\n  processedSections: Set<string>\n): Scte35Marker[] {\n  const packetInfo = detectTsPacketFormat(data);\n  if (!packetInfo) {\n    return [];\n  }\n\n  const markers: Scte35Marker[] = [];\n  const sectionAssemblers = new Map<\n    number,\n    { bytes: number[]; expectedLength: number }\n  >();\n\n  for (\n    let packetStart = packetInfo.offset;\n    packetStart + packetInfo.packetSize <= data.length;\n    packetStart += packetInfo.packetSize\n  ) {\n    const tsStart = packetStart + packetInfo.tsPayloadOffset;\n    if (data[tsStart] !== 0x47) {\n      continue;\n    }\n\n    const secondByte = data[tsStart + 1];\n    const thirdByte = data[tsStart + 2];\n    const fourthByte = data[tsStart + 3];\n    if (\n      secondByte == null ||\n      thirdByte == null ||\n      fourthByte == null ||\n      (secondByte & 0x80) !== 0\n    ) {\n      continue;\n    }\n\n    const payloadUnitStart = (secondByte & 0x40) !== 0;\n    const pid = ((secondByte & 0x1f) << 8) | thirdByte;\n    const adaptationFieldControl = (fourthByte >> 4) & 0x03;\n    const hasPayload =\n      adaptationFieldControl === 1 || adaptationFieldControl === 3;\n    if (!hasPayload) {\n      continue;\n    }\n\n    let payloadStart = tsStart + 4;\n    if (adaptationFieldControl === 3) {\n      const adaptationLength = data[payloadStart];\n      if (adaptationLength == null) {\n        continue;\n      }\n      payloadStart += 1 + adaptationLength;\n    }\n\n    const payloadEnd = Math.min(tsStart + 188, data.length);\n    if (payloadStart >= payloadEnd || payloadStart >= data.length) {\n      continue;\n    }\n\n    const payload = data.subarray(payloadStart, payloadEnd);\n    if (pid === 0) {\n      parsePatSection(payload, payloadUnitStart, pmtPids);\n    } else if (pmtPids.has(pid)) {\n      parsePmtSection(payload, payloadUnitStart, tsScte35Pids);\n    } else if (tsScte35Pids.has(pid)) {\n      collectScte35SectionsFromPayload(\n        pid,\n        payload,\n        payloadUnitStart,\n        sectionAssemblers,\n        markers,\n        processedSections\n      );\n    }\n  }\n\n  return markers;\n}\n\n// --- Binary SCTE-35 parsing ---\n\nclass BitReader {\n  private bytePos = 0;\n  private bitPos = 0;\n  constructor(private readonly buf: Uint8Array) {}\n  readBits(numBits: number): number {\n    let result = 0;\n    while (numBits > 0) {\n      if (this.bytePos >= this.buf.length) return result;\n      const remainingInByte = 8 - this.bitPos;\n      const toRead = Math.min(numBits, remainingInByte);\n      const currentByte = this.buf[this.bytePos]!;\n      const shift = remainingInByte - toRead;\n      const mask = ((1 << toRead) - 1) & 0xff;\n      const bits = (currentByte >> shift) & mask;\n      result = (result << toRead) | bits;\n      this.bitPos += toRead;\n      if (this.bitPos >= 8) {\n        this.bitPos = 0;\n        this.bytePos += 1;\n      }\n      numBits -= toRead;\n    }\n    return result >>> 0;\n  }\n  skipBits(n: number): void {\n    this.readBits(n);\n  }\n  get bytePosition(): number {\n    return this.bitPos === 0 ? this.bytePos : this.bytePos + 1;\n  }\n}\n\nfunction readSpliceTime(\n  r: BitReader,\n  ptsAdjustmentTicks: number\n): number | undefined {\n  const timeSpecifiedFlag = r.readBits(1) === 1;\n  if (!timeSpecifiedFlag) {\n    r.readBits(7);\n    return undefined;\n  }\n  r.readBits(6);\n  const high = r.readBits(1);\n  const low = r.readBits(32);\n  const ptsTicks =\n    (high * 0x100000000 + low + ptsAdjustmentTicks) % 0x200000000;\n  return ptsTicks / 90000;\n}\n\nfunction markerTypeFromSegmentationTypeId(\n  segmentationTypeId: number\n): Scte35Marker[\"type\"] | undefined {\n  switch (segmentationTypeId) {\n    case 0x10:\n    case 0x22:\n    case 0x30:\n    case 0x32:\n    case 0x34:\n    case 0x36:\n      return \"start\";\n    case 0x11:\n    case 0x23:\n    case 0x31:\n    case 0x33:\n    case 0x35:\n    case 0x37:\n      return \"end\";\n    default:\n      return undefined;\n  }\n}\n\nfunction parseScte35SegmentationDescriptor(\n  descriptor: Uint8Array\n):\n  | {\n      type: Scte35Marker[\"type\"];\n      durationSeconds?: number;\n      segmentationEventId?: number;\n    }\n  | undefined {\n  if (descriptor.length < 11) {\n    return undefined;\n  }\n\n  const identifier = String.fromCharCode(\n    descriptor[0] ?? 0,\n    descriptor[1] ?? 0,\n    descriptor[2] ?? 0,\n    descriptor[3] ?? 0\n  );\n  if (identifier !== \"CUEI\") {\n    return undefined;\n  }\n\n  const segmentationEventId =\n    ((descriptor[4] ?? 0) * 0x1000000) +\n    ((descriptor[5] ?? 0) << 16) +\n    ((descriptor[6] ?? 0) << 8) +\n    (descriptor[7] ?? 0);\n  const cancelIndicator = ((descriptor[8] ?? 0) & 0x80) !== 0;\n  if (cancelIndicator) {\n    return undefined;\n  }\n\n  const flags = descriptor[9] ?? 0;\n  const programSegmentationFlag = (flags & 0x80) !== 0;\n  const segmentationDurationFlag = (flags & 0x40) !== 0;\n  let offset = 10;\n\n  if (!programSegmentationFlag) {\n    const componentCount = descriptor[offset] ?? 0;\n    offset += 1 + componentCount * 6;\n    if (offset > descriptor.length) {\n      return undefined;\n    }\n  }\n\n  let durationSeconds: number | undefined = undefined;\n  if (segmentationDurationFlag) {\n    if (offset + 5 > descriptor.length) {\n      return undefined;\n    }\n    const durationTicks =\n      ((descriptor[offset] ?? 0) * 0x100000000) +\n      ((descriptor[offset + 1] ?? 0) * 0x1000000) +\n      ((descriptor[offset + 2] ?? 0) << 16) +\n      ((descriptor[offset + 3] ?? 0) << 8) +\n      (descriptor[offset + 4] ?? 0);\n    durationSeconds = durationTicks / 90000;\n    offset += 5;\n  }\n\n  if (offset + 2 > descriptor.length) {\n    return undefined;\n  }\n  offset += 1;\n  const segmentationUpidLength = descriptor[offset] ?? 0;\n  offset += 1 + segmentationUpidLength;\n  if (offset >= descriptor.length) {\n    return undefined;\n  }\n\n  const segmentationTypeId = descriptor[offset] ?? 0;\n  const markerType = markerTypeFromSegmentationTypeId(segmentationTypeId);\n  if (!markerType) {\n    return undefined;\n  }\n\n  return {\n    type: markerType,\n    ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n    segmentationEventId,\n  };\n}\n\nfunction parseScte35SegmentationDescriptors(\n  data: Uint8Array,\n  offset: number\n):\n  | {\n      type: Scte35Marker[\"type\"];\n      durationSeconds?: number;\n      segmentationEventId?: number;\n    }\n  | undefined {\n  if (offset + 2 > data.length) {\n    return undefined;\n  }\n\n  const descriptorLoopLength =\n    ((data[offset] ?? 0) << 8) | (data[offset + 1] ?? 0);\n  let descriptorOffset = offset + 2;\n  const descriptorEnd = Math.min(\n    data.length,\n    descriptorOffset + descriptorLoopLength\n  );\n\n  while (descriptorOffset + 2 <= descriptorEnd) {\n    const descriptorTag = data[descriptorOffset] ?? 0;\n    const descriptorLength = data[descriptorOffset + 1] ?? 0;\n    const descriptorDataStart = descriptorOffset + 2;\n    const descriptorDataEnd = descriptorDataStart + descriptorLength;\n    if (descriptorDataEnd > descriptorEnd) {\n      return undefined;\n    }\n\n    if (descriptorTag === 0x02) {\n      const descriptorMarker = parseScte35SegmentationDescriptor(\n        data.subarray(descriptorDataStart, descriptorDataEnd)\n      );\n      if (descriptorMarker) {\n        return descriptorMarker;\n      }\n    }\n\n    descriptorOffset = descriptorDataEnd;\n  }\n\n  return undefined;\n}\n\nexport function parseScte35Binary(data: Uint8Array): Scte35Marker | undefined {\n  const r = new BitReader(data);\n  const tableId = r.readBits(8);\n  if (tableId !== 0xfc) return undefined;\n  r.readBits(1);\n  r.readBits(1);\n  r.readBits(2);\n  const sectionLength = r.readBits(12);\n  if (sectionLength <= 0 || data.length < 3 + sectionLength) {\n    return undefined;\n  }\n  r.readBits(8);\n  r.readBits(1);\n  r.readBits(6);\n  const ptsAdjHigh = r.readBits(1);\n  const ptsAdjLow = r.readBits(32);\n  const ptsAdjustmentTicks = ptsAdjHigh * 0x100000000 + ptsAdjLow;\n  r.readBits(8);\n  r.readBits(12);\n  const spliceCommandLength = r.readBits(12);\n  const spliceCommandType = r.readBits(8);\n\n  let markerType: Scte35Marker[\"type\"] | undefined;\n  let durationSeconds: number | undefined = undefined;\n  let ptsSeconds: number | undefined = undefined;\n  let spliceEventId: number | undefined = undefined;\n  const commandBodyStart = r.bytePosition;\n\n  if (spliceCommandType === 5) {\n    spliceEventId = r.readBits(32);\n    const cancel = r.readBits(1) === 1;\n    r.readBits(7);\n    if (cancel) return undefined;\n    const outOfNetwork = r.readBits(1) === 1;\n    const programSpliceFlag = r.readBits(1) === 1;\n    const durationFlag = r.readBits(1) === 1;\n    const spliceImmediateFlag = r.readBits(1) === 1;\n    r.readBits(4);\n    markerType = outOfNetwork ? \"start\" : \"end\";\n\n    if (programSpliceFlag && !spliceImmediateFlag) {\n      ptsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n    } else if (!programSpliceFlag) {\n      const componentCount = r.readBits(8);\n      for (let i = 0; i < componentCount; i++) {\n        r.readBits(8);\n        if (!spliceImmediateFlag) {\n          const componentPtsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n          if (ptsSeconds === undefined) {\n            ptsSeconds = componentPtsSeconds;\n          }\n        }\n      }\n    }\n\n    if (durationFlag) {\n      r.readBits(6);\n      r.readBits(1);\n      const high = r.readBits(1);\n      const low = r.readBits(32);\n      const durationTicks = high * 0x100000000 + low;\n      durationSeconds = durationTicks / 90000;\n    }\n    r.readBits(16);\n    r.readBits(8);\n    r.readBits(8);\n  } else if (spliceCommandType === 6) {\n    ptsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n  } else {\n    return undefined;\n  }\n\n  const expectedDescriptorOffset =\n    spliceCommandLength === 0x0fff\n      ? r.bytePosition\n      : commandBodyStart + spliceCommandLength;\n  const descriptorMarker = parseScte35SegmentationDescriptors(\n    data,\n    expectedDescriptorOffset\n  );\n\n  if (descriptorMarker) {\n    markerType = descriptorMarker.type;\n    if (durationSeconds === undefined) {\n      durationSeconds = descriptorMarker.durationSeconds;\n    }\n  }\n\n  if (!markerType) {\n    return undefined;\n  }\n\n  const marker: Scte35Marker = {\n    type: markerType,\n    ...(ptsSeconds !== undefined ? { ptsSeconds } : {}),\n    ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n    raw: {\n      splice_command_type: spliceCommandType,\n      ...(spliceEventId !== undefined ? { splice_event_id: spliceEventId } : {}),\n      ...(descriptorMarker?.segmentationEventId !== undefined\n        ? { segmentation_event_id: descriptorMarker.segmentationEventId }\n        : {}),\n    },\n  } as Scte35Marker;\n  return marker;\n}\n","import type { Scte35Marker } from \"../types\";\nimport type {\n  NormalizedScte35Cue,\n  Scte35CueContext,\n  Scte35CueSource,\n  Scte35CueReadiness,\n} from \"./playerTypes\";\nimport { getFragmentStartSeconds } from \"./Scte35Parser\";\n\nexport interface Scte35CueManagerCallbacks {\n  onEarlyStartCue(marker: Scte35Marker, fragmentSn: number | undefined, cueKey: string): void;\n  onPlaybackCue(marker: Scte35Marker, cueKey?: string): void;\n  isInAdBreak(): boolean;\n}\n\nexport class Scte35CueManager {\n  private readonly pendingScte35Cues: Map<string, NormalizedScte35Cue> = new Map();\n  private readonly recentScte35CueKeys: Map<string, number> = new Map();\n  private readonly recentScte35CueLimit: number = 200;\n  private pendingScte35CueKeyValue: string | undefined;\n  private activeScte35BreakKeyValue: string | undefined;\n  private scheduledScte35BreakKeyValue: string | undefined;\n\n  readonly tsScte35Pids: Set<number> = new Set();\n  readonly pmtPids: Set<number> = new Set();\n  readonly processedTsScte35Sections: Set<string> = new Set();\n\n  private debug: boolean;\n  private callbacks: Scte35CueManagerCallbacks;\n\n  constructor(debug: boolean, callbacks: Scte35CueManagerCallbacks) {\n    this.debug = debug;\n    this.callbacks = callbacks;\n  }\n\n  get pendingScte35CueKey(): string | undefined {\n    return this.pendingScte35CueKeyValue;\n  }\n  set pendingScte35CueKey(value: string | undefined) {\n    this.pendingScte35CueKeyValue = value;\n  }\n\n  get activeScte35BreakKey(): string | undefined {\n    return this.activeScte35BreakKeyValue;\n  }\n  set activeScte35BreakKey(value: string | undefined) {\n    this.activeScte35BreakKeyValue = value;\n  }\n\n  get scheduledScte35BreakKey(): string | undefined {\n    return this.scheduledScte35BreakKeyValue;\n  }\n  set scheduledScte35BreakKey(value: string | undefined) {\n    this.scheduledScte35BreakKeyValue = value;\n  }\n\n  createScte35CueContext(\n    source: Scte35CueSource,\n    readiness: Scte35CueReadiness,\n    frag?: any\n  ): Scte35CueContext {\n    const context: Scte35CueContext = { source, readiness };\n    if (typeof frag?.sn === \"number\") {\n      context.fragmentSn = frag.sn;\n    }\n    const fragmentStartSec = getFragmentStartSeconds(frag);\n    if (fragmentStartSec !== undefined) {\n      context.fragmentStartSeconds = fragmentStartSec;\n    }\n    return context;\n  }\n\n  onScte35Cue(marker: Scte35Marker, context: Scte35CueContext): void {\n    const cue = this.createScte35Cue(marker, context);\n    const pendingKey = this.getPendingScte35CueKey(cue);\n\n    if (context.readiness === \"early\") {\n      this.pendingScte35Cues.set(pendingKey, cue);\n      this.trimRecentScte35CueMaps();\n\n      if (marker.type === \"start\") {\n        this.callbacks.onEarlyStartCue(marker, context.fragmentSn, cue.key);\n      }\n      return;\n    }\n\n    if (marker.type === \"end\" && !this.shouldAcceptScte35EndCue(cue)) {\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Ignoring SCTE-35 end cue\", {\n          key: cue.key,\n          activeScte35BreakKey: this.activeScte35BreakKeyValue,\n          inAdBreak: this.callbacks.isInAdBreak(),\n          source: cue.source,\n        });\n      }\n      return;\n    }\n\n    if (marker.type === \"start\" && this.hasRecentlyHandledScte35Cue(cue)) {\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Ignoring duplicate SCTE-35 start cue\", {\n          key: cue.key,\n          source: cue.source,\n        });\n      }\n      return;\n    }\n\n    this.pendingScte35Cues.delete(pendingKey);\n    this.markScte35CueHandled(cue);\n    this.callbacks.onPlaybackCue(marker, cue.key);\n  }\n\n  activatePendingScte35CuesForFragment(frag: any): void {\n    const fragmentSn = typeof frag?.sn === \"number\" ? frag.sn : undefined;\n    if (fragmentSn === undefined) {\n      return;\n    }\n\n    const matchingCues = Array.from(this.pendingScte35Cues.entries()).filter(\n      ([, cue]) => cue.fragmentSn === fragmentSn\n    );\n\n    matchingCues.forEach(([pendingKey, cue]) => {\n      this.pendingScte35Cues.delete(pendingKey);\n      const context: Scte35CueContext = {\n        source: cue.source,\n        readiness: \"playback\",\n      };\n      context.fragmentSn = fragmentSn;\n      const fragmentStartSec =\n        cue.fragmentStartSeconds ?? getFragmentStartSeconds(frag);\n      if (fragmentStartSec !== undefined) {\n        context.fragmentStartSeconds = fragmentStartSec;\n      }\n      this.onScte35Cue(cue.marker, context);\n    });\n  }\n\n  private createScte35Cue(\n    marker: Scte35Marker,\n    context: Scte35CueContext\n  ): NormalizedScte35Cue {\n    const cue: NormalizedScte35Cue = {\n      marker,\n      source: context.source,\n      readiness: context.readiness,\n      key: this.getScte35CueKey(marker, context),\n    };\n    if (context.fragmentSn !== undefined) {\n      cue.fragmentSn = context.fragmentSn;\n    }\n    if (context.fragmentStartSeconds !== undefined) {\n      cue.fragmentStartSeconds = context.fragmentStartSeconds;\n    }\n    return cue;\n  }\n\n  private getScte35CueKey(\n    marker: Scte35Marker,\n    context: Scte35CueContext\n  ): string {\n    const raw = this.getScte35MarkerRaw(marker);\n    const spliceEventId = this.toIdentityString(raw?.splice_event_id);\n    if (spliceEventId) {\n      return `splice:${spliceEventId}`;\n    }\n\n    const segmentationEventId = this.toIdentityString(raw?.segmentation_event_id);\n    if (segmentationEventId) {\n      return `segmentation:${segmentationEventId}`;\n    }\n\n    const daterangeId = this.toIdentityString(raw?.attrs?.ID);\n    if (daterangeId) {\n      return `daterange:${daterangeId}`;\n    }\n\n    const scteValue =\n      this.toIdentityString(raw?.attrs?.[\"SCTE35-OUT\"]) ||\n      this.toIdentityString(raw?.attrs?.[\"SCTE35-IN\"]);\n    if (scteValue) {\n      return `daterange-scte:${scteValue}`;\n    }\n\n    if (typeof marker.ptsSeconds === \"number\" && Number.isFinite(marker.ptsSeconds)) {\n      return `pts:${Math.round(marker.ptsSeconds * 2) / 2}`;\n    }\n\n    if (context.fragmentSn !== undefined) {\n      return `fragment:${context.fragmentSn}`;\n    }\n\n    return `${context.source}:wallclock:${Math.floor(Date.now() / 1000)}`;\n  }\n\n  private getPendingScte35CueKey(cue: NormalizedScte35Cue): string {\n    return `${cue.marker.type}:${cue.key}:${\n      cue.fragmentSn !== undefined ? cue.fragmentSn : \"unknown\"\n    }`;\n  }\n\n  private getScte35MarkerRaw(marker: Scte35Marker): any {\n    return typeof marker.raw === \"object\" && marker.raw !== null\n      ? (marker.raw as any)\n      : {};\n  }\n\n  private toIdentityString(value: unknown): string | undefined {\n    if (typeof value === \"number\" && Number.isFinite(value)) {\n      return String(value);\n    }\n    if (typeof value === \"string\" && value.trim().length > 0) {\n      return value.trim();\n    }\n    return undefined;\n  }\n\n  isStrongScte35CueKey(key: string | undefined): boolean {\n    return !!(\n      key &&\n      (key.startsWith(\"splice:\") ||\n        key.startsWith(\"segmentation:\") ||\n        key.startsWith(\"daterange:\") ||\n        key.startsWith(\"daterange-scte:\"))\n    );\n  }\n\n  private hasRecentlyHandledScte35Cue(cue: NormalizedScte35Cue): boolean {\n    if (\n      this.activeScte35BreakKeyValue === cue.key ||\n      this.scheduledScte35BreakKeyValue === cue.key\n    ) {\n      return true;\n    }\n\n    const recentKey = `${cue.marker.type}:${cue.key}`;\n    return this.recentScte35CueKeys.has(recentKey);\n  }\n\n  private markScte35CueHandled(cue: NormalizedScte35Cue): void {\n    this.recentScte35CueKeys.set(`${cue.marker.type}:${cue.key}`, Date.now());\n    this.trimRecentScte35CueMaps();\n  }\n\n  private trimRecentScte35CueMaps(): void {\n    while (this.recentScte35CueKeys.size > this.recentScte35CueLimit) {\n      const firstKey = this.recentScte35CueKeys.keys().next().value;\n      if (!firstKey) {\n        break;\n      }\n      this.recentScte35CueKeys.delete(firstKey);\n    }\n\n    while (this.pendingScte35Cues.size > this.recentScte35CueLimit) {\n      const firstKey = this.pendingScte35Cues.keys().next().value;\n      if (!firstKey) {\n        break;\n      }\n      this.pendingScte35Cues.delete(firstKey);\n    }\n  }\n\n  private shouldAcceptScte35EndCue(cue: NormalizedScte35Cue): boolean {\n    if (!this.callbacks.isInAdBreak()) {\n      return false;\n    }\n\n    if (\n      this.isStrongScte35CueKey(this.activeScte35BreakKeyValue) &&\n      this.isStrongScte35CueKey(cue.key) &&\n      this.activeScte35BreakKeyValue !== cue.key\n    ) {\n      return false;\n    }\n\n    return true;\n  }\n}\n","import type {\n  StormcloudVideoPlayerConfig,\n  AdBreak,\n  StormcloudApiResponse,\n  AdController,\n} from \"../types\";\nimport type { PalNonceManager } from \"../sdk/pal\";\nimport { applyVastMacros, generateCorrelator, normalizeVastTagUrl } from \"../utils/vastMacros\";\nimport type { VastConsentSignals } from \"../utils/vastMacros\";\nimport { resolveVastEnvironmentSignals } from \"../utils/vastEnvironmentSignals\";\nimport {\n  buildAnalyticsContext,\n  sendHeartbeat,\n  sendInitialTracking,\n} from \"../utils/tracking\";\n\nexport class AdConfigManager {\n  vmapBreaks: AdBreak[] = [];\n  consumedVmapBreakIds: Set<string> = new Set();\n  apiVastTagUrl: string | undefined;\n  apiNumberAds: number | undefined;\n  readonly streamCorrelator: string = generateCorrelator();\n  readonly viewCorrelator: string = generateCorrelator();\n  consentSignals: VastConsentSignals = {};\n  podCounter: number = 0;\n  podAssignedByPrefetch: boolean = false;\n\n  private lastHeartbeatTime: number = 0;\n  private heartbeatInterval: number | undefined;\n\n  private config: StormcloudVideoPlayerConfig;\n  private video: HTMLVideoElement;\n\n  constructor(config: StormcloudVideoPlayerConfig, video: HTMLVideoElement) {\n    this.config = config;\n    this.video = video;\n  }\n\n  get debug(): boolean {\n    return !!this.config.debugAdTiming;\n  }\n\n  isVmapEnabled(): boolean {\n    return !!(this.config.isVmap && this.config.vmapUrl?.trim());\n  }\n\n  async fetchAdConfiguration(): Promise<void> {\n    if (this.isVmapEnabled()) {\n      await this.fetchAndParseVmap(this.config.vmapUrl!);\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] VMAP mode enabled\");\n      }\n      return;\n    }\n\n    const vastMode = this.config.vastMode || \"default\";\n\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] VAST mode:\", vastMode);\n    }\n\n    if (vastMode === \"adstorm\") {\n      if (!this.config.licenseKey) {\n        if (this.debug) {\n          console.warn(\n            \"[StormcloudVideoPlayer] AdStorm mode requires a license key\"\n          );\n        }\n        return;\n      }\n\n      const vastEndpoint = `https://adstorm.co/api-adstorm-dev/adstorm/vast/${this.config.licenseKey}`;\n      this.apiVastTagUrl = vastEndpoint;\n\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Using AdStorm VAST endpoint (adstorm mode):\",\n          vastEndpoint\n        );\n      }\n      return;\n    }\n\n    if (this.config.vastTagUrl) {\n      this.apiVastTagUrl = normalizeVastTagUrl(this.config.vastTagUrl);\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Using custom VAST tag URL:\",\n          this.apiVastTagUrl\n        );\n      }\n      return;\n    }\n\n    const apiUrl = \"https://adstorm.co/api-adstorm-dev/adstorm/ads/web\";\n\n    if (this.debug) {\n      console.log(\n        \"[StormcloudVideoPlayer] Fetching ad configuration from:\",\n        apiUrl\n      );\n    }\n\n    const headers: Record<string, string> = {};\n    if (this.config.licenseKey) {\n      headers[\"Authorization\"] = `Bearer ${this.config.licenseKey}`;\n    }\n\n    const response = await fetch(apiUrl, { headers });\n    if (!response.ok) {\n      if (this.debug) {\n        console.warn(\n          `[StormcloudVideoPlayer] Failed to fetch ad configuration: ${response.status}`\n        );\n      }\n      return;\n    }\n\n    const data: StormcloudApiResponse = await response.json();\n\n    const imaPayload = data.response?.ima?.[\"publisherdesk.ima\"]?.payload;\n    if (imaPayload) {\n      let decodedPayload = imaPayload;\n      try {\n        decodedPayload = decodeURIComponent(imaPayload);\n      } catch {\n        console.warn(\"[StormcloudVideoPlayer] imaPayload was not URI-encoded; using as-is:\", imaPayload);\n      }\n      console.log(\"[StormcloudVideoPlayer] Raw VAST tag URL (from API):\", decodedPayload);\n      this.apiVastTagUrl = normalizeVastTagUrl(decodedPayload);\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Normalized VAST tag URL:\",\n          this.apiVastTagUrl\n        );\n      }\n    } else {\n      if (this.debug) {\n        console.warn(\n          \"[StormcloudVideoPlayer] No VAST tag URL found in /ads/web response\"\n        );\n      }\n    }\n\n    const numberAds = data.response?.options?.vast?.cue_tones?.number_ads;\n    if (numberAds != null && numberAds > 0) {\n      this.apiNumberAds = numberAds;\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Number of ads per break from API:\",\n          this.apiNumberAds\n        );\n      }\n    }\n  }\n\n  private async fetchAndParseVmap(vmapUrl: string): Promise<void> {\n    if (!vmapUrl.trim()) {\n      return;\n    }\n\n    try {\n      const response = await fetch(vmapUrl);\n      if (!response.ok) {\n        throw new Error(`Failed to fetch VMAP (${response.status})`);\n      }\n\n      const vmapXml = await response.text();\n      this.vmapBreaks = this.parseVmapToBreaks(vmapXml);\n      this.consumedVmapBreakIds.clear();\n\n      if (this.debug) {\n        console.log(\n          `[StormcloudVideoPlayer] Loaded ${this.vmapBreaks.length} VMAP ad break(s) from:`,\n          vmapUrl\n        );\n      }\n    } catch (error) {\n      this.vmapBreaks = [];\n      this.consumedVmapBreakIds.clear();\n      if (this.debug) {\n        console.warn(\"[StormcloudVideoPlayer] Failed to load VMAP:\", error);\n      }\n    }\n  }\n\n  private parseVmapToBreaks(vmapXml: string): AdBreak[] {\n    if (typeof DOMParser === \"undefined\") {\n      return [];\n    }\n\n    const doc = new DOMParser().parseFromString(vmapXml, \"application/xml\");\n    if (doc.querySelector(\"parsererror\")) {\n      if (this.debug) {\n        console.warn(\"[StormcloudVideoPlayer] Invalid VMAP XML received\");\n      }\n      return [];\n    }\n\n    const VMAP_NS = \"http://www.iab.net/videosuite/vmap\";\n    let adBreakNodes = Array.from(doc.getElementsByTagNameNS(VMAP_NS, \"AdBreak\"));\n    if (adBreakNodes.length === 0) {\n      adBreakNodes = Array.from(\n        doc.querySelectorAll(\"AdBreak, vmap\\\\:AdBreak\")\n      );\n    }\n    if (adBreakNodes.length === 0) {\n      adBreakNodes = Array.from(doc.getElementsByTagName(\"*\")).filter(\n        (el) => el.localName === \"AdBreak\"\n      );\n    }\n    const parsed: AdBreak[] = [];\n\n    adBreakNodes.forEach((node, index) => {\n      const timeOffsetRaw = (node.getAttribute(\"timeOffset\") || \"\").trim();\n      const startTimeMs = this.parseVmapTimeOffsetToMs(timeOffsetRaw);\n      if (startTimeMs == null) {\n        return;\n      }\n\n      let adTagNode = node.getElementsByTagNameNS(VMAP_NS, \"AdTagURI\")[0];\n      if (!adTagNode) {\n        adTagNode =\n          (node.querySelector(\"AdTagURI, vmap\\\\:AdTagURI\") as Element | null) ??\n          undefined;\n      }\n      const adTagUrl = (adTagNode?.textContent || \"\").trim();\n      if (!adTagUrl) {\n        return;\n      }\n\n      const breakId =\n        node.getAttribute(\"breakId\") ||\n        `vmap-break-${index}-${timeOffsetRaw || \"unknown\"}`;\n      parsed.push({\n        id: breakId,\n        startTimeMs,\n        vastTagUrl: adTagUrl,\n      });\n    });\n\n    parsed.sort((a, b) => {\n      const aStart = a.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : a.startTimeMs;\n      const bStart = b.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : b.startTimeMs;\n      return aStart - bStart;\n    });\n\n    return parsed;\n  }\n\n  private parseVmapTimeOffsetToMs(timeOffset: string): number | undefined {\n    if (!timeOffset) {\n      return undefined;\n    }\n\n    const normalized = timeOffset.trim().toLowerCase();\n    if (normalized === \"start\") {\n      return 0;\n    }\n\n    if (normalized === \"end\") {\n      return -1;\n    }\n\n    const hms = timeOffset.match(\n      /^(\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d{1,3}))?$/\n    );\n    if (hms) {\n      const [, hh, mm, ss, ms = \"0\"] = hms;\n      const hours = Number(hh);\n      const minutes = Number(mm);\n      const seconds = Number(ss);\n      const millis = Number(ms.padEnd(3, \"0\").slice(0, 3));\n      return ((hours * 3600 + minutes * 60 + seconds) * 1000) + millis;\n    }\n\n    const percent = timeOffset.match(/^(\\d+(?:\\.\\d+)?)%$/);\n    if (percent) {\n      const ratio = Number(percent[1]) / 100;\n      const durationSec = this.video.duration;\n      if (Number.isFinite(durationSec) && durationSec > 0) {\n        return Math.floor(durationSec * 1000 * ratio);\n      }\n      return undefined;\n    }\n\n    return undefined;\n  }\n\n  getAdBreakKey(adBreak: AdBreak): string {\n    if (adBreak.id) {\n      return adBreak.id;\n    }\n    return `${adBreak.startTimeMs}-${adBreak.vastTagUrl || \"\"}`;\n  }\n\n  resolveBreakStartMs(adBreak: AdBreak): number | undefined {\n    if (adBreak.startTimeMs >= 0) {\n      return adBreak.startTimeMs;\n    }\n\n    if (adBreak.startTimeMs === -1) {\n      const durationSec = this.video.duration;\n      if (Number.isFinite(durationSec) && durationSec > 0) {\n        return Math.floor(durationSec * 1000);\n      }\n    }\n\n    return undefined;\n  }\n\n  findCurrentOrNextBreak(nowMs: number): AdBreak | undefined {\n    const schedule: AdBreak[] = this.vmapBreaks;\n    let candidate: AdBreak | undefined;\n    const tol = this.config.driftToleranceMs ?? 1000;\n    for (const b of schedule) {\n      if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {\n        continue;\n      }\n      const breakStartMs = this.resolveBreakStartMs(b);\n      if (breakStartMs == null) {\n        continue;\n      }\n      if (\n        breakStartMs <= nowMs + tol &&\n        (candidate == null ||\n          breakStartMs > (this.resolveBreakStartMs(candidate) ?? 0))\n      ) {\n        candidate = b;\n      }\n    }\n    return candidate;\n  }\n\n  findBreakForTime(nowMs: number): AdBreak | undefined {\n    const schedule: AdBreak[] = this.vmapBreaks;\n    for (const b of schedule) {\n      if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {\n        continue;\n      }\n      const breakStartMs = this.resolveBreakStartMs(b);\n      if (breakStartMs == null) {\n        continue;\n      }\n\n      if (b.durationMs) {\n        const end = breakStartMs + b.durationMs;\n        if (nowMs >= breakStartMs && nowMs < end) {\n          return b;\n        }\n        continue;\n      }\n\n      if (nowMs >= breakStartMs) {\n        return b;\n      }\n    }\n    return undefined;\n  }\n\n  selectVastTagsForBreak(b?: AdBreak): string[] | undefined {\n    if (!b || !b.vastTagUrl) return undefined;\n    if (b.vastTagUrl.includes(\",\")) {\n      return b.vastTagUrl\n        .split(\",\")\n        .map((s) => s.trim())\n        .filter((s) => s.length > 0);\n    }\n    return [b.vastTagUrl];\n  }\n\n  beginNewAdPod(): void {\n    this.podCounter++;\n  }\n\n  private readonly defaultPodMaxAds: number = 6;\n  private readonly defaultPodMaxDurationMs: number = 120000;\n\n  resolvePodParams(breakDurationMs?: number): {\n    maxAds: number;\n    minDurationMs: number;\n    maxDurationMs: number;\n  } {\n    const maxDurationMs =\n      breakDurationMs != null && breakDurationMs > 0\n        ? breakDurationMs\n        : this.config.podMaxDurationMs != null && this.config.podMaxDurationMs > 0\n          ? this.config.podMaxDurationMs\n          : this.defaultPodMaxDurationMs;\n\n    const maxAds =\n      this.config.podMaxAds && this.config.podMaxAds > 0\n        ? this.config.podMaxAds\n        : this.apiNumberAds && this.apiNumberAds > 0\n          ? this.apiNumberAds\n          : this.defaultPodMaxAds;\n\n    const minDurationMs =\n      this.config.podExactDuration && maxDurationMs != null ? maxDurationMs : 0;\n\n    return { maxAds, minDurationMs, maxDurationMs };\n  }\n\n  generatePodVastUrl(\n    baseUrl: string,\n    podParams: { maxAds: number; minDurationMs: number; maxDurationMs: number },\n    adPlayer: AdController,\n    palNonce: PalNonceManager,\n    inAdBreak: boolean\n  ): string {\n    const adWillPlayMuted = inAdBreak\n      ? adPlayer.getOriginalMutedState()\n      : this.video.muted;\n    const envSignals = resolveVastEnvironmentSignals(!!this.config.ctvAdRequest);\n\n    const urlWithMacros = applyVastMacros(baseUrl, {\n      correlator: this.viewCorrelator,\n      streamCorrelator: this.streamCorrelator,\n      pod: this.podCounter > 0 ? this.podCounter : undefined,\n      podMaxAds: podParams.maxAds,\n      podMinDurationMs: podParams.minDurationMs,\n      podMaxDurationMs: podParams.maxDurationMs,\n      isCtv: envSignals.isCtv,\n      contentUrl: envSignals.contentUrl,\n      pageUrl:\n        !envSignals.isCtv && typeof window !== \"undefined\"\n          ? window.location.href\n          : undefined,\n      adWillPlayMuted,\n      adWillAutoPlay: !!this.config.autoplay,\n      appId: envSignals.appId,\n      appName: envSignals.appName,\n      sessionId: envSignals.sessionId,\n      deviceId: envSignals.deviceId,\n      deviceIdType: envSignals.deviceIdType,\n      limitAdTracking: envSignals.limitAdTracking,\n      deviceTypeHint: envSignals.deviceTypeHint,\n      adTest: this.config.adTest,\n      consent: this.consentSignals,\n    });\n\n    const finalUrl = palNonce.injectNonce(urlWithMacros);\n    console.log(\n      `[StormcloudVideoPlayer] Resolved optimized-pod request URL (pod=${this.podCounter}, pmad=${podParams.maxAds}, pmnd=${podParams.minDurationMs}, pmxd=${podParams.maxDurationMs ?? \"?\"}):`,\n      finalUrl\n    );\n    return finalUrl;\n  }\n\n  // --- Tracking ---\n\n  initializeTracking(): void {\n    sendInitialTracking(this.config.licenseKey, buildAnalyticsContext(this.config))\n      .then(() => {\n        this.heartbeatInterval = window.setInterval(() => {\n          this.sendHeartbeatIfNeeded();\n        }, 5000);\n      })\n      .catch((error) => {\n        if (this.debug) {\n          console.warn(\n            \"[StormcloudVideoPlayer] Failed to send initial tracking:\",\n            error\n          );\n        }\n        this.heartbeatInterval = window.setInterval(() => {\n          this.sendHeartbeatIfNeeded();\n        }, 5000);\n      });\n  }\n\n  private sendHeartbeatIfNeeded(): void {\n    const now = Date.now();\n    if (!this.lastHeartbeatTime || now - this.lastHeartbeatTime > 30000) {\n      this.lastHeartbeatTime = now;\n      sendHeartbeat(this.config.licenseKey, buildAnalyticsContext(this.config)).catch((error) => {\n        if (this.debug) {\n          console.warn(\n            \"[StormcloudVideoPlayer] Failed to send heartbeat:\",\n            error\n          );\n        }\n      });\n    }\n  }\n\n  destroyTracking(): void {\n    if (this.heartbeatInterval) {\n      clearInterval(this.heartbeatInterval);\n      this.heartbeatInterval = undefined;\n    }\n  }\n}\n","import type { AdController, StormcloudVideoPlayerConfig, Scte35Marker } from \"../types\";\n\nexport interface AdTimingCallbacks {\n  onAdStopTimerFired(): void;\n  onAdStartTimerFired(marker: Scte35Marker, cueKey: string | undefined): void;\n  onWatchdogTimeout(): void;\n  onFailsafeTimeout(): void;\n}\n\nexport class AdTimingService {\n  private adStopTimerId: number | undefined;\n  private adStartTimerId: number | undefined;\n  private adFailsafeTimerId: number | undefined;\n  private adRequestWatchdogId: number | undefined;\n  private adRequestWatchdogToken: number | null = null;\n  private adFailsafeToken: number | null = null;\n\n  ptsDriftEmaMs = 0;\n  expectedAdBreakDurationMs: number | undefined;\n  currentAdBreakStartWallClockMs: number | undefined;\n  scteAdBreakEndWallClockMs: number | undefined;\n  adBreakPlayedDurationMs: number = 0;\n  adBreakEpoch: number = 0;\n\n  adRequestTokenCounter = 0;\n  activeAdRequestToken: number | null = null;\n  currentAdIndex: number = 0;\n  totalAdsInBreak: number = 0;\n  totalAdRequestsInBreak: number = 0;\n  readonly maxTotalAdRequestsPerBreak: number = 10;\n  lastAdRequestTime: number = 0;\n  consecutiveFailures: number = 0;\n  readonly maxConsecutiveFailures: number = 5;\n  readonly minAdRequestIntervalMs: number = 3000;\n  readonly backoffBaseMs: number = 1000;\n  readonly maxBackoffMs: number = 15000;\n  private readonly defaultMinRemainingMsToStartAd: number = 4000;\n\n  failedVastUrls: Set<string> = new Set();\n  temporaryFailureUrls: Map<string, number> = new Map();\n  private readonly temporaryFailureCooldownMs: number = 30000;\n\n  private globalConsecutiveNoFills: number = 0;\n  private readonly globalNoFillThreshold: number = 3;\n  private globalNoFillCooldownUntil: number = 0;\n  private readonly globalNoFillBackoffBaseMs: number = 5000;\n  private readonly globalNoFillBackoffMaxMs: number = 60000;\n  private globalLastGamRequestTime: number = 0;\n  private readonly globalMinGamIntervalMs: number = 3000;\n\n  private config: StormcloudVideoPlayerConfig;\n  private video: HTMLVideoElement;\n  private callbacks: AdTimingCallbacks;\n\n  constructor(\n    config: StormcloudVideoPlayerConfig,\n    video: HTMLVideoElement,\n    callbacks: AdTimingCallbacks\n  ) {\n    this.config = config;\n    this.video = video;\n    this.callbacks = callbacks;\n  }\n\n  get debug(): boolean {\n    return !!this.config.debugAdTiming;\n  }\n\n  // --- Ad stop timer ---\n\n  scheduleAdStopCountdown(remainingMs: number): void {\n    this.clearAdStopTimer();\n    const ms = Math.max(0, Math.floor(remainingMs));\n    if (ms === 0) {\n      this.ensureAdStoppedByTimer();\n      return;\n    }\n    this.adStopTimerId = window.setTimeout(() => {\n      this.ensureAdStoppedByTimer();\n    }, ms) as unknown as number;\n  }\n\n  clearAdStopTimer(): void {\n    if (this.adStopTimerId != null) {\n      clearTimeout(this.adStopTimerId);\n      this.adStopTimerId = undefined;\n    }\n  }\n\n  private ensureAdStoppedByTimer(): void {\n    this.adStopTimerId = undefined;\n    this.callbacks.onAdStopTimerFired();\n  }\n\n  // --- Ad start timer ---\n\n  scheduleAdStartIn(\n    delayMs: number,\n    marker: Scte35Marker = { type: \"start\" } as Scte35Marker,\n    cueKey?: string\n  ): void {\n    this.clearAdStartTimer();\n    const ms = Math.max(0, Math.floor(delayMs));\n    if (ms === 0) {\n      this.callbacks.onAdStartTimerFired(marker, cueKey);\n      return;\n    }\n    this.adStartTimerId = window.setTimeout(() => {\n      this.callbacks.onAdStartTimerFired(marker, cueKey);\n    }, ms) as unknown as number;\n  }\n\n  clearAdStartTimer(): void {\n    if (this.adStartTimerId != null) {\n      clearTimeout(this.adStartTimerId);\n      this.adStartTimerId = undefined;\n    }\n  }\n\n  // --- PTS drift ---\n\n  updatePtsDrift(ptsSecondsSample: number): void {\n    const sampleMs = (this.video.currentTime - ptsSecondsSample) * 1000;\n    if (!Number.isFinite(sampleMs) || Math.abs(sampleMs) > 60000) return;\n    const alpha = 0.1;\n    this.ptsDriftEmaMs = this.ptsDriftEmaMs * (1 - alpha) + sampleMs * alpha;\n  }\n\n  resolveScteBreakStartWallClockMs(marker: Scte35Marker): number {\n    const nowWallClockMs = Date.now();\n    if (typeof marker.ptsSeconds !== \"number\") {\n      return nowWallClockMs;\n    }\n\n    const nowMs = this.video.currentTime * 1000;\n    const estimatedCurrentPtsMs = nowMs - this.ptsDriftEmaMs;\n    const deltaMs = marker.ptsSeconds * 1000 - estimatedCurrentPtsMs;\n    if (!Number.isFinite(deltaMs)) {\n      return nowWallClockMs;\n    }\n\n    return nowWallClockMs + Math.floor(deltaMs);\n  }\n\n  // --- Duration boundary ---\n\n  setAdBreakDurationBoundary(durationMs: number | undefined): void {\n    this.expectedAdBreakDurationMs = durationMs;\n    if (\n      durationMs != null &&\n      this.currentAdBreakStartWallClockMs != null\n    ) {\n      this.scteAdBreakEndWallClockMs =\n        this.currentAdBreakStartWallClockMs + durationMs;\n    } else {\n      this.scteAdBreakEndWallClockMs = undefined;\n    }\n  }\n\n  scheduleAdStopAtBreakBoundary(): void {\n    if (this.expectedAdBreakDurationMs == null) {\n      return;\n    }\n    this.scheduleAdStopCountdown(this.getWallClockRemainingAdMs());\n  }\n\n  // --- Duration budget ---\n\n  getWallClockRemainingAdMs(): number {\n    const endWallClockMs = this.getAdBreakEndWallClockMs();\n    if (endWallClockMs != null) {\n      return Math.max(0, endWallClockMs - Date.now());\n    }\n    return 0;\n  }\n\n  getAdBreakEndWallClockMs(): number | undefined {\n    if (this.scteAdBreakEndWallClockMs != null) {\n      return this.scteAdBreakEndWallClockMs;\n    }\n    if (\n      this.expectedAdBreakDurationMs == null ||\n      this.currentAdBreakStartWallClockMs == null\n    ) {\n      return undefined;\n    }\n    return this.currentAdBreakStartWallClockMs + this.expectedAdBreakDurationMs;\n  }\n\n  getDurationBudgetRemainingMs(): number {\n    if (this.expectedAdBreakDurationMs == null) {\n      return 0;\n    }\n    return Math.max(0, this.expectedAdBreakDurationMs - this.adBreakPlayedDurationMs);\n  }\n\n  getLoadedAdDurationMs(adController: AdController): number {\n    const durationSec = adController.getLoadedAdDuration?.();\n    if (durationSec == null || durationSec <= 0) {\n      return 0;\n    }\n    return Math.round(durationSec * 1000);\n  }\n\n  adFitsRemainingBudget(durationMs: number): boolean {\n    if (durationMs <= 0) {\n      return true;\n    }\n    return durationMs <= this.getDurationBudgetRemainingMs();\n  }\n\n  logAdDurationDecision(\n    accepted: boolean,\n    durationMs: number,\n    adController: AdController\n  ): void {\n    if (!this.debug) {\n      return;\n    }\n    const remainingBudget = this.getDurationBudgetRemainingMs();\n    const adId = adController.getLoadedAdId?.() ?? \"unknown\";\n    if (accepted) {\n      console.log(\n        `[AD-DURATION] Accepted ad id=${adId}, duration=${durationMs}ms, budget remaining after play=${Math.max(0, remainingBudget - durationMs)}ms`\n      );\n    } else {\n      console.log(\n        `[AD-DURATION] Rejected ad id=${adId}, duration=${durationMs}ms exceeds remaining budget=${remainingBudget}ms — requesting another ad`\n      );\n    }\n  }\n\n  recordPlayedAdDuration(adController: AdController): void {\n    const durationMs = this.getLoadedAdDurationMs(adController);\n    if (durationMs <= 0) {\n      return;\n    }\n    this.adBreakPlayedDurationMs += durationMs;\n    if (this.debug) {\n      console.log(\n        `[AD-DURATION] Played ${durationMs}ms — total played=${this.adBreakPlayedDurationMs}ms / ${this.expectedAdBreakDurationMs ?? \"?\"}ms`\n      );\n    }\n  }\n\n  ensureLoadedAdFitsBudget(adController: AdController): boolean {\n    const durationMs = this.getLoadedAdDurationMs(adController);\n    const fits = this.adFitsRemainingBudget(durationMs);\n    this.logAdDurationDecision(fits, durationMs, adController);\n    return fits;\n  }\n\n  rejectLoadedAdForDuration(adController: AdController): void {\n    try {\n      adController.destroy();\n    } catch {}\n  }\n\n  markAdStarted(): void {\n    this.currentAdIndex++;\n    this.totalAdsInBreak = this.currentAdIndex;\n    this.totalAdRequestsInBreak++;\n    this.lastAdRequestTime = Date.now();\n  }\n\n  notePodAdStarted(): void {\n    this.currentAdIndex++;\n    this.totalAdsInBreak = this.currentAdIndex;\n  }\n\n  getRemainingAdMs(): number {\n    const wallClockRemaining = this.getWallClockRemainingAdMs();\n    const budgetRemaining = this.getDurationBudgetRemainingMs();\n    if (this.expectedAdBreakDurationMs == null) {\n      return wallClockRemaining;\n    }\n    return Math.min(wallClockRemaining, budgetRemaining);\n  }\n\n  getMinRemainingMsToStartAd(): number {\n    const configured = this.config.minRemainingMsToStartAd;\n    if (typeof configured === \"number\" && configured >= 0) {\n      return configured;\n    }\n    return this.defaultMinRemainingMsToStartAd;\n  }\n\n  hasTimeToStartAnotherAd(): boolean {\n    const minRemaining = this.getMinRemainingMsToStartAd();\n    return (\n      this.getWallClockRemainingAdMs() > minRemaining &&\n      this.getDurationBudgetRemainingMs() > minRemaining\n    );\n  }\n\n  // --- Circuit breaker ---\n\n  isTemporaryAdError(error: Error): boolean {\n    const message = error?.message?.toLowerCase() || \"\";\n\n    if (message.includes(\"no ads available\") || message.includes(\"no fill\") || message.includes(\"nofill\")) {\n      return true;\n    }\n    if (message.includes(\"timeout\")) {\n      return true;\n    }\n    if (message.includes(\"rate limit\") || message.includes(\"too many requests\")) {\n      return true;\n    }\n    if (message.includes(\"ad playback error\")) {\n      return true;\n    }\n    return false;\n  }\n\n  isUrlInCooldown(vastTagUrl: string): boolean {\n    const failureTime = this.temporaryFailureUrls.get(vastTagUrl);\n    if (failureTime == null) {\n      return false;\n    }\n\n    const elapsed = Date.now() - failureTime;\n    if (elapsed >= this.temporaryFailureCooldownMs) {\n      this.temporaryFailureUrls.delete(vastTagUrl);\n      return false;\n    }\n\n    return true;\n  }\n\n  cleanupTemporaryFailures(): void {\n    const now = Date.now();\n    for (const [url, timestamp] of this.temporaryFailureUrls) {\n      if (now - timestamp >= this.temporaryFailureCooldownMs) {\n        this.temporaryFailureUrls.delete(url);\n      }\n    }\n  }\n\n  isGamInCooldown(): boolean {\n    return Date.now() < this.globalNoFillCooldownUntil;\n  }\n\n  recordGamNoFill(): void {\n    this.globalConsecutiveNoFills++;\n\n    if (this.globalConsecutiveNoFills >= this.globalNoFillThreshold) {\n      const exponent = this.globalConsecutiveNoFills - this.globalNoFillThreshold;\n      const backoff = Math.min(\n        this.globalNoFillBackoffBaseMs * Math.pow(2, exponent),\n        this.globalNoFillBackoffMaxMs\n      );\n      this.globalNoFillCooldownUntil = Date.now() + backoff;\n\n      if (this.debug) {\n        console.log(\n          `[CIRCUIT-BREAKER] GAM cooldown activated: ${backoff}ms (${this.globalConsecutiveNoFills} consecutive no-fills)`\n        );\n      }\n    }\n  }\n\n  resetGamNoFillCounter(): void {\n    if (this.globalConsecutiveNoFills > 0 && this.debug) {\n      console.log(\n        `[CIRCUIT-BREAKER] Resetting no-fill counter (was ${this.globalConsecutiveNoFills})`\n      );\n    }\n    this.globalConsecutiveNoFills = 0;\n    this.globalNoFillCooldownUntil = 0;\n  }\n\n  async enforceGlobalRateLimit(): Promise<void> {\n    const now = Date.now();\n    const elapsed = now - this.globalLastGamRequestTime;\n    if (elapsed < this.globalMinGamIntervalMs) {\n      const waitMs = this.globalMinGamIntervalMs - elapsed;\n      if (this.debug) {\n        console.log(`[RATE-LIMIT] Waiting ${waitMs}ms before next GAM request`);\n      }\n      await new Promise(resolve => setTimeout(resolve, waitMs));\n    }\n    this.globalLastGamRequestTime = Date.now();\n  }\n\n  // --- Watchdog ---\n\n  startAdRequestWatchdog(token: number): void {\n    this.clearAdRequestWatchdog();\n\n    const timeoutMs = this.config.adFailsafeTimeoutMs ?? 10000;\n    this.adRequestWatchdogToken = token;\n    this.adRequestWatchdogId = window.setTimeout(() => {\n      if (this.adRequestWatchdogToken !== token) {\n        return;\n      }\n\n      this.adRequestWatchdogId = undefined;\n      this.adRequestWatchdogToken = null;\n      if (this.activeAdRequestToken === token) {\n        this.activeAdRequestToken = null;\n      }\n\n      this.logAdState(\"ad_request_timeout\", { token, timeoutMs });\n      this.callbacks.onWatchdogTimeout();\n    }, timeoutMs) as unknown as number;\n\n    this.logAdState(\"ad_request_watchdog_started\", { token, timeoutMs });\n  }\n\n  clearAdRequestWatchdog(): void {\n    if (this.adRequestWatchdogId != null) {\n      clearTimeout(this.adRequestWatchdogId);\n      this.adRequestWatchdogId = undefined;\n    }\n\n    if (this.adRequestWatchdogToken != null) {\n      this.logAdState(\"ad_request_watchdog_cleared\", {\n        token: this.adRequestWatchdogToken,\n      });\n      this.adRequestWatchdogToken = null;\n    }\n  }\n\n  // --- Failsafe ---\n\n  startAdFailsafeTimer(token: number): void {\n    this.clearAdFailsafeTimer();\n\n    const failsafeMs = this.config.adFailsafeTimeoutMs ?? 10000;\n    this.adFailsafeToken = token;\n\n    this.adFailsafeTimerId = window.setTimeout(() => {\n      if (this.adFailsafeToken !== token) {\n        return;\n      }\n\n      this.adFailsafeTimerId = undefined;\n      this.adFailsafeToken = null;\n\n      if (this.activeAdRequestToken === token) {\n        this.activeAdRequestToken = null;\n      }\n\n      this.logAdState(\"ad_failsafe_triggered\", {\n        token,\n        failsafeMs,\n        videoPaused: this.video.paused,\n      });\n\n      this.callbacks.onFailsafeTimeout();\n    }, failsafeMs) as unknown as number;\n\n    this.logAdState(\"ad_failsafe_started\", { token, failsafeMs });\n  }\n\n  clearAdFailsafeTimer(): void {\n    if (this.adFailsafeTimerId != null) {\n      clearTimeout(this.adFailsafeTimerId);\n      this.logAdState(\"ad_failsafe_cleared\", { token: this.adFailsafeToken });\n      this.adFailsafeTimerId = undefined;\n    }\n\n    this.adFailsafeToken = null;\n  }\n\n  logAdState(event: string, extra: Record<string, unknown> = {}, adPlayer?: AdController, inAdBreak?: boolean, showAds?: boolean): void {\n    if (!this.debug) {\n      return;\n    }\n\n    console.log(\"[StormcloudVideoPlayer][AdState]\", {\n      event,\n      timestamp: new Date().toISOString(),\n      showAds: showAds ?? false,\n      adPlaying: adPlayer?.isAdPlaying() ?? false,\n      inAdBreak: inAdBreak ?? false,\n      activeAdRequestToken: this.activeAdRequestToken,\n      ...extra,\n    });\n  }\n\n  // --- Reset for ad break end ---\n\n  resetForBreakEnd(): void {\n    this.clearAdStopTimer();\n    this.clearAdStartTimer();\n    this.clearAdRequestWatchdog();\n    this.clearAdFailsafeTimer();\n    this.activeAdRequestToken = null;\n    this.expectedAdBreakDurationMs = undefined;\n    this.currentAdBreakStartWallClockMs = undefined;\n    this.scteAdBreakEndWallClockMs = undefined;\n    this.adBreakPlayedDurationMs = 0;\n    this.currentAdIndex = 0;\n    this.totalAdsInBreak = 0;\n    this.consecutiveFailures = 0;\n    this.globalConsecutiveNoFills = 0;\n    this.adBreakEpoch++;\n  }\n\n  destroy(): void {\n    this.clearAdStopTimer();\n    this.clearAdStartTimer();\n    this.clearAdFailsafeTimer();\n    this.clearAdRequestWatchdog();\n  }\n}\n","export class PlaceholderLayer {\n  private container: HTMLDivElement | undefined;\n  private debug: boolean;\n  private video: HTMLVideoElement;\n\n  constructor(video: HTMLVideoElement, debug: boolean) {\n    this.video = video;\n    this.debug = debug;\n  }\n\n  private ensureContainer(): void {\n    if (this.container) {\n      return;\n    }\n\n    const el = document.createElement(\"div\");\n    el.style.position = \"absolute\";\n    el.style.left = \"0\";\n    el.style.top = \"0\";\n    el.style.right = \"0\";\n    el.style.bottom = \"0\";\n    el.style.display = \"none\";\n    el.style.alignItems = \"center\";\n    el.style.justifyContent = \"center\";\n    el.style.pointerEvents = \"none\";\n    el.style.zIndex = \"5\";\n    el.style.backgroundColor = \"#000\";\n    el.style.transition = \"opacity 0.3s ease-in-out\";\n    el.style.opacity = \"0\";\n\n    if (!this.video.parentElement) {\n      if (this.debug) {\n        console.warn(\"[StormcloudVideoPlayer] Video element has no parent for placeholder container\");\n      }\n      return;\n    }\n\n    this.video.parentElement.appendChild(el);\n    this.container = el;\n  }\n\n  show(): void {\n    this.ensureContainer();\n\n    if (!this.container) {\n      return;\n    }\n\n    if (!this.video.muted) {\n      this.video.muted = true;\n      if (this.debug) {\n        console.log(\"[StormcloudVideoPlayer] Muted video when showing placeholder\");\n      }\n    }\n\n    const wasHidden = this.container.style.display === \"none\" || this.container.style.opacity === \"0\";\n    if (wasHidden) {\n      this.container.style.transition = \"none\";\n    } else {\n      this.container.style.transition = \"opacity 0.3s ease-in-out\";\n    }\n\n    this.container.style.backgroundColor = \"#000\";\n    this.container.style.display = \"flex\";\n    this.container.offsetHeight;\n    this.container.style.opacity = \"1\";\n    this.container.style.pointerEvents = \"auto\";\n\n    if (wasHidden) {\n      requestAnimationFrame(() => {\n        if (this.container) {\n          this.container.style.transition = \"opacity 0.3s ease-in-out\";\n        }\n      });\n    }\n\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] Showing placeholder layer (between content and ad layer)\");\n    }\n  }\n\n  hide(): void {\n    if (!this.container) {\n      return;\n    }\n\n    this.container.style.opacity = \"0\";\n    setTimeout(() => {\n      if (this.container) {\n        this.container.style.display = \"none\";\n        this.container.style.pointerEvents = \"none\";\n        this.container.style.backgroundColor = \"#000\";\n      }\n    }, 300);\n\n    if (this.debug) {\n      console.log(\"[StormcloudVideoPlayer] Hiding placeholder layer\");\n    }\n  }\n\n  destroy(): void {\n    if (this.container) {\n      if (this.container.parentElement) {\n        this.container.parentElement.removeChild(this.container);\n      }\n      this.container = undefined;\n    }\n  }\n}\n","import Hls from \"hls.js\";\nimport type {\n  StormcloudVideoPlayerConfig,\n  Scte35Marker,\n  Id3TagInfo,\n} from \"../types\";\nimport type { Scte35CueContext } from \"./playerTypes\";\nimport {\n  parseScte35FromId3,\n  parseScte35FromTsPackets,\n  normalizeFragmentPayload,\n  getFragmentStartSeconds,\n  parseCueOutDuration,\n  parseCueOutCont,\n  parseAttributeList,\n  toNumber,\n} from \"./Scte35Parser\";\nimport type { Scte35CueManager } from \"./Scte35CueManager\";\nimport type { AdTimingService } from \"./AdTimingService\";\n\nexport interface HlsEngineCallbacks {\n  onManifestParsed(isLive: boolean): Promise<void>;\n  onScte35Cue(marker: Scte35Marker, context: Scte35CueContext): void;\n  activatePendingCuesForFragment(frag: any): void;\n  onFatalDestroy(): void;\n  isInAdBreak(): boolean;\n  hasPendingAdBreak(): boolean;\n}\n\nexport class HlsEngine {\n  hls: Hls | undefined;\n  isLiveStream: boolean = false;\n  nativeHlsMode: boolean = false;\n  videoSrcProtection: string | null = null;\n\n  private bufferedSegmentsCount: number = 0;\n  private shouldAutoplayAfterBuffering: boolean = false;\n  private hasInitialBufferCompleted: boolean = false;\n\n  private readonly config: StormcloudVideoPlayerConfig;\n  private readonly video: HTMLVideoElement;\n  private readonly cueManager: Scte35CueManager;\n  private readonly timing: AdTimingService;\n  private readonly callbacks: HlsEngineCallbacks;\n\n  constructor(\n    config: StormcloudVideoPlayerConfig,\n    video: HTMLVideoElement,\n    cueManager: Scte35CueManager,\n    timing: AdTimingService,\n    callbacks: HlsEngineCallbacks\n  ) {\n    this.config = config;\n    this.video = video;\n    this.cueManager = cueManager;\n    this.timing = timing;\n    this.callbacks = callbacks;\n  }\n\n  private get debug(): boolean {\n    return !!this.config.debugAdTiming;\n  }\n\n  shouldUseNativeHls(getStreamType: () => \"hls\" | \"other\"): boolean {\n    const streamType = getStreamType();\n    if (streamType === \"other\") {\n      return true;\n    }\n    const canNative = this.video.canPlayType(\"application/vnd.apple.mpegurl\");\n    return !!(this.config.allowNativeHls && canNative);\n  }\n\n  async setupNativeHls(): Promise<void> {\n    this.nativeHlsMode = true;\n    this.videoSrcProtection = this.config.src;\n    this.video.src = this.config.src;\n\n    this.isLiveStream = this.config.isLiveStream ?? (this.config.lowLatencyMode ?? false);\n\n    if (this.debug) {\n      const adBehavior = this.isLiveStream\n        ? \"live (main video continues muted during ads)\"\n        : \"vod (main video pauses during ads)\";\n      console.log(\n        \"[StormcloudVideoPlayer] Using native HLS playback:\",\n        {\n          isLive: this.isLiveStream,\n          allowNativeHls: this.config.allowNativeHls,\n          adBehavior,\n        }\n      );\n    }\n\n    if (this.config.autoplay) {\n      await this.video.play()?.catch(() => {});\n    }\n  }\n\n  setupHls(): void {\n    this.hls = new Hls({\n      enableWorker: true,\n      backBufferLength: 30,\n      liveDurationInfinity: true,\n      lowLatencyMode: !!this.config.lowLatencyMode,\n      maxLiveSyncPlaybackRate: this.config.lowLatencyMode ? 1.5 : 1.0,\n      ...(this.config.lowLatencyMode ? { liveSyncDuration: 2 } : {}),\n      maxBufferLength: 30,\n      maxMaxBufferLength: 600,\n      maxBufferSize: 60 * 1000 * 1000,\n      maxBufferHole: 0.5,\n      highBufferWatchdogPeriod: 2,\n      nudgeOffset: 0.1,\n      nudgeMaxRetry: 3,\n      startPosition: -1,\n    });\n\n    this.hls.on(Hls.Events.MEDIA_ATTACHED, () => {\n      this.hls?.loadSource(this.config.src);\n    });\n\n    this.hls.on(Hls.Events.MANIFEST_PARSED, async (_, _data: any) => {\n      this.isLiveStream =\n        this.config.isLiveStream ??\n        (this.hls?.levels?.some(\n          (level) =>\n            level?.details?.live === true || level?.details?.type === \"LIVE\"\n        ) ?? false);\n\n      await this.callbacks.onManifestParsed(this.isLiveStream);\n\n      this.bufferedSegmentsCount = 0;\n      this.hasInitialBufferCompleted = false;\n      this.shouldAutoplayAfterBuffering = !!this.config.autoplay;\n\n      const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n\n      if (this.debug) {\n        console.log(\n          \"[StormcloudVideoPlayer] Waiting for\",\n          minSegments,\n          \"segments to buffer before playback\"\n        );\n      }\n\n      if (minSegments === 0 || !this.config.autoplay) {\n        this.hasInitialBufferCompleted = true;\n        if (this.config.autoplay) {\n          await this.video.play()?.catch(() => {});\n        }\n      }\n    });\n\n    this.hls.on(Hls.Events.LEVEL_LOADED, (_evt, data: any) => {\n      if (this.callbacks.isInAdBreak() || this.callbacks.hasPendingAdBreak()) {\n        return;\n      }\n\n      const details = data?.details;\n      if (!details || !details.fragments || details.fragments.length === 0) {\n        return;\n      }\n\n      const fragmentsToScan = Math.min(5, details.fragments.length);\n\n      for (let i = 0; i < fragmentsToScan; i++) {\n        const frag = details.fragments[i];\n        const tagList: any[] | undefined = frag?.tagList;\n\n        if (!Array.isArray(tagList)) continue;\n\n        for (const entry of tagList) {\n          let tag = \"\";\n          let value = \"\";\n\n          if (Array.isArray(entry)) {\n            tag = String(entry[0] ?? \"\");\n            value = String(entry[1] ?? \"\");\n          } else if (typeof entry === \"string\") {\n            const idx = entry.indexOf(\":\");\n            if (idx >= 0) {\n              tag = entry.substring(0, idx);\n              value = entry.substring(idx + 1);\n            } else {\n              tag = entry;\n            }\n          }\n\n          if (!tag) continue;\n\n          if (tag.includes(\"EXT-X-CUE-OUT\") || tag.includes(\"EXT-X-DATERANGE\")) {\n            const attrs = tag.includes(\"EXT-X-DATERANGE\")\n              ? parseAttributeList(value)\n              : {};\n            const hasScteOut = tag.includes(\"EXT-X-CUE-OUT\") ||\n              \"SCTE35-OUT\" in attrs ||\n              attrs[\"SCTE35-OUT\"] !== undefined;\n\n            if (hasScteOut) {\n              const durationSeconds = parseCueOutDuration(value);\n              const marker: Scte35Marker = {\n                type: \"start\",\n                ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n                raw: { tag, value, earlyDetection: true },\n              } as Scte35Marker;\n\n              if (this.debug) {\n                console.log(\"[StormcloudVideoPlayer] EARLY SCTE-35 DETECTION: Ad break marker found in fragment\", i, \"- starting pre-fetch (NOT playing yet)\");\n              }\n\n              this.callbacks.onScte35Cue(marker, {\n                ...this.cueManager.createScte35CueContext(\"manifest\", \"early\", frag),\n              });\n              return;\n            }\n          }\n        }\n      }\n    });\n\n    this.hls.on(Hls.Events.FRAG_BUFFERED, async (_evt, _data: any) => {\n      if (this.hasInitialBufferCompleted) {\n        return;\n      }\n\n      this.bufferedSegmentsCount++;\n      const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n\n      if (this.debug) {\n        console.log(\n          `[StormcloudVideoPlayer] Buffered segment ${this.bufferedSegmentsCount}/${minSegments}`\n        );\n      }\n\n      if (this.bufferedSegmentsCount >= minSegments) {\n        this.hasInitialBufferCompleted = true;\n\n        if (this.shouldAutoplayAfterBuffering) {\n          if (this.debug) {\n            console.log(\n              `[StormcloudVideoPlayer] Initial buffer complete (${this.bufferedSegmentsCount} segments). Starting playback.`\n            );\n          }\n          await this.video.play()?.catch((err) => {\n            if (this.debug) {\n              console.warn(\"[StormcloudVideoPlayer] Autoplay failed:\", err);\n            }\n          });\n        }\n      }\n    });\n\n    this.hls.on(Hls.Events.FRAG_PARSING_METADATA, (_evt, data: any) => {\n      const id3Tags: Id3TagInfo[] = (data?.samples || []).map((s: any) => ({\n        key: \"ID3\",\n        value: s?.data,\n        ptsSeconds: s?.pts,\n      }));\n      id3Tags.forEach((tag) => this.onId3Tag(tag));\n    });\n\n    this.hls.on(Hls.Events.FRAG_LOADED, (_evt, data: any) => {\n      this.processFragmentScte35Payload(\n        data?.payload,\n        typeof data?.frag?.sn === \"number\" ? data.frag.sn : undefined,\n        getFragmentStartSeconds(data?.frag)\n      );\n    });\n\n    this.hls.on(Hls.Events.FRAG_DECRYPTED, (_evt, data: any) => {\n      this.processFragmentScte35Payload(\n        data?.payload,\n        typeof data?.frag?.sn === \"number\" ? data.frag.sn : undefined,\n        getFragmentStartSeconds(data?.frag)\n      );\n    });\n\n    this.hls.on(Hls.Events.FRAG_CHANGED, (_evt, data: any) => {\n      const frag = data?.frag;\n      const tagList: any[] | undefined = frag?.tagList;\n      if (!Array.isArray(tagList)) {\n        this.callbacks.activatePendingCuesForFragment(frag);\n        return;\n      }\n\n      for (const entry of tagList) {\n        let tag = \"\";\n        let value = \"\";\n        if (Array.isArray(entry)) {\n          tag = String(entry[0] ?? \"\");\n          value = String(entry[1] ?? \"\");\n        } else if (typeof entry === \"string\") {\n          const idx = entry.indexOf(\":\");\n          if (idx >= 0) {\n            tag = entry.substring(0, idx);\n            value = entry.substring(idx + 1);\n          } else {\n            tag = entry;\n            value = \"\";\n          }\n        }\n\n        if (!tag) continue;\n        if (tag.includes(\"EXT-X-CUE-OUT-CONT\")) {\n          const prog = parseCueOutCont(value);\n          const marker: Scte35Marker = {\n            type: \"progress\",\n            ...(prog?.duration !== undefined\n              ? { durationSeconds: prog.duration }\n              : {}),\n            ...(prog?.elapsed !== undefined\n              ? { ptsSeconds: prog.elapsed }\n              : {}),\n            raw: { tag, value },\n          } as Scte35Marker;\n          this.callbacks.onScte35Cue(marker, {\n            ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n          });\n        } else if (tag.includes(\"EXT-X-CUE-OUT\")) {\n          const durationSeconds = parseCueOutDuration(value);\n          const marker: Scte35Marker = {\n            type: \"start\",\n            ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n            raw: { tag, value },\n          } as Scte35Marker;\n          this.callbacks.onScte35Cue(marker, {\n            ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n          });\n        } else if (tag.includes(\"EXT-X-CUE-IN\")) {\n          this.callbacks.onScte35Cue(\n            { type: \"end\", raw: { tag, value } },\n            {\n              ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n            }\n          );\n        } else if (tag.includes(\"EXT-X-DATERANGE\")) {\n          const attrs = parseAttributeList(value);\n          const hasScteOut =\n            \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== undefined;\n          const hasScteIn =\n            \"SCTE35-IN\" in attrs || attrs[\"SCTE35-IN\"] !== undefined;\n          const klass = String(attrs[\"CLASS\"] ?? \"\");\n          const duration = toNumber(attrs[\"DURATION\"]);\n\n          if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n            const marker: Scte35Marker = {\n              type: \"start\",\n              ...(duration !== undefined ? { durationSeconds: duration } : {}),\n              raw: { tag, value, attrs },\n            } as Scte35Marker;\n            this.callbacks.onScte35Cue(marker, {\n              ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n            });\n          }\n          if (hasScteIn) {\n            this.callbacks.onScte35Cue(\n              { type: \"end\", raw: { tag, value, attrs } },\n              {\n                ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n              }\n            );\n          }\n        }\n      }\n      this.callbacks.activatePendingCuesForFragment(frag);\n    });\n\n    this.hls.on(Hls.Events.ERROR, (_evt, data) => {\n      if (data?.fatal) {\n        switch (data.type) {\n          case Hls.ErrorTypes.NETWORK_ERROR:\n            this.hls?.startLoad();\n            break;\n          case Hls.ErrorTypes.MEDIA_ERROR:\n            this.hls?.recoverMediaError();\n            break;\n          default:\n            this.callbacks.onFatalDestroy();\n            break;\n        }\n      }\n    });\n\n    this.hls.attachMedia(this.video);\n  }\n\n  private onId3Tag(tag: Id3TagInfo): void {\n    if (typeof tag.ptsSeconds === \"number\") {\n      this.timing.updatePtsDrift(tag.ptsSeconds);\n    }\n    const marker = parseScte35FromId3(tag);\n    if (marker) {\n      this.callbacks.onScte35Cue(marker, {\n        source: \"id3\",\n        readiness: \"playback\",\n      });\n    }\n  }\n\n  private processFragmentScte35Payload(\n    payloadData: unknown,\n    fragmentSn?: number,\n    fragmentStartSeconds?: number\n  ): void {\n    const payload = normalizeFragmentPayload(payloadData);\n    if (!payload) {\n      return;\n    }\n\n    const markers = parseScte35FromTsPackets(\n      payload,\n      this.cueManager.tsScte35Pids,\n      this.cueManager.pmtPids,\n      this.cueManager.processedTsScte35Sections\n    );\n    markers.forEach((marker) => {\n      const context: Scte35CueContext = {\n        source: \"ts\",\n        readiness: \"early\",\n      };\n      if (fragmentSn !== undefined) {\n        context.fragmentSn = fragmentSn;\n      }\n      if (fragmentStartSeconds !== undefined) {\n        context.fragmentStartSeconds = fragmentStartSeconds;\n      }\n      this.callbacks.onScte35Cue(marker, context);\n    });\n  }\n\n  getLiveSyncPosition(): number | undefined {\n    const pos = this.hls?.liveSyncPosition;\n    return typeof pos === \"number\" && Number.isFinite(pos) ? pos : undefined;\n  }\n\n  destroy(): void {\n    this.hls?.destroy();\n    this.hls = undefined;\n  }\n}\n"]}