@hopeplayer/core 1.5.0 → 1.6.0

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 (105) hide show
  1. package/dist/HopePlayerElement.d.ts +24 -0
  2. package/dist/HopePlayerElement.d.ts.map +1 -1
  3. package/dist/chunks/adTriggers-BIAWe8o4.js +419 -0
  4. package/dist/chunks/adTriggers-BIAWe8o4.js.map +1 -0
  5. package/dist/chunks/{ads-C4tDPsUs.js → ads-DlpHPpR9.js} +2 -2
  6. package/dist/chunks/{ads-C4tDPsUs.js.map → ads-DlpHPpR9.js.map} +1 -1
  7. package/dist/chunks/{cast-Baxvu76A.js → cast-vHyi7oV_.js} +2 -2
  8. package/dist/chunks/{cast-Baxvu76A.js.map → cast-vHyi7oV_.js.map} +1 -1
  9. package/dist/chunks/docPip-wybMVP1H.js +82 -0
  10. package/dist/chunks/docPip-wybMVP1H.js.map +1 -0
  11. package/dist/chunks/heatmap-Bb7neaYU.js +92 -0
  12. package/dist/chunks/heatmap-Bb7neaYU.js.map +1 -0
  13. package/dist/chunks/{history-CvydU0aN.js → history-CwqLXiZi.js} +2 -2
  14. package/dist/chunks/{history-CvydU0aN.js.map → history-CwqLXiZi.js.map} +1 -1
  15. package/dist/chunks/interactive-CgltIneu.js +189 -0
  16. package/dist/chunks/interactive-CgltIneu.js.map +1 -0
  17. package/dist/chunks/{loopSection-CvF4l5uf.js → loopSection-Bwk4W8vz.js} +16 -16
  18. package/dist/chunks/loopSection-Bwk4W8vz.js.map +1 -0
  19. package/dist/chunks/{markers-Dr4-CCxE.js → markers-L69W3kj6.js} +53 -51
  20. package/dist/chunks/markers-L69W3kj6.js.map +1 -0
  21. package/dist/chunks/{player-DV4Hf5Cw.js → player-D2_HRzot.js} +1382 -1158
  22. package/dist/chunks/player-D2_HRzot.js.map +1 -0
  23. package/dist/chunks/{playlist-DJsdK6xm.js → playlist-CHfStNbQ.js} +2 -2
  24. package/dist/chunks/{playlist-DJsdK6xm.js.map → playlist-CHfStNbQ.js.map} +1 -1
  25. package/dist/chunks/plugin-style-CPJELe-i.js +17 -0
  26. package/dist/chunks/plugin-style-CPJELe-i.js.map +1 -0
  27. package/dist/chunks/{pluginHost-GxNfyP5E.js → pluginHost-cN2uGFeG.js} +2 -2
  28. package/dist/chunks/{pluginHost-GxNfyP5E.js.map → pluginHost-cN2uGFeG.js.map} +1 -1
  29. package/dist/chunks/redirectScreen-TIqLdvBY.js +239 -0
  30. package/dist/chunks/redirectScreen-TIqLdvBY.js.map +1 -0
  31. package/dist/chunks/{rewardedUnlock-jFOdzfSq.js → rewardedUnlock-DUqYwXTr.js} +2 -2
  32. package/dist/chunks/{rewardedUnlock-jFOdzfSq.js.map → rewardedUnlock-DUqYwXTr.js.map} +1 -1
  33. package/dist/chunks/segments-Ds-c1b5e.js +66 -0
  34. package/dist/chunks/segments-Ds-c1b5e.js.map +1 -0
  35. package/dist/chunks/{skipSegments-vJMhdiJn.js → skipSegments-ByNoF1qZ.js} +2 -2
  36. package/dist/chunks/{skipSegments-vJMhdiJn.js.map → skipSegments-ByNoF1qZ.js.map} +1 -1
  37. package/dist/chunks/{spriteThumbnails-BoxVY--_.js → spriteThumbnails-Cr9UmkM9.js} +28 -28
  38. package/dist/chunks/spriteThumbnails-Cr9UmkM9.js.map +1 -0
  39. package/dist/chunks/{sticky-D_eLCNFk.js → sticky-BDStzjBM.js} +27 -26
  40. package/dist/chunks/sticky-BDStzjBM.js.map +1 -0
  41. package/dist/chunks/{story-BRkhSDhR.js → story-CodA2dfn.js} +2 -2
  42. package/dist/chunks/{story-BRkhSDhR.js.map → story-CodA2dfn.js.map} +1 -1
  43. package/dist/chunks/transcript-LG7E9UYE.js +186 -0
  44. package/dist/chunks/transcript-LG7E9UYE.js.map +1 -0
  45. package/dist/controls/ContextMenu.d.ts +1 -0
  46. package/dist/controls/ContextMenu.d.ts.map +1 -1
  47. package/dist/controls/ControlBar.d.ts +6 -0
  48. package/dist/controls/ControlBar.d.ts.map +1 -1
  49. package/dist/controls/SeekBar.d.ts +5 -2
  50. package/dist/controls/SeekBar.d.ts.map +1 -1
  51. package/dist/controls/SettingsMenu.d.ts +2 -1
  52. package/dist/controls/SettingsMenu.d.ts.map +1 -1
  53. package/dist/hope-player.js +1 -1
  54. package/dist/i18n/locales/en.d.ts.map +1 -1
  55. package/dist/i18n/locales/tr.d.ts.map +1 -1
  56. package/dist/i18n/types.d.ts +25 -0
  57. package/dist/i18n/types.d.ts.map +1 -1
  58. package/dist/index.d.ts +1 -1
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/plugins/ad-triggers/AdTriggers.d.ts +5 -0
  61. package/dist/plugins/ad-triggers/AdTriggers.d.ts.map +1 -1
  62. package/dist/plugins/doc-pip/DocumentPip.d.ts +44 -0
  63. package/dist/plugins/doc-pip/DocumentPip.d.ts.map +1 -0
  64. package/dist/plugins/doc-pip/index.d.ts +5 -0
  65. package/dist/plugins/doc-pip/index.d.ts.map +1 -0
  66. package/dist/plugins/heatmap/Heatmap.d.ts +36 -0
  67. package/dist/plugins/heatmap/Heatmap.d.ts.map +1 -0
  68. package/dist/plugins/heatmap/index.d.ts +6 -0
  69. package/dist/plugins/heatmap/index.d.ts.map +1 -0
  70. package/dist/plugins/interactive/Interactive.d.ts +45 -0
  71. package/dist/plugins/interactive/Interactive.d.ts.map +1 -0
  72. package/dist/plugins/interactive/index.d.ts +6 -0
  73. package/dist/plugins/interactive/index.d.ts.map +1 -0
  74. package/dist/plugins/markers/MarkProgress.d.ts +3 -1
  75. package/dist/plugins/markers/MarkProgress.d.ts.map +1 -1
  76. package/dist/plugins/redirect-screen/RedirectScreen.d.ts +3 -1
  77. package/dist/plugins/redirect-screen/RedirectScreen.d.ts.map +1 -1
  78. package/dist/plugins/segments/Segments.d.ts +1 -0
  79. package/dist/plugins/segments/Segments.d.ts.map +1 -1
  80. package/dist/plugins/sprite-thumbnails/SpriteThumbnails.d.ts +1 -0
  81. package/dist/plugins/sprite-thumbnails/SpriteThumbnails.d.ts.map +1 -1
  82. package/dist/plugins/sticky/StickyManager.d.ts +2 -0
  83. package/dist/plugins/sticky/StickyManager.d.ts.map +1 -1
  84. package/dist/plugins/transcript/Transcript.d.ts +65 -0
  85. package/dist/plugins/transcript/Transcript.d.ts.map +1 -0
  86. package/dist/plugins/transcript/index.d.ts +6 -0
  87. package/dist/plugins/transcript/index.d.ts.map +1 -0
  88. package/dist/subtitles/attachTracks.d.ts +6 -0
  89. package/dist/subtitles/attachTracks.d.ts.map +1 -1
  90. package/dist/types/index.d.ts +164 -12
  91. package/dist/types/index.d.ts.map +1 -1
  92. package/dist/utils/plugin-style.d.ts +5 -0
  93. package/dist/utils/plugin-style.d.ts.map +1 -0
  94. package/package.json +1 -1
  95. package/dist/chunks/adTriggers-DXmtF4t2.js +0 -410
  96. package/dist/chunks/adTriggers-DXmtF4t2.js.map +0 -1
  97. package/dist/chunks/loopSection-CvF4l5uf.js.map +0 -1
  98. package/dist/chunks/markers-Dr4-CCxE.js.map +0 -1
  99. package/dist/chunks/player-DV4Hf5Cw.js.map +0 -1
  100. package/dist/chunks/redirectScreen-BT_26-5g.js +0 -208
  101. package/dist/chunks/redirectScreen-BT_26-5g.js.map +0 -1
  102. package/dist/chunks/segments--hl_QVrI.js +0 -63
  103. package/dist/chunks/segments--hl_QVrI.js.map +0 -1
  104. package/dist/chunks/spriteThumbnails-BoxVY--_.js.map +0 -1
  105. package/dist/chunks/sticky-D_eLCNFk.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  var A = Object.defineProperty;
