stormcloud-video-player 0.2.5 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -230,7 +230,7 @@ function createImaController(video, options) {
230
230
  );
231
231
  emit("ad_error");
232
232
  if (!options?.continueLiveStreamDuringAds) {
233
- video.play().catch(() => {
233
+ video.play()?.catch(() => {
234
234
  });
235
235
  }
236
236
  }
@@ -265,7 +265,7 @@ function createImaController(video, options) {
265
265
  if (adContainerEl)
266
266
  adContainerEl.style.pointerEvents = "none";
267
267
  if (!options?.continueLiveStreamDuringAds) {
268
- video.play().catch(() => {
268
+ video.play()?.catch(() => {
269
269
  });
270
270
  console.log("[IMA] Video resumed (VOD mode)");
271
271
  } else {
@@ -378,7 +378,7 @@ function createImaController(video, options) {
378
378
  console.error("[IMA] Error starting ad playback:", error);
379
379
  adPlaying = false;
380
380
  if (!options?.continueLiveStreamDuringAds) {
381
- video.play().catch(() => {
381
+ video.play()?.catch(() => {
382
382
  });
383
383
  }
384
384
  return Promise.reject(error);
@@ -611,13 +611,32 @@ function getClientInfo() {
611
611
  }
612
612
  async function getBrowserID(clientInfo) {
613
613
  const fingerprintString = JSON.stringify(clientInfo);
614
- const hashBuffer = await crypto.subtle.digest(
615
- "SHA-256",
616
- new TextEncoder().encode(fingerprintString)
617
- );
618
- const hashArray = Array.from(new Uint8Array(hashBuffer));
619
- const hashHex = hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
620
- return hashHex;
614
+ if (typeof crypto !== "undefined" && crypto.subtle && crypto.subtle.digest) {
615
+ try {
616
+ const hashBuffer = await crypto.subtle.digest(
617
+ "SHA-256",
618
+ new TextEncoder().encode(fingerprintString)
619
+ );
620
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
621
+ const hashHex = hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
622
+ return hashHex;
623
+ } catch (error) {
624
+ console.warn(
625
+ "[StormcloudVideoPlayer] crypto.subtle.digest failed, using fallback hash:",
626
+ error
627
+ );
628
+ }
629
+ }
630
+ let hash = 0;
631
+ for (let i = 0; i < fingerprintString.length; i++) {
632
+ const char = fingerprintString.charCodeAt(i);
633
+ hash = (hash << 5) - hash + char;
634
+ hash = hash & hash;
635
+ }
636
+ const fallbackHash = Math.abs(hash).toString(16).padStart(8, "0");
637
+ const timestamp = Date.now().toString(16).padStart(12, "0");
638
+ const random = Math.random().toString(16).substring(2, 14).padStart(12, "0");
639
+ return (fallbackHash + timestamp + random).padEnd(64, "0");
621
640
  }
622
641
  async function sendInitialTracking(licenseKey) {
623
642
  try {
@@ -735,7 +754,7 @@ var StormcloudVideoPlayer = class {
735
754
  });
736
755
  this.ima.initialize();
737
756
  if (this.config.autoplay) {
738
- await this.video.play().catch(() => {
757
+ await this.video.play()?.catch(() => {
739
758
  });
740
759
  }
741
760
  return;
@@ -769,7 +788,7 @@ var StormcloudVideoPlayer = class {
769
788
  });
770
789
  this.ima.initialize();
771
790
  if (this.config.autoplay) {
772
- await this.video.play().catch(() => {
791
+ await this.video.play()?.catch(() => {
773
792
  });
774
793
  }
775
794
  });
@@ -1402,17 +1421,6 @@ var StormcloudVideoPlayer = class {
1402
1421
  }
1403
1422
  return true;
1404
1423
  }
1405
- async loadDefaultVastFromAdstorm(adstormApiUrl, params) {
1406
- const usp = new URLSearchParams(params || {});
1407
- const url = `${adstormApiUrl}?${usp.toString()}`;
1408
- const res = await fetch(url);
1409
- if (!res.ok) throw new Error(`Failed to fetch adstorm ads: ${res.status}`);
1410
- const data = await res.json();
1411
- const tag = data?.adTagUrl || data?.vastTagUrl || data?.tagUrl;
1412
- if (typeof tag === "string" && tag.length > 0) {
1413
- this.apiVastTagUrl = tag;
1414
- }
1415
- }
1416
1424
  async handleAdStart(_marker) {
1417
1425
  const scheduled = this.findCurrentOrNextBreak(
1418
1426
  this.video.currentTime * 1e3
@@ -1593,7 +1601,7 @@ var StormcloudVideoPlayer = class {
1593
1601
  this.currentAdIndex = 0;
1594
1602
  this.totalAdsInBreak = 0;
1595
1603
  if (this.video.paused) {
1596
- this.video.play().catch(() => {
1604
+ this.video.play()?.catch(() => {
1597
1605
  if (this.config.debugAdTiming) {
1598
1606
  console.error(
1599
1607
  "[StormcloudVideoPlayer] Failed to resume video after ad failure"
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/player/StormcloudVideoPlayer.ts","../../src/sdk/ima.ts","../../src/utils/tracking.ts"],"sourcesContent":["import Hls from \"hls.js\";\nimport type {\n StormcloudVideoPlayerConfig,\n Scte35Marker,\n Id3TagInfo,\n ImaController,\n AdBreak,\n StormcloudApiResponse,\n} from \"../types\";\nimport { createImaController } from \"../sdk/ima\";\nimport { sendInitialTracking, sendHeartbeat } from \"../utils/tracking\";\n\nexport class StormcloudVideoPlayer {\n private readonly video: HTMLVideoElement;\n private readonly config: StormcloudVideoPlayerConfig;\n private hls?: Hls;\n private ima: ImaController;\n private attached = false;\n private inAdBreak = false;\n private currentAdBreakStartWallClockMs: number | undefined;\n private expectedAdBreakDurationMs: number | undefined;\n private adStopTimerId: number | undefined;\n private adStartTimerId: number | undefined;\n private adFailsafeTimerId: number | undefined;\n private ptsDriftEmaMs = 0;\n private adPodQueue: string[] = [];\n private apiVastTagUrl: string | undefined;\n private vastConfig:\n | StormcloudApiResponse[\"response\"][\"options\"][\"vast\"]\n | undefined;\n private lastHeartbeatTime: number = 0;\n private heartbeatInterval: number | undefined;\n private currentAdIndex: number = 0;\n private totalAdsInBreak: number = 0;\n private showAds: boolean = false;\n private isLiveStream: boolean = false;\n\n constructor(config: StormcloudVideoPlayerConfig) {\n this.config = config;\n this.video = config.videoElement;\n\n this.ima = createImaController(this.video, {\n continueLiveStreamDuringAds: false,\n });\n }\n\n async load(): Promise<void> {\n if (!this.attached) {\n this.attach();\n }\n\n try {\n await this.fetchAdConfiguration();\n } catch (error) {\n if (this.config.debugAdTiming) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to fetch ad configuration:\",\n error\n );\n }\n }\n\n this.initializeTracking();\n\n if (this.shouldUseNativeHls()) {\n this.video.src = this.config.src;\n\n this.isLiveStream = this.config.lowLatencyMode ?? false;\n\n if (this.config.debugAdTiming) {\n console.log(\n \"[StormcloudVideoPlayer] allowNativeHls: true - VOD mode detected:\",\n {\n isLive: this.isLiveStream,\n allowNativeHls: this.config.allowNativeHls,\n adBehavior: \"vod (main video pauses during ads)\",\n }\n );\n }\n\n this.ima.destroy();\n this.ima = createImaController(this.video, {\n continueLiveStreamDuringAds: false,\n });\n this.ima.initialize();\n\n if (this.config.autoplay) {\n await this.video.play().catch(() => {});\n }\n return;\n }\n\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 });\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.hls?.levels?.some(\n (level) =>\n level?.details?.live === true || level?.details?.type === \"LIVE\"\n ) ?? false;\n\n if (this.config.debugAdTiming) {\n const adBehavior = this.shouldContinueLiveStreamDuringAds()\n ? \"live (main video continues muted during ads)\"\n : \"vod (main video pauses during ads)\";\n console.log(\"[StormcloudVideoPlayer] Stream type detected:\", {\n isLive: this.isLiveStream,\n allowNativeHls: this.config.allowNativeHls,\n adBehavior,\n });\n }\n\n this.ima.destroy();\n this.ima = createImaController(this.video, {\n continueLiveStreamDuringAds: this.shouldContinueLiveStreamDuringAds(),\n });\n this.ima.initialize();\n\n if (this.config.autoplay) {\n await this.video.play().catch(() => {});\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_CHANGED, (_evt, data: any) => {\n const frag = data?.frag;\n const tagList: any[] | undefined = frag?.tagList;\n if (!Array.isArray(tagList)) 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\n if (!tag) continue;\n if (tag.includes(\"EXT-X-CUE-OUT\")) {\n const durationSeconds = this.parseCueOutDuration(value);\n const marker: Scte35Marker = {\n type: \"start\",\n ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n raw: { tag, value },\n } as Scte35Marker;\n this.onScte35Marker(marker);\n } else if (tag.includes(\"EXT-X-CUE-OUT-CONT\")) {\n const prog = this.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.onScte35Marker(marker);\n } else if (tag.includes(\"EXT-X-CUE-IN\")) {\n this.onScte35Marker({ type: \"end\", raw: { tag, value } });\n } else if (tag.includes(\"EXT-X-DATERANGE\")) {\n const attrs = this.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 = this.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.onScte35Marker(marker);\n }\n if (hasScteIn) {\n this.onScte35Marker({ type: \"end\", raw: { tag, value, attrs } });\n }\n }\n }\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.destroy();\n break;\n }\n }\n });\n\n this.hls.attachMedia(this.video);\n }\n\n private attach(): void {\n if (this.attached) return;\n this.attached = true;\n this.video.autoplay = !!this.config.autoplay;\n this.video.muted = !!this.config.muted;\n\n this.ima.initialize();\n this.ima.on(\"all_ads_completed\", () => {\n if (!this.inAdBreak) return;\n const remaining = this.getRemainingAdMs();\n if (remaining > 500 && this.adPodQueue.length > 0) {\n const next = this.adPodQueue.shift()!;\n this.currentAdIndex++;\n this.playSingleAd(next).catch(() => {});\n } else {\n this.currentAdIndex = 0;\n this.totalAdsInBreak = 0;\n this.showAds = false;\n }\n });\n this.ima.on(\"ad_error\", () => {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] IMA ad_error event received\");\n }\n if (!this.inAdBreak) return;\n const remaining = this.getRemainingAdMs();\n if (remaining > 500 && this.adPodQueue.length > 0) {\n const next = this.adPodQueue.shift()!;\n this.currentAdIndex++;\n this.playSingleAd(next).catch(() => {});\n } else {\n this.handleAdFailure();\n }\n });\n this.ima.on(\"content_pause\", () => {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] IMA content_pause event received\");\n }\n this.clearAdFailsafeTimer();\n });\n this.ima.on(\"content_resume\", () => {\n if (this.config.debugAdTiming) {\n console.log(\n \"[StormcloudVideoPlayer] IMA content_resume event received\"\n );\n }\n this.clearAdFailsafeTimer();\n });\n\n this.video.addEventListener(\"timeupdate\", () => {\n this.onTimeUpdate(this.video.currentTime);\n });\n }\n\n private shouldUseNativeHls(): boolean {\n const streamType = this.getStreamType();\n\n if (streamType === \"other\") {\n return true;\n }\n\n const canNative = this.video.canPlayType(\"application/vnd.apple.mpegURL\");\n return !!(this.config.allowNativeHls && canNative);\n }\n\n private onId3Tag(tag: Id3TagInfo): void {\n if (typeof tag.ptsSeconds === \"number\") {\n this.updatePtsDrift(tag.ptsSeconds);\n }\n const marker = this.parseScte35FromId3(tag);\n if (marker) {\n this.onScte35Marker(marker);\n }\n }\n\n private parseScte35FromId3(tag: Id3TagInfo): Scte35Marker | undefined {\n const text = this.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 = this.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 = this.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 = this.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 = this.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 = this.parseScte35Binary(tag.value);\n if (bin) return bin;\n }\n\n return undefined;\n }\n\n private 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\n private onScte35Marker(marker: Scte35Marker): void {\n if (this.config.debugAdTiming) {\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 });\n }\n\n if (marker.type === \"start\") {\n this.inAdBreak = true;\n const durationMs =\n marker.durationSeconds != null\n ? marker.durationSeconds * 1000\n : undefined;\n this.expectedAdBreakDurationMs = durationMs;\n this.currentAdBreakStartWallClockMs = Date.now();\n\n const isManifestMarker = this.isManifestBasedMarker(marker);\n const forceImmediate = this.config.immediateManifestAds ?? true;\n\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Ad start decision:\", {\n isManifestMarker,\n forceImmediate,\n hasPts: typeof marker.ptsSeconds === \"number\",\n });\n }\n\n if (isManifestMarker && forceImmediate) {\n if (this.config.debugAdTiming) {\n console.log(\n \"[StormcloudVideoPlayer] Starting ad immediately (manifest-based)\"\n );\n }\n this.clearAdStartTimer();\n this.handleAdStart(marker);\n } else if (typeof marker.ptsSeconds === \"number\") {\n const tol = this.config.driftToleranceMs ?? 1000;\n const nowMs = this.video.currentTime * 1000;\n const estCurrentPtsMs = nowMs - this.ptsDriftEmaMs;\n const deltaMs = Math.floor(marker.ptsSeconds * 1000 - estCurrentPtsMs);\n\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] PTS-based timing calculation:\", {\n nowMs,\n estCurrentPtsMs,\n markerPtsMs: marker.ptsSeconds * 1000,\n deltaMs,\n tolerance: tol,\n });\n }\n\n if (deltaMs > tol) {\n if (this.config.debugAdTiming) {\n console.log(\n `[StormcloudVideoPlayer] Scheduling ad start in ${deltaMs}ms`\n );\n }\n this.scheduleAdStartIn(deltaMs);\n } else {\n if (this.config.debugAdTiming) {\n console.log(\n \"[StormcloudVideoPlayer] Starting ad immediately (within tolerance)\"\n );\n }\n this.clearAdStartTimer();\n this.handleAdStart(marker);\n }\n } else {\n if (this.config.debugAdTiming) {\n console.log(\n \"[StormcloudVideoPlayer] Starting ad immediately (fallback)\"\n );\n }\n this.clearAdStartTimer();\n this.handleAdStart(marker);\n }\n if (this.expectedAdBreakDurationMs != null) {\n this.scheduleAdStopCountdown(this.expectedAdBreakDurationMs);\n }\n return;\n }\n if (marker.type === \"progress\" && this.inAdBreak) {\n if (marker.durationSeconds != null) {\n this.expectedAdBreakDurationMs = marker.durationSeconds * 1000;\n }\n if (\n this.expectedAdBreakDurationMs != null &&\n this.currentAdBreakStartWallClockMs != null\n ) {\n const elapsedMs = Date.now() - this.currentAdBreakStartWallClockMs;\n const remainingMs = Math.max(\n 0,\n this.expectedAdBreakDurationMs - elapsedMs\n );\n this.scheduleAdStopCountdown(remainingMs);\n }\n if (!this.ima.isAdPlaying()) {\n const scheduled = this.findCurrentOrNextBreak(\n this.video.currentTime * 1000\n );\n const tags =\n this.selectVastTagsForBreak(scheduled) ||\n (this.apiVastTagUrl ? [this.apiVastTagUrl] : undefined);\n if (tags && tags.length > 0) {\n const first = tags[0] as string;\n const rest = tags.slice(1);\n this.adPodQueue = rest;\n this.playSingleAd(first).catch(() => {});\n }\n }\n return;\n }\n if (marker.type === \"end\") {\n this.inAdBreak = false;\n this.expectedAdBreakDurationMs = undefined;\n this.currentAdBreakStartWallClockMs = undefined;\n this.clearAdStartTimer();\n this.clearAdStopTimer();\n if (this.ima.isAdPlaying()) {\n this.ima.stop().catch(() => {});\n }\n return;\n }\n }\n\n private 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\n private parseCueOutCont(\n value: string\n ): { elapsed?: number; duration?: number } | undefined {\n const elapsedMatch = value.match(/Elapsed\\s*=\\s*([0-9.]+)/i);\n const durationMatch = value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n const res: { elapsed?: number; duration?: number } = {};\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) return res;\n return undefined;\n }\n\n private 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\n private 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\n private 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\n private parseScte35Binary(data: Uint8Array): Scte35Marker | undefined {\n class 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 }\n\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 r.readBits(8);\n r.readBits(1);\n r.readBits(6);\n const ptsAdjHigh = r.readBits(1);\n const ptsAdjLow = r.readBits(32);\n void ptsAdjHigh;\n void ptsAdjLow;\n r.readBits(8);\n r.readBits(12);\n const spliceCommandLength = r.readBits(12);\n const spliceCommandType = r.readBits(8);\n if (spliceCommandType !== 5) {\n return undefined;\n }\n 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 if (programSpliceFlag && !spliceImmediateFlag) {\n const timeSpecifiedFlag = r.readBits(1) === 1;\n if (timeSpecifiedFlag) {\n r.readBits(6);\n r.readBits(33);\n } else {\n r.readBits(7);\n }\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 timeSpecifiedFlag = r.readBits(1) === 1;\n if (timeSpecifiedFlag) {\n r.readBits(6);\n r.readBits(33);\n } else {\n r.readBits(7);\n }\n }\n }\n }\n let durationSeconds: number | undefined = undefined;\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\n if (outOfNetwork) {\n const marker: Scte35Marker = {\n type: \"start\",\n ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n raw: { splice_command_type: 5 },\n } as Scte35Marker;\n return marker;\n }\n return undefined;\n }\n\n private initializeTracking(): void {\n sendInitialTracking(this.config.licenseKey).catch((error) => {\n if (this.config.debugAdTiming) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to send initial tracking:\",\n error\n );\n }\n });\n\n this.heartbeatInterval = window.setInterval(() => {\n this.sendHeartbeatIfNeeded();\n }, 5000);\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).catch((error) => {\n if (this.config.debugAdTiming) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to send heartbeat:\",\n error\n );\n }\n });\n }\n }\n\n private async fetchAdConfiguration(): Promise<void> {\n const apiUrl = \"https://adstorm.co/api-adstorm-dev/adstorm/ads/web\";\n\n if (this.config.debugAdTiming) {\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 throw new Error(`Failed to fetch ad configuration: ${response.status}`);\n }\n\n const data: StormcloudApiResponse = await response.json();\n\n const imaPayload = data.response?.ima?.[\"publisherdesk.ima\"]?.payload;\n if (imaPayload) {\n this.apiVastTagUrl = decodeURIComponent(imaPayload);\n if (this.config.debugAdTiming) {\n console.log(\n \"[StormcloudVideoPlayer] Extracted VAST tag URL:\",\n this.apiVastTagUrl\n );\n }\n }\n\n this.vastConfig = data.response?.options?.vast;\n\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Ad configuration loaded:\", {\n vastTagUrl: this.apiVastTagUrl,\n vastConfig: this.vastConfig,\n });\n }\n }\n\n getCurrentAdIndex(): number {\n return this.currentAdIndex;\n }\n\n getTotalAdsInBreak(): number {\n return this.totalAdsInBreak;\n }\n\n isAdPlaying(): boolean {\n return this.inAdBreak && this.ima.isAdPlaying();\n }\n\n isShowingAds(): boolean {\n return this.showAds;\n }\n\n getStreamType(): \"hls\" | \"other\" {\n const url = this.config.src.toLowerCase();\n if (\n url.includes(\".m3u8\") ||\n url.includes(\"/hls/\") ||\n url.includes(\"application/vnd.apple.mpegurl\")\n ) {\n return \"hls\";\n }\n return \"other\";\n }\n\n shouldShowNativeControls(): boolean {\n const streamType = this.getStreamType();\n if (streamType === \"other\") {\n return !(this.config.showCustomControls ?? false);\n }\n return !!(\n this.config.allowNativeHls && !(this.config.showCustomControls ?? false)\n );\n }\n\n private shouldContinueLiveStreamDuringAds(): boolean {\n if (this.config.allowNativeHls) {\n return false;\n }\n\n if (!this.isLiveStream) {\n return false;\n }\n\n return true;\n }\n\n async loadDefaultVastFromAdstorm(\n adstormApiUrl: string,\n params?: Record<string, string>\n ): Promise<void> {\n const usp = new URLSearchParams(params || {});\n const url = `${adstormApiUrl}?${usp.toString()}`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Failed to fetch adstorm ads: ${res.status}`);\n const data = await res.json();\n const tag = data?.adTagUrl || data?.vastTagUrl || data?.tagUrl;\n if (typeof tag === \"string\" && tag.length > 0) {\n this.apiVastTagUrl = tag;\n }\n }\n\n private async handleAdStart(_marker: Scte35Marker): Promise<void> {\n const scheduled = this.findCurrentOrNextBreak(\n this.video.currentTime * 1000\n );\n const tags = this.selectVastTagsForBreak(scheduled);\n\n let vastTagUrl: string | undefined;\n let adsNumber = 1;\n\n if (this.apiVastTagUrl) {\n vastTagUrl = this.apiVastTagUrl;\n\n if (this.vastConfig) {\n const isHls =\n this.config.src.includes(\".m3u8\") || this.config.src.includes(\"hls\");\n if (isHls && this.vastConfig.cue_tones?.number_ads) {\n adsNumber = this.vastConfig.cue_tones.number_ads;\n } else if (!isHls && this.vastConfig.timer_vod?.number_ads) {\n adsNumber = this.vastConfig.timer_vod.number_ads;\n }\n }\n\n this.adPodQueue = new Array(adsNumber - 1).fill(vastTagUrl);\n this.currentAdIndex = 0;\n this.totalAdsInBreak = adsNumber;\n\n if (this.config.debugAdTiming) {\n console.log(\n `[StormcloudVideoPlayer] Using API VAST tag with ${adsNumber} ads:`,\n vastTagUrl\n );\n }\n } else if (tags && tags.length > 0) {\n vastTagUrl = tags[0] as string;\n const rest = tags.slice(1);\n this.adPodQueue = rest;\n this.currentAdIndex = 0;\n this.totalAdsInBreak = tags.length;\n\n if (this.config.debugAdTiming) {\n console.log(\n \"[StormcloudVideoPlayer] Using scheduled VAST tag:\",\n vastTagUrl\n );\n }\n } else {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] No VAST tag available for ad\");\n }\n return;\n }\n\n if (vastTagUrl) {\n this.showAds = true;\n this.currentAdIndex++;\n await this.playSingleAd(vastTagUrl);\n }\n if (\n this.expectedAdBreakDurationMs == null &&\n scheduled?.durationMs != null\n ) {\n this.expectedAdBreakDurationMs = scheduled.durationMs;\n this.currentAdBreakStartWallClockMs =\n this.currentAdBreakStartWallClockMs ?? Date.now();\n this.scheduleAdStopCountdown(this.expectedAdBreakDurationMs);\n }\n }\n\n private findCurrentOrNextBreak(nowMs: number): AdBreak | undefined {\n const schedule: AdBreak[] = [];\n let candidate: AdBreak | undefined;\n for (const b of schedule) {\n const tol = this.config.driftToleranceMs ?? 1000;\n if (\n b.startTimeMs <= nowMs + tol &&\n (candidate == null || b.startTimeMs > (candidate.startTimeMs || 0))\n ) {\n candidate = b;\n }\n }\n return candidate;\n }\n\n private onTimeUpdate(currentTimeSec: number): void {\n if (this.ima.isAdPlaying()) return;\n const nowMs = currentTimeSec * 1000;\n const breakToPlay = this.findBreakForTime(nowMs);\n if (breakToPlay) {\n this.handleMidAdJoin(breakToPlay, nowMs);\n }\n }\n\n private async handleMidAdJoin(\n adBreak: AdBreak,\n nowMs: number\n ): Promise<void> {\n const durationMs = adBreak.durationMs ?? 0;\n const endMs = adBreak.startTimeMs + durationMs;\n if (durationMs > 0 && nowMs > adBreak.startTimeMs && nowMs < endMs) {\n const remainingMs = endMs - nowMs;\n const tags =\n this.selectVastTagsForBreak(adBreak) ||\n (this.apiVastTagUrl ? [this.apiVastTagUrl] : undefined);\n if (tags && tags.length > 0) {\n const first = tags[0] as string;\n const rest = tags.slice(1);\n this.adPodQueue = rest;\n await this.playSingleAd(first);\n this.inAdBreak = true;\n this.expectedAdBreakDurationMs = remainingMs;\n this.currentAdBreakStartWallClockMs = Date.now();\n this.scheduleAdStopCountdown(remainingMs);\n }\n }\n }\n\n private 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 private clearAdStopTimer(): void {\n if (this.adStopTimerId != null) {\n clearTimeout(this.adStopTimerId);\n this.adStopTimerId = undefined;\n }\n }\n\n private ensureAdStoppedByTimer(): void {\n if (!this.inAdBreak) return;\n this.inAdBreak = false;\n this.expectedAdBreakDurationMs = undefined;\n this.currentAdBreakStartWallClockMs = undefined;\n this.adStopTimerId = undefined;\n if (this.ima.isAdPlaying()) {\n this.ima.stop().catch(() => {});\n }\n }\n\n private scheduleAdStartIn(delayMs: number): void {\n this.clearAdStartTimer();\n const ms = Math.max(0, Math.floor(delayMs));\n if (ms === 0) {\n this.handleAdStart({ type: \"start\" } as Scte35Marker).catch(() => {});\n return;\n }\n this.adStartTimerId = window.setTimeout(() => {\n this.handleAdStart({ type: \"start\" } as Scte35Marker).catch(() => {});\n }, ms) as unknown as number;\n }\n\n private clearAdStartTimer(): void {\n if (this.adStartTimerId != null) {\n clearTimeout(this.adStartTimerId);\n this.adStartTimerId = undefined;\n }\n }\n\n private 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 private async playSingleAd(vastTagUrl: string): Promise<void> {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Attempting to play ad:\", vastTagUrl);\n }\n\n this.startAdFailsafeTimer();\n\n try {\n await this.ima.requestAds(vastTagUrl);\n await this.ima.play();\n\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Ad playback started successfully\");\n }\n } catch (error) {\n if (this.config.debugAdTiming) {\n console.error(\"[StormcloudVideoPlayer] Ad playback failed:\", error);\n }\n\n this.handleAdFailure();\n }\n }\n\n private handleAdFailure(): void {\n if (this.config.debugAdTiming) {\n console.log(\n \"[StormcloudVideoPlayer] Handling ad failure - resuming content\"\n );\n }\n\n this.inAdBreak = false;\n this.expectedAdBreakDurationMs = undefined;\n this.currentAdBreakStartWallClockMs = undefined;\n this.clearAdStartTimer();\n this.clearAdStopTimer();\n this.clearAdFailsafeTimer();\n this.adPodQueue = [];\n this.showAds = false;\n this.currentAdIndex = 0;\n this.totalAdsInBreak = 0;\n\n if (this.video.paused) {\n this.video.play().catch(() => {\n if (this.config.debugAdTiming) {\n console.error(\n \"[StormcloudVideoPlayer] Failed to resume video after ad failure\"\n );\n }\n });\n }\n }\n\n private startAdFailsafeTimer(): void {\n this.clearAdFailsafeTimer();\n\n const failsafeMs = this.config.adFailsafeTimeoutMs ?? 10000;\n\n if (this.config.debugAdTiming) {\n console.log(\n `[StormcloudVideoPlayer] Starting failsafe timer (${failsafeMs}ms)`\n );\n }\n\n this.adFailsafeTimerId = window.setTimeout(() => {\n if (this.video.paused) {\n if (this.config.debugAdTiming) {\n console.warn(\n \"[StormcloudVideoPlayer] Failsafe timer triggered - forcing video resume\"\n );\n }\n this.handleAdFailure();\n }\n }, failsafeMs) as unknown as number;\n }\n\n private clearAdFailsafeTimer(): void {\n if (this.adFailsafeTimerId != null) {\n clearTimeout(this.adFailsafeTimerId);\n this.adFailsafeTimerId = undefined;\n }\n }\n\n private 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 private getRemainingAdMs(): number {\n if (\n this.expectedAdBreakDurationMs == null ||\n this.currentAdBreakStartWallClockMs == null\n )\n return 0;\n const elapsed = Date.now() - this.currentAdBreakStartWallClockMs;\n return Math.max(0, this.expectedAdBreakDurationMs - elapsed);\n }\n\n private findBreakForTime(nowMs: number): AdBreak | undefined {\n const schedule: AdBreak[] = [];\n for (const b of schedule) {\n const end = (b.startTimeMs || 0) + (b.durationMs || 0);\n if (\n nowMs >= (b.startTimeMs || 0) &&\n (b.durationMs ? nowMs < end : true)\n ) {\n return b;\n }\n }\n return undefined;\n }\n\n toggleMute(): void {\n if (this.ima.isAdPlaying()) {\n const currentPerceptualState = this.isMuted();\n const newMutedState = !currentPerceptualState;\n\n this.ima.updateOriginalMutedState(newMutedState);\n this.ima.setAdVolume(newMutedState ? 0 : 1);\n\n if (this.config.debugAdTiming) {\n console.log(\n \"[StormcloudVideoPlayer] Mute toggle during ad - immediately applied:\",\n newMutedState\n );\n }\n } else {\n this.video.muted = !this.video.muted;\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Muted:\", this.video.muted);\n }\n }\n }\n\n toggleFullscreen(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!document.fullscreenElement) {\n const container = this.video.parentElement;\n if (!container) {\n reject(new Error(\"No parent container found for fullscreen\"));\n return;\n }\n container\n .requestFullscreen()\n .then(() => {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Entered fullscreen\");\n }\n resolve();\n })\n .catch((err) => {\n if (this.config.debugAdTiming) {\n console.error(\"[StormcloudVideoPlayer] Fullscreen error:\", err);\n }\n reject(err);\n });\n } else {\n document\n .exitFullscreen()\n .then(() => {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Exited fullscreen\");\n }\n resolve();\n })\n .catch((err) => {\n if (this.config.debugAdTiming) {\n console.error(\n \"[StormcloudVideoPlayer] Exit fullscreen error:\",\n err\n );\n }\n reject(err);\n });\n }\n });\n }\n\n isMuted(): boolean {\n if (this.ima.isAdPlaying()) {\n const adVolume = this.ima.getAdVolume();\n return adVolume === 0;\n }\n return this.video.muted;\n }\n\n isFullscreen(): boolean {\n return !!document.fullscreenElement;\n }\n\n isLive(): boolean {\n return this.isLiveStream;\n }\n\n get videoElement(): HTMLVideoElement {\n return this.video;\n }\n\n resize(): void {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Resizing player\");\n }\n\n if (this.ima && this.ima.isAdPlaying()) {\n const width = this.video.clientWidth || 640;\n const height = this.video.clientHeight || 360;\n\n if (this.config.debugAdTiming) {\n console.log(\n `[StormcloudVideoPlayer] Resizing ads manager to ${width}x${height}`\n );\n }\n\n this.ima.resize(width, height);\n }\n }\n\n destroy(): void {\n this.clearAdStartTimer();\n this.clearAdStopTimer();\n this.clearAdFailsafeTimer();\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = undefined;\n }\n this.hls?.destroy();\n this.ima?.destroy();\n }\n}\n","import type { ImaController } from \"../types\";\n\ndeclare global {\n interface Window {\n google?: any;\n }\n}\n\nexport function createImaController(\n video: HTMLVideoElement,\n options?: { continueLiveStreamDuringAds?: boolean }\n): ImaController {\n let adPlaying = false;\n let originalMutedState = false;\n const listeners = new Map<string, Set<(payload?: any) => void>>();\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 {}\n }\n }\n\n function ensureImaLoaded(): Promise<void> {\n try {\n const frameEl = window.frameElement as HTMLIFrameElement | null;\n const sandboxAttr = frameEl?.getAttribute?.(\"sandbox\") || \"\";\n if (sandboxAttr) {\n const tokens = new Set(\n sandboxAttr\n .split(/\\s+/)\n .map((t) => t.trim())\n .filter((t) => t.length > 0)\n );\n const allowsScripts = tokens.has(\"allow-scripts\");\n if (!allowsScripts) {\n // eslint-disable-next-line no-console\n console.error(\n \"StormcloudVideoPlayer: The host page is inside a sandboxed iframe without 'allow-scripts'. Google IMA cannot run ads within sandboxed frames. Remove the sandbox attribute or include 'allow-scripts allow-same-origin'.\"\n );\n }\n }\n } catch {}\n\n if (typeof window !== \"undefined\" && window.google?.ima)\n return Promise.resolve();\n const existing = document.querySelector(\n 'script[data-ima=\"true\"]'\n ) as HTMLScriptElement | null;\n if (existing) {\n return new Promise((resolve) =>\n existing.addEventListener(\"load\", () => resolve())\n );\n }\n return new Promise((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.src = \"https://imasdk.googleapis.com/js/sdkloader/ima3.js\";\n script.async = true;\n script.defer = true;\n script.setAttribute(\"data-ima\", \"true\");\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"IMA SDK load failed\"));\n document.head.appendChild(script);\n });\n }\n\n let adsManager: any | undefined;\n let adsLoader: any | undefined;\n let adDisplayContainer: any | undefined;\n let adContainerEl: HTMLDivElement | undefined;\n let lastAdTagUrl: string | undefined;\n let retryAttempts = 0;\n const maxRetries = 2;\n const backoffBaseMs = 500;\n let adsLoadedPromise: Promise<void> | undefined;\n let adsLoadedResolve: (() => void) | undefined;\n let adsLoadedReject: ((error: Error) => void) | undefined;\n\n function makeAdsRequest(google: any, vastTagUrl: string) {\n const adsRequest = new google.ima.AdsRequest();\n adsRequest.adTagUrl = vastTagUrl;\n adsLoader.requestAds(adsRequest);\n }\n\n return {\n initialize() {\n ensureImaLoaded()\n .then(() => {\n const google = window.google;\n if (!adDisplayContainer) {\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 = \"flex\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"2\";\n video.parentElement?.appendChild(container);\n adContainerEl = container;\n adDisplayContainer = new google.ima.AdDisplayContainer(\n container,\n video\n );\n try {\n adDisplayContainer.initialize?.();\n } catch {}\n }\n })\n .catch(() => {});\n },\n async requestAds(vastTagUrl: string) {\n console.log(\"[IMA] Requesting ads:\", vastTagUrl);\n\n adsLoadedPromise = new Promise<void>((resolve, reject) => {\n adsLoadedResolve = resolve;\n adsLoadedReject = reject;\n\n setTimeout(() => {\n if (adsLoadedReject) {\n adsLoadedReject(new Error(\"Ad request timeout\"));\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n }\n }, 10000);\n });\n\n try {\n await ensureImaLoaded();\n const google = window.google;\n lastAdTagUrl = vastTagUrl;\n retryAttempts = 0;\n\n if (!adDisplayContainer) {\n console.log(\"[IMA] Creating ad display container\");\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 = \"flex\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"2\";\n\n if (!video.parentElement) {\n throw new Error(\"Video element has no parent for ad container\");\n }\n\n video.parentElement.appendChild(container);\n adContainerEl = container;\n adDisplayContainer = new google.ima.AdDisplayContainer(\n container,\n video\n );\n\n try {\n adDisplayContainer.initialize();\n console.log(\"[IMA] Ad display container initialized\");\n } catch (error) {\n console.warn(\n \"[IMA] Failed to initialize ad display container:\",\n error\n );\n }\n }\n\n if (!adsLoader) {\n console.log(\"[IMA] Creating ads loader\");\n const adsLoaderCls = new google.ima.AdsLoader(adDisplayContainer);\n adsLoader = adsLoaderCls;\n\n adsLoader.addEventListener(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n (evt: any) => {\n console.log(\"[IMA] Ads manager loaded\");\n try {\n adsManager = evt.getAdsManager(video);\n const AdEvent = google.ima.AdEvent.Type;\n const AdErrorEvent = google.ima.AdErrorEvent.Type;\n\n adsManager.addEventListener(\n AdErrorEvent.AD_ERROR,\n (errorEvent: any) => {\n console.error(\"[IMA] Ad error:\", errorEvent.getError());\n try {\n adsManager?.destroy?.();\n } catch {}\n adPlaying = false;\n video.muted = originalMutedState;\n if (adContainerEl)\n adContainerEl.style.pointerEvents = \"none\";\n\n if (adsLoadedReject) {\n adsLoadedReject(new Error(\"Ad playback error\"));\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n }\n\n if (lastAdTagUrl && retryAttempts < maxRetries) {\n const delay =\n backoffBaseMs * Math.pow(2, retryAttempts++);\n console.log(\n `[IMA] Retrying ad request in ${delay}ms (attempt ${retryAttempts})`\n );\n window.setTimeout(() => {\n try {\n makeAdsRequest(google, lastAdTagUrl!);\n } catch {}\n }, delay);\n } else {\n console.log(\n \"[IMA] Max retries reached, emitting ad_error\"\n );\n emit(\"ad_error\");\n\n if (!options?.continueLiveStreamDuringAds) {\n video.play().catch(() => {});\n }\n }\n }\n );\n\n adsManager.addEventListener(\n AdEvent.CONTENT_PAUSE_REQUESTED,\n () => {\n console.log(\"[IMA] Content pause requested\");\n originalMutedState = video.muted;\n video.muted = true;\n\n if (!options?.continueLiveStreamDuringAds) {\n video.pause();\n console.log(\"[IMA] Video paused (VOD mode)\");\n } else {\n console.log(\n \"[IMA] Video continues playing but muted (Live mode)\"\n );\n }\n\n adPlaying = true;\n if (adContainerEl)\n adContainerEl.style.pointerEvents = \"auto\";\n emit(\"content_pause\");\n }\n );\n\n adsManager.addEventListener(\n AdEvent.CONTENT_RESUME_REQUESTED,\n () => {\n console.log(\"[IMA] Content resume requested\");\n adPlaying = false;\n video.muted = originalMutedState;\n if (adContainerEl)\n adContainerEl.style.pointerEvents = \"none\";\n\n if (!options?.continueLiveStreamDuringAds) {\n video.play().catch(() => {});\n console.log(\"[IMA] Video resumed (VOD mode)\");\n } else {\n console.log(\n \"[IMA] Video unmuted (Live mode - was never paused)\"\n );\n }\n\n emit(\"content_resume\");\n }\n );\n\n adsManager.addEventListener(AdEvent.ALL_ADS_COMPLETED, () => {\n console.log(\"[IMA] All ads completed\");\n adPlaying = false;\n video.muted = originalMutedState;\n if (adContainerEl) adContainerEl.style.pointerEvents = \"none\";\n\n if (!options?.continueLiveStreamDuringAds) {\n video.play().catch(() => {});\n console.log(\n \"[IMA] Video resumed after all ads completed (VOD mode)\"\n );\n } else {\n console.log(\n \"[IMA] Video unmuted after all ads completed (Live mode)\"\n );\n }\n\n emit(\"all_ads_completed\");\n });\n\n console.log(\"[IMA] Ads manager event listeners attached\");\n\n if (adsLoadedResolve) {\n adsLoadedResolve();\n adsLoadedResolve = undefined;\n adsLoadedReject = undefined;\n }\n } catch (e) {\n console.error(\"[IMA] Error setting up ads manager:\", e);\n adPlaying = false;\n video.muted = originalMutedState;\n if (adContainerEl) adContainerEl.style.pointerEvents = \"none\";\n\n if (!options?.continueLiveStreamDuringAds) {\n video.play().catch(() => {});\n }\n\n if (adsLoadedReject) {\n adsLoadedReject(new Error(\"Failed to setup ads manager\"));\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n }\n emit(\"ad_error\");\n }\n },\n false\n );\n\n adsLoader.addEventListener(\n google.ima.AdErrorEvent.Type.AD_ERROR,\n (adErrorEvent: any) => {\n console.error(\"[IMA] Ads loader error:\", adErrorEvent.getError());\n\n if (adsLoadedReject) {\n adsLoadedReject(new Error(\"Ads loader error\"));\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n }\n emit(\"ad_error\");\n },\n false\n );\n }\n\n console.log(\"[IMA] Making ads request\");\n makeAdsRequest(google, vastTagUrl);\n\n return adsLoadedPromise;\n } catch (error) {\n console.error(\"[IMA] Failed to request ads:\", error);\n if (adsLoadedReject) {\n adsLoadedReject(error as Error);\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n }\n return Promise.reject(error);\n }\n },\n async play() {\n if (!window.google?.ima || !adDisplayContainer) {\n console.warn(\n \"[IMA] Cannot play ad: IMA SDK or ad container not available\"\n );\n return Promise.reject(new Error(\"IMA SDK not available\"));\n }\n\n if (!adsManager) {\n console.warn(\"[IMA] Cannot play ad: No ads manager available\");\n return Promise.reject(new Error(\"No ads manager\"));\n }\n\n try {\n const width = video.clientWidth || 640;\n const height = video.clientHeight || 360;\n\n console.log(`[IMA] Initializing ads manager (${width}x${height})`);\n adsManager.init(width, height, window.google.ima.ViewMode.NORMAL);\n\n if (!options?.continueLiveStreamDuringAds) {\n console.log(\"[IMA] Pausing video for ad playback (VOD mode)\");\n video.pause();\n } else {\n console.log(\n \"[IMA] Keeping video playing but muted for ad playback (Live mode)\"\n );\n }\n adPlaying = true;\n\n console.log(\"[IMA] Starting ad playback\");\n adsManager.start();\n\n return Promise.resolve();\n } catch (error) {\n console.error(\"[IMA] Error starting ad playback:\", error);\n adPlaying = false;\n\n if (!options?.continueLiveStreamDuringAds) {\n video.play().catch(() => {});\n }\n return Promise.reject(error);\n }\n },\n async stop() {\n adPlaying = false;\n video.muted = originalMutedState;\n try {\n adsManager?.stop?.();\n } catch {}\n\n if (!options?.continueLiveStreamDuringAds) {\n video.play().catch(() => {});\n console.log(\"[IMA] Video resumed after stop (VOD mode)\");\n } else {\n console.log(\"[IMA] Video unmuted after stop (Live mode)\");\n }\n },\n destroy() {\n try {\n adsManager?.destroy?.();\n } catch {}\n adPlaying = false;\n video.muted = originalMutedState;\n try {\n adsLoader?.destroy?.();\n } catch {}\n if (adContainerEl?.parentElement) {\n adContainerEl.parentElement.removeChild(adContainerEl);\n }\n },\n isAdPlaying() {\n return adPlaying;\n },\n resize(width: number, height: number) {\n if (!adsManager || !window.google?.ima) {\n console.warn(\n \"[IMA] Cannot resize: No ads manager or IMA SDK available\"\n );\n return;\n }\n\n try {\n console.log(`[IMA] Resizing ads manager to ${width}x${height}`);\n adsManager.resize(width, height, window.google.ima.ViewMode.NORMAL);\n } catch (error) {\n console.warn(\"[IMA] Error resizing ads manager:\", error);\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 off(event: string, listener: (payload?: any) => void) {\n listeners.get(event)?.delete(listener);\n },\n updateOriginalMutedState(muted: boolean) {\n originalMutedState = muted;\n },\n getOriginalMutedState() {\n return originalMutedState;\n },\n setAdVolume(volume: number) {\n if (adsManager && adPlaying) {\n try {\n adsManager.setVolume(Math.max(0, Math.min(1, volume)));\n } catch (error) {\n console.warn(\"[IMA] Failed to set ad volume:\", error);\n }\n }\n },\n getAdVolume(): number {\n if (adsManager && adPlaying) {\n try {\n return adsManager.getVolume();\n } catch (error) {\n console.warn(\"[IMA] Failed to get ad volume:\", error);\n return 1;\n }\n }\n return 1;\n },\n };\n}\n","import type { ClientInfo, TrackingData, HeartbeatData } from \"../types\";\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\nexport async function getBrowserID(clientInfo: ClientInfo): Promise<string> {\n const fingerprintString = JSON.stringify(clientInfo);\n const hashBuffer = await crypto.subtle.digest(\n \"SHA-256\",\n new TextEncoder().encode(fingerprintString)\n );\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n return hashHex;\n}\n\nexport async function sendInitialTracking(licenseKey?: string): Promise<void> {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n\n const trackingData: TrackingData = {\n browserId,\n ...clientInfo,\n };\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n\n const response = await fetch(\n \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/track\",\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(trackingData),\n }\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n await response.json();\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n error\n );\n }\n}\n\nexport async function sendHeartbeat(licenseKey?: string): Promise<void> {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n\n const heartbeatData: HeartbeatData = {\n browserId,\n timestamp: new Date().toISOString(),\n };\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n\n const response = await fetch(\n \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/heartbeat\",\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(heartbeatData),\n }\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n await response.json();\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n }\n}\n"],"mappings":"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","names":["Hls"]}
1
+ {"version":3,"sources":["../../src/player/StormcloudVideoPlayer.ts","../../src/sdk/ima.ts","../../src/utils/tracking.ts"],"sourcesContent":["import Hls from \"hls.js\";\nimport type {\n StormcloudVideoPlayerConfig,\n Scte35Marker,\n Id3TagInfo,\n ImaController,\n AdBreak,\n StormcloudApiResponse,\n} from \"../types\";\nimport { createImaController } from \"../sdk/ima\";\nimport { sendInitialTracking, sendHeartbeat } from \"../utils/tracking\";\n\nexport class StormcloudVideoPlayer {\n private readonly video: HTMLVideoElement;\n private readonly config: StormcloudVideoPlayerConfig;\n private hls?: Hls;\n private ima: ImaController;\n private attached = false;\n private inAdBreak = false;\n private currentAdBreakStartWallClockMs: number | undefined;\n private expectedAdBreakDurationMs: number | undefined;\n private adStopTimerId: number | undefined;\n private adStartTimerId: number | undefined;\n private adFailsafeTimerId: number | undefined;\n private ptsDriftEmaMs = 0;\n private adPodQueue: string[] = [];\n private apiVastTagUrl: string | undefined;\n private vastConfig:\n | StormcloudApiResponse[\"response\"][\"options\"][\"vast\"]\n | undefined;\n private lastHeartbeatTime: number = 0;\n private heartbeatInterval: number | undefined;\n private currentAdIndex: number = 0;\n private totalAdsInBreak: number = 0;\n private showAds: boolean = false;\n private isLiveStream: boolean = false;\n\n constructor(config: StormcloudVideoPlayerConfig) {\n this.config = config;\n this.video = config.videoElement;\n\n this.ima = createImaController(this.video, {\n continueLiveStreamDuringAds: false,\n });\n }\n\n async load(): Promise<void> {\n if (!this.attached) {\n this.attach();\n }\n\n try {\n await this.fetchAdConfiguration();\n } catch (error) {\n if (this.config.debugAdTiming) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to fetch ad configuration:\",\n error\n );\n }\n }\n\n this.initializeTracking();\n\n if (this.shouldUseNativeHls()) {\n this.video.src = this.config.src;\n\n this.isLiveStream = this.config.lowLatencyMode ?? false;\n\n if (this.config.debugAdTiming) {\n console.log(\n \"[StormcloudVideoPlayer] allowNativeHls: true - VOD mode detected:\",\n {\n isLive: this.isLiveStream,\n allowNativeHls: this.config.allowNativeHls,\n adBehavior: \"vod (main video pauses during ads)\",\n }\n );\n }\n\n this.ima.destroy();\n this.ima = createImaController(this.video, {\n continueLiveStreamDuringAds: false,\n });\n this.ima.initialize();\n\n if (this.config.autoplay) {\n await this.video.play()?.catch(() => {});\n }\n return;\n }\n\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 });\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.hls?.levels?.some(\n (level) =>\n level?.details?.live === true || level?.details?.type === \"LIVE\"\n ) ?? false;\n\n if (this.config.debugAdTiming) {\n const adBehavior = this.shouldContinueLiveStreamDuringAds()\n ? \"live (main video continues muted during ads)\"\n : \"vod (main video pauses during ads)\";\n console.log(\"[StormcloudVideoPlayer] Stream type detected:\", {\n isLive: this.isLiveStream,\n allowNativeHls: this.config.allowNativeHls,\n adBehavior,\n });\n }\n\n this.ima.destroy();\n this.ima = createImaController(this.video, {\n continueLiveStreamDuringAds: this.shouldContinueLiveStreamDuringAds(),\n });\n this.ima.initialize();\n\n if (this.config.autoplay) {\n await this.video.play()?.catch(() => {});\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_CHANGED, (_evt, data: any) => {\n const frag = data?.frag;\n const tagList: any[] | undefined = frag?.tagList;\n if (!Array.isArray(tagList)) 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\n if (!tag) continue;\n if (tag.includes(\"EXT-X-CUE-OUT\")) {\n const durationSeconds = this.parseCueOutDuration(value);\n const marker: Scte35Marker = {\n type: \"start\",\n ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n raw: { tag, value },\n } as Scte35Marker;\n this.onScte35Marker(marker);\n } else if (tag.includes(\"EXT-X-CUE-OUT-CONT\")) {\n const prog = this.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.onScte35Marker(marker);\n } else if (tag.includes(\"EXT-X-CUE-IN\")) {\n this.onScte35Marker({ type: \"end\", raw: { tag, value } });\n } else if (tag.includes(\"EXT-X-DATERANGE\")) {\n const attrs = this.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 = this.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.onScte35Marker(marker);\n }\n if (hasScteIn) {\n this.onScte35Marker({ type: \"end\", raw: { tag, value, attrs } });\n }\n }\n }\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.destroy();\n break;\n }\n }\n });\n\n this.hls.attachMedia(this.video);\n }\n\n private attach(): void {\n if (this.attached) return;\n this.attached = true;\n this.video.autoplay = !!this.config.autoplay;\n this.video.muted = !!this.config.muted;\n\n this.ima.initialize();\n this.ima.on(\"all_ads_completed\", () => {\n if (!this.inAdBreak) return;\n const remaining = this.getRemainingAdMs();\n if (remaining > 500 && this.adPodQueue.length > 0) {\n const next = this.adPodQueue.shift()!;\n this.currentAdIndex++;\n this.playSingleAd(next).catch(() => {});\n } else {\n this.currentAdIndex = 0;\n this.totalAdsInBreak = 0;\n this.showAds = false;\n }\n });\n this.ima.on(\"ad_error\", () => {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] IMA ad_error event received\");\n }\n if (!this.inAdBreak) return;\n const remaining = this.getRemainingAdMs();\n if (remaining > 500 && this.adPodQueue.length > 0) {\n const next = this.adPodQueue.shift()!;\n this.currentAdIndex++;\n this.playSingleAd(next).catch(() => {});\n } else {\n this.handleAdFailure();\n }\n });\n this.ima.on(\"content_pause\", () => {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] IMA content_pause event received\");\n }\n this.clearAdFailsafeTimer();\n });\n this.ima.on(\"content_resume\", () => {\n if (this.config.debugAdTiming) {\n console.log(\n \"[StormcloudVideoPlayer] IMA content_resume event received\"\n );\n }\n this.clearAdFailsafeTimer();\n });\n\n this.video.addEventListener(\"timeupdate\", () => {\n this.onTimeUpdate(this.video.currentTime);\n });\n }\n\n private shouldUseNativeHls(): boolean {\n const streamType = this.getStreamType();\n\n if (streamType === \"other\") {\n return true;\n }\n\n const canNative = this.video.canPlayType(\"application/vnd.apple.mpegURL\");\n return !!(this.config.allowNativeHls && canNative);\n }\n\n private onId3Tag(tag: Id3TagInfo): void {\n if (typeof tag.ptsSeconds === \"number\") {\n this.updatePtsDrift(tag.ptsSeconds);\n }\n const marker = this.parseScte35FromId3(tag);\n if (marker) {\n this.onScte35Marker(marker);\n }\n }\n\n private parseScte35FromId3(tag: Id3TagInfo): Scte35Marker | undefined {\n const text = this.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 = this.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 = this.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 = this.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 = this.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 = this.parseScte35Binary(tag.value);\n if (bin) return bin;\n }\n\n return undefined;\n }\n\n private 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\n private onScte35Marker(marker: Scte35Marker): void {\n if (this.config.debugAdTiming) {\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 });\n }\n\n if (marker.type === \"start\") {\n this.inAdBreak = true;\n const durationMs =\n marker.durationSeconds != null\n ? marker.durationSeconds * 1000\n : undefined;\n this.expectedAdBreakDurationMs = durationMs;\n this.currentAdBreakStartWallClockMs = Date.now();\n\n const isManifestMarker = this.isManifestBasedMarker(marker);\n const forceImmediate = this.config.immediateManifestAds ?? true;\n\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Ad start decision:\", {\n isManifestMarker,\n forceImmediate,\n hasPts: typeof marker.ptsSeconds === \"number\",\n });\n }\n\n if (isManifestMarker && forceImmediate) {\n if (this.config.debugAdTiming) {\n console.log(\n \"[StormcloudVideoPlayer] Starting ad immediately (manifest-based)\"\n );\n }\n this.clearAdStartTimer();\n this.handleAdStart(marker);\n } else if (typeof marker.ptsSeconds === \"number\") {\n const tol = this.config.driftToleranceMs ?? 1000;\n const nowMs = this.video.currentTime * 1000;\n const estCurrentPtsMs = nowMs - this.ptsDriftEmaMs;\n const deltaMs = Math.floor(marker.ptsSeconds * 1000 - estCurrentPtsMs);\n\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] PTS-based timing calculation:\", {\n nowMs,\n estCurrentPtsMs,\n markerPtsMs: marker.ptsSeconds * 1000,\n deltaMs,\n tolerance: tol,\n });\n }\n\n if (deltaMs > tol) {\n if (this.config.debugAdTiming) {\n console.log(\n `[StormcloudVideoPlayer] Scheduling ad start in ${deltaMs}ms`\n );\n }\n this.scheduleAdStartIn(deltaMs);\n } else {\n if (this.config.debugAdTiming) {\n console.log(\n \"[StormcloudVideoPlayer] Starting ad immediately (within tolerance)\"\n );\n }\n this.clearAdStartTimer();\n this.handleAdStart(marker);\n }\n } else {\n if (this.config.debugAdTiming) {\n console.log(\n \"[StormcloudVideoPlayer] Starting ad immediately (fallback)\"\n );\n }\n this.clearAdStartTimer();\n this.handleAdStart(marker);\n }\n if (this.expectedAdBreakDurationMs != null) {\n this.scheduleAdStopCountdown(this.expectedAdBreakDurationMs);\n }\n return;\n }\n if (marker.type === \"progress\" && this.inAdBreak) {\n if (marker.durationSeconds != null) {\n this.expectedAdBreakDurationMs = marker.durationSeconds * 1000;\n }\n if (\n this.expectedAdBreakDurationMs != null &&\n this.currentAdBreakStartWallClockMs != null\n ) {\n const elapsedMs = Date.now() - this.currentAdBreakStartWallClockMs;\n const remainingMs = Math.max(\n 0,\n this.expectedAdBreakDurationMs - elapsedMs\n );\n this.scheduleAdStopCountdown(remainingMs);\n }\n if (!this.ima.isAdPlaying()) {\n const scheduled = this.findCurrentOrNextBreak(\n this.video.currentTime * 1000\n );\n const tags =\n this.selectVastTagsForBreak(scheduled) ||\n (this.apiVastTagUrl ? [this.apiVastTagUrl] : undefined);\n if (tags && tags.length > 0) {\n const first = tags[0] as string;\n const rest = tags.slice(1);\n this.adPodQueue = rest;\n this.playSingleAd(first).catch(() => {});\n }\n }\n return;\n }\n if (marker.type === \"end\") {\n this.inAdBreak = false;\n this.expectedAdBreakDurationMs = undefined;\n this.currentAdBreakStartWallClockMs = undefined;\n this.clearAdStartTimer();\n this.clearAdStopTimer();\n if (this.ima.isAdPlaying()) {\n this.ima.stop().catch(() => {});\n }\n return;\n }\n }\n\n private 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\n private parseCueOutCont(\n value: string\n ): { elapsed?: number; duration?: number } | undefined {\n const elapsedMatch = value.match(/Elapsed\\s*=\\s*([0-9.]+)/i);\n const durationMatch = value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n const res: { elapsed?: number; duration?: number } = {};\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) return res;\n return undefined;\n }\n\n private 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\n private 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\n private 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\n private parseScte35Binary(data: Uint8Array): Scte35Marker | undefined {\n class 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 }\n\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 r.readBits(8);\n r.readBits(1);\n r.readBits(6);\n const ptsAdjHigh = r.readBits(1);\n const ptsAdjLow = r.readBits(32);\n void ptsAdjHigh;\n void ptsAdjLow;\n r.readBits(8);\n r.readBits(12);\n const spliceCommandLength = r.readBits(12);\n const spliceCommandType = r.readBits(8);\n if (spliceCommandType !== 5) {\n return undefined;\n }\n 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 if (programSpliceFlag && !spliceImmediateFlag) {\n const timeSpecifiedFlag = r.readBits(1) === 1;\n if (timeSpecifiedFlag) {\n r.readBits(6);\n r.readBits(33);\n } else {\n r.readBits(7);\n }\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 timeSpecifiedFlag = r.readBits(1) === 1;\n if (timeSpecifiedFlag) {\n r.readBits(6);\n r.readBits(33);\n } else {\n r.readBits(7);\n }\n }\n }\n }\n let durationSeconds: number | undefined = undefined;\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\n if (outOfNetwork) {\n const marker: Scte35Marker = {\n type: \"start\",\n ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n raw: { splice_command_type: 5 },\n } as Scte35Marker;\n return marker;\n }\n return undefined;\n }\n\n private initializeTracking(): void {\n sendInitialTracking(this.config.licenseKey).catch((error) => {\n if (this.config.debugAdTiming) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to send initial tracking:\",\n error\n );\n }\n });\n\n this.heartbeatInterval = window.setInterval(() => {\n this.sendHeartbeatIfNeeded();\n }, 5000);\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).catch((error) => {\n if (this.config.debugAdTiming) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to send heartbeat:\",\n error\n );\n }\n });\n }\n }\n\n private async fetchAdConfiguration(): Promise<void> {\n const apiUrl = \"https://adstorm.co/api-adstorm-dev/adstorm/ads/web\";\n\n if (this.config.debugAdTiming) {\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 throw new Error(`Failed to fetch ad configuration: ${response.status}`);\n }\n\n const data: StormcloudApiResponse = await response.json();\n\n const imaPayload = data.response?.ima?.[\"publisherdesk.ima\"]?.payload;\n if (imaPayload) {\n this.apiVastTagUrl = decodeURIComponent(imaPayload);\n if (this.config.debugAdTiming) {\n console.log(\n \"[StormcloudVideoPlayer] Extracted VAST tag URL:\",\n this.apiVastTagUrl\n );\n }\n }\n\n this.vastConfig = data.response?.options?.vast;\n\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Ad configuration loaded:\", {\n vastTagUrl: this.apiVastTagUrl,\n vastConfig: this.vastConfig,\n });\n }\n }\n\n getCurrentAdIndex(): number {\n return this.currentAdIndex;\n }\n\n getTotalAdsInBreak(): number {\n return this.totalAdsInBreak;\n }\n\n isAdPlaying(): boolean {\n return this.inAdBreak && this.ima.isAdPlaying();\n }\n\n isShowingAds(): boolean {\n return this.showAds;\n }\n\n getStreamType(): \"hls\" | \"other\" {\n const url = this.config.src.toLowerCase();\n if (\n url.includes(\".m3u8\") ||\n url.includes(\"/hls/\") ||\n url.includes(\"application/vnd.apple.mpegurl\")\n ) {\n return \"hls\";\n }\n return \"other\";\n }\n\n shouldShowNativeControls(): boolean {\n const streamType = this.getStreamType();\n if (streamType === \"other\") {\n return !(this.config.showCustomControls ?? false);\n }\n return !!(\n this.config.allowNativeHls && !(this.config.showCustomControls ?? false)\n );\n }\n\n private shouldContinueLiveStreamDuringAds(): boolean {\n if (this.config.allowNativeHls) {\n return false;\n }\n\n if (!this.isLiveStream) {\n return false;\n }\n\n return true;\n }\n\n private async handleAdStart(_marker: Scte35Marker): Promise<void> {\n const scheduled = this.findCurrentOrNextBreak(\n this.video.currentTime * 1000\n );\n const tags = this.selectVastTagsForBreak(scheduled);\n\n let vastTagUrl: string | undefined;\n let adsNumber = 1;\n\n if (this.apiVastTagUrl) {\n vastTagUrl = this.apiVastTagUrl;\n\n if (this.vastConfig) {\n const isHls =\n this.config.src.includes(\".m3u8\") || this.config.src.includes(\"hls\");\n if (isHls && this.vastConfig.cue_tones?.number_ads) {\n adsNumber = this.vastConfig.cue_tones.number_ads;\n } else if (!isHls && this.vastConfig.timer_vod?.number_ads) {\n adsNumber = this.vastConfig.timer_vod.number_ads;\n }\n }\n\n this.adPodQueue = new Array(adsNumber - 1).fill(vastTagUrl);\n this.currentAdIndex = 0;\n this.totalAdsInBreak = adsNumber;\n\n if (this.config.debugAdTiming) {\n console.log(\n `[StormcloudVideoPlayer] Using API VAST tag with ${adsNumber} ads:`,\n vastTagUrl\n );\n }\n } else if (tags && tags.length > 0) {\n vastTagUrl = tags[0] as string;\n const rest = tags.slice(1);\n this.adPodQueue = rest;\n this.currentAdIndex = 0;\n this.totalAdsInBreak = tags.length;\n\n if (this.config.debugAdTiming) {\n console.log(\n \"[StormcloudVideoPlayer] Using scheduled VAST tag:\",\n vastTagUrl\n );\n }\n } else {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] No VAST tag available for ad\");\n }\n return;\n }\n\n if (vastTagUrl) {\n this.showAds = true;\n this.currentAdIndex++;\n await this.playSingleAd(vastTagUrl);\n }\n if (\n this.expectedAdBreakDurationMs == null &&\n scheduled?.durationMs != null\n ) {\n this.expectedAdBreakDurationMs = scheduled.durationMs;\n this.currentAdBreakStartWallClockMs =\n this.currentAdBreakStartWallClockMs ?? Date.now();\n this.scheduleAdStopCountdown(this.expectedAdBreakDurationMs);\n }\n }\n\n private findCurrentOrNextBreak(nowMs: number): AdBreak | undefined {\n const schedule: AdBreak[] = [];\n let candidate: AdBreak | undefined;\n for (const b of schedule) {\n const tol = this.config.driftToleranceMs ?? 1000;\n if (\n b.startTimeMs <= nowMs + tol &&\n (candidate == null || b.startTimeMs > (candidate.startTimeMs || 0))\n ) {\n candidate = b;\n }\n }\n return candidate;\n }\n\n private onTimeUpdate(currentTimeSec: number): void {\n if (this.ima.isAdPlaying()) return;\n const nowMs = currentTimeSec * 1000;\n const breakToPlay = this.findBreakForTime(nowMs);\n if (breakToPlay) {\n this.handleMidAdJoin(breakToPlay, nowMs);\n }\n }\n\n private async handleMidAdJoin(\n adBreak: AdBreak,\n nowMs: number\n ): Promise<void> {\n const durationMs = adBreak.durationMs ?? 0;\n const endMs = adBreak.startTimeMs + durationMs;\n if (durationMs > 0 && nowMs > adBreak.startTimeMs && nowMs < endMs) {\n const remainingMs = endMs - nowMs;\n const tags =\n this.selectVastTagsForBreak(adBreak) ||\n (this.apiVastTagUrl ? [this.apiVastTagUrl] : undefined);\n if (tags && tags.length > 0) {\n const first = tags[0] as string;\n const rest = tags.slice(1);\n this.adPodQueue = rest;\n await this.playSingleAd(first);\n this.inAdBreak = true;\n this.expectedAdBreakDurationMs = remainingMs;\n this.currentAdBreakStartWallClockMs = Date.now();\n this.scheduleAdStopCountdown(remainingMs);\n }\n }\n }\n\n private 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 private clearAdStopTimer(): void {\n if (this.adStopTimerId != null) {\n clearTimeout(this.adStopTimerId);\n this.adStopTimerId = undefined;\n }\n }\n\n private ensureAdStoppedByTimer(): void {\n if (!this.inAdBreak) return;\n this.inAdBreak = false;\n this.expectedAdBreakDurationMs = undefined;\n this.currentAdBreakStartWallClockMs = undefined;\n this.adStopTimerId = undefined;\n if (this.ima.isAdPlaying()) {\n this.ima.stop().catch(() => {});\n }\n }\n\n private scheduleAdStartIn(delayMs: number): void {\n this.clearAdStartTimer();\n const ms = Math.max(0, Math.floor(delayMs));\n if (ms === 0) {\n this.handleAdStart({ type: \"start\" } as Scte35Marker).catch(() => {});\n return;\n }\n this.adStartTimerId = window.setTimeout(() => {\n this.handleAdStart({ type: \"start\" } as Scte35Marker).catch(() => {});\n }, ms) as unknown as number;\n }\n\n private clearAdStartTimer(): void {\n if (this.adStartTimerId != null) {\n clearTimeout(this.adStartTimerId);\n this.adStartTimerId = undefined;\n }\n }\n\n private 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 private async playSingleAd(vastTagUrl: string): Promise<void> {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Attempting to play ad:\", vastTagUrl);\n }\n\n this.startAdFailsafeTimer();\n\n try {\n await this.ima.requestAds(vastTagUrl);\n await this.ima.play();\n\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Ad playback started successfully\");\n }\n } catch (error) {\n if (this.config.debugAdTiming) {\n console.error(\"[StormcloudVideoPlayer] Ad playback failed:\", error);\n }\n\n this.handleAdFailure();\n }\n }\n\n private handleAdFailure(): void {\n if (this.config.debugAdTiming) {\n console.log(\n \"[StormcloudVideoPlayer] Handling ad failure - resuming content\"\n );\n }\n\n this.inAdBreak = false;\n this.expectedAdBreakDurationMs = undefined;\n this.currentAdBreakStartWallClockMs = undefined;\n this.clearAdStartTimer();\n this.clearAdStopTimer();\n this.clearAdFailsafeTimer();\n this.adPodQueue = [];\n this.showAds = false;\n this.currentAdIndex = 0;\n this.totalAdsInBreak = 0;\n\n if (this.video.paused) {\n this.video.play()?.catch(() => {\n if (this.config.debugAdTiming) {\n console.error(\n \"[StormcloudVideoPlayer] Failed to resume video after ad failure\"\n );\n }\n });\n }\n }\n\n private startAdFailsafeTimer(): void {\n this.clearAdFailsafeTimer();\n\n const failsafeMs = this.config.adFailsafeTimeoutMs ?? 10000;\n\n if (this.config.debugAdTiming) {\n console.log(\n `[StormcloudVideoPlayer] Starting failsafe timer (${failsafeMs}ms)`\n );\n }\n\n this.adFailsafeTimerId = window.setTimeout(() => {\n if (this.video.paused) {\n if (this.config.debugAdTiming) {\n console.warn(\n \"[StormcloudVideoPlayer] Failsafe timer triggered - forcing video resume\"\n );\n }\n this.handleAdFailure();\n }\n }, failsafeMs) as unknown as number;\n }\n\n private clearAdFailsafeTimer(): void {\n if (this.adFailsafeTimerId != null) {\n clearTimeout(this.adFailsafeTimerId);\n this.adFailsafeTimerId = undefined;\n }\n }\n\n private 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 private getRemainingAdMs(): number {\n if (\n this.expectedAdBreakDurationMs == null ||\n this.currentAdBreakStartWallClockMs == null\n )\n return 0;\n const elapsed = Date.now() - this.currentAdBreakStartWallClockMs;\n return Math.max(0, this.expectedAdBreakDurationMs - elapsed);\n }\n\n private findBreakForTime(nowMs: number): AdBreak | undefined {\n const schedule: AdBreak[] = [];\n for (const b of schedule) {\n const end = (b.startTimeMs || 0) + (b.durationMs || 0);\n if (\n nowMs >= (b.startTimeMs || 0) &&\n (b.durationMs ? nowMs < end : true)\n ) {\n return b;\n }\n }\n return undefined;\n }\n\n toggleMute(): void {\n if (this.ima.isAdPlaying()) {\n const currentPerceptualState = this.isMuted();\n const newMutedState = !currentPerceptualState;\n\n this.ima.updateOriginalMutedState(newMutedState);\n this.ima.setAdVolume(newMutedState ? 0 : 1);\n\n if (this.config.debugAdTiming) {\n console.log(\n \"[StormcloudVideoPlayer] Mute toggle during ad - immediately applied:\",\n newMutedState\n );\n }\n } else {\n this.video.muted = !this.video.muted;\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Muted:\", this.video.muted);\n }\n }\n }\n\n toggleFullscreen(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!document.fullscreenElement) {\n const container = this.video.parentElement;\n if (!container) {\n reject(new Error(\"No parent container found for fullscreen\"));\n return;\n }\n container\n .requestFullscreen()\n .then(() => {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Entered fullscreen\");\n }\n resolve();\n })\n .catch((err) => {\n if (this.config.debugAdTiming) {\n console.error(\"[StormcloudVideoPlayer] Fullscreen error:\", err);\n }\n reject(err);\n });\n } else {\n document\n .exitFullscreen()\n .then(() => {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Exited fullscreen\");\n }\n resolve();\n })\n .catch((err) => {\n if (this.config.debugAdTiming) {\n console.error(\n \"[StormcloudVideoPlayer] Exit fullscreen error:\",\n err\n );\n }\n reject(err);\n });\n }\n });\n }\n\n isMuted(): boolean {\n if (this.ima.isAdPlaying()) {\n const adVolume = this.ima.getAdVolume();\n return adVolume === 0;\n }\n return this.video.muted;\n }\n\n isFullscreen(): boolean {\n return !!document.fullscreenElement;\n }\n\n isLive(): boolean {\n return this.isLiveStream;\n }\n\n get videoElement(): HTMLVideoElement {\n return this.video;\n }\n\n resize(): void {\n if (this.config.debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] Resizing player\");\n }\n\n if (this.ima && this.ima.isAdPlaying()) {\n const width = this.video.clientWidth || 640;\n const height = this.video.clientHeight || 360;\n\n if (this.config.debugAdTiming) {\n console.log(\n `[StormcloudVideoPlayer] Resizing ads manager to ${width}x${height}`\n );\n }\n\n this.ima.resize(width, height);\n }\n }\n\n destroy(): void {\n this.clearAdStartTimer();\n this.clearAdStopTimer();\n this.clearAdFailsafeTimer();\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = undefined;\n }\n this.hls?.destroy();\n this.ima?.destroy();\n }\n}\n","import type { ImaController } from \"../types\";\n\ndeclare global {\n interface Window {\n google?: any;\n }\n}\n\nexport function createImaController(\n video: HTMLVideoElement,\n options?: { continueLiveStreamDuringAds?: boolean }\n): ImaController {\n let adPlaying = false;\n let originalMutedState = false;\n const listeners = new Map<string, Set<(payload?: any) => void>>();\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 {}\n }\n }\n\n function ensureImaLoaded(): Promise<void> {\n try {\n const frameEl = window.frameElement as HTMLIFrameElement | null;\n const sandboxAttr = frameEl?.getAttribute?.(\"sandbox\") || \"\";\n if (sandboxAttr) {\n const tokens = new Set(\n sandboxAttr\n .split(/\\s+/)\n .map((t) => t.trim())\n .filter((t) => t.length > 0)\n );\n const allowsScripts = tokens.has(\"allow-scripts\");\n if (!allowsScripts) {\n // eslint-disable-next-line no-console\n console.error(\n \"StormcloudVideoPlayer: The host page is inside a sandboxed iframe without 'allow-scripts'. Google IMA cannot run ads within sandboxed frames. Remove the sandbox attribute or include 'allow-scripts allow-same-origin'.\"\n );\n }\n }\n } catch {}\n\n if (typeof window !== \"undefined\" && window.google?.ima)\n return Promise.resolve();\n const existing = document.querySelector(\n 'script[data-ima=\"true\"]'\n ) as HTMLScriptElement | null;\n if (existing) {\n return new Promise((resolve) =>\n existing.addEventListener(\"load\", () => resolve())\n );\n }\n return new Promise((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.src = \"https://imasdk.googleapis.com/js/sdkloader/ima3.js\";\n script.async = true;\n script.defer = true;\n script.setAttribute(\"data-ima\", \"true\");\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"IMA SDK load failed\"));\n document.head.appendChild(script);\n });\n }\n\n let adsManager: any | undefined;\n let adsLoader: any | undefined;\n let adDisplayContainer: any | undefined;\n let adContainerEl: HTMLDivElement | undefined;\n let lastAdTagUrl: string | undefined;\n let retryAttempts = 0;\n const maxRetries = 2;\n const backoffBaseMs = 500;\n let adsLoadedPromise: Promise<void> | undefined;\n let adsLoadedResolve: (() => void) | undefined;\n let adsLoadedReject: ((error: Error) => void) | undefined;\n\n function makeAdsRequest(google: any, vastTagUrl: string) {\n const adsRequest = new google.ima.AdsRequest();\n adsRequest.adTagUrl = vastTagUrl;\n adsLoader.requestAds(adsRequest);\n }\n\n return {\n initialize() {\n ensureImaLoaded()\n .then(() => {\n const google = window.google;\n if (!adDisplayContainer) {\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 = \"flex\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"2\";\n video.parentElement?.appendChild(container);\n adContainerEl = container;\n adDisplayContainer = new google.ima.AdDisplayContainer(\n container,\n video\n );\n try {\n adDisplayContainer.initialize?.();\n } catch {}\n }\n })\n .catch(() => {});\n },\n async requestAds(vastTagUrl: string) {\n console.log(\"[IMA] Requesting ads:\", vastTagUrl);\n\n adsLoadedPromise = new Promise<void>((resolve, reject) => {\n adsLoadedResolve = resolve;\n adsLoadedReject = reject;\n\n setTimeout(() => {\n if (adsLoadedReject) {\n adsLoadedReject(new Error(\"Ad request timeout\"));\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n }\n }, 10000);\n });\n\n try {\n await ensureImaLoaded();\n const google = window.google;\n lastAdTagUrl = vastTagUrl;\n retryAttempts = 0;\n\n if (!adDisplayContainer) {\n console.log(\"[IMA] Creating ad display container\");\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 = \"flex\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"2\";\n\n if (!video.parentElement) {\n throw new Error(\"Video element has no parent for ad container\");\n }\n\n video.parentElement.appendChild(container);\n adContainerEl = container;\n adDisplayContainer = new google.ima.AdDisplayContainer(\n container,\n video\n );\n\n try {\n adDisplayContainer.initialize();\n console.log(\"[IMA] Ad display container initialized\");\n } catch (error) {\n console.warn(\n \"[IMA] Failed to initialize ad display container:\",\n error\n );\n }\n }\n\n if (!adsLoader) {\n console.log(\"[IMA] Creating ads loader\");\n const adsLoaderCls = new google.ima.AdsLoader(adDisplayContainer);\n adsLoader = adsLoaderCls;\n\n adsLoader.addEventListener(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n (evt: any) => {\n console.log(\"[IMA] Ads manager loaded\");\n try {\n adsManager = evt.getAdsManager(video);\n const AdEvent = google.ima.AdEvent.Type;\n const AdErrorEvent = google.ima.AdErrorEvent.Type;\n\n adsManager.addEventListener(\n AdErrorEvent.AD_ERROR,\n (errorEvent: any) => {\n console.error(\"[IMA] Ad error:\", errorEvent.getError());\n try {\n adsManager?.destroy?.();\n } catch {}\n adPlaying = false;\n video.muted = originalMutedState;\n if (adContainerEl)\n adContainerEl.style.pointerEvents = \"none\";\n\n if (adsLoadedReject) {\n adsLoadedReject(new Error(\"Ad playback error\"));\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n }\n\n if (lastAdTagUrl && retryAttempts < maxRetries) {\n const delay =\n backoffBaseMs * Math.pow(2, retryAttempts++);\n console.log(\n `[IMA] Retrying ad request in ${delay}ms (attempt ${retryAttempts})`\n );\n window.setTimeout(() => {\n try {\n makeAdsRequest(google, lastAdTagUrl!);\n } catch {}\n }, delay);\n } else {\n console.log(\n \"[IMA] Max retries reached, emitting ad_error\"\n );\n emit(\"ad_error\");\n\n if (!options?.continueLiveStreamDuringAds) {\n video.play()?.catch(() => {});\n }\n }\n }\n );\n\n adsManager.addEventListener(\n AdEvent.CONTENT_PAUSE_REQUESTED,\n () => {\n console.log(\"[IMA] Content pause requested\");\n originalMutedState = video.muted;\n video.muted = true;\n\n if (!options?.continueLiveStreamDuringAds) {\n video.pause();\n console.log(\"[IMA] Video paused (VOD mode)\");\n } else {\n console.log(\n \"[IMA] Video continues playing but muted (Live mode)\"\n );\n }\n\n adPlaying = true;\n if (adContainerEl)\n adContainerEl.style.pointerEvents = \"auto\";\n emit(\"content_pause\");\n }\n );\n\n adsManager.addEventListener(\n AdEvent.CONTENT_RESUME_REQUESTED,\n () => {\n console.log(\"[IMA] Content resume requested\");\n adPlaying = false;\n video.muted = originalMutedState;\n if (adContainerEl)\n adContainerEl.style.pointerEvents = \"none\";\n\n if (!options?.continueLiveStreamDuringAds) {\n video.play()?.catch(() => {});\n console.log(\"[IMA] Video resumed (VOD mode)\");\n } else {\n console.log(\n \"[IMA] Video unmuted (Live mode - was never paused)\"\n );\n }\n\n emit(\"content_resume\");\n }\n );\n\n adsManager.addEventListener(AdEvent.ALL_ADS_COMPLETED, () => {\n console.log(\"[IMA] All ads completed\");\n adPlaying = false;\n video.muted = originalMutedState;\n if (adContainerEl) adContainerEl.style.pointerEvents = \"none\";\n\n if (!options?.continueLiveStreamDuringAds) {\n video.play().catch(() => {});\n console.log(\n \"[IMA] Video resumed after all ads completed (VOD mode)\"\n );\n } else {\n console.log(\n \"[IMA] Video unmuted after all ads completed (Live mode)\"\n );\n }\n\n emit(\"all_ads_completed\");\n });\n\n console.log(\"[IMA] Ads manager event listeners attached\");\n\n if (adsLoadedResolve) {\n adsLoadedResolve();\n adsLoadedResolve = undefined;\n adsLoadedReject = undefined;\n }\n } catch (e) {\n console.error(\"[IMA] Error setting up ads manager:\", e);\n adPlaying = false;\n video.muted = originalMutedState;\n if (adContainerEl) adContainerEl.style.pointerEvents = \"none\";\n\n if (!options?.continueLiveStreamDuringAds) {\n video.play().catch(() => {});\n }\n\n if (adsLoadedReject) {\n adsLoadedReject(new Error(\"Failed to setup ads manager\"));\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n }\n emit(\"ad_error\");\n }\n },\n false\n );\n\n adsLoader.addEventListener(\n google.ima.AdErrorEvent.Type.AD_ERROR,\n (adErrorEvent: any) => {\n console.error(\"[IMA] Ads loader error:\", adErrorEvent.getError());\n\n if (adsLoadedReject) {\n adsLoadedReject(new Error(\"Ads loader error\"));\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n }\n emit(\"ad_error\");\n },\n false\n );\n }\n\n console.log(\"[IMA] Making ads request\");\n makeAdsRequest(google, vastTagUrl);\n\n return adsLoadedPromise;\n } catch (error) {\n console.error(\"[IMA] Failed to request ads:\", error);\n if (adsLoadedReject) {\n adsLoadedReject(error as Error);\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n }\n return Promise.reject(error);\n }\n },\n async play() {\n if (!window.google?.ima || !adDisplayContainer) {\n console.warn(\n \"[IMA] Cannot play ad: IMA SDK or ad container not available\"\n );\n return Promise.reject(new Error(\"IMA SDK not available\"));\n }\n\n if (!adsManager) {\n console.warn(\"[IMA] Cannot play ad: No ads manager available\");\n return Promise.reject(new Error(\"No ads manager\"));\n }\n\n try {\n const width = video.clientWidth || 640;\n const height = video.clientHeight || 360;\n\n console.log(`[IMA] Initializing ads manager (${width}x${height})`);\n adsManager.init(width, height, window.google.ima.ViewMode.NORMAL);\n\n if (!options?.continueLiveStreamDuringAds) {\n console.log(\"[IMA] Pausing video for ad playback (VOD mode)\");\n video.pause();\n } else {\n console.log(\n \"[IMA] Keeping video playing but muted for ad playback (Live mode)\"\n );\n }\n adPlaying = true;\n\n console.log(\"[IMA] Starting ad playback\");\n adsManager.start();\n\n return Promise.resolve();\n } catch (error) {\n console.error(\"[IMA] Error starting ad playback:\", error);\n adPlaying = false;\n\n if (!options?.continueLiveStreamDuringAds) {\n video.play()?.catch(() => {});\n }\n return Promise.reject(error);\n }\n },\n async stop() {\n adPlaying = false;\n video.muted = originalMutedState;\n try {\n adsManager?.stop?.();\n } catch {}\n\n if (!options?.continueLiveStreamDuringAds) {\n video.play().catch(() => {});\n console.log(\"[IMA] Video resumed after stop (VOD mode)\");\n } else {\n console.log(\"[IMA] Video unmuted after stop (Live mode)\");\n }\n },\n destroy() {\n try {\n adsManager?.destroy?.();\n } catch {}\n adPlaying = false;\n video.muted = originalMutedState;\n try {\n adsLoader?.destroy?.();\n } catch {}\n if (adContainerEl?.parentElement) {\n adContainerEl.parentElement.removeChild(adContainerEl);\n }\n },\n isAdPlaying() {\n return adPlaying;\n },\n resize(width: number, height: number) {\n if (!adsManager || !window.google?.ima) {\n console.warn(\n \"[IMA] Cannot resize: No ads manager or IMA SDK available\"\n );\n return;\n }\n\n try {\n console.log(`[IMA] Resizing ads manager to ${width}x${height}`);\n adsManager.resize(width, height, window.google.ima.ViewMode.NORMAL);\n } catch (error) {\n console.warn(\"[IMA] Error resizing ads manager:\", error);\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 off(event: string, listener: (payload?: any) => void) {\n listeners.get(event)?.delete(listener);\n },\n updateOriginalMutedState(muted: boolean) {\n originalMutedState = muted;\n },\n getOriginalMutedState() {\n return originalMutedState;\n },\n setAdVolume(volume: number) {\n if (adsManager && adPlaying) {\n try {\n adsManager.setVolume(Math.max(0, Math.min(1, volume)));\n } catch (error) {\n console.warn(\"[IMA] Failed to set ad volume:\", error);\n }\n }\n },\n getAdVolume(): number {\n if (adsManager && adPlaying) {\n try {\n return adsManager.getVolume();\n } catch (error) {\n console.warn(\"[IMA] Failed to get ad volume:\", error);\n return 1;\n }\n }\n return 1;\n },\n };\n}\n","import type { ClientInfo, TrackingData, HeartbeatData } from \"../types\";\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\nexport async function getBrowserID(clientInfo: ClientInfo): Promise<string> {\n const fingerprintString = JSON.stringify(clientInfo);\n\n if (typeof crypto !== \"undefined\" && crypto.subtle && crypto.subtle.digest) {\n try {\n const hashBuffer = await crypto.subtle.digest(\n \"SHA-256\",\n new TextEncoder().encode(fingerprintString)\n );\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n return hashHex;\n } catch (error) {\n console.warn(\n \"[StormcloudVideoPlayer] crypto.subtle.digest failed, using fallback hash:\",\n error\n );\n }\n }\n\n let hash = 0;\n for (let i = 0; i < fingerprintString.length; i++) {\n const char = fingerprintString.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\nexport async function sendInitialTracking(licenseKey?: string): Promise<void> {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n\n const trackingData: TrackingData = {\n browserId,\n ...clientInfo,\n };\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n\n const response = await fetch(\n \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/track\",\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(trackingData),\n }\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n await response.json();\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n error\n );\n }\n}\n\nexport async function sendHeartbeat(licenseKey?: string): Promise<void> {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n\n const heartbeatData: HeartbeatData = {\n browserId,\n timestamp: new Date().toISOString(),\n };\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n\n const response = await fetch(\n \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/heartbeat\",\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(heartbeatData),\n }\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n await response.json();\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAgB;;;ACQT,SAAS,oBACd,OACA,SACe;AACf,MAAI,YAAY;AAChB,MAAI,qBAAqB;AACzB,QAAM,YAAY,oBAAI,IAA0C;AAEhE,WAAS,KAAK,OAAe,SAAqB;AAChD,UAAM,MAAM,UAAU,IAAI,KAAK;AAC/B,QAAI,CAAC,IAAK;AACV,eAAW,MAAM,MAAM,KAAK,GAAG,GAAG;AAChC,UAAI;AACF,WAAG,OAAO;AAAA,MACZ,QAAQ;AAAA,MAAC;AAAA,IACX;AAAA,EACF;AAEA,WAAS,kBAAiC;AACxC,QAAI;AACF,YAAM,UAAU,OAAO;AACvB,YAAM,cAAc,SAAS,eAAe,SAAS,KAAK;AAC1D,UAAI,aAAa;AACf,cAAM,SAAS,IAAI;AAAA,UACjB,YACG,MAAM,KAAK,EACX,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,QAC/B;AACA,cAAM,gBAAgB,OAAO,IAAI,eAAe;AAChD,YAAI,CAAC,eAAe;AAElB,kBAAQ;AAAA,YACN;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAAC;AAET,QAAI,OAAO,WAAW,eAAe,OAAO,QAAQ;AAClD,aAAO,QAAQ,QAAQ;AACzB,UAAM,WAAW,SAAS;AAAA,MACxB;AAAA,IACF;AACA,QAAI,UAAU;AACZ,aAAO,IAAI;AAAA,QAAQ,CAAC,YAClB,SAAS,iBAAiB,QAAQ,MAAM,QAAQ,CAAC;AAAA,MACnD;AAAA,IACF;AACA,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,aAAO,MAAM;AACb,aAAO,QAAQ;AACf,aAAO,QAAQ;AACf,aAAO,aAAa,YAAY,MAAM;AACtC,aAAO,SAAS,MAAM,QAAQ;AAC9B,aAAO,UAAU,MAAM,OAAO,IAAI,MAAM,qBAAqB,CAAC;AAC9D,eAAS,KAAK,YAAY,MAAM;AAAA,IAClC,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,gBAAgB;AACpB,QAAM,aAAa;AACnB,QAAM,gBAAgB;AACtB,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,WAAS,eAAe,QAAa,YAAoB;AACvD,UAAM,aAAa,IAAI,OAAO,IAAI,WAAW;AAC7C,eAAW,WAAW;AACtB,cAAU,WAAW,UAAU;AAAA,EACjC;AAEA,SAAO;AAAA,IACL,aAAa;AACX,sBAAgB,EACb,KAAK,MAAM;AACV,cAAM,SAAS,OAAO;AACtB,YAAI,CAAC,oBAAoB;AACvB,gBAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,oBAAU,MAAM,WAAW;AAC3B,oBAAU,MAAM,OAAO;AACvB,oBAAU,MAAM,MAAM;AACtB,oBAAU,MAAM,QAAQ;AACxB,oBAAU,MAAM,SAAS;AACzB,oBAAU,MAAM,UAAU;AAC1B,oBAAU,MAAM,aAAa;AAC7B,oBAAU,MAAM,iBAAiB;AACjC,oBAAU,MAAM,gBAAgB;AAChC,oBAAU,MAAM,SAAS;AACzB,gBAAM,eAAe,YAAY,SAAS;AAC1C,0BAAgB;AAChB,+BAAqB,IAAI,OAAO,IAAI;AAAA,YAClC;AAAA,YACA;AAAA,UACF;AACA,cAAI;AACF,+BAAmB,aAAa;AAAA,UAClC,QAAQ;AAAA,UAAC;AAAA,QACX;AAAA,MACF,CAAC,EACA,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACnB;AAAA,IACA,MAAM,WAAW,YAAoB;AACnC,cAAQ,IAAI,yBAAyB,UAAU;AAE/C,yBAAmB,IAAI,QAAc,CAAC,SAAS,WAAW;AACxD,2BAAmB;AACnB,0BAAkB;AAElB,mBAAW,MAAM;AACf,cAAI,iBAAiB;AACnB,4BAAgB,IAAI,MAAM,oBAAoB,CAAC;AAC/C,8BAAkB;AAClB,+BAAmB;AAAA,UACrB;AAAA,QACF,GAAG,GAAK;AAAA,MACV,CAAC;AAED,UAAI;AACF,cAAM,gBAAgB;AACtB,cAAM,SAAS,OAAO;AACtB,uBAAe;AACf,wBAAgB;AAEhB,YAAI,CAAC,oBAAoB;AACvB,kBAAQ,IAAI,qCAAqC;AACjD,gBAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,oBAAU,MAAM,WAAW;AAC3B,oBAAU,MAAM,OAAO;AACvB,oBAAU,MAAM,MAAM;AACtB,oBAAU,MAAM,QAAQ;AACxB,oBAAU,MAAM,SAAS;AACzB,oBAAU,MAAM,UAAU;AAC1B,oBAAU,MAAM,aAAa;AAC7B,oBAAU,MAAM,iBAAiB;AACjC,oBAAU,MAAM,gBAAgB;AAChC,oBAAU,MAAM,SAAS;AAEzB,cAAI,CAAC,MAAM,eAAe;AACxB,kBAAM,IAAI,MAAM,8CAA8C;AAAA,UAChE;AAEA,gBAAM,cAAc,YAAY,SAAS;AACzC,0BAAgB;AAChB,+BAAqB,IAAI,OAAO,IAAI;AAAA,YAClC;AAAA,YACA;AAAA,UACF;AAEA,cAAI;AACF,+BAAmB,WAAW;AAC9B,oBAAQ,IAAI,wCAAwC;AAAA,UACtD,SAAS,OAAO;AACd,oBAAQ;AAAA,cACN;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,YAAI,CAAC,WAAW;AACd,kBAAQ,IAAI,2BAA2B;AACvC,gBAAM,eAAe,IAAI,OAAO,IAAI,UAAU,kBAAkB;AAChE,sBAAY;AAEZ,oBAAU;AAAA,YACR,OAAO,IAAI,sBAAsB,KAAK;AAAA,YACtC,CAAC,QAAa;AACZ,sBAAQ,IAAI,0BAA0B;AACtC,kBAAI;AACF,6BAAa,IAAI,cAAc,KAAK;AACpC,sBAAM,UAAU,OAAO,IAAI,QAAQ;AACnC,sBAAM,eAAe,OAAO,IAAI,aAAa;AAE7C,2BAAW;AAAA,kBACT,aAAa;AAAA,kBACb,CAAC,eAAoB;AACnB,4BAAQ,MAAM,mBAAmB,WAAW,SAAS,CAAC;AACtD,wBAAI;AACF,kCAAY,UAAU;AAAA,oBACxB,QAAQ;AAAA,oBAAC;AACT,gCAAY;AACZ,0BAAM,QAAQ;AACd,wBAAI;AACF,oCAAc,MAAM,gBAAgB;AAEtC,wBAAI,iBAAiB;AACnB,sCAAgB,IAAI,MAAM,mBAAmB,CAAC;AAC9C,wCAAkB;AAClB,yCAAmB;AAAA,oBACrB;AAEA,wBAAI,gBAAgB,gBAAgB,YAAY;AAC9C,4BAAM,QACJ,gBAAgB,KAAK,IAAI,GAAG,eAAe;AAC7C,8BAAQ;AAAA,wBACN,gCAAgC,KAAK,eAAe,aAAa;AAAA,sBACnE;AACA,6BAAO,WAAW,MAAM;AACtB,4BAAI;AACF,yCAAe,QAAQ,YAAa;AAAA,wBACtC,QAAQ;AAAA,wBAAC;AAAA,sBACX,GAAG,KAAK;AAAA,oBACV,OAAO;AACL,8BAAQ;AAAA,wBACN;AAAA,sBACF;AACA,2BAAK,UAAU;AAEf,0BAAI,CAAC,SAAS,6BAA6B;AACzC,8BAAM,KAAK,GAAG,MAAM,MAAM;AAAA,wBAAC,CAAC;AAAA,sBAC9B;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAEA,2BAAW;AAAA,kBACT,QAAQ;AAAA,kBACR,MAAM;AACJ,4BAAQ,IAAI,+BAA+B;AAC3C,yCAAqB,MAAM;AAC3B,0BAAM,QAAQ;AAEd,wBAAI,CAAC,SAAS,6BAA6B;AACzC,4BAAM,MAAM;AACZ,8BAAQ,IAAI,+BAA+B;AAAA,oBAC7C,OAAO;AACL,8BAAQ;AAAA,wBACN;AAAA,sBACF;AAAA,oBACF;AAEA,gCAAY;AACZ,wBAAI;AACF,oCAAc,MAAM,gBAAgB;AACtC,yBAAK,eAAe;AAAA,kBACtB;AAAA,gBACF;AAEA,2BAAW;AAAA,kBACT,QAAQ;AAAA,kBACR,MAAM;AACJ,4BAAQ,IAAI,gCAAgC;AAC5C,gCAAY;AACZ,0BAAM,QAAQ;AACd,wBAAI;AACF,oCAAc,MAAM,gBAAgB;AAEtC,wBAAI,CAAC,SAAS,6BAA6B;AACzC,4BAAM,KAAK,GAAG,MAAM,MAAM;AAAA,sBAAC,CAAC;AAC5B,8BAAQ,IAAI,gCAAgC;AAAA,oBAC9C,OAAO;AACL,8BAAQ;AAAA,wBACN;AAAA,sBACF;AAAA,oBACF;AAEA,yBAAK,gBAAgB;AAAA,kBACvB;AAAA,gBACF;AAEA,2BAAW,iBAAiB,QAAQ,mBAAmB,MAAM;AAC3D,0BAAQ,IAAI,yBAAyB;AACrC,8BAAY;AACZ,wBAAM,QAAQ;AACd,sBAAI,cAAe,eAAc,MAAM,gBAAgB;AAEvD,sBAAI,CAAC,SAAS,6BAA6B;AACzC,0BAAM,KAAK,EAAE,MAAM,MAAM;AAAA,oBAAC,CAAC;AAC3B,4BAAQ;AAAA,sBACN;AAAA,oBACF;AAAA,kBACF,OAAO;AACL,4BAAQ;AAAA,sBACN;AAAA,oBACF;AAAA,kBACF;AAEA,uBAAK,mBAAmB;AAAA,gBAC1B,CAAC;AAED,wBAAQ,IAAI,4CAA4C;AAExD,oBAAI,kBAAkB;AACpB,mCAAiB;AACjB,qCAAmB;AACnB,oCAAkB;AAAA,gBACpB;AAAA,cACF,SAAS,GAAG;AACV,wBAAQ,MAAM,uCAAuC,CAAC;AACtD,4BAAY;AACZ,sBAAM,QAAQ;AACd,oBAAI,cAAe,eAAc,MAAM,gBAAgB;AAEvD,oBAAI,CAAC,SAAS,6BAA6B;AACzC,wBAAM,KAAK,EAAE,MAAM,MAAM;AAAA,kBAAC,CAAC;AAAA,gBAC7B;AAEA,oBAAI,iBAAiB;AACnB,kCAAgB,IAAI,MAAM,6BAA6B,CAAC;AACxD,oCAAkB;AAClB,qCAAmB;AAAA,gBACrB;AACA,qBAAK,UAAU;AAAA,cACjB;AAAA,YACF;AAAA,YACA;AAAA,UACF;AAEA,oBAAU;AAAA,YACR,OAAO,IAAI,aAAa,KAAK;AAAA,YAC7B,CAAC,iBAAsB;AACrB,sBAAQ,MAAM,2BAA2B,aAAa,SAAS,CAAC;AAEhE,kBAAI,iBAAiB;AACnB,gCAAgB,IAAI,MAAM,kBAAkB,CAAC;AAC7C,kCAAkB;AAClB,mCAAmB;AAAA,cACrB;AACA,mBAAK,UAAU;AAAA,YACjB;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAEA,gBAAQ,IAAI,0BAA0B;AACtC,uBAAe,QAAQ,UAAU;AAEjC,eAAO;AAAA,MACT,SAAS,OAAO;AACd,gBAAQ,MAAM,gCAAgC,KAAK;AACnD,YAAI,iBAAiB;AACnB,0BAAgB,KAAc;AAC9B,4BAAkB;AAClB,6BAAmB;AAAA,QACrB;AACA,eAAO,QAAQ,OAAO,KAAK;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,MAAM,OAAO;AACX,UAAI,CAAC,OAAO,QAAQ,OAAO,CAAC,oBAAoB;AAC9C,gBAAQ;AAAA,UACN;AAAA,QACF;AACA,eAAO,QAAQ,OAAO,IAAI,MAAM,uBAAuB,CAAC;AAAA,MAC1D;AAEA,UAAI,CAAC,YAAY;AACf,gBAAQ,KAAK,gDAAgD;AAC7D,eAAO,QAAQ,OAAO,IAAI,MAAM,gBAAgB,CAAC;AAAA,MACnD;AAEA,UAAI;AACF,cAAM,QAAQ,MAAM,eAAe;AACnC,cAAM,SAAS,MAAM,gBAAgB;AAErC,gBAAQ,IAAI,mCAAmC,KAAK,IAAI,MAAM,GAAG;AACjE,mBAAW,KAAK,OAAO,QAAQ,OAAO,OAAO,IAAI,SAAS,MAAM;AAEhE,YAAI,CAAC,SAAS,6BAA6B;AACzC,kBAAQ,IAAI,gDAAgD;AAC5D,gBAAM,MAAM;AAAA,QACd,OAAO;AACL,kBAAQ;AAAA,YACN;AAAA,UACF;AAAA,QACF;AACA,oBAAY;AAEZ,gBAAQ,IAAI,4BAA4B;AACxC,mBAAW,MAAM;AAEjB,eAAO,QAAQ,QAAQ;AAAA,MACzB,SAAS,OAAO;AACd,gBAAQ,MAAM,qCAAqC,KAAK;AACxD,oBAAY;AAEZ,YAAI,CAAC,SAAS,6BAA6B;AACzC,gBAAM,KAAK,GAAG,MAAM,MAAM;AAAA,UAAC,CAAC;AAAA,QAC9B;AACA,eAAO,QAAQ,OAAO,KAAK;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,MAAM,OAAO;AACX,kBAAY;AACZ,YAAM,QAAQ;AACd,UAAI;AACF,oBAAY,OAAO;AAAA,MACrB,QAAQ;AAAA,MAAC;AAET,UAAI,CAAC,SAAS,6BAA6B;AACzC,cAAM,KAAK,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAC3B,gBAAQ,IAAI,2CAA2C;AAAA,MACzD,OAAO;AACL,gBAAQ,IAAI,4CAA4C;AAAA,MAC1D;AAAA,IACF;AAAA,IACA,UAAU;AACR,UAAI;AACF,oBAAY,UAAU;AAAA,MACxB,QAAQ;AAAA,MAAC;AACT,kBAAY;AACZ,YAAM,QAAQ;AACd,UAAI;AACF,mBAAW,UAAU;AAAA,MACvB,QAAQ;AAAA,MAAC;AACT,UAAI,eAAe,eAAe;AAChC,sBAAc,cAAc,YAAY,aAAa;AAAA,MACvD;AAAA,IACF;AAAA,IACA,cAAc;AACZ,aAAO;AAAA,IACT;AAAA,IACA,OAAO,OAAe,QAAgB;AACpC,UAAI,CAAC,cAAc,CAAC,OAAO,QAAQ,KAAK;AACtC,gBAAQ;AAAA,UACN;AAAA,QACF;AACA;AAAA,MACF;AAEA,UAAI;AACF,gBAAQ,IAAI,iCAAiC,KAAK,IAAI,MAAM,EAAE;AAC9D,mBAAW,OAAO,OAAO,QAAQ,OAAO,OAAO,IAAI,SAAS,MAAM;AAAA,MACpE,SAAS,OAAO;AACd,gBAAQ,KAAK,qCAAqC,KAAK;AAAA,MACzD;AAAA,IACF;AAAA,IACA,GAAG,OAAe,UAAmC;AACnD,UAAI,CAAC,UAAU,IAAI,KAAK,EAAG,WAAU,IAAI,OAAO,oBAAI,IAAI,CAAC;AACzD,gBAAU,IAAI,KAAK,EAAG,IAAI,QAAQ;AAAA,IACpC;AAAA,IACA,IAAI,OAAe,UAAmC;AACpD,gBAAU,IAAI,KAAK,GAAG,OAAO,QAAQ;AAAA,IACvC;AAAA,IACA,yBAAyB,OAAgB;AACvC,2BAAqB;AAAA,IACvB;AAAA,IACA,wBAAwB;AACtB,aAAO;AAAA,IACT;AAAA,IACA,YAAY,QAAgB;AAC1B,UAAI,cAAc,WAAW;AAC3B,YAAI;AACF,qBAAW,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,MAAM,CAAC,CAAC;AAAA,QACvD,SAAS,OAAO;AACd,kBAAQ,KAAK,kCAAkC,KAAK;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAAA,IACA,cAAsB;AACpB,UAAI,cAAc,WAAW;AAC3B,YAAI;AACF,iBAAO,WAAW,UAAU;AAAA,QAC9B,SAAS,OAAO;AACd,kBAAQ,KAAK,kCAAkC,KAAK;AACpD,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC3dO,SAAS,gBAA4B;AAC1C,QAAM,KAAK,UAAU;AACrB,QAAM,WAAW,UAAU;AAC3B,QAAM,SAAS,UAAU,UAAU;AACnC,QAAM,iBAAiB,UAAU,kBAAkB;AACnD,QAAM,SAAU,UAAkB,gBAAgB;AAClD,QAAM,sBAAsB,UAAU,uBAAuB;AAE7D,QAAM,aAAa;AAAA,IACjB,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB,YAAY,QAAQ;AAAA,IACpB,aAAa,QAAQ;AAAA,IACrB,aAAc,QAAQ,aAAqB,QAAQ;AAAA,IACnD,YAAY,QAAQ;AAAA,EACtB;AAEA,MAAI,aAAqD;AACzD,MAAI,QAAQ;AACZ,MAAI,KAAK;AACT,MAAI,QAAQ;AACZ,MAAI,YAAY;AAChB,MAAI,YAAY;AAChB,MAAI,YAAY;AAChB,MAAI,WAAW;AAEf,MAAI,GAAG,SAAS,OAAO,GAAG;AACxB,YAAQ;AACR,SAAK;AACL,gBAAY;AACZ,iBAAa;AACb,UAAM,aAAa,GAAG,MAAM,iBAAiB;AAC7C,YAAQ,aAAa,SAAS,WAAW,CAAC,CAAC,KAAK;AAAA,EAClD,WAAW,GAAG,SAAS,OAAO,GAAG;AAC/B,YAAQ;AACR,SAAK;AACL,gBAAY;AACZ,iBAAa;AACb,UAAM,aAAa,GAAG,MAAM,iBAAiB;AAC7C,UAAM,UAAU,GAAG,MAAM,2BAA2B,IAAI,aAAa;AACrE,YAAQ,aACJ,SAAS,WAAW,CAAC,CAAC,IAAI,OAAO,GAAG,KAAK,IACzC;AAAA,EACN,WAAW,GAAG,SAAS,SAAS,GAAG;AACjC,YAAQ;AACR,SAAK;AACL,gBAAY;AACZ,iBAAa;AAAA,EACf,WAAW,GAAG,SAAS,OAAO,KAAK,GAAG,SAAS,OAAO,GAAG;AACvD,YAAQ;AACR,SAAK;AACL,gBAAY;AACZ,iBAAa;AAAA,EACf,WACE,GAAG,SAAS,SAAS,MACpB,GAAG,SAAS,MAAM,KAAK,OAAO,SAAS,MAAM,IAC9C;AACA,YAAQ;AACR,SAAK;AACL,gBAAY;AACZ,iBAAa;AAAA,EACf,WACE,GAAG,SAAS,SAAS,MACpB,GAAG,SAAS,SAAS,KAAK,GAAG,SAAS,IAAI,IAC3C;AACA,YAAQ;AACR,SAAK;AACL,gBAAY;AACZ,iBAAa;AAAA,EACf,WAAW,GAAG,SAAS,OAAO,KAAK,GAAG,SAAS,OAAO,GAAG;AACvD,YAAQ;AACR,SAAK;AACL,gBAAY;AACZ,iBAAa;AAAA,EACf,WAAW,GAAG,SAAS,SAAS,GAAG;AACjC,YAAQ;AACR,SAAK;AACL,gBAAY;AACZ,iBAAa;AAAA,EACf;AAEA,MAAI,GAAG,SAAS,SAAS,GAAG;AAC1B,gBAAY;AACZ,SAAK;AACL,iBAAa,SAAS,KAAK,EAAE,IAAI,WAAW;AAE5C,QACE,GAAG,SAAS,SAAS,MACpB,mBAAmB,KAClB,GAAG,SAAS,WAAW,KACvB,GAAG,SAAS,QAAQ,IACtB;AACA,mBAAa;AACb,kBAAY;AACZ,cAAQ,UAAU,YAAY,eAAe;AAAA,IAC/C;AAEA,UAAM,oBAAoB,GAAG,MAAM,yBAAyB;AAC5D,QAAI,qBAAqB,kBAAkB,CAAC,GAAG;AAC7C,cAAQ,kBAAkB,CAAC;AAAA,IAC7B;AAAA,EACF;AAEA,MAAI,mBAAmB,KAAK,EAAE,GAAG;AAC/B,SAAK;AACL,iBAAa;AACb,YAAQ;AACR,QAAI,UAAU,iBAAiB,KAAK,OAAO,KAAK,EAAE,GAAG;AACnD,mBAAa;AAAA,IACf;AAAA,EACF;AAEA,MAAI,CAAC,aAAa,CAAC,aAAa,CAAC,SAAS,KAAK,EAAE,GAAG;AAClD,QAAI,GAAG,SAAS,SAAS,GAAG;AAC1B,WAAK;AACL,mBAAa;AAAA,IACf,WAAW,GAAG,SAAS,KAAK,KAAK,CAAC,SAAS,KAAK,EAAE,GAAG;AACnD,WAAK;AACL,mBAAa;AACb,UAAI,iBAAiB,EAAG,cAAa;AAAA,IACvC,WAAW,GAAG,SAAS,OAAO,GAAG;AAC/B,WAAK;AACL,mBAAa;AAAA,IACf;AAAA,EACF;AAEA,MAAI,UAAU,WAAW;AACvB,QAAI,OAAO,SAAS,QAAQ,KAAK,GAAG,SAAS,QAAQ,EAAG,SAAQ;AAChE,QAAI,OAAO,SAAS,OAAO,EAAG,SAAQ;AACtC,QAAI,OAAO,SAAS,SAAS,KAAK,GAAG,SAAS,KAAK,EAAG,SAAQ;AAAA,EAChE;AAEA,cAAY,uBAAuB,KAAK,EAAE;AAE1C,MAAI,QAAQ,gBAAgB,KAAK,QAAQ,eAAe,GAAG;AACzD,gBAAY;AAAA,EACd;AAEA,aACE,OAAO,WAAW,4BAA4B,EAAE,WAC/C,OAAO,UAAkB,eAAe,QACzC,OAAO,QAAQ,aAAa,UAAU;AAExC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,SAAS,GAAG,UAAU,GAAG,EAAE,IAAI;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,OAAO,SAAS;AAAA,IACxB,QAAQ,OAAO,SAAS;AAAA,IACxB,MAAM,OAAO,SAAS;AAAA,IACtB,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA,UAAU,UAAU;AAAA,IACpB,WAAW,UAAU,WAAW,KAAK,GAAG,KAAK;AAAA,IAC7C,eAAe,UAAU;AAAA,IACzB,YAAY,UAAU,cAAc;AAAA,IACpC,UAAU,SAAS;AAAA,IACnB,iBAAiB,SAAS;AAAA,EAC5B;AACF;AAEA,eAAsB,aAAa,YAAyC;AAC1E,QAAM,oBAAoB,KAAK,UAAU,UAAU;AAEnD,MAAI,OAAO,WAAW,eAAe,OAAO,UAAU,OAAO,OAAO,QAAQ;AAC1E,QAAI;AACF,YAAM,aAAa,MAAM,OAAO,OAAO;AAAA,QACrC;AAAA,QACA,IAAI,YAAY,EAAE,OAAO,iBAAiB;AAAA,MAC5C;AACA,YAAM,YAAY,MAAM,KAAK,IAAI,WAAW,UAAU,CAAC;AACvD,YAAM,UAAU,UACb,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAC1C,KAAK,EAAE;AACV,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,kBAAkB,QAAQ,KAAK;AACjD,UAAM,OAAO,kBAAkB,WAAW,CAAC;AAC3C,YAAQ,QAAQ,KAAK,OAAO;AAC5B,WAAO,OAAO;AAAA,EAChB;AAEA,QAAM,eAAe,KAAK,IAAI,IAAI,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAChE,QAAM,YAAY,KAAK,IAAI,EAAE,SAAS,EAAE,EAAE,SAAS,IAAI,GAAG;AAC1D,QAAM,SAAS,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE,EAAE,SAAS,IAAI,GAAG;AAE3E,UAAQ,eAAe,YAAY,QAAQ,OAAO,IAAI,GAAG;AAC3D;AAEA,eAAsB,oBAAoB,YAAoC;AAC5E,MAAI;AACF,UAAM,aAAa,cAAc;AACjC,UAAM,YAAY,MAAM,aAAa,UAAU;AAE/C,UAAM,eAA6B;AAAA,MACjC;AAAA,MACA,GAAG;AAAA,IACL;AAEA,UAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,IAClB;AACA,QAAI,YAAY;AACd,cAAQ,eAAe,IAAI,UAAU,UAAU;AAAA,IACjD;AAEA,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR;AAAA,QACA,MAAM,KAAK,UAAU,YAAY;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,EAAE;AAAA,IAC1D;AAEA,UAAM,SAAS,KAAK;AAAA,EACtB,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAsB,cAAc,YAAoC;AACtE,MAAI;AACF,UAAM,aAAa,cAAc;AACjC,UAAM,YAAY,MAAM,aAAa,UAAU;AAE/C,UAAM,gBAA+B;AAAA,MACnC;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAEA,UAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,IAClB;AACA,QAAI,YAAY;AACd,cAAQ,eAAe,IAAI,UAAU,UAAU;AAAA,IACjD;AAEA,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR;AAAA,QACA,MAAM,KAAK,UAAU,aAAa;AAAA,MACpC;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,EAAE;AAAA,IAC1D;AAEA,UAAM,SAAS,KAAK;AAAA,EACtB,SAAS,OAAO;AACd,YAAQ,MAAM,oDAAoD,KAAK;AAAA,EACzE;AACF;;;AF9QO,IAAM,wBAAN,MAA4B;AAAA,EAyBjC,YAAY,QAAqC;AApBjD,SAAQ,WAAW;AACnB,SAAQ,YAAY;AAMpB,SAAQ,gBAAgB;AACxB,SAAQ,aAAuB,CAAC;AAKhC,SAAQ,oBAA4B;AAEpC,SAAQ,iBAAyB;AACjC,SAAQ,kBAA0B;AAClC,SAAQ,UAAmB;AAC3B,SAAQ,eAAwB;AAG9B,SAAK,SAAS;AACd,SAAK,QAAQ,OAAO;AAEpB,SAAK,MAAM,oBAAoB,KAAK,OAAO;AAAA,MACzC,6BAA6B;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAsB;AAC1B,QAAI,CAAC,KAAK,UAAU;AAClB,WAAK,OAAO;AAAA,IACd;AAEA,QAAI;AACF,YAAM,KAAK,qBAAqB;AAAA,IAClC,SAAS,OAAO;AACd,UAAI,KAAK,OAAO,eAAe;AAC7B,gBAAQ;AAAA,UACN;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,SAAK,mBAAmB;AAExB,QAAI,KAAK,mBAAmB,GAAG;AAC7B,WAAK,MAAM,MAAM,KAAK,OAAO;AAE7B,WAAK,eAAe,KAAK,OAAO,kBAAkB;AAElD,UAAI,KAAK,OAAO,eAAe;AAC7B,gBAAQ;AAAA,UACN;AAAA,UACA;AAAA,YACE,QAAQ,KAAK;AAAA,YACb,gBAAgB,KAAK,OAAO;AAAA,YAC5B,YAAY;AAAA,UACd;AAAA,QACF;AAAA,MACF;AAEA,WAAK,IAAI,QAAQ;AACjB,WAAK,MAAM,oBAAoB,KAAK,OAAO;AAAA,QACzC,6BAA6B;AAAA,MAC/B,CAAC;AACD,WAAK,IAAI,WAAW;AAEpB,UAAI,KAAK,OAAO,UAAU;AACxB,cAAM,KAAK,MAAM,KAAK,GAAG,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MACzC;AACA;AAAA,IACF;AAEA,SAAK,MAAM,IAAI,WAAAA,QAAI;AAAA,MACjB,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,sBAAsB;AAAA,MACtB,gBAAgB,CAAC,CAAC,KAAK,OAAO;AAAA,MAC9B,yBAAyB,KAAK,OAAO,iBAAiB,MAAM;AAAA,MAC5D,GAAI,KAAK,OAAO,iBAAiB,EAAE,kBAAkB,EAAE,IAAI,CAAC;AAAA,IAC9D,CAAC;AAED,SAAK,IAAI,GAAG,WAAAA,QAAI,OAAO,gBAAgB,MAAM;AAC3C,WAAK,KAAK,WAAW,KAAK,OAAO,GAAG;AAAA,IACtC,CAAC;AAED,SAAK,IAAI,GAAG,WAAAA,QAAI,OAAO,iBAAiB,OAAO,GAAG,SAAc;AAC9D,WAAK,eACH,KAAK,KAAK,QAAQ;AAAA,QAChB,CAAC,UACC,OAAO,SAAS,SAAS,QAAQ,OAAO,SAAS,SAAS;AAAA,MAC9D,KAAK;AAEP,UAAI,KAAK,OAAO,eAAe;AAC7B,cAAM,aAAa,KAAK,kCAAkC,IACtD,iDACA;AACJ,gBAAQ,IAAI,iDAAiD;AAAA,UAC3D,QAAQ,KAAK;AAAA,UACb,gBAAgB,KAAK,OAAO;AAAA,UAC5B;AAAA,QACF,CAAC;AAAA,MACH;AAEA,WAAK,IAAI,QAAQ;AACjB,WAAK,MAAM,oBAAoB,KAAK,OAAO;AAAA,QACzC,6BAA6B,KAAK,kCAAkC;AAAA,MACtE,CAAC;AACD,WAAK,IAAI,WAAW;AAEpB,UAAI,KAAK,OAAO,UAAU;AACxB,cAAM,KAAK,MAAM,KAAK,GAAG,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MACzC;AAAA,IACF,CAAC;AAED,SAAK,IAAI,GAAG,WAAAA,QAAI,OAAO,uBAAuB,CAAC,MAAM,SAAc;AACjE,YAAM,WAAyB,MAAM,WAAW,CAAC,GAAG,IAAI,CAAC,OAAY;AAAA,QACnE,KAAK;AAAA,QACL,OAAO,GAAG;AAAA,QACV,YAAY,GAAG;AAAA,MACjB,EAAE;AACF,cAAQ,QAAQ,CAAC,QAAQ,KAAK,SAAS,GAAG,CAAC;AAAA,IAC7C,CAAC;AAED,SAAK,IAAI,GAAG,WAAAA,QAAI,OAAO,cAAc,CAAC,MAAM,SAAc;AACxD,YAAM,OAAO,MAAM;AACnB,YAAM,UAA6B,MAAM;AACzC,UAAI,CAAC,MAAM,QAAQ,OAAO,EAAG;AAE7B,iBAAW,SAAS,SAAS;AAC3B,YAAI,MAAM;AACV,YAAI,QAAQ;AACZ,YAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,gBAAM,OAAO,MAAM,CAAC,KAAK,EAAE;AAC3B,kBAAQ,OAAO,MAAM,CAAC,KAAK,EAAE;AAAA,QAC/B,WAAW,OAAO,UAAU,UAAU;AACpC,gBAAM,MAAM,MAAM,QAAQ,GAAG;AAC7B,cAAI,OAAO,GAAG;AACZ,kBAAM,MAAM,UAAU,GAAG,GAAG;AAC5B,oBAAQ,MAAM,UAAU,MAAM,CAAC;AAAA,UACjC,OAAO;AACL,kBAAM;AACN,oBAAQ;AAAA,UACV;AAAA,QACF;AAEA,YAAI,CAAC,IAAK;AACV,YAAI,IAAI,SAAS,eAAe,GAAG;AACjC,gBAAM,kBAAkB,KAAK,oBAAoB,KAAK;AACtD,gBAAM,SAAuB;AAAA,YAC3B,MAAM;AAAA,YACN,GAAI,oBAAoB,SAAY,EAAE,gBAAgB,IAAI,CAAC;AAAA,YAC3D,KAAK,EAAE,KAAK,MAAM;AAAA,UACpB;AACA,eAAK,eAAe,MAAM;AAAA,QAC5B,WAAW,IAAI,SAAS,oBAAoB,GAAG;AAC7C,gBAAM,OAAO,KAAK,gBAAgB,KAAK;AACvC,gBAAM,SAAuB;AAAA,YAC3B,MAAM;AAAA,YACN,GAAI,MAAM,aAAa,SACnB,EAAE,iBAAiB,KAAK,SAAS,IACjC,CAAC;AAAA,YACL,GAAI,MAAM,YAAY,SAClB,EAAE,YAAY,KAAK,QAAQ,IAC3B,CAAC;AAAA,YACL,KAAK,EAAE,KAAK,MAAM;AAAA,UACpB;AACA,eAAK,eAAe,MAAM;AAAA,QAC5B,WAAW,IAAI,SAAS,cAAc,GAAG;AACvC,eAAK,eAAe,EAAE,MAAM,OAAO,KAAK,EAAE,KAAK,MAAM,EAAE,CAAC;AAAA,QAC1D,WAAW,IAAI,SAAS,iBAAiB,GAAG;AAC1C,gBAAM,QAAQ,KAAK,mBAAmB,KAAK;AAC3C,gBAAM,aACJ,gBAAgB,SAAS,MAAM,YAAY,MAAM;AACnD,gBAAM,YACJ,eAAe,SAAS,MAAM,WAAW,MAAM;AACjD,gBAAM,QAAQ,OAAO,MAAM,OAAO,KAAK,EAAE;AACzC,gBAAM,WAAW,KAAK,SAAS,MAAM,UAAU,CAAC;AAEhD,cAAI,cAAc,wBAAwB,KAAK,KAAK,GAAG;AACrD,kBAAM,SAAuB;AAAA,cAC3B,MAAM;AAAA,cACN,GAAI,aAAa,SAAY,EAAE,iBAAiB,SAAS,IAAI,CAAC;AAAA,cAC9D,KAAK,EAAE,KAAK,OAAO,MAAM;AAAA,YAC3B;AACA,iBAAK,eAAe,MAAM;AAAA,UAC5B;AACA,cAAI,WAAW;AACb,iBAAK,eAAe,EAAE,MAAM,OAAO,KAAK,EAAE,KAAK,OAAO,MAAM,EAAE,CAAC;AAAA,UACjE;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,IAAI,GAAG,WAAAA,QAAI,OAAO,OAAO,CAAC,MAAM,SAAS;AAC5C,UAAI,MAAM,OAAO;AACf,gBAAQ,KAAK,MAAM;AAAA,UACjB,KAAK,WAAAA,QAAI,WAAW;AAClB,iBAAK,KAAK,UAAU;AACpB;AAAA,UACF,KAAK,WAAAA,QAAI,WAAW;AAClB,iBAAK,KAAK,kBAAkB;AAC5B;AAAA,UACF;AACE,iBAAK,QAAQ;AACb;AAAA,QACJ;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,IAAI,YAAY,KAAK,KAAK;AAAA,EACjC;AAAA,EAEQ,SAAe;AACrB,QAAI,KAAK,SAAU;AACnB,SAAK,WAAW;AAChB,SAAK,MAAM,WAAW,CAAC,CAAC,KAAK,OAAO;AACpC,SAAK,MAAM,QAAQ,CAAC,CAAC,KAAK,OAAO;AAEjC,SAAK,IAAI,WAAW;AACpB,SAAK,IAAI,GAAG,qBAAqB,MAAM;AACrC,UAAI,CAAC,KAAK,UAAW;AACrB,YAAM,YAAY,KAAK,iBAAiB;AACxC,UAAI,YAAY,OAAO,KAAK,WAAW,SAAS,GAAG;AACjD,cAAM,OAAO,KAAK,WAAW,MAAM;AACnC,aAAK;AACL,aAAK,aAAa,IAAI,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MACxC,OAAO;AACL,aAAK,iBAAiB;AACtB,aAAK,kBAAkB;AACvB,aAAK,UAAU;AAAA,MACjB;AAAA,IACF,CAAC;AACD,SAAK,IAAI,GAAG,YAAY,MAAM;AAC5B,UAAI,KAAK,OAAO,eAAe;AAC7B,gBAAQ,IAAI,qDAAqD;AAAA,MACnE;AACA,UAAI,CAAC,KAAK,UAAW;AACrB,YAAM,YAAY,KAAK,iBAAiB;AACxC,UAAI,YAAY,OAAO,KAAK,WAAW,SAAS,GAAG;AACjD,cAAM,OAAO,KAAK,WAAW,MAAM;AACnC,aAAK;AACL,aAAK,aAAa,IAAI,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MACxC,OAAO;AACL,aAAK,gBAAgB;AAAA,MACvB;AAAA,IACF,CAAC;AACD,SAAK,IAAI,GAAG,iBAAiB,MAAM;AACjC,UAAI,KAAK,OAAO,eAAe;AAC7B,gBAAQ,IAAI,0DAA0D;AAAA,MACxE;AACA,WAAK,qBAAqB;AAAA,IAC5B,CAAC;AACD,SAAK,IAAI,GAAG,kBAAkB,MAAM;AAClC,UAAI,KAAK,OAAO,eAAe;AAC7B,gBAAQ;AAAA,UACN;AAAA,QACF;AAAA,MACF;AACA,WAAK,qBAAqB;AAAA,IAC5B,CAAC;AAED,SAAK,MAAM,iBAAiB,cAAc,MAAM;AAC9C,WAAK,aAAa,KAAK,MAAM,WAAW;AAAA,IAC1C,CAAC;AAAA,EACH;AAAA,EAEQ,qBAA8B;AACpC,UAAM,aAAa,KAAK,cAAc;AAEtC,QAAI,eAAe,SAAS;AAC1B,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,KAAK,MAAM,YAAY,+BAA+B;AACxE,WAAO,CAAC,EAAE,KAAK,OAAO,kBAAkB;AAAA,EAC1C;AAAA,EAEQ,SAAS,KAAuB;AACtC,QAAI,OAAO,IAAI,eAAe,UAAU;AACtC,WAAK,eAAe,IAAI,UAAU;AAAA,IACpC;AACA,UAAM,SAAS,KAAK,mBAAmB,GAAG;AAC1C,QAAI,QAAQ;AACV,WAAK,eAAe,MAAM;AAAA,IAC5B;AAAA,EACF;AAAA,EAEQ,mBAAmB,KAA2C;AACpE,UAAM,OAAO,KAAK,qBAAqB,IAAI,KAAK;AAChD,QAAI,CAAC,KAAM,QAAO;AAElB,UAAM,cACJ,KAAK,MAAM,gCAAgC,KAC3C,KAAK,MAAM,0BAA0B;AACvC,QAAI,aAAa;AACf,YAAM,OAAO,YAAY,CAAC,KAAK,IAAI,KAAK;AACxC,YAAM,MAAM,KAAK,oBAAoB,GAAG;AACxC,YAAM,SAAuB;AAAA,QAC3B,MAAM;AAAA,QACN,GAAI,IAAI,eAAe,SAAY,EAAE,YAAY,IAAI,WAAW,IAAI,CAAC;AAAA,QACrE,GAAI,QAAQ,SAAY,EAAE,iBAAiB,IAAI,IAAI,CAAC;AAAA,QACpD,KAAK,EAAE,KAAK,KAAK;AAAA,MACnB;AACA,aAAO;AAAA,IACT;AAEA,UAAM,kBAAkB,KAAK,MAAM,gCAAgC;AACnE,QAAI,iBAAiB;AACnB,YAAM,OAAO,gBAAgB,CAAC,KAAK,IAAI,KAAK;AAC5C,YAAM,OAAO,KAAK,gBAAgB,GAAG;AACrC,YAAM,SAAuB;AAAA,QAC3B,MAAM;AAAA,QACN,GAAI,IAAI,eAAe,SAAY,EAAE,YAAY,IAAI,WAAW,IAAI,CAAC;AAAA,QACrE,GAAI,MAAM,aAAa,SACnB,EAAE,iBAAiB,KAAK,SAAS,IACjC,CAAC;AAAA,QACL,KAAK,EAAE,KAAK,KAAK;AAAA,MACnB;AACA,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,KAAK,MAAM,iBAAiB,KAAK,KAAK,MAAM,WAAW;AAC1E,QAAI,YAAY;AACd,YAAM,SAAuB;AAAA,QAC3B,MAAM;AAAA,QACN,GAAI,IAAI,eAAe,SAAY,EAAE,YAAY,IAAI,WAAW,IAAI,CAAC;AAAA,QACrE,KAAK,EAAE,KAAK,KAAK;AAAA,MACnB;AACA,aAAO;AAAA,IACT;AAEA,UAAM,iBAAiB,KAAK,MAAM,6BAA6B;AAC/D,QAAI,gBAAgB;AAClB,YAAM,QAAQ,KAAK,mBAAmB,eAAe,CAAC,KAAK,EAAE;AAC7D,YAAM,aACJ,gBAAgB,SAAS,MAAM,YAAY,MAAM;AACnD,YAAM,YACJ,eAAe,SAAS,MAAM,WAAW,MAAM;AACjD,YAAM,QAAQ,OAAO,MAAM,OAAO,KAAK,EAAE;AACzC,YAAM,WAAW,KAAK,SAAS,MAAM,UAAU,CAAC;AAChD,UAAI,cAAc,wBAAwB,KAAK,KAAK,GAAG;AACrD,cAAM,SAAuB;AAAA,UAC3B,MAAM;AAAA,UACN,GAAI,IAAI,eAAe,SACnB,EAAE,YAAY,IAAI,WAAW,IAC7B,CAAC;AAAA,UACL,GAAI,aAAa,SAAY,EAAE,iBAAiB,SAAS,IAAI,CAAC;AAAA,UAC9D,KAAK,EAAE,KAAK,MAAM,MAAM;AAAA,QAC1B;AACA,eAAO;AAAA,MACT;AACA,UAAI,WAAW;AACb,cAAM,SAAuB;AAAA,UAC3B,MAAM;AAAA,UACN,GAAI,IAAI,eAAe,SACnB,EAAE,YAAY,IAAI,WAAW,IAC7B,CAAC;AAAA,UACL,KAAK,EAAE,KAAK,MAAM,MAAM;AAAA,QAC1B;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,cAAc,KAAK,IAAI,GAAG;AAC5B,YAAM,SAAuB;AAAA,QAC3B,MAAM;AAAA,QACN,GAAI,IAAI,eAAe,SAAY,EAAE,YAAY,IAAI,WAAW,IAAI,CAAC;AAAA,QACrE,KAAK,EAAE,KAAK,KAAK;AAAA,MACnB;AACA,aAAO;AAAA,IACT;AACA,QAAI,aAAa,KAAK,IAAI,GAAG;AAC3B,YAAM,SAAuB;AAAA,QAC3B,MAAM;AAAA,QACN,GAAI,IAAI,eAAe,SAAY,EAAE,YAAY,IAAI,WAAW,IAAI,CAAC;AAAA,QACrE,KAAK,EAAE,KAAK,KAAK;AAAA,MACnB;AACA,aAAO;AAAA,IACT;AAEA,QAAI,IAAI,iBAAiB,YAAY;AACnC,YAAM,MAAM,KAAK,kBAAkB,IAAI,KAAK;AAC5C,UAAI,IAAK,QAAO;AAAA,IAClB;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAqB,OAAgD;AAC3E,QAAI;AACF,UAAI,OAAO,UAAU,SAAU,QAAO;AACtC,YAAM,UAAU,IAAI,YAAY,SAAS,EAAE,OAAO,MAAM,CAAC;AACzD,YAAM,OAAO,QAAQ,OAAO,KAAK;AACjC,UAAI,QAAQ,cAAc,KAAK,IAAI,EAAG,QAAO;AAC7C,UAAI,MAAM;AACV,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ;AAChC,eAAO,OAAO,aAAa,MAAM,CAAC,CAAE;AACtC,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,eAAe,QAA4B;AACjD,QAAI,KAAK,OAAO,eAAe;AAC7B,cAAQ,IAAI,oDAAoD;AAAA,QAC9D,MAAM,OAAO;AAAA,QACb,YAAY,OAAO;AAAA,QACnB,iBAAiB,OAAO;AAAA,QACxB,aAAa,KAAK,MAAM;AAAA,QACxB,KAAK,OAAO;AAAA,MACd,CAAC;AAAA,IACH;AAEA,QAAI,OAAO,SAAS,SAAS;AAC3B,WAAK,YAAY;AACjB,YAAM,aACJ,OAAO,mBAAmB,OACtB,OAAO,kBAAkB,MACzB;AACN,WAAK,4BAA4B;AACjC,WAAK,iCAAiC,KAAK,IAAI;AAE/C,YAAM,mBAAmB,KAAK,sBAAsB,MAAM;AAC1D,YAAM,iBAAiB,KAAK,OAAO,wBAAwB;AAE3D,UAAI,KAAK,OAAO,eAAe;AAC7B,gBAAQ,IAAI,8CAA8C;AAAA,UACxD;AAAA,UACA;AAAA,UACA,QAAQ,OAAO,OAAO,eAAe;AAAA,QACvC,CAAC;AAAA,MACH;AAEA,UAAI,oBAAoB,gBAAgB;AACtC,YAAI,KAAK,OAAO,eAAe;AAC7B,kBAAQ;AAAA,YACN;AAAA,UACF;AAAA,QACF;AACA,aAAK,kBAAkB;AACvB,aAAK,cAAc,MAAM;AAAA,MAC3B,WAAW,OAAO,OAAO,eAAe,UAAU;AAChD,cAAM,MAAM,KAAK,OAAO,oBAAoB;AAC5C,cAAM,QAAQ,KAAK,MAAM,cAAc;AACvC,cAAM,kBAAkB,QAAQ,KAAK;AACrC,cAAM,UAAU,KAAK,MAAM,OAAO,aAAa,MAAO,eAAe;AAErE,YAAI,KAAK,OAAO,eAAe;AAC7B,kBAAQ,IAAI,yDAAyD;AAAA,YACnE;AAAA,YACA;AAAA,YACA,aAAa,OAAO,aAAa;AAAA,YACjC;AAAA,YACA,WAAW;AAAA,UACb,CAAC;AAAA,QACH;AAEA,YAAI,UAAU,KAAK;AACjB,cAAI,KAAK,OAAO,eAAe;AAC7B,oBAAQ;AAAA,cACN,kDAAkD,OAAO;AAAA,YAC3D;AAAA,UACF;AACA,eAAK,kBAAkB,OAAO;AAAA,QAChC,OAAO;AACL,cAAI,KAAK,OAAO,eAAe;AAC7B,oBAAQ;AAAA,cACN;AAAA,YACF;AAAA,UACF;AACA,eAAK,kBAAkB;AACvB,eAAK,cAAc,MAAM;AAAA,QAC3B;AAAA,MACF,OAAO;AACL,YAAI,KAAK,OAAO,eAAe;AAC7B,kBAAQ;AAAA,YACN;AAAA,UACF;AAAA,QACF;AACA,aAAK,kBAAkB;AACvB,aAAK,cAAc,MAAM;AAAA,MAC3B;AACA,UAAI,KAAK,6BAA6B,MAAM;AAC1C,aAAK,wBAAwB,KAAK,yBAAyB;AAAA,MAC7D;AACA;AAAA,IACF;AACA,QAAI,OAAO,SAAS,cAAc,KAAK,WAAW;AAChD,UAAI,OAAO,mBAAmB,MAAM;AAClC,aAAK,4BAA4B,OAAO,kBAAkB;AAAA,MAC5D;AACA,UACE,KAAK,6BAA6B,QAClC,KAAK,kCAAkC,MACvC;AACA,cAAM,YAAY,KAAK,IAAI,IAAI,KAAK;AACpC,cAAM,cAAc,KAAK;AAAA,UACvB;AAAA,UACA,KAAK,4BAA4B;AAAA,QACnC;AACA,aAAK,wBAAwB,WAAW;AAAA,MAC1C;AACA,UAAI,CAAC,KAAK,IAAI,YAAY,GAAG;AAC3B,cAAM,YAAY,KAAK;AAAA,UACrB,KAAK,MAAM,cAAc;AAAA,QAC3B;AACA,cAAM,OACJ,KAAK,uBAAuB,SAAS,MACpC,KAAK,gBAAgB,CAAC,KAAK,aAAa,IAAI;AAC/C,YAAI,QAAQ,KAAK,SAAS,GAAG;AAC3B,gBAAM,QAAQ,KAAK,CAAC;AACpB,gBAAM,OAAO,KAAK,MAAM,CAAC;AACzB,eAAK,aAAa;AAClB,eAAK,aAAa,KAAK,EAAE,MAAM,MAAM;AAAA,UAAC,CAAC;AAAA,QACzC;AAAA,MACF;AACA;AAAA,IACF;AACA,QAAI,OAAO,SAAS,OAAO;AACzB,WAAK,YAAY;AACjB,WAAK,4BAA4B;AACjC,WAAK,iCAAiC;AACtC,WAAK,kBAAkB;AACvB,WAAK,iBAAiB;AACtB,UAAI,KAAK,IAAI,YAAY,GAAG;AAC1B,aAAK,IAAI,KAAK,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MAChC;AACA;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,oBAAoB,OAAmC;AAC7D,UAAM,MAAM,WAAW,MAAM,KAAK,CAAC;AACnC,QAAI,CAAC,OAAO,MAAM,GAAG,EAAG,QAAO;AAC/B,UAAM,QACJ,MAAM,MAAM,sCAAsC,KAClD,MAAM,MAAM,2BAA2B;AACzC,QAAI,SAAS,MAAM,CAAC,KAAK,MAAM;AAC7B,YAAM,OAAO,MAAM,CAAC;AACpB,YAAM,IAAI,WAAW,IAAI;AACzB,aAAO,OAAO,MAAM,CAAC,IAAI,SAAY;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,gBACN,OACqD;AACrD,UAAM,eAAe,MAAM,MAAM,0BAA0B;AAC3D,UAAM,gBAAgB,MAAM,MAAM,2BAA2B;AAC7D,UAAM,MAA+C,CAAC;AACtD,QAAI,gBAAgB,aAAa,CAAC,KAAK,MAAM;AAC3C,YAAM,IAAI,WAAW,aAAa,CAAC,CAAC;AACpC,UAAI,CAAC,OAAO,MAAM,CAAC,EAAG,KAAI,UAAU;AAAA,IACtC;AACA,QAAI,iBAAiB,cAAc,CAAC,KAAK,MAAM;AAC7C,YAAM,IAAI,WAAW,cAAc,CAAC,CAAC;AACrC,UAAI,CAAC,OAAO,MAAM,CAAC,EAAG,KAAI,WAAW;AAAA,IACvC;AACA,QAAI,aAAa,OAAO,cAAc,IAAK,QAAO;AAClD,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,OAAuC;AAChE,UAAM,QAAgC,CAAC;AACvC,UAAM,QAAQ;AACd,QAAI;AACJ,YAAQ,QAAQ,MAAM,KAAK,KAAK,OAAO,MAAM;AAC3C,YAAM,MAAe,MAAM,CAAC,KAAK;AACjC,UAAI,SAAkB,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK;AAC9C,UAAI,OAAO,WAAW,GAAG,KAAK,OAAO,SAAS,GAAG,GAAG;AAClD,iBAAS,OAAO,MAAM,GAAG,EAAE;AAAA,MAC7B;AACA,UAAI,KAAK;AACP,cAAM,GAAG,IAAI;AAAA,MACf;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS,KAAkC;AACjD,QAAI,OAAO,KAAM,QAAO;AACxB,UAAM,IAAI,OAAO,QAAQ,WAAW,WAAW,GAAG,IAAI,OAAO,GAAG;AAChE,WAAO,OAAO,MAAM,CAAC,IAAI,SAAY;AAAA,EACvC;AAAA,EAEQ,sBAAsB,QAA+B;AAC3D,UAAM,MAAM,OAAO;AACnB,QAAI,CAAC,IAAK,QAAO;AAEjB,QAAI,IAAI,KAAK;AACX,YAAM,MAAM,OAAO,IAAI,GAAG;AAC1B,aACE,IAAI,SAAS,eAAe,KAC5B,IAAI,SAAS,cAAc,KAC3B,IAAI,SAAS,iBAAiB;AAAA,IAElC;AAEA,QAAI,IAAI,IAAK,QAAO;AAEpB,QAAI,IAAI,oBAAqB,QAAO;AAEpC,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,MAA4C;AAAA,IACpE,MAAM,UAAU;AAAA,MAGd,YAA6B,KAAiB;AAAjB;AAF7B,aAAQ,UAAU;AAClB,aAAQ,SAAS;AAAA,MAC8B;AAAA,MAC/C,SAAS,SAAyB;AAChC,YAAI,SAAS;AACb,eAAO,UAAU,GAAG;AAClB,cAAI,KAAK,WAAW,KAAK,IAAI,OAAQ,QAAO;AAC5C,gBAAM,kBAAkB,IAAI,KAAK;AACjC,gBAAM,SAAS,KAAK,IAAI,SAAS,eAAe;AAChD,gBAAM,cAAc,KAAK,IAAI,KAAK,OAAO;AACzC,gBAAM,QAAQ,kBAAkB;AAChC,gBAAM,QAAS,KAAK,UAAU,IAAK;AACnC,gBAAM,OAAQ,eAAe,QAAS;AACtC,mBAAU,UAAU,SAAU;AAC9B,eAAK,UAAU;AACf,cAAI,KAAK,UAAU,GAAG;AACpB,iBAAK,SAAS;AACd,iBAAK,WAAW;AAAA,UAClB;AACA,qBAAW;AAAA,QACb;AACA,eAAO,WAAW;AAAA,MACpB;AAAA,MACA,SAAS,GAAiB;AACxB,aAAK,SAAS,CAAC;AAAA,MACjB;AAAA,IACF;AAEA,UAAM,IAAI,IAAI,UAAU,IAAI;AAC5B,UAAM,UAAU,EAAE,SAAS,CAAC;AAC5B,QAAI,YAAY,IAAM,QAAO;AAC7B,MAAE,SAAS,CAAC;AACZ,MAAE,SAAS,CAAC;AACZ,MAAE,SAAS,CAAC;AACZ,UAAM,gBAAgB,EAAE,SAAS,EAAE;AACnC,MAAE,SAAS,CAAC;AACZ,MAAE,SAAS,CAAC;AACZ,MAAE,SAAS,CAAC;AACZ,UAAM,aAAa,EAAE,SAAS,CAAC;AAC/B,UAAM,YAAY,EAAE,SAAS,EAAE;AAC/B,SAAK;AACL,SAAK;AACL,MAAE,SAAS,CAAC;AACZ,MAAE,SAAS,EAAE;AACb,UAAM,sBAAsB,EAAE,SAAS,EAAE;AACzC,UAAM,oBAAoB,EAAE,SAAS,CAAC;AACtC,QAAI,sBAAsB,GAAG;AAC3B,aAAO;AAAA,IACT;AACA,MAAE,SAAS,EAAE;AACb,UAAM,SAAS,EAAE,SAAS,CAAC,MAAM;AACjC,MAAE,SAAS,CAAC;AACZ,QAAI,OAAQ,QAAO;AACnB,UAAM,eAAe,EAAE,SAAS,CAAC,MAAM;AACvC,UAAM,oBAAoB,EAAE,SAAS,CAAC,MAAM;AAC5C,UAAM,eAAe,EAAE,SAAS,CAAC,MAAM;AACvC,UAAM,sBAAsB,EAAE,SAAS,CAAC,MAAM;AAC9C,MAAE,SAAS,CAAC;AACZ,QAAI,qBAAqB,CAAC,qBAAqB;AAC7C,YAAM,oBAAoB,EAAE,SAAS,CAAC,MAAM;AAC5C,UAAI,mBAAmB;AACrB,UAAE,SAAS,CAAC;AACZ,UAAE,SAAS,EAAE;AAAA,MACf,OAAO;AACL,UAAE,SAAS,CAAC;AAAA,MACd;AAAA,IACF,WAAW,CAAC,mBAAmB;AAC7B,YAAM,iBAAiB,EAAE,SAAS,CAAC;AACnC,eAAS,IAAI,GAAG,IAAI,gBAAgB,KAAK;AACvC,UAAE,SAAS,CAAC;AACZ,YAAI,CAAC,qBAAqB;AACxB,gBAAM,oBAAoB,EAAE,SAAS,CAAC,MAAM;AAC5C,cAAI,mBAAmB;AACrB,cAAE,SAAS,CAAC;AACZ,cAAE,SAAS,EAAE;AAAA,UACf,OAAO;AACL,cAAE,SAAS,CAAC;AAAA,UACd;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,kBAAsC;AAC1C,QAAI,cAAc;AAChB,QAAE,SAAS,CAAC;AACZ,QAAE,SAAS,CAAC;AACZ,YAAM,OAAO,EAAE,SAAS,CAAC;AACzB,YAAM,MAAM,EAAE,SAAS,EAAE;AACzB,YAAM,gBAAgB,OAAO,aAAc;AAC3C,wBAAkB,gBAAgB;AAAA,IACpC;AACA,MAAE,SAAS,EAAE;AACb,MAAE,SAAS,CAAC;AACZ,MAAE,SAAS,CAAC;AAEZ,QAAI,cAAc;AAChB,YAAM,SAAuB;AAAA,QAC3B,MAAM;AAAA,QACN,GAAI,oBAAoB,SAAY,EAAE,gBAAgB,IAAI,CAAC;AAAA,QAC3D,KAAK,EAAE,qBAAqB,EAAE;AAAA,MAChC;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,qBAA2B;AACjC,wBAAoB,KAAK,OAAO,UAAU,EAAE,MAAM,CAAC,UAAU;AAC3D,UAAI,KAAK,OAAO,eAAe;AAC7B,gBAAQ;AAAA,UACN;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,oBAAoB,OAAO,YAAY,MAAM;AAChD,WAAK,sBAAsB;AAAA,IAC7B,GAAG,GAAI;AAAA,EACT;AAAA,EAEQ,wBAA8B;AACpC,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,CAAC,KAAK,qBAAqB,MAAM,KAAK,oBAAoB,KAAO;AACnE,WAAK,oBAAoB;AACzB,oBAAc,KAAK,OAAO,UAAU,EAAE,MAAM,CAAC,UAAU;AACrD,YAAI,KAAK,OAAO,eAAe;AAC7B,kBAAQ;AAAA,YACN;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,uBAAsC;AAClD,UAAM,SAAS;AAEf,QAAI,KAAK,OAAO,eAAe;AAC7B,cAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAkC,CAAC;AACzC,QAAI,KAAK,OAAO,YAAY;AAC1B,cAAQ,eAAe,IAAI,UAAU,KAAK,OAAO,UAAU;AAAA,IAC7D;AAEA,UAAM,WAAW,MAAM,MAAM,QAAQ,EAAE,QAAQ,CAAC;AAChD,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,qCAAqC,SAAS,MAAM,EAAE;AAAA,IACxE;AAEA,UAAM,OAA8B,MAAM,SAAS,KAAK;AAExD,UAAM,aAAa,KAAK,UAAU,MAAM,mBAAmB,GAAG;AAC9D,QAAI,YAAY;AACd,WAAK,gBAAgB,mBAAmB,UAAU;AAClD,UAAI,KAAK,OAAO,eAAe;AAC7B,gBAAQ;AAAA,UACN;AAAA,UACA,KAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,SAAK,aAAa,KAAK,UAAU,SAAS;AAE1C,QAAI,KAAK,OAAO,eAAe;AAC7B,cAAQ,IAAI,oDAAoD;AAAA,QAC9D,YAAY,KAAK;AAAA,QACjB,YAAY,KAAK;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,oBAA4B;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,qBAA6B;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAuB;AACrB,WAAO,KAAK,aAAa,KAAK,IAAI,YAAY;AAAA,EAChD;AAAA,EAEA,eAAwB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,gBAAiC;AAC/B,UAAM,MAAM,KAAK,OAAO,IAAI,YAAY;AACxC,QACE,IAAI,SAAS,OAAO,KACpB,IAAI,SAAS,OAAO,KACpB,IAAI,SAAS,+BAA+B,GAC5C;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,2BAAoC;AAClC,UAAM,aAAa,KAAK,cAAc;AACtC,QAAI,eAAe,SAAS;AAC1B,aAAO,EAAE,KAAK,OAAO,sBAAsB;AAAA,IAC7C;AACA,WAAO,CAAC,EACN,KAAK,OAAO,kBAAkB,EAAE,KAAK,OAAO,sBAAsB;AAAA,EAEtE;AAAA,EAEQ,oCAA6C;AACnD,QAAI,KAAK,OAAO,gBAAgB;AAC9B,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,KAAK,cAAc;AACtB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,cAAc,SAAsC;AAChE,UAAM,YAAY,KAAK;AAAA,MACrB,KAAK,MAAM,cAAc;AAAA,IAC3B;AACA,UAAM,OAAO,KAAK,uBAAuB,SAAS;AAElD,QAAI;AACJ,QAAI,YAAY;AAEhB,QAAI,KAAK,eAAe;AACtB,mBAAa,KAAK;AAElB,UAAI,KAAK,YAAY;AACnB,cAAM,QACJ,KAAK,OAAO,IAAI,SAAS,OAAO,KAAK,KAAK,OAAO,IAAI,SAAS,KAAK;AACrE,YAAI,SAAS,KAAK,WAAW,WAAW,YAAY;AAClD,sBAAY,KAAK,WAAW,UAAU;AAAA,QACxC,WAAW,CAAC,SAAS,KAAK,WAAW,WAAW,YAAY;AAC1D,sBAAY,KAAK,WAAW,UAAU;AAAA,QACxC;AAAA,MACF;AAEA,WAAK,aAAa,IAAI,MAAM,YAAY,CAAC,EAAE,KAAK,UAAU;AAC1D,WAAK,iBAAiB;AACtB,WAAK,kBAAkB;AAEvB,UAAI,KAAK,OAAO,eAAe;AAC7B,gBAAQ;AAAA,UACN,mDAAmD,SAAS;AAAA,UAC5D;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,QAAQ,KAAK,SAAS,GAAG;AAClC,mBAAa,KAAK,CAAC;AACnB,YAAM,OAAO,KAAK,MAAM,CAAC;AACzB,WAAK,aAAa;AAClB,WAAK,iBAAiB;AACtB,WAAK,kBAAkB,KAAK;AAE5B,UAAI,KAAK,OAAO,eAAe;AAC7B,gBAAQ;AAAA,UACN;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,UAAI,KAAK,OAAO,eAAe;AAC7B,gBAAQ,IAAI,sDAAsD;AAAA,MACpE;AACA;AAAA,IACF;AAEA,QAAI,YAAY;AACd,WAAK,UAAU;AACf,WAAK;AACL,YAAM,KAAK,aAAa,UAAU;AAAA,IACpC;AACA,QACE,KAAK,6BAA6B,QAClC,WAAW,cAAc,MACzB;AACA,WAAK,4BAA4B,UAAU;AAC3C,WAAK,iCACH,KAAK,kCAAkC,KAAK,IAAI;AAClD,WAAK,wBAAwB,KAAK,yBAAyB;AAAA,IAC7D;AAAA,EACF;AAAA,EAEQ,uBAAuB,OAAoC;AACjE,UAAM,WAAsB,CAAC;AAC7B,QAAI;AACJ,eAAW,KAAK,UAAU;AACxB,YAAM,MAAM,KAAK,OAAO,oBAAoB;AAC5C,UACE,EAAE,eAAe,QAAQ,QACxB,aAAa,QAAQ,EAAE,eAAe,UAAU,eAAe,KAChE;AACA,oBAAY;AAAA,MACd;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,gBAA8B;AACjD,QAAI,KAAK,IAAI,YAAY,EAAG;AAC5B,UAAM,QAAQ,iBAAiB;AAC/B,UAAM,cAAc,KAAK,iBAAiB,KAAK;AAC/C,QAAI,aAAa;AACf,WAAK,gBAAgB,aAAa,KAAK;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,MAAc,gBACZ,SACA,OACe;AACf,UAAM,aAAa,QAAQ,cAAc;AACzC,UAAM,QAAQ,QAAQ,cAAc;AACpC,QAAI,aAAa,KAAK,QAAQ,QAAQ,eAAe,QAAQ,OAAO;AAClE,YAAM,cAAc,QAAQ;AAC5B,YAAM,OACJ,KAAK,uBAAuB,OAAO,MAClC,KAAK,gBAAgB,CAAC,KAAK,aAAa,IAAI;AAC/C,UAAI,QAAQ,KAAK,SAAS,GAAG;AAC3B,cAAM,QAAQ,KAAK,CAAC;AACpB,cAAM,OAAO,KAAK,MAAM,CAAC;AACzB,aAAK,aAAa;AAClB,cAAM,KAAK,aAAa,KAAK;AAC7B,aAAK,YAAY;AACjB,aAAK,4BAA4B;AACjC,aAAK,iCAAiC,KAAK,IAAI;AAC/C,aAAK,wBAAwB,WAAW;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,wBAAwB,aAA2B;AACzD,SAAK,iBAAiB;AACtB,UAAM,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,WAAW,CAAC;AAC9C,QAAI,OAAO,GAAG;AACZ,WAAK,uBAAuB;AAC5B;AAAA,IACF;AACA,SAAK,gBAAgB,OAAO,WAAW,MAAM;AAC3C,WAAK,uBAAuB;AAAA,IAC9B,GAAG,EAAE;AAAA,EACP;AAAA,EAEQ,mBAAyB;AAC/B,QAAI,KAAK,iBAAiB,MAAM;AAC9B,mBAAa,KAAK,aAAa;AAC/B,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF;AAAA,EAEQ,yBAA+B;AACrC,QAAI,CAAC,KAAK,UAAW;AACrB,SAAK,YAAY;AACjB,SAAK,4BAA4B;AACjC,SAAK,iCAAiC;AACtC,SAAK,gBAAgB;AACrB,QAAI,KAAK,IAAI,YAAY,GAAG;AAC1B,WAAK,IAAI,KAAK,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAChC;AAAA,EACF;AAAA,EAEQ,kBAAkB,SAAuB;AAC/C,SAAK,kBAAkB;AACvB,UAAM,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,CAAC;AAC1C,QAAI,OAAO,GAAG;AACZ,WAAK,cAAc,EAAE,MAAM,QAAQ,CAAiB,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AACpE;AAAA,IACF;AACA,SAAK,iBAAiB,OAAO,WAAW,MAAM;AAC5C,WAAK,cAAc,EAAE,MAAM,QAAQ,CAAiB,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACtE,GAAG,EAAE;AAAA,EACP;AAAA,EAEQ,oBAA0B;AAChC,QAAI,KAAK,kBAAkB,MAAM;AAC/B,mBAAa,KAAK,cAAc;AAChC,WAAK,iBAAiB;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,eAAe,kBAAgC;AACrD,UAAM,YAAY,KAAK,MAAM,cAAc,oBAAoB;AAC/D,QAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,KAAK,IAAI,QAAQ,IAAI,IAAO;AAC9D,UAAM,QAAQ;AACd,SAAK,gBAAgB,KAAK,iBAAiB,IAAI,SAAS,WAAW;AAAA,EACrE;AAAA,EAEA,MAAc,aAAa,YAAmC;AAC5D,QAAI,KAAK,OAAO,eAAe;AAC7B,cAAQ,IAAI,kDAAkD,UAAU;AAAA,IAC1E;AAEA,SAAK,qBAAqB;AAE1B,QAAI;AACF,YAAM,KAAK,IAAI,WAAW,UAAU;AACpC,YAAM,KAAK,IAAI,KAAK;AAEpB,UAAI,KAAK,OAAO,eAAe;AAC7B,gBAAQ,IAAI,0DAA0D;AAAA,MACxE;AAAA,IACF,SAAS,OAAO;AACd,UAAI,KAAK,OAAO,eAAe;AAC7B,gBAAQ,MAAM,+CAA+C,KAAK;AAAA,MACpE;AAEA,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF;AAAA,EAEQ,kBAAwB;AAC9B,QAAI,KAAK,OAAO,eAAe;AAC7B,cAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAEA,SAAK,YAAY;AACjB,SAAK,4BAA4B;AACjC,SAAK,iCAAiC;AACtC,SAAK,kBAAkB;AACvB,SAAK,iBAAiB;AACtB,SAAK,qBAAqB;AAC1B,SAAK,aAAa,CAAC;AACnB,SAAK,UAAU;AACf,SAAK,iBAAiB;AACtB,SAAK,kBAAkB;AAEvB,QAAI,KAAK,MAAM,QAAQ;AACrB,WAAK,MAAM,KAAK,GAAG,MAAM,MAAM;AAC7B,YAAI,KAAK,OAAO,eAAe;AAC7B,kBAAQ;AAAA,YACN;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,uBAA6B;AACnC,SAAK,qBAAqB;AAE1B,UAAM,aAAa,KAAK,OAAO,uBAAuB;AAEtD,QAAI,KAAK,OAAO,eAAe;AAC7B,cAAQ;AAAA,QACN,oDAAoD,UAAU;AAAA,MAChE;AAAA,IACF;AAEA,SAAK,oBAAoB,OAAO,WAAW,MAAM;AAC/C,UAAI,KAAK,MAAM,QAAQ;AACrB,YAAI,KAAK,OAAO,eAAe;AAC7B,kBAAQ;AAAA,YACN;AAAA,UACF;AAAA,QACF;AACA,aAAK,gBAAgB;AAAA,MACvB;AAAA,IACF,GAAG,UAAU;AAAA,EACf;AAAA,EAEQ,uBAA6B;AACnC,QAAI,KAAK,qBAAqB,MAAM;AAClC,mBAAa,KAAK,iBAAiB;AACnC,WAAK,oBAAoB;AAAA,IAC3B;AAAA,EACF;AAAA,EAEQ,uBAAuB,GAAmC;AAChE,QAAI,CAAC,KAAK,CAAC,EAAE,WAAY,QAAO;AAChC,QAAI,EAAE,WAAW,SAAS,GAAG,GAAG;AAC9B,aAAO,EAAE,WACN,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,IAC/B;AACA,WAAO,CAAC,EAAE,UAAU;AAAA,EACtB;AAAA,EAEQ,mBAA2B;AACjC,QACE,KAAK,6BAA6B,QAClC,KAAK,kCAAkC;AAEvC,aAAO;AACT,UAAM,UAAU,KAAK,IAAI,IAAI,KAAK;AAClC,WAAO,KAAK,IAAI,GAAG,KAAK,4BAA4B,OAAO;AAAA,EAC7D;AAAA,EAEQ,iBAAiB,OAAoC;AAC3D,UAAM,WAAsB,CAAC;AAC7B,eAAW,KAAK,UAAU;AACxB,YAAM,OAAO,EAAE,eAAe,MAAM,EAAE,cAAc;AACpD,UACE,UAAU,EAAE,eAAe,OAC1B,EAAE,aAAa,QAAQ,MAAM,OAC9B;AACA,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,aAAmB;AACjB,QAAI,KAAK,IAAI,YAAY,GAAG;AAC1B,YAAM,yBAAyB,KAAK,QAAQ;AAC5C,YAAM,gBAAgB,CAAC;AAEvB,WAAK,IAAI,yBAAyB,aAAa;AAC/C,WAAK,IAAI,YAAY,gBAAgB,IAAI,CAAC;AAE1C,UAAI,KAAK,OAAO,eAAe;AAC7B,gBAAQ;AAAA,UACN;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK,MAAM,QAAQ,CAAC,KAAK,MAAM;AAC/B,UAAI,KAAK,OAAO,eAAe;AAC7B,gBAAQ,IAAI,kCAAkC,KAAK,MAAM,KAAK;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,mBAAkC;AAChC,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAI,CAAC,SAAS,mBAAmB;AAC/B,cAAM,YAAY,KAAK,MAAM;AAC7B,YAAI,CAAC,WAAW;AACd,iBAAO,IAAI,MAAM,0CAA0C,CAAC;AAC5D;AAAA,QACF;AACA,kBACG,kBAAkB,EAClB,KAAK,MAAM;AACV,cAAI,KAAK,OAAO,eAAe;AAC7B,oBAAQ,IAAI,4CAA4C;AAAA,UAC1D;AACA,kBAAQ;AAAA,QACV,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,cAAI,KAAK,OAAO,eAAe;AAC7B,oBAAQ,MAAM,6CAA6C,GAAG;AAAA,UAChE;AACA,iBAAO,GAAG;AAAA,QACZ,CAAC;AAAA,MACL,OAAO;AACL,iBACG,eAAe,EACf,KAAK,MAAM;AACV,cAAI,KAAK,OAAO,eAAe;AAC7B,oBAAQ,IAAI,2CAA2C;AAAA,UACzD;AACA,kBAAQ;AAAA,QACV,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,cAAI,KAAK,OAAO,eAAe;AAC7B,oBAAQ;AAAA,cACN;AAAA,cACA;AAAA,YACF;AAAA,UACF;AACA,iBAAO,GAAG;AAAA,QACZ,CAAC;AAAA,MACL;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,UAAmB;AACjB,QAAI,KAAK,IAAI,YAAY,GAAG;AAC1B,YAAM,WAAW,KAAK,IAAI,YAAY;AACtC,aAAO,aAAa;AAAA,IACtB;AACA,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,eAAwB;AACtB,WAAO,CAAC,CAAC,SAAS;AAAA,EACpB;AAAA,EAEA,SAAkB;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,eAAiC;AACnC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,SAAe;AACb,QAAI,KAAK,OAAO,eAAe;AAC7B,cAAQ,IAAI,yCAAyC;AAAA,IACvD;AAEA,QAAI,KAAK,OAAO,KAAK,IAAI,YAAY,GAAG;AACtC,YAAM,QAAQ,KAAK,MAAM,eAAe;AACxC,YAAM,SAAS,KAAK,MAAM,gBAAgB;AAE1C,UAAI,KAAK,OAAO,eAAe;AAC7B,gBAAQ;AAAA,UACN,mDAAmD,KAAK,IAAI,MAAM;AAAA,QACpE;AAAA,MACF;AAEA,WAAK,IAAI,OAAO,OAAO,MAAM;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,UAAgB;AACd,SAAK,kBAAkB;AACvB,SAAK,iBAAiB;AACtB,SAAK,qBAAqB;AAC1B,QAAI,KAAK,mBAAmB;AAC1B,oBAAc,KAAK,iBAAiB;AACpC,WAAK,oBAAoB;AAAA,IAC3B;AACA,SAAK,KAAK,QAAQ;AAClB,SAAK,KAAK,QAAQ;AAAA,EACpB;AACF;","names":["Hls"]}
@@ -46,7 +46,6 @@ declare class StormcloudVideoPlayer {
46
46
  getStreamType(): "hls" | "other";
47
47
  shouldShowNativeControls(): boolean;
48
48
  private shouldContinueLiveStreamDuringAds;
49
- loadDefaultVastFromAdstorm(adstormApiUrl: string, params?: Record<string, string>): Promise<void>;
50
49
  private handleAdStart;
51
50
  private findCurrentOrNextBreak;
52
51
  private onTimeUpdate;