@hopeplayer/core 1.0.16 → 1.0.17

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.
Files changed (110) hide show
  1. package/README.md +24 -14
  2. package/dist/HopePlayerElement.d.ts +1 -0
  3. package/dist/HopePlayerElement.d.ts.map +1 -1
  4. package/dist/chunks/{index-CWLyz1fp.js → adTriggers-4SueRFgK.js} +2 -2
  5. package/dist/chunks/adTriggers-4SueRFgK.js.map +1 -0
  6. package/dist/chunks/{index-DITXYcHx.js → ads-DPL7m9PV.js} +130 -125
  7. package/dist/chunks/ads-DPL7m9PV.js.map +1 -0
  8. package/dist/chunks/{index-BeJNpAyx.js → audio-LkYgd5Wq.js} +7 -7
  9. package/dist/chunks/audio-LkYgd5Wq.js.map +1 -0
  10. package/dist/chunks/{ScratchSound-0XKHUcJK.js → audioScratchSound-7XkwCCDm.js} +1 -1
  11. package/dist/chunks/audioScratchSound-7XkwCCDm.js.map +1 -0
  12. package/dist/chunks/{index-Miba3PD_.js → cast-DCAT2agI.js} +2 -2
  13. package/dist/chunks/cast-DCAT2agI.js.map +1 -0
  14. package/dist/chunks/{index-rENB3n9O.js → countdownScreen-CI-u6jjA.js} +1 -1
  15. package/dist/chunks/countdownScreen-CI-u6jjA.js.map +1 -0
  16. package/dist/chunks/{index-Q8FMOHj0.js → dai-B9Tth1Iv.js} +1 -1
  17. package/dist/chunks/dai-B9Tth1Iv.js.map +1 -0
  18. package/dist/chunks/{index-DCXX1ZJG.js → debugPanel-Bnc_7GOn.js} +1 -1
  19. package/dist/chunks/debugPanel-Bnc_7GOn.js.map +1 -0
  20. package/dist/chunks/{index-DXWK4EFa.js → dubbing-kNMPpyHl.js} +1 -1
  21. package/dist/chunks/dubbing-kNMPpyHl.js.map +1 -0
  22. package/dist/chunks/{index-BBmuCtKu.js → geoChecker-BRtvHwI-.js} +1 -1
  23. package/dist/chunks/geoChecker-BRtvHwI-.js.map +1 -0
  24. package/dist/chunks/{index-Ca8hocby.js → gesture-BzPCgi87.js} +1 -1
  25. package/dist/chunks/gesture-BzPCgi87.js.map +1 -0
  26. package/dist/chunks/{loadGpt-CmiAy366.js → gpt-CGXHTG_H.js} +1 -1
  27. package/dist/chunks/gpt-CGXHTG_H.js.map +1 -0
  28. package/dist/chunks/{index-3QALpwsf.js → inViewAutoplay-CRJe7GA4.js} +1 -1
  29. package/dist/chunks/inViewAutoplay-CRJe7GA4.js.map +1 -0
  30. package/dist/chunks/{index-7IBf8Y-R.js → liveWallClock-ChUTtzLD.js} +1 -1
  31. package/dist/chunks/liveWallClock-ChUTtzLD.js.map +1 -0
  32. package/dist/chunks/{index-f0vSgRIK.js → loopSection-CvF4l5uf.js} +1 -1
  33. package/dist/chunks/loopSection-CvF4l5uf.js.map +1 -0
  34. package/dist/chunks/{index-e00_M05B.js → markers-DE4O8xbw.js} +2 -2
  35. package/dist/chunks/markers-DE4O8xbw.js.map +1 -0
  36. package/dist/chunks/{index-CDPrkLq0.js → pauseAd-BQQe21X4.js} +2 -2
  37. package/dist/chunks/pauseAd-BQQe21X4.js.map +1 -0
  38. package/dist/chunks/{index-DEv3YqLg.js → player-C886oKP-.js} +884 -856
  39. package/dist/chunks/player-C886oKP-.js.map +1 -0
  40. package/dist/chunks/{index-D3Z7ZDLJ.js → playlist-CI3mRZjo.js} +2 -2
  41. package/dist/chunks/playlist-CI3mRZjo.js.map +1 -0
  42. package/dist/chunks/{VideoPrebid-CpckFzSq.js → prebid-CRY3i2OT.js} +1 -1
  43. package/dist/chunks/prebid-CRY3i2OT.js.map +1 -0
  44. package/dist/chunks/{index-DT8-oMPm.js → qrResume-BNy8XCp_.js} +1 -1
  45. package/dist/chunks/qrResume-BNy8XCp_.js.map +1 -0
  46. package/dist/chunks/redirectScreen-CJ3q9OX4.js +208 -0
  47. package/dist/chunks/redirectScreen-CJ3q9OX4.js.map +1 -0
  48. package/dist/chunks/{index-BbRYOSvk.js → rewardedUnlock-EyGMB9PK.js} +22 -19
  49. package/dist/chunks/rewardedUnlock-EyGMB9PK.js.map +1 -0
  50. package/dist/chunks/{index-CBX7bn-G.js → segments-C2HKU6XK.js} +2 -2
  51. package/dist/chunks/segments-C2HKU6XK.js.map +1 -0
  52. package/dist/chunks/{index-Ch3ep-eJ.js → sponsorship-DyFwGmEb.js} +1 -1
  53. package/dist/chunks/sponsorship-DyFwGmEb.js.map +1 -0
  54. package/dist/chunks/{index-BXSND_xN.js → spriteThumbnails-D0NQ5CCp.js} +2 -2
  55. package/dist/chunks/spriteThumbnails-D0NQ5CCp.js.map +1 -0
  56. package/dist/chunks/{index-DGtpFgHV.js → statsPanel-DSClIwA3.js} +1 -1
  57. package/dist/chunks/statsPanel-DSClIwA3.js.map +1 -0
  58. package/dist/chunks/{index-CDDke5rz.js → sticky-D_eLCNFk.js} +1 -1
  59. package/dist/chunks/sticky-D_eLCNFk.js.map +1 -0
  60. package/dist/chunks/{index-C3BQGcT3.js → story-D5Got6-6.js} +2 -2
  61. package/dist/chunks/{index-C3BQGcT3.js.map → story-D5Got6-6.js.map} +1 -1
  62. package/dist/chunks/{index-C5oGMHF_.js → tapGestures-DrC42DiI.js} +1 -1
  63. package/dist/chunks/tapGestures-DrC42DiI.js.map +1 -0
  64. package/dist/hope-player.js +1 -1
  65. package/dist/i18n/locales/en.d.ts.map +1 -1
  66. package/dist/i18n/locales/tr.d.ts.map +1 -1
  67. package/dist/i18n/types.d.ts +3 -0
  68. package/dist/i18n/types.d.ts.map +1 -1
  69. package/dist/index.d.ts +1 -1
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/plugins/ads/AdsController.d.ts.map +1 -1
  72. package/dist/plugins/ads/generateVastUrl.d.ts +10 -0
  73. package/dist/plugins/ads/generateVastUrl.d.ts.map +1 -1
  74. package/dist/plugins/redirect-screen/RedirectScreen.d.ts +26 -3
  75. package/dist/plugins/redirect-screen/RedirectScreen.d.ts.map +1 -1
  76. package/dist/plugins/rewarded/RewardedUnlock.d.ts +0 -5
  77. package/dist/plugins/rewarded/RewardedUnlock.d.ts.map +1 -1
  78. package/dist/types/index.d.ts +47 -1
  79. package/dist/types/index.d.ts.map +1 -1
  80. package/package.json +3 -1
  81. package/dist/chunks/ScratchSound-0XKHUcJK.js.map +0 -1
  82. package/dist/chunks/VideoPrebid-CpckFzSq.js.map +0 -1
  83. package/dist/chunks/index-3QALpwsf.js.map +0 -1
  84. package/dist/chunks/index-7IBf8Y-R.js.map +0 -1
  85. package/dist/chunks/index-BBmuCtKu.js.map +0 -1
  86. package/dist/chunks/index-BXSND_xN.js.map +0 -1
  87. package/dist/chunks/index-BbRYOSvk.js.map +0 -1
  88. package/dist/chunks/index-BeJNpAyx.js.map +0 -1
  89. package/dist/chunks/index-C5oGMHF_.js.map +0 -1
  90. package/dist/chunks/index-CBX7bn-G.js.map +0 -1
  91. package/dist/chunks/index-CDDke5rz.js.map +0 -1
  92. package/dist/chunks/index-CDPrkLq0.js.map +0 -1
  93. package/dist/chunks/index-CWLyz1fp.js.map +0 -1
  94. package/dist/chunks/index-Ca8hocby.js.map +0 -1
  95. package/dist/chunks/index-Ch3ep-eJ.js.map +0 -1
  96. package/dist/chunks/index-D3Z7ZDLJ.js.map +0 -1
  97. package/dist/chunks/index-D6r-BGAV.js +0 -77
  98. package/dist/chunks/index-D6r-BGAV.js.map +0 -1
  99. package/dist/chunks/index-DCXX1ZJG.js.map +0 -1
  100. package/dist/chunks/index-DEv3YqLg.js.map +0 -1
  101. package/dist/chunks/index-DGtpFgHV.js.map +0 -1
  102. package/dist/chunks/index-DITXYcHx.js.map +0 -1
  103. package/dist/chunks/index-DT8-oMPm.js.map +0 -1
  104. package/dist/chunks/index-DXWK4EFa.js.map +0 -1
  105. package/dist/chunks/index-Miba3PD_.js.map +0 -1
  106. package/dist/chunks/index-Q8FMOHj0.js.map +0 -1
  107. package/dist/chunks/index-e00_M05B.js.map +0 -1
  108. package/dist/chunks/index-f0vSgRIK.js.map +0 -1
  109. package/dist/chunks/index-rENB3n9O.js.map +0 -1
  110. package/dist/chunks/loadGpt-CmiAy366.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-DGtpFgHV.js","sources":["../../src/plugins/stats/StatsPanel.ts","../../src/plugins/stats/index.ts"],"sourcesContent":["import type { HopeLocaleStrings } from '../../i18n/types';\nimport type { PlaybackEngineInfo } from '../../hls/SourceManager';\n\n/** hls.js instance'ından okunan alanlar — tam tipi içe aktarmamak için. */\ninterface HlsStatsSource {\n currentLevel: number;\n autoLevelEnabled: boolean;\n levels: { height: number; width: number; bitrate: number; videoCodec?: string; audioCodec?: string; details?: { live: boolean } }[];\n bandwidthEstimate: number;\n latency: number;\n config: { maxBufferLength: number };\n}\n\nexport interface StatsPlayerContext {\n videoEl: HTMLVideoElement;\n containerEl: HTMLElement;\n i18n: HopeLocaleStrings;\n version: string;\n getEngine(): PlaybackEngineInfo;\n getHls(): HlsStatsSource | null;\n}\n\nconst REFRESH_MS = 500;\n\n/** Sağ tık menüsündeki \"İstatistikler\" — player üstünde canlı teknik bilgi paneli (YouTube'daki \"Stats for nerds\" gibi). */\nexport class StatsPanel {\n private readonly el: HTMLDivElement;\n private readonly titleEl: HTMLSpanElement;\n private readonly closeBtn: HTMLButtonElement;\n private readonly body: HTMLDListElement;\n private timer: ReturnType<typeof setInterval> | null = null;\n\n constructor(private readonly ctx: StatsPlayerContext) {\n this.el = document.createElement('div');\n this.el.className = 'hp-stats';\n this.el.setAttribute('part', 'stats-panel');\n this.el.setAttribute('role', 'dialog');\n\n const header = document.createElement('div');\n header.className = 'hp-stats-header';\n this.titleEl = document.createElement('span');\n this.closeBtn = document.createElement('button');\n this.closeBtn.type = 'button';\n this.closeBtn.className = 'hp-stats-close';\n this.closeBtn.innerHTML =\n '<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6L6 18\"/></svg>';\n this.closeBtn.addEventListener('click', () => this.hide());\n header.append(this.titleEl, this.closeBtn);\n\n this.body = document.createElement('dl');\n this.body.className = 'hp-stats-body';\n this.el.append(header, this.body);\n // Panel tıklamaları videoyu oynat/duraklat yapmasın.\n this.el.addEventListener('pointerdown', (e) => e.stopPropagation());\n this.el.addEventListener('click', (e) => e.stopPropagation());\n this.refreshLabels();\n }\n\n get isVisible(): boolean {\n return this.el.isConnected;\n }\n\n show(): void {\n if (!this.isVisible) this.ctx.containerEl.appendChild(this.el);\n this.render();\n if (!this.timer) this.timer = setInterval(() => this.render(), REFRESH_MS);\n }\n\n hide(): void {\n if (this.timer) clearInterval(this.timer);\n this.timer = null;\n this.el.remove();\n }\n\n toggle(force?: boolean): void {\n if (force ?? !this.isVisible) this.show();\n else this.hide();\n }\n\n refreshLabels(): void {\n this.titleEl.textContent = this.ctx.i18n.statsTitle;\n this.closeBtn.setAttribute('aria-label', this.ctx.i18n.statsClose);\n if (this.isVisible) this.render();\n }\n\n destroy(): void {\n this.hide();\n }\n\n private render(): void {\n const { videoEl: v, i18n: t } = this.ctx;\n const hls = this.ctx.getHls();\n const engine = this.ctx.getEngine();\n const level = hls && hls.currentLevel >= 0 ? hls.levels[hls.currentLevel] : undefined;\n const quality = v.getVideoPlaybackQuality?.();\n const rect = v.getBoundingClientRect();\n const dpr = window.devicePixelRatio || 1;\n\n let ahead = 0;\n for (let i = 0; i < v.buffered.length; i++) {\n if (v.buffered.start(i) <= v.currentTime + 0.5 && v.buffered.end(i) > v.currentTime) ahead = v.buffered.end(i) - v.currentTime;\n }\n\n const rows: [string, string][] = [\n [t.statsEngine, engine.engine + (engine.reason ? ` (${engine.reason})` : '')],\n [t.statsResolution, `${v.videoWidth}×${v.videoHeight} / ${Math.round(rect.width * dpr)}×${Math.round(rect.height * dpr)}`],\n [t.statsQuality, level ? `${level.height}p · ${Math.round(level.bitrate / 1000)} kbps${hls!.autoLevelEnabled ? ' · auto' : ''}` : '—'],\n [t.statsCodecs, level ? [level.videoCodec, level.audioCodec].filter(Boolean).join(', ') || '—' : '—'],\n [t.statsBandwidth, hls ? `${(hls.bandwidthEstimate / 1e6).toFixed(2)} Mbps` : '—'],\n [t.statsBuffer, `${ahead.toFixed(1)} s`],\n [t.statsDropped, quality ? `${quality.droppedVideoFrames} / ${quality.totalVideoFrames}` : '—'],\n // hls.js `latency`'yi VOD'da da hesaplıyor (süre - konum) — yalnızca canlı yayında anlamlı.\n [t.statsLatency, level?.details?.live && Number.isFinite(hls!.latency) ? `${hls!.latency.toFixed(1)} s` : '—'],\n [t.statsSpeedVolume, `${v.playbackRate}× · ${v.muted ? 0 : Math.round(v.volume * 100)}%`],\n [t.statsSource, v.currentSrc && !v.currentSrc.startsWith('blob:') ? v.currentSrc : v.currentSrc ? 'MediaSource (hls.js)' : '—'],\n [t.statsVersion, `HopeCorePlayer ${this.ctx.version}`],\n ];\n this.body.replaceChildren(\n ...rows.flatMap(([k, val]) => {\n const dt = document.createElement('dt');\n dt.textContent = k;\n const dd = document.createElement('dd');\n dd.textContent = val;\n dd.title = val;\n return [dt, dd];\n })\n );\n }\n}\n","import { StatsPanel, type StatsPlayerContext } from './StatsPanel';\n\nexport function installStats(ctx: StatsPlayerContext): StatsPanel {\n return new StatsPanel(ctx);\n}\n\nexport { StatsPanel };\nexport type { StatsPlayerContext };\n"],"names":["StatsPanel","ctx","__publicField","header","e","force","_a","_b","v","t","hls","engine","level","quality","rect","dpr","ahead","i","rows","k","val","dt","dd","installStats"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-DITXYcHx.js","sources":["../../src/plugins/ads/AdSurfaceGuard.ts","../../src/plugins/ads/loadImaSdk.ts","../../src/plugins/ads/RetryController.ts","../../src/plugins/ads/consent.ts","../../src/plugins/ads/scte35.ts","../../src/plugins/ads/AdsController.ts","../../src/plugins/ads/index.ts"],"sourcesContent":["/**\n * Reklamın görünmeyeceği yüzeyler: iPhone'un yerleşik (native) video tam ekranı ve Picture-in-Picture.\n * Bu ikisinde yalnızca içerik <video>'su görünür; IMA reklamı sayfadaki kendi video elementinde oynatır —\n * reklam görünmez, tıklanamaz, gösterim \"görülmedi\" sayılır. Lineer reklam arası başlarken yüzeyden çıkılır,\n * reklam bitince bir dokunuşla geri dönmek için buton gösterilir (iOS tam ekrana kullanıcı dokunmadan girmeye izin vermez).\n */\n\ntype SurfaceKind = 'fullscreen' | 'pip';\n\ntype WebkitVideo = HTMLVideoElement & {\n webkitDisplayingFullscreen?: boolean;\n webkitExitFullscreen?: () => void;\n webkitPresentationMode?: string;\n webkitSetPresentationMode?: (mode: string) => void;\n webkitSupportsPresentationMode?: (mode: string) => boolean;\n};\n\nexport interface AdSurfaceGuardContext {\n videoEl: HTMLVideoElement;\n /** \"Tam ekrana dön\" butonunun ekleneceği alan (video alanı). */\n containerEl: HTMLElement;\n /** Player'ın tam ekran isteği (iPhone'da <video>'nun native tam ekranına düşer). */\n enterFullscreen(): void;\n labels(): { adReturnFullscreen: string; adReturnPip: string };\n}\n\n/** Geri dön butonunun ekranda kalma süresi. */\nconst RETURN_BUTTON_MS = 8000;\n\nexport class AdSurfaceGuard {\n /** Reklam yüzünden çıkılan yüzey — reklam bitince geri dönüş butonu için. */\n private exited: SurfaceKind | null = null;\n private button: HTMLButtonElement | null = null;\n private hideTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(private readonly ctx: AdSurfaceGuardContext) {}\n\n private get video(): WebkitVideo {\n return this.ctx.videoEl as WebkitVideo;\n }\n\n /** Şu an reklamın görünmeyeceği bir yüzeyde miyiz? */\n current(): SurfaceKind | null {\n const v = this.video;\n if (v.webkitDisplayingFullscreen) return 'fullscreen';\n if (document.pictureInPictureElement === v || v.webkitPresentationMode === 'picture-in-picture') return 'pip';\n return null;\n }\n\n /** Lineer reklam arası başlıyor: görünmeyen yüzeyden çık (içerik zaten duraklatıldı). */\n onBreakStart(): void {\n this.hideButton();\n const kind = this.current();\n if (!kind) return;\n this.exited = kind;\n const v = this.video;\n try {\n if (kind === 'fullscreen') v.webkitExitFullscreen?.();\n else if (document.pictureInPictureElement === v) void document.exitPictureInPicture().catch(() => {});\n else v.webkitSetPresentationMode?.('inline');\n } catch {\n /* yüzey kendiliğinden kapanmış olabilir */\n }\n }\n\n /** Lineer reklam arası bitti. Postroll'dan sonra içerik bitmiştir — geri dönüş önerilmez. */\n onBreakEnd(contentContinues: boolean): void {\n const kind = this.exited;\n this.exited = null;\n if (kind && contentContinues) this.showButton(kind);\n }\n\n private showButton(kind: SurfaceKind): void {\n this.hideButton();\n const labels = this.ctx.labels();\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'hp-ad-return';\n btn.setAttribute('part', 'ad-return');\n btn.textContent = kind === 'fullscreen' ? labels.adReturnFullscreen : labels.adReturnPip;\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.hideButton();\n // Kullanıcı dokunuşu içinde — iOS bu yüzden izin verir.\n if (kind === 'fullscreen') this.ctx.enterFullscreen();\n else this.enterPip();\n });\n // Video alanının tıklama/dokunma işleyicilerine (oynat/duraklat) düşmesin.\n btn.addEventListener('pointerdown', (e) => e.stopPropagation());\n this.ctx.containerEl.appendChild(btn);\n this.button = btn;\n this.hideTimer = setTimeout(() => this.hideButton(), RETURN_BUTTON_MS);\n }\n\n private enterPip(): void {\n const v = this.video;\n if (v.requestPictureInPicture && document.pictureInPictureEnabled) {\n void v.requestPictureInPicture().catch(() => {});\n } else if (v.webkitSupportsPresentationMode?.('picture-in-picture')) {\n v.webkitSetPresentationMode?.('picture-in-picture');\n }\n }\n\n hideButton(): void {\n if (this.hideTimer) clearTimeout(this.hideTimer);\n this.hideTimer = null;\n this.button?.remove();\n this.button = null;\n }\n\n destroy(): void {\n this.hideButton();\n this.exited = null;\n }\n}\n","const IMA_SDK_URL = 'https://imasdk.googleapis.com/js/sdkloader/ima3.js';\n\ndeclare global {\n interface Window {\n google?: { ima?: typeof google.ima };\n }\n}\n\nlet loadPromise: Promise<typeof google.ima> | null = null;\n\n/** Google IMA SDK'yı bir kez <script> ile yükler. */\nexport function loadImaSdk(): Promise<typeof google.ima> {\n if (window.google?.ima) return Promise.resolve(window.google.ima);\n if (loadPromise) return loadPromise;\n\n loadPromise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = IMA_SDK_URL;\n script.async = true;\n script.onload = () => {\n if (window.google?.ima) resolve(window.google.ima);\n else reject(new Error('IMA SDK yüklendi ama window.google.ima yok'));\n };\n script.onerror = () => reject(new Error('IMA SDK yüklenemedi (reklam engelleyici olabilir)'));\n document.head.appendChild(script);\n });\n\n return loadPromise;\n}\n","import type { AdsRetryOptions, RetryDelayEntry } from '../../types';\n\nexport type AdBreakType = 'Preroll' | 'Midroll' | 'Postroll';\n\ninterface ChainState {\n tags: string[];\n index: number;\n attemptsOnCurrent: number;\n}\n\n/** Reklam retry zamanlaması ve fallback zinciri kararları (network'ten bağımsız). */\nexport class RetryController {\n private adRetryCount = 0;\n private chain: Partial<Record<AdBreakType, ChainState>> = {};\n private retryTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(private readonly config: AdsRetryOptions) {}\n\n get isPending(): boolean {\n return this.retryTimer !== null;\n }\n\n reset(): void {\n this.adRetryCount = 0;\n this.chain = {};\n this.cancelPending();\n }\n\n cancelPending(): void {\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n this.retryTimer = null;\n }\n }\n\n /** Devre dışı/kapsam dışı/limit dolduysa onGiveUp; aksi halde (jitter'lı) gecikmeden sonra onRetry. */\n retry(type: AdBreakType, rawTag: string | string[] | undefined, onRetry: (tag: string, attempt: number) => void, onGiveUp: (reason: 'retry-disabled' | 'retry-limit') => void): void {\n if (!this.config.enabled) {\n onGiveUp('retry-disabled');\n return;\n }\n\n const scope = this.config.retryScope ?? 'preroll';\n if (scope === 'preroll' && type !== 'Preroll') {\n onGiveUp('retry-disabled');\n return;\n }\n\n const maxRetry = this.resolveMaxRetry();\n if (this.adRetryCount >= maxRetry) {\n this.reset();\n onGiveUp('retry-limit');\n return;\n }\n\n this.cancelPending();\n this.adRetryCount++;\n\n const chain = this.getChainState(type, rawTag);\n chain.attemptsOnCurrent++;\n const maxAttemptsPerTag = this.config.maxAttemptsPerTag ?? Infinity;\n if (chain.attemptsOnCurrent > maxAttemptsPerTag && chain.index < chain.tags.length - 1) {\n chain.index++;\n chain.attemptsOnCurrent = 1;\n }\n const tag = chain.tags[chain.index]!;\n const attempt = this.adRetryCount;\n\n this.retryTimer = setTimeout(() => {\n this.retryTimer = null;\n onRetry(tag, attempt);\n }, this.applyJitter(this.resolveRetryDelay()));\n }\n\n private getChainState(type: AdBreakType, rawTag: string | string[] | undefined): ChainState {\n const existing = this.chain[type];\n if (existing) return existing;\n\n const tags = (Array.isArray(rawTag) ? rawTag : [rawTag]).filter((t): t is string => !!t);\n const state: ChainState = { tags: tags.length ? tags : [rawTag as string], index: 0, attemptsOnCurrent: 0 };\n this.chain[type] = state;\n return state;\n }\n\n private resolveRetryDelay(): number {\n const pattern = this.config.retryDelayPattern;\n if (!Array.isArray(pattern) || pattern.length === 0) return this.config.retryDelay ?? 800;\n\n for (const entry of pattern) {\n const [upTo, delay] = this.normalizeEntry(entry);\n if (this.adRetryCount <= upTo) return delay;\n }\n return this.normalizeEntry(pattern[pattern.length - 1]!)[1];\n }\n\n private resolveMaxRetry(): number {\n const pattern = this.config.retryDelayPattern;\n if (Array.isArray(pattern) && pattern.length > 0) {\n return this.normalizeEntry(pattern[pattern.length - 1]!)[0];\n }\n return this.config.maxRetry ?? 10;\n }\n\n private normalizeEntry(entry: RetryDelayEntry): [number, number] {\n return Array.isArray(entry) ? entry : [entry.upTo, entry.delay];\n }\n\n private applyJitter(delay: number): number {\n const jitter = this.config.jitter ?? 0;\n if (!jitter) return delay;\n const factor = 1 + (Math.random() * 2 - 1) * jitter;\n return Math.max(0, Math.round(delay * factor));\n }\n}\n","import type { AdsOptions } from '../../types';\n\n/**\n * Generic TCF/USP consent — options.consentAware === true gerektirir. Non-blocking; yetersiz onay/opt-out'ta\n * google.ima.settings.setPrivacySettings({ nonPersonalizedAds: true }) zorlar.\n */\n\ninterface TcfData {\n gdprApplies?: boolean;\n vendor?: { consents?: Record<number, boolean> };\n purpose?: { consents?: Record<number, boolean> };\n}\n\ndeclare global {\n interface Window {\n __uspapi?: (command: string, version: number, callback: (data: { uspString?: string } | undefined, success: boolean) => void) => void;\n __tcfapi?: (command: string, version: number, callback: (data: TcfData | undefined, success: boolean) => void) => void;\n }\n}\n\nfunction restrictAdsForConsent(ima: typeof google.ima | null, reason: string): void {\n try {\n if (ima?.settings?.setPrivacySettings) {\n ima.settings.setPrivacySettings({ nonPersonalizedAds: true });\n console.warn(`[HopePlayer consent] non-personalized ads zorlandı (${reason})`);\n }\n } catch (err) {\n console.warn('[HopePlayer consent] setPrivacySettings hatası:', err);\n }\n}\n\n/** options.consentAware değilse no-op. IMA TC/GPP string'ini zaten ekliyor; bu ek bir \"Limited Ads\" zorlaması. */\nexport function initConsentAware(options: AdsOptions, ima: typeof google.ima | null): void {\n if (!options.consentAware) return;\n\n try {\n if (typeof window.__uspapi === 'function') {\n window.__uspapi('getUSPData', 1, (uspData, success) => {\n if (!success || !uspData?.uspString) return;\n if (uspData.uspString.charAt(2) === 'Y') restrictAdsForConsent(ima, 'USP/CCPA opt-out');\n });\n }\n } catch (err) {\n console.warn('[HopePlayer consent] __uspapi okuma hatası:', err);\n }\n\n try {\n if (typeof window.__tcfapi === 'function') {\n window.__tcfapi('getTCData', 2, (tcData, success) => {\n if (!success || !tcData || tcData.gdprApplies !== true) return;\n const googleVendorConsent = tcData.vendor?.consents?.[755];\n const purpose1Consent = tcData.purpose?.consents?.[1];\n if (googleVendorConsent === false || purpose1Consent === false) {\n restrictAdsForConsent(ima, 'TCF yetersiz onay');\n }\n });\n }\n } catch (err) {\n console.warn('[HopePlayer consent] __tcfapi okuma hatası:', err);\n }\n}\n","/** SCTE-35 sinyal ayrıştırma + canlı yayın reklam yöneticisi. */\n\nexport interface Scte35Signal {\n type: 'out' | 'in' | 'cancel';\n spliceEventId?: number;\n duration?: number | null;\n breakDuration?: { autoReturn: number; seconds: number } | null;\n programSplice?: boolean;\n class?: string | null;\n raw?: string;\n}\n\n/** Base64 encoded SCTE-35 binary verisini parse eder — yalnızca splice_insert (0x05) komutlarını destekler. */\nexport function parseScte35Base64(base64: string): Scte35Signal | null {\n try {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n\n if (bytes[0] !== 0xfc) return null; // table_id\n\n const spliceCommandType = bytes[13];\n if (spliceCommandType !== 0x05) return null; // yalnızca splice_insert\n\n const spliceEventId = ((bytes[14]! << 24) | (bytes[15]! << 16) | (bytes[16]! << 8) | bytes[17]!) >>> 0;\n\n const cancelIndicator = (bytes[18]! >> 7) & 0x01;\n if (cancelIndicator) return { type: 'cancel', spliceEventId };\n\n const outOfNetwork = (bytes[19]! >> 7) & 0x01;\n const programSplice = (bytes[19]! >> 6) & 0x01;\n const durationFlag = (bytes[19]! >> 5) & 0x01;\n\n let breakDuration: Scte35Signal['breakDuration'] = null;\n\n if (programSplice) {\n let offset = 20;\n const timeSpecified = (bytes[offset]! >> 7) & 0x01;\n offset += timeSpecified ? 5 : 1;\n\n if (durationFlag) {\n const autoReturn = (bytes[offset]! >> 7) & 0x01;\n const durationHigh = bytes[offset]! & 0x01;\n const duration =\n durationHigh * Math.pow(2, 32) +\n bytes[offset + 1]! * Math.pow(2, 24) +\n bytes[offset + 2]! * Math.pow(2, 16) +\n bytes[offset + 3]! * Math.pow(2, 8) +\n bytes[offset + 4]!;\n breakDuration = { autoReturn, seconds: duration / 90000 };\n }\n }\n\n return { type: outOfNetwork ? 'out' : 'in', spliceEventId, breakDuration, programSplice: !!programSplice };\n } catch {\n return null;\n }\n}\n\n/** HLS manifest/segment'teki EXT-X-CUE-OUT/IN, EXT-X-DATERANGE, EXT-OATCLS-SCTE35 tag'lerini parse eder. */\nexport function parseHlsScteTag(tagName: string, tagValue: string): Scte35Signal | null {\n if (tagName === 'EXT-X-CUE-OUT') {\n return { type: 'out', duration: parseFloat(tagValue) || null };\n }\n if (tagName === 'EXT-X-CUE-IN') {\n return { type: 'in' };\n }\n if (tagName === 'EXT-X-DATERANGE') {\n const scteOut = tagValue.match(/SCTE35-OUT=0x([0-9A-Fa-f]+)/);\n const scteIn = tagValue.match(/SCTE35-IN=0x([0-9A-Fa-f]+)/);\n const duration = tagValue.match(/PLANNED-DURATION=([\\d.]+)/);\n const classAttr = tagValue.match(/CLASS=\"([^\"]+)\"/);\n\n if (scteOut) {\n return { type: 'out', duration: duration ? parseFloat(duration[1]!) : null, class: classAttr ? classAttr[1]! : null, raw: scteOut[1]! };\n }\n if (scteIn) return { type: 'in', raw: scteIn[1]! };\n }\n if (tagName === 'EXT-OATCLS-SCTE35') {\n return parseScte35Base64(tagValue);\n }\n return null;\n}\n\nexport interface Scte35ManagerCallbacks {\n onAdBreakStart(duration: number | null): void;\n onAdBreakEnd(): void;\n}\n\n/** textTracks metadata cue'larından SCTE-35 sinyallerini dinler (hls.js ve Safari native HLS). */\nexport class Scte35LiveAdManager {\n private inAdBreak = false;\n private adBreakTimer: ReturnType<typeof setTimeout> | null = null;\n private readonly processedEventIds = new Set<number>();\n private readonly trackListeners = new Map<TextTrack, () => void>();\n\n constructor(\n private readonly videoEl: HTMLVideoElement,\n private readonly callbacks: Scte35ManagerCallbacks\n ) {\n this.attachExistingTracks();\n videoEl.textTracks.addEventListener('addtrack', this.onAddTrack);\n }\n\n destroy(): void {\n this.videoEl.textTracks.removeEventListener('addtrack', this.onAddTrack);\n for (const [track, listener] of this.trackListeners) {\n track.removeEventListener('cuechange', listener);\n }\n this.trackListeners.clear();\n if (this.adBreakTimer) clearTimeout(this.adBreakTimer);\n this.processedEventIds.clear();\n }\n\n private readonly onAddTrack = (e: TrackEvent): void => {\n if (e.track instanceof TextTrack) this.listenTrack(e.track);\n };\n\n private attachExistingTracks(): void {\n for (let i = 0; i < this.videoEl.textTracks.length; i++) {\n this.listenTrack(this.videoEl.textTracks[i]!);\n }\n }\n\n private listenTrack(track: TextTrack): void {\n if (track.kind !== 'metadata' || this.trackListeners.has(track)) return;\n track.mode = 'hidden'; // cue'lar işlensin diye aktif olmalı ama görünmesin.\n\n const listener = () => {\n const cues = track.activeCues;\n if (!cues) return;\n for (let i = 0; i < cues.length; i++) this.processCue(cues[i]!);\n };\n track.addEventListener('cuechange', listener);\n this.trackListeners.set(track, listener);\n }\n\n private processCue(cue: TextTrackCue): void {\n const anyCue = cue as unknown as { value?: { key?: string; data?: string; value?: string }; text?: string };\n let tagName: string | null = null;\n let tagValue = '';\n\n if (anyCue.value && typeof anyCue.value === 'object') {\n tagName = anyCue.value.key ?? null;\n tagValue = anyCue.value.data ?? anyCue.value.value ?? '';\n } else if (typeof anyCue.text === 'string') {\n const match = anyCue.text.match(/^(EXT[^:]+):?(.*)$/);\n if (match) {\n tagName = match[1]!;\n tagValue = match[2] ?? '';\n }\n }\n\n if (!tagName) return;\n const signal = parseHlsScteTag(tagName, tagValue);\n if (signal) this.handleSignal(signal);\n }\n\n private handleSignal(signal: Scte35Signal): void {\n if (signal.spliceEventId !== undefined) {\n if (this.processedEventIds.has(signal.spliceEventId)) return;\n this.processedEventIds.add(signal.spliceEventId);\n setTimeout(() => this.processedEventIds.delete(signal.spliceEventId!), 5 * 60 * 1000);\n }\n\n if (signal.type === 'cancel') {\n this.endAdBreak(true);\n return;\n }\n if (signal.type === 'out' && !this.inAdBreak) {\n this.startAdBreak(signal.breakDuration?.seconds ?? signal.duration ?? null);\n } else if (signal.type === 'in' && this.inAdBreak) {\n this.endAdBreak(false);\n }\n }\n\n private startAdBreak(duration: number | null): void {\n if (this.inAdBreak) return;\n this.inAdBreak = true;\n this.callbacks.onAdBreakStart(duration);\n\n if (duration && duration > 0) {\n this.adBreakTimer = setTimeout(() => {\n if (this.inAdBreak) this.endAdBreak(true);\n }, (duration + 5) * 1000);\n }\n }\n\n endAdBreak(_forced = false): void {\n if (!this.inAdBreak) return;\n this.inAdBreak = false;\n if (this.adBreakTimer) {\n clearTimeout(this.adBreakTimer);\n this.adBreakTimer = null;\n }\n this.callbacks.onAdBreakEnd();\n }\n}\n","import { AdSurfaceGuard, type AdSurfaceGuardContext } from './AdSurfaceGuard';\nimport { loadImaSdk } from './loadImaSdk';\nimport { generateVastUrl } from './generateVastUrl';\nimport { RetryController, type AdBreakType } from './RetryController';\nimport { initConsentAware } from './consent';\nimport { Scte35LiveAdManager } from './scte35';\nimport type { AdsOptions, PrebidBreakOptions } from '../../types';\nimport type { VideoPrebid } from '../prebid/VideoPrebid';\nimport type { PrerollGate } from './PrerollGate';\n\nexport interface AdsPlayerContext {\n videoEl: HTMLVideoElement;\n hostEl: HTMLElement;\n /** IMA'nın ad UI'ını (skip butonu/sayaç) çizdiği, video'nun üzerindeki katman. */\n adLayerEl: HTMLElement;\n hideChrome(): void;\n showChrome(): void;\n /** `options.locale` (ör. 'tr'/'en') — IMA SDK'nın KENDİ ad-UI'ının (skip butonu/sayaç/\"Reklam\" etiketi) dili de oynatıcının geri kalanıyla AYNI dili takip etsin diye `ima.settings.setLocale()`'a aktarılıyor. */\n locale: string;\n /** Reklamın oynat/duraklat durumu DIŞARIDAN (IMA'nın kendi UI'ı üzerinden) değişince toolbar'ı tazelemesi için — bkz. `adPaused` notu. */\n onAdPlayStateChange?(): void;\n /** Preroll sonuçlanana kadar içeriği bekleten kapı (elementte, plugin yüklenmeden önce kurulur) — bkz. PrerollGate. */\n prerollGate?: PrerollGate;\n /** Player'ın hata kaydına (hata ayıklama penceresi) — yeniden denenen hatalar dahil her reklam hatası. */\n log?(entry: { message: string; fatal?: boolean; details?: Record<string, string | number | boolean | undefined> }): void;\n /** Reklam geri sayımı + pod bilgisi (toolbar'daki \"Reklam 2/3 · 0:12\"); null → gizle. */\n onAdProgress?(info: { remaining: number; position: number; total: number } | null): void;\n /** İçerik art arda otomatik oynuyor mu (playlist / story autoplayNext) — sürekli oynatma bildirimi. */\n isContinuousPlayback?(): boolean;\n /** iPhone native tam ekranı / PiP'te reklam görünmez — reklam arasında bu yüzeylerden çıkılır (bkz. AdSurfaceGuard). */\n surface?: AdSurfaceGuardContext;\n /** Ses reklamında IMA'nın göstereceği görsel (options.audio.adPoster) — mutlak URL. Yoksa player'ın kendi sahnesi görünür. */\n audioPoster?: string;\n}\n\n/** Bir IMA hatasının ayrıntıları — hp:aderror olayı ve hata ayıklama kaydı için. */\ninterface AdErrorInfo {\n message: string;\n code?: number;\n vastCode?: number;\n errorType?: string;\n}\n\nconst AD_PROGRESS_INTERVAL_MS = 250;\n\n/** Hazırda bekleyen preroll bundan eskiyse oynatılırken yeniden istenir (teklif / VAST yanıtı bayatlamasın). */\nconst PREROLL_MAX_AGE_MS = 5 * 60 * 1000;\n/** 'visible': player ekranın bu kadar yakınına girince (bir ekran boyu) reklam istenir. */\nconst VISIBLE_ROOT_MARGIN = '100% 0px 100% 0px';\n\nfunction tagConfigFor(options: AdsOptions, type: AdBreakType): string | string[] | undefined {\n if (type === 'Preroll') return options.adTagPreroll;\n if (type === 'Midroll') return options.adTagMidroll;\n return options.adTagPostroll;\n}\n\n/** Google IMA SDK ile doğrudan konuşan reklam çekirdeği (preroll/midroll/postroll, VMAP, retry, Prebid, SCTE-35). */\nexport class AdsController {\n private ima: typeof google.ima | null = null;\n private adDisplayContainer: google.ima.AdDisplayContainer | null = null;\n private adsLoader: google.ima.AdsLoader | null = null;\n private adsManager: google.ima.AdsManager | null = null;\n\n private readonly retry: RetryController;\n private currentBreakType: AdBreakType = 'Preroll';\n private vmapRequested = false;\n private postrollPending = false;\n private postrollShown = false;\n private lastMidrollTime = 0;\n private displayContainerInitialized = false;\n /**\n * Reklam sırasında toolbar oynat/duraklat + ses buraya yönlenir (IMA reklamı ayrı bir video'da oynatır).\n * Durum hem bizim çağrılarımızdan hem IMA'nın kendi PAUSED/RESUMED event'lerinden senkron tutulur.\n */\n private adPaused = false;\n private adVolumeBeforeMute = 1;\n private readonly prebidIdSuffix: string;\n private readonly prebidInstances: Partial<Record<AdBreakType, VideoPrebid>> = {};\n private scte35Manager: Scte35LiveAdManager | null = null;\n private scte35BreakActive = false;\n private scte35BreakTimeout: ReturnType<typeof setTimeout> | null = null;\n /**\n * Preroll yüklendi ama içerik henüz oynatılmak istenmedi — init() + start() oynatma isteğine kadar bekler.\n * init() de ertelenir: VMAP'te IMA, start() beklemeden init() anında 0 noktasındaki preroll'u kendiliğinden\n * oynatıyor (autoPlayAdBreaks: false bile durdurmuyor); init edilmemiş bir AdsManager hiçbir şey oynatamaz.\n */\n private prerollStartPending = false;\n /** İlk preroll/VMAP isteği atıldı mı (requestWhen'e göre zamanlanır). */\n private initialRequestFired = false;\n /** İlk preroll/VMAP isteğinin zamanı — bayatlama kontrolü için. */\n private prerollRequestedAt = 0;\n /** requestWhen: 'visible' — player ekrana yaklaşınca isteği tetikler. */\n private visibilityObserver: IntersectionObserver | null = null;\n /** Bir lineer reklam arası başladı ve henüz bitmedi (CONTENT_PAUSE_REQUESTED → CONTENT_RESUME_REQUESTED). */\n private linearBreakActive = false;\n /** İçerik Chromecast'te oynuyor — reklamları TV (receiver) oynatır; yerel istek / VMAP takibi yok. */\n private remote = false;\n /** Ekranda bir overlay (non-linear) reklam var — reklam katmanı içerikle birlikte görünür. */\n private nonLinearActive = false;\n /** Son IMA hatası — vazgeçilince hp:aderror bununla gönderilir. */\n private lastAdError: AdErrorInfo | null = null;\n /** Reklam geri sayımı zamanlayıcısı (lineer reklam oynarken). */\n private progressTimer: ReturnType<typeof setInterval> | null = null;\n private podPosition = 1;\n private podTotal = 1;\n /** Son istek ham bir VMAP mı — VMAP'te aranın tipi isteğin tipinden değil, IMA'nın verdiği konumdan okunur. */\n private lastRequestIsVmap = false;\n /** Şu an oynayan / son oynayan reklam arasının tipi (hp:adstart / hp:adend ve sonrasındaki içerik kararı). */\n private activeBreak: 'preroll' | 'midroll' | 'postroll' = 'preroll';\n /** Preroll zaman aşımına uğradı — geç gelen cevap gösterilmez (içerik çoktan başladı). */\n private prerollAbandoned = false;\n private readonly surfaceGuard: AdSurfaceGuard | null;\n /** Player boyutu değişince (tam ekran, pencere, yön) IMA'ya bildirmek için — IMA boyutu kendisi izlemiyor. */\n private resizeObserver: ResizeObserver | null = null;\n private resizeFrame = 0;\n /** Açık overlay creative'inin yüksekliği — yeniden boyutlandırmada şerit yüksekliği için. */\n private nonLinearCreativeHeight = 0;\n\n constructor(\n private readonly ctx: AdsPlayerContext,\n readonly options: AdsOptions\n ) {\n this.retry = new RetryController(options.retry ?? {});\n this.prebidIdSuffix = ctx.hostEl.id || Math.random().toString(36).slice(2, 8);\n this.surfaceGuard = ctx.surface ? new AdSurfaceGuard(ctx.surface) : null;\n }\n\n async install(): Promise<void> {\n let ima: typeof google.ima;\n const gate = this.ctx.prerollGate;\n if (gate) {\n gate.onPlayIntent = this.onPrerollPlayIntent;\n gate.onTimeout = this.onPrerollTimeout;\n }\n try {\n ima = await loadImaSdk();\n } catch (err) {\n // Reklam engelleyici / ağ hatası — içerik reklamsız normal oynar (bekleyen oynatma isteği hemen başlar).\n gate?.release(true);\n this.ctx.log?.({ message: `IMA SDK failed to load: ${String(err)}`, details: { hint: 'ad blocker / network' } });\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:aderror', { detail: { message: String(err), errorType: 'sdkLoadError' } }));\n return;\n }\n this.ima = ima;\n\n try {\n ima.settings.setLocale(this.ctx.locale);\n } catch {\n /* eski SDK sürümünde olmayabilir — kritik değil */\n }\n\n // setNumRedirects kritik: SDK varsayılanı 4 wrapper — çok hoplu zincirlerde IMA reklamı hata vermeden bırakır.\n // Her ayar ayrı try/catch'te (eski SDK'da olmayabilir).\n try {\n ima.settings.setNumRedirects(this.options.numRedirects ?? 15);\n } catch {\n /* eski SDK sürümünde olmayabilir */\n }\n try {\n ima.settings.setDisableCustomPlaybackForIOS10Plus(true);\n } catch {\n /* eski SDK sürümünde olmayabilir */\n }\n try {\n if (ima.ImaSdkSettings?.VpaidMode) {\n ima.settings.setVpaidMode(ima.ImaSdkSettings.VpaidMode.INSECURE);\n }\n } catch {\n /* eski SDK sürümünde olmayabilir */\n }\n\n // consentAware (TCF/USP) — options.consentAware===true gerektirir, non-blocking.\n initConsentAware(this.options, this.ima);\n\n // Ses reklamı görseli — IMA bunu AdDisplayContainer oluşturulmadan ÖNCE istiyor.\n if (this.ctx.audioPoster) {\n try {\n ima.settings.setFeatureFlags?.({ audioPosterImageEnabled: true, audioPosterImageDefaultUrl: this.ctx.audioPoster });\n } catch {\n /* eski SDK sürümünde olmayabilir */\n }\n }\n this.adDisplayContainer = new ima.AdDisplayContainer(this.ctx.adLayerEl, this.ctx.videoEl);\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(this.scheduleResize);\n this.resizeObserver.observe(this.ctx.videoEl);\n }\n this.adsLoader = new ima.AdsLoader(this.adDisplayContainer);\n this.adsLoader.addEventListener(ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, this.onAdsManagerLoaded);\n this.adsLoader.addEventListener(ima.AdErrorEvent.Type.AD_ERROR, this.onAdsLoaderError);\n\n // iOS/Safari: AdDisplayContainer.initialize() kullanıcı jestiyle çağrılmalı.\n this.ctx.videoEl.addEventListener('play', this.initializeDisplayContainerOnce);\n\n // Plugin dinamik yüklendiği için autoplay video'yu bu dinleyici bağlanmadan başlatmış olabilir —\n // kaçırılan 'play'i telafi et, yoksa initialize() hiç çağrılmaz (AdError 400).\n const hasPageLevelUserActivation =\n typeof navigator !== 'undefined' &&\n 'userActivation' in navigator &&\n (navigator as unknown as { userActivation: { hasBeenActive: boolean } }).userActivation.hasBeenActive;\n // Preroll kapısı SDK yüklenirken gelen oynatma isteğini (autoplay dahil) tuttu — onu da say.\n if (!this.ctx.videoEl.paused || hasPageLevelUserActivation || gate?.hasPlayIntent) {\n this.initializeDisplayContainerOnce();\n }\n\n // Her zaman: VMAP postroll'u IMA'ya içeriğin bittiği (contentComplete) bildirilmeden oynamaz.\n this.ctx.videoEl.addEventListener('ended', this.onContentEnded);\n\n if (this.options.adTagMidroll && !this.options.adTagVmap && this.options.midrollIntervalSeconds) {\n this.ctx.videoEl.addEventListener('timeupdate', this.onTimeUpdateForMidroll);\n }\n\n this.requestInitialPrerollOrVmap();\n\n // Canlı + SCTE-35: normal preroll/midroll zamanlayıcısı yerine yayın\n // içindeki OUT/IN sinyalleri reklamı tetikler/bitirir — preroll YOK\n // (yayının \"başlangıcı\" olmadığı için auto-request edilmiyor).\n if (this.options.live?.scte35 && this.options.live.adTagLive) {\n this.scte35Manager = new Scte35LiveAdManager(this.ctx.videoEl, {\n onAdBreakStart: (duration) => this.onScte35AdBreakStart(duration),\n onAdBreakEnd: () => this.onScte35AdBreakEnd(),\n });\n }\n }\n\n /**\n * İlk preroll/VMAP isteğinin zamanı (requestWhen):\n * - 'visible' (varsayılan): player ekrana yaklaşınca — uzun bir makalenin sonundaki player için, oraya hiç inmeyen\n * ziyaretçi adına boşa istek atılmaz (raporlarda istek/gösterim oranı düşmez, teklifler bayatlamaz); kullanıcı\n * player'a ulaştığında reklam çoğunlukla hazırdır.\n * - 'load': hemen. - 'play': oynatma isteğinde (en geç; bekleme istek süresi kadar uzar).\n * Hangi moddan olursa olsun oynatma isteği geldiğinde istek hâlâ atılmadıysa hemen atılır.\n */\n private requestInitialPrerollOrVmap(): void {\n if (!this.options.adTagPreroll && !this.options.adTagVmap) return;\n const when = this.options.requestWhen ?? (this.options.requestOnPlay ? 'play' : 'visible');\n if (when === 'load' || !this.ctx.videoEl.paused) {\n this.fireInitialRequest();\n return;\n }\n if (when === 'visible' && typeof IntersectionObserver !== 'undefined') {\n this.visibilityObserver = new IntersectionObserver(\n (entries) => {\n if (entries.some((e) => e.isIntersecting)) this.fireInitialRequest();\n },\n { rootMargin: VISIBLE_ROOT_MARGIN }\n );\n this.visibilityObserver.observe(this.ctx.hostEl);\n return;\n }\n if (when === 'visible') {\n this.fireInitialRequest();\n return;\n }\n // 'play': kapı varsa oynatma isteği onPrerollPlayIntent'ten gelir (kapı 'play' olayını yutuyor).\n if (!this.ctx.prerollGate) this.ctx.videoEl.addEventListener('play', () => this.fireInitialRequest(), { once: true });\n }\n\n private fireInitialRequest(): void {\n this.visibilityObserver?.disconnect();\n this.visibilityObserver = null;\n if (this.initialRequestFired) return;\n this.initialRequestFired = true;\n this.prerollRequestedAt = Date.now();\n if (this.options.adTagPreroll) {\n this.requestAd('Preroll', this.options.adTagPreroll);\n } else if (this.options.adTagVmap) {\n // Ayrı bir preroll tag'i yok — VMAP tek başına (preroll dahil) kullanılıyor.\n this.vmapRequested = true;\n this.requestAd('Preroll', this.options.adTagVmap, 0, true);\n }\n }\n\n /** Playlist/story item değişiminde: önceki item'ın reklam durumunu sıfırla. */\n resetForNewItem(newPrerollTag?: string | string[]): void {\n this.retry.reset();\n this.vmapRequested = false;\n this.postrollShown = false;\n this.postrollPending = false;\n this.lastMidrollTime = 0;\n this.prerollAbandoned = false;\n this.prerollStartPending = false;\n if (newPrerollTag !== undefined) this.options.adTagPreroll = newPrerollTag;\n // Yeni öğe kullanıcı etkileşimiyle (playlist / story) geldiği için reklam hemen istenir.\n this.initialRequestFired = true;\n this.prerollRequestedAt = Date.now();\n\n if (this.options.adTagPreroll) {\n void this.requestAd('Preroll', this.options.adTagPreroll);\n } else if (this.options.adTagVmap) {\n this.vmapRequested = true;\n void this.requestAd('Preroll', this.options.adTagVmap, 0, true);\n }\n }\n\n destroy(): void {\n if (this.ctx.prerollGate) {\n this.ctx.prerollGate.onPlayIntent = null;\n this.ctx.prerollGate.onTimeout = null;\n this.ctx.prerollGate.release(false);\n }\n this.visibilityObserver?.disconnect();\n this.visibilityObserver = null;\n this.stopAdProgress();\n this.ctx.videoEl.removeEventListener('play', this.initializeDisplayContainerOnce);\n this.ctx.videoEl.removeEventListener('ended', this.onContentEnded);\n this.ctx.videoEl.removeEventListener('timeupdate', this.onTimeUpdateForMidroll);\n this.surfaceGuard?.destroy();\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n cancelAnimationFrame(this.resizeFrame);\n this.retry.cancelPending();\n this.adsManager?.destroy();\n this.adsLoader?.destroy();\n this.adDisplayContainer?.destroy();\n this.scte35Manager?.destroy();\n if (this.scte35BreakTimeout) clearTimeout(this.scte35BreakTimeout);\n }\n\n /** SCTE-35 OUT sinyali: IMA'ya reklam iste (normal midroll gibi) + IMA cevap vermezse N ms sonra vazgeç. */\n private onScte35AdBreakStart(_duration: number | null): void {\n this.scte35BreakActive = true;\n this.requestAd('Midroll', this.options.live!.adTagLive!);\n\n const timeoutMs = this.options.live?.breakTimeoutMs ?? 10000;\n if (this.scte35BreakTimeout) clearTimeout(this.scte35BreakTimeout);\n this.scte35BreakTimeout = setTimeout(() => {\n // Ad gerçekten başladıysa (onContentPauseRequested) bu timer zaten iptal edilmiş olur.\n this.endScte35Break();\n }, timeoutMs);\n }\n\n /** SCTE-35 IN sinyali: yayıncının sinyaline güvenilir — reklam hâlâ oynuyor olsa bile içeriğe dönülür. */\n private onScte35AdBreakEnd(): void {\n this.endScte35Break();\n }\n\n private endScte35Break(): void {\n if (!this.scte35BreakActive) return;\n this.scte35BreakActive = false;\n if (this.scte35BreakTimeout) {\n clearTimeout(this.scte35BreakTimeout);\n this.scte35BreakTimeout = null;\n }\n this.adsManager?.destroy();\n this.adsManager = null;\n this.hideAdLayer();\n if (this.ctx.videoEl.paused) this.ctx.videoEl.play().catch(() => {});\n }\n\n /**\n * initialize() yalnızca 'play'e değil, player'a ilk dokunuşa da bağlı: preroll kullanıcı oynatmadan\n * adsManager.start()'a ulaşabiliyor ve initialize() önce çağrılmazsa IMA AdError 400 veriyor.\n */\n readonly initializeDisplayContainerOnce = (): void => {\n if (this.displayContainerInitialized) return;\n this.displayContainerInitialized = true;\n this.adDisplayContainer?.initialize();\n };\n\n private readonly onTimeUpdateForMidroll = (): void => {\n const interval = this.options.midrollIntervalSeconds ?? 0;\n if (interval <= 0 || !this.options.adTagMidroll || this.remote) return;\n // iosFullscreen: 'defer' — tam ekran / PiP'ten çıkılana kadar beklet; çıkınca ilk timeupdate'te istenir.\n if (this.options.iosFullscreen === 'defer' && this.surfaceGuard?.current()) return;\n const currentTime = this.ctx.videoEl.currentTime;\n if (currentTime > 60 && currentTime - this.lastMidrollTime >= interval) {\n this.lastMidrollTime = currentTime;\n this.requestAd('Midroll', this.options.adTagMidroll);\n }\n };\n\n private readonly onContentEnded = (): void => {\n if (this.postrollShown || this.remote) return;\n // IMA'ya içerik bitti: VMAP'teki postroll (-1 noktası) bununla başlar; tek VAST postroll'u ayrıca istenir.\n if (this.options.adTagVmap) {\n this.postrollShown = true;\n this.adsLoader?.contentComplete();\n return;\n }\n if (!this.options.adTagPostroll) return;\n this.postrollPending = true;\n this.postrollShown = true;\n this.requestAd('Postroll', this.options.adTagPostroll);\n };\n\n /** Preroll: options.prebid, Midroll: options.prebid.midroll. Postroll'da prebid yok. */\n private getPrebidConfigFor(type: AdBreakType): PrebidBreakOptions | null {\n const prebid = this.options.prebid;\n if (!prebid) return null;\n if (type === 'Preroll') return prebid.enabled ? prebid : null;\n if (type === 'Midroll') return prebid.midroll?.enabled ? { ...prebid, ...prebid.midroll } : null;\n return null;\n }\n\n private async getOrCreatePrebidInstance(type: AdBreakType, config: PrebidBreakOptions): Promise<VideoPrebid> {\n const existing = this.prebidInstances[type];\n if (existing) return existing;\n\n const { VideoPrebid: VideoPrebidClass } = await import('../prebid/VideoPrebid');\n const defaultCode = type === 'Midroll' ? 'hope-video-midroll' : 'hope-video-preroll';\n const instance = new VideoPrebidClass({\n ...config,\n adUnitCode: `${config.adUnitCode || defaultCode}-${this.prebidIdSuffix}`,\n consentManagement: this.options.prebid?.consentManagement,\n });\n this.prebidInstances[type] = instance;\n return instance;\n }\n\n private async requestAd(type: AdBreakType, rawTag: string | string[], attempt = 0, skipUrlProcessing = false): Promise<void> {\n if (!this.adsLoader || !this.ima || this.remote) return;\n this.currentBreakType = type;\n this.lastRequestIsVmap = skipUrlProcessing;\n\n const tag = Array.isArray(rawTag) ? rawTag[0]! : rawTag;\n let vastUrl = skipUrlProcessing\n ? tag\n : generateVastUrl(tag, { includeRefreshCount: !!this.options.retry?.enabled, adRefreshCount: attempt });\n\n // Prebid yalnızca ham VAST tag'lerinde ve ilk denemede; retry'da auction tekrarlanmaz.\n if (!skipUrlProcessing && attempt === 0) {\n const prebidConfig = this.getPrebidConfigFor(type);\n if (prebidConfig) {\n const instance = await this.getOrCreatePrebidInstance(type, prebidConfig);\n if (instance.isAvailable()) {\n vastUrl = await instance.runAuction(vastUrl);\n }\n }\n }\n\n if (!this.adsLoader || !this.ima) return; // await sırasında destroy() olmuş olabilir\n\n const request = new this.ima.AdsRequest();\n request.adTagUrl = vastUrl;\n request.linearAdSlotWidth = this.ctx.videoEl.clientWidth || 640;\n request.linearAdSlotHeight = this.ctx.videoEl.clientHeight || 360;\n // Overlay (non-linear) reklam yuvası: tam genişlik, yüksekliğin üçte biri — verilmezse overlay creative seçilemiyor.\n request.nonLinearAdSlotWidth = this.ctx.videoEl.clientWidth || 640;\n request.nonLinearAdSlotHeight = Math.round((this.ctx.videoEl.clientHeight || 360) / 3);\n // Uzun wrapper zincirlerinde SDK'nın 5000ms varsayılanı yetmeyebilir.\n request.vastLoadTimeout = this.options.vastLoadTimeoutMs ?? 10000;\n // Reklam sunucusu otomatik / sessiz oynatmaya uygun creative'i seçsin (Google doğru dolum için bunu istiyor).\n try {\n request.setAdWillAutoPlay?.(this.ctx.videoEl.autoplay || !!this.ctx.prerollGate?.hasPlayIntent || !this.ctx.videoEl.paused);\n request.setAdWillPlayMuted?.(this.ctx.videoEl.muted);\n request.setContinuousPlayback?.(!!this.ctx.isContinuousPlayback?.());\n } catch {\n /* eski SDK sürümünde olmayabilir */\n }\n const omid = this.omidRules();\n if (omid) request.omidAccessModeRules = omid;\n\n try {\n this.adsLoader.requestAds(request);\n } catch (err) {\n this.giveUpOrRetry(type, String(err));\n }\n }\n\n /**\n * Open Measurement erişim kuralları: her ölçüm firması için mod (varsayılan 'full').\n * IMA'nın enum'ları yoksa (eski SDK) hiçbir şey ayarlanmaz — IMA kendi varsayılanını kullanır.\n */\n private omidRules(): Record<string, string> | null {\n const vendors = this.ima?.OmidVerificationVendor;\n const modes = this.ima?.OmidAccessMode;\n if (!vendors || !modes) return null;\n const cfg = this.options.omidAccessMode ?? 'full';\n const toMode = (m: string | undefined): string | undefined =>\n m === 'full' ? modes.FULL : m === 'domain' ? modes.DOMAIN : m === 'limited' ? modes.LIMITED : undefined;\n const perVendor: Record<string, string | undefined> = typeof cfg === 'string' ? {} : cfg;\n const fallback = toMode(typeof cfg === 'string' ? cfg : (cfg.default ?? 'full')) ?? modes.FULL;\n const rules: Record<string, string> = {};\n for (const [name, id] of Object.entries(vendors)) {\n if (typeof id === 'number') rules[id] = toMode(perVendor[name]) ?? fallback;\n }\n return rules;\n }\n\n private readonly onAdsManagerLoaded = (event: google.ima.AdsManagerLoadedEvent): void => {\n if (!this.ima) return;\n const isPreroll = this.currentBreakType === 'Preroll';\n // Zaman aşımından sonra gelen preroll gösterilmez — içerik çoktan başladı; araya girmesin.\n if (isPreroll && this.prerollAbandoned) {\n event.getAdsManager(this.ctx.videoEl).destroy();\n return;\n }\n this.adsManager = event.getAdsManager(this.ctx.videoEl, {\n restoreCustomPlaybackStateOnAdBreakComplete: true,\n // VAST çözüldükten sonra creative'in yüklenmesi için üst sınır.\n loadVideoTimeout: this.options.loadVideoTimeoutMs ?? 10000,\n enablePreloading: true,\n // false: IMA'nın KENDİ styled linear ad UI'ı (skip/sayaç\n // kutusu) yerine bizim ControlBar'ımız (ad mode) kullanılıyor —\n // ikisi üst üste binmesin diye.\n useStyledLinearAds: false,\n useStyledNonLinearAds: true,\n });\n\n const AdEvent = this.ima.AdEvent;\n this.adsManager.addEventListener(AdEvent.Type.CONTENT_PAUSE_REQUESTED, this.onContentPauseRequested);\n this.adsManager.addEventListener(AdEvent.Type.CONTENT_RESUME_REQUESTED, this.onContentResumeRequested);\n this.adsManager.addEventListener(AdEvent.Type.ALL_ADS_COMPLETED, this.onAllAdsCompleted);\n this.adsManager.addEventListener(AdEvent.Type.LOADED, this.onAdLoaded);\n this.adsManager.addEventListener(AdEvent.Type.STARTED, this.onAdStarted);\n this.adsManager.addEventListener(AdEvent.Type.COMPLETE, this.stopAdProgress);\n this.adsManager.addEventListener(AdEvent.Type.SKIPPED, this.stopAdProgress);\n if (AdEvent.Type.USER_CLOSE) this.adsManager.addEventListener(AdEvent.Type.USER_CLOSE, this.endNonLinear);\n this.adsManager.addEventListener(this.ima.AdErrorEvent.Type.AD_ERROR, this.onAdsManagerError);\n // IMA'nın KENDİ reklam UI'ı üzerinden (ör. reklam video'suna tıklama)\n // de duraklatılabilir/devam ettirilebilir — bizim toolbar'ımızın\n // ikonu bu durumda da senkron kalsın diye dinleniyor.\n this.adsManager.addEventListener(AdEvent.Type.PAUSED, this.onAdPaused);\n this.adsManager.addEventListener(AdEvent.Type.RESUMED, this.onAdResumed);\n\n const gate = this.ctx.prerollGate;\n if (isPreroll && gate?.isArmed) {\n // Yalnızca VMAP: 0 noktasında reklam yoksa preroll yok — içerik beklemesin, aralar normal zamanlanır.\n const cuePoints = this.adsManager.getCuePoints?.() ?? [];\n if (cuePoints.length > 0 && !cuePoints.includes(0)) {\n gate.release(true);\n this.startAdsManager();\n return;\n }\n if (!gate.hasPlayIntent) {\n // Reklam hazır; içerik oynatılmak istenince (onPrerollPlayIntent) anında başlar.\n this.prerollStartPending = true;\n return;\n }\n }\n this.startAdsManager();\n };\n\n private startAdsManager(): void {\n if (!this.adsManager || !this.ima) return;\n try {\n this.adsManager.init(this.ctx.videoEl.clientWidth || 640, this.ctx.videoEl.clientHeight || 360, this.viewMode());\n this.adsManager.start();\n } catch (err) {\n this.giveUpOrRetry(this.currentBreakType, String(err));\n }\n }\n\n /** Preroll kapısında ilk oynatma isteği: IMA'yı kullanıcı jestiyle hazırla, hazır bekleyen preroll'u başlat. */\n private readonly onPrerollPlayIntent = (): void => {\n this.initializeDisplayContainerOnce();\n // Henüz istenmedi ('play' modu ya da görünüme gelmeden programatik play()) — şimdi iste.\n if (!this.initialRequestFired) {\n this.fireInitialRequest();\n return;\n }\n if (!this.prerollStartPending) return;\n this.prerollStartPending = false;\n // Hazırdaki reklam çok eskiyse (teklif / VAST bayatlamış olabilir) at ve taze iste — kapı bekler.\n if (Date.now() - this.prerollRequestedAt > PREROLL_MAX_AGE_MS) {\n this.adsManager?.destroy();\n this.adsManager = null;\n this.initialRequestFired = false;\n this.vmapRequested = false;\n this.fireInitialRequest();\n return;\n }\n this.startAdsManager();\n };\n\n /** Preroll süresinde gelmedi: bekleyen istekleri bırak, içerik reklamsız başlasın (kapı kendisi açılır). */\n private readonly onPrerollTimeout = (): void => {\n this.prerollAbandoned = true;\n this.prerollStartPending = false;\n this.retry.cancelPending();\n if (this.currentBreakType === 'Preroll') {\n this.adsManager?.destroy();\n this.adsManager = null;\n }\n const timeoutMs = this.options.prerollTimeoutMs ?? 8000;\n this.ctx.log?.({ message: `Preroll did not arrive within ${timeoutMs} ms — content started without it`, details: { prerollTimeoutMs: timeoutMs } });\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:aderror', { detail: { message: 'preroll-timeout', breakType: 'preroll' } }));\n // VMAP split: preroll'dan vazgeçildi — VMAP (midroll/postroll) yine bir kez istenir.\n this.maybeRequestVmapAfterPreroll();\n };\n\n /** Toolbar'daki oynat/duraklat butonunun (reklam modunda) hedefi — content videoEl yerine bu çağrılır. */\n toggleAdPlayPause(): void {\n if (!this.adsManager) return;\n if (this.adPaused) this.adsManager.resume();\n else this.adsManager.pause();\n // Optimistic: IMA'nın PAUSED/RESUMED event'ini beklemeden ikon hemen\n // güncellensin — event zaten aynı değere ayarlayıp no-op olacak.\n this.adPaused = !this.adPaused;\n }\n\n isAdPaused(): boolean {\n return this.adPaused;\n }\n\n getAdVolume(): number {\n return this.adsManager?.getVolume() ?? 1;\n }\n\n setAdVolume(volume: number): void {\n this.adsManager?.setVolume(Math.min(1, Math.max(0, volume)));\n }\n\n isAdMuted(): boolean {\n return this.getAdVolume() === 0;\n }\n\n /** VolumePanel'deki `onToggleMute` ile AYNI desen: 0 ↔ son bilinen (ya da varsayılan 0.5) ses seviyesi arasında geçiş. */\n toggleAdMute(): void {\n if (!this.adsManager) return;\n const current = this.adsManager.getVolume();\n if (current > 0) {\n this.adVolumeBeforeMute = current;\n this.adsManager.setVolume(0);\n } else {\n this.adsManager.setVolume(this.adVolumeBeforeMute > 0 ? this.adVolumeBeforeMute : 0.5);\n }\n }\n\n private readonly onAdPaused = (): void => {\n this.adPaused = true;\n this.ctx.onAdPlayStateChange?.();\n };\n\n private readonly onAdResumed = (): void => {\n this.adPaused = false;\n this.ctx.onAdPlayStateChange?.();\n };\n\n private readonly onContentPauseRequested = (event?: google.ima.AdEvent): void => {\n this.linearBreakActive = true;\n this.activeBreak = this.breakTypeOf(event);\n // Preroll başladı — kapının işi bitti; içerik reklam bitince (CONTENT_RESUME_REQUESTED) başlar.\n if (this.activeBreak === 'preroll') this.ctx.prerollGate?.release(false);\n this.ctx.videoEl.pause();\n this.adPaused = false;\n this.ctx.hideChrome();\n this.ctx.adLayerEl.classList.remove('hp:hidden');\n this.ctx.adLayerEl.classList.add('hp:block');\n // Reklam gerçekten başladı — retry sayaçlarını sıfırla.\n this.retry.reset();\n // SCTE-35 ad gerçekten başladı — güvenlik timeout'una artık gerek yok.\n if (this.scte35BreakActive && this.scte35BreakTimeout) {\n clearTimeout(this.scte35BreakTimeout);\n this.scte35BreakTimeout = null;\n }\n // iPhone native tam ekranı / PiP'te reklam görünmez — önce çık.\n this.surfaceGuard?.onBreakStart();\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:adstart', { detail: { type: this.activeBreak } }));\n };\n\n private readonly onContentResumeRequested = (): void => {\n this.stopAdProgress();\n this.hideAdLayer();\n const finished = this.activeBreak;\n // IMA, preroll'u olmayan VMAP'te başlangıçta da \"içeriğe dön\" der — başlamamış bir ara için hp:adend gönderme.\n if (this.linearBreakActive) {\n this.linearBreakActive = false;\n this.surfaceGuard?.onBreakEnd(finished !== 'postroll');\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:adend', { detail: { type: finished } }));\n }\n // Reklam IMA tarafında doğal yoldan (ALL_ADS_COMPLETED) bitti — SCTE-35\n // IN sinyali hiç gelmemiş olabilir (broadcaster planlanan süreden\n // kısa kesmiş olabilir), bu yüzden flag'i burada da temizliyoruz.\n this.scte35BreakActive = false;\n\n if (finished === 'preroll') {\n this.maybeRequestVmapAfterPreroll();\n }\n // Postroll'dan sonra play() çağırmak videoyu baştan başlatır — yapma.\n if (finished !== 'postroll') {\n this.ctx.videoEl.play().catch(() => {});\n }\n };\n\n private readonly onAllAdsCompleted = (): void => {\n this.stopAdProgress();\n this.endNonLinear();\n this.adsManager?.destroy();\n this.adsManager = null;\n };\n\n /**\n * Overlay (non-linear) reklam yüklendi: içeriği DURDURMAZ (CONTENT_PAUSE_REQUESTED gelmez) — preroll kapısı onu\n * beklerse içerik zaman aşımına kadar bekliyor, overlay de hiç gösterilmiyordu. Kapı hemen açılır, içerik başlar;\n * reklam katmanı içerikle birlikte görünür, kontrol çubuğunun üstünde durur ve yalnızca overlay tıklanabilir.\n */\n private readonly onAdLoaded = (event?: google.ima.AdEvent): void => {\n const ad = event?.getAd?.();\n if (!ad || typeof ad.isLinear !== 'function' || ad.isLinear()) return;\n this.nonLinearActive = true;\n const layer = this.ctx.adLayerEl;\n this.nonLinearCreativeHeight = ad.getHeight?.() || 0;\n layer.setAttribute('data-nonlinear', '');\n layer.classList.remove('hp:hidden');\n layer.classList.add('hp:block');\n this.resizeAd();\n if (this.currentBreakType === 'Preroll') this.ctx.prerollGate?.release(true);\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:adstart', { detail: { type: this.breakTypeOf(event), linear: false } }));\n };\n\n private viewMode(): string {\n const doc = document as Document & { webkitFullscreenElement?: Element | null };\n const host = this.ctx.hostEl;\n const full = document.fullscreenElement === host || doc.webkitFullscreenElement === host;\n return full ? this.ima!.ViewMode.FULLSCREEN : this.ima!.ViewMode.NORMAL;\n }\n\n /** Boyut değişimleri (ResizeObserver) kare başına bire indirilir — pencere sürüklenirken IMA'yı boğmasın. */\n private readonly scheduleResize = (): void => {\n cancelAnimationFrame(this.resizeFrame);\n this.resizeFrame = requestAnimationFrame(() => this.resizeAd());\n };\n\n /**\n * Reklamı player'ın şimdiki boyutuna getirir: tam ekrana giriş/çıkış, pencere küçültme, cihaz döndürme.\n * IMA boyutu yalnızca init()'te alır; resize() çağrılmazsa reklam eski boyutunda kalıyordu.\n */\n private resizeAd(): void {\n if (!this.adsManager || !this.ima) return;\n const video = this.ctx.videoEl;\n if (!video.clientWidth || !video.clientHeight) return; // gizli / henüz yerleşmemiş\n try {\n if (this.nonLinearActive) {\n // IMA overlay'i tam boyutlu bir iframe'de çiziyor — katman tüm videoyu kaplarsa tıklamaları yutar. Katman,\n // overlay yüksekliğinde (+ kapatma butonu payı) alttaki bir şeride indirilir; videonun geri kalanı tıklanabilir.\n const layer = this.ctx.adLayerEl;\n const slotHeight = Math.round(video.clientHeight / 3);\n const creativeHeight = this.nonLinearCreativeHeight || slotHeight;\n layer.style.setProperty('--hp-nonlinear-ad-height', `${Math.min(slotHeight + 40, creativeHeight + 24)}px`);\n this.adsManager.resize(layer.clientWidth || video.clientWidth, layer.clientHeight || slotHeight, this.viewMode());\n } else {\n this.adsManager.resize(video.clientWidth, video.clientHeight, this.viewMode());\n }\n } catch {\n /* boyut güncellenemedi — reklam önceki boyutunda kalır */\n }\n }\n\n /** Overlay kapandı (kullanıcı kapattı / süresi doldu): katman gizlenir. */\n private readonly endNonLinear = (): void => {\n if (!this.nonLinearActive) return;\n this.nonLinearActive = false;\n this.ctx.adLayerEl.removeAttribute('data-nonlinear');\n this.ctx.adLayerEl.style.removeProperty('--hp-nonlinear-ad-height');\n this.ctx.adLayerEl.classList.add('hp:hidden');\n this.ctx.adLayerEl.classList.remove('hp:block');\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:adend', { detail: { type: this.activeBreak, linear: false } }));\n };\n\n private readonly onAdsLoaderError = (event: google.ima.AdErrorEvent): void => {\n this.adsManager?.destroy();\n this.adsManager = null;\n if (this.scte35BreakActive) {\n this.endScte35Break();\n return;\n }\n this.giveUpOrRetry(this.currentBreakType, this.recordAdError(event));\n };\n\n private readonly onAdsManagerError = (event: google.ima.AdErrorEvent): void => {\n this.stopAdProgress();\n this.adsManager?.destroy();\n this.adsManager = null;\n if (this.scte35BreakActive) {\n this.endScte35Break();\n return;\n }\n this.giveUpOrRetry(this.currentBreakType, this.recordAdError(event));\n };\n\n /** IMA hatasının kodlarını çıkarır, hata kaydına yazar (yeniden denenecek olsa da) ve mesajı döndürür. */\n private recordAdError(event: google.ima.AdErrorEvent): string {\n const err = event.getError?.();\n const info: AdErrorInfo = {\n message: err?.getMessage?.() ?? 'ad-error',\n code: err?.getErrorCode?.(),\n vastCode: err?.getVastErrorCode?.(),\n errorType: err?.getType?.(),\n };\n // IMA'nın \"bilinmiyor\" değerleri (-1 / 0) gösterilmez.\n if (info.vastCode !== undefined && info.vastCode <= 0) info.vastCode = undefined;\n this.lastAdError = info;\n this.ctx.log?.({\n message: info.message,\n details: { code: info.code, vastCode: info.vastCode, errorType: info.errorType, break: this.breakTypeLower() },\n });\n return info.message;\n }\n\n /** Lineer reklam başladı: pod bilgisi + kalan süre toolbar'a (geri sayım). */\n private readonly onAdStarted = (event?: google.ima.AdEvent): void => {\n const ad = event?.getAd?.();\n if (!ad || (typeof ad.isLinear === 'function' && !ad.isLinear())) return;\n try {\n const pod = ad.getAdPodInfo();\n this.podPosition = pod.getAdPosition() || 1;\n this.podTotal = pod.getTotalAds() || 1;\n } catch {\n this.podPosition = 1;\n this.podTotal = 1;\n }\n this.stopAdProgress();\n this.reportAdProgress();\n this.progressTimer = setInterval(this.reportAdProgress, AD_PROGRESS_INTERVAL_MS);\n // Ses reklamı: IMA'nın (görüntüsüz, siyah) video yüzeyi şeffaf olur, altındaki player görünür\n // (ses modunda kapak + plak). IMA'nın kendi görseli (audioPoster) verildiyse o zaten üstte çizilir.\n let contentType = '';\n try {\n contentType = ad.getContentType?.() ?? '';\n } catch {\n /* eski SDK */\n }\n this.ctx.adLayerEl.toggleAttribute('data-audio-ad', contentType.startsWith('audio/'));\n };\n\n private readonly reportAdProgress = (): void => {\n const remaining = this.adsManager?.getRemainingTime() ?? -1;\n this.ctx.onAdProgress?.({ remaining, position: this.podPosition, total: this.podTotal });\n };\n\n private readonly stopAdProgress = (): void => {\n if (this.progressTimer) clearInterval(this.progressTimer);\n this.progressTimer = null;\n this.ctx.onAdProgress?.(null);\n };\n\n private giveUpOrRetry(type: AdBreakType, message?: string): void {\n // Zaman aşımında zaten vazgeçildi (hp:aderror gönderildi) — geç gelen hata için yeniden deneme / ikinci olay yok.\n if (type === 'Preroll' && this.prerollAbandoned) return;\n // Canlı + SCTE-35: yayıncının OUT/IN sinyaline güveniliyor, normal\n // preroll/midroll fallback zinciri/retry'ı kullanılmıyor.\n if (this.scte35BreakActive) {\n this.endScte35Break();\n return;\n }\n const rawTag = tagConfigFor(this.options, type);\n if (!rawTag) {\n this.resumeContentAfterGiveUp(type, message);\n return;\n }\n this.retry.retry(\n type,\n rawTag,\n (tag, attempt) => this.requestAd(type, tag, attempt),\n () => this.resumeContentAfterGiveUp(type, message)\n );\n }\n\n private resumeContentAfterGiveUp(type: AdBreakType, message?: string): void {\n this.hideAdLayer();\n const last = this.lastAdError;\n this.lastAdError = null;\n this.ctx.hostEl.dispatchEvent(\n new CustomEvent('hp:aderror', {\n detail: {\n message: message ?? last?.message ?? 'ad-error',\n code: last?.code,\n vastCode: last?.vastCode,\n errorType: last?.errorType,\n breakType: type.toLowerCase() as 'preroll' | 'midroll' | 'postroll',\n },\n })\n );\n if (type === 'Preroll') this.maybeRequestVmapAfterPreroll();\n const gate = this.ctx.prerollGate;\n if (type === 'Preroll' && gate?.isArmed) {\n // Kapı: içerik yalnızca oynatılmak istendiyse başlar (kullanıcı henüz play'e basmadıysa kendiliğinden başlamaz).\n gate.release(true);\n return;\n }\n if (type !== 'Postroll' && this.ctx.videoEl.paused) {\n this.ctx.videoEl.play().catch(() => {});\n }\n }\n\n /** VMAP split: preroll (başarılı ya da vazgeçilerek) bitince, VMAP TAM OLARAK BİR KEZ, değiştirilmeden istenir. */\n private maybeRequestVmapAfterPreroll(): void {\n if (this.vmapRequested || !this.options.adTagVmap) return;\n this.vmapRequested = true;\n this.requestAd('Midroll', this.options.adTagVmap, 0, true);\n }\n\n /**\n * Chromecast oturumu başladı / bitti. Başlayınca yerel IMA askıya alınır: süren reklam arası kapanır, VMAP takibi\n * (adsManager) bırakılır — aralar TV'de oynar. Dönüşte VMAP yeniden istenmez (aralar TV'de oynandı); aralıklı\n * midroll ve postroll yerelde kaldığı yerden devam eder.\n */\n setRemote(on: boolean): void {\n if (this.remote === on) return;\n this.remote = on;\n if (!on) return;\n this.stopAdProgress();\n this.endNonLinear();\n this.adsManager?.destroy();\n this.adsManager = null;\n this.ctx.prerollGate?.release(false);\n this.initialRequestFired = true;\n this.vmapRequested = true;\n this.postrollPending = false;\n this.hideAdLayer();\n if (this.linearBreakActive) {\n this.linearBreakActive = false;\n this.surfaceGuard?.onBreakEnd(false);\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:adend', { detail: { type: this.activeBreak } }));\n }\n }\n\n private hideAdLayer(): void {\n this.ctx.adLayerEl.removeAttribute('data-audio-ad');\n // Overlay reklam hâlâ ekrandaysa (ör. genişleyen VPAID overlay'i kapandı) katman açık kalır.\n if (!this.nonLinearActive) {\n this.ctx.adLayerEl.classList.add('hp:hidden');\n this.ctx.adLayerEl.classList.remove('hp:block');\n }\n this.ctx.showChrome();\n }\n\n /**\n * Başlayan aranın gerçek tipi. VMAP tek istekle preroll + midroll + postroll getirir; isteğin tipi (currentBreakType)\n * yalnızca ilk arayı anlatır — midroll'lar \"preroll\" diye bildiriliyor, VMAP postroll'undan sonra video baştan\n * başlıyordu. IMA reklamın arasındaki konumu verir: 0 preroll, -1 postroll, diğerleri midroll.\n */\n private breakTypeOf(event?: google.ima.AdEvent): 'preroll' | 'midroll' | 'postroll' {\n // Tek VAST reklamında konum 0 dönebilir (ör. 60. saniyede istenen midroll) — yalnızca VMAP'te güvenilir.\n if (!this.lastRequestIsVmap) return this.breakTypeLower();\n try {\n const offset = event?.getAd?.()?.getAdPodInfo?.()?.getTimeOffset?.();\n if (typeof offset === 'number') return offset === 0 ? 'preroll' : offset < 0 ? 'postroll' : 'midroll';\n } catch {\n /* reklam bilgisi yok — istek tipine düş */\n }\n return this.breakTypeLower();\n }\n\n private breakTypeLower(): 'preroll' | 'midroll' | 'postroll' {\n return this.currentBreakType.toLowerCase() as 'preroll' | 'midroll' | 'postroll';\n }\n}\n","import { AdsController, type AdsPlayerContext } from './AdsController';\nimport type { AdsOptions } from '../../types';\n\n/** Reklam plugin'inin giriş noktası — yalnızca options.ads doluyken dinamik import edilir. */\nexport async function installAds(ctx: AdsPlayerContext, options: AdsOptions): Promise<AdsController> {\n const controller = new AdsController(ctx, options);\n await controller.install();\n return controller;\n}\n\nexport { AdsController };\nexport type { AdsPlayerContext };\n"],"names":["RETURN_BUTTON_MS","AdSurfaceGuard","ctx","__publicField","v","kind","_a","_b","contentContinues","labels","btn","e","IMA_SDK_URL","loadPromise","loadImaSdk","resolve","reject","script","RetryController","config","type","rawTag","onRetry","onGiveUp","maxRetry","chain","maxAttemptsPerTag","tag","attempt","existing","tags","t","state","pattern","entry","upTo","delay","jitter","factor","restrictAdsForConsent","ima","reason","err","initConsentAware","options","uspData","success","tcData","googleVendorConsent","purpose1Consent","_d","_c","parseScte35Base64","base64","binary","bytes","i","spliceEventId","outOfNetwork","programSplice","durationFlag","breakDuration","offset","timeSpecified","autoReturn","duration","parseHlsScteTag","tagName","tagValue","scteOut","scteIn","classAttr","Scte35LiveAdManager","videoEl","callbacks","track","listener","cues","cue","anyCue","match","signal","_forced","AD_PROGRESS_INTERVAL_MS","PREROLL_MAX_AGE_MS","VISIBLE_ROOT_MARGIN","tagConfigFor","AdsController","interval","currentTime","event","isPreroll","AdEvent","gate","cuePoints","timeoutMs","finished","ad","layer","pod","contentType","remaining","_e","hasPageLevelUserActivation","_f","when","entries","newPrerollTag","_g","_duration","prebid","VideoPrebidClass","defaultCode","instance","skipUrlProcessing","vastUrl","generateVastUrl","prebidConfig","request","omid","vendors","modes","cfg","toMode","m","perVendor","fallback","rules","name","id","volume","current","doc","host","video","slotHeight","creativeHeight","info","message","last","on","installAds","controller"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-DT8-oMPm.js","sources":["../../../../node_modules/qrcode-generator/dist/qrcode.mjs","../../src/plugins/qr-resume/qrSvg.ts","../../src/plugins/qr-resume/QrResume.ts","../../src/plugins/qr-resume/index.ts"],"sourcesContent":["//---------------------------------------------------------------------\n//\n// QR Code Generator for JavaScript\n//\n// Copyright (c) 2009 Kazuhiko Arase\n//\n// URL: http://www.d-project.com/\n//\n// Licensed under the MIT license:\n// http://www.opensource.org/licenses/mit-license.php\n//\n// The word 'QR Code' is registered trademark of\n// DENSO WAVE INCORPORATED\n// http://www.denso-wave.com/qrcode/faqpatent-e.html\n//\n//---------------------------------------------------------------------\n\n//---------------------------------------------------------------------\n// qrcode\n//---------------------------------------------------------------------\n\n/**\n * qrcode\n * @param typeNumber 1 to 40\n * @param errorCorrectionLevel 'L','M','Q','H'\n */\nexport const qrcode = function(typeNumber, errorCorrectionLevel) {\n\n const PAD0 = 0xEC;\n const PAD1 = 0x11;\n\n let _typeNumber = typeNumber;\n const _errorCorrectionLevel = QRErrorCorrectionLevel[errorCorrectionLevel];\n let _modules = null;\n let _moduleCount = 0;\n let _dataCache = null;\n const _dataList = [];\n\n const _this = {};\n\n const makeImpl = function(test, maskPattern) {\n\n _moduleCount = _typeNumber * 4 + 17;\n _modules = function(moduleCount) {\n const modules = new Array(moduleCount);\n for (let row = 0; row < moduleCount; row += 1) {\n modules[row] = new Array(moduleCount);\n for (let col = 0; col < moduleCount; col += 1) {\n modules[row][col] = null;\n }\n }\n return modules;\n }(_moduleCount);\n\n setupPositionProbePattern(0, 0);\n setupPositionProbePattern(_moduleCount - 7, 0);\n setupPositionProbePattern(0, _moduleCount - 7);\n setupPositionAdjustPattern();\n setupTimingPattern();\n setupTypeInfo(test, maskPattern);\n\n if (_typeNumber >= 7) {\n setupTypeNumber(test);\n }\n\n if (_dataCache == null) {\n _dataCache = createData(_typeNumber, _errorCorrectionLevel, _dataList);\n }\n\n mapData(_dataCache, maskPattern);\n };\n\n const setupPositionProbePattern = function(row, col) {\n\n for (let r = -1; r <= 7; r += 1) {\n\n if (row + r <= -1 || _moduleCount <= row + r) continue;\n\n for (let c = -1; c <= 7; c += 1) {\n\n if (col + c <= -1 || _moduleCount <= col + c) continue;\n\n if ( (0 <= r && r <= 6 && (c == 0 || c == 6) )\n || (0 <= c && c <= 6 && (r == 0 || r == 6) )\n || (2 <= r && r <= 4 && 2 <= c && c <= 4) ) {\n _modules[row + r][col + c] = true;\n } else {\n _modules[row + r][col + c] = false;\n }\n }\n }\n };\n\n const getBestMaskPattern = function() {\n\n let minLostPoint = 0;\n let pattern = 0;\n\n for (let i = 0; i < 8; i += 1) {\n\n makeImpl(true, i);\n\n const lostPoint = QRUtil.getLostPoint(_this);\n\n if (i == 0 || minLostPoint > lostPoint) {\n minLostPoint = lostPoint;\n pattern = i;\n }\n }\n\n return pattern;\n };\n\n const setupTimingPattern = function() {\n\n for (let r = 8; r < _moduleCount - 8; r += 1) {\n if (_modules[r][6] != null) {\n continue;\n }\n _modules[r][6] = (r % 2 == 0);\n }\n\n for (let c = 8; c < _moduleCount - 8; c += 1) {\n if (_modules[6][c] != null) {\n continue;\n }\n _modules[6][c] = (c % 2 == 0);\n }\n };\n\n const setupPositionAdjustPattern = function() {\n\n const pos = QRUtil.getPatternPosition(_typeNumber);\n\n for (let i = 0; i < pos.length; i += 1) {\n\n for (let j = 0; j < pos.length; j += 1) {\n\n const row = pos[i];\n const col = pos[j];\n\n if (_modules[row][col] != null) {\n continue;\n }\n\n for (let r = -2; r <= 2; r += 1) {\n\n for (let c = -2; c <= 2; c += 1) {\n\n if (r == -2 || r == 2 || c == -2 || c == 2\n || (r == 0 && c == 0) ) {\n _modules[row + r][col + c] = true;\n } else {\n _modules[row + r][col + c] = false;\n }\n }\n }\n }\n }\n };\n\n const setupTypeNumber = function(test) {\n\n const bits = QRUtil.getBCHTypeNumber(_typeNumber);\n\n for (let i = 0; i < 18; i += 1) {\n const mod = (!test && ( (bits >> i) & 1) == 1);\n _modules[Math.floor(i / 3)][i % 3 + _moduleCount - 8 - 3] = mod;\n }\n\n for (let i = 0; i < 18; i += 1) {\n const mod = (!test && ( (bits >> i) & 1) == 1);\n _modules[i % 3 + _moduleCount - 8 - 3][Math.floor(i / 3)] = mod;\n }\n };\n\n const setupTypeInfo = function(test, maskPattern) {\n\n const data = (_errorCorrectionLevel << 3) | maskPattern;\n const bits = QRUtil.getBCHTypeInfo(data);\n\n // vertical\n for (let i = 0; i < 15; i += 1) {\n\n const mod = (!test && ( (bits >> i) & 1) == 1);\n\n if (i < 6) {\n _modules[i][8] = mod;\n } else if (i < 8) {\n _modules[i + 1][8] = mod;\n } else {\n _modules[_moduleCount - 15 + i][8] = mod;\n }\n }\n\n // horizontal\n for (let i = 0; i < 15; i += 1) {\n\n const mod = (!test && ( (bits >> i) & 1) == 1);\n\n if (i < 8) {\n _modules[8][_moduleCount - i - 1] = mod;\n } else if (i < 9) {\n _modules[8][15 - i - 1 + 1] = mod;\n } else {\n _modules[8][15 - i - 1] = mod;\n }\n }\n\n // fixed module\n _modules[_moduleCount - 8][8] = (!test);\n };\n\n const mapData = function(data, maskPattern) {\n\n let inc = -1;\n let row = _moduleCount - 1;\n let bitIndex = 7;\n let byteIndex = 0;\n const maskFunc = QRUtil.getMaskFunction(maskPattern);\n\n for (let col = _moduleCount - 1; col > 0; col -= 2) {\n\n if (col == 6) col -= 1;\n\n while (true) {\n\n for (let c = 0; c < 2; c += 1) {\n\n if (_modules[row][col - c] == null) {\n\n let dark = false;\n\n if (byteIndex < data.length) {\n dark = ( ( (data[byteIndex] >>> bitIndex) & 1) == 1);\n }\n\n const mask = maskFunc(row, col - c);\n\n if (mask) {\n dark = !dark;\n }\n\n _modules[row][col - c] = dark;\n bitIndex -= 1;\n\n if (bitIndex == -1) {\n byteIndex += 1;\n bitIndex = 7;\n }\n }\n }\n\n row += inc;\n\n if (row < 0 || _moduleCount <= row) {\n row -= inc;\n inc = -inc;\n break;\n }\n }\n }\n };\n\n const createBytes = function(buffer, rsBlocks) {\n\n let offset = 0;\n\n let maxDcCount = 0;\n let maxEcCount = 0;\n\n const dcdata = new Array(rsBlocks.length);\n const ecdata = new Array(rsBlocks.length);\n\n for (let r = 0; r < rsBlocks.length; r += 1) {\n\n const dcCount = rsBlocks[r].dataCount;\n const ecCount = rsBlocks[r].totalCount - dcCount;\n\n maxDcCount = Math.max(maxDcCount, dcCount);\n maxEcCount = Math.max(maxEcCount, ecCount);\n\n dcdata[r] = new Array(dcCount);\n\n for (let i = 0; i < dcdata[r].length; i += 1) {\n dcdata[r][i] = 0xff & buffer.getBuffer()[i + offset];\n }\n offset += dcCount;\n\n const rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);\n const rawPoly = qrPolynomial(dcdata[r], rsPoly.getLength() - 1);\n\n const modPoly = rawPoly.mod(rsPoly);\n ecdata[r] = new Array(rsPoly.getLength() - 1);\n for (let i = 0; i < ecdata[r].length; i += 1) {\n const modIndex = i + modPoly.getLength() - ecdata[r].length;\n ecdata[r][i] = (modIndex >= 0)? modPoly.getAt(modIndex) : 0;\n }\n }\n\n let totalCodeCount = 0;\n for (let i = 0; i < rsBlocks.length; i += 1) {\n totalCodeCount += rsBlocks[i].totalCount;\n }\n\n const data = new Array(totalCodeCount);\n let index = 0;\n\n for (let i = 0; i < maxDcCount; i += 1) {\n for (let r = 0; r < rsBlocks.length; r += 1) {\n if (i < dcdata[r].length) {\n data[index] = dcdata[r][i];\n index += 1;\n }\n }\n }\n\n for (let i = 0; i < maxEcCount; i += 1) {\n for (let r = 0; r < rsBlocks.length; r += 1) {\n if (i < ecdata[r].length) {\n data[index] = ecdata[r][i];\n index += 1;\n }\n }\n }\n\n return data;\n };\n\n const createData = function(typeNumber, errorCorrectionLevel, dataList) {\n\n const rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectionLevel);\n\n const buffer = qrBitBuffer();\n\n for (let i = 0; i < dataList.length; i += 1) {\n const data = dataList[i];\n buffer.put(data.getMode(), 4);\n buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber) );\n data.write(buffer);\n }\n\n // calc num max data.\n let totalDataCount = 0;\n for (let i = 0; i < rsBlocks.length; i += 1) {\n totalDataCount += rsBlocks[i].dataCount;\n }\n\n if (buffer.getLengthInBits() > totalDataCount * 8) {\n throw 'code length overflow. ('\n + buffer.getLengthInBits()\n + '>'\n + totalDataCount * 8\n + ')';\n }\n\n // end code\n if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {\n buffer.put(0, 4);\n }\n\n // padding\n while (buffer.getLengthInBits() % 8 != 0) {\n buffer.putBit(false);\n }\n\n // padding\n while (true) {\n\n if (buffer.getLengthInBits() >= totalDataCount * 8) {\n break;\n }\n buffer.put(PAD0, 8);\n\n if (buffer.getLengthInBits() >= totalDataCount * 8) {\n break;\n }\n buffer.put(PAD1, 8);\n }\n\n return createBytes(buffer, rsBlocks);\n };\n\n _this.addData = function(data, mode) {\n\n mode = mode || 'Byte';\n\n let newData = null;\n\n switch(mode) {\n case 'Numeric' :\n newData = qrNumber(data);\n break;\n case 'Alphanumeric' :\n newData = qrAlphaNum(data);\n break;\n case 'Byte' :\n newData = qr8BitByte(data);\n break;\n case 'Kanji' :\n newData = qrKanji(data);\n break;\n default :\n throw 'mode:' + mode;\n }\n\n _dataList.push(newData);\n _dataCache = null;\n };\n\n _this.isDark = function(row, col) {\n if (row < 0 || _moduleCount <= row || col < 0 || _moduleCount <= col) {\n throw row + ',' + col;\n }\n return _modules[row][col];\n };\n\n _this.getModuleCount = function() {\n return _moduleCount;\n };\n\n _this.make = function() {\n if (_typeNumber < 1) {\n let typeNumber = 1;\n\n for (; typeNumber < 40; typeNumber++) {\n const rsBlocks = QRRSBlock.getRSBlocks(typeNumber, _errorCorrectionLevel);\n const buffer = qrBitBuffer();\n\n for (let i = 0; i < _dataList.length; i++) {\n const data = _dataList[i];\n buffer.put(data.getMode(), 4);\n buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber) );\n data.write(buffer);\n }\n\n let totalDataCount = 0;\n for (let i = 0; i < rsBlocks.length; i++) {\n totalDataCount += rsBlocks[i].dataCount;\n }\n\n if (buffer.getLengthInBits() <= totalDataCount * 8) {\n break;\n }\n }\n\n _typeNumber = typeNumber;\n }\n\n makeImpl(false, getBestMaskPattern() );\n };\n\n _this.createTableTag = function(cellSize, margin) {\n\n cellSize = cellSize || 2;\n margin = (typeof margin == 'undefined')? cellSize * 4 : margin;\n\n let qrHtml = '';\n\n qrHtml += '<table style=\"';\n qrHtml += ' border-width: 0px; border-style: none;';\n qrHtml += ' border-collapse: collapse;';\n qrHtml += ' padding: 0px; margin: ' + margin + 'px;';\n qrHtml += '\">';\n qrHtml += '<tbody>';\n\n for (let r = 0; r < _this.getModuleCount(); r += 1) {\n\n qrHtml += '<tr>';\n\n for (let c = 0; c < _this.getModuleCount(); c += 1) {\n qrHtml += '<td style=\"';\n qrHtml += ' border-width: 0px; border-style: none;';\n qrHtml += ' border-collapse: collapse;';\n qrHtml += ' padding: 0px; margin: 0px;';\n qrHtml += ' width: ' + cellSize + 'px;';\n qrHtml += ' height: ' + cellSize + 'px;';\n qrHtml += ' background-color: ';\n qrHtml += _this.isDark(r, c)? '#000000' : '#ffffff';\n qrHtml += ';';\n qrHtml += '\"/>';\n }\n\n qrHtml += '</tr>';\n }\n\n qrHtml += '</tbody>';\n qrHtml += '</table>';\n\n return qrHtml;\n };\n\n _this.createSvgTag = function(cellSize, margin, alt, title) {\n\n let opts = {};\n if (typeof arguments[0] == 'object') {\n // Called by options.\n opts = arguments[0];\n // overwrite cellSize and margin.\n cellSize = opts.cellSize;\n margin = opts.margin;\n alt = opts.alt;\n title = opts.title;\n }\n\n cellSize = cellSize || 2;\n margin = (typeof margin == 'undefined')? cellSize * 4 : margin;\n\n // Compose alt property surrogate\n alt = (typeof alt === 'string') ? {text: alt} : alt || {};\n alt.text = alt.text || null;\n alt.id = (alt.text) ? alt.id || 'qrcode-description' : null;\n\n // Compose title property surrogate\n title = (typeof title === 'string') ? {text: title} : title || {};\n title.text = title.text || null;\n title.id = (title.text) ? title.id || 'qrcode-title' : null;\n\n const size = _this.getModuleCount() * cellSize + margin * 2;\n let c, mc, r, mr, qrSvg='', rect;\n\n rect = 'l' + cellSize + ',0 0,' + cellSize +\n ' -' + cellSize + ',0 0,-' + cellSize + 'z ';\n\n qrSvg += '<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"';\n qrSvg += !opts.scalable ? ' width=\"' + size + 'px\" height=\"' + size + 'px\"' : '';\n qrSvg += ' viewBox=\"0 0 ' + size + ' ' + size + '\" ';\n qrSvg += ' preserveAspectRatio=\"xMinYMin meet\"';\n qrSvg += (title.text || alt.text) ? ' role=\"img\" aria-labelledby=\"' +\n escapeXml([title.id, alt.id].join(' ').trim() ) + '\"' : '';\n qrSvg += '>';\n qrSvg += (title.text) ? '<title id=\"' + escapeXml(title.id) + '\">' +\n escapeXml(title.text) + '</title>' : '';\n qrSvg += (alt.text) ? '<description id=\"' + escapeXml(alt.id) + '\">' +\n escapeXml(alt.text) + '</description>' : '';\n qrSvg += '<rect width=\"100%\" height=\"100%\" fill=\"white\" cx=\"0\" cy=\"0\"/>';\n qrSvg += '<path d=\"';\n\n for (r = 0; r < _this.getModuleCount(); r += 1) {\n mr = r * cellSize + margin;\n for (c = 0; c < _this.getModuleCount(); c += 1) {\n if (_this.isDark(r, c) ) {\n mc = c*cellSize+margin;\n qrSvg += 'M' + mc + ',' + mr + rect;\n }\n }\n }\n\n qrSvg += '\" stroke=\"transparent\" fill=\"black\"/>';\n qrSvg += '</svg>';\n\n return qrSvg;\n };\n\n _this.createDataURL = function(cellSize, margin) {\n\n cellSize = cellSize || 2;\n margin = (typeof margin == 'undefined')? cellSize * 4 : margin;\n\n const size = _this.getModuleCount() * cellSize + margin * 2;\n const min = margin;\n const max = size - margin;\n\n return createDataURL(size, size, function(x, y) {\n if (min <= x && x < max && min <= y && y < max) {\n const c = Math.floor( (x - min) / cellSize);\n const r = Math.floor( (y - min) / cellSize);\n return _this.isDark(r, c)? 0 : 1;\n } else {\n return 1;\n }\n } );\n };\n\n _this.createImgTag = function(cellSize, margin, alt) {\n\n cellSize = cellSize || 2;\n margin = (typeof margin == 'undefined')? cellSize * 4 : margin;\n\n const size = _this.getModuleCount() * cellSize + margin * 2;\n\n let img = '';\n img += '<img';\n img += '\\u0020src=\"';\n img += _this.createDataURL(cellSize, margin);\n img += '\"';\n img += '\\u0020width=\"';\n img += size;\n img += '\"';\n img += '\\u0020height=\"';\n img += size;\n img += '\"';\n if (alt) {\n img += '\\u0020alt=\"';\n img += escapeXml(alt);\n img += '\"';\n }\n img += '/>';\n\n return img;\n };\n\n const escapeXml = function(s) {\n let escaped = '';\n for (let i = 0; i < s.length; i += 1) {\n const c = s.charAt(i);\n switch(c) {\n case '<': escaped += '&lt;'; break;\n case '>': escaped += '&gt;'; break;\n case '&': escaped += '&amp;'; break;\n case '\"': escaped += '&quot;'; break;\n default : escaped += c; break;\n }\n }\n return escaped;\n };\n\n const _createHalfASCII = function(margin) {\n const cellSize = 1;\n margin = (typeof margin == 'undefined')? cellSize * 2 : margin;\n\n const size = _this.getModuleCount() * cellSize + margin * 2;\n const min = margin;\n const max = size - margin;\n\n let y, x, r1, r2, p;\n\n const blocks = {\n '██': '█',\n '█ ': '▀',\n ' █': '▄',\n ' ': ' '\n };\n\n const blocksLastLineNoMargin = {\n '██': '▀',\n '█ ': '▀',\n ' █': ' ',\n ' ': ' '\n };\n\n let ascii = '';\n for (y = 0; y < size; y += 2) {\n r1 = Math.floor((y - min) / cellSize);\n r2 = Math.floor((y + 1 - min) / cellSize);\n for (x = 0; x < size; x += 1) {\n p = '█';\n\n if (min <= x && x < max && min <= y && y < max && _this.isDark(r1, Math.floor((x - min) / cellSize))) {\n p = ' ';\n }\n\n if (min <= x && x < max && min <= y+1 && y+1 < max && _this.isDark(r2, Math.floor((x - min) / cellSize))) {\n p += ' ';\n }\n else {\n p += '█';\n }\n\n // Output 2 characters per pixel, to create full square. 1 character per pixels gives only half width of square.\n ascii += (margin < 1 && y+1 >= max) ? blocksLastLineNoMargin[p] : blocks[p];\n }\n\n ascii += '\\n';\n }\n\n if (size % 2 && margin > 0) {\n return ascii.substring(0, ascii.length - size - 1) + Array(size+1).join('▀');\n }\n\n return ascii.substring(0, ascii.length-1);\n };\n\n _this.createASCII = function(cellSize, margin) {\n cellSize = cellSize || 1;\n\n if (cellSize < 2) {\n return _createHalfASCII(margin);\n }\n\n cellSize -= 1;\n margin = (typeof margin == 'undefined')? cellSize * 2 : margin;\n\n const size = _this.getModuleCount() * cellSize + margin * 2;\n const min = margin;\n const max = size - margin;\n\n let y, x, r, p;\n\n const white = Array(cellSize+1).join('██');\n const black = Array(cellSize+1).join(' ');\n\n let ascii = '';\n let line = '';\n for (y = 0; y < size; y += 1) {\n r = Math.floor( (y - min) / cellSize);\n line = '';\n for (x = 0; x < size; x += 1) {\n p = 1;\n\n if (min <= x && x < max && min <= y && y < max && _this.isDark(r, Math.floor((x - min) / cellSize))) {\n p = 0;\n }\n\n // Output 2 characters per pixel, to create full square. 1 character per pixels gives only half width of square.\n line += p ? white : black;\n }\n\n for (r = 0; r < cellSize; r += 1) {\n ascii += line + '\\n';\n }\n }\n\n return ascii.substring(0, ascii.length-1);\n };\n\n _this.renderTo2dContext = function(context, cellSize) {\n cellSize = cellSize || 2;\n const length = _this.getModuleCount();\n for (let row = 0; row < length; row++) {\n for (let col = 0; col < length; col++) {\n context.fillStyle = _this.isDark(row, col) ? 'black' : 'white';\n context.fillRect(col * cellSize, row * cellSize, cellSize, cellSize);\n }\n }\n }\n\n return _this;\n};\n\n//---------------------------------------------------------------------\n// qrcode.stringToBytes\n//---------------------------------------------------------------------\n\nqrcode.stringToBytes = function(s) {\n const bytes = [];\n for (let i = 0; i < s.length; i += 1) {\n const c = s.charCodeAt(i);\n bytes.push(c & 0xff);\n }\n return bytes;\n};\n\n//---------------------------------------------------------------------\n// qrcode.createStringToBytes\n//---------------------------------------------------------------------\n\n/**\n * @param unicodeData base64 string of byte array.\n * [16bit Unicode],[16bit Bytes], ...\n * @param numChars\n */\nqrcode.createStringToBytes = function(unicodeData, numChars) {\n\n // create conversion map.\n\n const unicodeMap = function() {\n\n const bin = base64DecodeInputStream(unicodeData);\n const read = function() {\n const b = bin.read();\n if (b == -1) throw 'eof';\n return b;\n };\n\n let count = 0;\n const unicodeMap = {};\n while (true) {\n const b0 = bin.read();\n if (b0 == -1) break;\n const b1 = read();\n const b2 = read();\n const b3 = read();\n const k = String.fromCharCode( (b0 << 8) | b1);\n const v = (b2 << 8) | b3;\n unicodeMap[k] = v;\n count += 1;\n }\n if (count != numChars) {\n throw count + ' != ' + numChars;\n }\n\n return unicodeMap;\n }();\n\n const unknownChar = '?'.charCodeAt(0);\n\n return function(s) {\n const bytes = [];\n for (let i = 0; i < s.length; i += 1) {\n const c = s.charCodeAt(i);\n if (c < 128) {\n bytes.push(c);\n } else {\n const b = unicodeMap[s.charAt(i)];\n if (typeof b == 'number') {\n if ( (b & 0xff) == b) {\n // 1byte\n bytes.push(b);\n } else {\n // 2bytes\n bytes.push(b >>> 8);\n bytes.push(b & 0xff);\n }\n } else {\n bytes.push(unknownChar);\n }\n }\n }\n return bytes;\n };\n};\n\n//---------------------------------------------------------------------\n// QRMode\n//---------------------------------------------------------------------\n\nconst QRMode = {\n MODE_NUMBER : 1 << 0,\n MODE_ALPHA_NUM : 1 << 1,\n MODE_8BIT_BYTE : 1 << 2,\n MODE_KANJI : 1 << 3\n};\n\n//---------------------------------------------------------------------\n// QRErrorCorrectionLevel\n//---------------------------------------------------------------------\n\nconst QRErrorCorrectionLevel = {\n L : 1,\n M : 0,\n Q : 3,\n H : 2\n};\n\n//---------------------------------------------------------------------\n// QRMaskPattern\n//---------------------------------------------------------------------\n\nconst QRMaskPattern = {\n PATTERN000 : 0,\n PATTERN001 : 1,\n PATTERN010 : 2,\n PATTERN011 : 3,\n PATTERN100 : 4,\n PATTERN101 : 5,\n PATTERN110 : 6,\n PATTERN111 : 7\n};\n\n//---------------------------------------------------------------------\n// QRUtil\n//---------------------------------------------------------------------\n\nconst QRUtil = function() {\n\n const PATTERN_POSITION_TABLE = [\n [],\n [6, 18],\n [6, 22],\n [6, 26],\n [6, 30],\n [6, 34],\n [6, 22, 38],\n [6, 24, 42],\n [6, 26, 46],\n [6, 28, 50],\n [6, 30, 54],\n [6, 32, 58],\n [6, 34, 62],\n [6, 26, 46, 66],\n [6, 26, 48, 70],\n [6, 26, 50, 74],\n [6, 30, 54, 78],\n [6, 30, 56, 82],\n [6, 30, 58, 86],\n [6, 34, 62, 90],\n [6, 28, 50, 72, 94],\n [6, 26, 50, 74, 98],\n [6, 30, 54, 78, 102],\n [6, 28, 54, 80, 106],\n [6, 32, 58, 84, 110],\n [6, 30, 58, 86, 114],\n [6, 34, 62, 90, 118],\n [6, 26, 50, 74, 98, 122],\n [6, 30, 54, 78, 102, 126],\n [6, 26, 52, 78, 104, 130],\n [6, 30, 56, 82, 108, 134],\n [6, 34, 60, 86, 112, 138],\n [6, 30, 58, 86, 114, 142],\n [6, 34, 62, 90, 118, 146],\n [6, 30, 54, 78, 102, 126, 150],\n [6, 24, 50, 76, 102, 128, 154],\n [6, 28, 54, 80, 106, 132, 158],\n [6, 32, 58, 84, 110, 136, 162],\n [6, 26, 54, 82, 110, 138, 166],\n [6, 30, 58, 86, 114, 142, 170]\n ];\n const G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0);\n const G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0);\n const G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1);\n\n const _this = {};\n\n const getBCHDigit = function(data) {\n let digit = 0;\n while (data != 0) {\n digit += 1;\n data >>>= 1;\n }\n return digit;\n };\n\n _this.getBCHTypeInfo = function(data) {\n let d = data << 10;\n while (getBCHDigit(d) - getBCHDigit(G15) >= 0) {\n d ^= (G15 << (getBCHDigit(d) - getBCHDigit(G15) ) );\n }\n return ( (data << 10) | d) ^ G15_MASK;\n };\n\n _this.getBCHTypeNumber = function(data) {\n let d = data << 12;\n while (getBCHDigit(d) - getBCHDigit(G18) >= 0) {\n d ^= (G18 << (getBCHDigit(d) - getBCHDigit(G18) ) );\n }\n return (data << 12) | d;\n };\n\n _this.getPatternPosition = function(typeNumber) {\n return PATTERN_POSITION_TABLE[typeNumber - 1];\n };\n\n _this.getMaskFunction = function(maskPattern) {\n\n switch (maskPattern) {\n\n case QRMaskPattern.PATTERN000 :\n return function(i, j) { return (i + j) % 2 == 0; };\n case QRMaskPattern.PATTERN001 :\n return function(i, j) { return i % 2 == 0; };\n case QRMaskPattern.PATTERN010 :\n return function(i, j) { return j % 3 == 0; };\n case QRMaskPattern.PATTERN011 :\n return function(i, j) { return (i + j) % 3 == 0; };\n case QRMaskPattern.PATTERN100 :\n return function(i, j) { return (Math.floor(i / 2) + Math.floor(j / 3) ) % 2 == 0; };\n case QRMaskPattern.PATTERN101 :\n return function(i, j) { return (i * j) % 2 + (i * j) % 3 == 0; };\n case QRMaskPattern.PATTERN110 :\n return function(i, j) { return ( (i * j) % 2 + (i * j) % 3) % 2 == 0; };\n case QRMaskPattern.PATTERN111 :\n return function(i, j) { return ( (i * j) % 3 + (i + j) % 2) % 2 == 0; };\n\n default :\n throw 'bad maskPattern:' + maskPattern;\n }\n };\n\n _this.getErrorCorrectPolynomial = function(errorCorrectLength) {\n let a = qrPolynomial([1], 0);\n for (let i = 0; i < errorCorrectLength; i += 1) {\n a = a.multiply(qrPolynomial([1, QRMath.gexp(i)], 0) );\n }\n return a;\n };\n\n _this.getLengthInBits = function(mode, type) {\n\n if (1 <= type && type < 10) {\n\n // 1 - 9\n\n switch(mode) {\n case QRMode.MODE_NUMBER : return 10;\n case QRMode.MODE_ALPHA_NUM : return 9;\n case QRMode.MODE_8BIT_BYTE : return 8;\n case QRMode.MODE_KANJI : return 8;\n default :\n throw 'mode:' + mode;\n }\n\n } else if (type < 27) {\n\n // 10 - 26\n\n switch(mode) {\n case QRMode.MODE_NUMBER : return 12;\n case QRMode.MODE_ALPHA_NUM : return 11;\n case QRMode.MODE_8BIT_BYTE : return 16;\n case QRMode.MODE_KANJI : return 10;\n default :\n throw 'mode:' + mode;\n }\n\n } else if (type < 41) {\n\n // 27 - 40\n\n switch(mode) {\n case QRMode.MODE_NUMBER : return 14;\n case QRMode.MODE_ALPHA_NUM : return 13;\n case QRMode.MODE_8BIT_BYTE : return 16;\n case QRMode.MODE_KANJI : return 12;\n default :\n throw 'mode:' + mode;\n }\n\n } else {\n throw 'type:' + type;\n }\n };\n\n _this.getLostPoint = function(qrcode) {\n\n const moduleCount = qrcode.getModuleCount();\n\n let lostPoint = 0;\n\n // LEVEL1\n\n for (let row = 0; row < moduleCount; row += 1) {\n for (let col = 0; col < moduleCount; col += 1) {\n\n let sameCount = 0;\n const dark = qrcode.isDark(row, col);\n\n for (let r = -1; r <= 1; r += 1) {\n\n if (row + r < 0 || moduleCount <= row + r) {\n continue;\n }\n\n for (let c = -1; c <= 1; c += 1) {\n\n if (col + c < 0 || moduleCount <= col + c) {\n continue;\n }\n\n if (r == 0 && c == 0) {\n continue;\n }\n\n if (dark == qrcode.isDark(row + r, col + c) ) {\n sameCount += 1;\n }\n }\n }\n\n if (sameCount > 5) {\n lostPoint += (3 + sameCount - 5);\n }\n }\n };\n\n // LEVEL2\n\n for (let row = 0; row < moduleCount - 1; row += 1) {\n for (let col = 0; col < moduleCount - 1; col += 1) {\n let count = 0;\n if (qrcode.isDark(row, col) ) count += 1;\n if (qrcode.isDark(row + 1, col) ) count += 1;\n if (qrcode.isDark(row, col + 1) ) count += 1;\n if (qrcode.isDark(row + 1, col + 1) ) count += 1;\n if (count == 0 || count == 4) {\n lostPoint += 3;\n }\n }\n }\n\n // LEVEL3\n\n for (let row = 0; row < moduleCount; row += 1) {\n for (let col = 0; col < moduleCount - 6; col += 1) {\n if (qrcode.isDark(row, col)\n && !qrcode.isDark(row, col + 1)\n && qrcode.isDark(row, col + 2)\n && qrcode.isDark(row, col + 3)\n && qrcode.isDark(row, col + 4)\n && !qrcode.isDark(row, col + 5)\n && qrcode.isDark(row, col + 6) ) {\n lostPoint += 40;\n }\n }\n }\n\n for (let col = 0; col < moduleCount; col += 1) {\n for (let row = 0; row < moduleCount - 6; row += 1) {\n if (qrcode.isDark(row, col)\n && !qrcode.isDark(row + 1, col)\n && qrcode.isDark(row + 2, col)\n && qrcode.isDark(row + 3, col)\n && qrcode.isDark(row + 4, col)\n && !qrcode.isDark(row + 5, col)\n && qrcode.isDark(row + 6, col) ) {\n lostPoint += 40;\n }\n }\n }\n\n // LEVEL4\n\n let darkCount = 0;\n\n for (let col = 0; col < moduleCount; col += 1) {\n for (let row = 0; row < moduleCount; row += 1) {\n if (qrcode.isDark(row, col) ) {\n darkCount += 1;\n }\n }\n }\n\n const ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;\n lostPoint += ratio * 10;\n\n return lostPoint;\n };\n\n return _this;\n}();\n\n//---------------------------------------------------------------------\n// QRMath\n//---------------------------------------------------------------------\n\nconst QRMath = function() {\n\n const EXP_TABLE = new Array(256);\n const LOG_TABLE = new Array(256);\n\n // initialize tables\n for (let i = 0; i < 8; i += 1) {\n EXP_TABLE[i] = 1 << i;\n }\n for (let i = 8; i < 256; i += 1) {\n EXP_TABLE[i] = EXP_TABLE[i - 4]\n ^ EXP_TABLE[i - 5]\n ^ EXP_TABLE[i - 6]\n ^ EXP_TABLE[i - 8];\n }\n for (let i = 0; i < 255; i += 1) {\n LOG_TABLE[EXP_TABLE[i] ] = i;\n }\n\n const _this = {};\n\n _this.glog = function(n) {\n\n if (n < 1) {\n throw 'glog(' + n + ')';\n }\n\n return LOG_TABLE[n];\n };\n\n _this.gexp = function(n) {\n\n while (n < 0) {\n n += 255;\n }\n\n while (n >= 256) {\n n -= 255;\n }\n\n return EXP_TABLE[n];\n };\n\n return _this;\n}();\n\n//---------------------------------------------------------------------\n// qrPolynomial\n//---------------------------------------------------------------------\n\nconst qrPolynomial = function(num, shift) {\n\n if (typeof num.length == 'undefined') {\n throw num.length + '/' + shift;\n }\n\n const _num = function() {\n let offset = 0;\n while (offset < num.length && num[offset] == 0) {\n offset += 1;\n }\n const _num = new Array(num.length - offset + shift);\n for (let i = 0; i < num.length - offset; i += 1) {\n _num[i] = num[i + offset];\n }\n return _num;\n }();\n\n const _this = {};\n\n _this.getAt = function(index) {\n return _num[index];\n };\n\n _this.getLength = function() {\n return _num.length;\n };\n\n _this.multiply = function(e) {\n\n const num = new Array(_this.getLength() + e.getLength() - 1);\n\n for (let i = 0; i < _this.getLength(); i += 1) {\n for (let j = 0; j < e.getLength(); j += 1) {\n num[i + j] ^= QRMath.gexp(QRMath.glog(_this.getAt(i) ) + QRMath.glog(e.getAt(j) ) );\n }\n }\n\n return qrPolynomial(num, 0);\n };\n\n _this.mod = function(e) {\n\n if (_this.getLength() - e.getLength() < 0) {\n return _this;\n }\n\n const ratio = QRMath.glog(_this.getAt(0) ) - QRMath.glog(e.getAt(0) );\n\n const num = new Array(_this.getLength() );\n for (let i = 0; i < _this.getLength(); i += 1) {\n num[i] = _this.getAt(i);\n }\n\n for (let i = 0; i < e.getLength(); i += 1) {\n num[i] ^= QRMath.gexp(QRMath.glog(e.getAt(i) ) + ratio);\n }\n\n // recursive call\n return qrPolynomial(num, 0).mod(e);\n };\n\n return _this;\n};\n\n//---------------------------------------------------------------------\n// QRRSBlock\n//---------------------------------------------------------------------\n\nconst QRRSBlock = function() {\n\n const RS_BLOCK_TABLE = [\n\n // L\n // M\n // Q\n // H\n\n // 1\n [1, 26, 19],\n [1, 26, 16],\n [1, 26, 13],\n [1, 26, 9],\n\n // 2\n [1, 44, 34],\n [1, 44, 28],\n [1, 44, 22],\n [1, 44, 16],\n\n // 3\n [1, 70, 55],\n [1, 70, 44],\n [2, 35, 17],\n [2, 35, 13],\n\n // 4\n [1, 100, 80],\n [2, 50, 32],\n [2, 50, 24],\n [4, 25, 9],\n\n // 5\n [1, 134, 108],\n [2, 67, 43],\n [2, 33, 15, 2, 34, 16],\n [2, 33, 11, 2, 34, 12],\n\n // 6\n [2, 86, 68],\n [4, 43, 27],\n [4, 43, 19],\n [4, 43, 15],\n\n // 7\n [2, 98, 78],\n [4, 49, 31],\n [2, 32, 14, 4, 33, 15],\n [4, 39, 13, 1, 40, 14],\n\n // 8\n [2, 121, 97],\n [2, 60, 38, 2, 61, 39],\n [4, 40, 18, 2, 41, 19],\n [4, 40, 14, 2, 41, 15],\n\n // 9\n [2, 146, 116],\n [3, 58, 36, 2, 59, 37],\n [4, 36, 16, 4, 37, 17],\n [4, 36, 12, 4, 37, 13],\n\n // 10\n [2, 86, 68, 2, 87, 69],\n [4, 69, 43, 1, 70, 44],\n [6, 43, 19, 2, 44, 20],\n [6, 43, 15, 2, 44, 16],\n\n // 11\n [4, 101, 81],\n [1, 80, 50, 4, 81, 51],\n [4, 50, 22, 4, 51, 23],\n [3, 36, 12, 8, 37, 13],\n\n // 12\n [2, 116, 92, 2, 117, 93],\n [6, 58, 36, 2, 59, 37],\n [4, 46, 20, 6, 47, 21],\n [7, 42, 14, 4, 43, 15],\n\n // 13\n [4, 133, 107],\n [8, 59, 37, 1, 60, 38],\n [8, 44, 20, 4, 45, 21],\n [12, 33, 11, 4, 34, 12],\n\n // 14\n [3, 145, 115, 1, 146, 116],\n [4, 64, 40, 5, 65, 41],\n [11, 36, 16, 5, 37, 17],\n [11, 36, 12, 5, 37, 13],\n\n // 15\n [5, 109, 87, 1, 110, 88],\n [5, 65, 41, 5, 66, 42],\n [5, 54, 24, 7, 55, 25],\n [11, 36, 12, 7, 37, 13],\n\n // 16\n [5, 122, 98, 1, 123, 99],\n [7, 73, 45, 3, 74, 46],\n [15, 43, 19, 2, 44, 20],\n [3, 45, 15, 13, 46, 16],\n\n // 17\n [1, 135, 107, 5, 136, 108],\n [10, 74, 46, 1, 75, 47],\n [1, 50, 22, 15, 51, 23],\n [2, 42, 14, 17, 43, 15],\n\n // 18\n [5, 150, 120, 1, 151, 121],\n [9, 69, 43, 4, 70, 44],\n [17, 50, 22, 1, 51, 23],\n [2, 42, 14, 19, 43, 15],\n\n // 19\n [3, 141, 113, 4, 142, 114],\n [3, 70, 44, 11, 71, 45],\n [17, 47, 21, 4, 48, 22],\n [9, 39, 13, 16, 40, 14],\n\n // 20\n [3, 135, 107, 5, 136, 108],\n [3, 67, 41, 13, 68, 42],\n [15, 54, 24, 5, 55, 25],\n [15, 43, 15, 10, 44, 16],\n\n // 21\n [4, 144, 116, 4, 145, 117],\n [17, 68, 42],\n [17, 50, 22, 6, 51, 23],\n [19, 46, 16, 6, 47, 17],\n\n // 22\n [2, 139, 111, 7, 140, 112],\n [17, 74, 46],\n [7, 54, 24, 16, 55, 25],\n [34, 37, 13],\n\n // 23\n [4, 151, 121, 5, 152, 122],\n [4, 75, 47, 14, 76, 48],\n [11, 54, 24, 14, 55, 25],\n [16, 45, 15, 14, 46, 16],\n\n // 24\n [6, 147, 117, 4, 148, 118],\n [6, 73, 45, 14, 74, 46],\n [11, 54, 24, 16, 55, 25],\n [30, 46, 16, 2, 47, 17],\n\n // 25\n [8, 132, 106, 4, 133, 107],\n [8, 75, 47, 13, 76, 48],\n [7, 54, 24, 22, 55, 25],\n [22, 45, 15, 13, 46, 16],\n\n // 26\n [10, 142, 114, 2, 143, 115],\n [19, 74, 46, 4, 75, 47],\n [28, 50, 22, 6, 51, 23],\n [33, 46, 16, 4, 47, 17],\n\n // 27\n [8, 152, 122, 4, 153, 123],\n [22, 73, 45, 3, 74, 46],\n [8, 53, 23, 26, 54, 24],\n [12, 45, 15, 28, 46, 16],\n\n // 28\n [3, 147, 117, 10, 148, 118],\n [3, 73, 45, 23, 74, 46],\n [4, 54, 24, 31, 55, 25],\n [11, 45, 15, 31, 46, 16],\n\n // 29\n [7, 146, 116, 7, 147, 117],\n [21, 73, 45, 7, 74, 46],\n [1, 53, 23, 37, 54, 24],\n [19, 45, 15, 26, 46, 16],\n\n // 30\n [5, 145, 115, 10, 146, 116],\n [19, 75, 47, 10, 76, 48],\n [15, 54, 24, 25, 55, 25],\n [23, 45, 15, 25, 46, 16],\n\n // 31\n [13, 145, 115, 3, 146, 116],\n [2, 74, 46, 29, 75, 47],\n [42, 54, 24, 1, 55, 25],\n [23, 45, 15, 28, 46, 16],\n\n // 32\n [17, 145, 115],\n [10, 74, 46, 23, 75, 47],\n [10, 54, 24, 35, 55, 25],\n [19, 45, 15, 35, 46, 16],\n\n // 33\n [17, 145, 115, 1, 146, 116],\n [14, 74, 46, 21, 75, 47],\n [29, 54, 24, 19, 55, 25],\n [11, 45, 15, 46, 46, 16],\n\n // 34\n [13, 145, 115, 6, 146, 116],\n [14, 74, 46, 23, 75, 47],\n [44, 54, 24, 7, 55, 25],\n [59, 46, 16, 1, 47, 17],\n\n // 35\n [12, 151, 121, 7, 152, 122],\n [12, 75, 47, 26, 76, 48],\n [39, 54, 24, 14, 55, 25],\n [22, 45, 15, 41, 46, 16],\n\n // 36\n [6, 151, 121, 14, 152, 122],\n [6, 75, 47, 34, 76, 48],\n [46, 54, 24, 10, 55, 25],\n [2, 45, 15, 64, 46, 16],\n\n // 37\n [17, 152, 122, 4, 153, 123],\n [29, 74, 46, 14, 75, 47],\n [49, 54, 24, 10, 55, 25],\n [24, 45, 15, 46, 46, 16],\n\n // 38\n [4, 152, 122, 18, 153, 123],\n [13, 74, 46, 32, 75, 47],\n [48, 54, 24, 14, 55, 25],\n [42, 45, 15, 32, 46, 16],\n\n // 39\n [20, 147, 117, 4, 148, 118],\n [40, 75, 47, 7, 76, 48],\n [43, 54, 24, 22, 55, 25],\n [10, 45, 15, 67, 46, 16],\n\n // 40\n [19, 148, 118, 6, 149, 119],\n [18, 75, 47, 31, 76, 48],\n [34, 54, 24, 34, 55, 25],\n [20, 45, 15, 61, 46, 16]\n ];\n\n const qrRSBlock = function(totalCount, dataCount) {\n const _this = {};\n _this.totalCount = totalCount;\n _this.dataCount = dataCount;\n return _this;\n };\n\n const _this = {};\n\n const getRsBlockTable = function(typeNumber, errorCorrectionLevel) {\n\n switch(errorCorrectionLevel) {\n case QRErrorCorrectionLevel.L :\n return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];\n case QRErrorCorrectionLevel.M :\n return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];\n case QRErrorCorrectionLevel.Q :\n return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];\n case QRErrorCorrectionLevel.H :\n return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];\n default :\n return undefined;\n }\n };\n\n _this.getRSBlocks = function(typeNumber, errorCorrectionLevel) {\n\n const rsBlock = getRsBlockTable(typeNumber, errorCorrectionLevel);\n\n if (typeof rsBlock == 'undefined') {\n throw 'bad rs block @ typeNumber:' + typeNumber +\n '/errorCorrectionLevel:' + errorCorrectionLevel;\n }\n\n const length = rsBlock.length / 3;\n\n const list = [];\n\n for (let i = 0; i < length; i += 1) {\n\n const count = rsBlock[i * 3 + 0];\n const totalCount = rsBlock[i * 3 + 1];\n const dataCount = rsBlock[i * 3 + 2];\n\n for (let j = 0; j < count; j += 1) {\n list.push(qrRSBlock(totalCount, dataCount) );\n }\n }\n\n return list;\n };\n\n return _this;\n}();\n\n//---------------------------------------------------------------------\n// qrBitBuffer\n//---------------------------------------------------------------------\n\nconst qrBitBuffer = function() {\n\n const _buffer = [];\n let _length = 0;\n\n const _this = {};\n\n _this.getBuffer = function() {\n return _buffer;\n };\n\n _this.getAt = function(index) {\n const bufIndex = Math.floor(index / 8);\n return ( (_buffer[bufIndex] >>> (7 - index % 8) ) & 1) == 1;\n };\n\n _this.put = function(num, length) {\n for (let i = 0; i < length; i += 1) {\n _this.putBit( ( (num >>> (length - i - 1) ) & 1) == 1);\n }\n };\n\n _this.getLengthInBits = function() {\n return _length;\n };\n\n _this.putBit = function(bit) {\n\n const bufIndex = Math.floor(_length / 8);\n if (_buffer.length <= bufIndex) {\n _buffer.push(0);\n }\n\n if (bit) {\n _buffer[bufIndex] |= (0x80 >>> (_length % 8) );\n }\n\n _length += 1;\n };\n\n return _this;\n};\n\n//---------------------------------------------------------------------\n// qrNumber\n//---------------------------------------------------------------------\n\nconst qrNumber = function(data) {\n\n const _mode = QRMode.MODE_NUMBER;\n const _data = data;\n\n const _this = {};\n\n _this.getMode = function() {\n return _mode;\n };\n\n _this.getLength = function(buffer) {\n return _data.length;\n };\n\n _this.write = function(buffer) {\n\n const data = _data;\n\n let i = 0;\n\n while (i + 2 < data.length) {\n buffer.put(strToNum(data.substring(i, i + 3) ), 10);\n i += 3;\n }\n\n if (i < data.length) {\n if (data.length - i == 1) {\n buffer.put(strToNum(data.substring(i, i + 1) ), 4);\n } else if (data.length - i == 2) {\n buffer.put(strToNum(data.substring(i, i + 2) ), 7);\n }\n }\n };\n\n const strToNum = function(s) {\n let num = 0;\n for (let i = 0; i < s.length; i += 1) {\n num = num * 10 + chatToNum(s.charAt(i) );\n }\n return num;\n };\n\n const chatToNum = function(c) {\n if ('0' <= c && c <= '9') {\n return c.charCodeAt(0) - '0'.charCodeAt(0);\n }\n throw 'illegal char :' + c;\n };\n\n return _this;\n};\n\n//---------------------------------------------------------------------\n// qrAlphaNum\n//---------------------------------------------------------------------\n\nconst qrAlphaNum = function(data) {\n\n const _mode = QRMode.MODE_ALPHA_NUM;\n const _data = data;\n\n const _this = {};\n\n _this.getMode = function() {\n return _mode;\n };\n\n _this.getLength = function(buffer) {\n return _data.length;\n };\n\n _this.write = function(buffer) {\n\n const s = _data;\n\n let i = 0;\n\n while (i + 1 < s.length) {\n buffer.put(\n getCode(s.charAt(i) ) * 45 +\n getCode(s.charAt(i + 1) ), 11);\n i += 2;\n }\n\n if (i < s.length) {\n buffer.put(getCode(s.charAt(i) ), 6);\n }\n };\n\n const getCode = function(c) {\n\n if ('0' <= c && c <= '9') {\n return c.charCodeAt(0) - '0'.charCodeAt(0);\n } else if ('A' <= c && c <= 'Z') {\n return c.charCodeAt(0) - 'A'.charCodeAt(0) + 10;\n } else {\n switch (c) {\n case '\\u0020' : return 36;\n case '$' : return 37;\n case '%' : return 38;\n case '*' : return 39;\n case '+' : return 40;\n case '-' : return 41;\n case '.' : return 42;\n case '/' : return 43;\n case ':' : return 44;\n default :\n throw 'illegal char :' + c;\n }\n }\n };\n\n return _this;\n};\n\n//---------------------------------------------------------------------\n// qr8BitByte\n//---------------------------------------------------------------------\n\nconst qr8BitByte = function(data) {\n\n const _mode = QRMode.MODE_8BIT_BYTE;\n const _data = data;\n const _bytes = qrcode.stringToBytes(data);\n\n const _this = {};\n\n _this.getMode = function() {\n return _mode;\n };\n\n _this.getLength = function(buffer) {\n return _bytes.length;\n };\n\n _this.write = function(buffer) {\n for (let i = 0; i < _bytes.length; i += 1) {\n buffer.put(_bytes[i], 8);\n }\n };\n\n return _this;\n};\n\n//---------------------------------------------------------------------\n// qrKanji\n//---------------------------------------------------------------------\n\nconst qrKanji = function(data) {\n\n const _mode = QRMode.MODE_KANJI;\n const _data = data;\n\n const stringToBytes = qrcode.stringToBytes;\n !function(c, code) {\n // self test for sjis support.\n const test = stringToBytes(c);\n if (test.length != 2 || ( (test[0] << 8) | test[1]) != code) {\n throw 'sjis not supported.';\n }\n }('\\u53cb', 0x9746);\n\n const _bytes = stringToBytes(data);\n\n const _this = {};\n\n _this.getMode = function() {\n return _mode;\n };\n\n _this.getLength = function(buffer) {\n return ~~(_bytes.length / 2);\n };\n\n _this.write = function(buffer) {\n\n const data = _bytes;\n\n let i = 0;\n\n while (i + 1 < data.length) {\n\n let c = ( (0xff & data[i]) << 8) | (0xff & data[i + 1]);\n\n if (0x8140 <= c && c <= 0x9FFC) {\n c -= 0x8140;\n } else if (0xE040 <= c && c <= 0xEBBF) {\n c -= 0xC140;\n } else {\n throw 'illegal char at ' + (i + 1) + '/' + c;\n }\n\n c = ( (c >>> 8) & 0xff) * 0xC0 + (c & 0xff);\n\n buffer.put(c, 13);\n\n i += 2;\n }\n\n if (i < data.length) {\n throw 'illegal char at ' + (i + 1);\n }\n };\n\n return _this;\n};\n\n//=====================================================================\n// GIF Support etc.\n//\n\n//---------------------------------------------------------------------\n// byteArrayOutputStream\n//---------------------------------------------------------------------\n\nconst byteArrayOutputStream = function() {\n\n const _bytes = [];\n\n const _this = {};\n\n _this.writeByte = function(b) {\n _bytes.push(b & 0xff);\n };\n\n _this.writeShort = function(i) {\n _this.writeByte(i);\n _this.writeByte(i >>> 8);\n };\n\n _this.writeBytes = function(b, off, len) {\n off = off || 0;\n len = len || b.length;\n for (let i = 0; i < len; i += 1) {\n _this.writeByte(b[i + off]);\n }\n };\n\n _this.writeString = function(s) {\n for (let i = 0; i < s.length; i += 1) {\n _this.writeByte(s.charCodeAt(i) );\n }\n };\n\n _this.toByteArray = function() {\n return _bytes;\n };\n\n _this.toString = function() {\n let s = '';\n s += '[';\n for (let i = 0; i < _bytes.length; i += 1) {\n if (i > 0) {\n s += ',';\n }\n s += _bytes[i];\n }\n s += ']';\n return s;\n };\n\n return _this;\n};\n\n//---------------------------------------------------------------------\n// base64EncodeOutputStream\n//---------------------------------------------------------------------\n\nconst base64EncodeOutputStream = function() {\n\n let _buffer = 0;\n let _buflen = 0;\n let _length = 0;\n let _base64 = '';\n\n const _this = {};\n\n const writeEncoded = function(b) {\n _base64 += String.fromCharCode(encode(b & 0x3f) );\n };\n\n const encode = function(n) {\n if (n < 0) {\n throw 'n:' + n;\n } else if (n < 26) {\n return 0x41 + n;\n } else if (n < 52) {\n return 0x61 + (n - 26);\n } else if (n < 62) {\n return 0x30 + (n - 52);\n } else if (n == 62) {\n return 0x2b;\n } else if (n == 63) {\n return 0x2f;\n } else {\n throw 'n:' + n;\n }\n };\n\n _this.writeByte = function(n) {\n\n _buffer = (_buffer << 8) | (n & 0xff);\n _buflen += 8;\n _length += 1;\n\n while (_buflen >= 6) {\n writeEncoded(_buffer >>> (_buflen - 6) );\n _buflen -= 6;\n }\n };\n\n _this.flush = function() {\n\n if (_buflen > 0) {\n writeEncoded(_buffer << (6 - _buflen) );\n _buffer = 0;\n _buflen = 0;\n }\n\n if (_length % 3 != 0) {\n // padding\n const padlen = 3 - _length % 3;\n for (let i = 0; i < padlen; i += 1) {\n _base64 += '=';\n }\n }\n };\n\n _this.toString = function() {\n return _base64;\n };\n\n return _this;\n};\n\n//---------------------------------------------------------------------\n// base64DecodeInputStream\n//---------------------------------------------------------------------\n\nconst base64DecodeInputStream = function(str) {\n\n const _str = str;\n let _pos = 0;\n let _buffer = 0;\n let _buflen = 0;\n\n const _this = {};\n\n _this.read = function() {\n\n while (_buflen < 8) {\n\n if (_pos >= _str.length) {\n if (_buflen == 0) {\n return -1;\n }\n throw 'unexpected end of file./' + _buflen;\n }\n\n const c = _str.charAt(_pos);\n _pos += 1;\n\n if (c == '=') {\n _buflen = 0;\n return -1;\n } else if (c.match(/^\\s$/) ) {\n // ignore if whitespace.\n continue;\n }\n\n _buffer = (_buffer << 6) | decode(c.charCodeAt(0) );\n _buflen += 6;\n }\n\n const n = (_buffer >>> (_buflen - 8) ) & 0xff;\n _buflen -= 8;\n return n;\n };\n\n const decode = function(c) {\n if (0x41 <= c && c <= 0x5a) {\n return c - 0x41;\n } else if (0x61 <= c && c <= 0x7a) {\n return c - 0x61 + 26;\n } else if (0x30 <= c && c <= 0x39) {\n return c - 0x30 + 52;\n } else if (c == 0x2b) {\n return 62;\n } else if (c == 0x2f) {\n return 63;\n } else {\n throw 'c:' + c;\n }\n };\n\n return _this;\n};\n\n//---------------------------------------------------------------------\n// gifImage (B/W)\n//---------------------------------------------------------------------\n\nconst gifImage = function(width, height) {\n\n const _width = width;\n const _height = height;\n const _data = new Array(width * height);\n\n const _this = {};\n\n _this.setPixel = function(x, y, pixel) {\n _data[y * _width + x] = pixel;\n };\n\n _this.write = function(out) {\n\n //---------------------------------\n // GIF Signature\n\n out.writeString('GIF87a');\n\n //---------------------------------\n // Screen Descriptor\n\n out.writeShort(_width);\n out.writeShort(_height);\n\n out.writeByte(0x80); // 2bit\n out.writeByte(0);\n out.writeByte(0);\n\n //---------------------------------\n // Global Color Map\n\n // black\n out.writeByte(0x00);\n out.writeByte(0x00);\n out.writeByte(0x00);\n\n // white\n out.writeByte(0xff);\n out.writeByte(0xff);\n out.writeByte(0xff);\n\n //---------------------------------\n // Image Descriptor\n\n out.writeString(',');\n out.writeShort(0);\n out.writeShort(0);\n out.writeShort(_width);\n out.writeShort(_height);\n out.writeByte(0);\n\n //---------------------------------\n // Local Color Map\n\n //---------------------------------\n // Raster Data\n\n const lzwMinCodeSize = 2;\n const raster = getLZWRaster(lzwMinCodeSize);\n\n out.writeByte(lzwMinCodeSize);\n\n let offset = 0;\n\n while (raster.length - offset > 255) {\n out.writeByte(255);\n out.writeBytes(raster, offset, 255);\n offset += 255;\n }\n\n out.writeByte(raster.length - offset);\n out.writeBytes(raster, offset, raster.length - offset);\n out.writeByte(0x00);\n\n //---------------------------------\n // GIF Terminator\n out.writeString(';');\n };\n\n const bitOutputStream = function(out) {\n\n const _out = out;\n let _bitLength = 0;\n let _bitBuffer = 0;\n\n const _this = {};\n\n _this.write = function(data, length) {\n\n if ( (data >>> length) != 0) {\n throw 'length over';\n }\n\n while (_bitLength + length >= 8) {\n _out.writeByte(0xff & ( (data << _bitLength) | _bitBuffer) );\n length -= (8 - _bitLength);\n data >>>= (8 - _bitLength);\n _bitBuffer = 0;\n _bitLength = 0;\n }\n\n _bitBuffer = (data << _bitLength) | _bitBuffer;\n _bitLength = _bitLength + length;\n };\n\n _this.flush = function() {\n if (_bitLength > 0) {\n _out.writeByte(_bitBuffer);\n }\n };\n\n return _this;\n };\n\n const getLZWRaster = function(lzwMinCodeSize) {\n\n const clearCode = 1 << lzwMinCodeSize;\n const endCode = (1 << lzwMinCodeSize) + 1;\n let bitLength = lzwMinCodeSize + 1;\n\n // Setup LZWTable\n const table = lzwTable();\n\n for (let i = 0; i < clearCode; i += 1) {\n table.add(String.fromCharCode(i) );\n }\n table.add(String.fromCharCode(clearCode) );\n table.add(String.fromCharCode(endCode) );\n\n const byteOut = byteArrayOutputStream();\n const bitOut = bitOutputStream(byteOut);\n\n // clear code\n bitOut.write(clearCode, bitLength);\n\n let dataIndex = 0;\n\n let s = String.fromCharCode(_data[dataIndex]);\n dataIndex += 1;\n\n while (dataIndex < _data.length) {\n\n const c = String.fromCharCode(_data[dataIndex]);\n dataIndex += 1;\n\n if (table.contains(s + c) ) {\n\n s = s + c;\n\n } else {\n\n bitOut.write(table.indexOf(s), bitLength);\n\n if (table.size() < 0xfff) {\n\n if (table.size() == (1 << bitLength) ) {\n bitLength += 1;\n }\n\n table.add(s + c);\n }\n\n s = c;\n }\n }\n\n bitOut.write(table.indexOf(s), bitLength);\n\n // end code\n bitOut.write(endCode, bitLength);\n\n bitOut.flush();\n\n return byteOut.toByteArray();\n };\n\n const lzwTable = function() {\n\n const _map = {};\n let _size = 0;\n\n const _this = {};\n\n _this.add = function(key) {\n if (_this.contains(key) ) {\n throw 'dup key:' + key;\n }\n _map[key] = _size;\n _size += 1;\n };\n\n _this.size = function() {\n return _size;\n };\n\n _this.indexOf = function(key) {\n return _map[key];\n };\n\n _this.contains = function(key) {\n return typeof _map[key] != 'undefined';\n };\n\n return _this;\n };\n\n return _this;\n};\n\nconst createDataURL = function(width, height, getPixel) {\n const gif = gifImage(width, height);\n for (let y = 0; y < height; y += 1) {\n for (let x = 0; x < width; x += 1) {\n gif.setPixel(x, y, getPixel(x, y) );\n }\n }\n\n const b = byteArrayOutputStream();\n gif.write(b);\n\n const base64 = base64EncodeOutputStream();\n const bytes = b.toByteArray();\n for (let i = 0; i < bytes.length; i += 1) {\n base64.writeByte(bytes[i]);\n }\n base64.flush();\n\n return 'data:image/gif;base64,' + base64;\n};\n\nexport default qrcode;\n\nexport const stringToBytes = qrcode.stringToBytes;\n","import QRCodeGenerator from 'qrcode-generator';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst XLINK_NS = 'http://www.w3.org/1999/xlink';\n\nexport interface QrSvgOptions {\n size: number;\n logoUrl?: string;\n /** 0-0.3 arası — `H` (en yüksek, ~%30 toleranslı) hata düzeltme seviyesiyle bile daha büyük değerler taranabilirliği bozabilir. */\n logoScale: number;\n}\n\n/** data'yı QR SVG'sine çizer (DOM API ile). */\nexport function buildQrSvg(data: string, opts: QrSvgOptions): SVGSVGElement {\n const qr = QRCodeGenerator(0, opts.logoUrl ? 'H' : 'M');\n qr.addData(data);\n qr.make();\n\n const count = qr.getModuleCount();\n const cell = opts.size / count;\n\n const svg = document.createElementNS(SVG_NS, 'svg');\n svg.setAttribute('viewBox', `0 0 ${opts.size} ${opts.size}`);\n svg.setAttribute('width', String(opts.size));\n svg.setAttribute('height', String(opts.size));\n\n const bg = document.createElementNS(SVG_NS, 'rect');\n bg.setAttribute('width', '100%');\n bg.setAttribute('height', '100%');\n bg.setAttribute('fill', '#fff');\n svg.appendChild(bg);\n\n const modules = document.createElementNS(SVG_NS, 'g');\n modules.setAttribute('fill', '#000');\n for (let row = 0; row < count; row++) {\n for (let col = 0; col < count; col++) {\n if (!qr.isDark(row, col)) continue;\n const rect = document.createElementNS(SVG_NS, 'rect');\n rect.setAttribute('x', String(col * cell));\n rect.setAttribute('y', String(row * cell));\n rect.setAttribute('width', String(cell));\n rect.setAttribute('height', String(cell));\n modules.appendChild(rect);\n }\n }\n svg.appendChild(modules);\n\n if (opts.logoUrl) {\n const logoSize = opts.size * opts.logoScale;\n const pad = logoSize * 0.18;\n const backSize = logoSize + pad * 2;\n const backXY = (opts.size - backSize) / 2;\n const logoXY = (opts.size - logoSize) / 2;\n\n const back = document.createElementNS(SVG_NS, 'rect');\n back.setAttribute('x', String(backXY));\n back.setAttribute('y', String(backXY));\n back.setAttribute('width', String(backSize));\n back.setAttribute('height', String(backSize));\n back.setAttribute('rx', String(backSize * 0.22));\n back.setAttribute('fill', '#fff');\n svg.appendChild(back);\n\n const img = document.createElementNS(SVG_NS, 'image');\n img.setAttribute('href', opts.logoUrl);\n // Eski Safari sürümleri `href`i değil yalnızca `xlink:href`i anlıyor.\n img.setAttributeNS(XLINK_NS, 'xlink:href', opts.logoUrl);\n img.setAttribute('x', String(logoXY));\n img.setAttribute('y', String(logoXY));\n img.setAttribute('width', String(logoSize));\n img.setAttribute('height', String(logoSize));\n img.setAttribute('preserveAspectRatio', 'xMidYMid meet');\n svg.appendChild(img);\n }\n\n return svg;\n}\n","import type { QrResumeOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { buildQrSvg } from './qrSvg';\n\nexport interface QrResumePlayerContext {\n videoEl: HTMLVideoElement;\n overlayContainerEl: HTMLElement;\n i18n: HopeLocaleStrings;\n}\n\nconst STORAGE_KEY = 'hope-qr-resume-dismissed';\n\n/** Yeterince izlenmiş bir noktada duraklatılınca \"telefonundan devam et\" QR kodu. */\nexport class QrResume {\n private wrapper: HTMLElement | null = null;\n private seeking = false;\n private seekTimeout: ReturnType<typeof setTimeout> | null = null;\n private pauseTimeout: ReturnType<typeof setTimeout> | null = null;\n private readonly paramName: string;\n\n constructor(\n private readonly ctx: QrResumePlayerContext,\n private readonly options: QrResumeOptions\n ) {\n this.paramName = options.paramName ?? 'vtime';\n\n this.applyResumeFromUrl();\n\n ctx.videoEl.addEventListener('play', this.onPlay);\n ctx.videoEl.addEventListener('ended', this.onPlay);\n ctx.videoEl.addEventListener('seeking', this.onSeeking);\n ctx.videoEl.addEventListener('seeked', this.onSeeked);\n ctx.videoEl.addEventListener('pause', this.onPause);\n }\n\n /** Dışarıdan (ör. entegratörün kendi \"telefonuna gönder\" butonu, ya da docs demo'sundaki test butonu) manuel olarak göstermek için — \"kaldığın yerden devam et\" otomatik tetiklenme kuralları (minElapsed/minRemaining) BURADA uygulanmaz, çağıran taraf bilinçli olarak gösteriyor demektir. */\n show(): void {\n this.create();\n }\n\n hide(): void {\n this.remove();\n }\n\n /** Ayarlar menüsündeki aç/kapa satırı — \"Bir daha gösterme\" sonrası tekrar açılabilsin. */\n isEnabled(): boolean {\n return !this.isDismissedForever();\n }\n\n setEnabled(enabled: boolean): void {\n this.setDismissedForever(!enabled);\n }\n\n /** Ekran her gösterimde sıfırdan oluşturuluyor ve güncel `ctx.i18n`'i okuyor — RedirectScreen'deki AYNI desen. */\n refreshLabels(): void {\n /* no-op */\n }\n\n destroy(): void {\n this.ctx.videoEl.removeEventListener('play', this.onPlay);\n this.ctx.videoEl.removeEventListener('ended', this.onPlay);\n this.ctx.videoEl.removeEventListener('seeking', this.onSeeking);\n this.ctx.videoEl.removeEventListener('seeked', this.onSeeked);\n this.ctx.videoEl.removeEventListener('pause', this.onPause);\n if (this.seekTimeout) clearTimeout(this.seekTimeout);\n if (this.pauseTimeout) clearTimeout(this.pauseTimeout);\n this.remove();\n }\n\n private isDismissedForever(): boolean {\n if (this.options.rememberDismiss === false) return false;\n try {\n return window.localStorage.getItem(STORAGE_KEY) === '1';\n } catch {\n return false;\n }\n }\n\n private setDismissedForever(value: boolean): void {\n try {\n window.localStorage.setItem(STORAGE_KEY, value ? '1' : '0');\n } catch {\n /* gizli mod vb. — sessizce yoksay */\n }\n }\n\n private buildResumeUrl(time: number): string {\n const url = new URL(window.location.href);\n url.searchParams.set(this.paramName, String(Math.floor(time)));\n return url.toString();\n }\n\n private applyResumeFromUrl(): void {\n const url = new URL(window.location.href);\n const raw = url.searchParams.get(this.paramName);\n if (raw === null || !/^\\d+$/.test(raw)) return;\n\n const seconds = Number(raw);\n const seekOnceReady = () => {\n this.ctx.videoEl.currentTime = seconds;\n };\n if (this.ctx.videoEl.readyState >= 1) seekOnceReady();\n else this.ctx.videoEl.addEventListener('loadedmetadata', seekOnceReady, { once: true });\n\n url.searchParams.delete(this.paramName);\n window.history.replaceState(window.history.state, '', url.toString());\n }\n\n private readonly onPlay = (): void => this.remove();\n\n private readonly onSeeking = (): void => {\n this.seeking = true;\n if (this.seekTimeout) clearTimeout(this.seekTimeout);\n this.seekTimeout = setTimeout(() => {\n this.seeking = false;\n }, 150);\n };\n\n private readonly onSeeked = (): void => {\n if (this.seekTimeout) clearTimeout(this.seekTimeout);\n this.seeking = false;\n };\n\n private readonly onPause = (): void => {\n if (this.isDismissedForever()) return;\n const { currentTime, duration } = this.ctx.videoEl;\n const minElapsed = this.options.minElapsed ?? 60;\n const minRemaining = this.options.minRemaining ?? 60;\n if (!(duration - currentTime > minRemaining && currentTime > minElapsed)) return;\n\n // Eski koddaki AYNI kısa gecikme — 'seeking' sırasında da anlık bir\n // 'pause' tetiklenebiliyor (scrub), bu ekranın yanlışlıkla\n // belirmesini önlüyor.\n if (this.pauseTimeout) clearTimeout(this.pauseTimeout);\n this.pauseTimeout = setTimeout(() => {\n if (!this.seeking && this.ctx.videoEl.paused) this.create();\n }, 150);\n };\n\n private remove(): void {\n this.wrapper?.remove();\n this.wrapper = null;\n }\n\n private create(): void {\n this.remove();\n const size = this.options.size ?? 220;\n const url = this.buildResumeUrl(this.ctx.videoEl.currentTime);\n\n const wrapper = document.createElement('div');\n wrapper.setAttribute('part', 'qr-resume-screen');\n wrapper.className =\n 'hp:absolute hp:inset-0 hp:z-30 hp:flex hp:flex-col hp:items-center hp:justify-center hp:gap-3 hp:bg-black/85 hp:text-white hp:text-center hp:p-4';\n\n const codeWrap = document.createElement('div');\n codeWrap.className = 'hp:rounded-lg hp:overflow-hidden hp:shadow-lg hp:leading-none';\n codeWrap.appendChild(buildQrSvg(url, { size, logoUrl: this.options.logo, logoScale: this.options.logoScale ?? 0.22 }));\n wrapper.appendChild(codeWrap);\n\n const text = document.createElement('div');\n text.className = 'hp:text-sm hp:opacity-90 hp:max-w-xs';\n text.textContent = this.ctx.i18n.qrResumeTitle;\n wrapper.appendChild(text);\n\n const buttons = document.createElement('div');\n buttons.className = 'hp:flex hp:gap-2 hp:mt-1';\n\n const dismissBtn = document.createElement('button');\n dismissBtn.type = 'button';\n dismissBtn.textContent = this.ctx.i18n.qrResumeDontShowAgain;\n dismissBtn.className = 'hp:px-4 hp:py-1.5 hp:rounded hp:bg-white/15 hp:text-white hp:border-0 hp:cursor-pointer hp:text-sm';\n dismissBtn.addEventListener('click', () => {\n this.setDismissedForever(true);\n this.remove();\n });\n\n const continueBtn = document.createElement('button');\n continueBtn.type = 'button';\n continueBtn.textContent = this.ctx.i18n.qrResumeContinue;\n continueBtn.className = 'hp:px-4 hp:py-1.5 hp:rounded hp:bg-accent hp:text-on-accent hp:border-0 hp:cursor-pointer hp:text-sm';\n continueBtn.addEventListener('click', () => {\n this.remove();\n if (this.ctx.videoEl.paused) void this.ctx.videoEl.play();\n });\n\n buttons.append(dismissBtn, continueBtn);\n wrapper.appendChild(buttons);\n\n this.ctx.overlayContainerEl.appendChild(wrapper);\n this.wrapper = wrapper;\n }\n}\n","import { QrResume, type QrResumePlayerContext } from './QrResume';\nimport type { QrResumeOptions } from '../../types';\n\nexport function installQrResume(ctx: QrResumePlayerContext, options: QrResumeOptions): QrResume {\n return new QrResume(ctx, options);\n}\n\nexport { QrResume };\nexport type { QrResumePlayerContext };\n"],"names":["qrcode","typeNumber","errorCorrectionLevel","_typeNumber","_errorCorrectionLevel","QRErrorCorrectionLevel","_modules","_moduleCount","_dataCache","_dataList","_this","makeImpl","test","maskPattern","moduleCount","modules","row","col","setupPositionProbePattern","setupPositionAdjustPattern","setupTimingPattern","setupTypeInfo","setupTypeNumber","createData","mapData","r","c","getBestMaskPattern","minLostPoint","pattern","i","lostPoint","QRUtil","pos","j","bits","mod","data","inc","bitIndex","byteIndex","maskFunc","dark","createBytes","buffer","rsBlocks","offset","maxDcCount","maxEcCount","dcdata","ecdata","dcCount","ecCount","rsPoly","modPoly","qrPolynomial","modIndex","totalCodeCount","index","dataList","QRRSBlock","qrBitBuffer","totalDataCount","mode","newData","qrNumber","qrAlphaNum","qr8BitByte","qrKanji","cellSize","margin","qrHtml","alt","title","opts","size","mc","mr","qrSvg","rect","escapeXml","min","max","createDataURL","x","y","img","s","escaped","_createHalfASCII","r1","r2","p","blocks","blocksLastLineNoMargin","ascii","white","black","line","context","length","bytes","unicodeData","numChars","unicodeMap","bin","base64DecodeInputStream","read","b","count","b0","b1","b2","b3","k","v","unknownChar","QRMode","QRMaskPattern","PATTERN_POSITION_TABLE","G15","G18","G15_MASK","getBCHDigit","digit","d","errorCorrectLength","a","QRMath","type","sameCount","darkCount","ratio","EXP_TABLE","LOG_TABLE","n","num","shift","_num","e","RS_BLOCK_TABLE","qrRSBlock","totalCount","dataCount","getRsBlockTable","rsBlock","list","_buffer","_length","bufIndex","bit","_mode","_data","strToNum","chatToNum","getCode","_bytes","stringToBytes","code","byteArrayOutputStream","off","len","base64EncodeOutputStream","_buflen","_base64","writeEncoded","encode","padlen","str","_str","_pos","decode","gifImage","width","height","_width","_height","pixel","out","lzwMinCodeSize","raster","getLZWRaster","bitOutputStream","_out","_bitLength","_bitBuffer","clearCode","endCode","bitLength","table","lzwTable","byteOut","bitOut","dataIndex","_map","_size","key","getPixel","gif","base64","SVG_NS","XLINK_NS","buildQrSvg","qr","QRCodeGenerator","cell","svg","bg","logoSize","pad","backSize","backXY","logoXY","back","STORAGE_KEY","QrResume","ctx","options","__publicField","currentTime","duration","minElapsed","minRemaining","enabled","value","time","url","raw","seconds","seekOnceReady","_a","wrapper","codeWrap","text","buttons","dismissBtn","continueBtn","installQrResume"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-DXWK4EFa.js","sources":["../../src/plugins/dubbing/Dubbing.ts","../../src/plugins/dubbing/index.ts"],"sourcesContent":["import type { SettingsSubmenuDef } from '../../controls/SettingsMenu';\nimport type { DubbingOptions, DubbingTrack } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\n\nexport interface DubbingPlayerContext {\n videoEl: HTMLVideoElement;\n loadSource(src: string, type?: string): Promise<void>;\n registerSubmenu(def: SettingsSubmenuDef): void;\n unregisterSubmenu(key: string): void;\n i18n: HopeLocaleStrings;\n}\n\nconst SUBMENU_KEY = 'dubbing';\n\nfunction dubLangCode(track: DubbingTrack): string {\n return (track.srclang || track.label || '').toUpperCase().slice(0, 3);\n}\n\n/** Ayarlar menüsüne \"Ses/Dil\" alt menüsü ekler (registerSubmenu). */\nexport class Dubbing {\n private activeIndex: number;\n\n constructor(\n private readonly ctx: DubbingPlayerContext,\n private readonly options: DubbingOptions\n ) {\n const defaultIdx = options.tracks.findIndex((t) => t.default);\n this.activeIndex = defaultIdx >= 0 ? defaultIdx : 0;\n\n this.registerMenu();\n }\n\n /** Dil sonradan değişince başlığı güncel `ctx.i18n.dubbingTitle`'la yeniden kaydeder — `registerSubmenu` aynı key'i replace eder. */\n refreshLabels(): void {\n this.registerMenu();\n }\n\n private registerMenu(): void {\n this.ctx.registerSubmenu({\n key: SUBMENU_KEY,\n title: this.ctx.i18n.dubbingTitle,\n getValueLabel: () => dubLangCode(this.options.tracks[this.activeIndex]!),\n getItems: () =>\n this.options.tracks.map((track, i) => ({\n label: track.label,\n active: i === this.activeIndex,\n onSelect: () => this.select(i),\n })),\n });\n }\n\n destroy(): void {\n this.ctx.unregisterSubmenu(SUBMENU_KEY);\n }\n\n private select(index: number): void {\n if (index === this.activeIndex) return;\n const track = this.options.tracks[index];\n if (!track) return;\n\n const resumeTime = this.ctx.videoEl.currentTime;\n const wasPlaying = !this.ctx.videoEl.paused;\n this.activeIndex = index;\n\n void this.ctx.loadSource(track.src, track.type).then(() => {\n this.ctx.videoEl.currentTime = resumeTime;\n if (wasPlaying) void this.ctx.videoEl.play().catch(() => {});\n });\n }\n}\n","import { Dubbing, type DubbingPlayerContext } from './Dubbing';\nimport type { DubbingOptions } from '../../types';\n\nexport function installDubbing(ctx: DubbingPlayerContext, options: DubbingOptions): Dubbing {\n return new Dubbing(ctx, options);\n}\n\nexport { Dubbing };\nexport type { DubbingPlayerContext };\n"],"names":["SUBMENU_KEY","dubLangCode","track","Dubbing","ctx","options","__publicField","defaultIdx","t","i","index","resumeTime","wasPlaying","installDubbing"],"mappings":";;;AAYA,MAAMA,IAAc;AAEpB,SAASC,EAAYC,GAA6B;AAC9C,UAAQA,EAAM,WAAWA,EAAM,SAAS,IAAI,cAAc,MAAM,GAAG,CAAC;AACxE;AAGO,MAAMC,EAAQ;AAAA,EAGjB,YACqBC,GACAC,GACnB;AALM,IAAAC,EAAA;AAGa,SAAA,MAAAF,GACA,KAAA,UAAAC;AAEjB,UAAME,IAAaF,EAAQ,OAAO,UAAU,CAACG,MAAMA,EAAE,OAAO;AAC5D,SAAK,cAAcD,KAAc,IAAIA,IAAa,GAElD,KAAK,aAAA;AAAA,EACT;AAAA;AAAA,EAGA,gBAAsB;AAClB,SAAK,aAAA;AAAA,EACT;AAAA,EAEQ,eAAqB;AACzB,SAAK,IAAI,gBAAgB;AAAA,MACrB,KAAKP;AAAA,MACL,OAAO,KAAK,IAAI,KAAK;AAAA,MACrB,eAAe,MAAMC,EAAY,KAAK,QAAQ,OAAO,KAAK,WAAW,CAAE;AAAA,MACvE,UAAU,MACN,KAAK,QAAQ,OAAO,IAAI,CAACC,GAAOO,OAAO;AAAA,QACnC,OAAOP,EAAM;AAAA,QACb,QAAQO,MAAM,KAAK;AAAA,QACnB,UAAU,MAAM,KAAK,OAAOA,CAAC;AAAA,MAAA,EAC/B;AAAA,IAAA,CACT;AAAA,EACL;AAAA,EAEA,UAAgB;AACZ,SAAK,IAAI,kBAAkBT,CAAW;AAAA,EAC1C;AAAA,EAEQ,OAAOU,GAAqB;AAChC,QAAIA,MAAU,KAAK,YAAa;AAChC,UAAMR,IAAQ,KAAK,QAAQ,OAAOQ,CAAK;AACvC,QAAI,CAACR,EAAO;AAEZ,UAAMS,IAAa,KAAK,IAAI,QAAQ,aAC9BC,IAAa,CAAC,KAAK,IAAI,QAAQ;AACrC,SAAK,cAAcF,GAEd,KAAK,IAAI,WAAWR,EAAM,KAAKA,EAAM,IAAI,EAAE,KAAK,MAAM;AACvD,WAAK,IAAI,QAAQ,cAAcS,GAC3BC,KAAiB,KAAK,IAAI,QAAQ,KAAA,EAAO,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAC/D,CAAC;AAAA,EACL;AACJ;AClEO,SAASC,EAAeT,GAA2BC,GAAkC;AACxF,SAAO,IAAIF,EAAQC,GAAKC,CAAO;AACnC;"}