2
2
  var g = (l, t, e) => t in l ? A(l, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : l[t] = e;
3
3
  var n = (l, t, e) => g(l, typeof t != "symbol" ? t + "" : t, e);
4
- import { i as b, c as P } from "./player-DV4Hf5Cw.js";
4
+ import { i as b, c as P } from "./player-D2_HRzot.js";
5
5
  const I = {
6
6
  startMode: "after_current",
7
7
  startIndex: 0,
@@ -241,4 +241,4 @@ export {
241
241
  w as PlaylistRunner,
242
242
  N as installPlaylist
243
243
  };
244
- //# sourceMappingURL=playlist-DJsdK6xm.js.map
244
+ //# sourceMappingURL=playlist-CHfStNbQ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"playlist-DJsdK6xm.js","sources":["../../src/plugins/playlist/PlaylistRunner.ts","../../src/plugins/playlist/index.ts"],"sourcesContent":["import { createIcon } from '../../icons/Icon';\nimport type { PlayableItem, PlaylistOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { isAudioOutputError } from '../../utils/media-error';\n\nexport interface PlaylistPlayerContext {\n videoEl: HTMLVideoElement;\n hostEl: HTMLElement;\n /** Liste UI'ının monte edileceği, shadow root içindeki panel. */\n panelEl: HTMLElement;\n loadSource(src: string, type?: string): Promise<void>;\n setPoster(url: string): void;\n /** AdsController varsa retry/VMAP durumunu sıfırlayıp item'ın (varsa) kendi adTagPreroll'üyle yeniden reklam ister — yoksa no-op. */\n requestFreshAd(prerollTag?: string): void;\n /** Postroll sürüyorsa sonraki öğe `hp:adend`'i bekler. */\n isAdActive?(): boolean;\n i18n: HopeLocaleStrings;\n}\n\ntype SourceMode = 'hls' | 'mp4';\n\ninterface Attempt {\n id: number;\n index: number;\n mode: SourceMode;\n tried: Set<SourceMode>;\n mp4Index: number;\n}\n\nconst DEFAULTS: Required<Omit<PlaylistOptions, 'items' | 'adTagPreroll' | 'ui'>> = {\n startMode: 'after_current',\n startIndex: 0,\n loop: false,\n autoplayNext: true,\n preferHls: true,\n adsOnItemChange: true,\n};\n\n/** Tek player üzerinde sıralı oynatma listesi (startMode, loop, hata fallback zinciri). */\nexport class PlaylistRunner {\n private readonly options: Required<Omit<PlaylistOptions, 'items' | 'adTagPreroll' | 'ui'>>;\n private readonly items: PlayableItem[];\n\n private index: number;\n private destroyed = false;\n private switching = false;\n private playlistActive = false;\n private startPendingAfterCurrent = false;\n private attemptId = 0;\n private attempt: Attempt | null = null;\n private lastErrorAt = 0;\n private lastAdsIndex: number | null = null;\n private lastDispatchedIndex: number | null = null;\n private userHasStartedPlayback = false;\n\n private readonly ui: {\n root: HTMLElement;\n titleEl: HTMLElement;\n listEl: HTMLElement;\n prevBtn: HTMLButtonElement;\n nextBtn: HTMLButtonElement;\n itemEls: Array<{ li: HTMLElement; titleRow: HTMLElement; progressFill: HTMLElement | null; timeEl: HTMLElement | null }>;\n };\n\n constructor(\n private readonly ctx: PlaylistPlayerContext,\n private readonly rawOptions: PlaylistOptions\n ) {\n this.options = { ...DEFAULTS, ...rawOptions };\n this.items = Array.isArray(rawOptions.items) ? rawOptions.items : [];\n this.index = this.clampIndex(this.options.startIndex);\n\n this.ui = this.buildUi();\n this.bindPlayerEvents();\n this.init();\n }\n\n // ── lifecycle ──\n\n private init(): void {\n if (!this.items.length) return;\n\n if (this.options.startMode === 'after_current') {\n this.startPendingAfterCurrent = true;\n this.playlistActive = false;\n this.setActive(this.index);\n return;\n }\n\n this.playlistActive = true;\n void this.loadAndPlay(this.index, { userInitiated: false, isPlaylistStart: true });\n }\n\n refreshLabels(): void {\n this.ui.titleEl.textContent = this.playlistTitleText();\n this.ui.prevBtn.setAttribute('aria-label', this.ctx.i18n.playlistPrev);\n this.ui.nextBtn.setAttribute('aria-label', this.ctx.i18n.playlistNext);\n this.ui.itemEls.forEach((entry, idx) => {\n const item = this.items[idx];\n if (item && !item.title) entry.titleRow.textContent = this.ctx.i18n.videoFallbackTitle(idx);\n });\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.ctx.videoEl.removeEventListener('ended', this.onEnded);\n this.ctx.videoEl.removeEventListener('error', this.onError);\n this.ctx.videoEl.removeEventListener('play', this.onUserPlay);\n this.ui.root.remove();\n }\n\n // ── public api ──\n\n start(opts: { index?: number } = {}): void {\n if (this.destroyed || !this.items.length) return;\n this.startPendingAfterCurrent = false;\n this.playlistActive = true;\n this.index = this.clampIndex(opts.index ?? this.index);\n this.setActive(this.index);\n void this.loadAndPlay(this.index, { userInitiated: false, isPlaylistStart: true });\n }\n\n next(): void {\n if (this.destroyed || !this.items.length) return;\n if (!this.playlistActive) return this.start({ index: this.index });\n\n if (this.index < this.items.length - 1) this.index++;\n else if (this.options.loop) this.index = 0;\n else return;\n\n this.setActive(this.index);\n void this.loadAndPlay(this.index, { userInitiated: true });\n }\n\n prev(): void {\n if (this.destroyed || !this.items.length) return;\n if (!this.playlistActive) return this.start({ index: this.index });\n if (this.index === 0) return;\n this.index--;\n this.setActive(this.index);\n void this.loadAndPlay(this.index, { userInitiated: true });\n }\n\n setIndex(i: number): void {\n if (this.destroyed || !this.items.length) return;\n this.index = this.clampIndex(i);\n this.setActive(this.index);\n if (!this.playlistActive) return this.start({ index: this.index });\n void this.loadAndPlay(this.index, { userInitiated: true });\n }\n\n getIndex(): number {\n return this.index;\n }\n\n isActive(): boolean {\n return this.playlistActive;\n }\n\n // ── player events ──\n\n private bindPlayerEvents(): void {\n this.ctx.videoEl.addEventListener('ended', this.onEnded);\n this.ctx.videoEl.addEventListener('error', this.onError);\n this.ctx.videoEl.addEventListener('play', this.onUserPlay);\n this.ctx.videoEl.addEventListener('timeupdate', this.onTimeUpdate);\n }\n\n private readonly onUserPlay = (): void => {\n this.userHasStartedPlayback = true;\n };\n\n private readonly onEnded = (): void => {\n if (this.ctx.isAdActive?.()) {\n const host = this.ctx.hostEl;\n const resume = (): void => {\n host.removeEventListener('hp:adend', resume);\n if (!this.destroyed && this.ctx.videoEl.ended) this.onEnded();\n };\n host.addEventListener('hp:adend', resume);\n return;\n }\n if (this.startPendingAfterCurrent && !this.playlistActive) {\n this.startPendingAfterCurrent = false;\n this.playlistActive = true;\n this.setActive(this.index);\n void this.loadAndPlay(this.index, { userInitiated: true, isPlaylistStart: true });\n return;\n }\n if (this.playlistActive) this.next();\n };\n\n private readonly onError = (): void => {\n if (this.destroyed || !this.playlistActive) return;\n // Ses aygıtı yok (Firefox): video sessiz oynamaya devam ediyor — sonraki öğeye atlama.\n if (isAudioOutputError(this.ctx.videoEl.error)) return;\n const now = Date.now();\n if (now - this.lastErrorAt < 200) return;\n this.lastErrorAt = now;\n void this.fallbackOrSkip();\n };\n\n private readonly onTimeUpdate = (): void => {\n this.updateProgress();\n };\n\n // ── core load ──\n\n private async loadAndPlay(\n i: number,\n opts: { userInitiated?: boolean; forceMode?: SourceMode | null; forceMp4Index?: number | null; isFallback?: boolean; isPlaylistStart?: boolean } = {}\n ): Promise<void> {\n if (this.destroyed || this.switching || !this.playlistActive) return;\n this.switching = true;\n\n const item = this.items[i];\n if (!item) {\n this.switching = false;\n return;\n }\n const attemptId = ++this.attemptId;\n const mode = opts.forceMode ?? this.resolveMode(item);\n\n let tried = new Set<SourceMode>([mode]);\n let mp4Index = opts.forceMp4Index ?? 0;\n if (opts.isFallback && this.attempt?.index === i && this.attempt?.tried) {\n tried = new Set(this.attempt.tried);\n tried.add(mode);\n if (opts.forceMp4Index == null) mp4Index = this.attempt.mp4Index ?? 0;\n }\n this.attempt = { id: attemptId, index: i, mode, tried, mp4Index };\n\n try {\n const payload = this.buildPayload(item, mode, mp4Index);\n if (!payload) throw new Error('No playable source');\n\n this.setActive(i);\n this.ctx.videoEl.pause();\n if (item.image) this.ctx.setPoster(item.image);\n await this.ctx.loadSource(payload.src, payload.type);\n\n if (this.options.adsOnItemChange) this.maybeRequestAds(i, item, !!opts.isFallback);\n\n if (this.shouldAutoPlay(!!opts.userInitiated)) {\n try {\n await this.ctx.videoEl.play();\n } catch {\n /* autoplay engellendi — sessizce geç */\n }\n }\n this.updateProgress();\n } finally {\n this.switching = false;\n }\n }\n\n private async fallbackOrSkip(): Promise<void> {\n if (this.destroyed || !this.attempt) return;\n const item = this.items[this.attempt.index];\n if (!item) return;\n\n if (this.attempt.mode === 'mp4') {\n const mp4List = (item.mp4 || []).filter((v) => v?.src);\n const nextMp4 = (this.attempt.mp4Index ?? 0) + 1;\n if (nextMp4 < mp4List.length) {\n await this.loadAndPlay(this.attempt.index, { forceMode: 'mp4', forceMp4Index: nextMp4, isFallback: true });\n return;\n }\n }\n\n const otherMode: SourceMode = this.attempt.mode === 'hls' ? 'mp4' : 'hls';\n if (this.hasMode(item, otherMode) && !this.attempt.tried.has(otherMode)) {\n await this.loadAndPlay(this.attempt.index, { forceMode: otherMode, isFallback: true });\n return;\n }\n\n this.next();\n }\n\n // ── ads ──\n\n private maybeRequestAds(index: number, item: PlayableItem, _isFallback: boolean): void {\n if (this.lastAdsIndex === index) return;\n this.lastAdsIndex = index;\n this.ctx.requestFreshAd(item.adTagPreroll || this.rawOptions.adTagPreroll);\n }\n\n // ── sources ──\n\n private resolveMode(item: PlayableItem): SourceMode {\n if (this.options.preferHls) return this.hasMode(item, 'hls') ? 'hls' : this.hasMode(item, 'mp4') ? 'mp4' : 'hls';\n return this.hasMode(item, 'mp4') ? 'mp4' : this.hasMode(item, 'hls') ? 'hls' : 'mp4';\n }\n\n private hasMode(item: PlayableItem, mode: SourceMode): boolean {\n return Array.isArray(item[mode]) && item[mode]!.some((v) => v?.src);\n }\n\n private buildPayload(item: PlayableItem, mode: SourceMode, mp4Index = 0): { src: string; type?: string } | null {\n const list = (item[mode] || []).filter((v) => v?.src);\n if (!list.length) return null;\n\n let src;\n if (mode === 'mp4') {\n src = mp4Index > 0 ? list[mp4Index] || list[0] : list.find((v) => v.selected) || list[0];\n } else {\n src = list[0];\n }\n return { src: src!.src, type: src!.type || (mode === 'hls' ? 'application/x-mpegURL' : 'video/mp4') };\n }\n\n private shouldAutoPlay(userInitiated: boolean): boolean {\n if (userInitiated) return true;\n return this.options.autoplayNext && this.userHasStartedPlayback;\n }\n\n private clampIndex(i: number): number {\n if (!Number.isFinite(i) || !this.items.length) return 0;\n return Math.max(0, Math.min(this.items.length - 1, Math.trunc(i)));\n }\n\n // ── ui ──\n\n private buildUi() {\n const ui = this.rawOptions.ui ?? {};\n const root = document.createElement('div');\n root.setAttribute('part', 'playlist-panel');\n root.className = 'hp:flex hp:flex-col hp:gap-2 hp:p-3 hp:bg-surface-elev hp:max-h-80 hp:overflow-y-auto';\n\n const header = document.createElement('div');\n header.className = 'hp:flex hp:items-center hp:justify-between hp:gap-2 hp:mb-1';\n\n const titleEl = document.createElement('div');\n titleEl.className = 'hp:text-sm hp:font-semibold hp:text-on-surface';\n titleEl.textContent = this.playlistTitleText();\n header.appendChild(titleEl);\n\n const navWrap = document.createElement('div');\n navWrap.className = 'hp:flex hp:gap-1';\n const prevBtn = this.navButton('chevron-left', this.ctx.i18n.playlistPrev, () => this.prev());\n const nextBtn = this.navButton('chevron-left', this.ctx.i18n.playlistNext, () => this.next());\n nextBtn.style.transform = 'rotate(180deg)';\n navWrap.append(prevBtn, nextBtn);\n header.appendChild(navWrap);\n\n root.appendChild(header);\n\n const listEl = document.createElement('ul');\n listEl.className = 'hp:flex hp:flex-col hp:gap-1 hp:list-none hp:m-0 hp:p-0';\n root.appendChild(listEl);\n\n const itemEls: Array<{ li: HTMLElement; titleRow: HTMLElement; progressFill: HTMLElement | null; timeEl: HTMLElement | null }> = [];\n this.items.forEach((item, idx) => {\n const li = document.createElement('li');\n li.className =\n 'hp:flex hp:items-center hp:gap-2 hp:p-2 hp:rounded hp:cursor-pointer hp:text-on-surface-muted hp:text-sm ' +\n 'hp:hover:bg-on-surface/5 hp:data-[active=true]:bg-accent/15 hp:data-[active=true]:text-on-surface';\n\n if (item.image) {\n const img = document.createElement('img');\n img.src = item.image;\n img.loading = 'lazy';\n img.className = 'hp:w-16 hp:aspect-video hp:object-cover hp:rounded hp:shrink-0';\n li.appendChild(img);\n }\n\n const body = document.createElement('div');\n body.className = 'hp:flex-1 hp:min-w-0';\n const titleRow = document.createElement('div');\n titleRow.className = 'hp:truncate hp:font-medium';\n titleRow.textContent = item.title || this.ctx.i18n.videoFallbackTitle(idx);\n body.appendChild(titleRow);\n\n let progressFill: HTMLElement | null = null;\n let timeEl: HTMLElement | null = null;\n if (ui.showMeta !== false) {\n const metaRow = document.createElement('div');\n metaRow.className = 'hp:flex hp:items-center hp:gap-2 hp:text-xs hp:opacity-70 hp:mt-0.5';\n timeEl = document.createElement('span');\n timeEl.textContent = '';\n metaRow.appendChild(timeEl);\n\n const bar = document.createElement('div');\n bar.className = 'hp:flex-1 hp:h-0.5 hp:bg-on-surface/20 hp:rounded-full hp:overflow-hidden';\n progressFill = document.createElement('div');\n progressFill.className = 'hp:h-full hp:bg-accent';\n progressFill.style.width = '0%';\n bar.appendChild(progressFill);\n metaRow.appendChild(bar);\n body.appendChild(metaRow);\n }\n\n li.appendChild(body);\n li.addEventListener('click', () => this.setIndex(idx));\n listEl.appendChild(li);\n itemEls.push({ li, titleRow, progressFill, timeEl });\n });\n\n this.ctx.panelEl.appendChild(root);\n return { root, titleEl, listEl, prevBtn, nextBtn, itemEls };\n }\n\n private playlistTitleText(): string {\n const ui = this.rawOptions.ui ?? {};\n const title = ui.title || this.ctx.i18n.playlistTitle;\n return ui.showCount === false ? title : `${title} (${this.items.length})`;\n }\n\n private navButton(iconName: string, label: string, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.setAttribute('aria-label', label);\n btn.className = 'hp:flex hp:items-center hp:justify-center hp:w-6 hp:h-6 hp:text-on-surface hp:bg-transparent hp:border-0 hp:cursor-pointer';\n btn.appendChild(createIcon(iconName, 'hp:text-sm'));\n btn.addEventListener('click', onClick);\n return btn;\n }\n\n private setActive(index: number): void {\n this.ui.itemEls.forEach((entry, idx) => {\n if (idx === index) entry.li.setAttribute('data-active', 'true');\n else entry.li.removeAttribute('data-active');\n });\n // loadAndPlay() hem anlık UI geri bildirimi için önceden (next/prev/setIndex\n // içinden) hem de kaynak gerçekten yüklendiğinde setActive() çağırıyor —\n // aynı index için event'i yalnızca BİR kez yaymak için guard.\n if (this.lastDispatchedIndex !== index) {\n this.lastDispatchedIndex = index;\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:itemchange', { detail: { index, source: 'playlist' } }));\n }\n }\n\n private updateProgress(): void {\n const active = this.ui.itemEls[this.index];\n if (!active) return;\n const duration = this.ctx.videoEl.duration;\n const current = this.ctx.videoEl.currentTime;\n if (active.timeEl) active.timeEl.textContent = this.formatTime(current);\n if (active.progressFill && Number.isFinite(duration) && duration > 0) {\n active.progressFill.style.width = `${Math.min(100, (current / duration) * 100)}%`;\n }\n }\n\n private formatTime(sec: number): string {\n const s = Math.max(0, Math.floor(sec || 0));\n const m = Math.floor(s / 60);\n const r = s % 60;\n return `${m}:${String(r).padStart(2, '0')}`;\n }\n}\n","import { PlaylistRunner, type PlaylistPlayerContext } from './PlaylistRunner';\nimport type { PlaylistOptions } from '../../types';\n\nexport function installPlaylist(ctx: PlaylistPlayerContext, options: PlaylistOptions): PlaylistRunner {\n return new PlaylistRunner(ctx, options);\n}\n\nexport { PlaylistRunner };\nexport type { PlaylistPlayerContext };\n"],"names":["DEFAULTS","PlaylistRunner","ctx","rawOptions","__publicField","_b","_a","host","resume","isAudioOutputError","now","entry","idx","item","opts","i","attemptId","mode","tried","mp4Index","payload","mp4List","v","nextMp4","otherMode","index","_isFallback","list","src","userInitiated","ui","root","header","titleEl","navWrap","prevBtn","nextBtn","listEl","itemEls","li","img","body","titleRow","progressFill","timeEl","metaRow","bar","title","iconName","label","onClick","btn","createIcon","active","duration","current","sec","s","m","r","installPlaylist","options"],"mappings":"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"}
1
+ {"version":3,"file":"playlist-CHfStNbQ.js","sources":["../../src/plugins/playlist/PlaylistRunner.ts","../../src/plugins/playlist/index.ts"],"sourcesContent":["import { createIcon } from '../../icons/Icon';\nimport type { PlayableItem, PlaylistOptions } from '../../types';\nimport type { HopeLocaleStrings } from '../../i18n/types';\nimport { isAudioOutputError } from '../../utils/media-error';\n\nexport interface PlaylistPlayerContext {\n videoEl: HTMLVideoElement;\n hostEl: HTMLElement;\n /** Liste UI'ının monte edileceği, shadow root içindeki panel. */\n panelEl: HTMLElement;\n loadSource(src: string, type?: string): Promise<void>;\n setPoster(url: string): void;\n /** AdsController varsa retry/VMAP durumunu sıfırlayıp item'ın (varsa) kendi adTagPreroll'üyle yeniden reklam ister — yoksa no-op. */\n requestFreshAd(prerollTag?: string): void;\n /** Postroll sürüyorsa sonraki öğe `hp:adend`'i bekler. */\n isAdActive?(): boolean;\n i18n: HopeLocaleStrings;\n}\n\ntype SourceMode = 'hls' | 'mp4';\n\ninterface Attempt {\n id: number;\n index: number;\n mode: SourceMode;\n tried: Set<SourceMode>;\n mp4Index: number;\n}\n\nconst DEFAULTS: Required<Omit<PlaylistOptions, 'items' | 'adTagPreroll' | 'ui'>> = {\n startMode: 'after_current',\n startIndex: 0,\n loop: false,\n autoplayNext: true,\n preferHls: true,\n adsOnItemChange: true,\n};\n\n/** Tek player üzerinde sıralı oynatma listesi (startMode, loop, hata fallback zinciri). */\nexport class PlaylistRunner {\n private readonly options: Required<Omit<PlaylistOptions, 'items' | 'adTagPreroll' | 'ui'>>;\n private readonly items: PlayableItem[];\n\n private index: number;\n private destroyed = false;\n private switching = false;\n private playlistActive = false;\n private startPendingAfterCurrent = false;\n private attemptId = 0;\n private attempt: Attempt | null = null;\n private lastErrorAt = 0;\n private lastAdsIndex: number | null = null;\n private lastDispatchedIndex: number | null = null;\n private userHasStartedPlayback = false;\n\n private readonly ui: {\n root: HTMLElement;\n titleEl: HTMLElement;\n listEl: HTMLElement;\n prevBtn: HTMLButtonElement;\n nextBtn: HTMLButtonElement;\n itemEls: Array<{ li: HTMLElement; titleRow: HTMLElement; progressFill: HTMLElement | null; timeEl: HTMLElement | null }>;\n };\n\n constructor(\n private readonly ctx: PlaylistPlayerContext,\n private readonly rawOptions: PlaylistOptions\n ) {\n this.options = { ...DEFAULTS, ...rawOptions };\n this.items = Array.isArray(rawOptions.items) ? rawOptions.items : [];\n this.index = this.clampIndex(this.options.startIndex);\n\n this.ui = this.buildUi();\n this.bindPlayerEvents();\n this.init();\n }\n\n // ── lifecycle ──\n\n private init(): void {\n if (!this.items.length) return;\n\n if (this.options.startMode === 'after_current') {\n this.startPendingAfterCurrent = true;\n this.playlistActive = false;\n this.setActive(this.index);\n return;\n }\n\n this.playlistActive = true;\n void this.loadAndPlay(this.index, { userInitiated: false, isPlaylistStart: true });\n }\n\n refreshLabels(): void {\n this.ui.titleEl.textContent = this.playlistTitleText();\n this.ui.prevBtn.setAttribute('aria-label', this.ctx.i18n.playlistPrev);\n this.ui.nextBtn.setAttribute('aria-label', this.ctx.i18n.playlistNext);\n this.ui.itemEls.forEach((entry, idx) => {\n const item = this.items[idx];\n if (item && !item.title) entry.titleRow.textContent = this.ctx.i18n.videoFallbackTitle(idx);\n });\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.ctx.videoEl.removeEventListener('ended', this.onEnded);\n this.ctx.videoEl.removeEventListener('error', this.onError);\n this.ctx.videoEl.removeEventListener('play', this.onUserPlay);\n this.ui.root.remove();\n }\n\n // ── public api ──\n\n start(opts: { index?: number } = {}): void {\n if (this.destroyed || !this.items.length) return;\n this.startPendingAfterCurrent = false;\n this.playlistActive = true;\n this.index = this.clampIndex(opts.index ?? this.index);\n this.setActive(this.index);\n void this.loadAndPlay(this.index, { userInitiated: false, isPlaylistStart: true });\n }\n\n next(): void {\n if (this.destroyed || !this.items.length) return;\n if (!this.playlistActive) return this.start({ index: this.index });\n\n if (this.index < this.items.length - 1) this.index++;\n else if (this.options.loop) this.index = 0;\n else return;\n\n this.setActive(this.index);\n void this.loadAndPlay(this.index, { userInitiated: true });\n }\n\n prev(): void {\n if (this.destroyed || !this.items.length) return;\n if (!this.playlistActive) return this.start({ index: this.index });\n if (this.index === 0) return;\n this.index--;\n this.setActive(this.index);\n void this.loadAndPlay(this.index, { userInitiated: true });\n }\n\n setIndex(i: number): void {\n if (this.destroyed || !this.items.length) return;\n this.index = this.clampIndex(i);\n this.setActive(this.index);\n if (!this.playlistActive) return this.start({ index: this.index });\n void this.loadAndPlay(this.index, { userInitiated: true });\n }\n\n getIndex(): number {\n return this.index;\n }\n\n isActive(): boolean {\n return this.playlistActive;\n }\n\n // ── player events ──\n\n private bindPlayerEvents(): void {\n this.ctx.videoEl.addEventListener('ended', this.onEnded);\n this.ctx.videoEl.addEventListener('error', this.onError);\n this.ctx.videoEl.addEventListener('play', this.onUserPlay);\n this.ctx.videoEl.addEventListener('timeupdate', this.onTimeUpdate);\n }\n\n private readonly onUserPlay = (): void => {\n this.userHasStartedPlayback = true;\n };\n\n private readonly onEnded = (): void => {\n if (this.ctx.isAdActive?.()) {\n const host = this.ctx.hostEl;\n const resume = (): void => {\n host.removeEventListener('hp:adend', resume);\n if (!this.destroyed && this.ctx.videoEl.ended) this.onEnded();\n };\n host.addEventListener('hp:adend', resume);\n return;\n }\n if (this.startPendingAfterCurrent && !this.playlistActive) {\n this.startPendingAfterCurrent = false;\n this.playlistActive = true;\n this.setActive(this.index);\n void this.loadAndPlay(this.index, { userInitiated: true, isPlaylistStart: true });\n return;\n }\n if (this.playlistActive) this.next();\n };\n\n private readonly onError = (): void => {\n if (this.destroyed || !this.playlistActive) return;\n // Ses aygıtı yok (Firefox): video sessiz oynamaya devam ediyor — sonraki öğeye atlama.\n if (isAudioOutputError(this.ctx.videoEl.error)) return;\n const now = Date.now();\n if (now - this.lastErrorAt < 200) return;\n this.lastErrorAt = now;\n void this.fallbackOrSkip();\n };\n\n private readonly onTimeUpdate = (): void => {\n this.updateProgress();\n };\n\n // ── core load ──\n\n private async loadAndPlay(\n i: number,\n opts: { userInitiated?: boolean; forceMode?: SourceMode | null; forceMp4Index?: number | null; isFallback?: boolean; isPlaylistStart?: boolean } = {}\n ): Promise<void> {\n if (this.destroyed || this.switching || !this.playlistActive) return;\n this.switching = true;\n\n const item = this.items[i];\n if (!item) {\n this.switching = false;\n return;\n }\n const attemptId = ++this.attemptId;\n const mode = opts.forceMode ?? this.resolveMode(item);\n\n let tried = new Set<SourceMode>([mode]);\n let mp4Index = opts.forceMp4Index ?? 0;\n if (opts.isFallback && this.attempt?.index === i && this.attempt?.tried) {\n tried = new Set(this.attempt.tried);\n tried.add(mode);\n if (opts.forceMp4Index == null) mp4Index = this.attempt.mp4Index ?? 0;\n }\n this.attempt = { id: attemptId, index: i, mode, tried, mp4Index };\n\n try {\n const payload = this.buildPayload(item, mode, mp4Index);\n if (!payload) throw new Error('No playable source');\n\n this.setActive(i);\n this.ctx.videoEl.pause();\n if (item.image) this.ctx.setPoster(item.image);\n await this.ctx.loadSource(payload.src, payload.type);\n\n if (this.options.adsOnItemChange) this.maybeRequestAds(i, item, !!opts.isFallback);\n\n if (this.shouldAutoPlay(!!opts.userInitiated)) {\n try {\n await this.ctx.videoEl.play();\n } catch {\n /* autoplay engellendi — sessizce geç */\n }\n }\n this.updateProgress();\n } finally {\n this.switching = false;\n }\n }\n\n private async fallbackOrSkip(): Promise<void> {\n if (this.destroyed || !this.attempt) return;\n const item = this.items[this.attempt.index];\n if (!item) return;\n\n if (this.attempt.mode === 'mp4') {\n const mp4List = (item.mp4 || []).filter((v) => v?.src);\n const nextMp4 = (this.attempt.mp4Index ?? 0) + 1;\n if (nextMp4 < mp4List.length) {\n await this.loadAndPlay(this.attempt.index, { forceMode: 'mp4', forceMp4Index: nextMp4, isFallback: true });\n return;\n }\n }\n\n const otherMode: SourceMode = this.attempt.mode === 'hls' ? 'mp4' : 'hls';\n if (this.hasMode(item, otherMode) && !this.attempt.tried.has(otherMode)) {\n await this.loadAndPlay(this.attempt.index, { forceMode: otherMode, isFallback: true });\n return;\n }\n\n this.next();\n }\n\n // ── ads ──\n\n private maybeRequestAds(index: number, item: PlayableItem, _isFallback: boolean): void {\n if (this.lastAdsIndex === index) return;\n this.lastAdsIndex = index;\n this.ctx.requestFreshAd(item.adTagPreroll || this.rawOptions.adTagPreroll);\n }\n\n // ── sources ──\n\n private resolveMode(item: PlayableItem): SourceMode {\n if (this.options.preferHls) return this.hasMode(item, 'hls') ? 'hls' : this.hasMode(item, 'mp4') ? 'mp4' : 'hls';\n return this.hasMode(item, 'mp4') ? 'mp4' : this.hasMode(item, 'hls') ? 'hls' : 'mp4';\n }\n\n private hasMode(item: PlayableItem, mode: SourceMode): boolean {\n return Array.isArray(item[mode]) && item[mode]!.some((v) => v?.src);\n }\n\n private buildPayload(item: PlayableItem, mode: SourceMode, mp4Index = 0): { src: string; type?: string } | null {\n const list = (item[mode] || []).filter((v) => v?.src);\n if (!list.length) return null;\n\n let src;\n if (mode === 'mp4') {\n src = mp4Index > 0 ? list[mp4Index] || list[0] : list.find((v) => v.selected) || list[0];\n } else {\n src = list[0];\n }\n return { src: src!.src, type: src!.type || (mode === 'hls' ? 'application/x-mpegURL' : 'video/mp4') };\n }\n\n private shouldAutoPlay(userInitiated: boolean): boolean {\n if (userInitiated) return true;\n return this.options.autoplayNext && this.userHasStartedPlayback;\n }\n\n private clampIndex(i: number): number {\n if (!Number.isFinite(i) || !this.items.length) return 0;\n return Math.max(0, Math.min(this.items.length - 1, Math.trunc(i)));\n }\n\n // ── ui ──\n\n private buildUi() {\n const ui = this.rawOptions.ui ?? {};\n const root = document.createElement('div');\n root.setAttribute('part', 'playlist-panel');\n root.className = 'hp:flex hp:flex-col hp:gap-2 hp:p-3 hp:bg-surface-elev hp:max-h-80 hp:overflow-y-auto';\n\n const header = document.createElement('div');\n header.className = 'hp:flex hp:items-center hp:justify-between hp:gap-2 hp:mb-1';\n\n const titleEl = document.createElement('div');\n titleEl.className = 'hp:text-sm hp:font-semibold hp:text-on-surface';\n titleEl.textContent = this.playlistTitleText();\n header.appendChild(titleEl);\n\n const navWrap = document.createElement('div');\n navWrap.className = 'hp:flex hp:gap-1';\n const prevBtn = this.navButton('chevron-left', this.ctx.i18n.playlistPrev, () => this.prev());\n const nextBtn = this.navButton('chevron-left', this.ctx.i18n.playlistNext, () => this.next());\n nextBtn.style.transform = 'rotate(180deg)';\n navWrap.append(prevBtn, nextBtn);\n header.appendChild(navWrap);\n\n root.appendChild(header);\n\n const listEl = document.createElement('ul');\n listEl.className = 'hp:flex hp:flex-col hp:gap-1 hp:list-none hp:m-0 hp:p-0';\n root.appendChild(listEl);\n\n const itemEls: Array<{ li: HTMLElement; titleRow: HTMLElement; progressFill: HTMLElement | null; timeEl: HTMLElement | null }> = [];\n this.items.forEach((item, idx) => {\n const li = document.createElement('li');\n li.className =\n 'hp:flex hp:items-center hp:gap-2 hp:p-2 hp:rounded hp:cursor-pointer hp:text-on-surface-muted hp:text-sm ' +\n 'hp:hover:bg-on-surface/5 hp:data-[active=true]:bg-accent/15 hp:data-[active=true]:text-on-surface';\n\n if (item.image) {\n const img = document.createElement('img');\n img.src = item.image;\n img.loading = 'lazy';\n img.className = 'hp:w-16 hp:aspect-video hp:object-cover hp:rounded hp:shrink-0';\n li.appendChild(img);\n }\n\n const body = document.createElement('div');\n body.className = 'hp:flex-1 hp:min-w-0';\n const titleRow = document.createElement('div');\n titleRow.className = 'hp:truncate hp:font-medium';\n titleRow.textContent = item.title || this.ctx.i18n.videoFallbackTitle(idx);\n body.appendChild(titleRow);\n\n let progressFill: HTMLElement | null = null;\n let timeEl: HTMLElement | null = null;\n if (ui.showMeta !== false) {\n const metaRow = document.createElement('div');\n metaRow.className = 'hp:flex hp:items-center hp:gap-2 hp:text-xs hp:opacity-70 hp:mt-0.5';\n timeEl = document.createElement('span');\n timeEl.textContent = '';\n metaRow.appendChild(timeEl);\n\n const bar = document.createElement('div');\n bar.className = 'hp:flex-1 hp:h-0.5 hp:bg-on-surface/20 hp:rounded-full hp:overflow-hidden';\n progressFill = document.createElement('div');\n progressFill.className = 'hp:h-full hp:bg-accent';\n progressFill.style.width = '0%';\n bar.appendChild(progressFill);\n metaRow.appendChild(bar);\n body.appendChild(metaRow);\n }\n\n li.appendChild(body);\n li.addEventListener('click', () => this.setIndex(idx));\n listEl.appendChild(li);\n itemEls.push({ li, titleRow, progressFill, timeEl });\n });\n\n this.ctx.panelEl.appendChild(root);\n return { root, titleEl, listEl, prevBtn, nextBtn, itemEls };\n }\n\n private playlistTitleText(): string {\n const ui = this.rawOptions.ui ?? {};\n const title = ui.title || this.ctx.i18n.playlistTitle;\n return ui.showCount === false ? title : `${title} (${this.items.length})`;\n }\n\n private navButton(iconName: string, label: string, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.setAttribute('aria-label', label);\n btn.className = 'hp:flex hp:items-center hp:justify-center hp:w-6 hp:h-6 hp:text-on-surface hp:bg-transparent hp:border-0 hp:cursor-pointer';\n btn.appendChild(createIcon(iconName, 'hp:text-sm'));\n btn.addEventListener('click', onClick);\n return btn;\n }\n\n private setActive(index: number): void {\n this.ui.itemEls.forEach((entry, idx) => {\n if (idx === index) entry.li.setAttribute('data-active', 'true');\n else entry.li.removeAttribute('data-active');\n });\n // loadAndPlay() hem anlık UI geri bildirimi için önceden (next/prev/setIndex\n // içinden) hem de kaynak gerçekten yüklendiğinde setActive() çağırıyor —\n // aynı index için event'i yalnızca BİR kez yaymak için guard.\n if (this.lastDispatchedIndex !== index) {\n this.lastDispatchedIndex = index;\n this.ctx.hostEl.dispatchEvent(new CustomEvent('hp:itemchange', { detail: { index, source: 'playlist' } }));\n }\n }\n\n private updateProgress(): void {\n const active = this.ui.itemEls[this.index];\n if (!active) return;\n const duration = this.ctx.videoEl.duration;\n const current = this.ctx.videoEl.currentTime;\n if (active.timeEl) active.timeEl.textContent = this.formatTime(current);\n if (active.progressFill && Number.isFinite(duration) && duration > 0) {\n active.progressFill.style.width = `${Math.min(100, (current / duration) * 100)}%`;\n }\n }\n\n private formatTime(sec: number): string {\n const s = Math.max(0, Math.floor(sec || 0));\n const m = Math.floor(s / 60);\n const r = s % 60;\n return `${m}:${String(r).padStart(2, '0')}`;\n }\n}\n","import { PlaylistRunner, type PlaylistPlayerContext } from './PlaylistRunner';\nimport type { PlaylistOptions } from '../../types';\n\nexport function installPlaylist(ctx: PlaylistPlayerContext, options: PlaylistOptions): PlaylistRunner {\n return new PlaylistRunner(ctx, options);\n}\n\nexport { PlaylistRunner };\nexport type { PlaylistPlayerContext };\n"],"names":["DEFAULTS","PlaylistRunner","ctx","rawOptions","__publicField","_b","_a","host","resume","isAudioOutputError","now","entry","idx","item","opts","i","attemptId","mode","tried","mp4Index","payload","mp4List","v","nextMp4","otherMode","index","_isFallback","list","src","userInitiated","ui","root","header","titleEl","navWrap","prevBtn","nextBtn","listEl","itemEls","li","img","body","titleRow","progressFill","timeEl","metaRow","bar","title","iconName","label","onClick","btn","createIcon","active","duration","current","sec","s","m","r","installPlaylist","options"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ function a(o, t, l) {
2
+ const e = o.getRootNode(), n = "host" in e ? e : e.head;
3
+ if (!n || n.querySelector(`style[data-hp-style="${t}"]`)) return;
4
+ const s = (o.ownerDocument ?? document).createElement("style");
5
+ s.setAttribute("data-hp-style", t), s.textContent = l, n.appendChild(s);
6
+ }
7
+ function r(o, t) {
8
+ for (const l of Array.from(o.querySelectorAll("style[data-hp-style]"))) {
9
+ const e = l.getAttribute("data-hp-style");
10
+ t.querySelector(`style[data-hp-style="${e}"]`) || t.appendChild(l.cloneNode(!0));
11
+ }
12
+ }
13
+ export {
14
+ a,
15
+ r as c
16
+ };
17
+ //# sourceMappingURL=plugin-style-CPJELe-i.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-style-CPJELe-i.js","sources":["../../src/utils/plugin-style.ts"],"sourcesContent":["/** Eklenti CSS'ini elemanın kökündeki shadow root'a bir kez ekler — stiller ana pakete girmez. */\nexport function adoptStyle(el: Node, id: string, css: string): void {\n const root = el.getRootNode() as ShadowRoot | Document;\n // instanceof ShadowRoot başka pencerede (Document PiP) yanlış döner — host ile ayırt edilir.\n const parent: ParentNode | null = 'host' in root ? root : (root as Document).head;\n if (!parent || parent.querySelector(`style[data-hp-style=\"${id}\"]`)) return;\n const style = (el.ownerDocument ?? document).createElement('style');\n style.setAttribute('data-hp-style', id);\n style.textContent = css;\n parent.appendChild(style);\n}\n\n/** `from` kökündeki eklenti stillerinden `to`'da olmayanları kopyalar (Document PiP penceresine gidiş / dönüş). */\nexport function copyAdoptedStyles(from: ParentNode, to: ParentNode): void {\n for (const style of Array.from(from.querySelectorAll('style[data-hp-style]'))) {\n const id = style.getAttribute('data-hp-style')!;\n if (!to.querySelector(`style[data-hp-style=\"${id}\"]`)) to.appendChild(style.cloneNode(true));\n }\n}\n"],"names":["adoptStyle","el","id","css","root","parent","style","copyAdoptedStyles","from","to"],"mappings":"AACO,SAASA,EAAWC,GAAUC,GAAYC,GAAmB;AAChE,QAAMC,IAAOH,EAAG,YAAA,GAEVI,IAA4B,UAAUD,IAAOA,IAAQA,EAAkB;AAC7E,MAAI,CAACC,KAAUA,EAAO,cAAc,wBAAwBH,CAAE,IAAI,EAAG;AACrE,QAAMI,KAASL,EAAG,iBAAiB,UAAU,cAAc,OAAO;AAClE,EAAAK,EAAM,aAAa,iBAAiBJ,CAAE,GACtCI,EAAM,cAAcH,GACpBE,EAAO,YAAYC,CAAK;AAC5B;AAGO,SAASC,EAAkBC,GAAkBC,GAAsB;AACtE,aAAWH,KAAS,MAAM,KAAKE,EAAK,iBAAiB,sBAAsB,CAAC,GAAG;AAC3E,UAAMN,IAAKI,EAAM,aAAa,eAAe;AAC7C,IAAKG,EAAG,cAAc,wBAAwBP,CAAE,IAAI,KAAGO,EAAG,YAAYH,EAAM,UAAU,EAAI,CAAC;AAAA,EAC/F;AACJ;"}
@@ -1,7 +1,7 @@
1
1
  var k = Object.defineProperty;
2
2
  var A = (d, e, t) => e in d ? k(d, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : d[e] = t;
3
3
  var c = (d, e, t) => A(d, typeof e != "symbol" ? e + "" : e, t);
4
- import { P as b, c as S } from "./player-DV4Hf5Cw.js";
4
+ import { P as b, c as S } from "./player-D2_HRzot.js";
5
5
  const w = 6e4, x = 15e3, $ = 300, C = /* @__PURE__ */ new Set([" ", "k", "j", "l", "ArrowLeft", "ArrowRight", ",", "."]);
6
6
  class K {
7
7
  constructor(e) {
@@ -563,4 +563,4 @@ export {
563
563
  b as PLUGIN_API_VERSION,
564
564
  B as PluginHost
565
565
  };
566
- //# sourceMappingURL=pluginHost-GxNfyP5E.js.map
566
+ //# sourceMappingURL=pluginHost-cN2uGFeG.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pluginHost-GxNfyP5E.js","sources":["../../src/plugin-api/PluginAds.ts","../../src/plugin-api/PluginHost.ts"],"sourcesContent":["// Eklenti reklam API'si: reklam arası, preroll kapısı, midroll noktaları, duraklatma / bitiş kancaları, tag dönüşümü.\nimport type { PluginAdBreak, PluginAdBreakOptions, PluginAdBreakType, PluginCleanup } from './types';\n\nexport interface PluginAdsContext {\n element: HTMLElement;\n video: HTMLVideoElement;\n videoArea: HTMLElement;\n isAdPlaying(): boolean;\n /** Player'ın reklam kilidi (kontroller gizli, isAdPlaying true). */\n blockAds(): void;\n unblockAds(): void;\n log(message: string, details?: Record<string, string | number | boolean | undefined>): void;\n}\n\nconst DEFAULT_BREAK_TIMEOUT_MS = 60_000;\nconst PREROLL_GATE_TIMEOUT_MS = 15_000;\nconst DEFAULT_PAUSE_DELAY_MS = 300;\n/** Reklam arasında engellenen içerik kısayolları. */\nconst BLOCKED_KEYS = new Set([' ', 'k', 'j', 'l', 'ArrowLeft', 'ArrowRight', ',', '.']);\n\ntype Guard = <A extends unknown[]>(fn: (...args: A) => unknown, where?: string) => (...args: A) => void;\n\ninterface Mid {\n owner: string;\n marks: number[];\n fired: Set<number>;\n seekPast: 'last' | 'skip';\n fire: (mark: number) => void;\n}\n\ninterface Active {\n owner: string;\n finish: () => void;\n}\n\nexport class PluginAds {\n private active: Active | null = null;\n private prerolls: Array<{ owner: string; run: () => unknown }> = [];\n private mids: Mid[] = [];\n private pauses: Array<{ owner: string; run: () => unknown; delayMs: number }> = [];\n private endeds: Array<{ owner: string; run: () => void }> = [];\n private transforms: Array<{ owner: string; fn: (url: string, type: PluginAdBreakType) => string }> = [];\n private prerollDone = false;\n private gateRunning = false;\n private contentStarted = false;\n private lastPos = 0;\n private seekPending = false;\n private pauseTimer: ReturnType<typeof setTimeout> | null = null;\n private pauseCleanups: Array<() => void> = [];\n\n constructor(private readonly ctx: PluginAdsContext) {\n const v = ctx.video;\n v.addEventListener('loadstart', this.onLoadStart);\n v.addEventListener('play', this.onPlay, true);\n v.addEventListener('playing', this.onPlaying);\n v.addEventListener('timeupdate', this.onTimeUpdate);\n v.addEventListener('seeking', this.onSeeking);\n v.addEventListener('pause', this.onPause);\n // Capture: playlist / yönlendirme dinleyicilerinden önce — postroll arası onlar çalışmadan başlar.\n v.addEventListener('ended', this.onEnded, true);\n ctx.element.addEventListener('keydown', this.onKeyDown, true);\n }\n\n destroy(): void {\n const v = this.ctx.video;\n v.removeEventListener('loadstart', this.onLoadStart);\n v.removeEventListener('play', this.onPlay, true);\n v.removeEventListener('playing', this.onPlaying);\n v.removeEventListener('timeupdate', this.onTimeUpdate);\n v.removeEventListener('seeking', this.onSeeking);\n v.removeEventListener('pause', this.onPause);\n v.removeEventListener('ended', this.onEnded, true);\n this.ctx.element.removeEventListener('keydown', this.onKeyDown, true);\n this.active?.finish();\n this.clearPause();\n }\n\n /** Eklenti kaldırılınca onun kayıtları ve süren arası. */\n removeOwner(owner: string): void {\n this.prerolls = this.prerolls.filter((x) => x.owner !== owner);\n this.mids = this.mids.filter((x) => x.owner !== owner);\n this.pauses = this.pauses.filter((x) => x.owner !== owner);\n this.endeds = this.endeds.filter((x) => x.owner !== owner);\n this.transforms = this.transforms.filter((x) => x.owner !== owner);\n if (this.active?.owner === owner) this.active.finish();\n }\n\n /** IMA isteği öncesi tüm eklentilerin dönüşümleri. */\n transformTag(url: string, type: PluginAdBreakType): string {\n let out = url;\n for (const t of this.transforms) {\n try {\n const next = t.fn(out, type);\n if (typeof next === 'string' && next) out = next;\n } catch (err) {\n this.ctx.log(`Plugin \"${t.owner}\" failed in ads.transformTag: ${(err as Error)?.message ?? err}`, { plugin: t.owner });\n }\n }\n return out;\n }\n\n /** Bir eklentiye verilen `ads` nesnesi. */\n api(owner: string, guard: Guard) {\n const add = <T>(list: T[], item: T): (() => void) => {\n list.push(item);\n return () => {\n const i = list.indexOf(item);\n if (i >= 0) list.splice(i, 1);\n };\n };\n return {\n requestBreak: (run: (ad: PluginAdBreak) => void | Promise<void>, options?: PluginAdBreakOptions) => this.requestBreak(owner, run, options),\n beforeContent: (run: () => unknown) => add(this.prerolls, { owner, run }),\n atTime: (seconds: number | number[], run: (s: number) => unknown, options?: { seekPast?: 'last' | 'skip' }) => {\n const marks = (Array.isArray(seconds) ? seconds : [seconds]).filter((s) => Number.isFinite(s) && s >= 0).sort((a, b) => a - b);\n const fire = guard((m: number) => run(m), 'ads.atTime');\n return add(this.mids, { owner, marks, fired: new Set<number>(), seekPast: options?.seekPast ?? 'last', fire });\n },\n onPause: (run: () => void | PluginCleanup, options?: { delayMs?: number }) =>\n add(this.pauses, { owner, run: () => run(), delayMs: options?.delayMs ?? DEFAULT_PAUSE_DELAY_MS }),\n onEnded: (run: () => unknown) => add(this.endeds, { owner, run: guard(() => run(), 'ads.onEnded') }),\n transformTag: (fn: (url: string, type: PluginAdBreakType) => string) => add(this.transforms, { owner, fn }),\n };\n }\n\n // ── Reklam arası ──\n\n private requestBreak(owner: string, run: (ad: PluginAdBreak) => void | Promise<void>, options?: PluginAdBreakOptions): Promise<boolean> {\n if (this.active || this.ctx.isAdPlaying()) return Promise.resolve(false);\n const v = this.ctx.video;\n const type: PluginAdBreakType = options?.type ?? (v.ended ? 'postroll' : !this.contentStarted ? 'preroll' : 'midroll');\n const wasPlaying = !v.paused && !v.ended;\n if (!v.paused) v.pause();\n this.ctx.blockAds();\n\n const layer = document.createElement('div');\n layer.className = 'hp-plugin-layer hp-plugin-ad';\n layer.setAttribute('part', `plugin-ad plugin-${owner}`);\n layer.dataset.plugin = owner;\n layer.dataset.position = 'fill';\n layer.toggleAttribute('data-above', true);\n layer.toggleAttribute('data-interactive', true);\n for (const ev of ['pointerdown', 'mousedown', 'mouseup', 'touchstart', 'touchend', 'click', 'dblclick'] as const) layer.addEventListener(ev, (e) => e.stopPropagation());\n this.ctx.videoArea.appendChild(layer);\n\n const ctrl = new AbortController();\n this.emit('hp:adstart', type, owner);\n\n return new Promise<boolean>((resolve) => {\n let done = false;\n const finish = (): void => {\n if (done) return;\n done = true;\n clearTimeout(timer);\n ctrl.abort();\n layer.remove();\n this.active = null;\n this.ctx.unblockAds();\n this.emit('hp:adend', type, owner);\n if (wasPlaying && type !== 'postroll') void v.play().catch(() => {});\n resolve(true);\n };\n const timer = setTimeout(() => {\n this.ctx.log(`Plugin \"${owner}\" ad break timed out`, { plugin: owner, type });\n finish();\n }, options?.timeoutMs ?? DEFAULT_BREAK_TIMEOUT_MS);\n this.active = { owner, finish };\n const fail = (err: unknown): void => {\n this.ctx.log(`Plugin \"${owner}\" failed in ads.requestBreak: ${(err as Error)?.message ?? err}`, { plugin: owner, type });\n finish();\n };\n try {\n Promise.resolve(run({ type, layer, signal: ctrl.signal, end: finish })).then(finish, fail);\n } catch (err) {\n fail(err);\n }\n });\n }\n\n private emit(name: 'hp:adstart' | 'hp:adend', type: PluginAdBreakType, plugin: string): void {\n this.ctx.element.dispatchEvent(new CustomEvent(name, { detail: { type, linear: true, plugin } }));\n }\n\n // ── Olaylar ──\n\n private readonly onLoadStart = (): void => {\n this.prerollDone = false;\n this.contentStarted = false;\n this.lastPos = 0;\n for (const m of this.mids) m.fired.clear();\n this.clearPause();\n };\n\n private readonly onPlay = (): void => {\n const v = this.ctx.video;\n // Reklam arasında / preroll beklenirken içerik oynamaz.\n if (this.active || this.gateRunning) {\n v.pause();\n return;\n }\n this.clearPause();\n if (this.prerollDone || !this.prerolls.length || this.ctx.isAdPlaying()) return;\n this.prerollDone = true;\n v.pause();\n void this.runPrerolls();\n };\n\n private async runPrerolls(): Promise<void> {\n this.gateRunning = true;\n const all = Promise.all(\n this.prerolls.map((p) =>\n Promise.resolve()\n .then(() => p.run())\n .catch((err) => this.ctx.log(`Plugin \"${p.owner}\" failed in ads.beforeContent: ${(err as Error)?.message ?? err}`, { plugin: p.owner }))\n )\n );\n await Promise.race([all, new Promise((r) => setTimeout(r, PREROLL_GATE_TIMEOUT_MS))]);\n // Süren bir ara varsa onun bitmesini bekle.\n while (this.active) await new Promise((r) => setTimeout(r, 100));\n this.gateRunning = false;\n void this.ctx.video.play().catch(() => {});\n }\n\n private readonly onPlaying = (): void => {\n if (!this.active && !this.ctx.isAdPlaying()) this.contentStarted = true;\n };\n\n private readonly onSeeking = (): void => {\n this.seekPending = true;\n };\n\n private readonly onTimeUpdate = (): void => {\n const v = this.ctx.video;\n const pos = v.currentTime;\n const prev = this.lastPos;\n this.lastPos = pos;\n const seeked = this.seekPending;\n this.seekPending = false;\n if (this.active || this.ctx.isAdPlaying() || v.paused || v.seeking || pos <= prev) return;\n for (const m of this.mids) {\n const crossed = m.marks.filter((s) => prev < s && s <= pos && !m.fired.has(s));\n if (!crossed.length) continue;\n for (const s of crossed) m.fired.add(s);\n // İleri sarınca geçilen noktalardan yalnızca sonuncusu (ya da hiçbiri).\n if (seeked && m.seekPast === 'skip') continue;\n m.fire(crossed[crossed.length - 1]!);\n }\n };\n\n private readonly onPause = (): void => {\n const v = this.ctx.video;\n if (!this.pauses.length || v.ended || v.seeking || this.active || this.gateRunning || this.ctx.isAdPlaying()) return;\n this.clearPause();\n const delay = Math.min(...this.pauses.map((p) => p.delayMs));\n this.pauseTimer = setTimeout(() => {\n this.pauseTimer = null;\n if (!v.paused || v.ended || this.active || this.ctx.isAdPlaying()) return;\n for (const p of this.pauses) {\n try {\n const cleanup = p.run();\n if (typeof cleanup === 'function') this.pauseCleanups.push(cleanup as () => void);\n } catch (err) {\n this.ctx.log(`Plugin \"${p.owner}\" failed in ads.onPause: ${(err as Error)?.message ?? err}`, { plugin: p.owner });\n }\n }\n }, delay);\n };\n\n private clearPause(): void {\n if (this.pauseTimer) clearTimeout(this.pauseTimer);\n this.pauseTimer = null;\n for (const c of this.pauseCleanups.splice(0)) {\n try {\n c();\n } catch {\n /* yok say */\n }\n }\n }\n\n private readonly onEnded = (): void => {\n this.clearPause();\n for (const e of this.endeds) e.run();\n };\n\n private readonly onKeyDown = (e: KeyboardEvent): void => {\n if ((this.active || this.gateRunning) && BLOCKED_KEYS.has(e.key)) e.preventDefault();\n };\n}\n","// Eklentileri kurar / kaldırır; eklenenleri izler ve temizler, hataları yakalar.\nimport { createIcon } from '../icons/Icon';\nimport { PluginAds } from './PluginAds';\nimport type { SettingsSubmenuDef, SettingsSubmenuItem } from '../controls/SettingsMenu';\nimport {\n PLUGIN_API_VERSION,\n type HopePlugin,\n type PlayerApi,\n type PluginButtonHandle,\n type PluginButtonOptions,\n type PluginCleanup,\n type PluginEntry,\n type PluginLabel,\n type PluginLayerHandle,\n type PluginLayerOptions,\n type PluginLoader,\n type PluginSettingsHandle,\n} from './types';\n\n/** Player → PluginHost bağlamı (eklentiler görmez). */\nexport interface PluginHostContext {\n element: HTMLElement;\n video: HTMLVideoElement;\n videoArea: HTMLElement;\n /** Alt katmanlar bunun önüne eklenir. */\n chromeEl: HTMLElement;\n labels: Readonly<Record<string, unknown>>;\n locale(): string;\n currentSrc(): string | null;\n isAdPlaying(): boolean;\n /** Reklam kilidi (`blockChrome('ads')`). */\n blockAds(): void;\n unblockAds(): void;\n isFullscreen(): boolean;\n addControlButton(button: HTMLButtonElement, position: 'left' | 'right'): void;\n settings: {\n registerToggle(row: { key: string; label: string; getValueLabel(): string; onToggle(): void }): void;\n unregisterToggle(key: string): void;\n registerSubmenu(def: SettingsSubmenuDef): void;\n unregisterSubmenu(key: string): void;\n };\n log(message: string, details?: Record<string, string | number | boolean | undefined>): void;\n}\n\ninterface Instance {\n plugin: HopePlugin<any>;\n optionsKey: string;\n api: PlayerApi;\n disposers: Array<() => void>;\n /** Dil değişince yeniden çizilecekler. */\n relabel: Array<() => void>;\n localeHandlers: Array<(locale: string) => void>;\n cleanup: PluginCleanup | null;\n removed: boolean;\n}\n\n/** `Shift+W` gibi kısayol. */\ninterface KeySpec {\n key: string;\n shift: boolean | null;\n alt: boolean;\n ctrl: boolean;\n meta: boolean;\n}\n\nexport interface PluginShortcut {\n keys: string[];\n description: string;\n}\n\nconst resolve = (label: PluginLabel): string => (typeof label === 'function' ? label() : label);\n\nfunction parseKey(spec: string): KeySpec {\n const parts = spec.split('+');\n // \"Shift++\" gibi: son parça boşsa tuş \"+\".\n const key = (parts.pop() || '+').toLowerCase();\n const mods = parts.map((p) => p.toLowerCase());\n const letter = /^[a-z]$/.test(key);\n return { key, shift: mods.includes('shift') ? true : letter ? false : null, alt: mods.includes('alt'), ctrl: mods.includes('ctrl') || mods.includes('control'), meta: mods.includes('meta') || mods.includes('cmd') };\n}\n\nfunction matches(spec: KeySpec, e: KeyboardEvent): boolean {\n return (\n e.key.toLowerCase() === spec.key &&\n e.altKey === spec.alt &&\n e.ctrlKey === spec.ctrl &&\n e.metaKey === spec.meta &&\n (spec.shift === null || e.shiftKey === spec.shift)\n );\n}\n\nexport class PluginHost {\n private readonly instances = new Map<string, Instance>();\n private readonly shortcutList: Array<{ owner: string; spec: KeySpec; label: string; description: PluginLabel | undefined; handler: (e: KeyboardEvent) => void }> = [];\n private syncSeq = 0;\n private toastEl: HTMLDivElement | null = null;\n private toastTimer: ReturnType<typeof setTimeout> | null = null;\n /** Ayar satırı anahtarları. */\n private keySeq = 0;\n private readonly ads: PluginAds;\n\n constructor(private readonly ctx: PluginHostContext) {\n ctx.element.addEventListener('keydown', this.onKeyDown);\n this.ads = new PluginAds(ctx);\n }\n\n /** IMA tag'i eklenti dönüşümlerinden geçirir. */\n transformAdTag(url: string, type: 'preroll' | 'midroll' | 'postroll'): string {\n return this.ads.transformTag(url, type);\n }\n\n /** Listeye eşitler: kurar, kaldırır, günceller (aynı adlıda sonraki kazanır). */\n async sync(builtin: PluginEntry[], user: PluginEntry[]): Promise<void> {\n const seq = ++this.syncSeq;\n const resolved = await Promise.all([...builtin, ...user].map((e) => this.resolveEntry(e)));\n if (seq !== this.syncSeq) return; // daha yenisi başladı\n const wanted = new Map<string, { plugin: HopePlugin<any>; options: unknown }>();\n for (const r of resolved) if (r) wanted.set(r.plugin.name, r);\n\n for (const [name, inst] of this.instances) if (!wanted.has(name)) this.dispose(name, inst);\n for (const [name, { plugin, options }] of wanted) {\n const key = optionsKey(options);\n const inst = this.instances.get(name);\n if (inst && inst.plugin === plugin) {\n if (inst.optionsKey === key) continue;\n if (plugin.update) {\n inst.optionsKey = key;\n this.guard(name, () => plugin.update!(options))();\n continue;\n }\n }\n if (inst) this.dispose(name, inst);\n await this.install(plugin, options, key);\n }\n }\n\n /** Dil değişince. */\n refreshLabels(): void {\n for (const [name, inst] of this.instances) {\n for (const fn of inst.relabel) this.guard(name, fn)();\n for (const fn of inst.localeHandlers) this.guard(name, () => fn(this.ctx.locale()))();\n }\n }\n\n /** `?` listesi için. */\n shortcuts(): PluginShortcut[] {\n return this.shortcutList.filter((s) => s.description !== undefined).map((s) => ({ keys: [s.label], description: resolve(s.description!) }));\n }\n\n has(name: string): boolean {\n return this.instances.has(name);\n }\n\n destroy(): void {\n ++this.syncSeq;\n for (const [name, inst] of this.instances) this.dispose(name, inst);\n this.ctx.element.removeEventListener('keydown', this.onKeyDown);\n this.ads.destroy();\n this.toastEl?.remove();\n if (this.toastTimer) clearTimeout(this.toastTimer);\n }\n\n // ── Kurulum ──\n\n private async resolveEntry(entry: PluginEntry): Promise<{ plugin: HopePlugin<any>; options: unknown } | null> {\n const [target, options] = Array.isArray(entry) ? entry : [entry, undefined];\n try {\n if (typeof target === 'function') {\n const mod = await (target as PluginLoader)();\n const plugin = 'setup' in mod ? mod : 'default' in mod ? mod.default : mod.plugin;\n return plugin && typeof plugin.setup === 'function' ? { plugin, options } : null;\n }\n return target && typeof target.setup === 'function' && typeof target.name === 'string' ? { plugin: target, options } : null;\n } catch (err) {\n this.ctx.log(`Plugin could not be loaded: ${(err as Error)?.message ?? err}`, { plugin: typeof target === 'function' ? 'loader' : String((target as HopePlugin)?.name) });\n return null;\n }\n }\n\n private async install(plugin: HopePlugin<any>, options: unknown, key: string): Promise<void> {\n const name = plugin.name;\n if (plugin.apiVersion && plugin.apiVersion > PLUGIN_API_VERSION) {\n this.ctx.log(`Plugin \"${name}\" was written for plugin API v${plugin.apiVersion}; this player has v${PLUGIN_API_VERSION}`, { plugin: name });\n }\n const inst: Instance = { plugin, optionsKey: key, api: null as unknown as PlayerApi, disposers: [], relabel: [], localeHandlers: [], cleanup: null, removed: false };\n inst.api = this.createApi(inst);\n this.instances.set(name, inst);\n try {\n const result = await plugin.setup(inst.api, options);\n if (inst.removed) {\n if (typeof result === 'function') this.guard(name, result)();\n return;\n }\n if (typeof result === 'function') inst.cleanup = result;\n } catch (err) {\n this.report(name, err, 'setup');\n this.dispose(name, inst);\n }\n }\n\n private dispose(name: string, inst: Instance): void {\n if (inst.removed) return;\n inst.removed = true;\n if (this.instances.get(name) === inst) this.instances.delete(name);\n if (inst.cleanup) this.guard(name, inst.cleanup)();\n // Ters sırada kaldır.\n for (const d of inst.disposers.reverse()) {\n try {\n d();\n } catch {\n /* yok say */\n }\n }\n inst.disposers = [];\n this.ads.removeOwner(name);\n for (let i = this.shortcutList.length - 1; i >= 0; i--) if (this.shortcutList[i]!.owner === name) this.shortcutList.splice(i, 1);\n }\n\n private report(name: string, err: unknown, where: string): void {\n const message = (err as Error)?.message ?? String(err);\n this.ctx.log(`Plugin \"${name}\" failed in ${where}: ${message}`, { plugin: name });\n console.error(`[hope-player] plugin \"${name}\" (${where}):`, err);\n }\n\n /** Eklenti kodu hep bundan çağrılır; hata player'a geçmez. */\n private guard<A extends unknown[]>(name: string, fn: (...args: A) => unknown, where = 'handler'): (...args: A) => void {\n return (...args: A) => {\n try {\n const r = fn(...args);\n if (r instanceof Promise) r.catch((err) => this.report(name, err, where));\n } catch (err) {\n this.report(name, err, where);\n }\n };\n }\n\n private readonly onKeyDown = (e: KeyboardEvent): void => {\n // Player'ın kendi tuşları önce; işlendiyse karışma.\n if (e.defaultPrevented) return;\n const target = e.composedPath()[0];\n if (target instanceof HTMLElement && (target.isContentEditable || /^(input|textarea|select)$/i.test(target.tagName))) return;\n for (const s of this.shortcutList) {\n if (matches(s.spec, e)) {\n e.preventDefault();\n s.handler(e);\n return;\n }\n }\n };\n\n // ── PlayerApi ──\n\n private createApi(inst: Instance): PlayerApi {\n const ctx = this.ctx;\n const name = inst.plugin.name;\n const track = (dispose: () => void): void => {\n if (inst.removed) dispose();\n else inst.disposers.push(dispose);\n };\n const guard = <A extends unknown[]>(fn: (...args: A) => unknown, where?: string) => this.guard(name, fn, where);\n const strings: Record<string, Record<string, string>> = {};\n const host = this;\n\n const on = (event: string, handler: (event: Event) => void, once = false): (() => void) => {\n // `x:y` olayları elementte, diğerleri videoda.\n const target: EventTarget = event.includes(':') ? ctx.element : ctx.video;\n const wrapped = guard((ev: Event) => {\n if (once) off();\n handler(ev);\n }, `on(${event})`);\n target.addEventListener(event, wrapped);\n let done = false;\n const off = (): void => {\n if (done) return;\n done = true;\n target.removeEventListener(event, wrapped);\n };\n track(off);\n return off;\n };\n\n const api: PlayerApi = {\n plugin: name,\n apiVersion: PLUGIN_API_VERSION,\n element: ctx.element,\n video: ctx.video,\n get locale() {\n return ctx.locale();\n },\n labels: ctx.labels,\n get currentTime() {\n return ctx.video.currentTime;\n },\n get duration() {\n return ctx.video.duration;\n },\n get paused() {\n return ctx.video.paused;\n },\n get isLive() {\n return ctx.video.duration === Infinity;\n },\n get isAdPlaying() {\n return ctx.isAdPlaying();\n },\n get isFullscreen() {\n return ctx.isFullscreen();\n },\n get src() {\n return ctx.currentSrc();\n },\n play: () => ctx.video.play(),\n pause: () => ctx.video.pause(),\n seek: (time: number) => {\n if (Number.isFinite(time)) ctx.video.currentTime = Math.max(0, time);\n },\n on: (event, handler) => on(event, handler),\n once: (event, handler) => on(event, handler, true),\n emit: (event, detail) => {\n ctx.element.dispatchEvent(new CustomEvent(`${name}:${event}`, { detail, bubbles: true, composed: true }));\n },\n onSourceChange: (handler) => on('loadstart', () => handler(ctx.currentSrc())),\n onLocaleChange: (handler) => {\n inst.localeHandlers.push(handler);\n const off = (): void => {\n const i = inst.localeHandlers.indexOf(handler);\n if (i >= 0) inst.localeHandlers.splice(i, 1);\n };\n track(off);\n return off;\n },\n onDestroy: (handler) => track(guard(handler, 'onDestroy')),\n setTimeout: (handler, ms) => {\n const id = window.setTimeout(guard(handler, 'setTimeout'), ms);\n track(() => clearTimeout(id));\n return id;\n },\n setInterval: (handler, ms) => {\n const id = window.setInterval(guard(handler, 'setInterval'), ms);\n track(() => clearInterval(id));\n return id;\n },\n ui: {\n addButton: (o) => host.addButton(inst, o, track, guard),\n addLayer: (o) => host.addLayer(inst, o ?? {}, track),\n toast: (message, o) => host.toast(message, o?.durationMs),\n },\n settings: {\n addToggle: (o) => {\n const key = `plugin:${name}:toggle:${++host.keySeq}`;\n const register = (): void =>\n ctx.settings.registerToggle({\n key,\n label: resolve(o.label),\n getValueLabel: () => (o.get() ? onOff(ctx.labels, true) : onOff(ctx.labels, false)),\n onToggle: guard(() => o.set(!o.get()), 'settings.toggle'),\n });\n register();\n inst.relabel.push(register);\n track(() => ctx.settings.unregisterToggle(key));\n return settingsHandle(register, () => ctx.settings.unregisterToggle(key));\n },\n addSelect: (o) => {\n const key = `plugin:${name}:select:${++host.keySeq}`;\n const list = () => (typeof o.options === 'function' ? o.options() : o.options);\n const register = (): void =>\n ctx.settings.registerSubmenu({\n key,\n title: resolve(o.label),\n getValueLabel: () => {\n const current = list().find((x) => x.value === o.get());\n return current ? resolve(current.label) : '';\n },\n getItems: () => list().map((x) => ({ label: resolve(x.label), active: x.value === o.get(), onSelect: guard(() => o.set(x.value), 'settings.select') })),\n });\n register();\n inst.relabel.push(register);\n track(() => ctx.settings.unregisterSubmenu(key));\n return settingsHandle(register, () => ctx.settings.unregisterSubmenu(key));\n },\n addSubmenu: (o) => {\n const key = `plugin:${name}:submenu:${++host.keySeq}`;\n const register = (): void =>\n ctx.settings.registerSubmenu({\n key,\n title: resolve(o.label),\n getValueLabel: () => (o.value ? o.value() : ''),\n getItems: (): SettingsSubmenuItem[] =>\n o.items().map((x) => ({ label: resolve(x.label), active: !!x.active, onSelect: guard(() => x.onSelect(), 'settings.submenu') })),\n });\n register();\n inst.relabel.push(register);\n track(() => ctx.settings.unregisterSubmenu(key));\n return settingsHandle(register, () => ctx.settings.unregisterSubmenu(key));\n },\n },\n keys: {\n add: (key, handler, description) => {\n const entry = { owner: name, spec: parseKey(key), label: key, description, handler: guard(handler, `keys(${key})`) };\n host.shortcutList.push(entry);\n const off = (): void => {\n const i = host.shortcutList.indexOf(entry);\n if (i >= 0) host.shortcutList.splice(i, 1);\n };\n track(off);\n return off;\n },\n },\n i18n: {\n add: (more) => {\n for (const [locale, values] of Object.entries(more)) strings[locale] = { ...strings[locale], ...values };\n },\n t: (key, fallback) => strings[ctx.locale()]?.[key] ?? strings.en?.[key] ?? fallback ?? key,\n },\n storage: {\n get: <T>(key: string, fallback?: T): T | undefined => {\n try {\n const raw = localStorage.getItem(storageKey(name, key));\n return raw === null ? fallback : (JSON.parse(raw) as T);\n } catch {\n return fallback;\n }\n },\n set: (key, value) => {\n try {\n localStorage.setItem(storageKey(name, key), JSON.stringify(value));\n } catch {\n /* yok say */\n }\n },\n remove: (key) => {\n try {\n localStorage.removeItem(storageKey(name, key));\n } catch {\n /* yok say */\n }\n },\n },\n ads: (() => {\n const raw = host.ads.api(name, guard);\n // Dönen kaldırıcılar eklenti kaldırılınca da çağrılır.\n const tracked = <F extends (...a: any[]) => () => void>(fn: F) =>\n ((...a: Parameters<F>) => {\n const off = fn(...a);\n track(off);\n return off;\n }) as F;\n return {\n requestBreak: raw.requestBreak,\n beforeContent: tracked(raw.beforeContent),\n atTime: tracked(raw.atTime),\n onPause: tracked(raw.onPause),\n onEnded: tracked(raw.onEnded),\n transformTag: tracked(raw.transformTag),\n };\n })(),\n log: (message, details) => ctx.log(message, { plugin: name, ...details }),\n };\n return api;\n }\n\n private addButton(\n inst: Instance,\n o: PluginButtonOptions,\n track: (d: () => void) => void,\n guard: <A extends unknown[]>(fn: (...args: A) => unknown, where?: string) => (...args: A) => void\n ): PluginButtonHandle {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className =\n 'hp-chip hp-plugin-btn hp:flex hp:items-center hp:justify-center hp:w-[var(--hp-ctrl-btn-size)] hp:h-[var(--hp-ctrl-btn-size)] hp:cursor-pointer hp:shrink-0';\n btn.setAttribute('part', `plugin-button plugin-${inst.plugin.name}`);\n btn.dataset.plugin = inst.plugin.name;\n let label: PluginLabel = o.label;\n let active = !!o.active;\n const setIcon = (icon: string): void => {\n btn.textContent = '';\n if (icon.trim().startsWith('<')) {\n btn.insertAdjacentHTML('beforeend', icon);\n btn.querySelector('svg')?.setAttribute('aria-hidden', 'true');\n } else btn.appendChild(createIcon(icon, 'hp:text-[length:var(--hp-ctrl-icon-size)]'));\n };\n const applyLabel = (): void => btn.setAttribute('aria-label', resolve(label));\n const applyActive = (): void => {\n if (o.active !== undefined) btn.setAttribute('aria-pressed', String(active));\n };\n setIcon(o.icon);\n applyLabel();\n applyActive();\n inst.relabel.push(applyLabel);\n const handle: PluginButtonHandle = {\n el: btn,\n get active() {\n return active;\n },\n setLabel: (l) => {\n label = l;\n applyLabel();\n },\n setIcon,\n setActive: (a) => {\n active = a;\n btn.setAttribute('aria-pressed', String(a));\n },\n show: () => {\n btn.style.display = '';\n },\n hide: () => {\n btn.style.display = 'none';\n },\n remove: () => btn.remove(),\n };\n if (o.onClick) {\n const click = guard((e: MouseEvent) => o.onClick!(e, handle), 'button.onClick');\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n click(e);\n });\n }\n this.ctx.addControlButton(btn, o.position ?? 'right');\n track(() => btn.remove());\n return handle;\n }\n\n private addLayer(inst: Instance, o: PluginLayerOptions, track: (d: () => void) => void): PluginLayerHandle {\n const el = document.createElement('div');\n el.className = 'hp-plugin-layer';\n el.setAttribute('part', `plugin-layer plugin-${inst.plugin.name}`);\n el.dataset.plugin = inst.plugin.name;\n el.dataset.position = o.position ?? 'fill';\n el.toggleAttribute('data-autohide', !!o.autoHide);\n el.toggleAttribute('data-interactive', !!o.interactive);\n el.toggleAttribute('data-above', !!o.above);\n let visible = o.visible !== false;\n el.hidden = !visible;\n\n if (o.above) this.ctx.videoArea.appendChild(el);\n else this.ctx.videoArea.insertBefore(el, this.ctx.chromeEl);\n // Stil katmanın dışında: `el.innerHTML` silmesin.\n let style: HTMLStyleElement | null = null;\n if (o.css) {\n style = document.createElement('style');\n style.textContent = o.css;\n el.before(style);\n }\n const removeAll = (): void => {\n el.remove();\n style?.remove();\n };\n if (o.interactive) {\n // Tıklama videoya geçmesin.\n for (const ev of ['pointerdown', 'mousedown', 'mouseup', 'touchstart', 'touchend', 'click', 'dblclick'] as const) el.addEventListener(ev, (e) => e.stopPropagation());\n }\n track(removeAll);\n const set = (v: boolean): void => {\n visible = v;\n el.hidden = !v;\n };\n return {\n el,\n get visible() {\n return visible;\n },\n show: () => set(true),\n hide: () => set(false),\n toggle: (force) => set(force ?? !visible),\n remove: removeAll,\n };\n }\n\n private toast(message: string, durationMs = 2500): void {\n if (!this.toastEl) {\n this.toastEl = document.createElement('div');\n this.toastEl.className = 'hp-plugin-toast';\n this.toastEl.setAttribute('part', 'plugin-toast');\n this.toastEl.setAttribute('role', 'status');\n this.toastEl.setAttribute('aria-live', 'polite');\n this.ctx.videoArea.appendChild(this.toastEl);\n }\n this.toastEl.textContent = message;\n this.toastEl.setAttribute('data-visible', '');\n if (this.toastTimer) clearTimeout(this.toastTimer);\n this.toastTimer = setTimeout(() => this.toastEl?.removeAttribute('data-visible'), Math.max(500, durationMs));\n }\n}\n\nfunction settingsHandle(register: () => void, remove: () => void): PluginSettingsHandle {\n return { refresh: register, remove };\n}\n\nfunction onOff(labels: Readonly<Record<string, unknown>>, on: boolean): string {\n const value = on ? labels.a11yOn : labels.a11yOff;\n return typeof value === 'string' ? value : on ? 'On' : 'Off';\n}\n\nfunction storageKey(plugin: string, key: string): string {\n return `hp-plugin:${plugin}:${key}`;\n}\n\n/** Seçenek karşılaştırma anahtarı. */\nfunction optionsKey(options: unknown): string {\n try {\n return JSON.stringify(options ?? null, (_k, v: unknown) => (typeof v === 'function' ? `fn:${(v as { name?: string }).name ?? ''}` : v));\n } catch {\n return String(Math.random());\n }\n}\n\nexport { PLUGIN_API_VERSION };\nexport type { PluginShortcut as Shortcut };\n"],"names":["DEFAULT_BREAK_TIMEOUT_MS","PREROLL_GATE_TIMEOUT_MS","DEFAULT_PAUSE_DELAY_MS","BLOCKED_KEYS","PluginAds","ctx","__publicField","m","v","pos","prev","seeked","crossed","s","delay","p","cleanup","err","_a","owner","x","url","type","out","t","next","guard","add","list","item","i","run","options","seconds","marks","a","b","fire","fn","wasPlaying","layer","ev","e","ctrl","resolve","done","finish","timer","fail","name","plugin","all","r","c","label","parseKey","spec","parts","key","mods","letter","matches","PluginHost","target","builtin","user","seq","resolved","wanted","inst","optionsKey","entry","mod","PLUGIN_API_VERSION","result","d","where","message","args","track","dispose","strings","host","on","event","handler","once","wrapped","off","time","detail","ms","id","o","register","onOff","settingsHandle","current","description","more","locale","values","fallback","_b","raw","storageKey","value","tracked","details","btn","active","setIcon","icon","createIcon","applyLabel","applyActive","handle","click","el","visible","style","removeAll","set","force","durationMs","remove","labels","_k"],"mappings":"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"}
1
+ {"version":3,"file":"pluginHost-cN2uGFeG.js","sources":["../../src/plugin-api/PluginAds.ts","../../src/plugin-api/PluginHost.ts"],"sourcesContent":["// Eklenti reklam API'si: reklam arası, preroll kapısı, midroll noktaları, duraklatma / bitiş kancaları, tag dönüşümü.\nimport type { PluginAdBreak, PluginAdBreakOptions, PluginAdBreakType, PluginCleanup } from './types';\n\nexport interface PluginAdsContext {\n element: HTMLElement;\n video: HTMLVideoElement;\n videoArea: HTMLElement;\n isAdPlaying(): boolean;\n /** Player'ın reklam kilidi (kontroller gizli, isAdPlaying true). */\n blockAds(): void;\n unblockAds(): void;\n log(message: string, details?: Record<string, string | number | boolean | undefined>): void;\n}\n\nconst DEFAULT_BREAK_TIMEOUT_MS = 60_000;\nconst PREROLL_GATE_TIMEOUT_MS = 15_000;\nconst DEFAULT_PAUSE_DELAY_MS = 300;\n/** Reklam arasında engellenen içerik kısayolları. */\nconst BLOCKED_KEYS = new Set([' ', 'k', 'j', 'l', 'ArrowLeft', 'ArrowRight', ',', '.']);\n\ntype Guard = <A extends unknown[]>(fn: (...args: A) => unknown, where?: string) => (...args: A) => void;\n\ninterface Mid {\n owner: string;\n marks: number[];\n fired: Set<number>;\n seekPast: 'last' | 'skip';\n fire: (mark: number) => void;\n}\n\ninterface Active {\n owner: string;\n finish: () => void;\n}\n\nexport class PluginAds {\n private active: Active | null = null;\n private prerolls: Array<{ owner: string; run: () => unknown }> = [];\n private mids: Mid[] = [];\n private pauses: Array<{ owner: string; run: () => unknown; delayMs: number }> = [];\n private endeds: Array<{ owner: string; run: () => void }> = [];\n private transforms: Array<{ owner: string; fn: (url: string, type: PluginAdBreakType) => string }> = [];\n private prerollDone = false;\n private gateRunning = false;\n private contentStarted = false;\n private lastPos = 0;\n private seekPending = false;\n private pauseTimer: ReturnType<typeof setTimeout> | null = null;\n private pauseCleanups: Array<() => void> = [];\n\n constructor(private readonly ctx: PluginAdsContext) {\n const v = ctx.video;\n v.addEventListener('loadstart', this.onLoadStart);\n v.addEventListener('play', this.onPlay, true);\n v.addEventListener('playing', this.onPlaying);\n v.addEventListener('timeupdate', this.onTimeUpdate);\n v.addEventListener('seeking', this.onSeeking);\n v.addEventListener('pause', this.onPause);\n // Capture: playlist / yönlendirme dinleyicilerinden önce — postroll arası onlar çalışmadan başlar.\n v.addEventListener('ended', this.onEnded, true);\n ctx.element.addEventListener('keydown', this.onKeyDown, true);\n }\n\n destroy(): void {\n const v = this.ctx.video;\n v.removeEventListener('loadstart', this.onLoadStart);\n v.removeEventListener('play', this.onPlay, true);\n v.removeEventListener('playing', this.onPlaying);\n v.removeEventListener('timeupdate', this.onTimeUpdate);\n v.removeEventListener('seeking', this.onSeeking);\n v.removeEventListener('pause', this.onPause);\n v.removeEventListener('ended', this.onEnded, true);\n this.ctx.element.removeEventListener('keydown', this.onKeyDown, true);\n this.active?.finish();\n this.clearPause();\n }\n\n /** Eklenti kaldırılınca onun kayıtları ve süren arası. */\n removeOwner(owner: string): void {\n this.prerolls = this.prerolls.filter((x) => x.owner !== owner);\n this.mids = this.mids.filter((x) => x.owner !== owner);\n this.pauses = this.pauses.filter((x) => x.owner !== owner);\n this.endeds = this.endeds.filter((x) => x.owner !== owner);\n this.transforms = this.transforms.filter((x) => x.owner !== owner);\n if (this.active?.owner === owner) this.active.finish();\n }\n\n /** IMA isteği öncesi tüm eklentilerin dönüşümleri. */\n transformTag(url: string, type: PluginAdBreakType): string {\n let out = url;\n for (const t of this.transforms) {\n try {\n const next = t.fn(out, type);\n if (typeof next === 'string' && next) out = next;\n } catch (err) {\n this.ctx.log(`Plugin \"${t.owner}\" failed in ads.transformTag: ${(err as Error)?.message ?? err}`, { plugin: t.owner });\n }\n }\n return out;\n }\n\n /** Bir eklentiye verilen `ads` nesnesi. */\n api(owner: string, guard: Guard) {\n const add = <T>(list: T[], item: T): (() => void) => {\n list.push(item);\n return () => {\n const i = list.indexOf(item);\n if (i >= 0) list.splice(i, 1);\n };\n };\n return {\n requestBreak: (run: (ad: PluginAdBreak) => void | Promise<void>, options?: PluginAdBreakOptions) => this.requestBreak(owner, run, options),\n beforeContent: (run: () => unknown) => add(this.prerolls, { owner, run }),\n atTime: (seconds: number | number[], run: (s: number) => unknown, options?: { seekPast?: 'last' | 'skip' }) => {\n const marks = (Array.isArray(seconds) ? seconds : [seconds]).filter((s) => Number.isFinite(s) && s >= 0).sort((a, b) => a - b);\n const fire = guard((m: number) => run(m), 'ads.atTime');\n return add(this.mids, { owner, marks, fired: new Set<number>(), seekPast: options?.seekPast ?? 'last', fire });\n },\n onPause: (run: () => void | PluginCleanup, options?: { delayMs?: number }) =>\n add(this.pauses, { owner, run: () => run(), delayMs: options?.delayMs ?? DEFAULT_PAUSE_DELAY_MS }),\n onEnded: (run: () => unknown) => add(this.endeds, { owner, run: guard(() => run(), 'ads.onEnded') }),\n transformTag: (fn: (url: string, type: PluginAdBreakType) => string) => add(this.transforms, { owner, fn }),\n };\n }\n\n // ── Reklam arası ──\n\n private requestBreak(owner: string, run: (ad: PluginAdBreak) => void | Promise<void>, options?: PluginAdBreakOptions): Promise<boolean> {\n if (this.active || this.ctx.isAdPlaying()) return Promise.resolve(false);\n const v = this.ctx.video;\n const type: PluginAdBreakType = options?.type ?? (v.ended ? 'postroll' : !this.contentStarted ? 'preroll' : 'midroll');\n const wasPlaying = !v.paused && !v.ended;\n if (!v.paused) v.pause();\n this.ctx.blockAds();\n\n const layer = document.createElement('div');\n layer.className = 'hp-plugin-layer hp-plugin-ad';\n layer.setAttribute('part', `plugin-ad plugin-${owner}`);\n layer.dataset.plugin = owner;\n layer.dataset.position = 'fill';\n layer.toggleAttribute('data-above', true);\n layer.toggleAttribute('data-interactive', true);\n for (const ev of ['pointerdown', 'mousedown', 'mouseup', 'touchstart', 'touchend', 'click', 'dblclick'] as const) layer.addEventListener(ev, (e) => e.stopPropagation());\n this.ctx.videoArea.appendChild(layer);\n\n const ctrl = new AbortController();\n this.emit('hp:adstart', type, owner);\n\n return new Promise<boolean>((resolve) => {\n let done = false;\n const finish = (): void => {\n if (done) return;\n done = true;\n clearTimeout(timer);\n ctrl.abort();\n layer.remove();\n this.active = null;\n this.ctx.unblockAds();\n this.emit('hp:adend', type, owner);\n if (wasPlaying && type !== 'postroll') void v.play().catch(() => {});\n resolve(true);\n };\n const timer = setTimeout(() => {\n this.ctx.log(`Plugin \"${owner}\" ad break timed out`, { plugin: owner, type });\n finish();\n }, options?.timeoutMs ?? DEFAULT_BREAK_TIMEOUT_MS);\n this.active = { owner, finish };\n const fail = (err: unknown): void => {\n this.ctx.log(`Plugin \"${owner}\" failed in ads.requestBreak: ${(err as Error)?.message ?? err}`, { plugin: owner, type });\n finish();\n };\n try {\n Promise.resolve(run({ type, layer, signal: ctrl.signal, end: finish })).then(finish, fail);\n } catch (err) {\n fail(err);\n }\n });\n }\n\n private emit(name: 'hp:adstart' | 'hp:adend', type: PluginAdBreakType, plugin: string): void {\n this.ctx.element.dispatchEvent(new CustomEvent(name, { detail: { type, linear: true, plugin } }));\n }\n\n // ── Olaylar ──\n\n private readonly onLoadStart = (): void => {\n this.prerollDone = false;\n this.contentStarted = false;\n this.lastPos = 0;\n for (const m of this.mids) m.fired.clear();\n this.clearPause();\n };\n\n private readonly onPlay = (): void => {\n const v = this.ctx.video;\n // Reklam arasında / preroll beklenirken içerik oynamaz.\n if (this.active || this.gateRunning) {\n v.pause();\n return;\n }\n this.clearPause();\n if (this.prerollDone || !this.prerolls.length || this.ctx.isAdPlaying()) return;\n this.prerollDone = true;\n v.pause();\n void this.runPrerolls();\n };\n\n private async runPrerolls(): Promise<void> {\n this.gateRunning = true;\n const all = Promise.all(\n this.prerolls.map((p) =>\n Promise.resolve()\n .then(() => p.run())\n .catch((err) => this.ctx.log(`Plugin \"${p.owner}\" failed in ads.beforeContent: ${(err as Error)?.message ?? err}`, { plugin: p.owner }))\n )\n );\n await Promise.race([all, new Promise((r) => setTimeout(r, PREROLL_GATE_TIMEOUT_MS))]);\n // Süren bir ara varsa onun bitmesini bekle.\n while (this.active) await new Promise((r) => setTimeout(r, 100));\n this.gateRunning = false;\n void this.ctx.video.play().catch(() => {});\n }\n\n private readonly onPlaying = (): void => {\n if (!this.active && !this.ctx.isAdPlaying()) this.contentStarted = true;\n };\n\n private readonly onSeeking = (): void => {\n this.seekPending = true;\n };\n\n private readonly onTimeUpdate = (): void => {\n const v = this.ctx.video;\n const pos = v.currentTime;\n const prev = this.lastPos;\n this.lastPos = pos;\n const seeked = this.seekPending;\n this.seekPending = false;\n if (this.active || this.ctx.isAdPlaying() || v.paused || v.seeking || pos <= prev) return;\n for (const m of this.mids) {\n const crossed = m.marks.filter((s) => prev < s && s <= pos && !m.fired.has(s));\n if (!crossed.length) continue;\n for (const s of crossed) m.fired.add(s);\n // İleri sarınca geçilen noktalardan yalnızca sonuncusu (ya da hiçbiri).\n if (seeked && m.seekPast === 'skip') continue;\n m.fire(crossed[crossed.length - 1]!);\n }\n };\n\n private readonly onPause = (): void => {\n const v = this.ctx.video;\n if (!this.pauses.length || v.ended || v.seeking || this.active || this.gateRunning || this.ctx.isAdPlaying()) return;\n this.clearPause();\n const delay = Math.min(...this.pauses.map((p) => p.delayMs));\n this.pauseTimer = setTimeout(() => {\n this.pauseTimer = null;\n if (!v.paused || v.ended || this.active || this.ctx.isAdPlaying()) return;\n for (const p of this.pauses) {\n try {\n const cleanup = p.run();\n if (typeof cleanup === 'function') this.pauseCleanups.push(cleanup as () => void);\n } catch (err) {\n this.ctx.log(`Plugin \"${p.owner}\" failed in ads.onPause: ${(err as Error)?.message ?? err}`, { plugin: p.owner });\n }\n }\n }, delay);\n };\n\n private clearPause(): void {\n if (this.pauseTimer) clearTimeout(this.pauseTimer);\n this.pauseTimer = null;\n for (const c of this.pauseCleanups.splice(0)) {\n try {\n c();\n } catch {\n /* yok say */\n }\n }\n }\n\n private readonly onEnded = (): void => {\n this.clearPause();\n for (const e of this.endeds) e.run();\n };\n\n private readonly onKeyDown = (e: KeyboardEvent): void => {\n if ((this.active || this.gateRunning) && BLOCKED_KEYS.has(e.key)) e.preventDefault();\n };\n}\n","// Eklentileri kurar / kaldırır; eklenenleri izler ve temizler, hataları yakalar.\nimport { createIcon } from '../icons/Icon';\nimport { PluginAds } from './PluginAds';\nimport type { SettingsSubmenuDef, SettingsSubmenuItem } from '../controls/SettingsMenu';\nimport {\n PLUGIN_API_VERSION,\n type HopePlugin,\n type PlayerApi,\n type PluginButtonHandle,\n type PluginButtonOptions,\n type PluginCleanup,\n type PluginEntry,\n type PluginLabel,\n type PluginLayerHandle,\n type PluginLayerOptions,\n type PluginLoader,\n type PluginSettingsHandle,\n} from './types';\n\n/** Player → PluginHost bağlamı (eklentiler görmez). */\nexport interface PluginHostContext {\n element: HTMLElement;\n video: HTMLVideoElement;\n videoArea: HTMLElement;\n /** Alt katmanlar bunun önüne eklenir. */\n chromeEl: HTMLElement;\n labels: Readonly<Record<string, unknown>>;\n locale(): string;\n currentSrc(): string | null;\n isAdPlaying(): boolean;\n /** Reklam kilidi (`blockChrome('ads')`). */\n blockAds(): void;\n unblockAds(): void;\n isFullscreen(): boolean;\n addControlButton(button: HTMLButtonElement, position: 'left' | 'right'): void;\n settings: {\n registerToggle(row: { key: string; label: string; getValueLabel(): string; onToggle(): void }): void;\n unregisterToggle(key: string): void;\n registerSubmenu(def: SettingsSubmenuDef): void;\n unregisterSubmenu(key: string): void;\n };\n log(message: string, details?: Record<string, string | number | boolean | undefined>): void;\n}\n\ninterface Instance {\n plugin: HopePlugin<any>;\n optionsKey: string;\n api: PlayerApi;\n disposers: Array<() => void>;\n /** Dil değişince yeniden çizilecekler. */\n relabel: Array<() => void>;\n localeHandlers: Array<(locale: string) => void>;\n cleanup: PluginCleanup | null;\n removed: boolean;\n}\n\n/** `Shift+W` gibi kısayol. */\ninterface KeySpec {\n key: string;\n shift: boolean | null;\n alt: boolean;\n ctrl: boolean;\n meta: boolean;\n}\n\nexport interface PluginShortcut {\n keys: string[];\n description: string;\n}\n\nconst resolve = (label: PluginLabel): string => (typeof label === 'function' ? label() : label);\n\nfunction parseKey(spec: string): KeySpec {\n const parts = spec.split('+');\n // \"Shift++\" gibi: son parça boşsa tuş \"+\".\n const key = (parts.pop() || '+').toLowerCase();\n const mods = parts.map((p) => p.toLowerCase());\n const letter = /^[a-z]$/.test(key);\n return { key, shift: mods.includes('shift') ? true : letter ? false : null, alt: mods.includes('alt'), ctrl: mods.includes('ctrl') || mods.includes('control'), meta: mods.includes('meta') || mods.includes('cmd') };\n}\n\nfunction matches(spec: KeySpec, e: KeyboardEvent): boolean {\n return (\n e.key.toLowerCase() === spec.key &&\n e.altKey === spec.alt &&\n e.ctrlKey === spec.ctrl &&\n e.metaKey === spec.meta &&\n (spec.shift === null || e.shiftKey === spec.shift)\n );\n}\n\nexport class PluginHost {\n private readonly instances = new Map<string, Instance>();\n private readonly shortcutList: Array<{ owner: string; spec: KeySpec; label: string; description: PluginLabel | undefined; handler: (e: KeyboardEvent) => void }> = [];\n private syncSeq = 0;\n private toastEl: HTMLDivElement | null = null;\n private toastTimer: ReturnType<typeof setTimeout> | null = null;\n /** Ayar satırı anahtarları. */\n private keySeq = 0;\n private readonly ads: PluginAds;\n\n constructor(private readonly ctx: PluginHostContext) {\n ctx.element.addEventListener('keydown', this.onKeyDown);\n this.ads = new PluginAds(ctx);\n }\n\n /** IMA tag'i eklenti dönüşümlerinden geçirir. */\n transformAdTag(url: string, type: 'preroll' | 'midroll' | 'postroll'): string {\n return this.ads.transformTag(url, type);\n }\n\n /** Listeye eşitler: kurar, kaldırır, günceller (aynı adlıda sonraki kazanır). */\n async sync(builtin: PluginEntry[], user: PluginEntry[]): Promise<void> {\n const seq = ++this.syncSeq;\n const resolved = await Promise.all([...builtin, ...user].map((e) => this.resolveEntry(e)));\n if (seq !== this.syncSeq) return; // daha yenisi başladı\n const wanted = new Map<string, { plugin: HopePlugin<any>; options: unknown }>();\n for (const r of resolved) if (r) wanted.set(r.plugin.name, r);\n\n for (const [name, inst] of this.instances) if (!wanted.has(name)) this.dispose(name, inst);\n for (const [name, { plugin, options }] of wanted) {\n const key = optionsKey(options);\n const inst = this.instances.get(name);\n if (inst && inst.plugin === plugin) {\n if (inst.optionsKey === key) continue;\n if (plugin.update) {\n inst.optionsKey = key;\n this.guard(name, () => plugin.update!(options))();\n continue;\n }\n }\n if (inst) this.dispose(name, inst);\n await this.install(plugin, options, key);\n }\n }\n\n /** Dil değişince. */\n refreshLabels(): void {\n for (const [name, inst] of this.instances) {\n for (const fn of inst.relabel) this.guard(name, fn)();\n for (const fn of inst.localeHandlers) this.guard(name, () => fn(this.ctx.locale()))();\n }\n }\n\n /** `?` listesi için. */\n shortcuts(): PluginShortcut[] {\n return this.shortcutList.filter((s) => s.description !== undefined).map((s) => ({ keys: [s.label], description: resolve(s.description!) }));\n }\n\n has(name: string): boolean {\n return this.instances.has(name);\n }\n\n destroy(): void {\n ++this.syncSeq;\n for (const [name, inst] of this.instances) this.dispose(name, inst);\n this.ctx.element.removeEventListener('keydown', this.onKeyDown);\n this.ads.destroy();\n this.toastEl?.remove();\n if (this.toastTimer) clearTimeout(this.toastTimer);\n }\n\n // ── Kurulum ──\n\n private async resolveEntry(entry: PluginEntry): Promise<{ plugin: HopePlugin<any>; options: unknown } | null> {\n const [target, options] = Array.isArray(entry) ? entry : [entry, undefined];\n try {\n if (typeof target === 'function') {\n const mod = await (target as PluginLoader)();\n const plugin = 'setup' in mod ? mod : 'default' in mod ? mod.default : mod.plugin;\n return plugin && typeof plugin.setup === 'function' ? { plugin, options } : null;\n }\n return target && typeof target.setup === 'function' && typeof target.name === 'string' ? { plugin: target, options } : null;\n } catch (err) {\n this.ctx.log(`Plugin could not be loaded: ${(err as Error)?.message ?? err}`, { plugin: typeof target === 'function' ? 'loader' : String((target as HopePlugin)?.name) });\n return null;\n }\n }\n\n private async install(plugin: HopePlugin<any>, options: unknown, key: string): Promise<void> {\n const name = plugin.name;\n if (plugin.apiVersion && plugin.apiVersion > PLUGIN_API_VERSION) {\n this.ctx.log(`Plugin \"${name}\" was written for plugin API v${plugin.apiVersion}; this player has v${PLUGIN_API_VERSION}`, { plugin: name });\n }\n const inst: Instance = { plugin, optionsKey: key, api: null as unknown as PlayerApi, disposers: [], relabel: [], localeHandlers: [], cleanup: null, removed: false };\n inst.api = this.createApi(inst);\n this.instances.set(name, inst);\n try {\n const result = await plugin.setup(inst.api, options);\n if (inst.removed) {\n if (typeof result === 'function') this.guard(name, result)();\n return;\n }\n if (typeof result === 'function') inst.cleanup = result;\n } catch (err) {\n this.report(name, err, 'setup');\n this.dispose(name, inst);\n }\n }\n\n private dispose(name: string, inst: Instance): void {\n if (inst.removed) return;\n inst.removed = true;\n if (this.instances.get(name) === inst) this.instances.delete(name);\n if (inst.cleanup) this.guard(name, inst.cleanup)();\n // Ters sırada kaldır.\n for (const d of inst.disposers.reverse()) {\n try {\n d();\n } catch {\n /* yok say */\n }\n }\n inst.disposers = [];\n this.ads.removeOwner(name);\n for (let i = this.shortcutList.length - 1; i >= 0; i--) if (this.shortcutList[i]!.owner === name) this.shortcutList.splice(i, 1);\n }\n\n private report(name: string, err: unknown, where: string): void {\n const message = (err as Error)?.message ?? String(err);\n this.ctx.log(`Plugin \"${name}\" failed in ${where}: ${message}`, { plugin: name });\n console.error(`[hope-player] plugin \"${name}\" (${where}):`, err);\n }\n\n /** Eklenti kodu hep bundan çağrılır; hata player'a geçmez. */\n private guard<A extends unknown[]>(name: string, fn: (...args: A) => unknown, where = 'handler'): (...args: A) => void {\n return (...args: A) => {\n try {\n const r = fn(...args);\n if (r instanceof Promise) r.catch((err) => this.report(name, err, where));\n } catch (err) {\n this.report(name, err, where);\n }\n };\n }\n\n private readonly onKeyDown = (e: KeyboardEvent): void => {\n // Player'ın kendi tuşları önce; işlendiyse karışma.\n if (e.defaultPrevented) return;\n const target = e.composedPath()[0];\n if (target instanceof HTMLElement && (target.isContentEditable || /^(input|textarea|select)$/i.test(target.tagName))) return;\n for (const s of this.shortcutList) {\n if (matches(s.spec, e)) {\n e.preventDefault();\n s.handler(e);\n return;\n }\n }\n };\n\n // ── PlayerApi ──\n\n private createApi(inst: Instance): PlayerApi {\n const ctx = this.ctx;\n const name = inst.plugin.name;\n const track = (dispose: () => void): void => {\n if (inst.removed) dispose();\n else inst.disposers.push(dispose);\n };\n const guard = <A extends unknown[]>(fn: (...args: A) => unknown, where?: string) => this.guard(name, fn, where);\n const strings: Record<string, Record<string, string>> = {};\n const host = this;\n\n const on = (event: string, handler: (event: Event) => void, once = false): (() => void) => {\n // `x:y` olayları elementte, diğerleri videoda.\n const target: EventTarget = event.includes(':') ? ctx.element : ctx.video;\n const wrapped = guard((ev: Event) => {\n if (once) off();\n handler(ev);\n }, `on(${event})`);\n target.addEventListener(event, wrapped);\n let done = false;\n const off = (): void => {\n if (done) return;\n done = true;\n target.removeEventListener(event, wrapped);\n };\n track(off);\n return off;\n };\n\n const api: PlayerApi = {\n plugin: name,\n apiVersion: PLUGIN_API_VERSION,\n element: ctx.element,\n video: ctx.video,\n get locale() {\n return ctx.locale();\n },\n labels: ctx.labels,\n get currentTime() {\n return ctx.video.currentTime;\n },\n get duration() {\n return ctx.video.duration;\n },\n get paused() {\n return ctx.video.paused;\n },\n get isLive() {\n return ctx.video.duration === Infinity;\n },\n get isAdPlaying() {\n return ctx.isAdPlaying();\n },\n get isFullscreen() {\n return ctx.isFullscreen();\n },\n get src() {\n return ctx.currentSrc();\n },\n play: () => ctx.video.play(),\n pause: () => ctx.video.pause(),\n seek: (time: number) => {\n if (Number.isFinite(time)) ctx.video.currentTime = Math.max(0, time);\n },\n on: (event, handler) => on(event, handler),\n once: (event, handler) => on(event, handler, true),\n emit: (event, detail) => {\n ctx.element.dispatchEvent(new CustomEvent(`${name}:${event}`, { detail, bubbles: true, composed: true }));\n },\n onSourceChange: (handler) => on('loadstart', () => handler(ctx.currentSrc())),\n onLocaleChange: (handler) => {\n inst.localeHandlers.push(handler);\n const off = (): void => {\n const i = inst.localeHandlers.indexOf(handler);\n if (i >= 0) inst.localeHandlers.splice(i, 1);\n };\n track(off);\n return off;\n },\n onDestroy: (handler) => track(guard(handler, 'onDestroy')),\n setTimeout: (handler, ms) => {\n const id = window.setTimeout(guard(handler, 'setTimeout'), ms);\n track(() => clearTimeout(id));\n return id;\n },\n setInterval: (handler, ms) => {\n const id = window.setInterval(guard(handler, 'setInterval'), ms);\n track(() => clearInterval(id));\n return id;\n },\n ui: {\n addButton: (o) => host.addButton(inst, o, track, guard),\n addLayer: (o) => host.addLayer(inst, o ?? {}, track),\n toast: (message, o) => host.toast(message, o?.durationMs),\n },\n settings: {\n addToggle: (o) => {\n const key = `plugin:${name}:toggle:${++host.keySeq}`;\n const register = (): void =>\n ctx.settings.registerToggle({\n key,\n label: resolve(o.label),\n getValueLabel: () => (o.get() ? onOff(ctx.labels, true) : onOff(ctx.labels, false)),\n onToggle: guard(() => o.set(!o.get()), 'settings.toggle'),\n });\n register();\n inst.relabel.push(register);\n track(() => ctx.settings.unregisterToggle(key));\n return settingsHandle(register, () => ctx.settings.unregisterToggle(key));\n },\n addSelect: (o) => {\n const key = `plugin:${name}:select:${++host.keySeq}`;\n const list = () => (typeof o.options === 'function' ? o.options() : o.options);\n const register = (): void =>\n ctx.settings.registerSubmenu({\n key,\n title: resolve(o.label),\n getValueLabel: () => {\n const current = list().find((x) => x.value === o.get());\n return current ? resolve(current.label) : '';\n },\n getItems: () => list().map((x) => ({ label: resolve(x.label), active: x.value === o.get(), onSelect: guard(() => o.set(x.value), 'settings.select') })),\n });\n register();\n inst.relabel.push(register);\n track(() => ctx.settings.unregisterSubmenu(key));\n return settingsHandle(register, () => ctx.settings.unregisterSubmenu(key));\n },\n addSubmenu: (o) => {\n const key = `plugin:${name}:submenu:${++host.keySeq}`;\n const register = (): void =>\n ctx.settings.registerSubmenu({\n key,\n title: resolve(o.label),\n getValueLabel: () => (o.value ? o.value() : ''),\n getItems: (): SettingsSubmenuItem[] =>\n o.items().map((x) => ({ label: resolve(x.label), active: !!x.active, onSelect: guard(() => x.onSelect(), 'settings.submenu') })),\n });\n register();\n inst.relabel.push(register);\n track(() => ctx.settings.unregisterSubmenu(key));\n return settingsHandle(register, () => ctx.settings.unregisterSubmenu(key));\n },\n },\n keys: {\n add: (key, handler, description) => {\n const entry = { owner: name, spec: parseKey(key), label: key, description, handler: guard(handler, `keys(${key})`) };\n host.shortcutList.push(entry);\n const off = (): void => {\n const i = host.shortcutList.indexOf(entry);\n if (i >= 0) host.shortcutList.splice(i, 1);\n };\n track(off);\n return off;\n },\n },\n i18n: {\n add: (more) => {\n for (const [locale, values] of Object.entries(more)) strings[locale] = { ...strings[locale], ...values };\n },\n t: (key, fallback) => strings[ctx.locale()]?.[key] ?? strings.en?.[key] ?? fallback ?? key,\n },\n storage: {\n get: <T>(key: string, fallback?: T): T | undefined => {\n try {\n const raw = localStorage.getItem(storageKey(name, key));\n return raw === null ? fallback : (JSON.parse(raw) as T);\n } catch {\n return fallback;\n }\n },\n set: (key, value) => {\n try {\n localStorage.setItem(storageKey(name, key), JSON.stringify(value));\n } catch {\n /* yok say */\n }\n },\n remove: (key) => {\n try {\n localStorage.removeItem(storageKey(name, key));\n } catch {\n /* yok say */\n }\n },\n },\n ads: (() => {\n const raw = host.ads.api(name, guard);\n // Dönen kaldırıcılar eklenti kaldırılınca da çağrılır.\n const tracked = <F extends (...a: any[]) => () => void>(fn: F) =>\n ((...a: Parameters<F>) => {\n const off = fn(...a);\n track(off);\n return off;\n }) as F;\n return {\n requestBreak: raw.requestBreak,\n beforeContent: tracked(raw.beforeContent),\n atTime: tracked(raw.atTime),\n onPause: tracked(raw.onPause),\n onEnded: tracked(raw.onEnded),\n transformTag: tracked(raw.transformTag),\n };\n })(),\n log: (message, details) => ctx.log(message, { plugin: name, ...details }),\n };\n return api;\n }\n\n private addButton(\n inst: Instance,\n o: PluginButtonOptions,\n track: (d: () => void) => void,\n guard: <A extends unknown[]>(fn: (...args: A) => unknown, where?: string) => (...args: A) => void\n ): PluginButtonHandle {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className =\n 'hp-chip hp-plugin-btn hp:flex hp:items-center hp:justify-center hp:w-[var(--hp-ctrl-btn-size)] hp:h-[var(--hp-ctrl-btn-size)] hp:cursor-pointer hp:shrink-0';\n btn.setAttribute('part', `plugin-button plugin-${inst.plugin.name}`);\n btn.dataset.plugin = inst.plugin.name;\n let label: PluginLabel = o.label;\n let active = !!o.active;\n const setIcon = (icon: string): void => {\n btn.textContent = '';\n if (icon.trim().startsWith('<')) {\n btn.insertAdjacentHTML('beforeend', icon);\n btn.querySelector('svg')?.setAttribute('aria-hidden', 'true');\n } else btn.appendChild(createIcon(icon, 'hp:text-[length:var(--hp-ctrl-icon-size)]'));\n };\n const applyLabel = (): void => btn.setAttribute('aria-label', resolve(label));\n const applyActive = (): void => {\n if (o.active !== undefined) btn.setAttribute('aria-pressed', String(active));\n };\n setIcon(o.icon);\n applyLabel();\n applyActive();\n inst.relabel.push(applyLabel);\n const handle: PluginButtonHandle = {\n el: btn,\n get active() {\n return active;\n },\n setLabel: (l) => {\n label = l;\n applyLabel();\n },\n setIcon,\n setActive: (a) => {\n active = a;\n btn.setAttribute('aria-pressed', String(a));\n },\n show: () => {\n btn.style.display = '';\n },\n hide: () => {\n btn.style.display = 'none';\n },\n remove: () => btn.remove(),\n };\n if (o.onClick) {\n const click = guard((e: MouseEvent) => o.onClick!(e, handle), 'button.onClick');\n btn.addEventListener('click', (e) => {\n e.stopPropagation();\n click(e);\n });\n }\n this.ctx.addControlButton(btn, o.position ?? 'right');\n track(() => btn.remove());\n return handle;\n }\n\n private addLayer(inst: Instance, o: PluginLayerOptions, track: (d: () => void) => void): PluginLayerHandle {\n const el = document.createElement('div');\n el.className = 'hp-plugin-layer';\n el.setAttribute('part', `plugin-layer plugin-${inst.plugin.name}`);\n el.dataset.plugin = inst.plugin.name;\n el.dataset.position = o.position ?? 'fill';\n el.toggleAttribute('data-autohide', !!o.autoHide);\n el.toggleAttribute('data-interactive', !!o.interactive);\n el.toggleAttribute('data-above', !!o.above);\n let visible = o.visible !== false;\n el.hidden = !visible;\n\n if (o.above) this.ctx.videoArea.appendChild(el);\n else this.ctx.videoArea.insertBefore(el, this.ctx.chromeEl);\n // Stil katmanın dışında: `el.innerHTML` silmesin.\n let style: HTMLStyleElement | null = null;\n if (o.css) {\n style = document.createElement('style');\n style.textContent = o.css;\n el.before(style);\n }\n const removeAll = (): void => {\n el.remove();\n style?.remove();\n };\n if (o.interactive) {\n // Tıklama videoya geçmesin.\n for (const ev of ['pointerdown', 'mousedown', 'mouseup', 'touchstart', 'touchend', 'click', 'dblclick'] as const) el.addEventListener(ev, (e) => e.stopPropagation());\n }\n track(removeAll);\n const set = (v: boolean): void => {\n visible = v;\n el.hidden = !v;\n };\n return {\n el,\n get visible() {\n return visible;\n },\n show: () => set(true),\n hide: () => set(false),\n toggle: (force) => set(force ?? !visible),\n remove: removeAll,\n };\n }\n\n private toast(message: string, durationMs = 2500): void {\n if (!this.toastEl) {\n this.toastEl = document.createElement('div');\n this.toastEl.className = 'hp-plugin-toast';\n this.toastEl.setAttribute('part', 'plugin-toast');\n this.toastEl.setAttribute('role', 'status');\n this.toastEl.setAttribute('aria-live', 'polite');\n this.ctx.videoArea.appendChild(this.toastEl);\n }\n this.toastEl.textContent = message;\n this.toastEl.setAttribute('data-visible', '');\n if (this.toastTimer) clearTimeout(this.toastTimer);\n this.toastTimer = setTimeout(() => this.toastEl?.removeAttribute('data-visible'), Math.max(500, durationMs));\n }\n}\n\nfunction settingsHandle(register: () => void, remove: () => void): PluginSettingsHandle {\n return { refresh: register, remove };\n}\n\nfunction onOff(labels: Readonly<Record<string, unknown>>, on: boolean): string {\n const value = on ? labels.a11yOn : labels.a11yOff;\n return typeof value === 'string' ? value : on ? 'On' : 'Off';\n}\n\nfunction storageKey(plugin: string, key: string): string {\n return `hp-plugin:${plugin}:${key}`;\n}\n\n/** Seçenek karşılaştırma anahtarı. */\nfunction optionsKey(options: unknown): string {\n try {\n return JSON.stringify(options ?? null, (_k, v: unknown) => (typeof v === 'function' ? `fn:${(v as { name?: string }).name ?? ''}` : v));\n } catch {\n return String(Math.random());\n }\n}\n\nexport { PLUGIN_API_VERSION };\nexport type { PluginShortcut as Shortcut };\n"],"names":["DEFAULT_BREAK_TIMEOUT_MS","PREROLL_GATE_TIMEOUT_MS","DEFAULT_PAUSE_DELAY_MS","BLOCKED_KEYS","PluginAds","ctx","__publicField","m","v","pos","prev","seeked","crossed","s","delay","p","cleanup","err","_a","owner","x","url","type","out","t","next","guard","add","list","item","i","run","options","seconds","marks","a","b","fire","fn","wasPlaying","layer","ev","e","ctrl","resolve","done","finish","timer","fail","name","plugin","all","r","c","label","parseKey","spec","parts","key","mods","letter","matches","PluginHost","target","builtin","user","seq","resolved","wanted","inst","optionsKey","entry","mod","PLUGIN_API_VERSION","result","d","where","message","args","track","dispose","strings","host","on","event","handler","once","wrapped","off","time","detail","ms","id","o","register","onOff","settingsHandle","current","description","more","locale","values","fallback","_b","raw","storageKey","value","tracked","details","btn","active","setIcon","icon","createIcon","applyLabel","applyActive","handle","click","el","visible","style","removeAll","set","force","durationMs","remove","labels","_k"],"mappings":";;;;AAcA,MAAMA,IAA2B,KAC3BC,IAA0B,MAC1BC,IAAyB,KAEzBC,IAAe,oBAAI,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,aAAa,cAAc,KAAK,GAAG,CAAC;AAiB/E,MAAMC,EAAU;AAAA,EAenB,YAA6BC,GAAuB;AAd5C,IAAAC,EAAA,gBAAwB;AACxB,IAAAA,EAAA,kBAAyD,CAAA;AACzD,IAAAA,EAAA,cAAc,CAAA;AACd,IAAAA,EAAA,gBAAwE,CAAA;AACxE,IAAAA,EAAA,gBAAoD,CAAA;AACpD,IAAAA,EAAA,oBAA6F,CAAA;AAC7F,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,wBAAiB;AACjB,IAAAA,EAAA,iBAAU;AACV,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,oBAAmD;AACnD,IAAAA,EAAA,uBAAmC,CAAA;AAyI1B;AAAA,IAAAA,EAAA,qBAAc,MAAY;AACvC,WAAK,cAAc,IACnB,KAAK,iBAAiB,IACtB,KAAK,UAAU;AACf,iBAAWC,KAAK,KAAK,KAAM,CAAAA,EAAE,MAAM,MAAA;AACnC,WAAK,WAAA;AAAA,IACT;AAEiB,IAAAD,EAAA,gBAAS,MAAY;AAClC,YAAME,IAAI,KAAK,IAAI;AAEnB,UAAI,KAAK,UAAU,KAAK,aAAa;AACjC,QAAAA,EAAE,MAAA;AACF;AAAA,MACJ;AAEA,MADA,KAAK,WAAA,GACD,OAAK,eAAe,CAAC,KAAK,SAAS,UAAU,KAAK,IAAI,mBAC1D,KAAK,cAAc,IACnBA,EAAE,MAAA,GACG,KAAK,YAAA;AAAA,IACd;AAkBiB,IAAAF,EAAA,mBAAY,MAAY;AACrC,MAAI,CAAC,KAAK,UAAU,CAAC,KAAK,IAAI,YAAA,MAAe,KAAK,iBAAiB;AAAA,IACvE;AAEiB,IAAAA,EAAA,mBAAY,MAAY;AACrC,WAAK,cAAc;AAAA,IACvB;AAEiB,IAAAA,EAAA,sBAAe,MAAY;AACxC,YAAME,IAAI,KAAK,IAAI,OACbC,IAAMD,EAAE,aACRE,IAAO,KAAK;AAClB,WAAK,UAAUD;AACf,YAAME,IAAS,KAAK;AAEpB,UADA,KAAK,cAAc,IACf,OAAK,UAAU,KAAK,IAAI,YAAA,KAAiBH,EAAE,UAAUA,EAAE,WAAWC,KAAOC;AAC7E,mBAAWH,KAAK,KAAK,MAAM;AACvB,gBAAMK,IAAUL,EAAE,MAAM,OAAO,CAACM,MAAMH,IAAOG,KAAKA,KAAKJ,KAAO,CAACF,EAAE,MAAM,IAAIM,CAAC,CAAC;AAC7E,cAAKD,EAAQ,QACb;AAAA,uBAAWC,KAAKD,EAAS,CAAAL,EAAE,MAAM,IAAIM,CAAC;AAEtC,YAAIF,KAAUJ,EAAE,aAAa,UAC7BA,EAAE,KAAKK,EAAQA,EAAQ,SAAS,CAAC,CAAE;AAAA;AAAA,QACvC;AAAA,IACJ;AAEiB,IAAAN,EAAA,iBAAU,MAAY;AACnC,YAAME,IAAI,KAAK,IAAI;AACnB,UAAI,CAAC,KAAK,OAAO,UAAUA,EAAE,SAASA,EAAE,WAAW,KAAK,UAAU,KAAK,eAAe,KAAK,IAAI,cAAe;AAC9G,WAAK,WAAA;AACL,YAAMM,IAAQ,KAAK,IAAI,GAAG,KAAK,OAAO,IAAI,CAACC,MAAMA,EAAE,OAAO,CAAC;AAC3D,WAAK,aAAa,WAAW,MAAM;AAE/B,YADA,KAAK,aAAa,MACd,GAACP,EAAE,UAAUA,EAAE,SAAS,KAAK,UAAU,KAAK,IAAI;AACpD,qBAAWO,KAAK,KAAK;AACjB,gBAAI;AACA,oBAAMC,IAAUD,EAAE,IAAA;AAClB,cAAI,OAAOC,KAAY,cAAY,KAAK,cAAc,KAAKA,CAAqB;AAAA,YACpF,SAASC,GAAK;AACV,mBAAK,IAAI,IAAI,WAAWF,EAAE,KAAK,6BAA6BE,KAAA,gBAAAA,EAAe,YAAWA,CAAG,IAAI,EAAE,QAAQF,EAAE,OAAO;AAAA,YACpH;AAAA,MAER,GAAGD,CAAK;AAAA,IACZ;AAciB,IAAAR,EAAA,iBAAU,MAAY;AACnC,WAAK,WAAA;AACL,iBAAW,KAAK,KAAK,OAAQ,GAAE,IAAA;AAAA,IACnC;AAEiB,IAAAA,EAAA,mBAAY,CAAC,MAA2B;AACrD,OAAK,KAAK,UAAU,KAAK,gBAAgBH,EAAa,IAAI,EAAE,GAAG,KAAG,EAAE,eAAA;AAAA,IACxE;AA7O6B,SAAA,MAAAE;AACzB,UAAMG,IAAIH,EAAI;AACd,IAAAG,EAAE,iBAAiB,aAAa,KAAK,WAAW,GAChDA,EAAE,iBAAiB,QAAQ,KAAK,QAAQ,EAAI,GAC5CA,EAAE,iBAAiB,WAAW,KAAK,SAAS,GAC5CA,EAAE,iBAAiB,cAAc,KAAK,YAAY,GAClDA,EAAE,iBAAiB,WAAW,KAAK,SAAS,GAC5CA,EAAE,iBAAiB,SAAS,KAAK,OAAO,GAExCA,EAAE,iBAAiB,SAAS,KAAK,SAAS,EAAI,GAC9CH,EAAI,QAAQ,iBAAiB,WAAW,KAAK,WAAW,EAAI;AAAA,EAChE;AAAA,EAEA,UAAgB;;AACZ,UAAMG,IAAI,KAAK,IAAI;AACnB,IAAAA,EAAE,oBAAoB,aAAa,KAAK,WAAW,GACnDA,EAAE,oBAAoB,QAAQ,KAAK,QAAQ,EAAI,GAC/CA,EAAE,oBAAoB,WAAW,KAAK,SAAS,GAC/CA,EAAE,oBAAoB,cAAc,KAAK,YAAY,GACrDA,EAAE,oBAAoB,WAAW,KAAK,SAAS,GAC/CA,EAAE,oBAAoB,SAAS,KAAK,OAAO,GAC3CA,EAAE,oBAAoB,SAAS,KAAK,SAAS,EAAI,GACjD,KAAK,IAAI,QAAQ,oBAAoB,WAAW,KAAK,WAAW,EAAI,IACpEU,IAAA,KAAK,WAAL,QAAAA,EAAa,UACb,KAAK,WAAA;AAAA,EACT;AAAA;AAAA,EAGA,YAAYC,GAAqB;;AAC7B,SAAK,WAAW,KAAK,SAAS,OAAO,CAACC,MAAMA,EAAE,UAAUD,CAAK,GAC7D,KAAK,OAAO,KAAK,KAAK,OAAO,CAACC,MAAMA,EAAE,UAAUD,CAAK,GACrD,KAAK,SAAS,KAAK,OAAO,OAAO,CAACC,MAAMA,EAAE,UAAUD,CAAK,GACzD,KAAK,SAAS,KAAK,OAAO,OAAO,CAACC,MAAMA,EAAE,UAAUD,CAAK,GACzD,KAAK,aAAa,KAAK,WAAW,OAAO,CAACC,MAAMA,EAAE,UAAUD,CAAK,KAC7DD,IAAA,KAAK,WAAL,gBAAAA,EAAa,WAAUC,KAAO,KAAK,OAAO,OAAA;AAAA,EAClD;AAAA;AAAA,EAGA,aAAaE,GAAaC,GAAiC;AACvD,QAAIC,IAAMF;AACV,eAAWG,KAAK,KAAK;AACjB,UAAI;AACA,cAAMC,IAAOD,EAAE,GAAGD,GAAKD,CAAI;AAC3B,QAAI,OAAOG,KAAS,YAAYA,MAAMF,IAAME;AAAA,MAChD,SAASR,GAAK;AACV,aAAK,IAAI,IAAI,WAAWO,EAAE,KAAK,kCAAkCP,KAAA,gBAAAA,EAAe,YAAWA,CAAG,IAAI,EAAE,QAAQO,EAAE,OAAO;AAAA,MACzH;AAEJ,WAAOD;AAAA,EACX;AAAA;AAAA,EAGA,IAAIJ,GAAeO,GAAc;AAC7B,UAAMC,IAAM,CAAIC,GAAWC,OACvBD,EAAK,KAAKC,CAAI,GACP,MAAM;AACT,YAAMC,IAAIF,EAAK,QAAQC,CAAI;AAC3B,MAAIC,KAAK,KAAGF,EAAK,OAAOE,GAAG,CAAC;AAAA,IAChC;AAEJ,WAAO;AAAA,MACH,cAAc,CAACC,GAAkDC,MAAmC,KAAK,aAAab,GAAOY,GAAKC,CAAO;AAAA,MACzI,eAAe,CAACD,MAAuBJ,EAAI,KAAK,UAAU,EAAE,OAAAR,GAAO,KAAAY,GAAK;AAAA,MACxE,QAAQ,CAACE,GAA4BF,GAA6BC,MAA6C;AAC3G,cAAME,KAAS,MAAM,QAAQD,CAAO,IAAIA,IAAU,CAACA,CAAO,GAAG,OAAO,CAACpB,MAAM,OAAO,SAASA,CAAC,KAAKA,KAAK,CAAC,EAAE,KAAK,CAACsB,GAAGC,MAAMD,IAAIC,CAAC,GACvHC,IAAOX,EAAM,CAACnB,MAAcwB,EAAIxB,CAAC,GAAG,YAAY;AACtD,eAAOoB,EAAI,KAAK,MAAM,EAAE,OAAAR,GAAO,OAAAe,GAAO,OAAO,oBAAI,IAAA,GAAe,WAAUF,KAAA,gBAAAA,EAAS,aAAY,QAAQ,MAAAK,GAAM;AAAA,MACjH;AAAA,MACA,SAAS,CAACN,GAAiCC,MACvCL,EAAI,KAAK,QAAQ,EAAE,OAAAR,GAAO,KAAK,MAAMY,EAAA,GAAO,UAASC,KAAA,gBAAAA,EAAS,YAAW9B,GAAwB;AAAA,MACrG,SAAS,CAAC6B,MAAuBJ,EAAI,KAAK,QAAQ,EAAE,OAAAR,GAAO,KAAKO,EAAM,MAAMK,EAAA,GAAO,aAAa,GAAG;AAAA,MACnG,cAAc,CAACO,MAAyDX,EAAI,KAAK,YAAY,EAAE,OAAAR,GAAO,IAAAmB,EAAA,CAAI;AAAA,IAAA;AAAA,EAElH;AAAA;AAAA,EAIQ,aAAanB,GAAeY,GAAkDC,GAAkD;AACpI,QAAI,KAAK,UAAU,KAAK,IAAI,cAAe,QAAO,QAAQ,QAAQ,EAAK;AACvE,UAAMxB,IAAI,KAAK,IAAI,OACbc,KAA0BU,KAAA,gBAAAA,EAAS,UAASxB,EAAE,QAAQ,aAAc,KAAK,iBAA6B,YAAZ,YAC1F+B,IAAa,CAAC/B,EAAE,UAAU,CAACA,EAAE;AACnC,IAAKA,EAAE,UAAQA,EAAE,MAAA,GACjB,KAAK,IAAI,SAAA;AAET,UAAMgC,IAAQ,SAAS,cAAc,KAAK;AAC1C,IAAAA,EAAM,YAAY,gCAClBA,EAAM,aAAa,QAAQ,oBAAoBrB,CAAK,EAAE,GACtDqB,EAAM,QAAQ,SAASrB,GACvBqB,EAAM,QAAQ,WAAW,QACzBA,EAAM,gBAAgB,cAAc,EAAI,GACxCA,EAAM,gBAAgB,oBAAoB,EAAI;AAC9C,eAAWC,KAAM,CAAC,eAAe,aAAa,WAAW,cAAc,YAAY,SAAS,UAAU,KAAkB,iBAAiBA,GAAI,CAACC,MAAMA,EAAE,iBAAiB;AACvK,SAAK,IAAI,UAAU,YAAYF,CAAK;AAEpC,UAAMG,IAAO,IAAI,gBAAA;AACjB,gBAAK,KAAK,cAAcrB,GAAMH,CAAK,GAE5B,IAAI,QAAiB,CAACyB,MAAY;AACrC,UAAIC,IAAO;AACX,YAAMC,IAAS,MAAY;AACvB,QAAID,MACJA,IAAO,IACP,aAAaE,CAAK,GAClBJ,EAAK,MAAA,GACLH,EAAM,OAAA,GACN,KAAK,SAAS,MACd,KAAK,IAAI,WAAA,GACT,KAAK,KAAK,YAAYlB,GAAMH,CAAK,GAC7BoB,KAAcjB,MAAS,cAAiBd,EAAE,KAAA,EAAO,MAAM,MAAM;AAAA,QAAC,CAAC,GACnEoC,EAAQ,EAAI;AAAA,MAChB,GACMG,IAAQ,WAAW,MAAM;AAC3B,aAAK,IAAI,IAAI,WAAW5B,CAAK,wBAAwB,EAAE,QAAQA,GAAO,MAAAG,EAAA,CAAM,GAC5EwB,EAAA;AAAA,MACJ,IAAGd,KAAA,gBAAAA,EAAS,cAAahC,CAAwB;AACjD,WAAK,SAAS,EAAE,OAAAmB,GAAO,QAAA2B,EAAA;AACvB,YAAME,IAAO,CAAC/B,MAAuB;AACjC,aAAK,IAAI,IAAI,WAAWE,CAAK,kCAAkCF,KAAA,gBAAAA,EAAe,YAAWA,CAAG,IAAI,EAAE,QAAQE,GAAO,MAAAG,GAAM,GACvHwB,EAAA;AAAA,MACJ;AACA,UAAI;AACA,gBAAQ,QAAQf,EAAI,EAAE,MAAAT,GAAM,OAAAkB,GAAO,QAAQG,EAAK,QAAQ,KAAKG,GAAQ,CAAC,EAAE,KAAKA,GAAQE,CAAI;AAAA,MAC7F,SAAS/B,GAAK;AACV,QAAA+B,EAAK/B,CAAG;AAAA,MACZ;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEQ,KAAKgC,GAAiC3B,GAAyB4B,GAAsB;AACzF,SAAK,IAAI,QAAQ,cAAc,IAAI,YAAYD,GAAM,EAAE,QAAQ,EAAE,MAAA3B,GAAM,QAAQ,IAAM,QAAA4B,EAAA,EAAO,CAAG,CAAC;AAAA,EACpG;AAAA,EA0BA,MAAc,cAA6B;AACvC,SAAK,cAAc;AACnB,UAAMC,IAAM,QAAQ;AAAA,MAChB,KAAK,SAAS;AAAA,QAAI,CAACpC,MACf,QAAQ,QAAA,EACH,KAAK,MAAMA,EAAE,IAAA,CAAK,EAClB,MAAM,CAACE,MAAQ,KAAK,IAAI,IAAI,WAAWF,EAAE,KAAK,mCAAmCE,KAAA,gBAAAA,EAAe,YAAWA,CAAG,IAAI,EAAE,QAAQF,EAAE,MAAA,CAAO,CAAC;AAAA,MAAA;AAAA,IAC/I;AAIJ,SAFA,MAAM,QAAQ,KAAK,CAACoC,GAAK,IAAI,QAAQ,CAACC,MAAM,WAAWA,GAAGnD,CAAuB,CAAC,CAAC,CAAC,GAE7E,KAAK,SAAQ,OAAM,IAAI,QAAQ,CAACmD,MAAM,WAAWA,GAAG,GAAG,CAAC;AAC/D,SAAK,cAAc,IACd,KAAK,IAAI,MAAM,KAAA,EAAO,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC7C;AAAA,EA+CQ,aAAmB;AACvB,IAAI,KAAK,cAAY,aAAa,KAAK,UAAU,GACjD,KAAK,aAAa;AAClB,eAAWC,KAAK,KAAK,cAAc,OAAO,CAAC;AACvC,UAAI;AACA,QAAAA,EAAA;AAAA,MACJ,QAAQ;AAAA,MAER;AAAA,EAER;AAUJ;AC1NA,MAAMT,IAAU,CAACU,MAAgC,OAAOA,KAAU,aAAaA,MAAUA;AAEzF,SAASC,EAASC,GAAuB;AACrC,QAAMC,IAAQD,EAAK,MAAM,GAAG,GAEtBE,KAAOD,EAAM,IAAA,KAAS,KAAK,YAAA,GAC3BE,IAAOF,EAAM,IAAI,CAAC1C,MAAMA,EAAE,aAAa,GACvC6C,IAAS,UAAU,KAAKF,CAAG;AACjC,SAAO,EAAE,KAAAA,GAAK,OAAOC,EAAK,SAAS,OAAO,IAAI,KAAOC,IAAS,KAAQ,MAAM,KAAKD,EAAK,SAAS,KAAK,GAAG,MAAMA,EAAK,SAAS,MAAM,KAAKA,EAAK,SAAS,SAAS,GAAG,MAAMA,EAAK,SAAS,MAAM,KAAKA,EAAK,SAAS,KAAK,EAAA;AACtN;AAEA,SAASE,EAAQL,GAAe,GAA2B;AACvD,SACI,EAAE,IAAI,YAAA,MAAkBA,EAAK,OAC7B,EAAE,WAAWA,EAAK,OAClB,EAAE,YAAYA,EAAK,QACnB,EAAE,YAAYA,EAAK,SAClBA,EAAK,UAAU,QAAQ,EAAE,aAAaA,EAAK;AAEpD;AAEO,MAAMM,EAAW;AAAA,EAUpB,YAA6BzD,GAAwB;AATpC,IAAAC,EAAA,uCAAgB,IAAA;AAChB,IAAAA,EAAA,sBAAkJ,CAAA;AAC3J,IAAAA,EAAA,iBAAU;AACV,IAAAA,EAAA,iBAAiC;AACjC,IAAAA,EAAA,oBAAmD;AAEnD;AAAA,IAAAA,EAAA,gBAAS;AACA,IAAAA,EAAA;AAyIA,IAAAA,EAAA,mBAAY,CAAC,MAA2B;AAErD,UAAI,EAAE,iBAAkB;AACxB,YAAMyD,IAAS,EAAE,aAAA,EAAe,CAAC;AACjC,UAAI,EAAAA,aAAkB,gBAAgBA,EAAO,qBAAqB,6BAA6B,KAAKA,EAAO,OAAO;AAClH,mBAAW,KAAK,KAAK;AACjB,cAAIF,EAAQ,EAAE,MAAM,CAAC,GAAG;AACpB,cAAE,eAAA,GACF,EAAE,QAAQ,CAAC;AACX;AAAA,UACJ;AAAA;AAAA,IAER;AAnJ6B,SAAA,MAAAxD,GACzBA,EAAI,QAAQ,iBAAiB,WAAW,KAAK,SAAS,GACtD,KAAK,MAAM,IAAID,EAAUC,CAAG;AAAA,EAChC;AAAA;AAAA,EAGA,eAAegB,GAAaC,GAAkD;AAC1E,WAAO,KAAK,IAAI,aAAaD,GAAKC,CAAI;AAAA,EAC1C;AAAA;AAAA,EAGA,MAAM,KAAK0C,GAAwBC,GAAoC;AACnE,UAAMC,IAAM,EAAE,KAAK,SACbC,IAAW,MAAM,QAAQ,IAAI,CAAC,GAAGH,GAAS,GAAGC,CAAI,EAAE,IAAI,CAACvB,MAAM,KAAK,aAAaA,CAAC,CAAC,CAAC;AACzF,QAAIwB,MAAQ,KAAK,QAAS;AAC1B,UAAME,wBAAa,IAAA;AACnB,eAAWhB,KAAKe,EAAU,CAAIf,OAAU,IAAIA,EAAE,OAAO,MAAMA,CAAC;AAE5D,eAAW,CAACH,GAAMoB,CAAI,KAAK,KAAK,UAAW,CAAKD,EAAO,IAAInB,CAAI,KAAG,KAAK,QAAQA,GAAMoB,CAAI;AACzF,eAAW,CAACpB,GAAM,EAAE,QAAAC,GAAQ,SAAAlB,EAAA,CAAS,KAAKoC,GAAQ;AAC9C,YAAMV,IAAMY,EAAWtC,CAAO,GACxBqC,IAAO,KAAK,UAAU,IAAIpB,CAAI;AACpC,UAAIoB,KAAQA,EAAK,WAAWnB,GAAQ;AAChC,YAAImB,EAAK,eAAeX,EAAK;AAC7B,YAAIR,EAAO,QAAQ;AACf,UAAAmB,EAAK,aAAaX,GAClB,KAAK,MAAMT,GAAM,MAAMC,EAAO,OAAQlB,CAAO,CAAC,EAAA;AAC9C;AAAA,QACJ;AAAA,MACJ;AACA,MAAIqC,KAAM,KAAK,QAAQpB,GAAMoB,CAAI,GACjC,MAAM,KAAK,QAAQnB,GAAQlB,GAAS0B,CAAG;AAAA,IAC3C;AAAA,EACJ;AAAA;AAAA,EAGA,gBAAsB;AAClB,eAAW,CAACT,GAAMoB,CAAI,KAAK,KAAK,WAAW;AACvC,iBAAW/B,KAAM+B,EAAK,cAAc,MAAMpB,GAAMX,CAAE,EAAA;AAClD,iBAAWA,KAAM+B,EAAK,eAAgB,MAAK,MAAMpB,GAAM,MAAMX,EAAG,KAAK,IAAI,OAAA,CAAQ,CAAC,EAAA;AAAA,IACtF;AAAA,EACJ;AAAA;AAAA,EAGA,YAA8B;AAC1B,WAAO,KAAK,aAAa,OAAO,CAACzB,MAAMA,EAAE,gBAAgB,MAAS,EAAE,IAAI,CAACA,OAAO,EAAE,MAAM,CAACA,EAAE,KAAK,GAAG,aAAa+B,EAAQ/B,EAAE,WAAY,EAAA,EAAI;AAAA,EAC9I;AAAA,EAEA,IAAIoC,GAAuB;AACvB,WAAO,KAAK,UAAU,IAAIA,CAAI;AAAA,EAClC;AAAA,EAEA,UAAgB;;AACZ,MAAE,KAAK;AACP,eAAW,CAACA,GAAMoB,CAAI,KAAK,KAAK,UAAW,MAAK,QAAQpB,GAAMoB,CAAI;AAClE,SAAK,IAAI,QAAQ,oBAAoB,WAAW,KAAK,SAAS,GAC9D,KAAK,IAAI,QAAA,IACTnD,IAAA,KAAK,YAAL,QAAAA,EAAc,UACV,KAAK,cAAY,aAAa,KAAK,UAAU;AAAA,EACrD;AAAA;AAAA,EAIA,MAAc,aAAaqD,GAAmF;AAC1G,UAAM,CAACR,GAAQ/B,CAAO,IAAI,MAAM,QAAQuC,CAAK,IAAIA,IAAQ,CAACA,GAAO,MAAS;AAC1E,QAAI;AACA,UAAI,OAAOR,KAAW,YAAY;AAC9B,cAAMS,IAAM,MAAOT,EAAA,GACbb,IAAS,WAAWsB,IAAMA,IAAM,aAAaA,IAAMA,EAAI,UAAUA,EAAI;AAC3E,eAAOtB,KAAU,OAAOA,EAAO,SAAU,aAAa,EAAE,QAAAA,GAAQ,SAAAlB,MAAY;AAAA,MAChF;AACA,aAAO+B,KAAU,OAAOA,EAAO,SAAU,cAAc,OAAOA,EAAO,QAAS,WAAW,EAAE,QAAQA,GAAQ,SAAA/B,MAAY;AAAA,IAC3H,SAASf,GAAK;AACV,kBAAK,IAAI,IAAI,gCAAgCA,KAAA,gBAAAA,EAAe,YAAWA,CAAG,IAAI,EAAE,QAAQ,OAAO8C,KAAW,aAAa,WAAW,OAAQA,KAAA,gBAAAA,EAAuB,IAAI,GAAG,GACjK;AAAA,IACX;AAAA,EACJ;AAAA,EAEA,MAAc,QAAQb,GAAyBlB,GAAkB0B,GAA4B;AACzF,UAAMT,IAAOC,EAAO;AACpB,IAAIA,EAAO,cAAcA,EAAO,aAAauB,KACzC,KAAK,IAAI,IAAI,WAAWxB,CAAI,iCAAiCC,EAAO,UAAU,sBAAsBuB,CAAkB,IAAI,EAAE,QAAQxB,GAAM;AAE9I,UAAMoB,IAAiB,EAAE,QAAAnB,GAAQ,YAAYQ,GAAK,KAAK,MAA8B,WAAW,CAAA,GAAI,SAAS,CAAA,GAAI,gBAAgB,CAAA,GAAI,SAAS,MAAM,SAAS,GAAA;AAC7J,IAAAW,EAAK,MAAM,KAAK,UAAUA,CAAI,GAC9B,KAAK,UAAU,IAAIpB,GAAMoB,CAAI;AAC7B,QAAI;AACA,YAAMK,IAAS,MAAMxB,EAAO,MAAMmB,EAAK,KAAKrC,CAAO;AACnD,UAAIqC,EAAK,SAAS;AACd,QAAI,OAAOK,KAAW,mBAAiB,MAAMzB,GAAMyB,CAAM,EAAA;AACzD;AAAA,MACJ;AACA,MAAI,OAAOA,KAAW,eAAYL,EAAK,UAAUK;AAAA,IACrD,SAASzD,GAAK;AACV,WAAK,OAAOgC,GAAMhC,GAAK,OAAO,GAC9B,KAAK,QAAQgC,GAAMoB,CAAI;AAAA,IAC3B;AAAA,EACJ;AAAA,EAEQ,QAAQpB,GAAcoB,GAAsB;AAChD,QAAI,CAAAA,EAAK,SACT;AAAA,MAAAA,EAAK,UAAU,IACX,KAAK,UAAU,IAAIpB,CAAI,MAAMoB,KAAM,KAAK,UAAU,OAAOpB,CAAI,GAC7DoB,EAAK,WAAS,KAAK,MAAMpB,GAAMoB,EAAK,OAAO,EAAA;AAE/C,iBAAWM,KAAKN,EAAK,UAAU,QAAA;AAC3B,YAAI;AACA,UAAAM,EAAA;AAAA,QACJ,QAAQ;AAAA,QAER;AAEJ,MAAAN,EAAK,YAAY,CAAA,GACjB,KAAK,IAAI,YAAYpB,CAAI;AACzB,eAASnB,IAAI,KAAK,aAAa,SAAS,GAAGA,KAAK,GAAGA,IAAK,CAAI,KAAK,aAAaA,CAAC,EAAG,UAAUmB,UAAW,aAAa,OAAOnB,GAAG,CAAC;AAAA;AAAA,EACnI;AAAA,EAEQ,OAAOmB,GAAchC,GAAc2D,GAAqB;AAC5D,UAAMC,KAAW5D,KAAA,gBAAAA,EAAe,YAAW,OAAOA,CAAG;AACrD,SAAK,IAAI,IAAI,WAAWgC,CAAI,eAAe2B,CAAK,KAAKC,CAAO,IAAI,EAAE,QAAQ5B,EAAA,CAAM,GAChF,QAAQ,MAAM,yBAAyBA,CAAI,MAAM2B,CAAK,MAAM3D,CAAG;AAAA,EACnE;AAAA;AAAA,EAGQ,MAA2BgC,GAAcX,GAA6BsC,IAAQ,WAAiC;AACnH,WAAO,IAAIE,MAAY;AACnB,UAAI;AACA,cAAM,IAAIxC,EAAG,GAAGwC,CAAI;AACpB,QAAI,aAAa,WAAS,EAAE,MAAM,CAAC7D,MAAQ,KAAK,OAAOgC,GAAMhC,GAAK2D,CAAK,CAAC;AAAA,MAC5E,SAAS3D,GAAK;AACV,aAAK,OAAOgC,GAAMhC,GAAK2D,CAAK;AAAA,MAChC;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA,EAkBQ,UAAUP,GAA2B;AACzC,UAAMhE,IAAM,KAAK,KACX4C,IAAOoB,EAAK,OAAO,MACnBU,IAAQ,CAACC,MAA8B;AACzC,MAAIX,EAAK,UAASW,EAAA,IACbX,EAAK,UAAU,KAAKW,CAAO;AAAA,IACpC,GACMtD,IAAQ,CAAsBY,GAA6BsC,MAAmB,KAAK,MAAM3B,GAAMX,GAAIsC,CAAK,GACxGK,IAAkD,CAAA,GAClDC,IAAO,MAEPC,IAAK,CAACC,GAAeC,GAAiCC,IAAO,OAAwB;AAEvF,YAAMvB,IAAsBqB,EAAM,SAAS,GAAG,IAAI/E,EAAI,UAAUA,EAAI,OAC9DkF,IAAU7D,EAAM,CAACe,MAAc;AACjC,QAAI6C,KAAME,EAAA,GACVH,EAAQ5C,CAAE;AAAA,MACd,GAAG,MAAM2C,CAAK,GAAG;AACjB,MAAArB,EAAO,iBAAiBqB,GAAOG,CAAO;AACtC,UAAI1C,IAAO;AACX,YAAM2C,IAAM,MAAY;AACpB,QAAI3C,MACJA,IAAO,IACPkB,EAAO,oBAAoBqB,GAAOG,CAAO;AAAA,MAC7C;AACA,aAAAR,EAAMS,CAAG,GACFA;AAAA,IACX;AAmLA,WAjLuB;AAAA,MACnB,QAAQvC;AAAA,MACR,YAAYwB;AAAA,MACZ,SAASpE,EAAI;AAAA,MACb,OAAOA,EAAI;AAAA,MACX,IAAI,SAAS;AACT,eAAOA,EAAI,OAAA;AAAA,MACf;AAAA,MACA,QAAQA,EAAI;AAAA,MACZ,IAAI,cAAc;AACd,eAAOA,EAAI,MAAM;AAAA,MACrB;AAAA,MACA,IAAI,WAAW;AACX,eAAOA,EAAI,MAAM;AAAA,MACrB;AAAA,MACA,IAAI,SAAS;AACT,eAAOA,EAAI,MAAM;AAAA,MACrB;AAAA,MACA,IAAI,SAAS;AACT,eAAOA,EAAI,MAAM,aAAa;AAAA,MAClC;AAAA,MACA,IAAI,cAAc;AACd,eAAOA,EAAI,YAAA;AAAA,MACf;AAAA,MACA,IAAI,eAAe;AACf,eAAOA,EAAI,aAAA;AAAA,MACf;AAAA,MACA,IAAI,MAAM;AACN,eAAOA,EAAI,WAAA;AAAA,MACf;AAAA,MACA,MAAM,MAAMA,EAAI,MAAM,KAAA;AAAA,MACtB,OAAO,MAAMA,EAAI,MAAM,MAAA;AAAA,MACvB,MAAM,CAACoF,MAAiB;AACpB,QAAI,OAAO,SAASA,CAAI,MAAGpF,EAAI,MAAM,cAAc,KAAK,IAAI,GAAGoF,CAAI;AAAA,MACvE;AAAA,MACA,IAAI,CAACL,GAAOC,MAAYF,EAAGC,GAAOC,CAAO;AAAA,MACzC,MAAM,CAACD,GAAOC,MAAYF,EAAGC,GAAOC,GAAS,EAAI;AAAA,MACjD,MAAM,CAACD,GAAOM,MAAW;AACrB,QAAArF,EAAI,QAAQ,cAAc,IAAI,YAAY,GAAG4C,CAAI,IAAImC,CAAK,IAAI,EAAE,QAAAM,GAAQ,SAAS,IAAM,UAAU,GAAA,CAAM,CAAC;AAAA,MAC5G;AAAA,MACA,gBAAgB,CAACL,MAAYF,EAAG,aAAa,MAAME,EAAQhF,EAAI,WAAA,CAAY,CAAC;AAAA,MAC5E,gBAAgB,CAACgF,MAAY;AACzB,QAAAhB,EAAK,eAAe,KAAKgB,CAAO;AAChC,cAAMG,IAAM,MAAY;AACpB,gBAAM1D,IAAIuC,EAAK,eAAe,QAAQgB,CAAO;AAC7C,UAAIvD,KAAK,KAAGuC,EAAK,eAAe,OAAOvC,GAAG,CAAC;AAAA,QAC/C;AACA,eAAAiD,EAAMS,CAAG,GACFA;AAAA,MACX;AAAA,MACA,WAAW,CAACH,MAAYN,EAAMrD,EAAM2D,GAAS,WAAW,CAAC;AAAA,MACzD,YAAY,CAACA,GAASM,MAAO;AACzB,cAAMC,IAAK,OAAO,WAAWlE,EAAM2D,GAAS,YAAY,GAAGM,CAAE;AAC7D,eAAAZ,EAAM,MAAM,aAAaa,CAAE,CAAC,GACrBA;AAAA,MACX;AAAA,MACA,aAAa,CAACP,GAASM,MAAO;AAC1B,cAAMC,IAAK,OAAO,YAAYlE,EAAM2D,GAAS,aAAa,GAAGM,CAAE;AAC/D,eAAAZ,EAAM,MAAM,cAAca,CAAE,CAAC,GACtBA;AAAA,MACX;AAAA,MACA,IAAI;AAAA,QACA,WAAW,CAACC,MAAMX,EAAK,UAAUb,GAAMwB,GAAGd,GAAOrD,CAAK;AAAA,QACtD,UAAU,CAACmE,MAAMX,EAAK,SAASb,GAAMwB,KAAK,CAAA,GAAId,CAAK;AAAA,QACnD,OAAO,CAACF,GAASgB,MAAMX,EAAK,MAAML,GAASgB,KAAA,gBAAAA,EAAG,UAAU;AAAA,MAAA;AAAA,MAE5D,UAAU;AAAA,QACN,WAAW,CAACA,MAAM;AACd,gBAAMnC,IAAM,UAAUT,CAAI,WAAW,EAAEiC,EAAK,MAAM,IAC5CY,IAAW,MACbzF,EAAI,SAAS,eAAe;AAAA,YACxB,KAAAqD;AAAA,YACA,OAAOd,EAAQiD,EAAE,KAAK;AAAA,YACtB,eAAe,MAAOA,EAAE,IAAA,IAAQE,EAAM1F,EAAI,QAAQ,EAAI,IAAI0F,EAAM1F,EAAI,QAAQ,EAAK;AAAA,YACjF,UAAUqB,EAAM,MAAMmE,EAAE,IAAI,CAACA,EAAE,IAAA,CAAK,GAAG,iBAAiB;AAAA,UAAA,CAC3D;AACL,iBAAAC,EAAA,GACAzB,EAAK,QAAQ,KAAKyB,CAAQ,GAC1Bf,EAAM,MAAM1E,EAAI,SAAS,iBAAiBqD,CAAG,CAAC,GACvCsC,EAAeF,GAAU,MAAMzF,EAAI,SAAS,iBAAiBqD,CAAG,CAAC;AAAA,QAC5E;AAAA,QACA,WAAW,CAACmC,MAAM;AACd,gBAAMnC,IAAM,UAAUT,CAAI,WAAW,EAAEiC,EAAK,MAAM,IAC5CtD,IAAO,MAAO,OAAOiE,EAAE,WAAY,aAAaA,EAAE,YAAYA,EAAE,SAChEC,IAAW,MACbzF,EAAI,SAAS,gBAAgB;AAAA,YACzB,KAAAqD;AAAA,YACA,OAAOd,EAAQiD,EAAE,KAAK;AAAA,YACtB,eAAe,MAAM;AACjB,oBAAMI,IAAUrE,EAAA,EAAO,KAAK,CAACR,MAAMA,EAAE,UAAUyE,EAAE,KAAK;AACtD,qBAAOI,IAAUrD,EAAQqD,EAAQ,KAAK,IAAI;AAAA,YAC9C;AAAA,YACA,UAAU,MAAMrE,IAAO,IAAI,CAACR,OAAO,EAAE,OAAOwB,EAAQxB,EAAE,KAAK,GAAG,QAAQA,EAAE,UAAUyE,EAAE,OAAO,UAAUnE,EAAM,MAAMmE,EAAE,IAAIzE,EAAE,KAAK,GAAG,iBAAiB,IAAI;AAAA,UAAA,CACzJ;AACL,iBAAA0E,EAAA,GACAzB,EAAK,QAAQ,KAAKyB,CAAQ,GAC1Bf,EAAM,MAAM1E,EAAI,SAAS,kBAAkBqD,CAAG,CAAC,GACxCsC,EAAeF,GAAU,MAAMzF,EAAI,SAAS,kBAAkBqD,CAAG,CAAC;AAAA,QAC7E;AAAA,QACA,YAAY,CAACmC,MAAM;AACf,gBAAMnC,IAAM,UAAUT,CAAI,YAAY,EAAEiC,EAAK,MAAM,IAC7CY,IAAW,MACbzF,EAAI,SAAS,gBAAgB;AAAA,YACzB,KAAAqD;AAAA,YACA,OAAOd,EAAQiD,EAAE,KAAK;AAAA,YACtB,eAAe,MAAOA,EAAE,QAAQA,EAAE,UAAU;AAAA,YAC5C,UAAU,MACNA,EAAE,MAAA,EAAQ,IAAI,CAACzE,OAAO,EAAE,OAAOwB,EAAQxB,EAAE,KAAK,GAAG,QAAQ,CAAC,CAACA,EAAE,QAAQ,UAAUM,EAAM,MAAMN,EAAE,SAAA,GAAY,kBAAkB,IAAI;AAAA,UAAA,CACtI;AACL,iBAAA0E,EAAA,GACAzB,EAAK,QAAQ,KAAKyB,CAAQ,GAC1Bf,EAAM,MAAM1E,EAAI,SAAS,kBAAkBqD,CAAG,CAAC,GACxCsC,EAAeF,GAAU,MAAMzF,EAAI,SAAS,kBAAkBqD,CAAG,CAAC;AAAA,QAC7E;AAAA,MAAA;AAAA,MAEJ,MAAM;AAAA,QACF,KAAK,CAACA,GAAK2B,GAASa,MAAgB;AAChC,gBAAM3B,IAAQ,EAAE,OAAOtB,GAAM,MAAMM,EAASG,CAAG,GAAG,OAAOA,GAAK,aAAAwC,GAAa,SAASxE,EAAM2D,GAAS,QAAQ3B,CAAG,GAAG,EAAA;AACjH,UAAAwB,EAAK,aAAa,KAAKX,CAAK;AAC5B,gBAAMiB,IAAM,MAAY;AACpB,kBAAM1D,IAAIoD,EAAK,aAAa,QAAQX,CAAK;AACzC,YAAIzC,KAAK,KAAGoD,EAAK,aAAa,OAAOpD,GAAG,CAAC;AAAA,UAC7C;AACA,iBAAAiD,EAAMS,CAAG,GACFA;AAAA,QACX;AAAA,MAAA;AAAA,MAEJ,MAAM;AAAA,QACF,KAAK,CAACW,MAAS;AACX,qBAAW,CAACC,GAAQC,CAAM,KAAK,OAAO,QAAQF,CAAI,EAAG,CAAAlB,EAAQmB,CAAM,IAAI,EAAE,GAAGnB,EAAQmB,CAAM,GAAG,GAAGC,EAAA;AAAA,QACpG;AAAA,QACA,GAAG,CAAC3C,GAAK4C,MAAA;;AAAa,mBAAApF,IAAA+D,EAAQ5E,EAAI,OAAA,CAAQ,MAApB,gBAAAa,EAAwBwC,SAAQ6C,IAAAtB,EAAQ,OAAR,gBAAAsB,EAAa7C,OAAQ4C,KAAY5C;AAAA;AAAA,MAAA;AAAA,MAE3F,SAAS;AAAA,QACL,KAAK,CAAIA,GAAa4C,MAAgC;AAClD,cAAI;AACA,kBAAME,IAAM,aAAa,QAAQC,EAAWxD,GAAMS,CAAG,CAAC;AACtD,mBAAO8C,MAAQ,OAAOF,IAAY,KAAK,MAAME,CAAG;AAAA,UACpD,QAAQ;AACJ,mBAAOF;AAAA,UACX;AAAA,QACJ;AAAA,QACA,KAAK,CAAC5C,GAAKgD,MAAU;AACjB,cAAI;AACA,yBAAa,QAAQD,EAAWxD,GAAMS,CAAG,GAAG,KAAK,UAAUgD,CAAK,CAAC;AAAA,UACrE,QAAQ;AAAA,UAER;AAAA,QACJ;AAAA,QACA,QAAQ,CAAChD,MAAQ;AACb,cAAI;AACA,yBAAa,WAAW+C,EAAWxD,GAAMS,CAAG,CAAC;AAAA,UACjD,QAAQ;AAAA,UAER;AAAA,QACJ;AAAA,MAAA;AAAA,MAEJ,MAAM,MAAM;AACR,cAAM8C,IAAMtB,EAAK,IAAI,IAAIjC,GAAMvB,CAAK,GAE9BiF,IAAU,CAAwCrE,OACnD,IAAIH,MAAqB;AACtB,gBAAMqD,IAAMlD,EAAG,GAAGH,CAAC;AACnB,iBAAA4C,EAAMS,CAAG,GACFA;AAAA,QACX;AACJ,eAAO;AAAA,UACH,cAAcgB,EAAI;AAAA,UAClB,eAAeG,EAAQH,EAAI,aAAa;AAAA,UACxC,QAAQG,EAAQH,EAAI,MAAM;AAAA,UAC1B,SAASG,EAAQH,EAAI,OAAO;AAAA,UAC5B,SAASG,EAAQH,EAAI,OAAO;AAAA,UAC5B,cAAcG,EAAQH,EAAI,YAAY;AAAA,QAAA;AAAA,MAE9C,GAAA;AAAA,MACA,KAAK,CAAC3B,GAAS+B,MAAYvG,EAAI,IAAIwE,GAAS,EAAE,QAAQ5B,GAAM,GAAG2D,EAAA,CAAS;AAAA,IAAA;AAAA,EAGhF;AAAA,EAEQ,UACJvC,GACAwB,GACAd,GACArD,GACkB;AAClB,UAAMmF,IAAM,SAAS,cAAc,QAAQ;AAC3C,IAAAA,EAAI,OAAO,UACXA,EAAI,YACA,+JACJA,EAAI,aAAa,QAAQ,wBAAwBxC,EAAK,OAAO,IAAI,EAAE,GACnEwC,EAAI,QAAQ,SAASxC,EAAK,OAAO;AACjC,QAAIf,IAAqBuC,EAAE,OACvBiB,IAAS,CAAC,CAACjB,EAAE;AACjB,UAAMkB,IAAU,CAACC,MAAuB;;AACpC,MAAAH,EAAI,cAAc,IACdG,EAAK,KAAA,EAAO,WAAW,GAAG,KAC1BH,EAAI,mBAAmB,aAAaG,CAAI,IACxC9F,IAAA2F,EAAI,cAAc,KAAK,MAAvB,QAAA3F,EAA0B,aAAa,eAAe,WACnD2F,EAAI,YAAYI,EAAWD,GAAM,2CAA2C,CAAC;AAAA,IACxF,GACME,IAAa,MAAYL,EAAI,aAAa,cAAcjE,EAAQU,CAAK,CAAC,GACtE6D,IAAc,MAAY;AAC5B,MAAItB,EAAE,WAAW,UAAWgB,EAAI,aAAa,gBAAgB,OAAOC,CAAM,CAAC;AAAA,IAC/E;AACA,IAAAC,EAAQlB,EAAE,IAAI,GACdqB,EAAA,GACAC,EAAA,GACA9C,EAAK,QAAQ,KAAK6C,CAAU;AAC5B,UAAME,IAA6B;AAAA,MAC/B,IAAIP;AAAA,MACJ,IAAI,SAAS;AACT,eAAOC;AAAA,MACX;AAAA,MACA,UAAU,CAAC,MAAM;AACb,QAAAxD,IAAQ,GACR4D,EAAA;AAAA,MACJ;AAAA,MACA,SAAAH;AAAA,MACA,WAAW,CAAC5E,MAAM;AACd,QAAA2E,IAAS3E,GACT0E,EAAI,aAAa,gBAAgB,OAAO1E,CAAC,CAAC;AAAA,MAC9C;AAAA,MACA,MAAM,MAAM;AACR,QAAA0E,EAAI,MAAM,UAAU;AAAA,MACxB;AAAA,MACA,MAAM,MAAM;AACR,QAAAA,EAAI,MAAM,UAAU;AAAA,MACxB;AAAA,MACA,QAAQ,MAAMA,EAAI,OAAA;AAAA,IAAO;AAE7B,QAAIhB,EAAE,SAAS;AACX,YAAMwB,IAAQ3F,EAAM,CAACgB,MAAkBmD,EAAE,QAASnD,GAAG0E,CAAM,GAAG,gBAAgB;AAC9E,MAAAP,EAAI,iBAAiB,SAAS,CAACnE,MAAM;AACjC,QAAAA,EAAE,gBAAA,GACF2E,EAAM3E,CAAC;AAAA,MACX,CAAC;AAAA,IACL;AACA,gBAAK,IAAI,iBAAiBmE,GAAKhB,EAAE,YAAY,OAAO,GACpDd,EAAM,MAAM8B,EAAI,QAAQ,GACjBO;AAAA,EACX;AAAA,EAEQ,SAAS/C,GAAgBwB,GAAuBd,GAAmD;AACvG,UAAMuC,IAAK,SAAS,cAAc,KAAK;AACvC,IAAAA,EAAG,YAAY,mBACfA,EAAG,aAAa,QAAQ,uBAAuBjD,EAAK,OAAO,IAAI,EAAE,GACjEiD,EAAG,QAAQ,SAASjD,EAAK,OAAO,MAChCiD,EAAG,QAAQ,WAAWzB,EAAE,YAAY,QACpCyB,EAAG,gBAAgB,iBAAiB,CAAC,CAACzB,EAAE,QAAQ,GAChDyB,EAAG,gBAAgB,oBAAoB,CAAC,CAACzB,EAAE,WAAW,GACtDyB,EAAG,gBAAgB,cAAc,CAAC,CAACzB,EAAE,KAAK;AAC1C,QAAI0B,IAAU1B,EAAE,YAAY;AAC5B,IAAAyB,EAAG,SAAS,CAACC,GAET1B,EAAE,QAAO,KAAK,IAAI,UAAU,YAAYyB,CAAE,SACpC,IAAI,UAAU,aAAaA,GAAI,KAAK,IAAI,QAAQ;AAE1D,QAAIE,IAAiC;AACrC,IAAI3B,EAAE,QACF2B,IAAQ,SAAS,cAAc,OAAO,GACtCA,EAAM,cAAc3B,EAAE,KACtByB,EAAG,OAAOE,CAAK;AAEnB,UAAMC,IAAY,MAAY;AAC1B,MAAAH,EAAG,OAAA,GACHE,KAAA,QAAAA,EAAO;AAAA,IACX;AACA,QAAI3B,EAAE;AAEF,iBAAWpD,KAAM,CAAC,eAAe,aAAa,WAAW,cAAc,YAAY,SAAS,UAAU,KAAe,iBAAiBA,GAAI,CAACC,MAAMA,EAAE,iBAAiB;AAExK,IAAAqC,EAAM0C,CAAS;AACf,UAAMC,IAAM,CAAClH,MAAqB;AAC9B,MAAA+G,IAAU/G,GACV8G,EAAG,SAAS,CAAC9G;AAAA,IACjB;AACA,WAAO;AAAA,MACH,IAAA8G;AAAA,MACA,IAAI,UAAU;AACV,eAAOC;AAAA,MACX;AAAA,MACA,MAAM,MAAMG,EAAI,EAAI;AAAA,MACpB,MAAM,MAAMA,EAAI,EAAK;AAAA,MACrB,QAAQ,CAACC,MAAUD,EAAIC,KAAS,CAACJ,CAAO;AAAA,MACxC,QAAQE;AAAA,IAAA;AAAA,EAEhB;AAAA,EAEQ,MAAM5C,GAAiB+C,IAAa,MAAY;AACpD,IAAK,KAAK,YACN,KAAK,UAAU,SAAS,cAAc,KAAK,GAC3C,KAAK,QAAQ,YAAY,mBACzB,KAAK,QAAQ,aAAa,QAAQ,cAAc,GAChD,KAAK,QAAQ,aAAa,QAAQ,QAAQ,GAC1C,KAAK,QAAQ,aAAa,aAAa,QAAQ,GAC/C,KAAK,IAAI,UAAU,YAAY,KAAK,OAAO,IAE/C,KAAK,QAAQ,cAAc/C,GAC3B,KAAK,QAAQ,aAAa,gBAAgB,EAAE,GACxC,KAAK,cAAY,aAAa,KAAK,UAAU,GACjD,KAAK,aAAa,WAAW,MAAA;;AAAM,cAAA3D,IAAA,KAAK,YAAL,gBAAAA,EAAc,gBAAgB;AAAA,OAAiB,KAAK,IAAI,KAAK0G,CAAU,CAAC;AAAA,EAC/G;AACJ;AAEA,SAAS5B,EAAeF,GAAsB+B,GAA0C;AACpF,SAAO,EAAE,SAAS/B,GAAU,QAAA+B,EAAA;AAChC;AAEA,SAAS9B,EAAM+B,GAA2C3C,GAAqB;AAC3E,QAAMuB,IAAQvB,IAAK2C,EAAO,SAASA,EAAO;AAC1C,SAAO,OAAOpB,KAAU,WAAWA,IAAQvB,IAAK,OAAO;AAC3D;AAEA,SAASsB,EAAWvD,GAAgBQ,GAAqB;AACrD,SAAO,aAAaR,CAAM,IAAIQ,CAAG;AACrC;AAGA,SAASY,EAAWtC,GAA0B;AAC1C,MAAI;AACA,WAAO,KAAK,UAAUA,KAAW,MAAM,CAAC+F,GAAIvH,MAAgB,OAAOA,KAAM,aAAa,MAAOA,EAAwB,QAAQ,EAAE,KAAKA,CAAE;AAAA,EAC1I,QAAQ;AACJ,WAAO,OAAO,KAAK,QAAQ;AAAA,EAC/B;AACJ;"}