dreamio/docs/turns/2026-05-26-reduce-vlc-seek-buffering.html

527 lines
No EOL
899 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Dreamio Turn: VLC Seek Range Cache Priming</title>
<style>
:root { color-scheme: light; --ink: oklch(0.19 0.02 265); --muted: oklch(0.46 0.025 265); --paper: oklch(0.985 0.006 265); --panel: oklch(0.965 0.012 265); --line: oklch(0.86 0.018 265); --accent: oklch(0.55 0.15 292); --accent-soft: oklch(0.92 0.045 292); }
* { box-sizing: border-box; }
body { margin: 0; background: var(--paper); color: var(--ink); font: 16px/1.58 ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; }
main { width: min(1120px, calc(100vw - 40px)); margin: 0 auto; padding: 48px 0 64px; }
header { margin-bottom: 28px; }
h1 { max-width: 860px; margin: 0 0 10px; font-size: clamp(2rem, 4vw, 4rem); line-height: 1.02; letter-spacing: 0; }
.summary { max-width: 760px; color: var(--muted); font-size: 1.08rem; }
section.panel { border: 1px solid var(--line); background: var(--panel); border-radius: 8px; padding: 22px 24px; margin: 16px 0; }
h2 { margin: 0 0 10px; font-size: 1.08rem; letter-spacing: 0; }
h3 { margin: 18px 0 10px; font-size: .95rem; color: var(--muted); }
p, ul { margin: 0; }
ul { padding-left: 1.2rem; }
li + li { margin-top: 6px; }
code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: .92em; }
.note { color: var(--muted); }
.diff-file { margin-top: 18px; }
.diff-file > div, .diff-file pre { border-radius: 8px; overflow: auto; }
.badge { display: inline-block; border: 1px solid var(--line); background: var(--accent-soft); color: var(--accent); border-radius: 999px; padding: 3px 9px; font-size: .82rem; font-weight: 700; margin-bottom: 12px; }
</style>
</head>
<body>
<main>
<header><span class="badge">2026-05-26</span><h1>VLC Seek Range Cache Priming</h1><p class="summary">Dreamio now primes local VLC range-cache seeks from stable 1 MB boundaries behind the estimated target, retains useful nearby bytes under a bounded budget, and logs foreground misses with more precision.</p></header>
<section class="panel"><h2>Summary</h2><p>Reduced post-seek buffering risk in native VLC playback by making seek and jump prefetch conservative behind the target instead of only racing ahead from the estimated byte offset.</p></section>
<section class="panel"><h2>Changes Made</h2><ul><li>Added seek-specific prefetch through <code>prefetchForSeek</code>, with a 4 MB backward prime window and user-initiated task priority for the first chunks.</li><li>Aligned prefetch chunks to global 1 MB boundaries so repeated VLC requests reuse stable cached ranges.</li><li>Replaced prefetch-window eviction with a 64 MB bounded cache budget that preserves active playback, recent seek, header, and tail/index ranges.</li><li>Changed foreground miss handling to fetch only missing subranges and log <code>uncached</code> versus <code>partial-miss</code>.</li><li>Routed VLC delegate state handling onto the main actor before reading player state or firing UI callbacks.</li><li>Added tests for the observed VLC request pattern, global chunk alignment, and budget retention.</li></ul></section>
<section class="panel"><h2>Context</h2><p>A 15-second skip estimated byte <code>213615760</code>, while VLCs first real read started at <code>212942432</code>. The old prefetch overlapped the request but missed its front edge, then eviction could discard ranges that were still useful during the next VLC probes.</p></section>
<section class="panel"><h2>Important Implementation Details</h2><ul><li>The observed request and estimated seek offset both fall inside global chunk <code>212860928-213909503</code>, so seek priming now warms that chunk before later ahead chunks.</li><li>Normal prefetch still prefers the playhead area, while seek prefetch starts at the backward-biased window start.</li><li>Cache eviction removes unprotected segments farthest from protected areas until the byte budget is met; protected ranges are not trimmed simply because a new prefetch window appears.</li><li>Foreground reads cancel or reprioritize normal prefetch when VLC asks outside the expected area.</li></ul></section>
<section class="panel"><h2>Relevant Diff Snippets</h2><p class="note">Rendered with <code>@pierre/diffs/ssr</code>.</p><section class="diff-file"><h3>Dreamio/ProgressiveHTTPRangeCache.swift</h3><svg data-icon-sprite aria-hidden="true" width="0" height="0">
<symbol id="diffs-icon-arrow-right-short" viewBox="0 0 16 16">
<path d="M8.47 4.22a.75.75 0 0 0 0 1.06l1.97 1.97H3.75a.75.75 0 0 0 0 1.5h6.69l-1.97 1.97a.75.75 0 1 0 1.06 1.06l3.25-3.25a.75.75 0 0 0 0-1.06L9.53 4.22a.75.75 0 0 0-1.06 0"/>
</symbol>
<symbol id="diffs-icon-brand-github" viewBox="0 0 16 16">
<path d="M8 0c4.42 0 8 3.58 8 8a8.01 8.01 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27s-1.36.09-2 .27c-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8"/>
</symbol>
<symbol id="diffs-icon-chevron" viewBox="0 0 16 16">
<path d="M1.47 4.47a.75.75 0 0 1 1.06 0L8 9.94l5.47-5.47a.75.75 0 1 1 1.06 1.06l-6 6a.75.75 0 0 1-1.06 0l-6-6a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-chevrons-narrow" viewBox="0 0 10 16">
<path d="M4.47 2.22a.75.75 0 0 1 1.06 0l3.25 3.25a.75.75 0 0 1-1.06 1.06L5 3.81 2.28 6.53a.75.75 0 0 1-1.06-1.06zM1.22 9.47a.75.75 0 0 1 1.06 0L5 12.19l2.72-2.72a.75.75 0 0 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0l-3.25-3.25a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-diff-split" viewBox="0 0 16 16">
<path d="M14 0H8.5v16H14a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2m-1.5 6.5v1h1a.5.5 0 0 1 0 1h-1v1a.5.5 0 0 1-1 0v-1h-1a.5.5 0 0 1 0-1h1v-1a.5.5 0 0 1 1 0"/><path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h5.5V0zm.5 7.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1 0-1" opacity=".3"/>
</symbol>
<symbol id="diffs-icon-diff-unified" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M16 14a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V8.5h16zm-8-4a.5.5 0 0 0-.5.5v1h-1a.5.5 0 0 0 0 1h1v1a.5.5 0 0 0 1 0v-1h1a.5.5 0 0 0 0-1h-1v-1A.5.5 0 0 0 8 10" clip-rule="evenodd"/><path fill-rule="evenodd" d="M14 0a2 2 0 0 1 2 2v5.5H0V2a2 2 0 0 1 2-2zM6.5 3.5a.5.5 0 0 0 0 1h3a.5.5 0 0 0 0-1z" clip-rule="evenodd" opacity=".4"/>
</symbol>
<symbol id="diffs-icon-expand" viewBox="0 0 16 16">
<path d="M3.47 5.47a.75.75 0 0 1 1.06 0L8 8.94l3.47-3.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-expand-all" viewBox="0 0 16 16">
<path d="M11.47 9.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 1 1 1.06-1.06L8 12.94zM7.526 1.418a.75.75 0 0 1 1.004.052l4 4a.75.75 0 1 1-1.06 1.06L8 3.06 4.53 6.53a.75.75 0 1 1-1.06-1.06l4-4z"/>
</symbol>
<symbol id="diffs-icon-file-code" viewBox="0 0 16 16">
<path d="M10.75 0c.199 0 .39.08.53.22l3.5 3.5c.14.14.22.331.22.53v9A2.75 2.75 0 0 1 12.25 16h-8.5A2.75 2.75 0 0 1 1 13.25V2.75A2.75 2.75 0 0 1 3.75 0zm-7 1.5c-.69 0-1.25.56-1.25 1.25v10.5c0 .69.56 1.25 1.25 1.25h8.5c.69 0 1.25-.56 1.25-1.25V5h-1.25A2.25 2.25 0 0 1 10 2.75V1.5z"/><path d="M7.248 6.19a.75.75 0 0 1 .063 1.058L5.753 9l1.558 1.752a.75.75 0 0 1-1.122.996l-2-2.25a.75.75 0 0 1 0-.996l2-2.25a.75.75 0 0 1 1.06-.063M8.69 7.248a.75.75 0 1 1 1.12-.996l2 2.25a.75.75 0 0 1 0 .996l-2 2.25a.75.75 0 1 1-1.12-.996L10.245 9z"/>
</symbol>
<symbol id="diffs-icon-plus" viewBox="0 0 16 16">
<path d="M8 3a.75.75 0 0 1 .75.75v3.5h3.5a.75.75 0 0 1 0 1.5h-3.5v3.5a.75.75 0 0 1-1.5 0v-3.5h-3.5a.75.75 0 0 1 0-1.5h3.5v-3.5A.75.75 0 0 1 8 3"/>
</symbol>
<symbol id="diffs-icon-symbol-added" viewBox="0 0 16 16">
<path d="M8 4a.75.75 0 0 1 .75.75v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5A.75.75 0 0 1 8 4"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
</symbol>
<symbol id="diffs-icon-symbol-deleted" viewBox="0 0 16 16">
<path d="M4 8a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5A.75.75 0 0 1 4 8"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
</symbol>
<symbol id="diffs-icon-symbol-diffstat" viewBox="0 0 16 16">
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.75 4.296a.75.75 0 0 0-1.5 0V6.25h-2a.75.75 0 0 0 0 1.5h2v1.5h1.5v-1.5h2a.75.75 0 0 0 0-1.5h-2zM5.25 10a.75.75 0 0 0 0 1.5h5.5a.75.75 0 0 0 0-1.5z"/>
</symbol>
<symbol id="diffs-icon-symbol-ignored" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m11.53-2.47a.75.75 0 0 0-1.06-1.06l-6 6a.75.75 0 1 0 1.06 1.06z"/>
</symbol>
<symbol id="diffs-icon-symbol-modified" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m8 3a3 3 0 1 0 0-6 3 3 0 0 0 0 6"/>
</symbol>
<symbol id="diffs-icon-symbol-moved" viewBox="0 0 16 16">
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.495 4.695a.75.75 0 0 0-.05 1.06L10.486 8l-2.041 2.246a.75.75 0 0 0 1.11 1.008l2.5-2.75a.75.75 0 0 0 0-1.008l-2.5-2.75a.75.75 0 0 0-1.06-.051m-4 0a.75.75 0 0 0-.05 1.06l2.044 2.248-1.796 1.995a.75.75 0 0 0 1.114 1.004l2.25-2.5a.75.75 0 0 0-.002-1.007l-2.5-2.75a.75.75 0 0 0-1.06-.05"/>
</symbol>
<symbol id="diffs-icon-symbol-ref" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706.286.286.71.54 1.41.73V1.86c-.7.19-1.124.444-1.41.73-.324.325-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8m4 6.397c.697.07 1.522.103 2.5.103 1.613 0 2.806-.088 3.704-.288.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5c-.978 0-1.803.033-2.5.103zM0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m7-2a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1z"/>
</symbol>
</svg><style data-core-css="">@layer base, theme, rendered, unsafe;
@layer base,theme,rendered,unsafe;@layer base{:host{--diffs-font-fallback:"SF Mono", Monaco, Consolas, "Ubuntu Mono", "Liberation Mono", "Courier New", monospace;--diffs-header-font-fallback:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif;--diffs-mixer:light-dark(#000,#fff);--diffs-gap-fallback:8px;--diffs-scrollbar-gutter-fallback:6px;--diffs-scrollbar-gutter:var(--diffs-scrollbar-gutter-override,var(--diffs-scrollbar-gutter-measured,var(--diffs-scrollbar-gutter-fallback)));--diffs-added-light:#0dbe4e;--diffs-added-dark:#5ecc71;--diffs-modified-light:#009fff;--diffs-modified-dark:#69b1ff;--diffs-deleted-light:#ff2e3f;--diffs-deleted-dark:#ff6762;color-scheme:light dark;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);font-feature-settings:var(--diffs-font-features);--diffs-bg:light-dark(var(--diffs-light-bg,#fff),var(--diffs-dark-bg,#000));--diffs-bg-buffer:var(--diffs-bg-buffer-override,light-dark(color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer))));--diffs-bg-context:var(--diffs-bg-context-override,light-dark(color-mix(in lab, var(--diffs-bg) 98.5%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92.5%, var(--diffs-mixer))));--diffs-bg-context-gutter:var(--diffs-bg-context-gutter-override,light-dark(color-mix(in lab, var(--diffs-bg-context) 90%, var(--diffs-bg)),color-mix(in lab, var(--diffs-bg-context) 45%, var(--diffs-bg))));--diffs-bg-separator:var(--diffs-bg-separator-override,light-dark(color-mix(in lab, var(--diffs-bg) 96%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-mixer))));--diffs-fg:light-dark(var(--diffs-light,#000),var(--diffs-dark,#fff));--diffs-fg-number:var(--diffs-fg-number-override,light-dark(color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg)),color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg))));--diffs-fg-conflict-marker:var(--diffs-fg-conflict-marker-override,var(--diffs-fg-number));--diffs-deletion-base:var(--diffs-deletion-color-override,light-dark(var(--diffs-light-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-light))),var(--diffs-dark-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-dark)))));--diffs-addition-base:var(--diffs-addition-color-override,light-dark(var(--diffs-light-addition-color,var(--diffs-addition-color,var(--diffs-added-light))),var(--diffs-dark-addition-color,var(--diffs-addition-color,var(--diffs-added-dark)))));--diffs-modified-base:var(--diffs-modified-color-override,light-dark(var(--diffs-light-modified-color,var(--diffs-modified-color,var(--diffs-modified-light))),var(--diffs-dark-modified-color,var(--diffs-modified-color,var(--diffs-modified-dark)))));--diffs-bg-deletion:var(--diffs-bg-deletion-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-deletion-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base))));--diffs-bg-deletion-emphasis:var(--diffs-bg-deletion-emphasis-override,light-dark(rgb(from var(--diffs-deletion-base) r g b / .15),rgb(from var(--diffs-deletion-base) r g b / .2)));--diffs-bg-addition:var(--diffs-bg-addition-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-addition-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base))));--diffs-bg-addition-emphasis:var(--diffs-bg-addition-emphasis-override,light-dark(rgb(from var(--diffs-addition-base) r g b / .15),rgb(from var(--diffs-addition-base) r g b / .2)));--diffs-selection-base:var(--diffs-modified-base);--diffs-selection-number-fg:light-dark(color-mix(in lab, var(--diffs-selection-base) 65%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-selection-base) 75%, var(--diffs-mixer)));background-color:var(--diffs-bg);color:var(--diffs-fg);display:block}pre,code,[data-error-wrapper]{isolation:isolate;font-family:var(--diffs-font-family,var(--diffs-font-fallback));outline:none;margin:0;padding:0;display:block}pre,code{background-color:var(--diffs-bg)}code{contain:content}*,:before,:after{box-sizing:border-box}[data-icon-sprite]{display:none}[data-diffs-header],[data-separator]{font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback))}[data-diffs-header][data-sticky]{z-index:1;background-color:var(--diffs-bg);position:sticky;top:0}[data-file-info]{color:var(--fg);background-color:color-mix(in lab, var(--bg) 98%, var(--fg));border-block:1px solid color-mix(in lab, var(--bg) 95%, var(--fg));padding:10px;font-weight:700}[data-diff],[data-file]{--diffs-grid-number-column-width:minmax(min-content, max-content);--diffs-code-grid:var(--diffs-grid-number-column-width) 1fr}[data-dehydrated]:is([data-diff],[data-file]){--diffs-code-grid:var(--diffs-grid-number-column-width) minmax(0, 1fr)}:is([data-diff],[data-file]):hover [data-code]::-webkit-scrollbar-thumb{background-color:var(--diffs-bg-context)}@supports (-webkit-touch-callout:none){:host{--diffs-scrollbar-gutter-fallback:0px}}[data-line] span{color:light-dark(var(--diffs-token-light,var(--diffs-light)),var(--diffs-token-dark,var(--diffs-dark)));background-color:light-dark(var(--diffs-token-light-bg,inherit),var(--diffs-token-dark-bg,inherit));font-weight:light-dark(var(--diffs-token-light-font-weight,inherit),var(--diffs-token-dark-font-weight,inherit));font-style:light-dark(var(--diffs-token-light-font-style,inherit),var(--diffs-token-dark-font-style,inherit));-webkit-text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit));text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit))}[data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);color:var(--diffs-fg);background-color:var(--diffs-line-bg,var(--diffs-bg))}@media (pointer:fine){:is([data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]):where([data-hovered]){--diffs-computed-hovered-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-selected-line-bg) 97%, var(--diffs-bg-hover-override,var(--diffs-mixer))),color-mix(in lab, var(--diffs-computed-selected-line-bg) 91%, var(--diffs-bg-hover-override,var(--diffs-mixer))));--diffs-line-bg:var(--diffs-computed-hovered-line-bg,inherit)}}[data-decoration-bg]:is([data-line],[data-no-newline]){--mix-deco-light:92%;--mix-deco-dark:85%}[data-decoration-bg][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]){--mix-deco-light:88%;--mix-deco-dark:80%}[data-decoration-bg][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]){--mix-deco-light:85%;--mix-deco-dark:78%}@media (pointer:fine){[data-decoration-bg][data-hovered]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:85%;--mix-deco-dark:85%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:83%;--mix-deco-dark:83%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:81%;--mix-deco-dark:81%}}[data-decoration-bg]:is([data-line],[data-no-newline]){--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) var(--mix-deco-light), var(--diffs-decoration-bg)),color-mix(in lab, var(--diffs-bg) var(--mix-deco-dark), var(--diffs-decoration-bg)));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-line-annotation],[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context);--diffs-computed-decoration-bg:var(--diffs-annotation-bg);--diffs-computed-diff-line-bg:var(--diffs-annotation-bg);--diffs-computed-selected-line-bg:var(--diffs-annotation-bg);--diffs-line-bg:var(--diffs-annotation-bg)}[data-merge-conflict-actions],[data-gutter-buffer=merge-conflict-action],[data-gutter-buffer=merge-conflict-marker-base],[data-gutter-buffer=merge-conflict-marker-separator],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator]{--diffs-computed-decoration-bg:var(--diffs-bg-context);--diffs-computed-diff-line-bg:var(--diffs-bg-context);--diffs-computed-selected-line-bg:var(--diffs-bg-context);--diffs-line-bg:var(--diffs-bg-context)}[data-gutter-buffer=merge-conflict-marker-start],[data-merge-conflict=marker-start]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-gutter-buffer=merge-conflict-marker-end],[data-merge-conflict=marker-end]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-has-merge-conflict] [data-line-annotation],[data-has-merge-conflict] [data-gutter-buffer=annotation]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);--diffs-line-bg:var(--diffs-bg)}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number]{--mix-light:91%;--mix-dark:85%}:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--mix-light:88%;--mix-dark:80%}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--diffs-diff-line-mix-target:var(--diffs-bg)}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-deletion-override,var(--diffs-deletion-base))}@media (pointer:fine){[data-line-type=change-deletion][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:75%}}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-deletion-override,var(--diffs-deletion-base));--diffs-diff-line-mix-target:var(--diffs-bg-deletion-number-override,var(--diffs-deletion-base))}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-addition-override,var(--diffs-addition-base))}@media (pointer:fine){[data-line-type=change-addition][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--diffs-bg-addition-number-override,var(--diffs-addition-base))}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-current-override,var(--diffs-addition-base))}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--conflict-bg-current-number-override,var(--diffs-addition-base))}@media (pointer:fine){[data-merge-conflict=current][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-incoming-override,var(--diffs-modified-base))}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-modified-base);--diffs-diff-line-mix-target:var(--conflict-bg-incoming-number-override,var(--diffs-modified-base))}@media (pointer:fine){[data-merge-conflict=incoming][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]{--diffs-selection-mix-target:var(--diffs-bg-selection-override,var(--diffs-selection-base))}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--mix-selection-light:82%;--mix-selection-dark:75%}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:75%;--mix-selection-dark:70%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]){--mix-selection-light:75%;--mix-selection-dark:60%;--diffs-selection-mix-target:var(--diffs-bg-selection-number-override,var(--diffs-selection-base))}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:70%;--mix-selection-dark:55%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--diffs-computed-selected-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-light), var(--diffs-selection-mix-target)),color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-dark), var(--diffs-selection-mix-target)));--diffs-line-bg:var(--diffs-computed-selected-line-bg,inherit)}[data-selected-line]:is([data-gutter-buffer],[data-column-number]){color:var(--diffs-selection-number-fg)}[data-no-newline]{-webkit-user-select:none;user-select:none}[data-no-newline] span{opacity:.6}[data-diff-type=split][data-overflow=scroll]{grid-template-columns:1fr 1fr;display:grid}[data-diff-type=split][data-overflow=scroll] [data-additions]{border-left:1px solid var(--diffs-bg)}[data-diff-type=split][data-overflow=scroll] [data-deletions]{border-right:1px solid var(--diffs-bg)}[data-code]{grid-auto-flow:dense;grid-template-columns:var(--diffs-code-grid);overflow:var(--diffs-overflow-override,scroll) clip;overscroll-behavior-x:none;tab-size:var(--diffs-tab-size,2);padding-top:var(--diffs-gap-block,var(--diffs-gap-fallback));padding-bottom:max(0px, calc(var(--diffs-gap-block,var(--diffs-gap-fallback)) - var(--diffs-scrollbar-gutter)));scrollbar-gutter:stable;align-self:flex-start;display:grid}[data-diffs-scrollbar-measure]{opacity:0;pointer-events:none;scrollbar-gutter:auto;grid-template-columns:none;width:100px;height:100px;padding:0;position:absolute;top:-200px;left:-200px}[data-container-size]{container-type:inline-size}[data-code]::-webkit-scrollbar{width:0;height:var(--diffs-scrollbar-gutter)}[data-code]::-webkit-scrollbar-track{background:0 0}[data-code]::-webkit-scrollbar-thumb{background-color:#0000;background-clip:content-box;border:1px solid #0000;border-radius:3px}[data-code]::-webkit-scrollbar-corner{background-color:#0000}@supports ((-moz-appearance:none)){[data-code]{scrollbar-width:thin;scrollbar-color:var(--diffs-bg-context) transparent;padding-bottom:var(--diffs-gap-block,var(--diffs-gap-fallback))}}:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]) [data-code],[data-overflow=wrap]:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]){padding-top:0}[data-gutter]{grid-template-rows:subgrid;grid-template-columns:subgrid;z-index:3;background-color:var(--diffs-bg);grid-column:1;display:grid;position:relative}[data-gutter] [data-gutter-buffer],[data-gutter] [data-column-number]{border-right:var(--diffs-gap-style,2px solid var(--diffs-bg))}[data-content]{grid-template-rows:subgrid;grid-template-columns:subgrid;background-color:var(--diffs-bg);grid-column:2;min-width:0;display:grid}[data-diff-type=split][data-overflow=wrap]{grid-auto-flow:dense;grid-template-columns:repeat(2, var(--diffs-code-grid));padding-block:var(--diffs-gap-block,var(--diffs-gap-fallback));display:grid}[data-diff-type=split][data-overflow=wrap] [data-deletions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-gutter]{grid-column:1}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-content]{border-right:1px solid var(--diffs-bg);grid-column:2}[data-diff-type=split][data-overflow=wrap] [data-additions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-gutter]{border-left:1px solid var(--diffs-bg);grid-column:3}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-content]{grid-column:4}[data-overflow=scroll] [data-gutter]{position:sticky;left:0}[data-interactive-lines] [data-line]{cursor:pointer}[data-interactive-line-numbers] [data-column-number]{cursor:pointer;touch-action:none}[data-content-buffer],[data-gutter-buffer]{-webkit-user-select:none;user-select:none;min-height:1lh;position:relative}[data-gutter-buffer]{padding-left:2ch;padding-right:1ch}[data-gutter-buffer]:before{content:"";min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));display:block}[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context-gutter);min-height:0}[data-gutter-buffer=buffer]{--diffs-line-bg:var(--diffs-bg-context-gutter)}[data-content-buffer]{background-position:5px 0;background-size:8px 8px;background-origin:border-box;background-image:repeating-linear-gradient(-45deg, transparent, transparent 4.242px, var(--diffs-bg-buffer) 4.242px, var(--diffs-bg-buffer) 5.656px);grid-column:1}[data-separator]{box-sizing:content-box;background-color:var(--diffs-bg)}[data-separator=simple]{min-height:4px}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata],[data-separator=simple]{background-color:var(--diffs-bg-separator)}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata]{height:32px;position:relative}[data-separator-wrapper]{-webkit-user-select:none;user-select:none;fill:currentColor;background-color:var(--diffs-bg);align-items:center;height:100%;display:flex;position:absolute;inset-inline:0}[data-content] [data-separator-wrapper]{display:none}[data-separator=metadata] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;color:var(--diffs-fg-number);white-space:nowrap;text-overflow:ellipsis;min-width:min-content;padding-inline:1ch;inset-inline:100% auto;overflow:hidden}[data-separator=line-info]{margin-block:var(--diffs-gap-block,var(--diffs-gap-fallback))}[data-separator=line-info] [data-separator-wrapper]{min-width:16px}[data-separator=line-info-basic],[data-separator=metadata]{margin-block:0}[data-separator=line-info][data-separator-first]{margin-top:0}[data-separator=line-info][data-separator-last]{margin-bottom:0}[data-expand-index] [data-separator-wrapper]{grid-template-columns:32px auto;display:grid}[data-expand-index] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:32px 32px auto}[data-expand-button],[data-separator-content]{background-color:var(--diffs-bg-separator);flex:none;align-items:center;display:flex}[data-expand-index] [data-separator-content]:hover{cursor:pointer;text-decoration:underline}[data-expand-button]{cursor:pointer;min-width:32px;color:var(--diffs-fg-number);border-right:2px solid var(--diffs-bg);flex-shrink:0;justify-content:center;align-self:stretch}[data-expand-button]:hover{color:var(--diffs-fg)}[data-expand-button][data-expand-all-button]{display:none}[data-expand-down] [data-icon]{transform:scaleY(-1)}[data-separator-content]{height:100%;color:var(--diffs-fg-number);flex:auto;justify-content:flex-start;padding:0 1ch;overflow:hidden}:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-content]{-webkit-user-select:none;user-select:none;height:100%;overflow:clip}[data-unmodified-lines]{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;display:block;overflow:hidden}@supports (width:1cqi){[data-unified] [data-separator=line-info] [data-separator-wrapper]{padding-inline:var(--diffs-gap-inline,var(--diffs-gap-fallback));width:100cqi}:is([data-unified] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content]{border-radius:6px}[data-unified] [data-separator=line-info][data-expand-index] [data-separator-wrapper] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-gutter] [data-separator=line-info] [data-separator-wrapper]{padding-left:var(--diffs-gap-inline,var(--diffs-gap-fallback))}[data-gutter] [data-separator=line-info] [data-separator-content]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-gutter] [data-separator=line-info][data-expand-index] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-additions] [data-content] [data-separator=line-info]{background-color:var(--diffs-bg)}:is([data-additions] [data-content] [data-separator=line-info]) [data-separator-wrapper]{display:none}[data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);border-top-right-radius:6px;border-bottom-right-radius:6px;height:100%;display:block}:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}[data-overflow=scroll] [data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{width:calc(100cqi - var(--diffs-gap-inline,var(--diffs-gap-fallback)))}[data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;margin-right:var(--diffs-gap-inline,var(--diffs-gap-fallback));border-top-right-radius:6px;border-bottom-right-radius:6px;display:block}:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}@media (pointer:fine){[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:unset}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:6px;border-top-left-radius:unset}}}@media (pointer:coarse){[data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px 34px auto}:is([data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]) [data-separator-content]{grid-column:unset;grid-row:unset}@supports (width:1cqi){:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up],[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:unset;border-top-left-radius:unset}}}@media (pointer:fine){[data-separator-wrapper][data-separator-multi-button]{grid-template-rows:50% 50%;display:grid}[data-separator-wrapper][data-separator-multi-button] [data-separator-content]{grid-area:1/2/-1;min-width:min-content}[data-separator-wrapper][data-separator-multi-button] [data-expand-button]{grid-column:1}[data-separator=line-info] [data-separator-wrapper],[data-separator=line-info] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px auto}[data-separator=line-info-basic][data-expand-index] [data-separator-wrapper]{grid-template-columns:100% auto}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-up]{border-bottom:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-down]{border-top:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}}[data-additions] [data-gutter] [data-separator-wrapper],[data-additions] [data-separator=line-info-basic] [data-separator-wrapper],[data-content] [data-separator-wrapper]{display:none}[data-line-annotation]{min-height:var(--diffs-annotation-min-height,0);z-index:2}[data-merge-conflict-actions]{z-index:2}[data-separator=custom]{grid-template-columns:subgrid;display:grid}[data-line],[data-column-number],[data-no-newline]{padding-inline:1ch;position:relative}[data-indicators=classic] [data-line]{padding-inline-start:2ch}:is([data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion]),[data-line]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion])):before{-webkit-user-select:none;user-select:none;width:1ch;height:1lh;display:inline-block;position:absolute;top:0;left:0}:is([data-line]:is([data-indicators=classic] [data-line-type=change-addition]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition])):before{content:"+";color:var(--diffs-addition-base)}:is([data-line]:is([data-indicators=classic] [data-line-type=change-deletion]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-deletion])):before{content:"-";color:var(--diffs-deletion-base)}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion],[data-indicators=bars] [data-line-type=change-addition]):before{content:"";-webkit-user-select:none;user-select:none;contain:strict;width:4px;height:100%;display:block;position:absolute;top:0;left:0}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion]):before{background-image:linear-gradient(0deg, var(--diffs-bg-deletion) 50%, var(--diffs-deletion-base) 50%);background-repeat:repeat;background-size:2px 2px;background-size:calc(1lh/round(1lh / 2px)) calc(1lh/round(1lh / 2px))}[data-column-number]:is([data-indicators=bars] [data-line-type=change-addition]):before{background-color:var(--diffs-addition-base)}[data-overflow=wrap] [data-line],[data-overflow=wrap] [data-annotation-content]{white-space:pre-wrap;word-break:break-word}[data-overflow=scroll] [data-line]{white-space:pre;min-height:1lh}[data-column-number]{box-sizing:content-box;text-align:right;-webkit-user-select:none;user-select:none;color:var(--diffs-fg-number);padding-left:2ch}[data-line-number-content]{min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));z-index:1;display:inline-block;position:relative}[data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]{min-width:4px;padding:0}:is([data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]):before{min-width:0}[data-disable-line-numbers] [data-line-number-content]{display:none}[data-disable-line-numbers] [data-gutter-utility-slot]{right:unset;justify-content:flex-start;left:0}[data-disable-line-numbers][data-indicators=bars] [data-gutter-utility-slot]{left:6px}[data-file][data-disable-line-numbers] [data-gutter-buffer],[data-file][data-disable-line-numbers] [data-column-number]{border-right:0;min-width:0}[data-diff-span]{-webkit-box-decoration-break:clone;box-decoration-break:clone;border-radius:3px}[data-line-type=change-addition] [data-diff-span]{background-color:var(--diffs-bg-addition-emphasis)}[data-line-type=change-deletion] [data-diff-span]{background-color:var(--diffs-bg-deletion-emphasis)}[data-merge-conflict=marker-start],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator],[data-merge-conflict=marker-end]{color:var(--diffs-fg);padding-left:1ch}[data-merge-conflict=marker-start],[data-merge-conflict=marker-end]{align-items:center;display:flex}:is([data-merge-conflict=marker-start],[data-merge-conflict=marker-end]):after{color:var(--diffs-fg-conflict-marker);font-size:.75rem;font-style:normal;line-height:1.25rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));padding-left:1ch}[data-merge-conflict=marker-start]:after{content:"(Current Change)"}[data-merge-conflict=marker-end]:after{content:"(Incoming Change)"}[data-merge-conflict-actions-content]{min-height:1.75rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));color:var(--diffs-fg);align-items:center;gap:.25rem;padding-inline:.5rem;font-size:.75rem;line-height:1.2;display:flex}[data-merge-conflict-action]{appearance:none;color:var(--diffs-fg-number);font:inherit;cursor:pointer;background:0 0;border:0;padding:0;font-style:normal}[data-merge-conflict-action]:hover{color:var(--diffs-fg)}[data-merge-conflict-action=current]:hover{color:var(--diffs-addition-base)}[data-merge-conflict-action=incoming]:hover{color:var(--diffs-modified-base)}[data-merge-conflict-action-separator]{color:var(--diffs-fg-number);opacity:.6;-webkit-user-select:none;user-select:none}[data-diffs-header=default]{background-color:var(--diffs-bg);justify-content:space-between;align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));min-height:calc(1lh + var(--diffs-gap-block,var(--diffs-gap-fallback))*3);z-index:2;flex-direction:row;padding-inline:16px;display:flex;position:relative;top:0}[data-header-content]{align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));white-space:nowrap;flex-direction:row;min-width:0;display:flex}[data-header-content] [data-prev-name],[data-header-content] [data-title]{text-overflow:ellipsis;white-space:nowrap;direction:rtl;min-width:0;overflow:hidden}[data-prev-name]{opacity:.7}[data-rename-icon]{fill:currentColor;flex-grow:0;flex-shrink:0}[data-diffs-header=default] [data-metadata]{white-space:nowrap;align-items:center;gap:1ch;display:flex}[data-diffs-header=default] [data-additions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-addition-base)}[data-diffs-header=default] [data-deletions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-deletion-base)}[data-change-icon]{fill:currentColor;flex-shrink:0}[data-change-icon=change],[data-change-icon=rename-pure],[data-change-icon=rename-changed]{color:var(--diffs-modified-base)}[data-change-icon=new]{color:var(--diffs-addition-base)}[data-change-icon=deleted]{color:var(--diffs-deletion-base)}[data-change-icon=file]{opacity:.6}[data-annotation-content]{z-index:2;isolation:isolate;align-self:flex-start;min-width:0;display:flow-root;position:relative}[data-overflow=scroll] [data-annotation-content],[data-overflow=scroll] [data-merge-conflict-actions-content]{width:var(--diffs-column-content-width,auto);left:var(--diffs-column-number-width,0);position:sticky}[data-annotation-slot]{text-wrap-mode:wrap;word-break:normal;white-space-collapse:collapse}[data-gutter-utility-slot]{touch-action:none;justify-content:flex-end;display:flex;position:absolute;top:0;bottom:0;right:0}[data-utility-button]{appearance:none;cursor:pointer;width:1lh;height:1lh;font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);background-color:var(--diffs-modified-base);color:var(--diffs-bg);fill:currentColor;z-index:4;touch-action:none;border:none;border-radius:4px;justify-content:center;align-items:center;margin-right:calc(1ch - 1lh);padding:0;display:flex;position:relative}[data-utility-button]:before{content:"";display:block;position:absolute;inset:0 0 0 -4px}[data-decoration-bar-stack]{pointer-events:none;isolation:isolate;z-index:1;background-color:var(--diffs-decoration-bar-color,transparent);box-sizing:content-box;border-left:2px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg);width:6px;position:absolute;top:0;bottom:0;right:-2px}[data-decoration-bar-depth="1"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 20%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="2"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 45%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="3"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 65%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-start] [data-decoration-bar-stack]{border-top-left-radius:5px;border-top-right-radius:5px}[data-decoration-bar-end] [data-decoration-bar-stack]{z-index:3;border-bottom-right-radius:5px;border-bottom-left-radius:5px}[data-placeholder]{contain:strict}[data-error-wrapper]{padding:var(--diffs-gap-block,var(--diffs-gap-fallback)) var(--diffs-gap-inline,var(--diffs-gap-fallback));scrollbar-width:none;max-height:400px;overflow:auto}[data-error-wrapper] [data-error-message]{color:var(--diffs-deletion-base);font-size:18px;font-weight:700}[data-error-wrapper] [data-error-stack]{color:var(--diffs-fg-number)}}@layer theme,rendered,unsafe;
@layer theme {
}</style><style data-theme-css="">@layer base, theme, rendered, unsafe;
@layer rendered {
:host {
--diffs-scrollbar-gutter-measured: var(--diffs-scrollbar-gutter-fallback);
--diffs-dark:#fafafa;--diffs-dark-bg:#0a0a0a;--diffs-dark-addition-color:#07c480;--diffs-dark-deletion-color:#ff2e3f;--diffs-dark-modified-color:#009fff;--diffs-light:#0a0a0a;--diffs-light-bg:#ffffff;--diffs-light-addition-color:#18a46c;--diffs-light-deletion-color:#d52c36;--diffs-light-modified-color:#009fff;
}
}</style><div data-diffs-header="default" data-change-type="change"><div data-header-content=""><slot name="header-prefix"></slot><svg width="16" height="16" viewBox="0 0 16 16" data-change-icon="change"><use href="#diffs-icon-symbol-modified"></use></svg><div data-title=""><bdi>Dreamio/ProgressiveHTTPRangeCache.swift</bdi></div></div><div data-metadata=""><span data-deletions-count="">-15</span><span data-additions-count="">+174</span><slot name="header-metadata"></slot></div></div><pre data-diff="" data-diff-type="split" data-overflow="scroll" data-background="" data-indicators="bars" tabindex="0" style="--diffs-min-number-column-width-default:3ch;" data-dehydrated=""><code data-code="" data-container-size="" data-deletions=""><div data-gutter="" style="grid-row: span 286"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">72 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="73" data-line-index="72,72"><span data-line-number-content="">73</span></div><div data-line-type="context" data-column-number="74" data-line-index="73,73"><span data-line-number-content="">74</span></div><div data-line-type="context" data-column-number="75" data-line-index="74,74"><span data-line-number-content="">75</span></div><div data-gutter-buffer="buffer" data-buffer-size="6" style="grid-row: span 6;min-height:calc(6 * 1lh);"></div><div data-line-type="context" data-column-number="76" data-line-index="81,81"><span data-line-number-content="">76</span></div><div data-line-type="context" data-column-number="77" data-line-index="82,82"><span data-line-number-content="">77</span></div><div data-line-type="context" data-column-number="78" data-line-index="83,83"><span data-line-number-content="">78</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">38 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="117" data-line-index="122,122"><span data-line-number-content="">117</span></div><div data-line-type="context" data-column-number="118" data-line-index="123,123"><span data-line-number-content="">118</span></div><div data-line-type="context" data-column-number="119" data-line-index="124,124"><span data-line-number-content="">119</span></div><div data-gutter-buffer="buffer" data-buffer-size="27" style="grid-row: span 27;min-height:calc(27 * 1lh);"></div><div data-line-type="context" data-column-number="120" data-line-index="152,152"><span data-line-number-content="">120</span></div><div data-line-type="context" data-column-number="121" data-line-index="153,153"><span data-line-number-content="">121</span></div><div data-line-type="context" data-column-number="122" data-line-index="154,154"><span data-line-number-content="">122</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">12 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="135" data-line-index="167,167"><span data-line-number-content="">135</span></div><div data-line-type="context" data-column-number="136" data-line-index="168,168"><span data-line-number-content="">136</span></div><div data-line-type="context" data-column-number="137" data-line-index="169,169"><span data-line-number-content="">137</span></div><div data-gutter-buffer="buffer" data-buffer-size="55" style="grid-row: span 55;min-height:calc(55 * 1lh);"></div><div data-line-type="context" data-column-number="138" data-line-index="225,225"><span data-line-number-content="">138</span></div><div data-line-type="context" data-column-number="139" data-line-index="226,226"><span data-line-number-content="">139</span></div><div data-line-type="context" data-column-number="140" data-line-index="227,227"><span data-line-number-content="">140</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">116 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="257" data-line-index="344,344"><span data-line-number-content="">257</span></div><div data-line-type="context" data-column-number="258" data-line-index="345,345"><span data-line-number-content="">258</span></div><div data-line-type="context" data-column-number="259" data-line-index="346,346"><span data-line-number-content="">259</span></div><div data-gutter-buffer="buffer" data-buffer-size="2" style="grid-row: span 2;min-height:calc(2 * 1lh);"></div><div data-line-type="context" data-column-number="260" data-line-index="349,349"><span data-line-number-content="">260</span></div><div data-line-type="context" data-column-number="261" data-line-index="350,350"><span data-line-number-content="">261</span></div><div data-line-type="context" data-column-number="262" data-line-index="351,351"><span data-line-number-content="">262</span></div><div data-line-type="change-deletion" data-column-number="263" data-line-index="352,352"><span data-line-number-content="">263</span></div><div data-line-type="change-deletion" data-column-number="264" data-line-index="353,353"><span data-line-number-content="">264</span></div><div data-gutter-buffer="buffer" data-buffer-size="7" style="grid-row: span 7;min-height:calc(7 * 1lh);"></div><div data-line-type="context" data-column-number="265" data-line-index="363,361"><span data-line-number-content="">265</span></div><div data-line-type="context" data-column-number="266" data-line-index="364,362"><span data-line-number-content="">266</span></div><div data-line-type="context" data-column-number="267" data-line-index="365,363"><span data-line-number-content="">267</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="268" data-line-index="367,365"><span data-line-number-content="">268</span></div><div data-line-type="context" data-column-number="269" data-line-index="368,366"><span data-line-number-content="">269</span></div><div data-line-type="context" data-column-number="270" data-line-index="369,367"><span data-line-number-content="">270</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">2 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="273" data-line-index="372,370"><span data-line-number-content="">273</span></div><div data-line-type="context" data-column-number="274" data-line-index="373,371"><span data-line-number-content="">274</span></div><div data-line-type="context" data-column-number="275" data-line-index="374,372"><span data-line-number-content="">275</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="276" data-line-index="376,374"><span data-line-number-content="">276</span></div><div data-line-type="context" data-column-number="277" data-line-index="377,375"><span data-line-number-content="">277</span></div><div data-line-type="context" data-column-number="278" data-line-index="378,376"><span data-line-number-content="">278</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">1 unmodified line</span></div></div></div><div data-line-type="context" data-column-number="280" data-line-index="380,378"><span data-line-number-content="">280</span></div><div data-line-type="context" data-column-number="281" data-line-index="381,379"><span data-line-number-content="">281</span></div><div data-line-type="context" data-column-number="282" data-line-index="382,380"><span data-line-number-content="">282</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="283" data-line-index="384,382"><span data-line-number-content="">283</span></div><div data-line-type="change-deletion" data-column-number="284" data-line-index="385,383"><span data-line-number-content="">284</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="285" data-line-index="388,385"><span data-line-number-content="">285</span></div><div data-line-type="context" data-column-number="286" data-line-index="389,386"><span data-line-number-content="">286</span></div><div data-line-type="change-deletion" data-column-number="287" data-line-index="390,387"><span data-line-number-content="">287</span></div><div data-line-type="change-deletion" data-column-number="288" data-line-index="391,388"><span data-line-number-content="">288</span></div><div data-gutter-buffer="buffer" data-buffer-size="2" style="grid-row: span 2;min-height:calc(2 * 1lh);"></div><div data-line-type="context" data-column-number="289" data-line-index="396,391"><span data-line-number-content="">289</span></div><div data-line-type="change-deletion" data-column-number="290" data-line-index="397,392"><span data-line-number-content="">290</span></div><div data-line-type="context" data-column-number="291" data-line-index="399,393"><span data-line-number-content="">291</span></div><div data-line-type="context" data-column-number="292" data-line-index="400,394"><span data-line-number-content="">292</span></div><div data-line-type="context" data-column-number="293" data-line-index="401,395"><span data-line-number-content="">293</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">5 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="299" data-line-index="407,401"><span data-line-number-content="">299</span></div><div data-line-type="context" data-column-number="300" data-line-index="408,402"><span data-line-number-content="">300</span></div><div data-line-type="context" data-column-number="301" data-line-index="409,403"><span data-line-number-content="">301</span></div><div data-line-type="change-deletion" data-column-number="302" data-line-index="410,404"><span data-line-number-content="">302</span></div><div data-gutter-buffer="buffer" data-buffer-size="15" style="grid-row: span 15;min-height:calc(15 * 1lh);"></div><div data-line-type="context" data-column-number="303" data-line-index="427,420"><span data-line-number-content="">303</span></div><div data-line-type="context" data-column-number="304" data-line-index="428,421"><span data-line-number-content="">304</span></div><div data-line-type="context" data-column-number="305" data-line-index="429,422"><span data-line-number-content="">305</span></div><div data-gutter-buffer="buffer" data-buffer-size="9" style="grid-row: span 9;min-height:calc(9 * 1lh);"></div><div data-line-type="context" data-column-number="306" data-line-index="439,432"><span data-line-number-content="">306</span></div><div data-line-type="context" data-column-number="307" data-line-index="440,433"><span data-line-number-content="">307</span></div><div data-line-type="context" data-column-number="308" data-line-index="441,434"><span data-line-number-content="">308</span></div><div data-line-type="context" data-column-number="309" data-line-index="442,435"><span data-line-number-content="">309</span></div><div data-line-type="context" data-column-number="310" data-line-index="443,436"><span data-line-number-content="">310</span></div><div data-line-type="change-deletion" data-column-number="311" data-line-index="444,437"><span data-line-number-content="">311</span></div><div data-line-type="context" data-column-number="312" data-line-index="446,438"><span data-line-number-content="">312</span></div><div data-line-type="context" data-column-number="313" data-line-index="447,439"><span data-line-number-content="">313</span></div><div data-line-type="change-deletion" data-column-number="314" data-line-index="448,440"><span data-line-number-content="">314</span></div><div data-line-type="context" data-column-number="315" data-line-index="450,441"><span data-line-number-content="">315</span></div><div data-line-type="context" data-column-number="316" data-line-index="451,442"><span data-line-number-content="">316</span></div><div data-line-type="context" data-column-number="317" data-line-index="452,443"><span data-line-number-content="">317</span></div><div data-line-type="context" data-column-number="318" data-line-index="453,444"><span data-line-number-content="">318</span></div><div data-line-type="context" data-column-number="319" data-line-index="454,445"><span data-line-number-content="">319</span></div><div data-line-type="context" data-column-number="320" data-line-index="455,446"><span data-line-number-content="">320</span></div><div data-line-type="change-deletion" data-column-number="321" data-line-index="456,447"><span data-line-number-content="">321</span></div><div data-line-type="context" data-column-number="322" data-line-index="458,448"><span data-line-number-content="">322</span></div><div data-line-type="context" data-column-number="323" data-line-index="459,449"><span data-line-number-content="">323</span></div><div data-line-type="context" data-column-number="324" data-line-index="460,450"><span data-line-number-content="">324</span></div><div data-line-type="change-deletion" data-column-number="325" data-line-index="461,451"><span data-line-number-content="">325</span></div><div data-line-type="context" data-column-number="326" data-line-index="463,452"><span data-line-number-content="">326</span></div><div data-line-type="context" data-column-number="327" data-line-index="464,453"><span data-line-number-content="">327</span></div><div data-line-type="context" data-column-number="328" data-line-index="465,454"><span data-line-number-content="">328</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">1 unmodified line</span></div></div></div><div data-line-type="context" data-column-number="330" data-line-index="467,456"><span data-line-number-content="">330</span></div><div data-line-type="context" data-column-number="331" data-line-index="468,457"><span data-line-number-content="">331</span></div><div data-line-type="context" data-column-number="332" data-line-index="469,458"><span data-line-number-content="">332</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="333" data-line-index="471,460"><span data-line-number-content="">333</span></div><div data-line-type="context" data-column-number="334" data-line-index="472,461"><span data-line-number-content="">334</span></div><div data-line-type="context" data-column-number="335" data-line-index="473,462"><span data-line-number-content="">335</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">37 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="373" data-line-index="511,500"><span data-line-number-content="">373</span></div><div data-line-type="context" data-column-number="374" data-line-index="512,501"><span data-line-number-content="">374</span></div><div data-line-type="context" data-column-number="375" data-line-index="513,502"><span data-line-number-content="">375</span></div><div data-gutter-buffer="buffer" data-buffer-size="4" style="grid-row: span 4;min-height:calc(4 * 1lh);"></div><div data-line-type="context" data-column-number="376" data-line-index="518,507"><span data-line-number-content="">376</span></div><div data-line-type="change-deletion" data-column-number="377" data-line-index="519,508"><span data-line-number-content="">377</span></div><div data-line-type="context" data-column-number="378" data-line-index="521,509"><span data-line-number-content="">378</span></div><div data-line-type="change-deletion" data-column-number="379" data-line-index="522,510"><span data-line-number-content="">379</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="380" data-line-index="525,512"><span data-line-number-content="">380</span></div><div data-line-type="context" data-column-number="381" data-line-index="526,513"><span data-line-number-content="">381</span></div><div data-line-type="context" data-column-number="382" data-line-index="527,514"><span data-line-number-content="">382</span></div><div data-gutter-buffer="buffer" data-buffer-size="4" style="grid-row: span 4;min-height:calc(4 * 1lh);"></div><div data-line-type="context" data-column-number="383" data-line-index="532,519"><span data-line-number-content="">383</span></div><div data-line-type="change-deletion" data-column-number="384" data-line-index="533,520"><span data-line-number-content="">384</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="385" data-line-index="536,522"><span data-line-number-content="">385</span></div><div data-line-type="context" data-column-number="386" data-line-index="537,523"><span data-line-number-content="">386</span></div><div data-line-type="context" data-column-number="387" data-line-index="538,524"><span data-line-number-content="">387</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">3 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="391" data-line-index="542,528"><span data-line-number-content="">391</span></div><div data-line-type="context" data-column-number="392" data-line-index="543,529"><span data-line-number-content="">392</span></div><div data-line-type="context" data-column-number="393" data-line-index="544,530"><span data-line-number-content="">393</span></div><div data-line-type="change-deletion" data-column-number="394" data-line-index="545,531"><span data-line-number-content="">394</span></div><div data-line-type="context" data-column-number="395" data-line-index="547,532"><span data-line-number-content="">395</span></div><div data-line-type="context" data-column-number="396" data-line-index="548,533"><span data-line-number-content="">396</span></div><div data-line-type="context" data-column-number="397" data-line-index="549,534"><span data-line-number-content="">397</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">3 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="401" data-line-index="553,538"><span data-line-number-content="">401</span></div><div data-line-type="context" data-column-number="402" data-line-index="554,539"><span data-line-number-content="">402</span></div><div data-line-type="context" data-column-number="403" data-line-index="555,540"><span data-line-number-content="">403</span></div><div data-gutter-buffer="buffer" data-buffer-size="21" style="grid-row: span 21;min-height:calc(21 * 1lh);"></div><div data-line-type="context" data-column-number="404" data-line-index="577,562"><span data-line-number-content="">404</span></div><div data-line-type="context" data-column-number="405" data-line-index="578,563"><span data-line-number-content="">405</span></div><div data-line-type="context" data-column-number="406" data-line-index="579,564"><span data-line-number-content="">406</span></div></div><div data-content="" style="grid-row: span 286"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">72 unmodified lines</span></div></div></div><div data-line="73" data-alt-line="73" data-line-type="context" data-line-index="72,72"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="74" data-alt-line="74" data-line-type="context" data-line-index="73,73"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="75" data-alt-line="75" data-line-type="context" data-line-index="74,74">
</div><div data-content-buffer="" data-buffer-size="6" style="grid-row: span 6;min-height:calc(6 * 1lh)"></div><div data-line="76" data-alt-line="82" data-line-type="context" data-line-index="81,81"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: Data, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">at</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> start</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="77" data-alt-line="83" data-line-type="context" data-line-index="82,82"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">data.isEmpty </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="78" data-alt-line="84" data-line-type="context" data-line-index="83,83"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">38 unmodified lines</span></div></div></div><div data-line="117" data-alt-line="123" data-line-type="context" data-line-index="122,122"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="118" data-alt-line="124" data-line-type="context" data-line-index="123,123"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="119" data-alt-line="125" data-line-type="context" data-line-index="124,124">
</div><div data-content-buffer="" data-buffer-size="27" style="grid-row: span 27;min-height:calc(27 * 1lh)"></div><div data-line="120" data-alt-line="153" data-line-type="context" data-line-index="152,152"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> evict</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">keeping</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> window</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="121" data-alt-line="154" data-line-type="context" data-line-index="153,153"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> lock.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">withLock</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="122" data-alt-line="155" data-line-type="context" data-line-index="154,154"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segments </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segments.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">compactMap</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segment </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">12 unmodified lines</span></div></div></div><div data-line="135" data-alt-line="168" data-line-type="context" data-line-index="167,167"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="136" data-alt-line="169" data-line-type="context" data-line-index="168,168"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="137" data-alt-line="170" data-line-type="context" data-line-index="169,169">
</div><div data-content-buffer="" data-buffer-size="55" style="grid-row: span 55;min-height:calc(55 * 1lh)"></div><div data-line="138" data-alt-line="226" data-line-type="context" data-line-index="225,225"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> mergeSegments</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="139" data-alt-line="227" data-line-type="context" data-line-index="226,226"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">segments.isEmpty </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="140" data-alt-line="228" data-line-type="context" data-line-index="227,227"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">116 unmodified lines</span></div></div></div><div data-line="257" data-alt-line="345" data-line-type="context" data-line-index="344,344"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> durationProvider: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> TimeInterval</span></div><div data-line="258" data-alt-line="346" data-line-type="context" data-line-index="345,345"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchChunkSize: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1_048_576</span></div><div data-line="259" data-alt-line="347" data-line-type="context" data-line-index="346,346"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> responseChunkSize: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1_048_576</span></div><div data-content-buffer="" data-buffer-size="2" style="grid-row: span 2;min-height:calc(2 * 1lh)"></div><div data-line="260" data-alt-line="350" data-line-type="context" data-line-index="349,349"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchTask: Task</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">&#x3C;</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Void</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, Never</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">>?</span></div><div data-line="261" data-alt-line="351" data-line-type="context" data-line-index="350,350"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchWindow: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></div><div data-line="262" data-alt-line="352" data-line-type="context" data-line-index="351,351"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchPreferredOffset: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></div><div data-line="263" data-line-type="change-deletion" data-line-index="352,352">
</div><div data-line="264" data-line-type="change-deletion" data-line-index="353,353"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> </span><span data-diff-span=""><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE">init</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">fetcher</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPRangeRemoteFetcher, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contentLength</span></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span data-diff-span=""><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">durationProvider</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">@</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">escaping</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> TimeInterval</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></span></div><div data-content-buffer="" data-buffer-size="7" style="grid-row: span 7;min-height:calc(7 * 1lh)"></div><div data-line="265" data-alt-line="362" data-line-type="context" data-line-index="363,361"><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">fetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> fetcher</span></div><div data-line="266" data-alt-line="363" data-line-type="context" data-line-index="364,362"><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">contentLength</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> contentLength</span></div><div data-line="267" data-alt-line="364" data-line-type="context" data-line-index="365,363"><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">durationProvider</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> durationProvider</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="268" data-alt-line="366" data-line-type="context" data-line-index="367,365"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="269" data-alt-line="367" data-line-type="context" data-line-index="368,366">
</div><div data-line="270" data-alt-line="368" data-line-type="context" data-line-index="369,367"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> deinit</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">2 unmodified lines</span></div></div></div><div data-line="273" data-alt-line="371" data-line-type="context" data-line-index="372,370">
</div><div data-line="274" data-alt-line="372" data-line-type="context" data-line-index="373,371"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> requestedRange</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> async</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> throws</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> Data </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="275" data-alt-line="373" data-line-type="context" data-line-index="374,372"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bounded </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> clamp</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">requestedRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="276" data-alt-line="375" data-line-type="context" data-line-index="376,374"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="277" data-alt-line="376" data-line-type="context" data-line-index="377,375"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="278" data-alt-line="377" data-line-type="context" data-line-index="378,376"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioRangeCache] cache=hit range=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">bounded.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">bounded.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">1 unmodified line</span></div></div></div><div data-line="280" data-alt-line="379" data-line-type="context" data-line-index="380,378"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data</span></div><div data-line="281" data-alt-line="380" data-line-type="context" data-line-index="381,379"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="282" data-alt-line="381" data-line-type="context" data-line-index="382,380">
</div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="283" data-alt-line="383" data-line-type="context" data-line-index="384,382"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="284" data-line-type="change-deletion" data-line-index="385,383"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> </span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioRangeCache</span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">] </span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">cache=miss range=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">bounded</span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">bounded.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span></span><span data-diff-span=""><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="285" data-alt-line="386" data-line-type="context" data-line-index="388,385"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-line="286" data-alt-line="387" data-line-type="context" data-line-index="389,386"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cancelPrefetchIfNeeded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">forForegroundRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="287" data-line-type="change-deletion" data-line-index="390,387"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> fetcher.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">fetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></span></div><div data-line="288" data-line-type="change-deletion" data-line-index="391,388"><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span></span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data</span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded.start</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-content-buffer="" data-buffer-size="2" style="grid-row: span 2;min-height:calc(2 * 1lh)"></div><div data-line="289" data-alt-line="392" data-line-type="context" data-line-index="396,391"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, forceRestart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="290" data-line-type="change-deletion" data-line-index="397,392"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ??</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">data</span></span></div><div data-line="291" data-alt-line="394" data-line-type="context" data-line-index="399,393"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="292" data-alt-line="395" data-line-type="context" data-line-index="400,394">
</div><div data-line="293" data-alt-line="396" data-line-type="context" data-line-index="401,395"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> responseRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> requestedRange</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> HTTPByteRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">5 unmodified lines</span></div></div></div><div data-line="299" data-alt-line="402" data-line-type="context" data-line-index="407,401"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="300" data-alt-line="403" data-line-type="context" data-line-index="408,402">
</div><div data-line="301" data-alt-line="404" data-line-type="context" data-line-index="409,403"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="302" data-line-type="change-deletion" data-line-index="410,404"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset, forceRestart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> false</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-content-buffer="" data-buffer-size="15" style="grid-row: span 15;min-height:calc(15 * 1lh)"></div><div data-line="303" data-alt-line="421" data-line-type="context" data-line-index="427,420"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="304" data-alt-line="422" data-line-type="context" data-line-index="428,421">
</div><div data-line="305" data-alt-line="423" data-line-type="context" data-line-index="429,422"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">forceRestart</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Bool</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-content-buffer="" data-buffer-size="9" style="grid-row: span 9;min-height:calc(9 * 1lh)"></div><div data-line="306" data-alt-line="433" data-line-type="context" data-line-index="439,432"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">forceRestart, activePrefetchWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">offset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ==</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, prefetchTask</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.isCancelled </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">==</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> false</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="307" data-alt-line="434" data-line-type="context" data-line-index="440,433"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="308" data-alt-line="435" data-line-type="context" data-line-index="441,434"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="309" data-alt-line="436" data-line-type="context" data-line-index="442,435">
</div><div data-line="310" data-alt-line="437" data-line-type="context" data-line-index="443,436"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchTask</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">cancel</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="311" data-line-type="change-deletion" data-line-index="444,437"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> window </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="312" data-alt-line="439" data-line-type="context" data-line-index="446,438"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchWindow </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> window</span></div><div data-line="313" data-alt-line="440" data-line-type="context" data-line-index="447,439"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchPreferredOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> offset</span></div><div data-line="314" data-line-type="change-deletion" data-line-index="448,440"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">evict</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">keeping</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> window</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="315" data-alt-line="442" data-line-type="context" data-line-index="450,441"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">hasData</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> window</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="316" data-alt-line="443" data-line-type="context" data-line-index="451,442"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchWindow </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="317" data-alt-line="444" data-line-type="context" data-line-index="452,443"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchPreferredOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="318" data-alt-line="445" data-line-type="context" data-line-index="453,444"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="319" data-alt-line="446" data-line-type="context" data-line-index="454,445"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="320" data-alt-line="447" data-line-type="context" data-line-index="455,446">
</div><div data-line="321" data-line-type="change-deletion" data-line-index="456,447"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchTask </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> Task</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> [</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">weak</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">] </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span></div><div data-line="322" data-alt-line="449" data-line-type="context" data-line-index="458,448"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="323" data-alt-line="450" data-line-type="context" data-line-index="459,449"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="324" data-alt-line="451" data-line-type="context" data-line-index="460,450"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="325" data-line-type="change-deletion" data-line-index="461,451"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> for</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunk </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">prefetchChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">in</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> window, preferredOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="326" data-alt-line="453" data-line-type="context" data-line-index="463,452"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">Task.isCancelled </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="327" data-alt-line="454" data-line-type="context" data-line-index="464,453"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="328" data-alt-line="455" data-line-type="context" data-line-index="465,454"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">1 unmodified line</span></div></div></div><div data-line="330" data-alt-line="457" data-line-type="context" data-line-index="467,456"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> do</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="331" data-alt-line="458" data-line-type="context" data-line-index="468,457"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> fetcher.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">fetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> chunk</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="332" data-alt-line="459" data-line-type="context" data-line-index="469,458"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data, at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> chunk.start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="333" data-alt-line="461" data-line-type="context" data-line-index="471,460"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="334" data-alt-line="462" data-line-type="context" data-line-index="472,461"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioRangeCache] fetched range=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">chunk.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">chunk.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> bytes=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">data.count</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="335" data-alt-line="463" data-line-type="context" data-line-index="473,462"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">37 unmodified lines</span></div></div></div><div data-line="373" data-alt-line="501" data-line-type="context" data-line-index="511,500"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="374" data-alt-line="502" data-line-type="context" data-line-index="512,501">
</div><div data-line="375" data-alt-line="503" data-line-type="context" data-line-index="513,502"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> HTTPByteRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-content-buffer="" data-buffer-size="4" style="grid-row: span 4;min-height:calc(4 * 1lh)"></div><div data-line="376" data-alt-line="508" data-line-type="context" data-line-index="518,507"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bytesPerSecond </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> estimatedBytesPerSecond</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="377" data-line-type="change-deletion" data-line-index="519,508"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> behind </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">prefetchChunkSize</span></span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, bytesPerSecond </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">*</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 30</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="378" data-alt-line="510" data-line-type="context" data-line-index="521,509"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> ahead </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">prefetchChunkSize </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">*</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 2</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, bytesPerSecond </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">*</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 60</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="379" data-line-type="change-deletion" data-line-index="522,510"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">return</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> </span></span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">clamp</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> behind, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> ahead</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="380" data-alt-line="513" data-line-type="context" data-line-index="525,512"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="381" data-alt-line="514" data-line-type="context" data-line-index="526,513">
</div><div data-line="382" data-alt-line="515" data-line-type="context" data-line-index="527,514"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">in</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> window</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">preferredOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> [</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-content-buffer="" data-buffer-size="4" style="grid-row: span 4;min-height:calc(4 * 1lh)"></div><div data-line="383" data-alt-line="520" data-line-type="context" data-line-index="532,519"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> boundedOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">window.start, min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">window.end, offset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="384" data-line-type="change-deletion" data-line-index="533,520"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">preferredStart</span></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">window.start </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ((</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">boundedOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">window.start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span data-diff-span=""><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> /</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchChunkSize</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> *</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchChunkSize</span></span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="385" data-alt-line="523" data-line-type="context" data-line-index="536,522"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div><div data-line="386" data-alt-line="524" data-line-type="context" data-line-index="537,523">
</div><div data-line="387" data-alt-line="525" data-line-type="context" data-line-index="538,524"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> preferredStart</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">3 unmodified lines</span></div></div></div><div data-line="391" data-alt-line="529" data-line-type="context" data-line-index="542,528"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunk.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span></div><div data-line="392" data-alt-line="530" data-line-type="context" data-line-index="543,529"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="393" data-alt-line="531" data-line-type="context" data-line-index="544,530">
</div><div data-line="394" data-line-type="change-deletion" data-line-index="545,531"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">window.start</span></span></div><div data-line="395" data-alt-line="533" data-line-type="context" data-line-index="547,532"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> while</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">&#x3C;</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> preferredStart </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="396" data-alt-line="534" data-line-type="context" data-line-index="548,533"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunk </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cursor, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">preferredStart </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunkSize </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="397" data-alt-line="535" data-line-type="context" data-line-index="549,534"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">append</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">chunk</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">3 unmodified lines</span></div></div></div><div data-line="401" data-alt-line="539" data-line-type="context" data-line-index="553,538"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks</span></div><div data-line="402" data-alt-line="540" data-line-type="context" data-line-index="554,539"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="403" data-alt-line="541" data-line-type="context" data-line-index="555,540">
</div><div data-content-buffer="" data-buffer-size="21" style="grid-row: span 21;min-height:calc(21 * 1lh)"></div><div data-line="404" data-alt-line="563" data-line-type="context" data-line-index="577,562"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> estimatedBytesPerSecond</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="405" data-alt-line="564" data-line-type="context" data-line-index="578,563"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> duration </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> durationProvider</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="406" data-alt-line="565" data-line-type="context" data-line-index="579,564"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> duration </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">></span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div></div></code><code data-code="" data-container-size="" data-additions=""><div data-gutter="" style="grid-row: span 286"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">72 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="73" data-line-index="72,72"><span data-line-number-content="">73</span></div><div data-line-type="context" data-column-number="74" data-line-index="73,73"><span data-line-number-content="">74</span></div><div data-line-type="context" data-column-number="75" data-line-index="74,74"><span data-line-number-content="">75</span></div><div data-line-type="change-addition" data-column-number="76" data-line-index="75,75"><span data-line-number-content="">76</span></div><div data-line-type="change-addition" data-column-number="77" data-line-index="76,76"><span data-line-number-content="">77</span></div><div data-line-type="change-addition" data-column-number="78" data-line-index="77,77"><span data-line-number-content="">78</span></div><div data-line-type="change-addition" data-column-number="79" data-line-index="78,78"><span data-line-number-content="">79</span></div><div data-line-type="change-addition" data-column-number="80" data-line-index="79,79"><span data-line-number-content="">80</span></div><div data-line-type="change-addition" data-column-number="81" data-line-index="80,80"><span data-line-number-content="">81</span></div><div data-line-type="context" data-column-number="82" data-line-index="81,81"><span data-line-number-content="">82</span></div><div data-line-type="context" data-column-number="83" data-line-index="82,82"><span data-line-number-content="">83</span></div><div data-line-type="context" data-column-number="84" data-line-index="83,83"><span data-line-number-content="">84</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">38 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="123" data-line-index="122,122"><span data-line-number-content="">123</span></div><div data-line-type="context" data-column-number="124" data-line-index="123,123"><span data-line-number-content="">124</span></div><div data-line-type="context" data-column-number="125" data-line-index="124,124"><span data-line-number-content="">125</span></div><div data-line-type="change-addition" data-column-number="126" data-line-index="125,125"><span data-line-number-content="">126</span></div><div data-line-type="change-addition" data-column-number="127" data-line-index="126,126"><span data-line-number-content="">127</span></div><div data-line-type="change-addition" data-column-number="128" data-line-index="127,127"><span data-line-number-content="">128</span></div><div data-line-type="change-addition" data-column-number="129" data-line-index="128,128"><span data-line-number-content="">129</span></div><div data-line-type="change-addition" data-column-number="130" data-line-index="129,129"><span data-line-number-content="">130</span></div><div data-line-type="change-addition" data-column-number="131" data-line-index="130,130"><span data-line-number-content="">131</span></div><div data-line-type="change-addition" data-column-number="132" data-line-index="131,131"><span data-line-number-content="">132</span></div><div data-line-type="change-addition" data-column-number="133" data-line-index="132,132"><span data-line-number-content="">133</span></div><div data-line-type="change-addition" data-column-number="134" data-line-index="133,133"><span data-line-number-content="">134</span></div><div data-line-type="change-addition" data-column-number="135" data-line-index="134,134"><span data-line-number-content="">135</span></div><div data-line-type="change-addition" data-column-number="136" data-line-index="135,135"><span data-line-number-content="">136</span></div><div data-line-type="change-addition" data-column-number="137" data-line-index="136,136"><span data-line-number-content="">137</span></div><div data-line-type="change-addition" data-column-number="138" data-line-index="137,137"><span data-line-number-content="">138</span></div><div data-line-type="change-addition" data-column-number="139" data-line-index="138,138"><span data-line-number-content="">139</span></div><div data-line-type="change-addition" data-column-number="140" data-line-index="139,139"><span data-line-number-content="">140</span></div><div data-line-type="change-addition" data-column-number="141" data-line-index="140,140"><span data-line-number-content="">141</span></div><div data-line-type="change-addition" data-column-number="142" data-line-index="141,141"><span data-line-number-content="">142</span></div><div data-line-type="change-addition" data-column-number="143" data-line-index="142,142"><span data-line-number-content="">143</span></div><div data-line-type="change-addition" data-column-number="144" data-line-index="143,143"><span data-line-number-content="">144</span></div><div data-line-type="change-addition" data-column-number="145" data-line-index="144,144"><span data-line-number-content="">145</span></div><div data-line-type="change-addition" data-column-number="146" data-line-index="145,145"><span data-line-number-content="">146</span></div><div data-line-type="change-addition" data-column-number="147" data-line-index="146,146"><span data-line-number-content="">147</span></div><div data-line-type="change-addition" data-column-number="148" data-line-index="147,147"><span data-line-number-content="">148</span></div><div data-line-type="change-addition" data-column-number="149" data-line-index="148,148"><span data-line-number-content="">149</span></div><div data-line-type="change-addition" data-column-number="150" data-line-index="149,149"><span data-line-number-content="">150</span></div><div data-line-type="change-addition" data-column-number="151" data-line-index="150,150"><span data-line-number-content="">151</span></div><div data-line-type="change-addition" data-column-number="152" data-line-index="151,151"><span data-line-number-content="">152</span></div><div data-line-type="context" data-column-number="153" data-line-index="152,152"><span data-line-number-content="">153</span></div><div data-line-type="context" data-column-number="154" data-line-index="153,153"><span data-line-number-content="">154</span></div><div data-line-type="context" data-column-number="155" data-line-index="154,154"><span data-line-number-content="">155</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">12 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="168" data-line-index="167,167"><span data-line-number-content="">168</span></div><div data-line-type="context" data-column-number="169" data-line-index="168,168"><span data-line-number-content="">169</span></div><div data-line-type="context" data-column-number="170" data-line-index="169,169"><span data-line-number-content="">170</span></div><div data-line-type="change-addition" data-column-number="171" data-line-index="170,170"><span data-line-number-content="">171</span></div><div data-line-type="change-addition" data-column-number="172" data-line-index="171,171"><span data-line-number-content="">172</span></div><div data-line-type="change-addition" data-column-number="173" data-line-index="172,172"><span data-line-number-content="">173</span></div><div data-line-type="change-addition" data-column-number="174" data-line-index="173,173"><span data-line-number-content="">174</span></div><div data-line-type="change-addition" data-column-number="175" data-line-index="174,174"><span data-line-number-content="">175</span></div><div data-line-type="change-addition" data-column-number="176" data-line-index="175,175"><span data-line-number-content="">176</span></div><div data-line-type="change-addition" data-column-number="177" data-line-index="176,176"><span data-line-number-content="">177</span></div><div data-line-type="change-addition" data-column-number="178" data-line-index="177,177"><span data-line-number-content="">178</span></div><div data-line-type="change-addition" data-column-number="179" data-line-index="178,178"><span data-line-number-content="">179</span></div><div data-line-type="change-addition" data-column-number="180" data-line-index="179,179"><span data-line-number-content="">180</span></div><div data-line-type="change-addition" data-column-number="181" data-line-index="180,180"><span data-line-number-content="">181</span></div><div data-line-type="change-addition" data-column-number="182" data-line-index="181,181"><span data-line-number-content="">182</span></div><div data-line-type="change-addition" data-column-number="183" data-line-index="182,182"><span data-line-number-content="">183</span></div><div data-line-type="change-addition" data-column-number="184" data-line-index="183,183"><span data-line-number-content="">184</span></div><div data-line-type="change-addition" data-column-number="185" data-line-index="184,184"><span data-line-number-content="">185</span></div><div data-line-type="change-addition" data-column-number="186" data-line-index="185,185"><span data-line-number-content="">186</span></div><div data-line-type="change-addition" data-column-number="187" data-line-index="186,186"><span data-line-number-content="">187</span></div><div data-line-type="change-addition" data-column-number="188" data-line-index="187,187"><span data-line-number-content="">188</span></div><div data-line-type="change-addition" data-column-number="189" data-line-index="188,188"><span data-line-number-content="">189</span></div><div data-line-type="change-addition" data-column-number="190" data-line-index="189,189"><span data-line-number-content="">190</span></div><div data-line-type="change-addition" data-column-number="191" data-line-index="190,190"><span data-line-number-content="">191</span></div><div data-line-type="change-addition" data-column-number="192" data-line-index="191,191"><span data-line-number-content="">192</span></div><div data-line-type="change-addition" data-column-number="193" data-line-index="192,192"><span data-line-number-content="">193</span></div><div data-line-type="change-addition" data-column-number="194" data-line-index="193,193"><span data-line-number-content="">194</span></div><div data-line-type="change-addition" data-column-number="195" data-line-index="194,194"><span data-line-number-content="">195</span></div><div data-line-type="change-addition" data-column-number="196" data-line-index="195,195"><span data-line-number-content="">196</span></div><div data-line-type="change-addition" data-column-number="197" data-line-index="196,196"><span data-line-number-content="">197</span></div><div data-line-type="change-addition" data-column-number="198" data-line-index="197,197"><span data-line-number-content="">198</span></div><div data-line-type="change-addition" data-column-number="199" data-line-index="198,198"><span data-line-number-content="">199</span></div><div data-line-type="change-addition" data-column-number="200" data-line-index="199,199"><span data-line-number-content="">200</span></div><div data-line-type="change-addition" data-column-number="201" data-line-index="200,200"><span data-line-number-content="">201</span></div><div data-line-type="change-addition" data-column-number="202" data-line-index="201,201"><span data-line-number-content="">202</span></div><div data-line-type="change-addition" data-column-number="203" data-line-index="202,202"><span data-line-number-content="">203</span></div><div data-line-type="change-addition" data-column-number="204" data-line-index="203,203"><span data-line-number-content="">204</span></div><div data-line-type="change-addition" data-column-number="205" data-line-index="204,204"><span data-line-number-content="">205</span></div><div data-line-type="change-addition" data-column-number="206" data-line-index="205,205"><span data-line-number-content="">206</span></div><div data-line-type="change-addition" data-column-number="207" data-line-index="206,206"><span data-line-number-content="">207</span></div><div data-line-type="change-addition" data-column-number="208" data-line-index="207,207"><span data-line-number-content="">208</span></div><div data-line-type="change-addition" data-column-number="209" data-line-index="208,208"><span data-line-number-content="">209</span></div><div data-line-type="change-addition" data-column-number="210" data-line-index="209,209"><span data-line-number-content="">210</span></div><div data-line-type="change-addition" data-column-number="211" data-line-index="210,210"><span data-line-number-content="">211</span></div><div data-line-type="change-addition" data-column-number="212" data-line-index="211,211"><span data-line-number-content="">212</span></div><div data-line-type="change-addition" data-column-number="213" data-line-index="212,212"><span data-line-number-content="">213</span></div><div data-line-type="change-addition" data-column-number="214" data-line-index="213,213"><span data-line-number-content="">214</span></div><div data-line-type="change-addition" data-column-number="215" data-line-index="214,214"><span data-line-number-content="">215</span></div><div data-line-type="change-addition" data-column-number="216" data-line-index="215,215"><span data-line-number-content="">216</span></div><div data-line-type="change-addition" data-column-number="217" data-line-index="216,216"><span data-line-number-content="">217</span></div><div data-line-type="change-addition" data-column-number="218" data-line-index="217,217"><span data-line-number-content="">218</span></div><div data-line-type="change-addition" data-column-number="219" data-line-index="218,218"><span data-line-number-content="">219</span></div><div data-line-type="change-addition" data-column-number="220" data-line-index="219,219"><span data-line-number-content="">220</span></div><div data-line-type="change-addition" data-column-number="221" data-line-index="220,220"><span data-line-number-content="">221</span></div><div data-line-type="change-addition" data-column-number="222" data-line-index="221,221"><span data-line-number-content="">222</span></div><div data-line-type="change-addition" data-column-number="223" data-line-index="222,222"><span data-line-number-content="">223</span></div><div data-line-type="change-addition" data-column-number="224" data-line-index="223,223"><span data-line-number-content="">224</span></div><div data-line-type="change-addition" data-column-number="225" data-line-index="224,224"><span data-line-number-content="">225</span></div><div data-line-type="context" data-column-number="226" data-line-index="225,225"><span data-line-number-content="">226</span></div><div data-line-type="context" data-column-number="227" data-line-index="226,226"><span data-line-number-content="">227</span></div><div data-line-type="context" data-column-number="228" data-line-index="227,227"><span data-line-number-content="">228</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">116 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="345" data-line-index="344,344"><span data-line-number-content="">345</span></div><div data-line-type="context" data-column-number="346" data-line-index="345,345"><span data-line-number-content="">346</span></div><div data-line-type="context" data-column-number="347" data-line-index="346,346"><span data-line-number-content="">347</span></div><div data-line-type="change-addition" data-column-number="348" data-line-index="347,347"><span data-line-number-content="">348</span></div><div data-line-type="change-addition" data-column-number="349" data-line-index="348,348"><span data-line-number-content="">349</span></div><div data-line-type="context" data-column-number="350" data-line-index="349,349"><span data-line-number-content="">350</span></div><div data-line-type="context" data-column-number="351" data-line-index="350,350"><span data-line-number-content="">351</span></div><div data-line-type="context" data-column-number="352" data-line-index="351,351"><span data-line-number-content="">352</span></div><div data-line-type="change-addition" data-column-number="353" data-line-index="354,352"><span data-line-number-content="">353</span></div><div data-line-type="change-addition" data-column-number="354" data-line-index="355,353"><span data-line-number-content="">354</span></div><div data-line-type="change-addition" data-column-number="355" data-line-index="356,354"><span data-line-number-content="">355</span></div><div data-line-type="change-addition" data-column-number="356" data-line-index="357,355"><span data-line-number-content="">356</span></div><div data-line-type="change-addition" data-column-number="357" data-line-index="358,356"><span data-line-number-content="">357</span></div><div data-line-type="change-addition" data-column-number="358" data-line-index="359,357"><span data-line-number-content="">358</span></div><div data-line-type="change-addition" data-column-number="359" data-line-index="360,358"><span data-line-number-content="">359</span></div><div data-line-type="change-addition" data-column-number="360" data-line-index="361,359"><span data-line-number-content="">360</span></div><div data-line-type="change-addition" data-column-number="361" data-line-index="362,360"><span data-line-number-content="">361</span></div><div data-line-type="context" data-column-number="362" data-line-index="363,361"><span data-line-number-content="">362</span></div><div data-line-type="context" data-column-number="363" data-line-index="364,362"><span data-line-number-content="">363</span></div><div data-line-type="context" data-column-number="364" data-line-index="365,363"><span data-line-number-content="">364</span></div><div data-line-type="change-addition" data-column-number="365" data-line-index="366,364"><span data-line-number-content="">365</span></div><div data-line-type="context" data-column-number="366" data-line-index="367,365"><span data-line-number-content="">366</span></div><div data-line-type="context" data-column-number="367" data-line-index="368,366"><span data-line-number-content="">367</span></div><div data-line-type="context" data-column-number="368" data-line-index="369,367"><span data-line-number-content="">368</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">2 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="371" data-line-index="372,370"><span data-line-number-content="">371</span></div><div data-line-type="context" data-column-number="372" data-line-index="373,371"><span data-line-number-content="">372</span></div><div data-line-type="context" data-column-number="373" data-line-index="374,372"><span data-line-number-content="">373</span></div><div data-line-type="change-addition" data-column-number="374" data-line-index="375,373"><span data-line-number-content="">374</span></div><div data-line-type="context" data-column-number="375" data-line-index="376,374"><span data-line-number-content="">375</span></div><div data-line-type="context" data-column-number="376" data-line-index="377,375"><span data-line-number-content="">376</span></div><div data-line-type="context" data-column-number="377" data-line-index="378,376"><span data-line-number-content="">377</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">1 unmodified line</span></div></div></div><div data-line-type="context" data-column-number="379" data-line-index="380,378"><span data-line-number-content="">379</span></div><div data-line-type="context" data-column-number="380" data-line-index="381,379"><span data-line-number-content="">380</span></div><div data-line-type="context" data-column-number="381" data-line-index="382,380"><span data-line-number-content="">381</span></div><div data-line-type="change-addition" data-column-number="382" data-line-index="383,381"><span data-line-number-content="">382</span></div><div data-line-type="context" data-column-number="383" data-line-index="384,382"><span data-line-number-content="">383</span></div><div data-line-type="change-addition" data-column-number="384" data-line-index="386,383"><span data-line-number-content="">384</span></div><div data-line-type="change-addition" data-column-number="385" data-line-index="387,384"><span data-line-number-content="">385</span></div><div data-line-type="context" data-column-number="386" data-line-index="388,385"><span data-line-number-content="">386</span></div><div data-line-type="context" data-column-number="387" data-line-index="389,386"><span data-line-number-content="">387</span></div><div data-line-type="change-addition" data-column-number="388" data-line-index="392,387"><span data-line-number-content="">388</span></div><div data-line-type="change-addition" data-column-number="389" data-line-index="393,388"><span data-line-number-content="">389</span></div><div data-line-type="change-addition" data-column-number="390" data-line-index="394,389"><span data-line-number-content="">390</span></div><div data-line-type="change-addition" data-column-number="391" data-line-index="395,390"><span data-line-number-content="">391</span></div><div data-line-type="context" data-column-number="392" data-line-index="396,391"><span data-line-number-content="">392</span></div><div data-line-type="change-addition" data-column-number="393" data-line-index="398,392"><span data-line-number-content="">393</span></div><div data-line-type="context" data-column-number="394" data-line-index="399,393"><span data-line-number-content="">394</span></div><div data-line-type="context" data-column-number="395" data-line-index="400,394"><span data-line-number-content="">395</span></div><div data-line-type="context" data-column-number="396" data-line-index="401,395"><span data-line-number-content="">396</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">5 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="402" data-line-index="407,401"><span data-line-number-content="">402</span></div><div data-line-type="context" data-column-number="403" data-line-index="408,402"><span data-line-number-content="">403</span></div><div data-line-type="context" data-column-number="404" data-line-index="409,403"><span data-line-number-content="">404</span></div><div data-line-type="change-addition" data-column-number="405" data-line-index="411,404"><span data-line-number-content="">405</span></div><div data-line-type="change-addition" data-column-number="406" data-line-index="412,405"><span data-line-number-content="">406</span></div><div data-line-type="change-addition" data-column-number="407" data-line-index="413,406"><span data-line-number-content="">407</span></div><div data-line-type="change-addition" data-column-number="408" data-line-index="414,407"><span data-line-number-content="">408</span></div><div data-line-type="change-addition" data-column-number="409" data-line-index="415,408"><span data-line-number-content="">409</span></div><div data-line-type="change-addition" data-column-number="410" data-line-index="416,409"><span data-line-number-content="">410</span></div><div data-line-type="change-addition" data-column-number="411" data-line-index="417,410"><span data-line-number-content="">411</span></div><div data-line-type="change-addition" data-column-number="412" data-line-index="418,411"><span data-line-number-content="">412</span></div><div data-line-type="change-addition" data-column-number="413" data-line-index="419,412"><span data-line-number-content="">413</span></div><div data-line-type="change-addition" data-column-number="414" data-line-index="420,413"><span data-line-number-content="">414</span></div><div data-line-type="change-addition" data-column-number="415" data-line-index="421,414"><span data-line-number-content="">415</span></div><div data-line-type="change-addition" data-column-number="416" data-line-index="422,415"><span data-line-number-content="">416</span></div><div data-line-type="change-addition" data-column-number="417" data-line-index="423,416"><span data-line-number-content="">417</span></div><div data-line-type="change-addition" data-column-number="418" data-line-index="424,417"><span data-line-number-content="">418</span></div><div data-line-type="change-addition" data-column-number="419" data-line-index="425,418"><span data-line-number-content="">419</span></div><div data-line-type="change-addition" data-column-number="420" data-line-index="426,419"><span data-line-number-content="">420</span></div><div data-line-type="context" data-column-number="421" data-line-index="427,420"><span data-line-number-content="">421</span></div><div data-line-type="context" data-column-number="422" data-line-index="428,421"><span data-line-number-content="">422</span></div><div data-line-type="context" data-column-number="423" data-line-index="429,422"><span data-line-number-content="">423</span></div><div data-line-type="change-addition" data-column-number="424" data-line-index="430,423"><span data-line-number-content="">424</span></div><div data-line-type="change-addition" data-column-number="425" data-line-index="431,424"><span data-line-number-content="">425</span></div><div data-line-type="change-addition" data-column-number="426" data-line-index="432,425"><span data-line-number-content="">426</span></div><div data-line-type="change-addition" data-column-number="427" data-line-index="433,426"><span data-line-number-content="">427</span></div><div data-line-type="change-addition" data-column-number="428" data-line-index="434,427"><span data-line-number-content="">428</span></div><div data-line-type="change-addition" data-column-number="429" data-line-index="435,428"><span data-line-number-content="">429</span></div><div data-line-type="change-addition" data-column-number="430" data-line-index="436,429"><span data-line-number-content="">430</span></div><div data-line-type="change-addition" data-column-number="431" data-line-index="437,430"><span data-line-number-content="">431</span></div><div data-line-type="change-addition" data-column-number="432" data-line-index="438,431"><span data-line-number-content="">432</span></div><div data-line-type="context" data-column-number="433" data-line-index="439,432"><span data-line-number-content="">433</span></div><div data-line-type="context" data-column-number="434" data-line-index="440,433"><span data-line-number-content="">434</span></div><div data-line-type="context" data-column-number="435" data-line-index="441,434"><span data-line-number-content="">435</span></div><div data-line-type="context" data-column-number="436" data-line-index="442,435"><span data-line-number-content="">436</span></div><div data-line-type="context" data-column-number="437" data-line-index="443,436"><span data-line-number-content="">437</span></div><div data-line-type="change-addition" data-column-number="438" data-line-index="445,437"><span data-line-number-content="">438</span></div><div data-line-type="context" data-column-number="439" data-line-index="446,438"><span data-line-number-content="">439</span></div><div data-line-type="context" data-column-number="440" data-line-index="447,439"><span data-line-number-content="">440</span></div><div data-line-type="change-addition" data-column-number="441" data-line-index="449,440"><span data-line-number-content="">441</span></div><div data-line-type="context" data-column-number="442" data-line-index="450,441"><span data-line-number-content="">442</span></div><div data-line-type="context" data-column-number="443" data-line-index="451,442"><span data-line-number-content="">443</span></div><div data-line-type="context" data-column-number="444" data-line-index="452,443"><span data-line-number-content="">444</span></div><div data-line-type="context" data-column-number="445" data-line-index="453,444"><span data-line-number-content="">445</span></div><div data-line-type="context" data-column-number="446" data-line-index="454,445"><span data-line-number-content="">446</span></div><div data-line-type="context" data-column-number="447" data-line-index="455,446"><span data-line-number-content="">447</span></div><div data-line-type="change-addition" data-column-number="448" data-line-index="457,447"><span data-line-number-content="">448</span></div><div data-line-type="context" data-column-number="449" data-line-index="458,448"><span data-line-number-content="">449</span></div><div data-line-type="context" data-column-number="450" data-line-index="459,449"><span data-line-number-content="">450</span></div><div data-line-type="context" data-column-number="451" data-line-index="460,450"><span data-line-number-content="">451</span></div><div data-line-type="change-addition" data-column-number="452" data-line-index="462,451"><span data-line-number-content="">452</span></div><div data-line-type="context" data-column-number="453" data-line-index="463,452"><span data-line-number-content="">453</span></div><div data-line-type="context" data-column-number="454" data-line-index="464,453"><span data-line-number-content="">454</span></div><div data-line-type="context" data-column-number="455" data-line-index="465,454"><span data-line-number-content="">455</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">1 unmodified line</span></div></div></div><div data-line-type="context" data-column-number="457" data-line-index="467,456"><span data-line-number-content="">457</span></div><div data-line-type="context" data-column-number="458" data-line-index="468,457"><span data-line-number-content="">458</span></div><div data-line-type="context" data-column-number="459" data-line-index="469,458"><span data-line-number-content="">459</span></div><div data-line-type="change-addition" data-column-number="460" data-line-index="470,459"><span data-line-number-content="">460</span></div><div data-line-type="context" data-column-number="461" data-line-index="471,460"><span data-line-number-content="">461</span></div><div data-line-type="context" data-column-number="462" data-line-index="472,461"><span data-line-number-content="">462</span></div><div data-line-type="context" data-column-number="463" data-line-index="473,462"><span data-line-number-content="">463</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">37 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="501" data-line-index="511,500"><span data-line-number-content="">501</span></div><div data-line-type="context" data-column-number="502" data-line-index="512,501"><span data-line-number-content="">502</span></div><div data-line-type="context" data-column-number="503" data-line-index="513,502"><span data-line-number-content="">503</span></div><div data-line-type="change-addition" data-column-number="504" data-line-index="514,503"><span data-line-number-content="">504</span></div><div data-line-type="change-addition" data-column-number="505" data-line-index="515,504"><span data-line-number-content="">505</span></div><div data-line-type="change-addition" data-column-number="506" data-line-index="516,505"><span data-line-number-content="">506</span></div><div data-line-type="change-addition" data-column-number="507" data-line-index="517,506"><span data-line-number-content="">507</span></div><div data-line-type="context" data-column-number="508" data-line-index="518,507"><span data-line-number-content="">508</span></div><div data-line-type="change-addition" data-column-number="509" data-line-index="520,508"><span data-line-number-content="">509</span></div><div data-line-type="context" data-column-number="510" data-line-index="521,509"><span data-line-number-content="">510</span></div><div data-line-type="change-addition" data-column-number="511" data-line-index="523,510"><span data-line-number-content="">511</span></div><div data-line-type="change-addition" data-column-number="512" data-line-index="524,511"><span data-line-number-content="">512</span></div><div data-line-type="context" data-column-number="513" data-line-index="525,512"><span data-line-number-content="">513</span></div><div data-line-type="context" data-column-number="514" data-line-index="526,513"><span data-line-number-content="">514</span></div><div data-line-type="context" data-column-number="515" data-line-index="527,514"><span data-line-number-content="">515</span></div><div data-line-type="change-addition" data-column-number="516" data-line-index="528,515"><span data-line-number-content="">516</span></div><div data-line-type="change-addition" data-column-number="517" data-line-index="529,516"><span data-line-number-content="">517</span></div><div data-line-type="change-addition" data-column-number="518" data-line-index="530,517"><span data-line-number-content="">518</span></div><div data-line-type="change-addition" data-column-number="519" data-line-index="531,518"><span data-line-number-content="">519</span></div><div data-line-type="context" data-column-number="520" data-line-index="532,519"><span data-line-number-content="">520</span></div><div data-line-type="change-addition" data-column-number="521" data-line-index="534,520"><span data-line-number-content="">521</span></div><div data-line-type="change-addition" data-column-number="522" data-line-index="535,521"><span data-line-number-content="">522</span></div><div data-line-type="context" data-column-number="523" data-line-index="536,522"><span data-line-number-content="">523</span></div><div data-line-type="context" data-column-number="524" data-line-index="537,523"><span data-line-number-content="">524</span></div><div data-line-type="context" data-column-number="525" data-line-index="538,524"><span data-line-number-content="">525</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">3 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="529" data-line-index="542,528"><span data-line-number-content="">529</span></div><div data-line-type="context" data-column-number="530" data-line-index="543,529"><span data-line-number-content="">530</span></div><div data-line-type="context" data-column-number="531" data-line-index="544,530"><span data-line-number-content="">531</span></div><div data-line-type="change-addition" data-column-number="532" data-line-index="546,531"><span data-line-number-content="">532</span></div><div data-line-type="context" data-column-number="533" data-line-index="547,532"><span data-line-number-content="">533</span></div><div data-line-type="context" data-column-number="534" data-line-index="548,533"><span data-line-number-content="">534</span></div><div data-line-type="context" data-column-number="535" data-line-index="549,534"><span data-line-number-content="">535</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">3 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="539" data-line-index="553,538"><span data-line-number-content="">539</span></div><div data-line-type="context" data-column-number="540" data-line-index="554,539"><span data-line-number-content="">540</span></div><div data-line-type="context" data-column-number="541" data-line-index="555,540"><span data-line-number-content="">541</span></div><div data-line-type="change-addition" data-column-number="542" data-line-index="556,541"><span data-line-number-content="">542</span></div><div data-line-type="change-addition" data-column-number="543" data-line-index="557,542"><span data-line-number-content="">543</span></div><div data-line-type="change-addition" data-column-number="544" data-line-index="558,543"><span data-line-number-content="">544</span></div><div data-line-type="change-addition" data-column-number="545" data-line-index="559,544"><span data-line-number-content="">545</span></div><div data-line-type="change-addition" data-column-number="546" data-line-index="560,545"><span data-line-number-content="">546</span></div><div data-line-type="change-addition" data-column-number="547" data-line-index="561,546"><span data-line-number-content="">547</span></div><div data-line-type="change-addition" data-column-number="548" data-line-index="562,547"><span data-line-number-content="">548</span></div><div data-line-type="change-addition" data-column-number="549" data-line-index="563,548"><span data-line-number-content="">549</span></div><div data-line-type="change-addition" data-column-number="550" data-line-index="564,549"><span data-line-number-content="">550</span></div><div data-line-type="change-addition" data-column-number="551" data-line-index="565,550"><span data-line-number-content="">551</span></div><div data-line-type="change-addition" data-column-number="552" data-line-index="566,551"><span data-line-number-content="">552</span></div><div data-line-type="change-addition" data-column-number="553" data-line-index="567,552"><span data-line-number-content="">553</span></div><div data-line-type="change-addition" data-column-number="554" data-line-index="568,553"><span data-line-number-content="">554</span></div><div data-line-type="change-addition" data-column-number="555" data-line-index="569,554"><span data-line-number-content="">555</span></div><div data-line-type="change-addition" data-column-number="556" data-line-index="570,555"><span data-line-number-content="">556</span></div><div data-line-type="change-addition" data-column-number="557" data-line-index="571,556"><span data-line-number-content="">557</span></div><div data-line-type="change-addition" data-column-number="558" data-line-index="572,557"><span data-line-number-content="">558</span></div><div data-line-type="change-addition" data-column-number="559" data-line-index="573,558"><span data-line-number-content="">559</span></div><div data-line-type="change-addition" data-column-number="560" data-line-index="574,559"><span data-line-number-content="">560</span></div><div data-line-type="change-addition" data-column-number="561" data-line-index="575,560"><span data-line-number-content="">561</span></div><div data-line-type="change-addition" data-column-number="562" data-line-index="576,561"><span data-line-number-content="">562</span></div><div data-line-type="context" data-column-number="563" data-line-index="577,562"><span data-line-number-content="">563</span></div><div data-line-type="context" data-column-number="564" data-line-index="578,563"><span data-line-number-content="">564</span></div><div data-line-type="context" data-column-number="565" data-line-index="579,564"><span data-line-number-content="">565</span></div></div><div data-content="" style="grid-row: span 286"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">72 unmodified lines</span></div></div></div><div data-line="73" data-alt-line="73" data-line-type="context" data-line-index="72,72"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="74" data-alt-line="74" data-line-type="context" data-line-index="73,73"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="75" data-alt-line="75" data-line-type="context" data-line-index="74,74">
</div><div data-line="76" data-line-type="change-addition" data-line-index="75,75"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cachedByteCount: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="77" data-line-type="change-addition" data-line-index="76,76"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> lock.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">withLock</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="78" data-line-type="change-addition" data-line-index="77,77"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segments.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">reduce</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> $0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> +</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">$1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">data</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.count</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="79" data-line-type="change-addition" data-line-index="78,78"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="80" data-line-type="change-addition" data-line-index="79,79"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="81" data-line-type="change-addition" data-line-index="80,80">
</div><div data-line="82" data-alt-line="76" data-line-type="context" data-line-index="81,81"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: Data, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">at</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> start</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="83" data-alt-line="77" data-line-type="context" data-line-index="82,82"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">data.isEmpty </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="84" data-alt-line="78" data-line-type="context" data-line-index="83,83"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">38 unmodified lines</span></div></div></div><div data-line="123" data-alt-line="117" data-line-type="context" data-line-index="122,122"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="124" data-alt-line="118" data-line-type="context" data-line-index="123,123"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="125" data-alt-line="119" data-line-type="context" data-line-index="124,124">
</div><div data-line="126" data-line-type="change-addition" data-line-index="125,125"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> missingRanges</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">in</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> range</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> [</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="127" data-line-type="change-addition" data-line-index="126,126"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> lock.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">withLock</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="128" data-line-type="change-addition" data-line-index="127,127"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> range.start</span></div><div data-line="129" data-line-type="change-addition" data-line-index="128,128"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missing: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div><div data-line="130" data-line-type="change-addition" data-line-index="129,129">
</div><div data-line="131" data-line-type="change-addition" data-line-index="130,130"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> for</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segment </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segments </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">where</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segment.range.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">>=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="132" data-line-type="change-addition" data-line-index="131,131"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segment.range.start </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">&#x3C;=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> range.end </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="133" data-line-type="change-addition" data-line-index="132,132"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> break</span></div><div data-line="134" data-line-type="change-addition" data-line-index="133,133"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="135" data-line-type="change-addition" data-line-index="134,134"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segment.range.start </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="136" data-line-type="change-addition" data-line-index="135,135"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missing.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">append</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cursor, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range.end, segment.range.start </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)))</span></div><div data-line="137" data-line-type="change-addition" data-line-index="136,136"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="138" data-line-type="change-addition" data-line-index="137,137"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segment.range.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">>=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="139" data-line-type="change-addition" data-line-index="138,138"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">cursor, segment.range.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="140" data-line-type="change-addition" data-line-index="139,139"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="141" data-line-type="change-addition" data-line-index="140,140"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> range.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="142" data-line-type="change-addition" data-line-index="141,141"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> break</span></div><div data-line="143" data-line-type="change-addition" data-line-index="142,142"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="144" data-line-type="change-addition" data-line-index="143,143"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="145" data-line-type="change-addition" data-line-index="144,144">
</div><div data-line="146" data-line-type="change-addition" data-line-index="145,145"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">&#x3C;=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> range.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="147" data-line-type="change-addition" data-line-index="146,146"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missing.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">append</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cursor, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range.end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="148" data-line-type="change-addition" data-line-index="147,147"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="149" data-line-type="change-addition" data-line-index="148,148"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missing</span></div><div data-line="150" data-line-type="change-addition" data-line-index="149,149"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="151" data-line-type="change-addition" data-line-index="150,150"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="152" data-line-type="change-addition" data-line-index="151,151">
</div><div data-line="153" data-alt-line="120" data-line-type="context" data-line-index="152,152"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> evict</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">keeping</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> window</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="154" data-alt-line="121" data-line-type="context" data-line-index="153,153"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> lock.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">withLock</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="155" data-alt-line="122" data-line-type="context" data-line-index="154,154"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segments </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segments.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">compactMap</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segment </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">12 unmodified lines</span></div></div></div><div data-line="168" data-alt-line="135" data-line-type="context" data-line-index="167,167"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="169" data-alt-line="136" data-line-type="context" data-line-index="168,168"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="170" data-alt-line="137" data-line-type="context" data-line-index="169,169">
</div><div data-line="171" data-line-type="change-addition" data-line-index="170,170"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> evict</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">toByteBudget</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> byteBudget</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">preserving</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> protectedRanges</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">])</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> [</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="172" data-line-type="change-addition" data-line-index="171,171"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> lock.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">withLock</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="173" data-line-type="change-addition" data-line-index="172,172"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> byteBudget </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">></span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="174" data-line-type="change-addition" data-line-index="173,173"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> evicted </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segments.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">map</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">\.range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="175" data-line-type="change-addition" data-line-index="174,174"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segments.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">removeAll</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="176" data-line-type="change-addition" data-line-index="175,175"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> evicted</span></div><div data-line="177" data-line-type="change-addition" data-line-index="176,176"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="178" data-line-type="change-addition" data-line-index="177,177">
</div><div data-line="179" data-line-type="change-addition" data-line-index="178,178"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> totalBytes </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segments.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">reduce</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> $0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> +</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">$1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">data</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.count</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="180" data-line-type="change-addition" data-line-index="179,179"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> totalBytes </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> byteBudget </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="181" data-line-type="change-addition" data-line-index="180,180"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> []</span></div><div data-line="182" data-line-type="change-addition" data-line-index="181,181"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="183" data-line-type="change-addition" data-line-index="182,182">
</div><div data-line="184" data-line-type="change-addition" data-line-index="183,183"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> evicted: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div><div data-line="185" data-line-type="change-addition" data-line-index="184,184"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> while</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> totalBytes </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> byteBudget,</span></div><div data-line="186" data-line-type="change-addition" data-line-index="185,185"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> index </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> evictionCandidateIndex</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">protectedRanges</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> protectedRanges</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="187" data-line-type="change-addition" data-line-index="186,186"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> removed </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segments.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">remove</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> index</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="188" data-line-type="change-addition" data-line-index="187,187"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> totalBytes </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-=</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">removed.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">data</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.count</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="189" data-line-type="change-addition" data-line-index="188,188"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> evicted.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">append</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">removed.range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="190" data-line-type="change-addition" data-line-index="189,189"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="191" data-line-type="change-addition" data-line-index="190,190"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> evicted</span></div><div data-line="192" data-line-type="change-addition" data-line-index="191,191"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="193" data-line-type="change-addition" data-line-index="192,192"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="194" data-line-type="change-addition" data-line-index="193,193">
</div><div data-line="195" data-line-type="change-addition" data-line-index="194,194"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> evictionCandidateIndex</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">protectedRanges</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">])</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Int</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="196" data-line-type="change-addition" data-line-index="195,195"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bestIndex: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></div><div data-line="197" data-line-type="change-addition" data-line-index="196,196"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bestDistance: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> .min</span></div><div data-line="198" data-line-type="change-addition" data-line-index="197,197">
</div><div data-line="199" data-line-type="change-addition" data-line-index="198,198"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> (</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">index, segment</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> in</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segments.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">enumerated</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="200" data-line-type="change-addition" data-line-index="199,199"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> protectedRanges.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">where</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> $0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.overlapsOrTouches</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">segment.range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> })</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="201" data-line-type="change-addition" data-line-index="200,200"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> continue</span></div><div data-line="202" data-line-type="change-addition" data-line-index="201,201"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="203" data-line-type="change-addition" data-line-index="202,202">
</div><div data-line="204" data-line-type="change-addition" data-line-index="203,203"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> distance </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> protectedRanges</span></div><div data-line="205" data-line-type="change-addition" data-line-index="204,204"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> .</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">map</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> rangeDistance</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">from</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> segment.range, to</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> $0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="206" data-line-type="change-addition" data-line-index="205,205"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> .</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ??</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> segment.range.start</span></div><div data-line="207" data-line-type="change-addition" data-line-index="206,206"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> distance </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bestDistance </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="208" data-line-type="change-addition" data-line-index="207,207"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bestDistance </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> distance</span></div><div data-line="209" data-line-type="change-addition" data-line-index="208,208"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bestIndex </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> index</span></div><div data-line="210" data-line-type="change-addition" data-line-index="209,209"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="211" data-line-type="change-addition" data-line-index="210,210"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="212" data-line-type="change-addition" data-line-index="211,211">
</div><div data-line="213" data-line-type="change-addition" data-line-index="212,212"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bestIndex</span></div><div data-line="214" data-line-type="change-addition" data-line-index="213,213"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="215" data-line-type="change-addition" data-line-index="214,214">
</div><div data-line="216" data-line-type="change-addition" data-line-index="215,215"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> rangeDistance</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">from</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> range</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">to</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> protectedRange</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="217" data-line-type="change-addition" data-line-index="216,216"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> range.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">overlapsOrTouches</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">protectedRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="218" data-line-type="change-addition" data-line-index="217,217"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span></div><div data-line="219" data-line-type="change-addition" data-line-index="218,218"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="220" data-line-type="change-addition" data-line-index="219,219"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> range.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">&#x3C;</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> protectedRange.start </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="221" data-line-type="change-addition" data-line-index="220,220"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> protectedRange.start </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> range.end</span></div><div data-line="222" data-line-type="change-addition" data-line-index="221,221"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="223" data-line-type="change-addition" data-line-index="222,222"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> range.start </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> protectedRange.end</span></div><div data-line="224" data-line-type="change-addition" data-line-index="223,223"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="225" data-line-type="change-addition" data-line-index="224,224">
</div><div data-line="226" data-alt-line="138" data-line-type="context" data-line-index="225,225"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> mergeSegments</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="227" data-alt-line="139" data-line-type="context" data-line-index="226,226"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">segments.isEmpty </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="228" data-alt-line="140" data-line-type="context" data-line-index="227,227"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">116 unmodified lines</span></div></div></div><div data-line="345" data-alt-line="257" data-line-type="context" data-line-index="344,344"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> durationProvider: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> TimeInterval</span></div><div data-line="346" data-alt-line="258" data-line-type="context" data-line-index="345,345"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchChunkSize: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1_048_576</span></div><div data-line="347" data-alt-line="259" data-line-type="context" data-line-index="346,346"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> responseChunkSize: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1_048_576</span></div><div data-line="348" data-line-type="change-addition" data-line-index="347,347"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> seekPrimeBehindBytes: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 4</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> *</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1_048_576</span></div><div data-line="349" data-line-type="change-addition" data-line-index="348,348"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cacheByteBudget: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span></div><div data-line="350" data-alt-line="260" data-line-type="context" data-line-index="349,349"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchTask: Task</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">&#x3C;</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Void</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, Never</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">>?</span></div><div data-line="351" data-alt-line="261" data-line-type="context" data-line-index="350,350"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchWindow: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></div><div data-line="352" data-alt-line="262" data-line-type="context" data-line-index="351,351"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchPreferredOffset: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></div><div data-line="353" data-line-type="change-addition" data-line-index="354,352"><span data-diff-span=""><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> recentSeekRange: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></span></div><div data-line="354" data-line-type="change-addition" data-line-index="355,353"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> recentForegroundRange</span></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></span></div><div data-line="355" data-line-type="change-addition" data-line-index="356,354">
</div><div data-line="356" data-line-type="change-addition" data-line-index="357,355"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> init</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="357" data-line-type="change-addition" data-line-index="358,356"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> fetcher</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPRangeRemoteFetcher,</span></div><div data-line="358" data-line-type="change-addition" data-line-index="359,357"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> contentLength</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">,</span></div><div data-line="359" data-line-type="change-addition" data-line-index="360,358"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> durationProvider</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">@</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">escaping</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> TimeInterval,</span></div><div data-line="360" data-line-type="change-addition" data-line-index="361,359"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cacheByteBudget</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#08C0EF;--diffs-token-light:#08C0EF"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> *</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1_048_576</span></div><div data-line="361" data-line-type="change-addition" data-line-index="362,360"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="362" data-alt-line="265" data-line-type="context" data-line-index="363,361"><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">fetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> fetcher</span></div><div data-line="363" data-alt-line="266" data-line-type="context" data-line-index="364,362"><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">contentLength</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> contentLength</span></div><div data-line="364" data-alt-line="267" data-line-type="context" data-line-index="365,363"><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">durationProvider</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> durationProvider</span></div><div data-line="365" data-line-type="change-addition" data-line-index="366,364"><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">cacheByteBudget</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cacheByteBudget</span></div><div data-line="366" data-alt-line="268" data-line-type="context" data-line-index="367,365"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="367" data-alt-line="269" data-line-type="context" data-line-index="368,366">
</div><div data-line="368" data-alt-line="270" data-line-type="context" data-line-index="369,367"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> deinit</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">2 unmodified lines</span></div></div></div><div data-line="371" data-alt-line="273" data-line-type="context" data-line-index="372,370">
</div><div data-line="372" data-alt-line="274" data-line-type="context" data-line-index="373,371"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> requestedRange</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> async</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> throws</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> Data </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="373" data-alt-line="275" data-line-type="context" data-line-index="374,372"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bounded </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> clamp</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">requestedRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="374" data-line-type="change-addition" data-line-index="375,373"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> recentForegroundRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bounded</span></div><div data-line="375" data-alt-line="276" data-line-type="context" data-line-index="376,374"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="376" data-alt-line="277" data-line-type="context" data-line-index="377,375"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="377" data-alt-line="278" data-line-type="context" data-line-index="378,376"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioRangeCache] cache=hit range=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">bounded.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">bounded.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">1 unmodified line</span></div></div></div><div data-line="379" data-alt-line="280" data-line-type="context" data-line-index="380,378"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data</span></div><div data-line="380" data-alt-line="281" data-line-type="context" data-line-index="381,379"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="381" data-alt-line="282" data-line-type="context" data-line-index="382,380">
</div><div data-line="382" data-line-type="change-addition" data-line-index="383,381"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missingRanges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">missingRanges</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">in</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="383" data-alt-line="283" data-line-type="context" data-line-index="384,382"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="384" data-line-type="change-addition" data-line-index="386,383"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missKind </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missingRanges.count </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">==</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> &#x26;&#x26;</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missingRanges</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ==</span><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">bounded</span><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "uncached"</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> :</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "partial-miss"</span></span></div><div data-line="385" data-line-type="change-addition" data-line-index="387,384"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioRangeCache] cache=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">missKind</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> range=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">bounded.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">bounded.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> missing=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">missingRanges.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">map</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">$0</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">$0</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">joined</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">separator</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> ","</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="386" data-alt-line="285" data-line-type="context" data-line-index="388,385"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-line="387" data-alt-line="286" data-line-type="context" data-line-index="389,386"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cancelPrefetchIfNeeded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">forForegroundRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="388" data-line-type="change-addition" data-line-index="392,387"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">for</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missingRange </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missingRanges </span></span><span data-diff-span=""><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></span></div><div data-line="389" data-line-type="change-addition" data-line-index="393,388"><span data-diff-span=""><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data </span><span data-diff-span=""><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> fetcher.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">fetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> missingRange</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="390" data-line-type="change-addition" data-line-index="394,389"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data, at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> missingRange.start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="391" data-line-type="change-addition" data-line-index="395,390"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="392" data-alt-line="289" data-line-type="context" data-line-index="396,391"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, forceRestart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="393" data-line-type="change-addition" data-line-index="398,392"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ??</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> </span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">Data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></span></div><div data-line="394" data-alt-line="291" data-line-type="context" data-line-index="399,393"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="395" data-alt-line="292" data-line-type="context" data-line-index="400,394">
</div><div data-line="396" data-alt-line="293" data-line-type="context" data-line-index="401,395"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> responseRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> requestedRange</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> HTTPByteRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">5 unmodified lines</span></div></div></div><div data-line="402" data-alt-line="299" data-line-type="context" data-line-index="407,401"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="403" data-alt-line="300" data-line-type="context" data-line-index="408,402">
</div><div data-line="404" data-alt-line="301" data-line-type="context" data-line-index="409,403"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="405" data-line-type="change-addition" data-line-index="411,404"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset, forceRestart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> false</span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, startsAtWindowStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> false</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="406" data-line-type="change-addition" data-line-index="412,405"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="407" data-line-type="change-addition" data-line-index="413,406">
</div><div data-line="408" data-line-type="change-addition" data-line-index="414,407"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchForSeek</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="409" data-line-type="change-addition" data-line-index="415,408"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> window </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> seekPrimeWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="410" data-line-type="change-addition" data-line-index="416,409"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> recentSeekRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> window</span></div><div data-line="411" data-line-type="change-addition" data-line-index="417,410"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="412" data-line-type="change-addition" data-line-index="418,411"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset,</span></div><div data-line="413" data-line-type="change-addition" data-line-index="419,412"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> forceRestart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="414" data-line-type="change-addition" data-line-index="420,413"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> explicitWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> window,</span></div><div data-line="415" data-line-type="change-addition" data-line-index="421,414"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> startsAtWindowStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span></div><div data-line="416" data-line-type="change-addition" data-line-index="422,415"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span></div><div data-line="417" data-line-type="change-addition" data-line-index="423,416"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="418" data-line-type="change-addition" data-line-index="424,417">
</div><div data-line="419" data-line-type="change-addition" data-line-index="425,418"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> seekPrimeWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> HTTPByteRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="420" data-line-type="change-addition" data-line-index="426,419"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset, minimumBehind</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> seekPrimeBehindBytes</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="421" data-alt-line="303" data-line-type="context" data-line-index="427,420"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="422" data-alt-line="304" data-line-type="context" data-line-index="428,421">
</div><div data-line="423" data-alt-line="305" data-line-type="context" data-line-index="429,422"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">forceRestart</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Bool</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="424" data-line-type="change-addition" data-line-index="430,423"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset, forceRestart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> forceRestart, startsAtWindowStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> false</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="425" data-line-type="change-addition" data-line-index="431,424"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="426" data-line-type="change-addition" data-line-index="432,425">
</div><div data-line="427" data-line-type="change-addition" data-line-index="433,426"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="428" data-line-type="change-addition" data-line-index="434,427"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">,</span></div><div data-line="429" data-line-type="change-addition" data-line-index="435,428"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> forceRestart</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Bool</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">,</span></div><div data-line="430" data-line-type="change-addition" data-line-index="436,429"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> explicitWindow</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#08C0EF;--diffs-token-light:#08C0EF"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">,</span></div><div data-line="431" data-line-type="change-addition" data-line-index="437,430"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> startsAtWindowStart</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Bool</span></div><div data-line="432" data-line-type="change-addition" data-line-index="438,431"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="433" data-alt-line="306" data-line-type="context" data-line-index="439,432"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">forceRestart, activePrefetchWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">offset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ==</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, prefetchTask</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.isCancelled </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">==</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> false</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="434" data-alt-line="307" data-line-type="context" data-line-index="440,433"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="435" data-alt-line="308" data-line-type="context" data-line-index="441,434"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="436" data-alt-line="309" data-line-type="context" data-line-index="442,435">
</div><div data-line="437" data-alt-line="310" data-line-type="context" data-line-index="443,436"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchTask</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">cancel</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="438" data-line-type="change-addition" data-line-index="445,437"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> window </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">explicitWindow </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">??</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> </span></span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="439" data-alt-line="312" data-line-type="context" data-line-index="446,438"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchWindow </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> window</span></div><div data-line="440" data-alt-line="313" data-line-type="context" data-line-index="447,439"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchPreferredOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> offset</span></div><div data-line="441" data-line-type="change-addition" data-line-index="449,440"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> </span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">evictOverBudget</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">protecting</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> window</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="442" data-alt-line="315" data-line-type="context" data-line-index="450,441"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">hasData</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> window</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="443" data-alt-line="316" data-line-type="context" data-line-index="451,442"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchWindow </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="444" data-alt-line="317" data-line-type="context" data-line-index="452,443"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchPreferredOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="445" data-alt-line="318" data-line-type="context" data-line-index="453,444"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="446" data-alt-line="319" data-line-type="context" data-line-index="454,445"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="447" data-alt-line="320" data-line-type="context" data-line-index="455,446">
</div><div data-line="448" data-line-type="change-addition" data-line-index="457,447"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchTask </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> Task</span><span data-diff-span=""><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">priority</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> startsAtWindowStart </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> .</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">userInitiated</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> :</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> .</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">utility</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> </span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> [</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">weak</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">] </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span></div><div data-line="449" data-alt-line="322" data-line-type="context" data-line-index="458,448"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="450" data-alt-line="323" data-line-type="context" data-line-index="459,449"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="451" data-alt-line="324" data-line-type="context" data-line-index="460,450"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="452" data-line-type="change-addition" data-line-index="462,451"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> for</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunk </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">prefetchChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">in</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> window, preferredOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset</span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, startsAtWindowStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> startsAtWindowStart</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="453" data-alt-line="326" data-line-type="context" data-line-index="463,452"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">Task.isCancelled </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="454" data-alt-line="327" data-line-type="context" data-line-index="464,453"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="455" data-alt-line="328" data-line-type="context" data-line-index="465,454"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">1 unmodified line</span></div></div></div><div data-line="457" data-alt-line="330" data-line-type="context" data-line-index="467,456"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> do</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="458" data-alt-line="331" data-line-type="context" data-line-index="468,457"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> fetcher.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">fetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> chunk</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="459" data-alt-line="332" data-line-type="context" data-line-index="469,458"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data, at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> chunk.start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="460" data-line-type="change-addition" data-line-index="470,459"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> evictOverBudget</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">protecting</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> window</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="461" data-alt-line="333" data-line-type="context" data-line-index="471,460"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="462" data-alt-line="334" data-line-type="context" data-line-index="472,461"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioRangeCache] fetched range=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">chunk.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">chunk.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> bytes=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">data.count</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="463" data-alt-line="335" data-line-type="context" data-line-index="473,462"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">37 unmodified lines</span></div></div></div><div data-line="501" data-alt-line="373" data-line-type="context" data-line-index="511,500"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="502" data-alt-line="374" data-line-type="context" data-line-index="512,501">
</div><div data-line="503" data-alt-line="375" data-line-type="context" data-line-index="513,502"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> HTTPByteRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="504" data-line-type="change-addition" data-line-index="514,503"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset, minimumBehind</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunkSize</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="505" data-line-type="change-addition" data-line-index="515,504"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="506" data-line-type="change-addition" data-line-index="516,505">
</div><div data-line="507" data-line-type="change-addition" data-line-index="517,506"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">minimumBehind</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> HTTPByteRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="508" data-alt-line="376" data-line-type="context" data-line-index="518,507"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bytesPerSecond </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> estimatedBytesPerSecond</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="509" data-line-type="change-addition" data-line-index="520,508"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> behind </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">minimumBehind</span></span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, bytesPerSecond </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">*</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 30</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="510" data-alt-line="378" data-line-type="context" data-line-index="521,509"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> ahead </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">prefetchChunkSize </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">*</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 2</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, bytesPerSecond </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">*</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 60</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="511" data-line-type="change-addition" data-line-index="523,510"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> raw </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> </span></span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">clamp</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> behind, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> ahead</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="512" data-line-type="change-addition" data-line-index="524,511"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> alignedChunkStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> raw.start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> alignedChunkEnd</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> raw.end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="513" data-alt-line="380" data-line-type="context" data-line-index="525,512"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="514" data-alt-line="381" data-line-type="context" data-line-index="526,513">
</div><div data-line="515" data-alt-line="382" data-line-type="context" data-line-index="527,514"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">in</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> window</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">preferredOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> [</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="516" data-line-type="change-addition" data-line-index="528,515"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">in</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> window, preferredOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset, startsAtWindowStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> false</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="517" data-line-type="change-addition" data-line-index="529,516"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="518" data-line-type="change-addition" data-line-index="530,517">
</div><div data-line="519" data-line-type="change-addition" data-line-index="531,518"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">in</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> window</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">preferredOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">startsAtWindowStart</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Bool</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> [</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="520" data-alt-line="383" data-line-type="context" data-line-index="532,519"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> boundedOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">window.start, min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">window.end, offset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="521" data-line-type="change-addition" data-line-index="534,520"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">windowStart</span></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> </span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">alignedChunkStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> </span></span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">window.start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="522" data-line-type="change-addition" data-line-index="535,521"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> preferredStart </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> startsAtWindowStart </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> windowStart </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> alignedChunkStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> boundedOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="523" data-alt-line="385" data-line-type="context" data-line-index="536,522"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div><div data-line="524" data-alt-line="386" data-line-type="context" data-line-index="537,523">
</div><div data-line="525" data-alt-line="387" data-line-type="context" data-line-index="538,524"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> preferredStart</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">3 unmodified lines</span></div></div></div><div data-line="529" data-alt-line="391" data-line-type="context" data-line-index="542,528"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunk.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span></div><div data-line="530" data-alt-line="392" data-line-type="context" data-line-index="543,529"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="531" data-alt-line="393" data-line-type="context" data-line-index="544,530">
</div><div data-line="532" data-line-type="change-addition" data-line-index="546,531"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">windowStart</span></span></div><div data-line="533" data-alt-line="395" data-line-type="context" data-line-index="547,532"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> while</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">&#x3C;</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> preferredStart </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="534" data-alt-line="396" data-line-type="context" data-line-index="548,533"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunk </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cursor, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">preferredStart </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunkSize </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="535" data-alt-line="397" data-line-type="context" data-line-index="549,534"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">append</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">chunk</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">3 unmodified lines</span></div></div></div><div data-line="539" data-alt-line="401" data-line-type="context" data-line-index="553,538"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks</span></div><div data-line="540" data-alt-line="402" data-line-type="context" data-line-index="554,539"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="541" data-alt-line="403" data-line-type="context" data-line-index="555,540">
</div><div data-line="542" data-line-type="change-addition" data-line-index="556,541"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> evictOverBudget</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">protecting</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> range</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="543" data-line-type="change-addition" data-line-index="557,542"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> headerRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contentLength </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, prefetchChunkSize </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="544" data-line-type="change-addition" data-line-index="558,543"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> tailStart </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, contentLength </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> (</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">4</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> *</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunkSize</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="545" data-line-type="change-addition" data-line-index="559,544"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> tailRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> tailStart, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> contentLength </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="546" data-line-type="change-addition" data-line-index="560,545"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> protectedRanges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> [range, recentSeekRange, recentForegroundRange, activePrefetchWindow, headerRange, tailRange].</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">compactMap</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> $0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="547" data-line-type="change-addition" data-line-index="561,546"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> evicted </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">evict</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">toByteBudget</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cacheByteBudget, preserving</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> protectedRanges</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="548" data-line-type="change-addition" data-line-index="562,547"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="549" data-line-type="change-addition" data-line-index="563,548"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">evicted.isEmpty </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="550" data-line-type="change-addition" data-line-index="564,549"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioRangeCache] evicted reason=budget ranges=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">evicted.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">map</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">$0</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">$0</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">joined</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">separator</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> ","</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> protected=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">protectedRanges.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">map</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">$0</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">$0</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">joined</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">separator</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> ","</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="551" data-line-type="change-addition" data-line-index="565,550"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="552" data-line-type="change-addition" data-line-index="566,551"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-line="553" data-line-type="change-addition" data-line-index="567,552"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="554" data-line-type="change-addition" data-line-index="568,553">
</div><div data-line="555" data-line-type="change-addition" data-line-index="569,554"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> alignedChunkStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="556" data-line-type="change-addition" data-line-index="570,555"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">offset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">/</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunkSize</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> *</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunkSize</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="557" data-line-type="change-addition" data-line-index="571,556"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="558" data-line-type="change-addition" data-line-index="572,557">
</div><div data-line="559" data-line-type="change-addition" data-line-index="573,558"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> alignedChunkEnd</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="560" data-line-type="change-addition" data-line-index="574,559"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contentLength </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, alignedChunkStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> +</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunkSize </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="561" data-line-type="change-addition" data-line-index="575,560"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="562" data-line-type="change-addition" data-line-index="576,561">
</div><div data-line="563" data-alt-line="404" data-line-type="context" data-line-index="577,562"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> estimatedBytesPerSecond</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="564" data-alt-line="405" data-line-type="context" data-line-index="578,563"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> duration </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> durationProvider</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="565" data-alt-line="406" data-line-type="context" data-line-index="579,564"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> duration </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">></span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div></div></code></pre></section><section class="diff-file"><h3>Dreamio/VLCNativePlaybackBackend.swift</h3><svg data-icon-sprite aria-hidden="true" width="0" height="0">
<symbol id="diffs-icon-arrow-right-short" viewBox="0 0 16 16">
<path d="M8.47 4.22a.75.75 0 0 0 0 1.06l1.97 1.97H3.75a.75.75 0 0 0 0 1.5h6.69l-1.97 1.97a.75.75 0 1 0 1.06 1.06l3.25-3.25a.75.75 0 0 0 0-1.06L9.53 4.22a.75.75 0 0 0-1.06 0"/>
</symbol>
<symbol id="diffs-icon-brand-github" viewBox="0 0 16 16">
<path d="M8 0c4.42 0 8 3.58 8 8a8.01 8.01 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27s-1.36.09-2 .27c-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8"/>
</symbol>
<symbol id="diffs-icon-chevron" viewBox="0 0 16 16">
<path d="M1.47 4.47a.75.75 0 0 1 1.06 0L8 9.94l5.47-5.47a.75.75 0 1 1 1.06 1.06l-6 6a.75.75 0 0 1-1.06 0l-6-6a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-chevrons-narrow" viewBox="0 0 10 16">
<path d="M4.47 2.22a.75.75 0 0 1 1.06 0l3.25 3.25a.75.75 0 0 1-1.06 1.06L5 3.81 2.28 6.53a.75.75 0 0 1-1.06-1.06zM1.22 9.47a.75.75 0 0 1 1.06 0L5 12.19l2.72-2.72a.75.75 0 0 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0l-3.25-3.25a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-diff-split" viewBox="0 0 16 16">
<path d="M14 0H8.5v16H14a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2m-1.5 6.5v1h1a.5.5 0 0 1 0 1h-1v1a.5.5 0 0 1-1 0v-1h-1a.5.5 0 0 1 0-1h1v-1a.5.5 0 0 1 1 0"/><path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h5.5V0zm.5 7.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1 0-1" opacity=".3"/>
</symbol>
<symbol id="diffs-icon-diff-unified" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M16 14a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V8.5h16zm-8-4a.5.5 0 0 0-.5.5v1h-1a.5.5 0 0 0 0 1h1v1a.5.5 0 0 0 1 0v-1h1a.5.5 0 0 0 0-1h-1v-1A.5.5 0 0 0 8 10" clip-rule="evenodd"/><path fill-rule="evenodd" d="M14 0a2 2 0 0 1 2 2v5.5H0V2a2 2 0 0 1 2-2zM6.5 3.5a.5.5 0 0 0 0 1h3a.5.5 0 0 0 0-1z" clip-rule="evenodd" opacity=".4"/>
</symbol>
<symbol id="diffs-icon-expand" viewBox="0 0 16 16">
<path d="M3.47 5.47a.75.75 0 0 1 1.06 0L8 8.94l3.47-3.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-expand-all" viewBox="0 0 16 16">
<path d="M11.47 9.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 1 1 1.06-1.06L8 12.94zM7.526 1.418a.75.75 0 0 1 1.004.052l4 4a.75.75 0 1 1-1.06 1.06L8 3.06 4.53 6.53a.75.75 0 1 1-1.06-1.06l4-4z"/>
</symbol>
<symbol id="diffs-icon-file-code" viewBox="0 0 16 16">
<path d="M10.75 0c.199 0 .39.08.53.22l3.5 3.5c.14.14.22.331.22.53v9A2.75 2.75 0 0 1 12.25 16h-8.5A2.75 2.75 0 0 1 1 13.25V2.75A2.75 2.75 0 0 1 3.75 0zm-7 1.5c-.69 0-1.25.56-1.25 1.25v10.5c0 .69.56 1.25 1.25 1.25h8.5c.69 0 1.25-.56 1.25-1.25V5h-1.25A2.25 2.25 0 0 1 10 2.75V1.5z"/><path d="M7.248 6.19a.75.75 0 0 1 .063 1.058L5.753 9l1.558 1.752a.75.75 0 0 1-1.122.996l-2-2.25a.75.75 0 0 1 0-.996l2-2.25a.75.75 0 0 1 1.06-.063M8.69 7.248a.75.75 0 1 1 1.12-.996l2 2.25a.75.75 0 0 1 0 .996l-2 2.25a.75.75 0 1 1-1.12-.996L10.245 9z"/>
</symbol>
<symbol id="diffs-icon-plus" viewBox="0 0 16 16">
<path d="M8 3a.75.75 0 0 1 .75.75v3.5h3.5a.75.75 0 0 1 0 1.5h-3.5v3.5a.75.75 0 0 1-1.5 0v-3.5h-3.5a.75.75 0 0 1 0-1.5h3.5v-3.5A.75.75 0 0 1 8 3"/>
</symbol>
<symbol id="diffs-icon-symbol-added" viewBox="0 0 16 16">
<path d="M8 4a.75.75 0 0 1 .75.75v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5A.75.75 0 0 1 8 4"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
</symbol>
<symbol id="diffs-icon-symbol-deleted" viewBox="0 0 16 16">
<path d="M4 8a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5A.75.75 0 0 1 4 8"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
</symbol>
<symbol id="diffs-icon-symbol-diffstat" viewBox="0 0 16 16">
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.75 4.296a.75.75 0 0 0-1.5 0V6.25h-2a.75.75 0 0 0 0 1.5h2v1.5h1.5v-1.5h2a.75.75 0 0 0 0-1.5h-2zM5.25 10a.75.75 0 0 0 0 1.5h5.5a.75.75 0 0 0 0-1.5z"/>
</symbol>
<symbol id="diffs-icon-symbol-ignored" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m11.53-2.47a.75.75 0 0 0-1.06-1.06l-6 6a.75.75 0 1 0 1.06 1.06z"/>
</symbol>
<symbol id="diffs-icon-symbol-modified" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m8 3a3 3 0 1 0 0-6 3 3 0 0 0 0 6"/>
</symbol>
<symbol id="diffs-icon-symbol-moved" viewBox="0 0 16 16">
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.495 4.695a.75.75 0 0 0-.05 1.06L10.486 8l-2.041 2.246a.75.75 0 0 0 1.11 1.008l2.5-2.75a.75.75 0 0 0 0-1.008l-2.5-2.75a.75.75 0 0 0-1.06-.051m-4 0a.75.75 0 0 0-.05 1.06l2.044 2.248-1.796 1.995a.75.75 0 0 0 1.114 1.004l2.25-2.5a.75.75 0 0 0-.002-1.007l-2.5-2.75a.75.75 0 0 0-1.06-.05"/>
</symbol>
<symbol id="diffs-icon-symbol-ref" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706.286.286.71.54 1.41.73V1.86c-.7.19-1.124.444-1.41.73-.324.325-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8m4 6.397c.697.07 1.522.103 2.5.103 1.613 0 2.806-.088 3.704-.288.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5c-.978 0-1.803.033-2.5.103zM0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m7-2a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1z"/>
</symbol>
</svg><style data-core-css="">@layer base, theme, rendered, unsafe;
@layer base,theme,rendered,unsafe;@layer base{:host{--diffs-font-fallback:"SF Mono", Monaco, Consolas, "Ubuntu Mono", "Liberation Mono", "Courier New", monospace;--diffs-header-font-fallback:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif;--diffs-mixer:light-dark(#000,#fff);--diffs-gap-fallback:8px;--diffs-scrollbar-gutter-fallback:6px;--diffs-scrollbar-gutter:var(--diffs-scrollbar-gutter-override,var(--diffs-scrollbar-gutter-measured,var(--diffs-scrollbar-gutter-fallback)));--diffs-added-light:#0dbe4e;--diffs-added-dark:#5ecc71;--diffs-modified-light:#009fff;--diffs-modified-dark:#69b1ff;--diffs-deleted-light:#ff2e3f;--diffs-deleted-dark:#ff6762;color-scheme:light dark;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);font-feature-settings:var(--diffs-font-features);--diffs-bg:light-dark(var(--diffs-light-bg,#fff),var(--diffs-dark-bg,#000));--diffs-bg-buffer:var(--diffs-bg-buffer-override,light-dark(color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer))));--diffs-bg-context:var(--diffs-bg-context-override,light-dark(color-mix(in lab, var(--diffs-bg) 98.5%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92.5%, var(--diffs-mixer))));--diffs-bg-context-gutter:var(--diffs-bg-context-gutter-override,light-dark(color-mix(in lab, var(--diffs-bg-context) 90%, var(--diffs-bg)),color-mix(in lab, var(--diffs-bg-context) 45%, var(--diffs-bg))));--diffs-bg-separator:var(--diffs-bg-separator-override,light-dark(color-mix(in lab, var(--diffs-bg) 96%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-mixer))));--diffs-fg:light-dark(var(--diffs-light,#000),var(--diffs-dark,#fff));--diffs-fg-number:var(--diffs-fg-number-override,light-dark(color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg)),color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg))));--diffs-fg-conflict-marker:var(--diffs-fg-conflict-marker-override,var(--diffs-fg-number));--diffs-deletion-base:var(--diffs-deletion-color-override,light-dark(var(--diffs-light-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-light))),var(--diffs-dark-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-dark)))));--diffs-addition-base:var(--diffs-addition-color-override,light-dark(var(--diffs-light-addition-color,var(--diffs-addition-color,var(--diffs-added-light))),var(--diffs-dark-addition-color,var(--diffs-addition-color,var(--diffs-added-dark)))));--diffs-modified-base:var(--diffs-modified-color-override,light-dark(var(--diffs-light-modified-color,var(--diffs-modified-color,var(--diffs-modified-light))),var(--diffs-dark-modified-color,var(--diffs-modified-color,var(--diffs-modified-dark)))));--diffs-bg-deletion:var(--diffs-bg-deletion-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-deletion-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base))));--diffs-bg-deletion-emphasis:var(--diffs-bg-deletion-emphasis-override,light-dark(rgb(from var(--diffs-deletion-base) r g b / .15),rgb(from var(--diffs-deletion-base) r g b / .2)));--diffs-bg-addition:var(--diffs-bg-addition-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-addition-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base))));--diffs-bg-addition-emphasis:var(--diffs-bg-addition-emphasis-override,light-dark(rgb(from var(--diffs-addition-base) r g b / .15),rgb(from var(--diffs-addition-base) r g b / .2)));--diffs-selection-base:var(--diffs-modified-base);--diffs-selection-number-fg:light-dark(color-mix(in lab, var(--diffs-selection-base) 65%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-selection-base) 75%, var(--diffs-mixer)));background-color:var(--diffs-bg);color:var(--diffs-fg);display:block}pre,code,[data-error-wrapper]{isolation:isolate;font-family:var(--diffs-font-family,var(--diffs-font-fallback));outline:none;margin:0;padding:0;display:block}pre,code{background-color:var(--diffs-bg)}code{contain:content}*,:before,:after{box-sizing:border-box}[data-icon-sprite]{display:none}[data-diffs-header],[data-separator]{font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback))}[data-diffs-header][data-sticky]{z-index:1;background-color:var(--diffs-bg);position:sticky;top:0}[data-file-info]{color:var(--fg);background-color:color-mix(in lab, var(--bg) 98%, var(--fg));border-block:1px solid color-mix(in lab, var(--bg) 95%, var(--fg));padding:10px;font-weight:700}[data-diff],[data-file]{--diffs-grid-number-column-width:minmax(min-content, max-content);--diffs-code-grid:var(--diffs-grid-number-column-width) 1fr}[data-dehydrated]:is([data-diff],[data-file]){--diffs-code-grid:var(--diffs-grid-number-column-width) minmax(0, 1fr)}:is([data-diff],[data-file]):hover [data-code]::-webkit-scrollbar-thumb{background-color:var(--diffs-bg-context)}@supports (-webkit-touch-callout:none){:host{--diffs-scrollbar-gutter-fallback:0px}}[data-line] span{color:light-dark(var(--diffs-token-light,var(--diffs-light)),var(--diffs-token-dark,var(--diffs-dark)));background-color:light-dark(var(--diffs-token-light-bg,inherit),var(--diffs-token-dark-bg,inherit));font-weight:light-dark(var(--diffs-token-light-font-weight,inherit),var(--diffs-token-dark-font-weight,inherit));font-style:light-dark(var(--diffs-token-light-font-style,inherit),var(--diffs-token-dark-font-style,inherit));-webkit-text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit));text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit))}[data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);color:var(--diffs-fg);background-color:var(--diffs-line-bg,var(--diffs-bg))}@media (pointer:fine){:is([data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]):where([data-hovered]){--diffs-computed-hovered-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-selected-line-bg) 97%, var(--diffs-bg-hover-override,var(--diffs-mixer))),color-mix(in lab, var(--diffs-computed-selected-line-bg) 91%, var(--diffs-bg-hover-override,var(--diffs-mixer))));--diffs-line-bg:var(--diffs-computed-hovered-line-bg,inherit)}}[data-decoration-bg]:is([data-line],[data-no-newline]){--mix-deco-light:92%;--mix-deco-dark:85%}[data-decoration-bg][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]){--mix-deco-light:88%;--mix-deco-dark:80%}[data-decoration-bg][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]){--mix-deco-light:85%;--mix-deco-dark:78%}@media (pointer:fine){[data-decoration-bg][data-hovered]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:85%;--mix-deco-dark:85%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:83%;--mix-deco-dark:83%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:81%;--mix-deco-dark:81%}}[data-decoration-bg]:is([data-line],[data-no-newline]){--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) var(--mix-deco-light), var(--diffs-decoration-bg)),color-mix(in lab, var(--diffs-bg) var(--mix-deco-dark), var(--diffs-decoration-bg)));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-line-annotation],[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context);--diffs-computed-decoration-bg:var(--diffs-annotation-bg);--diffs-computed-diff-line-bg:var(--diffs-annotation-bg);--diffs-computed-selected-line-bg:var(--diffs-annotation-bg);--diffs-line-bg:var(--diffs-annotation-bg)}[data-merge-conflict-actions],[data-gutter-buffer=merge-conflict-action],[data-gutter-buffer=merge-conflict-marker-base],[data-gutter-buffer=merge-conflict-marker-separator],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator]{--diffs-computed-decoration-bg:var(--diffs-bg-context);--diffs-computed-diff-line-bg:var(--diffs-bg-context);--diffs-computed-selected-line-bg:var(--diffs-bg-context);--diffs-line-bg:var(--diffs-bg-context)}[data-gutter-buffer=merge-conflict-marker-start],[data-merge-conflict=marker-start]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-gutter-buffer=merge-conflict-marker-end],[data-merge-conflict=marker-end]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-has-merge-conflict] [data-line-annotation],[data-has-merge-conflict] [data-gutter-buffer=annotation]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);--diffs-line-bg:var(--diffs-bg)}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number]{--mix-light:91%;--mix-dark:85%}:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--mix-light:88%;--mix-dark:80%}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--diffs-diff-line-mix-target:var(--diffs-bg)}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-deletion-override,var(--diffs-deletion-base))}@media (pointer:fine){[data-line-type=change-deletion][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:75%}}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-deletion-override,var(--diffs-deletion-base));--diffs-diff-line-mix-target:var(--diffs-bg-deletion-number-override,var(--diffs-deletion-base))}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-addition-override,var(--diffs-addition-base))}@media (pointer:fine){[data-line-type=change-addition][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--diffs-bg-addition-number-override,var(--diffs-addition-base))}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-current-override,var(--diffs-addition-base))}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--conflict-bg-current-number-override,var(--diffs-addition-base))}@media (pointer:fine){[data-merge-conflict=current][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-incoming-override,var(--diffs-modified-base))}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-modified-base);--diffs-diff-line-mix-target:var(--conflict-bg-incoming-number-override,var(--diffs-modified-base))}@media (pointer:fine){[data-merge-conflict=incoming][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]{--diffs-selection-mix-target:var(--diffs-bg-selection-override,var(--diffs-selection-base))}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--mix-selection-light:82%;--mix-selection-dark:75%}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:75%;--mix-selection-dark:70%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]){--mix-selection-light:75%;--mix-selection-dark:60%;--diffs-selection-mix-target:var(--diffs-bg-selection-number-override,var(--diffs-selection-base))}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:70%;--mix-selection-dark:55%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--diffs-computed-selected-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-light), var(--diffs-selection-mix-target)),color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-dark), var(--diffs-selection-mix-target)));--diffs-line-bg:var(--diffs-computed-selected-line-bg,inherit)}[data-selected-line]:is([data-gutter-buffer],[data-column-number]){color:var(--diffs-selection-number-fg)}[data-no-newline]{-webkit-user-select:none;user-select:none}[data-no-newline] span{opacity:.6}[data-diff-type=split][data-overflow=scroll]{grid-template-columns:1fr 1fr;display:grid}[data-diff-type=split][data-overflow=scroll] [data-additions]{border-left:1px solid var(--diffs-bg)}[data-diff-type=split][data-overflow=scroll] [data-deletions]{border-right:1px solid var(--diffs-bg)}[data-code]{grid-auto-flow:dense;grid-template-columns:var(--diffs-code-grid);overflow:var(--diffs-overflow-override,scroll) clip;overscroll-behavior-x:none;tab-size:var(--diffs-tab-size,2);padding-top:var(--diffs-gap-block,var(--diffs-gap-fallback));padding-bottom:max(0px, calc(var(--diffs-gap-block,var(--diffs-gap-fallback)) - var(--diffs-scrollbar-gutter)));scrollbar-gutter:stable;align-self:flex-start;display:grid}[data-diffs-scrollbar-measure]{opacity:0;pointer-events:none;scrollbar-gutter:auto;grid-template-columns:none;width:100px;height:100px;padding:0;position:absolute;top:-200px;left:-200px}[data-container-size]{container-type:inline-size}[data-code]::-webkit-scrollbar{width:0;height:var(--diffs-scrollbar-gutter)}[data-code]::-webkit-scrollbar-track{background:0 0}[data-code]::-webkit-scrollbar-thumb{background-color:#0000;background-clip:content-box;border:1px solid #0000;border-radius:3px}[data-code]::-webkit-scrollbar-corner{background-color:#0000}@supports ((-moz-appearance:none)){[data-code]{scrollbar-width:thin;scrollbar-color:var(--diffs-bg-context) transparent;padding-bottom:var(--diffs-gap-block,var(--diffs-gap-fallback))}}:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]) [data-code],[data-overflow=wrap]:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]){padding-top:0}[data-gutter]{grid-template-rows:subgrid;grid-template-columns:subgrid;z-index:3;background-color:var(--diffs-bg);grid-column:1;display:grid;position:relative}[data-gutter] [data-gutter-buffer],[data-gutter] [data-column-number]{border-right:var(--diffs-gap-style,2px solid var(--diffs-bg))}[data-content]{grid-template-rows:subgrid;grid-template-columns:subgrid;background-color:var(--diffs-bg);grid-column:2;min-width:0;display:grid}[data-diff-type=split][data-overflow=wrap]{grid-auto-flow:dense;grid-template-columns:repeat(2, var(--diffs-code-grid));padding-block:var(--diffs-gap-block,var(--diffs-gap-fallback));display:grid}[data-diff-type=split][data-overflow=wrap] [data-deletions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-gutter]{grid-column:1}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-content]{border-right:1px solid var(--diffs-bg);grid-column:2}[data-diff-type=split][data-overflow=wrap] [data-additions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-gutter]{border-left:1px solid var(--diffs-bg);grid-column:3}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-content]{grid-column:4}[data-overflow=scroll] [data-gutter]{position:sticky;left:0}[data-interactive-lines] [data-line]{cursor:pointer}[data-interactive-line-numbers] [data-column-number]{cursor:pointer;touch-action:none}[data-content-buffer],[data-gutter-buffer]{-webkit-user-select:none;user-select:none;min-height:1lh;position:relative}[data-gutter-buffer]{padding-left:2ch;padding-right:1ch}[data-gutter-buffer]:before{content:"";min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));display:block}[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context-gutter);min-height:0}[data-gutter-buffer=buffer]{--diffs-line-bg:var(--diffs-bg-context-gutter)}[data-content-buffer]{background-position:5px 0;background-size:8px 8px;background-origin:border-box;background-image:repeating-linear-gradient(-45deg, transparent, transparent 4.242px, var(--diffs-bg-buffer) 4.242px, var(--diffs-bg-buffer) 5.656px);grid-column:1}[data-separator]{box-sizing:content-box;background-color:var(--diffs-bg)}[data-separator=simple]{min-height:4px}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata],[data-separator=simple]{background-color:var(--diffs-bg-separator)}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata]{height:32px;position:relative}[data-separator-wrapper]{-webkit-user-select:none;user-select:none;fill:currentColor;background-color:var(--diffs-bg);align-items:center;height:100%;display:flex;position:absolute;inset-inline:0}[data-content] [data-separator-wrapper]{display:none}[data-separator=metadata] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;color:var(--diffs-fg-number);white-space:nowrap;text-overflow:ellipsis;min-width:min-content;padding-inline:1ch;inset-inline:100% auto;overflow:hidden}[data-separator=line-info]{margin-block:var(--diffs-gap-block,var(--diffs-gap-fallback))}[data-separator=line-info] [data-separator-wrapper]{min-width:16px}[data-separator=line-info-basic],[data-separator=metadata]{margin-block:0}[data-separator=line-info][data-separator-first]{margin-top:0}[data-separator=line-info][data-separator-last]{margin-bottom:0}[data-expand-index] [data-separator-wrapper]{grid-template-columns:32px auto;display:grid}[data-expand-index] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:32px 32px auto}[data-expand-button],[data-separator-content]{background-color:var(--diffs-bg-separator);flex:none;align-items:center;display:flex}[data-expand-index] [data-separator-content]:hover{cursor:pointer;text-decoration:underline}[data-expand-button]{cursor:pointer;min-width:32px;color:var(--diffs-fg-number);border-right:2px solid var(--diffs-bg);flex-shrink:0;justify-content:center;align-self:stretch}[data-expand-button]:hover{color:var(--diffs-fg)}[data-expand-button][data-expand-all-button]{display:none}[data-expand-down] [data-icon]{transform:scaleY(-1)}[data-separator-content]{height:100%;color:var(--diffs-fg-number);flex:auto;justify-content:flex-start;padding:0 1ch;overflow:hidden}:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-content]{-webkit-user-select:none;user-select:none;height:100%;overflow:clip}[data-unmodified-lines]{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;display:block;overflow:hidden}@supports (width:1cqi){[data-unified] [data-separator=line-info] [data-separator-wrapper]{padding-inline:var(--diffs-gap-inline,var(--diffs-gap-fallback));width:100cqi}:is([data-unified] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content]{border-radius:6px}[data-unified] [data-separator=line-info][data-expand-index] [data-separator-wrapper] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-gutter] [data-separator=line-info] [data-separator-wrapper]{padding-left:var(--diffs-gap-inline,var(--diffs-gap-fallback))}[data-gutter] [data-separator=line-info] [data-separator-content]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-gutter] [data-separator=line-info][data-expand-index] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-additions] [data-content] [data-separator=line-info]{background-color:var(--diffs-bg)}:is([data-additions] [data-content] [data-separator=line-info]) [data-separator-wrapper]{display:none}[data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);border-top-right-radius:6px;border-bottom-right-radius:6px;height:100%;display:block}:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}[data-overflow=scroll] [data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{width:calc(100cqi - var(--diffs-gap-inline,var(--diffs-gap-fallback)))}[data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;margin-right:var(--diffs-gap-inline,var(--diffs-gap-fallback));border-top-right-radius:6px;border-bottom-right-radius:6px;display:block}:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}@media (pointer:fine){[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:unset}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:6px;border-top-left-radius:unset}}}@media (pointer:coarse){[data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px 34px auto}:is([data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]) [data-separator-content]{grid-column:unset;grid-row:unset}@supports (width:1cqi){:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up],[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:unset;border-top-left-radius:unset}}}@media (pointer:fine){[data-separator-wrapper][data-separator-multi-button]{grid-template-rows:50% 50%;display:grid}[data-separator-wrapper][data-separator-multi-button] [data-separator-content]{grid-area:1/2/-1;min-width:min-content}[data-separator-wrapper][data-separator-multi-button] [data-expand-button]{grid-column:1}[data-separator=line-info] [data-separator-wrapper],[data-separator=line-info] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px auto}[data-separator=line-info-basic][data-expand-index] [data-separator-wrapper]{grid-template-columns:100% auto}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-up]{border-bottom:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-down]{border-top:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}}[data-additions] [data-gutter] [data-separator-wrapper],[data-additions] [data-separator=line-info-basic] [data-separator-wrapper],[data-content] [data-separator-wrapper]{display:none}[data-line-annotation]{min-height:var(--diffs-annotation-min-height,0);z-index:2}[data-merge-conflict-actions]{z-index:2}[data-separator=custom]{grid-template-columns:subgrid;display:grid}[data-line],[data-column-number],[data-no-newline]{padding-inline:1ch;position:relative}[data-indicators=classic] [data-line]{padding-inline-start:2ch}:is([data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion]),[data-line]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion])):before{-webkit-user-select:none;user-select:none;width:1ch;height:1lh;display:inline-block;position:absolute;top:0;left:0}:is([data-line]:is([data-indicators=classic] [data-line-type=change-addition]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition])):before{content:"+";color:var(--diffs-addition-base)}:is([data-line]:is([data-indicators=classic] [data-line-type=change-deletion]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-deletion])):before{content:"-";color:var(--diffs-deletion-base)}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion],[data-indicators=bars] [data-line-type=change-addition]):before{content:"";-webkit-user-select:none;user-select:none;contain:strict;width:4px;height:100%;display:block;position:absolute;top:0;left:0}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion]):before{background-image:linear-gradient(0deg, var(--diffs-bg-deletion) 50%, var(--diffs-deletion-base) 50%);background-repeat:repeat;background-size:2px 2px;background-size:calc(1lh/round(1lh / 2px)) calc(1lh/round(1lh / 2px))}[data-column-number]:is([data-indicators=bars] [data-line-type=change-addition]):before{background-color:var(--diffs-addition-base)}[data-overflow=wrap] [data-line],[data-overflow=wrap] [data-annotation-content]{white-space:pre-wrap;word-break:break-word}[data-overflow=scroll] [data-line]{white-space:pre;min-height:1lh}[data-column-number]{box-sizing:content-box;text-align:right;-webkit-user-select:none;user-select:none;color:var(--diffs-fg-number);padding-left:2ch}[data-line-number-content]{min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));z-index:1;display:inline-block;position:relative}[data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]{min-width:4px;padding:0}:is([data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]):before{min-width:0}[data-disable-line-numbers] [data-line-number-content]{display:none}[data-disable-line-numbers] [data-gutter-utility-slot]{right:unset;justify-content:flex-start;left:0}[data-disable-line-numbers][data-indicators=bars] [data-gutter-utility-slot]{left:6px}[data-file][data-disable-line-numbers] [data-gutter-buffer],[data-file][data-disable-line-numbers] [data-column-number]{border-right:0;min-width:0}[data-diff-span]{-webkit-box-decoration-break:clone;box-decoration-break:clone;border-radius:3px}[data-line-type=change-addition] [data-diff-span]{background-color:var(--diffs-bg-addition-emphasis)}[data-line-type=change-deletion] [data-diff-span]{background-color:var(--diffs-bg-deletion-emphasis)}[data-merge-conflict=marker-start],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator],[data-merge-conflict=marker-end]{color:var(--diffs-fg);padding-left:1ch}[data-merge-conflict=marker-start],[data-merge-conflict=marker-end]{align-items:center;display:flex}:is([data-merge-conflict=marker-start],[data-merge-conflict=marker-end]):after{color:var(--diffs-fg-conflict-marker);font-size:.75rem;font-style:normal;line-height:1.25rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));padding-left:1ch}[data-merge-conflict=marker-start]:after{content:"(Current Change)"}[data-merge-conflict=marker-end]:after{content:"(Incoming Change)"}[data-merge-conflict-actions-content]{min-height:1.75rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));color:var(--diffs-fg);align-items:center;gap:.25rem;padding-inline:.5rem;font-size:.75rem;line-height:1.2;display:flex}[data-merge-conflict-action]{appearance:none;color:var(--diffs-fg-number);font:inherit;cursor:pointer;background:0 0;border:0;padding:0;font-style:normal}[data-merge-conflict-action]:hover{color:var(--diffs-fg)}[data-merge-conflict-action=current]:hover{color:var(--diffs-addition-base)}[data-merge-conflict-action=incoming]:hover{color:var(--diffs-modified-base)}[data-merge-conflict-action-separator]{color:var(--diffs-fg-number);opacity:.6;-webkit-user-select:none;user-select:none}[data-diffs-header=default]{background-color:var(--diffs-bg);justify-content:space-between;align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));min-height:calc(1lh + var(--diffs-gap-block,var(--diffs-gap-fallback))*3);z-index:2;flex-direction:row;padding-inline:16px;display:flex;position:relative;top:0}[data-header-content]{align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));white-space:nowrap;flex-direction:row;min-width:0;display:flex}[data-header-content] [data-prev-name],[data-header-content] [data-title]{text-overflow:ellipsis;white-space:nowrap;direction:rtl;min-width:0;overflow:hidden}[data-prev-name]{opacity:.7}[data-rename-icon]{fill:currentColor;flex-grow:0;flex-shrink:0}[data-diffs-header=default] [data-metadata]{white-space:nowrap;align-items:center;gap:1ch;display:flex}[data-diffs-header=default] [data-additions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-addition-base)}[data-diffs-header=default] [data-deletions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-deletion-base)}[data-change-icon]{fill:currentColor;flex-shrink:0}[data-change-icon=change],[data-change-icon=rename-pure],[data-change-icon=rename-changed]{color:var(--diffs-modified-base)}[data-change-icon=new]{color:var(--diffs-addition-base)}[data-change-icon=deleted]{color:var(--diffs-deletion-base)}[data-change-icon=file]{opacity:.6}[data-annotation-content]{z-index:2;isolation:isolate;align-self:flex-start;min-width:0;display:flow-root;position:relative}[data-overflow=scroll] [data-annotation-content],[data-overflow=scroll] [data-merge-conflict-actions-content]{width:var(--diffs-column-content-width,auto);left:var(--diffs-column-number-width,0);position:sticky}[data-annotation-slot]{text-wrap-mode:wrap;word-break:normal;white-space-collapse:collapse}[data-gutter-utility-slot]{touch-action:none;justify-content:flex-end;display:flex;position:absolute;top:0;bottom:0;right:0}[data-utility-button]{appearance:none;cursor:pointer;width:1lh;height:1lh;font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);background-color:var(--diffs-modified-base);color:var(--diffs-bg);fill:currentColor;z-index:4;touch-action:none;border:none;border-radius:4px;justify-content:center;align-items:center;margin-right:calc(1ch - 1lh);padding:0;display:flex;position:relative}[data-utility-button]:before{content:"";display:block;position:absolute;inset:0 0 0 -4px}[data-decoration-bar-stack]{pointer-events:none;isolation:isolate;z-index:1;background-color:var(--diffs-decoration-bar-color,transparent);box-sizing:content-box;border-left:2px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg);width:6px;position:absolute;top:0;bottom:0;right:-2px}[data-decoration-bar-depth="1"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 20%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="2"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 45%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="3"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 65%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-start] [data-decoration-bar-stack]{border-top-left-radius:5px;border-top-right-radius:5px}[data-decoration-bar-end] [data-decoration-bar-stack]{z-index:3;border-bottom-right-radius:5px;border-bottom-left-radius:5px}[data-placeholder]{contain:strict}[data-error-wrapper]{padding:var(--diffs-gap-block,var(--diffs-gap-fallback)) var(--diffs-gap-inline,var(--diffs-gap-fallback));scrollbar-width:none;max-height:400px;overflow:auto}[data-error-wrapper] [data-error-message]{color:var(--diffs-deletion-base);font-size:18px;font-weight:700}[data-error-wrapper] [data-error-stack]{color:var(--diffs-fg-number)}}@layer theme,rendered,unsafe;
@layer theme {
}</style><style data-theme-css="">@layer base, theme, rendered, unsafe;
@layer rendered {
:host {
--diffs-scrollbar-gutter-measured: var(--diffs-scrollbar-gutter-fallback);
--diffs-dark:#fafafa;--diffs-dark-bg:#0a0a0a;--diffs-dark-addition-color:#07c480;--diffs-dark-deletion-color:#ff2e3f;--diffs-dark-modified-color:#009fff;--diffs-light:#0a0a0a;--diffs-light-bg:#ffffff;--diffs-light-addition-color:#18a46c;--diffs-light-deletion-color:#d52c36;--diffs-light-modified-color:#009fff;
}
}</style><div data-diffs-header="default" data-change-type="change"><div data-header-content=""><slot name="header-prefix"></slot><svg width="16" height="16" viewBox="0 0 16 16" data-change-icon="change"><use href="#diffs-icon-symbol-modified"></use></svg><div data-title=""><bdi>Dreamio/VLCNativePlaybackBackend.swift</bdi></div></div><div data-metadata=""><span data-deletions-count="">-2</span><span data-additions-count="">+9</span><slot name="header-metadata"></slot></div></div><pre data-diff="" data-diff-type="split" data-overflow="scroll" data-background="" data-indicators="bars" tabindex="0" style="--diffs-min-number-column-width-default:3ch;" data-dehydrated=""><code data-code="" data-container-size="" data-deletions=""><div data-gutter="" style="grid-row: span 30"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">150 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="151" data-line-index="150,150"><span data-line-number-content="">151</span></div><div data-line-type="context" data-column-number="152" data-line-index="151,151"><span data-line-number-content="">152</span></div><div data-line-type="context" data-column-number="153" data-line-index="152,152"><span data-line-number-content="">153</span></div><div data-line-type="change-deletion" data-column-number="154" data-line-index="153,153"><span data-line-number-content="">154</span></div><div data-line-type="context" data-column-number="155" data-line-index="155,154"><span data-line-number-content="">155</span></div><div data-line-type="context" data-column-number="156" data-line-index="156,155"><span data-line-number-content="">156</span></div><div data-line-type="context" data-column-number="157" data-line-index="157,156"><span data-line-number-content="">157</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">13 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="171" data-line-index="171,170"><span data-line-number-content="">171</span></div><div data-line-type="context" data-column-number="172" data-line-index="172,171"><span data-line-number-content="">172</span></div><div data-line-type="context" data-column-number="173" data-line-index="173,172"><span data-line-number-content="">173</span></div><div data-line-type="change-deletion" data-column-number="174" data-line-index="174,173"><span data-line-number-content="">174</span></div><div data-line-type="context" data-column-number="175" data-line-index="176,174"><span data-line-number-content="">175</span></div><div data-line-type="context" data-column-number="176" data-line-index="177,175"><span data-line-number-content="">176</span></div><div data-line-type="context" data-column-number="177" data-line-index="178,176"><span data-line-number-content="">177</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">426 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="604" data-line-index="605,603"><span data-line-number-content="">604</span></div><div data-line-type="context" data-column-number="605" data-line-index="606,604"><span data-line-number-content="">605</span></div><div data-line-type="context" data-column-number="606" data-line-index="607,605"><span data-line-number-content="">606</span></div><div data-gutter-buffer="buffer" data-buffer-size="7" style="grid-row: span 7;min-height:calc(7 * 1lh);"></div><div data-line-type="context" data-column-number="607" data-line-index="615,613"><span data-line-number-content="">607</span></div><div data-line-type="context" data-column-number="608" data-line-index="616,614"><span data-line-number-content="">608</span></div><div data-line-type="context" data-column-number="609" data-line-index="617,615"><span data-line-number-content="">609</span></div></div><div data-content="" style="grid-row: span 30"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">150 unmodified lines</span></div></div></div><div data-line="151" data-alt-line="151" data-line-type="context" data-line-index="150,150"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="152" data-alt-line="152" data-line-type="context" data-line-index="151,151"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="153" data-alt-line="153" data-line-type="context" data-line-index="152,152"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> clamped </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, position</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="154" data-line-type="change-deletion" data-line-index="153,153"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> rangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">prefetch</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> rangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.byteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> clamped</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ??</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="155" data-alt-line="155" data-line-type="context" data-line-index="155,154"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="156" data-alt-line="156" data-line-type="context" data-line-index="156,155"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> byteOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> rangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">byteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> clamped</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="157" data-alt-line="157" data-line-type="context" data-line-index="157,156"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioVLC] seek targetPosition=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">clamped</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> byteOffset=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">byteOffset</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> mode=local-cache"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">13 unmodified lines</span></div></div></div><div data-line="171" data-alt-line="171" data-line-type="context" data-line-index="171,170"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> nextTime </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">duration, currentTime </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> seconds</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="172" data-alt-line="172" data-line-type="context" data-line-index="172,171"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> duration </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">></span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="173" data-alt-line="173" data-line-type="context" data-line-index="173,172"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> nextPosition </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Float</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">nextTime </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">/</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> duration</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="174" data-line-type="change-deletion" data-line-index="174,173"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> rangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">prefetch</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> rangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.byteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> nextPosition</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ??</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="175" data-alt-line="175" data-line-type="context" data-line-index="176,174"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="176" data-alt-line="176" data-line-type="context" data-line-index="177,175"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> byteOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> rangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">byteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> nextPosition</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="177" data-alt-line="177" data-line-type="context" data-line-index="178,176"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioVLC] jump seconds=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">seconds</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> target=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">nextTime</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> byteOffset=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">byteOffset</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> mode=local-cache"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">426 unmodified lines</span></div></div></div><div data-line="604" data-alt-line="604" data-line-type="context" data-line-index="605,603"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> canImport</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">MobileVLCKit</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="605" data-alt-line="605" data-line-type="context" data-line-index="606,604"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE">extension</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> VLCNativePlaybackBackend</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> VLCMediaPlayerDelegate </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="606" data-alt-line="606" data-line-type="context" data-line-index="607,605"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> mediaPlayerStateChanged</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">_</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> aNotification</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: Notification</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-content-buffer="" data-buffer-size="7" style="grid-row: span 7;min-height:calc(7 * 1lh)"></div><div data-line="607" data-alt-line="614" data-line-type="context" data-line-index="615,613"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="608" data-alt-line="615" data-line-type="context" data-line-index="616,614"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> logPlaybackStateIfNeeded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">stateName</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">mediaPlayer.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">state</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="609" data-alt-line="616" data-line-type="context" data-line-index="617,615"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div></div></code><code data-code="" data-container-size="" data-additions=""><div data-gutter="" style="grid-row: span 30"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">150 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="151" data-line-index="150,150"><span data-line-number-content="">151</span></div><div data-line-type="context" data-column-number="152" data-line-index="151,151"><span data-line-number-content="">152</span></div><div data-line-type="context" data-column-number="153" data-line-index="152,152"><span data-line-number-content="">153</span></div><div data-line-type="change-addition" data-column-number="154" data-line-index="154,153"><span data-line-number-content="">154</span></div><div data-line-type="context" data-column-number="155" data-line-index="155,154"><span data-line-number-content="">155</span></div><div data-line-type="context" data-column-number="156" data-line-index="156,155"><span data-line-number-content="">156</span></div><div data-line-type="context" data-column-number="157" data-line-index="157,156"><span data-line-number-content="">157</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">13 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="171" data-line-index="171,170"><span data-line-number-content="">171</span></div><div data-line-type="context" data-column-number="172" data-line-index="172,171"><span data-line-number-content="">172</span></div><div data-line-type="context" data-column-number="173" data-line-index="173,172"><span data-line-number-content="">173</span></div><div data-line-type="change-addition" data-column-number="174" data-line-index="175,173"><span data-line-number-content="">174</span></div><div data-line-type="context" data-column-number="175" data-line-index="176,174"><span data-line-number-content="">175</span></div><div data-line-type="context" data-column-number="176" data-line-index="177,175"><span data-line-number-content="">176</span></div><div data-line-type="context" data-column-number="177" data-line-index="178,176"><span data-line-number-content="">177</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">426 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="604" data-line-index="605,603"><span data-line-number-content="">604</span></div><div data-line-type="context" data-column-number="605" data-line-index="606,604"><span data-line-number-content="">605</span></div><div data-line-type="context" data-column-number="606" data-line-index="607,605"><span data-line-number-content="">606</span></div><div data-line-type="change-addition" data-column-number="607" data-line-index="608,606"><span data-line-number-content="">607</span></div><div data-line-type="change-addition" data-column-number="608" data-line-index="609,607"><span data-line-number-content="">608</span></div><div data-line-type="change-addition" data-column-number="609" data-line-index="610,608"><span data-line-number-content="">609</span></div><div data-line-type="change-addition" data-column-number="610" data-line-index="611,609"><span data-line-number-content="">610</span></div><div data-line-type="change-addition" data-column-number="611" data-line-index="612,610"><span data-line-number-content="">611</span></div><div data-line-type="change-addition" data-column-number="612" data-line-index="613,611"><span data-line-number-content="">612</span></div><div data-line-type="change-addition" data-column-number="613" data-line-index="614,612"><span data-line-number-content="">613</span></div><div data-line-type="context" data-column-number="614" data-line-index="615,613"><span data-line-number-content="">614</span></div><div data-line-type="context" data-column-number="615" data-line-index="616,614"><span data-line-number-content="">615</span></div><div data-line-type="context" data-column-number="616" data-line-index="617,615"><span data-line-number-content="">616</span></div></div><div data-content="" style="grid-row: span 30"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">150 unmodified lines</span></div></div></div><div data-line="151" data-alt-line="151" data-line-type="context" data-line-index="150,150"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="152" data-alt-line="152" data-line-type="context" data-line-index="151,151"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="153" data-alt-line="153" data-line-type="context" data-line-index="152,152"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> clamped </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, position</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="154" data-line-type="change-addition" data-line-index="154,153"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> rangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">prefetchForSeek</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> rangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.byteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> clamped</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ??</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="155" data-alt-line="155" data-line-type="context" data-line-index="155,154"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="156" data-alt-line="156" data-line-type="context" data-line-index="156,155"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> byteOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> rangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">byteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> clamped</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="157" data-alt-line="157" data-line-type="context" data-line-index="157,156"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioVLC] seek targetPosition=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">clamped</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> byteOffset=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">byteOffset</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> mode=local-cache"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">13 unmodified lines</span></div></div></div><div data-line="171" data-alt-line="171" data-line-type="context" data-line-index="171,170"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> nextTime </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">duration, currentTime </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> seconds</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="172" data-alt-line="172" data-line-type="context" data-line-index="172,171"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> duration </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">></span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="173" data-alt-line="173" data-line-type="context" data-line-index="173,172"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> nextPosition </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Float</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">nextTime </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">/</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> duration</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="174" data-line-type="change-addition" data-line-index="175,173"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> rangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">prefetchForSeek</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> rangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.byteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> nextPosition</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ??</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="175" data-alt-line="175" data-line-type="context" data-line-index="176,174"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="176" data-alt-line="176" data-line-type="context" data-line-index="177,175"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> byteOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> rangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">byteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> nextPosition</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="177" data-alt-line="177" data-line-type="context" data-line-index="178,176"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioVLC] jump seconds=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">seconds</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> target=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">nextTime</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> byteOffset=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">byteOffset</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> mode=local-cache"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">426 unmodified lines</span></div></div></div><div data-line="604" data-alt-line="604" data-line-type="context" data-line-index="605,603"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> canImport</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">MobileVLCKit</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="605" data-alt-line="605" data-line-type="context" data-line-index="606,604"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE">extension</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> VLCNativePlaybackBackend</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> VLCMediaPlayerDelegate </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="606" data-alt-line="606" data-line-type="context" data-line-index="607,605"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> mediaPlayerStateChanged</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">_</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> aNotification</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: Notification</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="607" data-line-type="change-addition" data-line-index="608,606"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> Task</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> @</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">MainActor</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> [</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">weak</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> in</span></div><div data-line="608" data-line-type="change-addition" data-line-index="609,607"><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">handleMediaPlayerStateChanged</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="609" data-line-type="change-addition" data-line-index="610,608"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="610" data-line-type="change-addition" data-line-index="611,609"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="611" data-line-type="change-addition" data-line-index="612,610">
</div><div data-line="612" data-line-type="change-addition" data-line-index="613,611"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> @</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">MainActor</span></div><div data-line="613" data-line-type="change-addition" data-line-index="614,612"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> handleMediaPlayerStateChanged</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="614" data-alt-line="607" data-line-type="context" data-line-index="615,613"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="615" data-alt-line="608" data-line-type="context" data-line-index="616,614"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> logPlaybackStateIfNeeded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">stateName</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">mediaPlayer.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">state</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="616" data-alt-line="609" data-line-type="context" data-line-index="617,615"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div></div></code></pre></section><section class="diff-file"><h3>Tests/StreamResolverTests.swift</h3><svg data-icon-sprite aria-hidden="true" width="0" height="0">
<symbol id="diffs-icon-arrow-right-short" viewBox="0 0 16 16">
<path d="M8.47 4.22a.75.75 0 0 0 0 1.06l1.97 1.97H3.75a.75.75 0 0 0 0 1.5h6.69l-1.97 1.97a.75.75 0 1 0 1.06 1.06l3.25-3.25a.75.75 0 0 0 0-1.06L9.53 4.22a.75.75 0 0 0-1.06 0"/>
</symbol>
<symbol id="diffs-icon-brand-github" viewBox="0 0 16 16">
<path d="M8 0c4.42 0 8 3.58 8 8a8.01 8.01 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27s-1.36.09-2 .27c-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8"/>
</symbol>
<symbol id="diffs-icon-chevron" viewBox="0 0 16 16">
<path d="M1.47 4.47a.75.75 0 0 1 1.06 0L8 9.94l5.47-5.47a.75.75 0 1 1 1.06 1.06l-6 6a.75.75 0 0 1-1.06 0l-6-6a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-chevrons-narrow" viewBox="0 0 10 16">
<path d="M4.47 2.22a.75.75 0 0 1 1.06 0l3.25 3.25a.75.75 0 0 1-1.06 1.06L5 3.81 2.28 6.53a.75.75 0 0 1-1.06-1.06zM1.22 9.47a.75.75 0 0 1 1.06 0L5 12.19l2.72-2.72a.75.75 0 0 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0l-3.25-3.25a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-diff-split" viewBox="0 0 16 16">
<path d="M14 0H8.5v16H14a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2m-1.5 6.5v1h1a.5.5 0 0 1 0 1h-1v1a.5.5 0 0 1-1 0v-1h-1a.5.5 0 0 1 0-1h1v-1a.5.5 0 0 1 1 0"/><path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h5.5V0zm.5 7.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1 0-1" opacity=".3"/>
</symbol>
<symbol id="diffs-icon-diff-unified" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M16 14a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V8.5h16zm-8-4a.5.5 0 0 0-.5.5v1h-1a.5.5 0 0 0 0 1h1v1a.5.5 0 0 0 1 0v-1h1a.5.5 0 0 0 0-1h-1v-1A.5.5 0 0 0 8 10" clip-rule="evenodd"/><path fill-rule="evenodd" d="M14 0a2 2 0 0 1 2 2v5.5H0V2a2 2 0 0 1 2-2zM6.5 3.5a.5.5 0 0 0 0 1h3a.5.5 0 0 0 0-1z" clip-rule="evenodd" opacity=".4"/>
</symbol>
<symbol id="diffs-icon-expand" viewBox="0 0 16 16">
<path d="M3.47 5.47a.75.75 0 0 1 1.06 0L8 8.94l3.47-3.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-expand-all" viewBox="0 0 16 16">
<path d="M11.47 9.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 1 1 1.06-1.06L8 12.94zM7.526 1.418a.75.75 0 0 1 1.004.052l4 4a.75.75 0 1 1-1.06 1.06L8 3.06 4.53 6.53a.75.75 0 1 1-1.06-1.06l4-4z"/>
</symbol>
<symbol id="diffs-icon-file-code" viewBox="0 0 16 16">
<path d="M10.75 0c.199 0 .39.08.53.22l3.5 3.5c.14.14.22.331.22.53v9A2.75 2.75 0 0 1 12.25 16h-8.5A2.75 2.75 0 0 1 1 13.25V2.75A2.75 2.75 0 0 1 3.75 0zm-7 1.5c-.69 0-1.25.56-1.25 1.25v10.5c0 .69.56 1.25 1.25 1.25h8.5c.69 0 1.25-.56 1.25-1.25V5h-1.25A2.25 2.25 0 0 1 10 2.75V1.5z"/><path d="M7.248 6.19a.75.75 0 0 1 .063 1.058L5.753 9l1.558 1.752a.75.75 0 0 1-1.122.996l-2-2.25a.75.75 0 0 1 0-.996l2-2.25a.75.75 0 0 1 1.06-.063M8.69 7.248a.75.75 0 1 1 1.12-.996l2 2.25a.75.75 0 0 1 0 .996l-2 2.25a.75.75 0 1 1-1.12-.996L10.245 9z"/>
</symbol>
<symbol id="diffs-icon-plus" viewBox="0 0 16 16">
<path d="M8 3a.75.75 0 0 1 .75.75v3.5h3.5a.75.75 0 0 1 0 1.5h-3.5v3.5a.75.75 0 0 1-1.5 0v-3.5h-3.5a.75.75 0 0 1 0-1.5h3.5v-3.5A.75.75 0 0 1 8 3"/>
</symbol>
<symbol id="diffs-icon-symbol-added" viewBox="0 0 16 16">
<path d="M8 4a.75.75 0 0 1 .75.75v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5A.75.75 0 0 1 8 4"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
</symbol>
<symbol id="diffs-icon-symbol-deleted" viewBox="0 0 16 16">
<path d="M4 8a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5A.75.75 0 0 1 4 8"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
</symbol>
<symbol id="diffs-icon-symbol-diffstat" viewBox="0 0 16 16">
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.75 4.296a.75.75 0 0 0-1.5 0V6.25h-2a.75.75 0 0 0 0 1.5h2v1.5h1.5v-1.5h2a.75.75 0 0 0 0-1.5h-2zM5.25 10a.75.75 0 0 0 0 1.5h5.5a.75.75 0 0 0 0-1.5z"/>
</symbol>
<symbol id="diffs-icon-symbol-ignored" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m11.53-2.47a.75.75 0 0 0-1.06-1.06l-6 6a.75.75 0 1 0 1.06 1.06z"/>
</symbol>
<symbol id="diffs-icon-symbol-modified" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m8 3a3 3 0 1 0 0-6 3 3 0 0 0 0 6"/>
</symbol>
<symbol id="diffs-icon-symbol-moved" viewBox="0 0 16 16">
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.495 4.695a.75.75 0 0 0-.05 1.06L10.486 8l-2.041 2.246a.75.75 0 0 0 1.11 1.008l2.5-2.75a.75.75 0 0 0 0-1.008l-2.5-2.75a.75.75 0 0 0-1.06-.051m-4 0a.75.75 0 0 0-.05 1.06l2.044 2.248-1.796 1.995a.75.75 0 0 0 1.114 1.004l2.25-2.5a.75.75 0 0 0-.002-1.007l-2.5-2.75a.75.75 0 0 0-1.06-.05"/>
</symbol>
<symbol id="diffs-icon-symbol-ref" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706.286.286.71.54 1.41.73V1.86c-.7.19-1.124.444-1.41.73-.324.325-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8m4 6.397c.697.07 1.522.103 2.5.103 1.613 0 2.806-.088 3.704-.288.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5c-.978 0-1.803.033-2.5.103zM0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m7-2a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1z"/>
</symbol>
</svg><style data-core-css="">@layer base, theme, rendered, unsafe;
@layer base,theme,rendered,unsafe;@layer base{:host{--diffs-font-fallback:"SF Mono", Monaco, Consolas, "Ubuntu Mono", "Liberation Mono", "Courier New", monospace;--diffs-header-font-fallback:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif;--diffs-mixer:light-dark(#000,#fff);--diffs-gap-fallback:8px;--diffs-scrollbar-gutter-fallback:6px;--diffs-scrollbar-gutter:var(--diffs-scrollbar-gutter-override,var(--diffs-scrollbar-gutter-measured,var(--diffs-scrollbar-gutter-fallback)));--diffs-added-light:#0dbe4e;--diffs-added-dark:#5ecc71;--diffs-modified-light:#009fff;--diffs-modified-dark:#69b1ff;--diffs-deleted-light:#ff2e3f;--diffs-deleted-dark:#ff6762;color-scheme:light dark;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);font-feature-settings:var(--diffs-font-features);--diffs-bg:light-dark(var(--diffs-light-bg,#fff),var(--diffs-dark-bg,#000));--diffs-bg-buffer:var(--diffs-bg-buffer-override,light-dark(color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer))));--diffs-bg-context:var(--diffs-bg-context-override,light-dark(color-mix(in lab, var(--diffs-bg) 98.5%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92.5%, var(--diffs-mixer))));--diffs-bg-context-gutter:var(--diffs-bg-context-gutter-override,light-dark(color-mix(in lab, var(--diffs-bg-context) 90%, var(--diffs-bg)),color-mix(in lab, var(--diffs-bg-context) 45%, var(--diffs-bg))));--diffs-bg-separator:var(--diffs-bg-separator-override,light-dark(color-mix(in lab, var(--diffs-bg) 96%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-mixer))));--diffs-fg:light-dark(var(--diffs-light,#000),var(--diffs-dark,#fff));--diffs-fg-number:var(--diffs-fg-number-override,light-dark(color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg)),color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg))));--diffs-fg-conflict-marker:var(--diffs-fg-conflict-marker-override,var(--diffs-fg-number));--diffs-deletion-base:var(--diffs-deletion-color-override,light-dark(var(--diffs-light-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-light))),var(--diffs-dark-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-dark)))));--diffs-addition-base:var(--diffs-addition-color-override,light-dark(var(--diffs-light-addition-color,var(--diffs-addition-color,var(--diffs-added-light))),var(--diffs-dark-addition-color,var(--diffs-addition-color,var(--diffs-added-dark)))));--diffs-modified-base:var(--diffs-modified-color-override,light-dark(var(--diffs-light-modified-color,var(--diffs-modified-color,var(--diffs-modified-light))),var(--diffs-dark-modified-color,var(--diffs-modified-color,var(--diffs-modified-dark)))));--diffs-bg-deletion:var(--diffs-bg-deletion-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-deletion-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base))));--diffs-bg-deletion-emphasis:var(--diffs-bg-deletion-emphasis-override,light-dark(rgb(from var(--diffs-deletion-base) r g b / .15),rgb(from var(--diffs-deletion-base) r g b / .2)));--diffs-bg-addition:var(--diffs-bg-addition-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-addition-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base))));--diffs-bg-addition-emphasis:var(--diffs-bg-addition-emphasis-override,light-dark(rgb(from var(--diffs-addition-base) r g b / .15),rgb(from var(--diffs-addition-base) r g b / .2)));--diffs-selection-base:var(--diffs-modified-base);--diffs-selection-number-fg:light-dark(color-mix(in lab, var(--diffs-selection-base) 65%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-selection-base) 75%, var(--diffs-mixer)));background-color:var(--diffs-bg);color:var(--diffs-fg);display:block}pre,code,[data-error-wrapper]{isolation:isolate;font-family:var(--diffs-font-family,var(--diffs-font-fallback));outline:none;margin:0;padding:0;display:block}pre,code{background-color:var(--diffs-bg)}code{contain:content}*,:before,:after{box-sizing:border-box}[data-icon-sprite]{display:none}[data-diffs-header],[data-separator]{font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback))}[data-diffs-header][data-sticky]{z-index:1;background-color:var(--diffs-bg);position:sticky;top:0}[data-file-info]{color:var(--fg);background-color:color-mix(in lab, var(--bg) 98%, var(--fg));border-block:1px solid color-mix(in lab, var(--bg) 95%, var(--fg));padding:10px;font-weight:700}[data-diff],[data-file]{--diffs-grid-number-column-width:minmax(min-content, max-content);--diffs-code-grid:var(--diffs-grid-number-column-width) 1fr}[data-dehydrated]:is([data-diff],[data-file]){--diffs-code-grid:var(--diffs-grid-number-column-width) minmax(0, 1fr)}:is([data-diff],[data-file]):hover [data-code]::-webkit-scrollbar-thumb{background-color:var(--diffs-bg-context)}@supports (-webkit-touch-callout:none){:host{--diffs-scrollbar-gutter-fallback:0px}}[data-line] span{color:light-dark(var(--diffs-token-light,var(--diffs-light)),var(--diffs-token-dark,var(--diffs-dark)));background-color:light-dark(var(--diffs-token-light-bg,inherit),var(--diffs-token-dark-bg,inherit));font-weight:light-dark(var(--diffs-token-light-font-weight,inherit),var(--diffs-token-dark-font-weight,inherit));font-style:light-dark(var(--diffs-token-light-font-style,inherit),var(--diffs-token-dark-font-style,inherit));-webkit-text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit));text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit))}[data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);color:var(--diffs-fg);background-color:var(--diffs-line-bg,var(--diffs-bg))}@media (pointer:fine){:is([data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]):where([data-hovered]){--diffs-computed-hovered-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-selected-line-bg) 97%, var(--diffs-bg-hover-override,var(--diffs-mixer))),color-mix(in lab, var(--diffs-computed-selected-line-bg) 91%, var(--diffs-bg-hover-override,var(--diffs-mixer))));--diffs-line-bg:var(--diffs-computed-hovered-line-bg,inherit)}}[data-decoration-bg]:is([data-line],[data-no-newline]){--mix-deco-light:92%;--mix-deco-dark:85%}[data-decoration-bg][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]){--mix-deco-light:88%;--mix-deco-dark:80%}[data-decoration-bg][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]){--mix-deco-light:85%;--mix-deco-dark:78%}@media (pointer:fine){[data-decoration-bg][data-hovered]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:85%;--mix-deco-dark:85%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:83%;--mix-deco-dark:83%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:81%;--mix-deco-dark:81%}}[data-decoration-bg]:is([data-line],[data-no-newline]){--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) var(--mix-deco-light), var(--diffs-decoration-bg)),color-mix(in lab, var(--diffs-bg) var(--mix-deco-dark), var(--diffs-decoration-bg)));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-line-annotation],[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context);--diffs-computed-decoration-bg:var(--diffs-annotation-bg);--diffs-computed-diff-line-bg:var(--diffs-annotation-bg);--diffs-computed-selected-line-bg:var(--diffs-annotation-bg);--diffs-line-bg:var(--diffs-annotation-bg)}[data-merge-conflict-actions],[data-gutter-buffer=merge-conflict-action],[data-gutter-buffer=merge-conflict-marker-base],[data-gutter-buffer=merge-conflict-marker-separator],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator]{--diffs-computed-decoration-bg:var(--diffs-bg-context);--diffs-computed-diff-line-bg:var(--diffs-bg-context);--diffs-computed-selected-line-bg:var(--diffs-bg-context);--diffs-line-bg:var(--diffs-bg-context)}[data-gutter-buffer=merge-conflict-marker-start],[data-merge-conflict=marker-start]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-gutter-buffer=merge-conflict-marker-end],[data-merge-conflict=marker-end]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-has-merge-conflict] [data-line-annotation],[data-has-merge-conflict] [data-gutter-buffer=annotation]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);--diffs-line-bg:var(--diffs-bg)}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number]{--mix-light:91%;--mix-dark:85%}:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--mix-light:88%;--mix-dark:80%}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--diffs-diff-line-mix-target:var(--diffs-bg)}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-deletion-override,var(--diffs-deletion-base))}@media (pointer:fine){[data-line-type=change-deletion][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:75%}}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-deletion-override,var(--diffs-deletion-base));--diffs-diff-line-mix-target:var(--diffs-bg-deletion-number-override,var(--diffs-deletion-base))}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-addition-override,var(--diffs-addition-base))}@media (pointer:fine){[data-line-type=change-addition][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--diffs-bg-addition-number-override,var(--diffs-addition-base))}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-current-override,var(--diffs-addition-base))}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--conflict-bg-current-number-override,var(--diffs-addition-base))}@media (pointer:fine){[data-merge-conflict=current][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-incoming-override,var(--diffs-modified-base))}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-modified-base);--diffs-diff-line-mix-target:var(--conflict-bg-incoming-number-override,var(--diffs-modified-base))}@media (pointer:fine){[data-merge-conflict=incoming][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]{--diffs-selection-mix-target:var(--diffs-bg-selection-override,var(--diffs-selection-base))}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--mix-selection-light:82%;--mix-selection-dark:75%}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:75%;--mix-selection-dark:70%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]){--mix-selection-light:75%;--mix-selection-dark:60%;--diffs-selection-mix-target:var(--diffs-bg-selection-number-override,var(--diffs-selection-base))}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:70%;--mix-selection-dark:55%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--diffs-computed-selected-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-light), var(--diffs-selection-mix-target)),color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-dark), var(--diffs-selection-mix-target)));--diffs-line-bg:var(--diffs-computed-selected-line-bg,inherit)}[data-selected-line]:is([data-gutter-buffer],[data-column-number]){color:var(--diffs-selection-number-fg)}[data-no-newline]{-webkit-user-select:none;user-select:none}[data-no-newline] span{opacity:.6}[data-diff-type=split][data-overflow=scroll]{grid-template-columns:1fr 1fr;display:grid}[data-diff-type=split][data-overflow=scroll] [data-additions]{border-left:1px solid var(--diffs-bg)}[data-diff-type=split][data-overflow=scroll] [data-deletions]{border-right:1px solid var(--diffs-bg)}[data-code]{grid-auto-flow:dense;grid-template-columns:var(--diffs-code-grid);overflow:var(--diffs-overflow-override,scroll) clip;overscroll-behavior-x:none;tab-size:var(--diffs-tab-size,2);padding-top:var(--diffs-gap-block,var(--diffs-gap-fallback));padding-bottom:max(0px, calc(var(--diffs-gap-block,var(--diffs-gap-fallback)) - var(--diffs-scrollbar-gutter)));scrollbar-gutter:stable;align-self:flex-start;display:grid}[data-diffs-scrollbar-measure]{opacity:0;pointer-events:none;scrollbar-gutter:auto;grid-template-columns:none;width:100px;height:100px;padding:0;position:absolute;top:-200px;left:-200px}[data-container-size]{container-type:inline-size}[data-code]::-webkit-scrollbar{width:0;height:var(--diffs-scrollbar-gutter)}[data-code]::-webkit-scrollbar-track{background:0 0}[data-code]::-webkit-scrollbar-thumb{background-color:#0000;background-clip:content-box;border:1px solid #0000;border-radius:3px}[data-code]::-webkit-scrollbar-corner{background-color:#0000}@supports ((-moz-appearance:none)){[data-code]{scrollbar-width:thin;scrollbar-color:var(--diffs-bg-context) transparent;padding-bottom:var(--diffs-gap-block,var(--diffs-gap-fallback))}}:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]) [data-code],[data-overflow=wrap]:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]){padding-top:0}[data-gutter]{grid-template-rows:subgrid;grid-template-columns:subgrid;z-index:3;background-color:var(--diffs-bg);grid-column:1;display:grid;position:relative}[data-gutter] [data-gutter-buffer],[data-gutter] [data-column-number]{border-right:var(--diffs-gap-style,2px solid var(--diffs-bg))}[data-content]{grid-template-rows:subgrid;grid-template-columns:subgrid;background-color:var(--diffs-bg);grid-column:2;min-width:0;display:grid}[data-diff-type=split][data-overflow=wrap]{grid-auto-flow:dense;grid-template-columns:repeat(2, var(--diffs-code-grid));padding-block:var(--diffs-gap-block,var(--diffs-gap-fallback));display:grid}[data-diff-type=split][data-overflow=wrap] [data-deletions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-gutter]{grid-column:1}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-content]{border-right:1px solid var(--diffs-bg);grid-column:2}[data-diff-type=split][data-overflow=wrap] [data-additions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-gutter]{border-left:1px solid var(--diffs-bg);grid-column:3}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-content]{grid-column:4}[data-overflow=scroll] [data-gutter]{position:sticky;left:0}[data-interactive-lines] [data-line]{cursor:pointer}[data-interactive-line-numbers] [data-column-number]{cursor:pointer;touch-action:none}[data-content-buffer],[data-gutter-buffer]{-webkit-user-select:none;user-select:none;min-height:1lh;position:relative}[data-gutter-buffer]{padding-left:2ch;padding-right:1ch}[data-gutter-buffer]:before{content:"";min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));display:block}[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context-gutter);min-height:0}[data-gutter-buffer=buffer]{--diffs-line-bg:var(--diffs-bg-context-gutter)}[data-content-buffer]{background-position:5px 0;background-size:8px 8px;background-origin:border-box;background-image:repeating-linear-gradient(-45deg, transparent, transparent 4.242px, var(--diffs-bg-buffer) 4.242px, var(--diffs-bg-buffer) 5.656px);grid-column:1}[data-separator]{box-sizing:content-box;background-color:var(--diffs-bg)}[data-separator=simple]{min-height:4px}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata],[data-separator=simple]{background-color:var(--diffs-bg-separator)}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata]{height:32px;position:relative}[data-separator-wrapper]{-webkit-user-select:none;user-select:none;fill:currentColor;background-color:var(--diffs-bg);align-items:center;height:100%;display:flex;position:absolute;inset-inline:0}[data-content] [data-separator-wrapper]{display:none}[data-separator=metadata] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;color:var(--diffs-fg-number);white-space:nowrap;text-overflow:ellipsis;min-width:min-content;padding-inline:1ch;inset-inline:100% auto;overflow:hidden}[data-separator=line-info]{margin-block:var(--diffs-gap-block,var(--diffs-gap-fallback))}[data-separator=line-info] [data-separator-wrapper]{min-width:16px}[data-separator=line-info-basic],[data-separator=metadata]{margin-block:0}[data-separator=line-info][data-separator-first]{margin-top:0}[data-separator=line-info][data-separator-last]{margin-bottom:0}[data-expand-index] [data-separator-wrapper]{grid-template-columns:32px auto;display:grid}[data-expand-index] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:32px 32px auto}[data-expand-button],[data-separator-content]{background-color:var(--diffs-bg-separator);flex:none;align-items:center;display:flex}[data-expand-index] [data-separator-content]:hover{cursor:pointer;text-decoration:underline}[data-expand-button]{cursor:pointer;min-width:32px;color:var(--diffs-fg-number);border-right:2px solid var(--diffs-bg);flex-shrink:0;justify-content:center;align-self:stretch}[data-expand-button]:hover{color:var(--diffs-fg)}[data-expand-button][data-expand-all-button]{display:none}[data-expand-down] [data-icon]{transform:scaleY(-1)}[data-separator-content]{height:100%;color:var(--diffs-fg-number);flex:auto;justify-content:flex-start;padding:0 1ch;overflow:hidden}:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-content]{-webkit-user-select:none;user-select:none;height:100%;overflow:clip}[data-unmodified-lines]{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;display:block;overflow:hidden}@supports (width:1cqi){[data-unified] [data-separator=line-info] [data-separator-wrapper]{padding-inline:var(--diffs-gap-inline,var(--diffs-gap-fallback));width:100cqi}:is([data-unified] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content]{border-radius:6px}[data-unified] [data-separator=line-info][data-expand-index] [data-separator-wrapper] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-gutter] [data-separator=line-info] [data-separator-wrapper]{padding-left:var(--diffs-gap-inline,var(--diffs-gap-fallback))}[data-gutter] [data-separator=line-info] [data-separator-content]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-gutter] [data-separator=line-info][data-expand-index] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-additions] [data-content] [data-separator=line-info]{background-color:var(--diffs-bg)}:is([data-additions] [data-content] [data-separator=line-info]) [data-separator-wrapper]{display:none}[data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);border-top-right-radius:6px;border-bottom-right-radius:6px;height:100%;display:block}:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}[data-overflow=scroll] [data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{width:calc(100cqi - var(--diffs-gap-inline,var(--diffs-gap-fallback)))}[data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;margin-right:var(--diffs-gap-inline,var(--diffs-gap-fallback));border-top-right-radius:6px;border-bottom-right-radius:6px;display:block}:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}@media (pointer:fine){[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:unset}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:6px;border-top-left-radius:unset}}}@media (pointer:coarse){[data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px 34px auto}:is([data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]) [data-separator-content]{grid-column:unset;grid-row:unset}@supports (width:1cqi){:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up],[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:unset;border-top-left-radius:unset}}}@media (pointer:fine){[data-separator-wrapper][data-separator-multi-button]{grid-template-rows:50% 50%;display:grid}[data-separator-wrapper][data-separator-multi-button] [data-separator-content]{grid-area:1/2/-1;min-width:min-content}[data-separator-wrapper][data-separator-multi-button] [data-expand-button]{grid-column:1}[data-separator=line-info] [data-separator-wrapper],[data-separator=line-info] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px auto}[data-separator=line-info-basic][data-expand-index] [data-separator-wrapper]{grid-template-columns:100% auto}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-up]{border-bottom:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-down]{border-top:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}}[data-additions] [data-gutter] [data-separator-wrapper],[data-additions] [data-separator=line-info-basic] [data-separator-wrapper],[data-content] [data-separator-wrapper]{display:none}[data-line-annotation]{min-height:var(--diffs-annotation-min-height,0);z-index:2}[data-merge-conflict-actions]{z-index:2}[data-separator=custom]{grid-template-columns:subgrid;display:grid}[data-line],[data-column-number],[data-no-newline]{padding-inline:1ch;position:relative}[data-indicators=classic] [data-line]{padding-inline-start:2ch}:is([data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion]),[data-line]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion])):before{-webkit-user-select:none;user-select:none;width:1ch;height:1lh;display:inline-block;position:absolute;top:0;left:0}:is([data-line]:is([data-indicators=classic] [data-line-type=change-addition]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition])):before{content:"+";color:var(--diffs-addition-base)}:is([data-line]:is([data-indicators=classic] [data-line-type=change-deletion]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-deletion])):before{content:"-";color:var(--diffs-deletion-base)}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion],[data-indicators=bars] [data-line-type=change-addition]):before{content:"";-webkit-user-select:none;user-select:none;contain:strict;width:4px;height:100%;display:block;position:absolute;top:0;left:0}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion]):before{background-image:linear-gradient(0deg, var(--diffs-bg-deletion) 50%, var(--diffs-deletion-base) 50%);background-repeat:repeat;background-size:2px 2px;background-size:calc(1lh/round(1lh / 2px)) calc(1lh/round(1lh / 2px))}[data-column-number]:is([data-indicators=bars] [data-line-type=change-addition]):before{background-color:var(--diffs-addition-base)}[data-overflow=wrap] [data-line],[data-overflow=wrap] [data-annotation-content]{white-space:pre-wrap;word-break:break-word}[data-overflow=scroll] [data-line]{white-space:pre;min-height:1lh}[data-column-number]{box-sizing:content-box;text-align:right;-webkit-user-select:none;user-select:none;color:var(--diffs-fg-number);padding-left:2ch}[data-line-number-content]{min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));z-index:1;display:inline-block;position:relative}[data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]{min-width:4px;padding:0}:is([data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]):before{min-width:0}[data-disable-line-numbers] [data-line-number-content]{display:none}[data-disable-line-numbers] [data-gutter-utility-slot]{right:unset;justify-content:flex-start;left:0}[data-disable-line-numbers][data-indicators=bars] [data-gutter-utility-slot]{left:6px}[data-file][data-disable-line-numbers] [data-gutter-buffer],[data-file][data-disable-line-numbers] [data-column-number]{border-right:0;min-width:0}[data-diff-span]{-webkit-box-decoration-break:clone;box-decoration-break:clone;border-radius:3px}[data-line-type=change-addition] [data-diff-span]{background-color:var(--diffs-bg-addition-emphasis)}[data-line-type=change-deletion] [data-diff-span]{background-color:var(--diffs-bg-deletion-emphasis)}[data-merge-conflict=marker-start],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator],[data-merge-conflict=marker-end]{color:var(--diffs-fg);padding-left:1ch}[data-merge-conflict=marker-start],[data-merge-conflict=marker-end]{align-items:center;display:flex}:is([data-merge-conflict=marker-start],[data-merge-conflict=marker-end]):after{color:var(--diffs-fg-conflict-marker);font-size:.75rem;font-style:normal;line-height:1.25rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));padding-left:1ch}[data-merge-conflict=marker-start]:after{content:"(Current Change)"}[data-merge-conflict=marker-end]:after{content:"(Incoming Change)"}[data-merge-conflict-actions-content]{min-height:1.75rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));color:var(--diffs-fg);align-items:center;gap:.25rem;padding-inline:.5rem;font-size:.75rem;line-height:1.2;display:flex}[data-merge-conflict-action]{appearance:none;color:var(--diffs-fg-number);font:inherit;cursor:pointer;background:0 0;border:0;padding:0;font-style:normal}[data-merge-conflict-action]:hover{color:var(--diffs-fg)}[data-merge-conflict-action=current]:hover{color:var(--diffs-addition-base)}[data-merge-conflict-action=incoming]:hover{color:var(--diffs-modified-base)}[data-merge-conflict-action-separator]{color:var(--diffs-fg-number);opacity:.6;-webkit-user-select:none;user-select:none}[data-diffs-header=default]{background-color:var(--diffs-bg);justify-content:space-between;align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));min-height:calc(1lh + var(--diffs-gap-block,var(--diffs-gap-fallback))*3);z-index:2;flex-direction:row;padding-inline:16px;display:flex;position:relative;top:0}[data-header-content]{align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));white-space:nowrap;flex-direction:row;min-width:0;display:flex}[data-header-content] [data-prev-name],[data-header-content] [data-title]{text-overflow:ellipsis;white-space:nowrap;direction:rtl;min-width:0;overflow:hidden}[data-prev-name]{opacity:.7}[data-rename-icon]{fill:currentColor;flex-grow:0;flex-shrink:0}[data-diffs-header=default] [data-metadata]{white-space:nowrap;align-items:center;gap:1ch;display:flex}[data-diffs-header=default] [data-additions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-addition-base)}[data-diffs-header=default] [data-deletions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-deletion-base)}[data-change-icon]{fill:currentColor;flex-shrink:0}[data-change-icon=change],[data-change-icon=rename-pure],[data-change-icon=rename-changed]{color:var(--diffs-modified-base)}[data-change-icon=new]{color:var(--diffs-addition-base)}[data-change-icon=deleted]{color:var(--diffs-deletion-base)}[data-change-icon=file]{opacity:.6}[data-annotation-content]{z-index:2;isolation:isolate;align-self:flex-start;min-width:0;display:flow-root;position:relative}[data-overflow=scroll] [data-annotation-content],[data-overflow=scroll] [data-merge-conflict-actions-content]{width:var(--diffs-column-content-width,auto);left:var(--diffs-column-number-width,0);position:sticky}[data-annotation-slot]{text-wrap-mode:wrap;word-break:normal;white-space-collapse:collapse}[data-gutter-utility-slot]{touch-action:none;justify-content:flex-end;display:flex;position:absolute;top:0;bottom:0;right:0}[data-utility-button]{appearance:none;cursor:pointer;width:1lh;height:1lh;font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);background-color:var(--diffs-modified-base);color:var(--diffs-bg);fill:currentColor;z-index:4;touch-action:none;border:none;border-radius:4px;justify-content:center;align-items:center;margin-right:calc(1ch - 1lh);padding:0;display:flex;position:relative}[data-utility-button]:before{content:"";display:block;position:absolute;inset:0 0 0 -4px}[data-decoration-bar-stack]{pointer-events:none;isolation:isolate;z-index:1;background-color:var(--diffs-decoration-bar-color,transparent);box-sizing:content-box;border-left:2px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg);width:6px;position:absolute;top:0;bottom:0;right:-2px}[data-decoration-bar-depth="1"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 20%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="2"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 45%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="3"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 65%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-start] [data-decoration-bar-stack]{border-top-left-radius:5px;border-top-right-radius:5px}[data-decoration-bar-end] [data-decoration-bar-stack]{z-index:3;border-bottom-right-radius:5px;border-bottom-left-radius:5px}[data-placeholder]{contain:strict}[data-error-wrapper]{padding:var(--diffs-gap-block,var(--diffs-gap-fallback)) var(--diffs-gap-inline,var(--diffs-gap-fallback));scrollbar-width:none;max-height:400px;overflow:auto}[data-error-wrapper] [data-error-message]{color:var(--diffs-deletion-base);font-size:18px;font-weight:700}[data-error-wrapper] [data-error-stack]{color:var(--diffs-fg-number)}}@layer theme,rendered,unsafe;
@layer theme {
}</style><style data-theme-css="">@layer base, theme, rendered, unsafe;
@layer rendered {
:host {
--diffs-scrollbar-gutter-measured: var(--diffs-scrollbar-gutter-fallback);
--diffs-dark:#fafafa;--diffs-dark-bg:#0a0a0a;--diffs-dark-addition-color:#07c480;--diffs-dark-deletion-color:#ff2e3f;--diffs-dark-modified-color:#009fff;--diffs-light:#0a0a0a;--diffs-light-bg:#ffffff;--diffs-light-addition-color:#18a46c;--diffs-light-deletion-color:#d52c36;--diffs-light-modified-color:#009fff;
}
}</style><div data-diffs-header="default" data-change-type="change"><div data-header-content=""><slot name="header-prefix"></slot><svg width="16" height="16" viewBox="0 0 16 16" data-change-icon="change"><use href="#diffs-icon-symbol-modified"></use></svg><div data-title=""><bdi>Tests/StreamResolverTests.swift</bdi></div></div><div data-metadata=""><span data-deletions-count="">-2</span><span data-additions-count="">+71</span><slot name="header-metadata"></slot></div></div><pre data-diff="" data-diff-type="split" data-overflow="scroll" data-background="" data-indicators="bars" tabindex="0" style="--diffs-min-number-column-width-default:3ch;" data-dehydrated=""><code data-code="" data-container-size="" data-deletions=""><div data-gutter="" style="grid-row: span 101"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">34 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="35" data-line-index="34,34"><span data-line-number-content="">35</span></div><div data-line-type="context" data-column-number="36" data-line-index="35,35"><span data-line-number-content="">36</span></div><div data-line-type="context" data-column-number="37" data-line-index="36,36"><span data-line-number-content="">37</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="38" data-line-index="38,38"><span data-line-number-content="">38</span></div><div data-line-type="context" data-column-number="39" data-line-index="39,39"><span data-line-number-content="">39</span></div><div data-gutter-buffer="buffer" data-buffer-size="2" style="grid-row: span 2;min-height:calc(2 * 1lh);"></div><div data-line-type="context" data-column-number="40" data-line-index="42,42"><span data-line-number-content="">40</span></div><div data-line-type="context" data-column-number="41" data-line-index="43,43"><span data-line-number-content="">41</span></div><div data-line-type="context" data-column-number="42" data-line-index="44,44"><span data-line-number-content="">42</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">291 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="334" data-line-index="336,336"><span data-line-number-content="">334</span></div><div data-line-type="context" data-column-number="335" data-line-index="337,337"><span data-line-number-content="">335</span></div><div data-line-type="context" data-column-number="336" data-line-index="338,338"><span data-line-number-content="">336</span></div><div data-gutter-buffer="buffer" data-buffer-size="22" style="grid-row: span 22;min-height:calc(22 * 1lh);"></div><div data-line-type="context" data-column-number="337" data-line-index="361,361"><span data-line-number-content="">337</span></div><div data-line-type="context" data-column-number="338" data-line-index="362,362"><span data-line-number-content="">338</span></div><div data-line-type="context" data-column-number="339" data-line-index="363,363"><span data-line-number-content="">339</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">28 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="368" data-line-index="392,392"><span data-line-number-content="">368</span></div><div data-line-type="context" data-column-number="369" data-line-index="393,393"><span data-line-number-content="">369</span></div><div data-line-type="context" data-column-number="370" data-line-index="394,394"><span data-line-number-content="">370</span></div><div data-gutter-buffer="buffer" data-buffer-size="44" style="grid-row: span 44;min-height:calc(44 * 1lh);"></div><div data-line-type="context" data-column-number="371" data-line-index="439,439"><span data-line-number-content="">371</span></div><div data-line-type="context" data-column-number="372" data-line-index="440,440"><span data-line-number-content="">372</span></div><div data-line-type="context" data-column-number="373" data-line-index="441,441"><span data-line-number-content="">373</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">32 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="406" data-line-index="474,474"><span data-line-number-content="">406</span></div><div data-line-type="context" data-column-number="407" data-line-index="475,475"><span data-line-number-content="">407</span></div><div data-line-type="context" data-column-number="408" data-line-index="476,476"><span data-line-number-content="">408</span></div><div data-line-type="change-deletion" data-column-number="409" data-line-index="477,477"><span data-line-number-content="">409</span></div><div data-line-type="change-deletion" data-column-number="410" data-line-index="478,478"><span data-line-number-content="">410</span></div><div data-line-type="context" data-column-number="411" data-line-index="481,479"><span data-line-number-content="">411</span></div><div data-line-type="context" data-column-number="412" data-line-index="482,480"><span data-line-number-content="">412</span></div><div data-line-type="context" data-column-number="413" data-line-index="483,481"><span data-line-number-content="">413</span></div></div><div data-content="" style="grid-row: span 101"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">34 unmodified lines</span></div></div></div><div data-line="35" data-alt-line="35" data-line-type="context" data-line-index="34,34"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSparseRangeStoreHitPartialHitAndMiss</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="36" data-alt-line="36" data-line-type="context" data-line-index="35,35"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSparseRangeStoreEvictsOutsideWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="37" data-alt-line="37" data-line-type="context" data-line-index="36,36"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSparseRangeStoreTrimsOverlappingWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="38" data-alt-line="39" data-line-type="context" data-line-index="38,38"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheSessionCapsResponseRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="39" data-alt-line="40" data-line-type="context" data-line-index="39,39"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCachePrefetchPrioritizesSeekOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-content-buffer="" data-buffer-size="2" style="grid-row: span 2;min-height:calc(2 * 1lh)"></div><div data-line="40" data-alt-line="43" data-line-type="context" data-line-index="42,42"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheForegroundMissReprioritizesPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="41" data-alt-line="44" data-line-type="context" data-line-index="43,43"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeProbeFallsBackWhenServerIgnoresRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="42" data-alt-line="45" data-line-type="context" data-line-index="44,44"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeFetcherPreservesHeaders</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">291 unmodified lines</span></div></div></div><div data-line="334" data-alt-line="337" data-line-type="context" data-line-index="336,336"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">store.data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 5</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ==</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected trimmed bytes outside the window to be evicted"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="335" data-alt-line="338" data-line-type="context" data-line-index="337,337"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="336" data-alt-line="339" data-line-type="context" data-line-index="338,338">
</div><div data-content-buffer="" data-buffer-size="22" style="grid-row: span 22;min-height:calc(22 * 1lh)"></div><div data-line="337" data-alt-line="362" data-line-type="context" data-line-index="361,361"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheSessionCapsResponseRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="338" data-alt-line="363" data-line-type="context" data-line-index="362,362"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> ProgressiveHTTPRangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="339" data-alt-line="364" data-line-type="context" data-line-index="363,363"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> fetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPRangeRemoteFetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> URL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">string</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "https://example.test/video.mkv"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)!</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, headers</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> [</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">28 unmodified lines</span></div></div></div><div data-line="368" data-alt-line="393" data-line-type="context" data-line-index="392,392"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> ])</span></div><div data-line="369" data-alt-line="394" data-line-type="context" data-line-index="393,393"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="370" data-alt-line="395" data-line-type="context" data-line-index="394,394">
</div><div data-content-buffer="" data-buffer-size="44" style="grid-row: span 44;min-height:calc(44 * 1lh)"></div><div data-line="371" data-alt-line="440" data-line-type="context" data-line-index="439,439"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheForegroundMissReprioritizesPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> async</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="372" data-alt-line="441" data-line-type="context" data-line-index="440,440"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queue </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> DispatchQueue</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">label</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "dreamio.range-cache-test"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="373" data-alt-line="442" data-line-type="context" data-line-index="441,441"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> requestedRanges: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">String</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">32 unmodified lines</span></div></div></div><div data-line="406" data-alt-line="475" data-line-type="context" data-line-index="474,474"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> ranges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queue.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sync</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> requestedRanges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">}</span></div><div data-line="407" data-alt-line="476" data-line-type="context" data-line-index="475,475"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">ranges.contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"bytes=51818977-52867552"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected foreground VLC range to be fetched"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="408" data-alt-line="477" data-line-type="context" data-line-index="476,476"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">ranges.contains </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span></div><div data-line="409" data-line-type="change-deletion" data-line-index="477,477"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range.hasPrefix</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"bytes=</span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">51936225</span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="410" data-line-type="change-deletion" data-line-index="478,478"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected prefetch to restart near VLC's foreground range, got </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">ranges</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="411" data-alt-line="480" data-line-type="context" data-line-index="481,479"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">cancelPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="412" data-alt-line="481" data-line-type="context" data-line-index="482,480"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> MockURLProtocol.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">handler</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="413" data-alt-line="482" data-line-type="context" data-line-index="483,481"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> Task.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sleep</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">nanoseconds</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 50_000_000</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div></div></code><code data-code="" data-container-size="" data-additions=""><div data-gutter="" style="grid-row: span 101"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">34 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="35" data-line-index="34,34"><span data-line-number-content="">35</span></div><div data-line-type="context" data-column-number="36" data-line-index="35,35"><span data-line-number-content="">36</span></div><div data-line-type="context" data-column-number="37" data-line-index="36,36"><span data-line-number-content="">37</span></div><div data-line-type="change-addition" data-column-number="38" data-line-index="37,37"><span data-line-number-content="">38</span></div><div data-line-type="context" data-column-number="39" data-line-index="38,38"><span data-line-number-content="">39</span></div><div data-line-type="context" data-column-number="40" data-line-index="39,39"><span data-line-number-content="">40</span></div><div data-line-type="change-addition" data-column-number="41" data-line-index="40,40"><span data-line-number-content="">41</span></div><div data-line-type="change-addition" data-column-number="42" data-line-index="41,41"><span data-line-number-content="">42</span></div><div data-line-type="context" data-column-number="43" data-line-index="42,42"><span data-line-number-content="">43</span></div><div data-line-type="context" data-column-number="44" data-line-index="43,43"><span data-line-number-content="">44</span></div><div data-line-type="context" data-column-number="45" data-line-index="44,44"><span data-line-number-content="">45</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">291 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="337" data-line-index="336,336"><span data-line-number-content="">337</span></div><div data-line-type="context" data-column-number="338" data-line-index="337,337"><span data-line-number-content="">338</span></div><div data-line-type="context" data-column-number="339" data-line-index="338,338"><span data-line-number-content="">339</span></div><div data-line-type="change-addition" data-column-number="340" data-line-index="339,339"><span data-line-number-content="">340</span></div><div data-line-type="change-addition" data-column-number="341" data-line-index="340,340"><span data-line-number-content="">341</span></div><div data-line-type="change-addition" data-column-number="342" data-line-index="341,341"><span data-line-number-content="">342</span></div><div data-line-type="change-addition" data-column-number="343" data-line-index="342,342"><span data-line-number-content="">343</span></div><div data-line-type="change-addition" data-column-number="344" data-line-index="343,343"><span data-line-number-content="">344</span></div><div data-line-type="change-addition" data-column-number="345" data-line-index="344,344"><span data-line-number-content="">345</span></div><div data-line-type="change-addition" data-column-number="346" data-line-index="345,345"><span data-line-number-content="">346</span></div><div data-line-type="change-addition" data-column-number="347" data-line-index="346,346"><span data-line-number-content="">347</span></div><div data-line-type="change-addition" data-column-number="348" data-line-index="347,347"><span data-line-number-content="">348</span></div><div data-line-type="change-addition" data-column-number="349" data-line-index="348,348"><span data-line-number-content="">349</span></div><div data-line-type="change-addition" data-column-number="350" data-line-index="349,349"><span data-line-number-content="">350</span></div><div data-line-type="change-addition" data-column-number="351" data-line-index="350,350"><span data-line-number-content="">351</span></div><div data-line-type="change-addition" data-column-number="352" data-line-index="351,351"><span data-line-number-content="">352</span></div><div data-line-type="change-addition" data-column-number="353" data-line-index="352,352"><span data-line-number-content="">353</span></div><div data-line-type="change-addition" data-column-number="354" data-line-index="353,353"><span data-line-number-content="">354</span></div><div data-line-type="change-addition" data-column-number="355" data-line-index="354,354"><span data-line-number-content="">355</span></div><div data-line-type="change-addition" data-column-number="356" data-line-index="355,355"><span data-line-number-content="">356</span></div><div data-line-type="change-addition" data-column-number="357" data-line-index="356,356"><span data-line-number-content="">357</span></div><div data-line-type="change-addition" data-column-number="358" data-line-index="357,357"><span data-line-number-content="">358</span></div><div data-line-type="change-addition" data-column-number="359" data-line-index="358,358"><span data-line-number-content="">359</span></div><div data-line-type="change-addition" data-column-number="360" data-line-index="359,359"><span data-line-number-content="">360</span></div><div data-line-type="change-addition" data-column-number="361" data-line-index="360,360"><span data-line-number-content="">361</span></div><div data-line-type="context" data-column-number="362" data-line-index="361,361"><span data-line-number-content="">362</span></div><div data-line-type="context" data-column-number="363" data-line-index="362,362"><span data-line-number-content="">363</span></div><div data-line-type="context" data-column-number="364" data-line-index="363,363"><span data-line-number-content="">364</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">28 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="393" data-line-index="392,392"><span data-line-number-content="">393</span></div><div data-line-type="context" data-column-number="394" data-line-index="393,393"><span data-line-number-content="">394</span></div><div data-line-type="context" data-column-number="395" data-line-index="394,394"><span data-line-number-content="">395</span></div><div data-line-type="change-addition" data-column-number="396" data-line-index="395,395"><span data-line-number-content="">396</span></div><div data-line-type="change-addition" data-column-number="397" data-line-index="396,396"><span data-line-number-content="">397</span></div><div data-line-type="change-addition" data-column-number="398" data-line-index="397,397"><span data-line-number-content="">398</span></div><div data-line-type="change-addition" data-column-number="399" data-line-index="398,398"><span data-line-number-content="">399</span></div><div data-line-type="change-addition" data-column-number="400" data-line-index="399,399"><span data-line-number-content="">400</span></div><div data-line-type="change-addition" data-column-number="401" data-line-index="400,400"><span data-line-number-content="">401</span></div><div data-line-type="change-addition" data-column-number="402" data-line-index="401,401"><span data-line-number-content="">402</span></div><div data-line-type="change-addition" data-column-number="403" data-line-index="402,402"><span data-line-number-content="">403</span></div><div data-line-type="change-addition" data-column-number="404" data-line-index="403,403"><span data-line-number-content="">404</span></div><div data-line-type="change-addition" data-column-number="405" data-line-index="404,404"><span data-line-number-content="">405</span></div><div data-line-type="change-addition" data-column-number="406" data-line-index="405,405"><span data-line-number-content="">406</span></div><div data-line-type="change-addition" data-column-number="407" data-line-index="406,406"><span data-line-number-content="">407</span></div><div data-line-type="change-addition" data-column-number="408" data-line-index="407,407"><span data-line-number-content="">408</span></div><div data-line-type="change-addition" data-column-number="409" data-line-index="408,408"><span data-line-number-content="">409</span></div><div data-line-type="change-addition" data-column-number="410" data-line-index="409,409"><span data-line-number-content="">410</span></div><div data-line-type="change-addition" data-column-number="411" data-line-index="410,410"><span data-line-number-content="">411</span></div><div data-line-type="change-addition" data-column-number="412" data-line-index="411,411"><span data-line-number-content="">412</span></div><div data-line-type="change-addition" data-column-number="413" data-line-index="412,412"><span data-line-number-content="">413</span></div><div data-line-type="change-addition" data-column-number="414" data-line-index="413,413"><span data-line-number-content="">414</span></div><div data-line-type="change-addition" data-column-number="415" data-line-index="414,414"><span data-line-number-content="">415</span></div><div data-line-type="change-addition" data-column-number="416" data-line-index="415,415"><span data-line-number-content="">416</span></div><div data-line-type="change-addition" data-column-number="417" data-line-index="416,416"><span data-line-number-content="">417</span></div><div data-line-type="change-addition" data-column-number="418" data-line-index="417,417"><span data-line-number-content="">418</span></div><div data-line-type="change-addition" data-column-number="419" data-line-index="418,418"><span data-line-number-content="">419</span></div><div data-line-type="change-addition" data-column-number="420" data-line-index="419,419"><span data-line-number-content="">420</span></div><div data-line-type="change-addition" data-column-number="421" data-line-index="420,420"><span data-line-number-content="">421</span></div><div data-line-type="change-addition" data-column-number="422" data-line-index="421,421"><span data-line-number-content="">422</span></div><div data-line-type="change-addition" data-column-number="423" data-line-index="422,422"><span data-line-number-content="">423</span></div><div data-line-type="change-addition" data-column-number="424" data-line-index="423,423"><span data-line-number-content="">424</span></div><div data-line-type="change-addition" data-column-number="425" data-line-index="424,424"><span data-line-number-content="">425</span></div><div data-line-type="change-addition" data-column-number="426" data-line-index="425,425"><span data-line-number-content="">426</span></div><div data-line-type="change-addition" data-column-number="427" data-line-index="426,426"><span data-line-number-content="">427</span></div><div data-line-type="change-addition" data-column-number="428" data-line-index="427,427"><span data-line-number-content="">428</span></div><div data-line-type="change-addition" data-column-number="429" data-line-index="428,428"><span data-line-number-content="">429</span></div><div data-line-type="change-addition" data-column-number="430" data-line-index="429,429"><span data-line-number-content="">430</span></div><div data-line-type="change-addition" data-column-number="431" data-line-index="430,430"><span data-line-number-content="">431</span></div><div data-line-type="change-addition" data-column-number="432" data-line-index="431,431"><span data-line-number-content="">432</span></div><div data-line-type="change-addition" data-column-number="433" data-line-index="432,432"><span data-line-number-content="">433</span></div><div data-line-type="change-addition" data-column-number="434" data-line-index="433,433"><span data-line-number-content="">434</span></div><div data-line-type="change-addition" data-column-number="435" data-line-index="434,434"><span data-line-number-content="">435</span></div><div data-line-type="change-addition" data-column-number="436" data-line-index="435,435"><span data-line-number-content="">436</span></div><div data-line-type="change-addition" data-column-number="437" data-line-index="436,436"><span data-line-number-content="">437</span></div><div data-line-type="change-addition" data-column-number="438" data-line-index="437,437"><span data-line-number-content="">438</span></div><div data-line-type="change-addition" data-column-number="439" data-line-index="438,438"><span data-line-number-content="">439</span></div><div data-line-type="context" data-column-number="440" data-line-index="439,439"><span data-line-number-content="">440</span></div><div data-line-type="context" data-column-number="441" data-line-index="440,440"><span data-line-number-content="">441</span></div><div data-line-type="context" data-column-number="442" data-line-index="441,441"><span data-line-number-content="">442</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">32 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="475" data-line-index="474,474"><span data-line-number-content="">475</span></div><div data-line-type="context" data-column-number="476" data-line-index="475,475"><span data-line-number-content="">476</span></div><div data-line-type="context" data-column-number="477" data-line-index="476,476"><span data-line-number-content="">477</span></div><div data-line-type="change-addition" data-column-number="478" data-line-index="479,477"><span data-line-number-content="">478</span></div><div data-line-type="change-addition" data-column-number="479" data-line-index="480,478"><span data-line-number-content="">479</span></div><div data-line-type="context" data-column-number="480" data-line-index="481,479"><span data-line-number-content="">480</span></div><div data-line-type="context" data-column-number="481" data-line-index="482,480"><span data-line-number-content="">481</span></div><div data-line-type="context" data-column-number="482" data-line-index="483,481"><span data-line-number-content="">482</span></div></div><div data-content="" style="grid-row: span 101"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">34 unmodified lines</span></div></div></div><div data-line="35" data-alt-line="35" data-line-type="context" data-line-index="34,34"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSparseRangeStoreHitPartialHitAndMiss</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="36" data-alt-line="36" data-line-type="context" data-line-index="35,35"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSparseRangeStoreEvictsOutsideWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="37" data-alt-line="37" data-line-type="context" data-line-index="36,36"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSparseRangeStoreTrimsOverlappingWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="38" data-line-type="change-addition" data-line-index="37,37"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSparseRangeStoreEvictsByBudgetWhilePreservingUsefulRanges</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="39" data-alt-line="38" data-line-type="context" data-line-index="38,38"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheSessionCapsResponseRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="40" data-alt-line="39" data-line-type="context" data-line-index="39,39"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCachePrefetchPrioritizesSeekOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="41" data-line-type="change-addition" data-line-index="40,40"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheSeekPrimingIncludesObservedVLCStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="42" data-line-type="change-addition" data-line-index="41,41"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCachePrefetchUsesGlobalChunkBoundaries</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="43" data-alt-line="40" data-line-type="context" data-line-index="42,42"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheForegroundMissReprioritizesPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="44" data-alt-line="41" data-line-type="context" data-line-index="43,43"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeProbeFallsBackWhenServerIgnoresRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="45" data-alt-line="42" data-line-type="context" data-line-index="44,44"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeFetcherPreservesHeaders</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">291 unmodified lines</span></div></div></div><div data-line="337" data-alt-line="334" data-line-type="context" data-line-index="336,336"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">store.data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 5</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ==</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected trimmed bytes outside the window to be evicted"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="338" data-alt-line="335" data-line-type="context" data-line-index="337,337"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="339" data-alt-line="336" data-line-type="context" data-line-index="338,338">
</div><div data-line="340" data-line-type="change-addition" data-line-index="339,339"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testSparseRangeStoreEvictsByBudgetWhilePreservingUsefulRanges</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="341" data-line-type="change-addition" data-line-index="340,340"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> SparseHTTPByteRangeStore</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="342" data-line-type="change-addition" data-line-index="341,341">
</div><div data-line="343" data-line-type="change-addition" data-line-index="342,342"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> Data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">repeating</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, count</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 4</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="344" data-line-type="change-addition" data-line-index="343,343"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> Data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">repeating</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 2</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, count</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 4</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 100</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="345" data-line-type="change-addition" data-line-index="344,344"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> Data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">repeating</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 3</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, count</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 4</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 200</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="346" data-line-type="change-addition" data-line-index="345,345">
</div><div data-line="347" data-line-type="change-addition" data-line-index="346,346"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> evicted </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">evict</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="348" data-line-type="change-addition" data-line-index="347,347"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> toByteBudget</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 8</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="349" data-line-type="change-addition" data-line-index="348,348"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> preserving</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> [</span></div><div data-line="350" data-line-type="change-addition" data-line-index="349,349"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 3</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="351" data-line-type="change-addition" data-line-index="350,350"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 190</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 210</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="352" data-line-type="change-addition" data-line-index="351,351"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> ]</span></div><div data-line="353" data-line-type="change-addition" data-line-index="352,352"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span></div><div data-line="354" data-line-type="change-addition" data-line-index="353,353">
</div><div data-line="355" data-line-type="change-addition" data-line-index="354,354"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">evicted, [HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 100</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 103</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="356" data-line-type="change-addition" data-line-index="355,355"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">store.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">cachedRanges</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, [</span></div><div data-line="357" data-line-type="change-addition" data-line-index="356,356"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 3</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="358" data-line-type="change-addition" data-line-index="357,357"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 200</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 203</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="359" data-line-type="change-addition" data-line-index="358,358"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> ]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="360" data-line-type="change-addition" data-line-index="359,359"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="361" data-line-type="change-addition" data-line-index="360,360">
</div><div data-line="362" data-alt-line="337" data-line-type="context" data-line-index="361,361"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheSessionCapsResponseRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="363" data-alt-line="338" data-line-type="context" data-line-index="362,362"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> ProgressiveHTTPRangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="364" data-alt-line="339" data-line-type="context" data-line-index="363,363"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> fetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPRangeRemoteFetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> URL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">string</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "https://example.test/video.mkv"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)!</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, headers</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> [</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">28 unmodified lines</span></div></div></div><div data-line="393" data-alt-line="368" data-line-type="context" data-line-index="392,392"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> ])</span></div><div data-line="394" data-alt-line="369" data-line-type="context" data-line-index="393,393"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="395" data-alt-line="370" data-line-type="context" data-line-index="394,394">
</div><div data-line="396" data-line-type="change-addition" data-line-index="395,395"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheSeekPrimingIncludesObservedVLCStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="397" data-line-type="change-addition" data-line-index="396,396"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> ProgressiveHTTPRangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="398" data-line-type="change-addition" data-line-index="397,397"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> fetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPRangeRemoteFetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> URL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">string</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "https://example.test/video.mkv"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)!</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, headers</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> [</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="399" data-line-type="change-addition" data-line-index="398,398"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> contentLength</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 711_080_522</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="400" data-line-type="change-addition" data-line-index="399,399"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> durationProvider</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="401" data-line-type="change-addition" data-line-index="400,400"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span></div><div data-line="402" data-line-type="change-addition" data-line-index="401,401">
</div><div data-line="403" data-line-type="change-addition" data-line-index="402,402"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> estimatedOffset: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 213_615_760</span></div><div data-line="404" data-line-type="change-addition" data-line-index="403,403"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> firstVLCRequest </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 212_942_432</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 213_991_007</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="405" data-line-type="change-addition" data-line-index="404,404"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> window </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">seekPrimeWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> estimatedOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="406" data-line-type="change-addition" data-line-index="405,405"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">prefetchChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="407" data-line-type="change-addition" data-line-index="406,406"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> in</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> window,</span></div><div data-line="408" data-line-type="change-addition" data-line-index="407,407"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> preferredOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> estimatedOffset,</span></div><div data-line="409" data-line-type="change-addition" data-line-index="408,408"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> startsAtWindowStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span></div><div data-line="410" data-line-type="change-addition" data-line-index="409,409"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span></div><div data-line="411" data-line-type="change-addition" data-line-index="410,410">
</div><div data-line="412" data-line-type="change-addition" data-line-index="411,411"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunkContainingVLCStart </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">firstIndex</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> $0</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">firstVLCRequest.start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="413" data-line-type="change-addition" data-line-index="412,412"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunkContainingEstimatedOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">firstIndex</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> $0</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">estimatedOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="414" data-line-type="change-addition" data-line-index="413,413">
</div><div data-line="415" data-line-type="change-addition" data-line-index="414,414"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">chunkContainingVLCStart </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">!=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected seek priming to include VLC's first request start"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="416" data-line-type="change-addition" data-line-index="415,415"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">chunkContainingEstimatedOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">!=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected seek priming to include the estimated offset"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="417" data-line-type="change-addition" data-line-index="416,416"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="418" data-line-type="change-addition" data-line-index="417,417"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> chunkContainingVLCStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">!</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> &#x3C;=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> chunkContainingEstimatedOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">!</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="419" data-line-type="change-addition" data-line-index="418,418"><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "Expected bytes behind the seek target to be primed before ahead chunks"</span></div><div data-line="420" data-line-type="change-addition" data-line-index="419,419"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span></div><div data-line="421" data-line-type="change-addition" data-line-index="420,420"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">chunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">chunkContainingVLCStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">!]</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 212_860_928</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 213_909_503</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="422" data-line-type="change-addition" data-line-index="421,421"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="423" data-line-type="change-addition" data-line-index="422,422">
</div><div data-line="424" data-line-type="change-addition" data-line-index="423,423"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCachePrefetchUsesGlobalChunkBoundaries</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="425" data-line-type="change-addition" data-line-index="424,424"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> ProgressiveHTTPRangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="426" data-line-type="change-addition" data-line-index="425,425"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> fetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPRangeRemoteFetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> URL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">string</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "https://example.test/video.mkv"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)!</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, headers</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> [</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="427" data-line-type="change-addition" data-line-index="426,426"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> contentLength</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 711_080_522</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="428" data-line-type="change-addition" data-line-index="427,427"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> durationProvider</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="429" data-line-type="change-addition" data-line-index="428,428"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span></div><div data-line="430" data-line-type="change-addition" data-line-index="429,429">
</div><div data-line="431" data-line-type="change-addition" data-line-index="430,430"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">prefetchChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="432" data-line-type="change-addition" data-line-index="431,431"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> in</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 213_278_260</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 216_000_000</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="433" data-line-type="change-addition" data-line-index="432,432"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> preferredOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 213_615_760</span></div><div data-line="434" data-line-type="change-addition" data-line-index="433,433"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span></div><div data-line="435" data-line-type="change-addition" data-line-index="434,434">
</div><div data-line="436" data-line-type="change-addition" data-line-index="435,435"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">chunks.allSatisfy </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> $0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.start </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">%</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1_048_576</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ==</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected prefetch chunk starts to use stable global 1 MB boundaries: </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">chunks</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="437" data-line-type="change-addition" data-line-index="436,436"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">chunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 212_860_928</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 213_909_503</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="438" data-line-type="change-addition" data-line-index="437,437"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="439" data-line-type="change-addition" data-line-index="438,438">
</div><div data-line="440" data-alt-line="371" data-line-type="context" data-line-index="439,439"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheForegroundMissReprioritizesPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> async</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="441" data-alt-line="372" data-line-type="context" data-line-index="440,440"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queue </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> DispatchQueue</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">label</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "dreamio.range-cache-test"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="442" data-alt-line="373" data-line-type="context" data-line-index="441,441"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> requestedRanges: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">String</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">32 unmodified lines</span></div></div></div><div data-line="475" data-alt-line="406" data-line-type="context" data-line-index="474,474"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> ranges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queue.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sync</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> requestedRanges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">}</span></div><div data-line="476" data-alt-line="407" data-line-type="context" data-line-index="475,475"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">ranges.contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"bytes=51818977-52867552"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected foreground VLC range to be fetched"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="477" data-alt-line="408" data-line-type="context" data-line-index="476,476"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">ranges.contains </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span></div><div data-line="478" data-line-type="change-addition" data-line-index="479,477"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range.hasPrefix</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"bytes=</span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">52428800</span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="479" data-line-type="change-addition" data-line-index="480,478"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected prefetch to restart </span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">on a global chunk boundary </span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">near VLC's foreground range, got </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">ranges</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="480" data-alt-line="411" data-line-type="context" data-line-index="481,479"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">cancelPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="481" data-alt-line="412" data-line-type="context" data-line-index="482,480"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> MockURLProtocol.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">handler</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="482" data-alt-line="413" data-line-type="context" data-line-index="483,481"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> Task.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sleep</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">nanoseconds</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 50_000_000</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div></div></code></pre></section></section>
<section class="panel"><h2>Expected Impact for End-Users</h2><p>Short backward or forward skips in MKV/direct-file playback should resume with fewer full foreground misses, especially when VLC asks slightly before Dreamios estimated byte position.</p></section>
<section class="panel"><h2>Validation</h2><ul><li>Ran <code>swiftc -parse-as-library Tests/StreamResolverTests.swift Dreamio/StreamCandidate.swift Dreamio/StreamResolver.swift Dreamio/ProgressiveHTTPRangeCache.swift Dreamio/ExternalSubtitleTrackParser.swift -o /tmp/StreamResolverTests &amp;&amp; /tmp/StreamResolverTests</code>: passed.</li><li>Ran <code>DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer xcodebuild -workspace Dreamio.xcworkspace -scheme Dreamio -configuration Debug -sdk iphonesimulator build</code>: passed.</li></ul></section>
<section class="panel"><h2>Issues, Limitations, and Mitigations</h2><ul><li>No device playback check was run in this turn, so real MobileVLCKit timing still needs confirmation on hardware.</li><li>The cache remains memory-only. The 64 MB budget limits growth while retaining the ranges most likely to matter after seeks and MKV index probes.</li><li>The existing MobileVLCKit/OpenGLES warning is treated as internal unless it persists after the main-actor cleanup.</li></ul></section>
<section class="panel"><h2>Follow-up Work</h2><ul><li>Manually test MKV skip behavior on device and compare DEBUG logs for post-seek <code>hit</code>, <code>partial-miss</code>, and <code>uncached</code> reads.</li><li>Consider exposing cache budget tuning if device memory pressure shows up in longer playback sessions.</li><li>Track any persistent VLCOpenGLES2VideoView warnings separately with device logs if they continue.</li></ul></section>
<section class="panel"><h2>New Changes as of 2026-05-26 00:40 EDT</h2><h3>Summary of changes</h3><p>Adjusted the cache to follow VLC's actual foreground read area even when those reads are hits, and changed foreground partial misses to fetch stable aligned chunks synchronously.</p><h3>Why this change was made</h3><p>Device logs showed a backward jump estimating byte <code>15936567</code>, while VLC continued reading from about <code>27165812</code> through the warmed cache. Because those reads were hits, prefetch stayed near the estimate until VLC reached the cache edge and began partial misses.</p><h3>Code diffs</h3><section class="diff-file"><h3>Dreamio/ProgressiveHTTPRangeCache.swift</h3><svg data-icon-sprite aria-hidden="true" width="0" height="0">
<symbol id="diffs-icon-arrow-right-short" viewBox="0 0 16 16">
<path d="M8.47 4.22a.75.75 0 0 0 0 1.06l1.97 1.97H3.75a.75.75 0 0 0 0 1.5h6.69l-1.97 1.97a.75.75 0 1 0 1.06 1.06l3.25-3.25a.75.75 0 0 0 0-1.06L9.53 4.22a.75.75 0 0 0-1.06 0"/>
</symbol>
<symbol id="diffs-icon-brand-github" viewBox="0 0 16 16">
<path d="M8 0c4.42 0 8 3.58 8 8a8.01 8.01 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27s-1.36.09-2 .27c-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8"/>
</symbol>
<symbol id="diffs-icon-chevron" viewBox="0 0 16 16">
<path d="M1.47 4.47a.75.75 0 0 1 1.06 0L8 9.94l5.47-5.47a.75.75 0 1 1 1.06 1.06l-6 6a.75.75 0 0 1-1.06 0l-6-6a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-chevrons-narrow" viewBox="0 0 10 16">
<path d="M4.47 2.22a.75.75 0 0 1 1.06 0l3.25 3.25a.75.75 0 0 1-1.06 1.06L5 3.81 2.28 6.53a.75.75 0 0 1-1.06-1.06zM1.22 9.47a.75.75 0 0 1 1.06 0L5 12.19l2.72-2.72a.75.75 0 0 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0l-3.25-3.25a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-diff-split" viewBox="0 0 16 16">
<path d="M14 0H8.5v16H14a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2m-1.5 6.5v1h1a.5.5 0 0 1 0 1h-1v1a.5.5 0 0 1-1 0v-1h-1a.5.5 0 0 1 0-1h1v-1a.5.5 0 0 1 1 0"/><path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h5.5V0zm.5 7.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1 0-1" opacity=".3"/>
</symbol>
<symbol id="diffs-icon-diff-unified" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M16 14a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V8.5h16zm-8-4a.5.5 0 0 0-.5.5v1h-1a.5.5 0 0 0 0 1h1v1a.5.5 0 0 0 1 0v-1h1a.5.5 0 0 0 0-1h-1v-1A.5.5 0 0 0 8 10" clip-rule="evenodd"/><path fill-rule="evenodd" d="M14 0a2 2 0 0 1 2 2v5.5H0V2a2 2 0 0 1 2-2zM6.5 3.5a.5.5 0 0 0 0 1h3a.5.5 0 0 0 0-1z" clip-rule="evenodd" opacity=".4"/>
</symbol>
<symbol id="diffs-icon-expand" viewBox="0 0 16 16">
<path d="M3.47 5.47a.75.75 0 0 1 1.06 0L8 8.94l3.47-3.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-expand-all" viewBox="0 0 16 16">
<path d="M11.47 9.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 1 1 1.06-1.06L8 12.94zM7.526 1.418a.75.75 0 0 1 1.004.052l4 4a.75.75 0 1 1-1.06 1.06L8 3.06 4.53 6.53a.75.75 0 1 1-1.06-1.06l4-4z"/>
</symbol>
<symbol id="diffs-icon-file-code" viewBox="0 0 16 16">
<path d="M10.75 0c.199 0 .39.08.53.22l3.5 3.5c.14.14.22.331.22.53v9A2.75 2.75 0 0 1 12.25 16h-8.5A2.75 2.75 0 0 1 1 13.25V2.75A2.75 2.75 0 0 1 3.75 0zm-7 1.5c-.69 0-1.25.56-1.25 1.25v10.5c0 .69.56 1.25 1.25 1.25h8.5c.69 0 1.25-.56 1.25-1.25V5h-1.25A2.25 2.25 0 0 1 10 2.75V1.5z"/><path d="M7.248 6.19a.75.75 0 0 1 .063 1.058L5.753 9l1.558 1.752a.75.75 0 0 1-1.122.996l-2-2.25a.75.75 0 0 1 0-.996l2-2.25a.75.75 0 0 1 1.06-.063M8.69 7.248a.75.75 0 1 1 1.12-.996l2 2.25a.75.75 0 0 1 0 .996l-2 2.25a.75.75 0 1 1-1.12-.996L10.245 9z"/>
</symbol>
<symbol id="diffs-icon-plus" viewBox="0 0 16 16">
<path d="M8 3a.75.75 0 0 1 .75.75v3.5h3.5a.75.75 0 0 1 0 1.5h-3.5v3.5a.75.75 0 0 1-1.5 0v-3.5h-3.5a.75.75 0 0 1 0-1.5h3.5v-3.5A.75.75 0 0 1 8 3"/>
</symbol>
<symbol id="diffs-icon-symbol-added" viewBox="0 0 16 16">
<path d="M8 4a.75.75 0 0 1 .75.75v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5A.75.75 0 0 1 8 4"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
</symbol>
<symbol id="diffs-icon-symbol-deleted" viewBox="0 0 16 16">
<path d="M4 8a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5A.75.75 0 0 1 4 8"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
</symbol>
<symbol id="diffs-icon-symbol-diffstat" viewBox="0 0 16 16">
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.75 4.296a.75.75 0 0 0-1.5 0V6.25h-2a.75.75 0 0 0 0 1.5h2v1.5h1.5v-1.5h2a.75.75 0 0 0 0-1.5h-2zM5.25 10a.75.75 0 0 0 0 1.5h5.5a.75.75 0 0 0 0-1.5z"/>
</symbol>
<symbol id="diffs-icon-symbol-ignored" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m11.53-2.47a.75.75 0 0 0-1.06-1.06l-6 6a.75.75 0 1 0 1.06 1.06z"/>
</symbol>
<symbol id="diffs-icon-symbol-modified" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m8 3a3 3 0 1 0 0-6 3 3 0 0 0 0 6"/>
</symbol>
<symbol id="diffs-icon-symbol-moved" viewBox="0 0 16 16">
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.495 4.695a.75.75 0 0 0-.05 1.06L10.486 8l-2.041 2.246a.75.75 0 0 0 1.11 1.008l2.5-2.75a.75.75 0 0 0 0-1.008l-2.5-2.75a.75.75 0 0 0-1.06-.051m-4 0a.75.75 0 0 0-.05 1.06l2.044 2.248-1.796 1.995a.75.75 0 0 0 1.114 1.004l2.25-2.5a.75.75 0 0 0-.002-1.007l-2.5-2.75a.75.75 0 0 0-1.06-.05"/>
</symbol>
<symbol id="diffs-icon-symbol-ref" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706.286.286.71.54 1.41.73V1.86c-.7.19-1.124.444-1.41.73-.324.325-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8m4 6.397c.697.07 1.522.103 2.5.103 1.613 0 2.806-.088 3.704-.288.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5c-.978 0-1.803.033-2.5.103zM0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m7-2a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1z"/>
</symbol>
</svg><style data-core-css="">@layer base, theme, rendered, unsafe;
@layer base,theme,rendered,unsafe;@layer base{:host{--diffs-font-fallback:"SF Mono", Monaco, Consolas, "Ubuntu Mono", "Liberation Mono", "Courier New", monospace;--diffs-header-font-fallback:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif;--diffs-mixer:light-dark(#000,#fff);--diffs-gap-fallback:8px;--diffs-scrollbar-gutter-fallback:6px;--diffs-scrollbar-gutter:var(--diffs-scrollbar-gutter-override,var(--diffs-scrollbar-gutter-measured,var(--diffs-scrollbar-gutter-fallback)));--diffs-added-light:#0dbe4e;--diffs-added-dark:#5ecc71;--diffs-modified-light:#009fff;--diffs-modified-dark:#69b1ff;--diffs-deleted-light:#ff2e3f;--diffs-deleted-dark:#ff6762;color-scheme:light dark;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);font-feature-settings:var(--diffs-font-features);--diffs-bg:light-dark(var(--diffs-light-bg,#fff),var(--diffs-dark-bg,#000));--diffs-bg-buffer:var(--diffs-bg-buffer-override,light-dark(color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer))));--diffs-bg-context:var(--diffs-bg-context-override,light-dark(color-mix(in lab, var(--diffs-bg) 98.5%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92.5%, var(--diffs-mixer))));--diffs-bg-context-gutter:var(--diffs-bg-context-gutter-override,light-dark(color-mix(in lab, var(--diffs-bg-context) 90%, var(--diffs-bg)),color-mix(in lab, var(--diffs-bg-context) 45%, var(--diffs-bg))));--diffs-bg-separator:var(--diffs-bg-separator-override,light-dark(color-mix(in lab, var(--diffs-bg) 96%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-mixer))));--diffs-fg:light-dark(var(--diffs-light,#000),var(--diffs-dark,#fff));--diffs-fg-number:var(--diffs-fg-number-override,light-dark(color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg)),color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg))));--diffs-fg-conflict-marker:var(--diffs-fg-conflict-marker-override,var(--diffs-fg-number));--diffs-deletion-base:var(--diffs-deletion-color-override,light-dark(var(--diffs-light-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-light))),var(--diffs-dark-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-dark)))));--diffs-addition-base:var(--diffs-addition-color-override,light-dark(var(--diffs-light-addition-color,var(--diffs-addition-color,var(--diffs-added-light))),var(--diffs-dark-addition-color,var(--diffs-addition-color,var(--diffs-added-dark)))));--diffs-modified-base:var(--diffs-modified-color-override,light-dark(var(--diffs-light-modified-color,var(--diffs-modified-color,var(--diffs-modified-light))),var(--diffs-dark-modified-color,var(--diffs-modified-color,var(--diffs-modified-dark)))));--diffs-bg-deletion:var(--diffs-bg-deletion-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-deletion-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base))));--diffs-bg-deletion-emphasis:var(--diffs-bg-deletion-emphasis-override,light-dark(rgb(from var(--diffs-deletion-base) r g b / .15),rgb(from var(--diffs-deletion-base) r g b / .2)));--diffs-bg-addition:var(--diffs-bg-addition-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-addition-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base))));--diffs-bg-addition-emphasis:var(--diffs-bg-addition-emphasis-override,light-dark(rgb(from var(--diffs-addition-base) r g b / .15),rgb(from var(--diffs-addition-base) r g b / .2)));--diffs-selection-base:var(--diffs-modified-base);--diffs-selection-number-fg:light-dark(color-mix(in lab, var(--diffs-selection-base) 65%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-selection-base) 75%, var(--diffs-mixer)));background-color:var(--diffs-bg);color:var(--diffs-fg);display:block}pre,code,[data-error-wrapper]{isolation:isolate;font-family:var(--diffs-font-family,var(--diffs-font-fallback));outline:none;margin:0;padding:0;display:block}pre,code{background-color:var(--diffs-bg)}code{contain:content}*,:before,:after{box-sizing:border-box}[data-icon-sprite]{display:none}[data-diffs-header],[data-separator]{font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback))}[data-diffs-header][data-sticky]{z-index:1;background-color:var(--diffs-bg);position:sticky;top:0}[data-file-info]{color:var(--fg);background-color:color-mix(in lab, var(--bg) 98%, var(--fg));border-block:1px solid color-mix(in lab, var(--bg) 95%, var(--fg));padding:10px;font-weight:700}[data-diff],[data-file]{--diffs-grid-number-column-width:minmax(min-content, max-content);--diffs-code-grid:var(--diffs-grid-number-column-width) 1fr}[data-dehydrated]:is([data-diff],[data-file]){--diffs-code-grid:var(--diffs-grid-number-column-width) minmax(0, 1fr)}:is([data-diff],[data-file]):hover [data-code]::-webkit-scrollbar-thumb{background-color:var(--diffs-bg-context)}@supports (-webkit-touch-callout:none){:host{--diffs-scrollbar-gutter-fallback:0px}}[data-line] span{color:light-dark(var(--diffs-token-light,var(--diffs-light)),var(--diffs-token-dark,var(--diffs-dark)));background-color:light-dark(var(--diffs-token-light-bg,inherit),var(--diffs-token-dark-bg,inherit));font-weight:light-dark(var(--diffs-token-light-font-weight,inherit),var(--diffs-token-dark-font-weight,inherit));font-style:light-dark(var(--diffs-token-light-font-style,inherit),var(--diffs-token-dark-font-style,inherit));-webkit-text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit));text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit))}[data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);color:var(--diffs-fg);background-color:var(--diffs-line-bg,var(--diffs-bg))}@media (pointer:fine){:is([data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]):where([data-hovered]){--diffs-computed-hovered-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-selected-line-bg) 97%, var(--diffs-bg-hover-override,var(--diffs-mixer))),color-mix(in lab, var(--diffs-computed-selected-line-bg) 91%, var(--diffs-bg-hover-override,var(--diffs-mixer))));--diffs-line-bg:var(--diffs-computed-hovered-line-bg,inherit)}}[data-decoration-bg]:is([data-line],[data-no-newline]){--mix-deco-light:92%;--mix-deco-dark:85%}[data-decoration-bg][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]){--mix-deco-light:88%;--mix-deco-dark:80%}[data-decoration-bg][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]){--mix-deco-light:85%;--mix-deco-dark:78%}@media (pointer:fine){[data-decoration-bg][data-hovered]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:85%;--mix-deco-dark:85%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:83%;--mix-deco-dark:83%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:81%;--mix-deco-dark:81%}}[data-decoration-bg]:is([data-line],[data-no-newline]){--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) var(--mix-deco-light), var(--diffs-decoration-bg)),color-mix(in lab, var(--diffs-bg) var(--mix-deco-dark), var(--diffs-decoration-bg)));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-line-annotation],[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context);--diffs-computed-decoration-bg:var(--diffs-annotation-bg);--diffs-computed-diff-line-bg:var(--diffs-annotation-bg);--diffs-computed-selected-line-bg:var(--diffs-annotation-bg);--diffs-line-bg:var(--diffs-annotation-bg)}[data-merge-conflict-actions],[data-gutter-buffer=merge-conflict-action],[data-gutter-buffer=merge-conflict-marker-base],[data-gutter-buffer=merge-conflict-marker-separator],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator]{--diffs-computed-decoration-bg:var(--diffs-bg-context);--diffs-computed-diff-line-bg:var(--diffs-bg-context);--diffs-computed-selected-line-bg:var(--diffs-bg-context);--diffs-line-bg:var(--diffs-bg-context)}[data-gutter-buffer=merge-conflict-marker-start],[data-merge-conflict=marker-start]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-gutter-buffer=merge-conflict-marker-end],[data-merge-conflict=marker-end]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-has-merge-conflict] [data-line-annotation],[data-has-merge-conflict] [data-gutter-buffer=annotation]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);--diffs-line-bg:var(--diffs-bg)}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number]{--mix-light:91%;--mix-dark:85%}:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--mix-light:88%;--mix-dark:80%}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--diffs-diff-line-mix-target:var(--diffs-bg)}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-deletion-override,var(--diffs-deletion-base))}@media (pointer:fine){[data-line-type=change-deletion][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:75%}}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-deletion-override,var(--diffs-deletion-base));--diffs-diff-line-mix-target:var(--diffs-bg-deletion-number-override,var(--diffs-deletion-base))}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-addition-override,var(--diffs-addition-base))}@media (pointer:fine){[data-line-type=change-addition][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--diffs-bg-addition-number-override,var(--diffs-addition-base))}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-current-override,var(--diffs-addition-base))}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--conflict-bg-current-number-override,var(--diffs-addition-base))}@media (pointer:fine){[data-merge-conflict=current][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-incoming-override,var(--diffs-modified-base))}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-modified-base);--diffs-diff-line-mix-target:var(--conflict-bg-incoming-number-override,var(--diffs-modified-base))}@media (pointer:fine){[data-merge-conflict=incoming][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]{--diffs-selection-mix-target:var(--diffs-bg-selection-override,var(--diffs-selection-base))}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--mix-selection-light:82%;--mix-selection-dark:75%}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:75%;--mix-selection-dark:70%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]){--mix-selection-light:75%;--mix-selection-dark:60%;--diffs-selection-mix-target:var(--diffs-bg-selection-number-override,var(--diffs-selection-base))}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:70%;--mix-selection-dark:55%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--diffs-computed-selected-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-light), var(--diffs-selection-mix-target)),color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-dark), var(--diffs-selection-mix-target)));--diffs-line-bg:var(--diffs-computed-selected-line-bg,inherit)}[data-selected-line]:is([data-gutter-buffer],[data-column-number]){color:var(--diffs-selection-number-fg)}[data-no-newline]{-webkit-user-select:none;user-select:none}[data-no-newline] span{opacity:.6}[data-diff-type=split][data-overflow=scroll]{grid-template-columns:1fr 1fr;display:grid}[data-diff-type=split][data-overflow=scroll] [data-additions]{border-left:1px solid var(--diffs-bg)}[data-diff-type=split][data-overflow=scroll] [data-deletions]{border-right:1px solid var(--diffs-bg)}[data-code]{grid-auto-flow:dense;grid-template-columns:var(--diffs-code-grid);overflow:var(--diffs-overflow-override,scroll) clip;overscroll-behavior-x:none;tab-size:var(--diffs-tab-size,2);padding-top:var(--diffs-gap-block,var(--diffs-gap-fallback));padding-bottom:max(0px, calc(var(--diffs-gap-block,var(--diffs-gap-fallback)) - var(--diffs-scrollbar-gutter)));scrollbar-gutter:stable;align-self:flex-start;display:grid}[data-diffs-scrollbar-measure]{opacity:0;pointer-events:none;scrollbar-gutter:auto;grid-template-columns:none;width:100px;height:100px;padding:0;position:absolute;top:-200px;left:-200px}[data-container-size]{container-type:inline-size}[data-code]::-webkit-scrollbar{width:0;height:var(--diffs-scrollbar-gutter)}[data-code]::-webkit-scrollbar-track{background:0 0}[data-code]::-webkit-scrollbar-thumb{background-color:#0000;background-clip:content-box;border:1px solid #0000;border-radius:3px}[data-code]::-webkit-scrollbar-corner{background-color:#0000}@supports ((-moz-appearance:none)){[data-code]{scrollbar-width:thin;scrollbar-color:var(--diffs-bg-context) transparent;padding-bottom:var(--diffs-gap-block,var(--diffs-gap-fallback))}}:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]) [data-code],[data-overflow=wrap]:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]){padding-top:0}[data-gutter]{grid-template-rows:subgrid;grid-template-columns:subgrid;z-index:3;background-color:var(--diffs-bg);grid-column:1;display:grid;position:relative}[data-gutter] [data-gutter-buffer],[data-gutter] [data-column-number]{border-right:var(--diffs-gap-style,2px solid var(--diffs-bg))}[data-content]{grid-template-rows:subgrid;grid-template-columns:subgrid;background-color:var(--diffs-bg);grid-column:2;min-width:0;display:grid}[data-diff-type=split][data-overflow=wrap]{grid-auto-flow:dense;grid-template-columns:repeat(2, var(--diffs-code-grid));padding-block:var(--diffs-gap-block,var(--diffs-gap-fallback));display:grid}[data-diff-type=split][data-overflow=wrap] [data-deletions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-gutter]{grid-column:1}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-content]{border-right:1px solid var(--diffs-bg);grid-column:2}[data-diff-type=split][data-overflow=wrap] [data-additions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-gutter]{border-left:1px solid var(--diffs-bg);grid-column:3}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-content]{grid-column:4}[data-overflow=scroll] [data-gutter]{position:sticky;left:0}[data-interactive-lines] [data-line]{cursor:pointer}[data-interactive-line-numbers] [data-column-number]{cursor:pointer;touch-action:none}[data-content-buffer],[data-gutter-buffer]{-webkit-user-select:none;user-select:none;min-height:1lh;position:relative}[data-gutter-buffer]{padding-left:2ch;padding-right:1ch}[data-gutter-buffer]:before{content:"";min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));display:block}[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context-gutter);min-height:0}[data-gutter-buffer=buffer]{--diffs-line-bg:var(--diffs-bg-context-gutter)}[data-content-buffer]{background-position:5px 0;background-size:8px 8px;background-origin:border-box;background-image:repeating-linear-gradient(-45deg, transparent, transparent 4.242px, var(--diffs-bg-buffer) 4.242px, var(--diffs-bg-buffer) 5.656px);grid-column:1}[data-separator]{box-sizing:content-box;background-color:var(--diffs-bg)}[data-separator=simple]{min-height:4px}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata],[data-separator=simple]{background-color:var(--diffs-bg-separator)}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata]{height:32px;position:relative}[data-separator-wrapper]{-webkit-user-select:none;user-select:none;fill:currentColor;background-color:var(--diffs-bg);align-items:center;height:100%;display:flex;position:absolute;inset-inline:0}[data-content] [data-separator-wrapper]{display:none}[data-separator=metadata] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;color:var(--diffs-fg-number);white-space:nowrap;text-overflow:ellipsis;min-width:min-content;padding-inline:1ch;inset-inline:100% auto;overflow:hidden}[data-separator=line-info]{margin-block:var(--diffs-gap-block,var(--diffs-gap-fallback))}[data-separator=line-info] [data-separator-wrapper]{min-width:16px}[data-separator=line-info-basic],[data-separator=metadata]{margin-block:0}[data-separator=line-info][data-separator-first]{margin-top:0}[data-separator=line-info][data-separator-last]{margin-bottom:0}[data-expand-index] [data-separator-wrapper]{grid-template-columns:32px auto;display:grid}[data-expand-index] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:32px 32px auto}[data-expand-button],[data-separator-content]{background-color:var(--diffs-bg-separator);flex:none;align-items:center;display:flex}[data-expand-index] [data-separator-content]:hover{cursor:pointer;text-decoration:underline}[data-expand-button]{cursor:pointer;min-width:32px;color:var(--diffs-fg-number);border-right:2px solid var(--diffs-bg);flex-shrink:0;justify-content:center;align-self:stretch}[data-expand-button]:hover{color:var(--diffs-fg)}[data-expand-button][data-expand-all-button]{display:none}[data-expand-down] [data-icon]{transform:scaleY(-1)}[data-separator-content]{height:100%;color:var(--diffs-fg-number);flex:auto;justify-content:flex-start;padding:0 1ch;overflow:hidden}:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-content]{-webkit-user-select:none;user-select:none;height:100%;overflow:clip}[data-unmodified-lines]{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;display:block;overflow:hidden}@supports (width:1cqi){[data-unified] [data-separator=line-info] [data-separator-wrapper]{padding-inline:var(--diffs-gap-inline,var(--diffs-gap-fallback));width:100cqi}:is([data-unified] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content]{border-radius:6px}[data-unified] [data-separator=line-info][data-expand-index] [data-separator-wrapper] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-gutter] [data-separator=line-info] [data-separator-wrapper]{padding-left:var(--diffs-gap-inline,var(--diffs-gap-fallback))}[data-gutter] [data-separator=line-info] [data-separator-content]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-gutter] [data-separator=line-info][data-expand-index] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-additions] [data-content] [data-separator=line-info]{background-color:var(--diffs-bg)}:is([data-additions] [data-content] [data-separator=line-info]) [data-separator-wrapper]{display:none}[data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);border-top-right-radius:6px;border-bottom-right-radius:6px;height:100%;display:block}:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}[data-overflow=scroll] [data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{width:calc(100cqi - var(--diffs-gap-inline,var(--diffs-gap-fallback)))}[data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;margin-right:var(--diffs-gap-inline,var(--diffs-gap-fallback));border-top-right-radius:6px;border-bottom-right-radius:6px;display:block}:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}@media (pointer:fine){[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:unset}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:6px;border-top-left-radius:unset}}}@media (pointer:coarse){[data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px 34px auto}:is([data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]) [data-separator-content]{grid-column:unset;grid-row:unset}@supports (width:1cqi){:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up],[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:unset;border-top-left-radius:unset}}}@media (pointer:fine){[data-separator-wrapper][data-separator-multi-button]{grid-template-rows:50% 50%;display:grid}[data-separator-wrapper][data-separator-multi-button] [data-separator-content]{grid-area:1/2/-1;min-width:min-content}[data-separator-wrapper][data-separator-multi-button] [data-expand-button]{grid-column:1}[data-separator=line-info] [data-separator-wrapper],[data-separator=line-info] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px auto}[data-separator=line-info-basic][data-expand-index] [data-separator-wrapper]{grid-template-columns:100% auto}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-up]{border-bottom:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-down]{border-top:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}}[data-additions] [data-gutter] [data-separator-wrapper],[data-additions] [data-separator=line-info-basic] [data-separator-wrapper],[data-content] [data-separator-wrapper]{display:none}[data-line-annotation]{min-height:var(--diffs-annotation-min-height,0);z-index:2}[data-merge-conflict-actions]{z-index:2}[data-separator=custom]{grid-template-columns:subgrid;display:grid}[data-line],[data-column-number],[data-no-newline]{padding-inline:1ch;position:relative}[data-indicators=classic] [data-line]{padding-inline-start:2ch}:is([data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion]),[data-line]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion])):before{-webkit-user-select:none;user-select:none;width:1ch;height:1lh;display:inline-block;position:absolute;top:0;left:0}:is([data-line]:is([data-indicators=classic] [data-line-type=change-addition]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition])):before{content:"+";color:var(--diffs-addition-base)}:is([data-line]:is([data-indicators=classic] [data-line-type=change-deletion]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-deletion])):before{content:"-";color:var(--diffs-deletion-base)}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion],[data-indicators=bars] [data-line-type=change-addition]):before{content:"";-webkit-user-select:none;user-select:none;contain:strict;width:4px;height:100%;display:block;position:absolute;top:0;left:0}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion]):before{background-image:linear-gradient(0deg, var(--diffs-bg-deletion) 50%, var(--diffs-deletion-base) 50%);background-repeat:repeat;background-size:2px 2px;background-size:calc(1lh/round(1lh / 2px)) calc(1lh/round(1lh / 2px))}[data-column-number]:is([data-indicators=bars] [data-line-type=change-addition]):before{background-color:var(--diffs-addition-base)}[data-overflow=wrap] [data-line],[data-overflow=wrap] [data-annotation-content]{white-space:pre-wrap;word-break:break-word}[data-overflow=scroll] [data-line]{white-space:pre;min-height:1lh}[data-column-number]{box-sizing:content-box;text-align:right;-webkit-user-select:none;user-select:none;color:var(--diffs-fg-number);padding-left:2ch}[data-line-number-content]{min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));z-index:1;display:inline-block;position:relative}[data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]{min-width:4px;padding:0}:is([data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]):before{min-width:0}[data-disable-line-numbers] [data-line-number-content]{display:none}[data-disable-line-numbers] [data-gutter-utility-slot]{right:unset;justify-content:flex-start;left:0}[data-disable-line-numbers][data-indicators=bars] [data-gutter-utility-slot]{left:6px}[data-file][data-disable-line-numbers] [data-gutter-buffer],[data-file][data-disable-line-numbers] [data-column-number]{border-right:0;min-width:0}[data-diff-span]{-webkit-box-decoration-break:clone;box-decoration-break:clone;border-radius:3px}[data-line-type=change-addition] [data-diff-span]{background-color:var(--diffs-bg-addition-emphasis)}[data-line-type=change-deletion] [data-diff-span]{background-color:var(--diffs-bg-deletion-emphasis)}[data-merge-conflict=marker-start],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator],[data-merge-conflict=marker-end]{color:var(--diffs-fg);padding-left:1ch}[data-merge-conflict=marker-start],[data-merge-conflict=marker-end]{align-items:center;display:flex}:is([data-merge-conflict=marker-start],[data-merge-conflict=marker-end]):after{color:var(--diffs-fg-conflict-marker);font-size:.75rem;font-style:normal;line-height:1.25rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));padding-left:1ch}[data-merge-conflict=marker-start]:after{content:"(Current Change)"}[data-merge-conflict=marker-end]:after{content:"(Incoming Change)"}[data-merge-conflict-actions-content]{min-height:1.75rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));color:var(--diffs-fg);align-items:center;gap:.25rem;padding-inline:.5rem;font-size:.75rem;line-height:1.2;display:flex}[data-merge-conflict-action]{appearance:none;color:var(--diffs-fg-number);font:inherit;cursor:pointer;background:0 0;border:0;padding:0;font-style:normal}[data-merge-conflict-action]:hover{color:var(--diffs-fg)}[data-merge-conflict-action=current]:hover{color:var(--diffs-addition-base)}[data-merge-conflict-action=incoming]:hover{color:var(--diffs-modified-base)}[data-merge-conflict-action-separator]{color:var(--diffs-fg-number);opacity:.6;-webkit-user-select:none;user-select:none}[data-diffs-header=default]{background-color:var(--diffs-bg);justify-content:space-between;align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));min-height:calc(1lh + var(--diffs-gap-block,var(--diffs-gap-fallback))*3);z-index:2;flex-direction:row;padding-inline:16px;display:flex;position:relative;top:0}[data-header-content]{align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));white-space:nowrap;flex-direction:row;min-width:0;display:flex}[data-header-content] [data-prev-name],[data-header-content] [data-title]{text-overflow:ellipsis;white-space:nowrap;direction:rtl;min-width:0;overflow:hidden}[data-prev-name]{opacity:.7}[data-rename-icon]{fill:currentColor;flex-grow:0;flex-shrink:0}[data-diffs-header=default] [data-metadata]{white-space:nowrap;align-items:center;gap:1ch;display:flex}[data-diffs-header=default] [data-additions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-addition-base)}[data-diffs-header=default] [data-deletions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-deletion-base)}[data-change-icon]{fill:currentColor;flex-shrink:0}[data-change-icon=change],[data-change-icon=rename-pure],[data-change-icon=rename-changed]{color:var(--diffs-modified-base)}[data-change-icon=new]{color:var(--diffs-addition-base)}[data-change-icon=deleted]{color:var(--diffs-deletion-base)}[data-change-icon=file]{opacity:.6}[data-annotation-content]{z-index:2;isolation:isolate;align-self:flex-start;min-width:0;display:flow-root;position:relative}[data-overflow=scroll] [data-annotation-content],[data-overflow=scroll] [data-merge-conflict-actions-content]{width:var(--diffs-column-content-width,auto);left:var(--diffs-column-number-width,0);position:sticky}[data-annotation-slot]{text-wrap-mode:wrap;word-break:normal;white-space-collapse:collapse}[data-gutter-utility-slot]{touch-action:none;justify-content:flex-end;display:flex;position:absolute;top:0;bottom:0;right:0}[data-utility-button]{appearance:none;cursor:pointer;width:1lh;height:1lh;font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);background-color:var(--diffs-modified-base);color:var(--diffs-bg);fill:currentColor;z-index:4;touch-action:none;border:none;border-radius:4px;justify-content:center;align-items:center;margin-right:calc(1ch - 1lh);padding:0;display:flex;position:relative}[data-utility-button]:before{content:"";display:block;position:absolute;inset:0 0 0 -4px}[data-decoration-bar-stack]{pointer-events:none;isolation:isolate;z-index:1;background-color:var(--diffs-decoration-bar-color,transparent);box-sizing:content-box;border-left:2px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg);width:6px;position:absolute;top:0;bottom:0;right:-2px}[data-decoration-bar-depth="1"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 20%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="2"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 45%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="3"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 65%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-start] [data-decoration-bar-stack]{border-top-left-radius:5px;border-top-right-radius:5px}[data-decoration-bar-end] [data-decoration-bar-stack]{z-index:3;border-bottom-right-radius:5px;border-bottom-left-radius:5px}[data-placeholder]{contain:strict}[data-error-wrapper]{padding:var(--diffs-gap-block,var(--diffs-gap-fallback)) var(--diffs-gap-inline,var(--diffs-gap-fallback));scrollbar-width:none;max-height:400px;overflow:auto}[data-error-wrapper] [data-error-message]{color:var(--diffs-deletion-base);font-size:18px;font-weight:700}[data-error-wrapper] [data-error-stack]{color:var(--diffs-fg-number)}}@layer theme,rendered,unsafe;
@layer theme {
}</style><style data-theme-css="">@layer base, theme, rendered, unsafe;
@layer rendered {
:host {
--diffs-scrollbar-gutter-measured: var(--diffs-scrollbar-gutter-fallback);
--diffs-dark:#fafafa;--diffs-dark-bg:#0a0a0a;--diffs-dark-addition-color:#07c480;--diffs-dark-deletion-color:#ff2e3f;--diffs-dark-modified-color:#009fff;--diffs-light:#0a0a0a;--diffs-light-bg:#ffffff;--diffs-light-addition-color:#18a46c;--diffs-light-deletion-color:#d52c36;--diffs-light-modified-color:#009fff;
}
}</style><div data-diffs-header="default" data-change-type="change"><div data-header-content=""><slot name="header-prefix"></slot><svg width="16" height="16" viewBox="0 0 16 16" data-change-icon="change"><use href="#diffs-icon-symbol-modified"></use></svg><div data-title=""><bdi>Dreamio/ProgressiveHTTPRangeCache.swift</bdi></div></div><div data-metadata=""><span data-deletions-count="">-2</span><span data-additions-count="">+32</span><slot name="header-metadata"></slot></div></div><pre data-diff="" data-diff-type="split" data-overflow="scroll" data-background="" data-indicators="bars" tabindex="0" style="--diffs-min-number-column-width-default:3ch;" data-dehydrated=""><code data-code="" data-container-size="" data-deletions=""><div data-gutter="" style="grid-row: span 60"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">375 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="376" data-line-index="375,375"><span data-line-number-content="">376</span></div><div data-line-type="context" data-column-number="377" data-line-index="376,376"><span data-line-number-content="">377</span></div><div data-line-type="context" data-column-number="378" data-line-index="377,377"><span data-line-number-content="">378</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="379" data-line-index="379,379"><span data-line-number-content="">379</span></div><div data-line-type="context" data-column-number="380" data-line-index="380,380"><span data-line-number-content="">380</span></div><div data-line-type="context" data-column-number="381" data-line-index="381,381"><span data-line-number-content="">381</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">4 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="386" data-line-index="386,386"><span data-line-number-content="">386</span></div><div data-line-type="context" data-column-number="387" data-line-index="387,387"><span data-line-number-content="">387</span></div><div data-line-type="context" data-column-number="388" data-line-index="388,388"><span data-line-number-content="">388</span></div><div data-line-type="change-deletion" data-column-number="389" data-line-index="389,389"><span data-line-number-content="">389</span></div><div data-line-type="change-deletion" data-column-number="390" data-line-index="390,390"><span data-line-number-content="">390</span></div><div data-gutter-buffer="buffer" data-buffer-size="5" style="grid-row: span 5;min-height:calc(5 * 1lh);"></div><div data-line-type="context" data-column-number="391" data-line-index="398,396"><span data-line-number-content="">391</span></div><div data-line-type="context" data-column-number="392" data-line-index="399,397"><span data-line-number-content="">392</span></div><div data-line-type="context" data-column-number="393" data-line-index="400,398"><span data-line-number-content="">393</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">106 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="500" data-line-index="507,505"><span data-line-number-content="">500</span></div><div data-line-type="context" data-column-number="501" data-line-index="508,506"><span data-line-number-content="">501</span></div><div data-line-type="context" data-column-number="502" data-line-index="509,507"><span data-line-number-content="">502</span></div><div data-gutter-buffer="buffer" data-buffer-size="12" style="grid-row: span 12;min-height:calc(12 * 1lh);"></div><div data-line-type="context" data-column-number="503" data-line-index="522,520"><span data-line-number-content="">503</span></div><div data-line-type="context" data-column-number="504" data-line-index="523,521"><span data-line-number-content="">504</span></div><div data-line-type="context" data-column-number="505" data-line-index="524,522"><span data-line-number-content="">505</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">33 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="539" data-line-index="558,556"><span data-line-number-content="">539</span></div><div data-line-type="context" data-column-number="540" data-line-index="559,557"><span data-line-number-content="">540</span></div><div data-line-type="context" data-column-number="541" data-line-index="560,558"><span data-line-number-content="">541</span></div><div data-gutter-buffer="buffer" data-buffer-size="12" style="grid-row: span 12;min-height:calc(12 * 1lh);"></div><div data-line-type="context" data-column-number="542" data-line-index="573,571"><span data-line-number-content="">542</span></div><div data-line-type="context" data-column-number="543" data-line-index="574,572"><span data-line-number-content="">543</span></div><div data-line-type="context" data-column-number="544" data-line-index="575,573"><span data-line-number-content="">544</span></div></div><div data-content="" style="grid-row: span 60"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">375 unmodified lines</span></div></div></div><div data-line="376" data-alt-line="376" data-line-type="context" data-line-index="375,375"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="377" data-alt-line="377" data-line-type="context" data-line-index="376,376"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioRangeCache] cache=hit range=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">bounded.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">bounded.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="378" data-alt-line="378" data-line-type="context" data-line-index="377,377"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="379" data-alt-line="380" data-line-type="context" data-line-index="379,379"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data</span></div><div data-line="380" data-alt-line="381" data-line-type="context" data-line-index="380,380"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="381" data-alt-line="382" data-line-type="context" data-line-index="381,381">
</div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">4 unmodified lines</span></div></div></div><div data-line="386" data-alt-line="387" data-line-type="context" data-line-index="386,386"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-line="387" data-alt-line="388" data-line-type="context" data-line-index="387,387"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cancelPrefetchIfNeeded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">forForegroundRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="388" data-alt-line="389" data-line-type="context" data-line-index="388,388"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> for</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missingRange </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missingRanges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="389" data-line-type="change-deletion" data-line-index="389,389"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> fetcher.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">fetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> </span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">missingRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></span></div><div data-line="390" data-line-type="change-deletion" data-line-index="390,390"><span data-diff-span=""><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span></span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data</span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> missingRange.start</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-content-buffer="" data-buffer-size="5" style="grid-row: span 5;min-height:calc(5 * 1lh)"></div><div data-line="391" data-alt-line="397" data-line-type="context" data-line-index="398,396"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="392" data-alt-line="398" data-line-type="context" data-line-index="399,397"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, forceRestart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="393" data-alt-line="399" data-line-type="context" data-line-index="400,398"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ??</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> Data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">106 unmodified lines</span></div></div></div><div data-line="500" data-alt-line="506" data-line-type="context" data-line-index="507,505"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cancelPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="501" data-alt-line="507" data-line-type="context" data-line-index="508,506"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="502" data-alt-line="508" data-line-type="context" data-line-index="509,507">
</div><div data-content-buffer="" data-buffer-size="12" style="grid-row: span 12;min-height:calc(12 * 1lh)"></div><div data-line="503" data-alt-line="521" data-line-type="context" data-line-index="522,520"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> HTTPByteRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="504" data-alt-line="522" data-line-type="context" data-line-index="523,521"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset, minimumBehind</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunkSize</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="505" data-alt-line="523" data-line-type="context" data-line-index="524,522"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">33 unmodified lines</span></div></div></div><div data-line="539" data-alt-line="557" data-line-type="context" data-line-index="558,556"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks</span></div><div data-line="540" data-alt-line="558" data-line-type="context" data-line-index="559,557"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="541" data-alt-line="559" data-line-type="context" data-line-index="560,558">
</div><div data-content-buffer="" data-buffer-size="12" style="grid-row: span 12;min-height:calc(12 * 1lh)"></div><div data-line="542" data-alt-line="572" data-line-type="context" data-line-index="573,571"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> evictOverBudget</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">protecting</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> range</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="543" data-alt-line="573" data-line-type="context" data-line-index="574,572"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> headerRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contentLength </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, prefetchChunkSize </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="544" data-alt-line="574" data-line-type="context" data-line-index="575,573"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> tailStart </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, contentLength </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> (</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">4</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> *</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunkSize</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div></div></code><code data-code="" data-container-size="" data-additions=""><div data-gutter="" style="grid-row: span 60"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">375 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="376" data-line-index="375,375"><span data-line-number-content="">376</span></div><div data-line-type="context" data-column-number="377" data-line-index="376,376"><span data-line-number-content="">377</span></div><div data-line-type="context" data-column-number="378" data-line-index="377,377"><span data-line-number-content="">378</span></div><div data-line-type="change-addition" data-column-number="379" data-line-index="378,378"><span data-line-number-content="">379</span></div><div data-line-type="context" data-column-number="380" data-line-index="379,379"><span data-line-number-content="">380</span></div><div data-line-type="context" data-column-number="381" data-line-index="380,380"><span data-line-number-content="">381</span></div><div data-line-type="context" data-column-number="382" data-line-index="381,381"><span data-line-number-content="">382</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">4 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="387" data-line-index="386,386"><span data-line-number-content="">387</span></div><div data-line-type="context" data-column-number="388" data-line-index="387,387"><span data-line-number-content="">388</span></div><div data-line-type="context" data-column-number="389" data-line-index="388,388"><span data-line-number-content="">389</span></div><div data-line-type="change-addition" data-column-number="390" data-line-index="391,389"><span data-line-number-content="">390</span></div><div data-line-type="change-addition" data-column-number="391" data-line-index="392,390"><span data-line-number-content="">391</span></div><div data-line-type="change-addition" data-column-number="392" data-line-index="393,391"><span data-line-number-content="">392</span></div><div data-line-type="change-addition" data-column-number="393" data-line-index="394,392"><span data-line-number-content="">393</span></div><div data-line-type="change-addition" data-column-number="394" data-line-index="395,393"><span data-line-number-content="">394</span></div><div data-line-type="change-addition" data-column-number="395" data-line-index="396,394"><span data-line-number-content="">395</span></div><div data-line-type="change-addition" data-column-number="396" data-line-index="397,395"><span data-line-number-content="">396</span></div><div data-line-type="context" data-column-number="397" data-line-index="398,396"><span data-line-number-content="">397</span></div><div data-line-type="context" data-column-number="398" data-line-index="399,397"><span data-line-number-content="">398</span></div><div data-line-type="context" data-column-number="399" data-line-index="400,398"><span data-line-number-content="">399</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">106 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="506" data-line-index="507,505"><span data-line-number-content="">506</span></div><div data-line-type="context" data-column-number="507" data-line-index="508,506"><span data-line-number-content="">507</span></div><div data-line-type="context" data-column-number="508" data-line-index="509,507"><span data-line-number-content="">508</span></div><div data-line-type="change-addition" data-column-number="509" data-line-index="510,508"><span data-line-number-content="">509</span></div><div data-line-type="change-addition" data-column-number="510" data-line-index="511,509"><span data-line-number-content="">510</span></div><div data-line-type="change-addition" data-column-number="511" data-line-index="512,510"><span data-line-number-content="">511</span></div><div data-line-type="change-addition" data-column-number="512" data-line-index="513,511"><span data-line-number-content="">512</span></div><div data-line-type="change-addition" data-column-number="513" data-line-index="514,512"><span data-line-number-content="">513</span></div><div data-line-type="change-addition" data-column-number="514" data-line-index="515,513"><span data-line-number-content="">514</span></div><div data-line-type="change-addition" data-column-number="515" data-line-index="516,514"><span data-line-number-content="">515</span></div><div data-line-type="change-addition" data-column-number="516" data-line-index="517,515"><span data-line-number-content="">516</span></div><div data-line-type="change-addition" data-column-number="517" data-line-index="518,516"><span data-line-number-content="">517</span></div><div data-line-type="change-addition" data-column-number="518" data-line-index="519,517"><span data-line-number-content="">518</span></div><div data-line-type="change-addition" data-column-number="519" data-line-index="520,518"><span data-line-number-content="">519</span></div><div data-line-type="change-addition" data-column-number="520" data-line-index="521,519"><span data-line-number-content="">520</span></div><div data-line-type="context" data-column-number="521" data-line-index="522,520"><span data-line-number-content="">521</span></div><div data-line-type="context" data-column-number="522" data-line-index="523,521"><span data-line-number-content="">522</span></div><div data-line-type="context" data-column-number="523" data-line-index="524,522"><span data-line-number-content="">523</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">33 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="557" data-line-index="558,556"><span data-line-number-content="">557</span></div><div data-line-type="context" data-column-number="558" data-line-index="559,557"><span data-line-number-content="">558</span></div><div data-line-type="context" data-column-number="559" data-line-index="560,558"><span data-line-number-content="">559</span></div><div data-line-type="change-addition" data-column-number="560" data-line-index="561,559"><span data-line-number-content="">560</span></div><div data-line-type="change-addition" data-column-number="561" data-line-index="562,560"><span data-line-number-content="">561</span></div><div data-line-type="change-addition" data-column-number="562" data-line-index="563,561"><span data-line-number-content="">562</span></div><div data-line-type="change-addition" data-column-number="563" data-line-index="564,562"><span data-line-number-content="">563</span></div><div data-line-type="change-addition" data-column-number="564" data-line-index="565,563"><span data-line-number-content="">564</span></div><div data-line-type="change-addition" data-column-number="565" data-line-index="566,564"><span data-line-number-content="">565</span></div><div data-line-type="change-addition" data-column-number="566" data-line-index="567,565"><span data-line-number-content="">566</span></div><div data-line-type="change-addition" data-column-number="567" data-line-index="568,566"><span data-line-number-content="">567</span></div><div data-line-type="change-addition" data-column-number="568" data-line-index="569,567"><span data-line-number-content="">568</span></div><div data-line-type="change-addition" data-column-number="569" data-line-index="570,568"><span data-line-number-content="">569</span></div><div data-line-type="change-addition" data-column-number="570" data-line-index="571,569"><span data-line-number-content="">570</span></div><div data-line-type="change-addition" data-column-number="571" data-line-index="572,570"><span data-line-number-content="">571</span></div><div data-line-type="context" data-column-number="572" data-line-index="573,571"><span data-line-number-content="">572</span></div><div data-line-type="context" data-column-number="573" data-line-index="574,572"><span data-line-number-content="">573</span></div><div data-line-type="context" data-column-number="574" data-line-index="575,573"><span data-line-number-content="">574</span></div></div><div data-content="" style="grid-row: span 60"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">375 unmodified lines</span></div></div></div><div data-line="376" data-alt-line="376" data-line-type="context" data-line-index="375,375"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="377" data-alt-line="377" data-line-type="context" data-line-index="376,376"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioRangeCache] cache=hit range=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">bounded.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">bounded.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="378" data-alt-line="378" data-line-type="context" data-line-index="377,377"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-line="379" data-line-type="change-addition" data-line-index="378,378"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchAheadIfForegroundMoved</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">to</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="380" data-alt-line="379" data-line-type="context" data-line-index="379,379"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data</span></div><div data-line="381" data-alt-line="380" data-line-type="context" data-line-index="380,380"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="382" data-alt-line="381" data-line-type="context" data-line-index="381,381">
</div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">4 unmodified lines</span></div></div></div><div data-line="387" data-alt-line="386" data-line-type="context" data-line-index="386,386"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-line="388" data-alt-line="387" data-line-type="context" data-line-index="387,387"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cancelPrefetchIfNeeded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">forForegroundRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="389" data-alt-line="388" data-line-type="context" data-line-index="388,388"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> for</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missingRange </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> missingRanges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="390" data-line-type="change-addition" data-line-index="391,389"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">for</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> fetchRange </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> alignedChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">covering</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> missingRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> where</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">hasData</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> </span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">fetchRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></span><span data-diff-span=""><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></span></div><div data-line="391" data-line-type="change-addition" data-line-index="392,390"><span data-diff-span=""><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data </span><span data-diff-span=""><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> fetcher.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">fetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> fetchRange</span></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="392" data-line-type="change-addition" data-line-index="393,391"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data, at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> fetchRange.start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="393" data-line-type="change-addition" data-line-index="394,392"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="394" data-line-type="change-addition" data-line-index="395,393"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioRangeCache] foreground fetched range=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">fetchRange.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">fetchRange.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> bytes=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">data.count</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="395" data-line-type="change-addition" data-line-index="396,394"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-line="396" data-line-type="change-addition" data-line-index="397,395"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="397" data-alt-line="391" data-line-type="context" data-line-index="398,396"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="398" data-alt-line="392" data-line-type="context" data-line-index="399,397"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, forceRestart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="399" data-alt-line="393" data-line-type="context" data-line-index="400,398"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ??</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> Data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">106 unmodified lines</span></div></div></div><div data-line="506" data-alt-line="500" data-line-type="context" data-line-index="507,505"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cancelPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="507" data-alt-line="501" data-line-type="context" data-line-index="508,506"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="508" data-alt-line="502" data-line-type="context" data-line-index="509,507">
</div><div data-line="509" data-line-type="change-addition" data-line-index="510,508"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchAheadIfForegroundMoved</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">to</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> range</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="510" data-line-type="change-addition" data-line-index="511,509"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range.start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ==</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">,</span></div><div data-line="511" data-line-type="change-addition" data-line-index="512,510"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> preferredOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchPreferredOffset,</span></div><div data-line="512" data-line-type="change-addition" data-line-index="513,511"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> abs</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range.start </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> preferredOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> >=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> responseChunkSize </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="513" data-line-type="change-addition" data-line-index="514,512"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="514" data-line-type="change-addition" data-line-index="515,513"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="515" data-line-type="change-addition" data-line-index="516,514"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="516" data-line-type="change-addition" data-line-index="517,515"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioRangeCache] prefetch follow-foreground from=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">preferredOffset</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> to=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">range.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="517" data-line-type="change-addition" data-line-index="518,516"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-line="518" data-line-type="change-addition" data-line-index="519,517"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, forceRestart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="519" data-line-type="change-addition" data-line-index="520,518"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="520" data-line-type="change-addition" data-line-index="521,519">
</div><div data-line="521" data-alt-line="503" data-line-type="context" data-line-index="522,520"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> HTTPByteRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="522" data-alt-line="504" data-line-type="context" data-line-index="523,521"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset, minimumBehind</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunkSize</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="523" data-alt-line="505" data-line-type="context" data-line-index="524,522"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">33 unmodified lines</span></div></div></div><div data-line="557" data-alt-line="539" data-line-type="context" data-line-index="558,556"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks</span></div><div data-line="558" data-alt-line="540" data-line-type="context" data-line-index="559,557"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="559" data-alt-line="541" data-line-type="context" data-line-index="560,558">
</div><div data-line="560" data-line-type="change-addition" data-line-index="561,559"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> alignedChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">covering</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> range</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> [</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="561" data-line-type="change-addition" data-line-index="562,560"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bounded </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> clamp</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="562" data-line-type="change-addition" data-line-index="563,561"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div><div data-line="563" data-line-type="change-addition" data-line-index="564,562"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> alignedChunkStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> bounded.start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="564" data-line-type="change-addition" data-line-index="565,563"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> while</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">&#x3C;=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> bounded.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="565" data-line-type="change-addition" data-line-index="566,564"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunk </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cursor, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contentLength </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunkSize </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="566" data-line-type="change-addition" data-line-index="567,565"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">append</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">chunk</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="567" data-line-type="change-addition" data-line-index="568,566"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> cursor </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunk.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span></div><div data-line="568" data-line-type="change-addition" data-line-index="569,567"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="569" data-line-type="change-addition" data-line-index="570,568"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks</span></div><div data-line="570" data-line-type="change-addition" data-line-index="571,569"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="571" data-line-type="change-addition" data-line-index="572,570">
</div><div data-line="572" data-alt-line="542" data-line-type="context" data-line-index="573,571"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> evictOverBudget</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">protecting</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> range</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="573" data-alt-line="543" data-line-type="context" data-line-index="574,572"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> headerRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> min</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contentLength </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, prefetchChunkSize </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="574" data-alt-line="544" data-line-type="context" data-line-index="575,573"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> tailStart </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> max</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, contentLength </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> (</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">4</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> *</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetchChunkSize</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div></div></code></pre></section><section class="diff-file"><h3>Tests/StreamResolverTests.swift</h3><svg data-icon-sprite aria-hidden="true" width="0" height="0">
<symbol id="diffs-icon-arrow-right-short" viewBox="0 0 16 16">
<path d="M8.47 4.22a.75.75 0 0 0 0 1.06l1.97 1.97H3.75a.75.75 0 0 0 0 1.5h6.69l-1.97 1.97a.75.75 0 1 0 1.06 1.06l3.25-3.25a.75.75 0 0 0 0-1.06L9.53 4.22a.75.75 0 0 0-1.06 0"/>
</symbol>
<symbol id="diffs-icon-brand-github" viewBox="0 0 16 16">
<path d="M8 0c4.42 0 8 3.58 8 8a8.01 8.01 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27s-1.36.09-2 .27c-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8"/>
</symbol>
<symbol id="diffs-icon-chevron" viewBox="0 0 16 16">
<path d="M1.47 4.47a.75.75 0 0 1 1.06 0L8 9.94l5.47-5.47a.75.75 0 1 1 1.06 1.06l-6 6a.75.75 0 0 1-1.06 0l-6-6a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-chevrons-narrow" viewBox="0 0 10 16">
<path d="M4.47 2.22a.75.75 0 0 1 1.06 0l3.25 3.25a.75.75 0 0 1-1.06 1.06L5 3.81 2.28 6.53a.75.75 0 0 1-1.06-1.06zM1.22 9.47a.75.75 0 0 1 1.06 0L5 12.19l2.72-2.72a.75.75 0 0 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0l-3.25-3.25a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-diff-split" viewBox="0 0 16 16">
<path d="M14 0H8.5v16H14a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2m-1.5 6.5v1h1a.5.5 0 0 1 0 1h-1v1a.5.5 0 0 1-1 0v-1h-1a.5.5 0 0 1 0-1h1v-1a.5.5 0 0 1 1 0"/><path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h5.5V0zm.5 7.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1 0-1" opacity=".3"/>
</symbol>
<symbol id="diffs-icon-diff-unified" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M16 14a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V8.5h16zm-8-4a.5.5 0 0 0-.5.5v1h-1a.5.5 0 0 0 0 1h1v1a.5.5 0 0 0 1 0v-1h1a.5.5 0 0 0 0-1h-1v-1A.5.5 0 0 0 8 10" clip-rule="evenodd"/><path fill-rule="evenodd" d="M14 0a2 2 0 0 1 2 2v5.5H0V2a2 2 0 0 1 2-2zM6.5 3.5a.5.5 0 0 0 0 1h3a.5.5 0 0 0 0-1z" clip-rule="evenodd" opacity=".4"/>
</symbol>
<symbol id="diffs-icon-expand" viewBox="0 0 16 16">
<path d="M3.47 5.47a.75.75 0 0 1 1.06 0L8 8.94l3.47-3.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-expand-all" viewBox="0 0 16 16">
<path d="M11.47 9.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 1 1 1.06-1.06L8 12.94zM7.526 1.418a.75.75 0 0 1 1.004.052l4 4a.75.75 0 1 1-1.06 1.06L8 3.06 4.53 6.53a.75.75 0 1 1-1.06-1.06l4-4z"/>
</symbol>
<symbol id="diffs-icon-file-code" viewBox="0 0 16 16">
<path d="M10.75 0c.199 0 .39.08.53.22l3.5 3.5c.14.14.22.331.22.53v9A2.75 2.75 0 0 1 12.25 16h-8.5A2.75 2.75 0 0 1 1 13.25V2.75A2.75 2.75 0 0 1 3.75 0zm-7 1.5c-.69 0-1.25.56-1.25 1.25v10.5c0 .69.56 1.25 1.25 1.25h8.5c.69 0 1.25-.56 1.25-1.25V5h-1.25A2.25 2.25 0 0 1 10 2.75V1.5z"/><path d="M7.248 6.19a.75.75 0 0 1 .063 1.058L5.753 9l1.558 1.752a.75.75 0 0 1-1.122.996l-2-2.25a.75.75 0 0 1 0-.996l2-2.25a.75.75 0 0 1 1.06-.063M8.69 7.248a.75.75 0 1 1 1.12-.996l2 2.25a.75.75 0 0 1 0 .996l-2 2.25a.75.75 0 1 1-1.12-.996L10.245 9z"/>
</symbol>
<symbol id="diffs-icon-plus" viewBox="0 0 16 16">
<path d="M8 3a.75.75 0 0 1 .75.75v3.5h3.5a.75.75 0 0 1 0 1.5h-3.5v3.5a.75.75 0 0 1-1.5 0v-3.5h-3.5a.75.75 0 0 1 0-1.5h3.5v-3.5A.75.75 0 0 1 8 3"/>
</symbol>
<symbol id="diffs-icon-symbol-added" viewBox="0 0 16 16">
<path d="M8 4a.75.75 0 0 1 .75.75v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5A.75.75 0 0 1 8 4"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
</symbol>
<symbol id="diffs-icon-symbol-deleted" viewBox="0 0 16 16">
<path d="M4 8a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5A.75.75 0 0 1 4 8"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
</symbol>
<symbol id="diffs-icon-symbol-diffstat" viewBox="0 0 16 16">
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.75 4.296a.75.75 0 0 0-1.5 0V6.25h-2a.75.75 0 0 0 0 1.5h2v1.5h1.5v-1.5h2a.75.75 0 0 0 0-1.5h-2zM5.25 10a.75.75 0 0 0 0 1.5h5.5a.75.75 0 0 0 0-1.5z"/>
</symbol>
<symbol id="diffs-icon-symbol-ignored" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m11.53-2.47a.75.75 0 0 0-1.06-1.06l-6 6a.75.75 0 1 0 1.06 1.06z"/>
</symbol>
<symbol id="diffs-icon-symbol-modified" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m8 3a3 3 0 1 0 0-6 3 3 0 0 0 0 6"/>
</symbol>
<symbol id="diffs-icon-symbol-moved" viewBox="0 0 16 16">
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.495 4.695a.75.75 0 0 0-.05 1.06L10.486 8l-2.041 2.246a.75.75 0 0 0 1.11 1.008l2.5-2.75a.75.75 0 0 0 0-1.008l-2.5-2.75a.75.75 0 0 0-1.06-.051m-4 0a.75.75 0 0 0-.05 1.06l2.044 2.248-1.796 1.995a.75.75 0 0 0 1.114 1.004l2.25-2.5a.75.75 0 0 0-.002-1.007l-2.5-2.75a.75.75 0 0 0-1.06-.05"/>
</symbol>
<symbol id="diffs-icon-symbol-ref" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706.286.286.71.54 1.41.73V1.86c-.7.19-1.124.444-1.41.73-.324.325-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8m4 6.397c.697.07 1.522.103 2.5.103 1.613 0 2.806-.088 3.704-.288.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5c-.978 0-1.803.033-2.5.103zM0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m7-2a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1z"/>
</symbol>
</svg><style data-core-css="">@layer base, theme, rendered, unsafe;
@layer base,theme,rendered,unsafe;@layer base{:host{--diffs-font-fallback:"SF Mono", Monaco, Consolas, "Ubuntu Mono", "Liberation Mono", "Courier New", monospace;--diffs-header-font-fallback:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif;--diffs-mixer:light-dark(#000,#fff);--diffs-gap-fallback:8px;--diffs-scrollbar-gutter-fallback:6px;--diffs-scrollbar-gutter:var(--diffs-scrollbar-gutter-override,var(--diffs-scrollbar-gutter-measured,var(--diffs-scrollbar-gutter-fallback)));--diffs-added-light:#0dbe4e;--diffs-added-dark:#5ecc71;--diffs-modified-light:#009fff;--diffs-modified-dark:#69b1ff;--diffs-deleted-light:#ff2e3f;--diffs-deleted-dark:#ff6762;color-scheme:light dark;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);font-feature-settings:var(--diffs-font-features);--diffs-bg:light-dark(var(--diffs-light-bg,#fff),var(--diffs-dark-bg,#000));--diffs-bg-buffer:var(--diffs-bg-buffer-override,light-dark(color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer))));--diffs-bg-context:var(--diffs-bg-context-override,light-dark(color-mix(in lab, var(--diffs-bg) 98.5%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92.5%, var(--diffs-mixer))));--diffs-bg-context-gutter:var(--diffs-bg-context-gutter-override,light-dark(color-mix(in lab, var(--diffs-bg-context) 90%, var(--diffs-bg)),color-mix(in lab, var(--diffs-bg-context) 45%, var(--diffs-bg))));--diffs-bg-separator:var(--diffs-bg-separator-override,light-dark(color-mix(in lab, var(--diffs-bg) 96%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-mixer))));--diffs-fg:light-dark(var(--diffs-light,#000),var(--diffs-dark,#fff));--diffs-fg-number:var(--diffs-fg-number-override,light-dark(color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg)),color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg))));--diffs-fg-conflict-marker:var(--diffs-fg-conflict-marker-override,var(--diffs-fg-number));--diffs-deletion-base:var(--diffs-deletion-color-override,light-dark(var(--diffs-light-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-light))),var(--diffs-dark-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-dark)))));--diffs-addition-base:var(--diffs-addition-color-override,light-dark(var(--diffs-light-addition-color,var(--diffs-addition-color,var(--diffs-added-light))),var(--diffs-dark-addition-color,var(--diffs-addition-color,var(--diffs-added-dark)))));--diffs-modified-base:var(--diffs-modified-color-override,light-dark(var(--diffs-light-modified-color,var(--diffs-modified-color,var(--diffs-modified-light))),var(--diffs-dark-modified-color,var(--diffs-modified-color,var(--diffs-modified-dark)))));--diffs-bg-deletion:var(--diffs-bg-deletion-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-deletion-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base))));--diffs-bg-deletion-emphasis:var(--diffs-bg-deletion-emphasis-override,light-dark(rgb(from var(--diffs-deletion-base) r g b / .15),rgb(from var(--diffs-deletion-base) r g b / .2)));--diffs-bg-addition:var(--diffs-bg-addition-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-addition-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base))));--diffs-bg-addition-emphasis:var(--diffs-bg-addition-emphasis-override,light-dark(rgb(from var(--diffs-addition-base) r g b / .15),rgb(from var(--diffs-addition-base) r g b / .2)));--diffs-selection-base:var(--diffs-modified-base);--diffs-selection-number-fg:light-dark(color-mix(in lab, var(--diffs-selection-base) 65%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-selection-base) 75%, var(--diffs-mixer)));background-color:var(--diffs-bg);color:var(--diffs-fg);display:block}pre,code,[data-error-wrapper]{isolation:isolate;font-family:var(--diffs-font-family,var(--diffs-font-fallback));outline:none;margin:0;padding:0;display:block}pre,code{background-color:var(--diffs-bg)}code{contain:content}*,:before,:after{box-sizing:border-box}[data-icon-sprite]{display:none}[data-diffs-header],[data-separator]{font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback))}[data-diffs-header][data-sticky]{z-index:1;background-color:var(--diffs-bg);position:sticky;top:0}[data-file-info]{color:var(--fg);background-color:color-mix(in lab, var(--bg) 98%, var(--fg));border-block:1px solid color-mix(in lab, var(--bg) 95%, var(--fg));padding:10px;font-weight:700}[data-diff],[data-file]{--diffs-grid-number-column-width:minmax(min-content, max-content);--diffs-code-grid:var(--diffs-grid-number-column-width) 1fr}[data-dehydrated]:is([data-diff],[data-file]){--diffs-code-grid:var(--diffs-grid-number-column-width) minmax(0, 1fr)}:is([data-diff],[data-file]):hover [data-code]::-webkit-scrollbar-thumb{background-color:var(--diffs-bg-context)}@supports (-webkit-touch-callout:none){:host{--diffs-scrollbar-gutter-fallback:0px}}[data-line] span{color:light-dark(var(--diffs-token-light,var(--diffs-light)),var(--diffs-token-dark,var(--diffs-dark)));background-color:light-dark(var(--diffs-token-light-bg,inherit),var(--diffs-token-dark-bg,inherit));font-weight:light-dark(var(--diffs-token-light-font-weight,inherit),var(--diffs-token-dark-font-weight,inherit));font-style:light-dark(var(--diffs-token-light-font-style,inherit),var(--diffs-token-dark-font-style,inherit));-webkit-text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit));text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit))}[data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);color:var(--diffs-fg);background-color:var(--diffs-line-bg,var(--diffs-bg))}@media (pointer:fine){:is([data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]):where([data-hovered]){--diffs-computed-hovered-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-selected-line-bg) 97%, var(--diffs-bg-hover-override,var(--diffs-mixer))),color-mix(in lab, var(--diffs-computed-selected-line-bg) 91%, var(--diffs-bg-hover-override,var(--diffs-mixer))));--diffs-line-bg:var(--diffs-computed-hovered-line-bg,inherit)}}[data-decoration-bg]:is([data-line],[data-no-newline]){--mix-deco-light:92%;--mix-deco-dark:85%}[data-decoration-bg][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]){--mix-deco-light:88%;--mix-deco-dark:80%}[data-decoration-bg][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]){--mix-deco-light:85%;--mix-deco-dark:78%}@media (pointer:fine){[data-decoration-bg][data-hovered]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:85%;--mix-deco-dark:85%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:83%;--mix-deco-dark:83%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:81%;--mix-deco-dark:81%}}[data-decoration-bg]:is([data-line],[data-no-newline]){--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) var(--mix-deco-light), var(--diffs-decoration-bg)),color-mix(in lab, var(--diffs-bg) var(--mix-deco-dark), var(--diffs-decoration-bg)));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-line-annotation],[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context);--diffs-computed-decoration-bg:var(--diffs-annotation-bg);--diffs-computed-diff-line-bg:var(--diffs-annotation-bg);--diffs-computed-selected-line-bg:var(--diffs-annotation-bg);--diffs-line-bg:var(--diffs-annotation-bg)}[data-merge-conflict-actions],[data-gutter-buffer=merge-conflict-action],[data-gutter-buffer=merge-conflict-marker-base],[data-gutter-buffer=merge-conflict-marker-separator],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator]{--diffs-computed-decoration-bg:var(--diffs-bg-context);--diffs-computed-diff-line-bg:var(--diffs-bg-context);--diffs-computed-selected-line-bg:var(--diffs-bg-context);--diffs-line-bg:var(--diffs-bg-context)}[data-gutter-buffer=merge-conflict-marker-start],[data-merge-conflict=marker-start]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-gutter-buffer=merge-conflict-marker-end],[data-merge-conflict=marker-end]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-has-merge-conflict] [data-line-annotation],[data-has-merge-conflict] [data-gutter-buffer=annotation]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);--diffs-line-bg:var(--diffs-bg)}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number]{--mix-light:91%;--mix-dark:85%}:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--mix-light:88%;--mix-dark:80%}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--diffs-diff-line-mix-target:var(--diffs-bg)}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-deletion-override,var(--diffs-deletion-base))}@media (pointer:fine){[data-line-type=change-deletion][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:75%}}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-deletion-override,var(--diffs-deletion-base));--diffs-diff-line-mix-target:var(--diffs-bg-deletion-number-override,var(--diffs-deletion-base))}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-addition-override,var(--diffs-addition-base))}@media (pointer:fine){[data-line-type=change-addition][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--diffs-bg-addition-number-override,var(--diffs-addition-base))}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-current-override,var(--diffs-addition-base))}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--conflict-bg-current-number-override,var(--diffs-addition-base))}@media (pointer:fine){[data-merge-conflict=current][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-incoming-override,var(--diffs-modified-base))}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-modified-base);--diffs-diff-line-mix-target:var(--conflict-bg-incoming-number-override,var(--diffs-modified-base))}@media (pointer:fine){[data-merge-conflict=incoming][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]{--diffs-selection-mix-target:var(--diffs-bg-selection-override,var(--diffs-selection-base))}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--mix-selection-light:82%;--mix-selection-dark:75%}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:75%;--mix-selection-dark:70%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]){--mix-selection-light:75%;--mix-selection-dark:60%;--diffs-selection-mix-target:var(--diffs-bg-selection-number-override,var(--diffs-selection-base))}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:70%;--mix-selection-dark:55%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--diffs-computed-selected-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-light), var(--diffs-selection-mix-target)),color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-dark), var(--diffs-selection-mix-target)));--diffs-line-bg:var(--diffs-computed-selected-line-bg,inherit)}[data-selected-line]:is([data-gutter-buffer],[data-column-number]){color:var(--diffs-selection-number-fg)}[data-no-newline]{-webkit-user-select:none;user-select:none}[data-no-newline] span{opacity:.6}[data-diff-type=split][data-overflow=scroll]{grid-template-columns:1fr 1fr;display:grid}[data-diff-type=split][data-overflow=scroll] [data-additions]{border-left:1px solid var(--diffs-bg)}[data-diff-type=split][data-overflow=scroll] [data-deletions]{border-right:1px solid var(--diffs-bg)}[data-code]{grid-auto-flow:dense;grid-template-columns:var(--diffs-code-grid);overflow:var(--diffs-overflow-override,scroll) clip;overscroll-behavior-x:none;tab-size:var(--diffs-tab-size,2);padding-top:var(--diffs-gap-block,var(--diffs-gap-fallback));padding-bottom:max(0px, calc(var(--diffs-gap-block,var(--diffs-gap-fallback)) - var(--diffs-scrollbar-gutter)));scrollbar-gutter:stable;align-self:flex-start;display:grid}[data-diffs-scrollbar-measure]{opacity:0;pointer-events:none;scrollbar-gutter:auto;grid-template-columns:none;width:100px;height:100px;padding:0;position:absolute;top:-200px;left:-200px}[data-container-size]{container-type:inline-size}[data-code]::-webkit-scrollbar{width:0;height:var(--diffs-scrollbar-gutter)}[data-code]::-webkit-scrollbar-track{background:0 0}[data-code]::-webkit-scrollbar-thumb{background-color:#0000;background-clip:content-box;border:1px solid #0000;border-radius:3px}[data-code]::-webkit-scrollbar-corner{background-color:#0000}@supports ((-moz-appearance:none)){[data-code]{scrollbar-width:thin;scrollbar-color:var(--diffs-bg-context) transparent;padding-bottom:var(--diffs-gap-block,var(--diffs-gap-fallback))}}:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]) [data-code],[data-overflow=wrap]:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]){padding-top:0}[data-gutter]{grid-template-rows:subgrid;grid-template-columns:subgrid;z-index:3;background-color:var(--diffs-bg);grid-column:1;display:grid;position:relative}[data-gutter] [data-gutter-buffer],[data-gutter] [data-column-number]{border-right:var(--diffs-gap-style,2px solid var(--diffs-bg))}[data-content]{grid-template-rows:subgrid;grid-template-columns:subgrid;background-color:var(--diffs-bg);grid-column:2;min-width:0;display:grid}[data-diff-type=split][data-overflow=wrap]{grid-auto-flow:dense;grid-template-columns:repeat(2, var(--diffs-code-grid));padding-block:var(--diffs-gap-block,var(--diffs-gap-fallback));display:grid}[data-diff-type=split][data-overflow=wrap] [data-deletions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-gutter]{grid-column:1}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-content]{border-right:1px solid var(--diffs-bg);grid-column:2}[data-diff-type=split][data-overflow=wrap] [data-additions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-gutter]{border-left:1px solid var(--diffs-bg);grid-column:3}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-content]{grid-column:4}[data-overflow=scroll] [data-gutter]{position:sticky;left:0}[data-interactive-lines] [data-line]{cursor:pointer}[data-interactive-line-numbers] [data-column-number]{cursor:pointer;touch-action:none}[data-content-buffer],[data-gutter-buffer]{-webkit-user-select:none;user-select:none;min-height:1lh;position:relative}[data-gutter-buffer]{padding-left:2ch;padding-right:1ch}[data-gutter-buffer]:before{content:"";min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));display:block}[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context-gutter);min-height:0}[data-gutter-buffer=buffer]{--diffs-line-bg:var(--diffs-bg-context-gutter)}[data-content-buffer]{background-position:5px 0;background-size:8px 8px;background-origin:border-box;background-image:repeating-linear-gradient(-45deg, transparent, transparent 4.242px, var(--diffs-bg-buffer) 4.242px, var(--diffs-bg-buffer) 5.656px);grid-column:1}[data-separator]{box-sizing:content-box;background-color:var(--diffs-bg)}[data-separator=simple]{min-height:4px}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata],[data-separator=simple]{background-color:var(--diffs-bg-separator)}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata]{height:32px;position:relative}[data-separator-wrapper]{-webkit-user-select:none;user-select:none;fill:currentColor;background-color:var(--diffs-bg);align-items:center;height:100%;display:flex;position:absolute;inset-inline:0}[data-content] [data-separator-wrapper]{display:none}[data-separator=metadata] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;color:var(--diffs-fg-number);white-space:nowrap;text-overflow:ellipsis;min-width:min-content;padding-inline:1ch;inset-inline:100% auto;overflow:hidden}[data-separator=line-info]{margin-block:var(--diffs-gap-block,var(--diffs-gap-fallback))}[data-separator=line-info] [data-separator-wrapper]{min-width:16px}[data-separator=line-info-basic],[data-separator=metadata]{margin-block:0}[data-separator=line-info][data-separator-first]{margin-top:0}[data-separator=line-info][data-separator-last]{margin-bottom:0}[data-expand-index] [data-separator-wrapper]{grid-template-columns:32px auto;display:grid}[data-expand-index] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:32px 32px auto}[data-expand-button],[data-separator-content]{background-color:var(--diffs-bg-separator);flex:none;align-items:center;display:flex}[data-expand-index] [data-separator-content]:hover{cursor:pointer;text-decoration:underline}[data-expand-button]{cursor:pointer;min-width:32px;color:var(--diffs-fg-number);border-right:2px solid var(--diffs-bg);flex-shrink:0;justify-content:center;align-self:stretch}[data-expand-button]:hover{color:var(--diffs-fg)}[data-expand-button][data-expand-all-button]{display:none}[data-expand-down] [data-icon]{transform:scaleY(-1)}[data-separator-content]{height:100%;color:var(--diffs-fg-number);flex:auto;justify-content:flex-start;padding:0 1ch;overflow:hidden}:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-content]{-webkit-user-select:none;user-select:none;height:100%;overflow:clip}[data-unmodified-lines]{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;display:block;overflow:hidden}@supports (width:1cqi){[data-unified] [data-separator=line-info] [data-separator-wrapper]{padding-inline:var(--diffs-gap-inline,var(--diffs-gap-fallback));width:100cqi}:is([data-unified] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content]{border-radius:6px}[data-unified] [data-separator=line-info][data-expand-index] [data-separator-wrapper] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-gutter] [data-separator=line-info] [data-separator-wrapper]{padding-left:var(--diffs-gap-inline,var(--diffs-gap-fallback))}[data-gutter] [data-separator=line-info] [data-separator-content]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-gutter] [data-separator=line-info][data-expand-index] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-additions] [data-content] [data-separator=line-info]{background-color:var(--diffs-bg)}:is([data-additions] [data-content] [data-separator=line-info]) [data-separator-wrapper]{display:none}[data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);border-top-right-radius:6px;border-bottom-right-radius:6px;height:100%;display:block}:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}[data-overflow=scroll] [data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{width:calc(100cqi - var(--diffs-gap-inline,var(--diffs-gap-fallback)))}[data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;margin-right:var(--diffs-gap-inline,var(--diffs-gap-fallback));border-top-right-radius:6px;border-bottom-right-radius:6px;display:block}:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}@media (pointer:fine){[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:unset}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:6px;border-top-left-radius:unset}}}@media (pointer:coarse){[data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px 34px auto}:is([data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]) [data-separator-content]{grid-column:unset;grid-row:unset}@supports (width:1cqi){:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up],[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:unset;border-top-left-radius:unset}}}@media (pointer:fine){[data-separator-wrapper][data-separator-multi-button]{grid-template-rows:50% 50%;display:grid}[data-separator-wrapper][data-separator-multi-button] [data-separator-content]{grid-area:1/2/-1;min-width:min-content}[data-separator-wrapper][data-separator-multi-button] [data-expand-button]{grid-column:1}[data-separator=line-info] [data-separator-wrapper],[data-separator=line-info] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px auto}[data-separator=line-info-basic][data-expand-index] [data-separator-wrapper]{grid-template-columns:100% auto}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-up]{border-bottom:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-down]{border-top:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}}[data-additions] [data-gutter] [data-separator-wrapper],[data-additions] [data-separator=line-info-basic] [data-separator-wrapper],[data-content] [data-separator-wrapper]{display:none}[data-line-annotation]{min-height:var(--diffs-annotation-min-height,0);z-index:2}[data-merge-conflict-actions]{z-index:2}[data-separator=custom]{grid-template-columns:subgrid;display:grid}[data-line],[data-column-number],[data-no-newline]{padding-inline:1ch;position:relative}[data-indicators=classic] [data-line]{padding-inline-start:2ch}:is([data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion]),[data-line]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion])):before{-webkit-user-select:none;user-select:none;width:1ch;height:1lh;display:inline-block;position:absolute;top:0;left:0}:is([data-line]:is([data-indicators=classic] [data-line-type=change-addition]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition])):before{content:"+";color:var(--diffs-addition-base)}:is([data-line]:is([data-indicators=classic] [data-line-type=change-deletion]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-deletion])):before{content:"-";color:var(--diffs-deletion-base)}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion],[data-indicators=bars] [data-line-type=change-addition]):before{content:"";-webkit-user-select:none;user-select:none;contain:strict;width:4px;height:100%;display:block;position:absolute;top:0;left:0}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion]):before{background-image:linear-gradient(0deg, var(--diffs-bg-deletion) 50%, var(--diffs-deletion-base) 50%);background-repeat:repeat;background-size:2px 2px;background-size:calc(1lh/round(1lh / 2px)) calc(1lh/round(1lh / 2px))}[data-column-number]:is([data-indicators=bars] [data-line-type=change-addition]):before{background-color:var(--diffs-addition-base)}[data-overflow=wrap] [data-line],[data-overflow=wrap] [data-annotation-content]{white-space:pre-wrap;word-break:break-word}[data-overflow=scroll] [data-line]{white-space:pre;min-height:1lh}[data-column-number]{box-sizing:content-box;text-align:right;-webkit-user-select:none;user-select:none;color:var(--diffs-fg-number);padding-left:2ch}[data-line-number-content]{min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));z-index:1;display:inline-block;position:relative}[data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]{min-width:4px;padding:0}:is([data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]):before{min-width:0}[data-disable-line-numbers] [data-line-number-content]{display:none}[data-disable-line-numbers] [data-gutter-utility-slot]{right:unset;justify-content:flex-start;left:0}[data-disable-line-numbers][data-indicators=bars] [data-gutter-utility-slot]{left:6px}[data-file][data-disable-line-numbers] [data-gutter-buffer],[data-file][data-disable-line-numbers] [data-column-number]{border-right:0;min-width:0}[data-diff-span]{-webkit-box-decoration-break:clone;box-decoration-break:clone;border-radius:3px}[data-line-type=change-addition] [data-diff-span]{background-color:var(--diffs-bg-addition-emphasis)}[data-line-type=change-deletion] [data-diff-span]{background-color:var(--diffs-bg-deletion-emphasis)}[data-merge-conflict=marker-start],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator],[data-merge-conflict=marker-end]{color:var(--diffs-fg);padding-left:1ch}[data-merge-conflict=marker-start],[data-merge-conflict=marker-end]{align-items:center;display:flex}:is([data-merge-conflict=marker-start],[data-merge-conflict=marker-end]):after{color:var(--diffs-fg-conflict-marker);font-size:.75rem;font-style:normal;line-height:1.25rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));padding-left:1ch}[data-merge-conflict=marker-start]:after{content:"(Current Change)"}[data-merge-conflict=marker-end]:after{content:"(Incoming Change)"}[data-merge-conflict-actions-content]{min-height:1.75rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));color:var(--diffs-fg);align-items:center;gap:.25rem;padding-inline:.5rem;font-size:.75rem;line-height:1.2;display:flex}[data-merge-conflict-action]{appearance:none;color:var(--diffs-fg-number);font:inherit;cursor:pointer;background:0 0;border:0;padding:0;font-style:normal}[data-merge-conflict-action]:hover{color:var(--diffs-fg)}[data-merge-conflict-action=current]:hover{color:var(--diffs-addition-base)}[data-merge-conflict-action=incoming]:hover{color:var(--diffs-modified-base)}[data-merge-conflict-action-separator]{color:var(--diffs-fg-number);opacity:.6;-webkit-user-select:none;user-select:none}[data-diffs-header=default]{background-color:var(--diffs-bg);justify-content:space-between;align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));min-height:calc(1lh + var(--diffs-gap-block,var(--diffs-gap-fallback))*3);z-index:2;flex-direction:row;padding-inline:16px;display:flex;position:relative;top:0}[data-header-content]{align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));white-space:nowrap;flex-direction:row;min-width:0;display:flex}[data-header-content] [data-prev-name],[data-header-content] [data-title]{text-overflow:ellipsis;white-space:nowrap;direction:rtl;min-width:0;overflow:hidden}[data-prev-name]{opacity:.7}[data-rename-icon]{fill:currentColor;flex-grow:0;flex-shrink:0}[data-diffs-header=default] [data-metadata]{white-space:nowrap;align-items:center;gap:1ch;display:flex}[data-diffs-header=default] [data-additions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-addition-base)}[data-diffs-header=default] [data-deletions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-deletion-base)}[data-change-icon]{fill:currentColor;flex-shrink:0}[data-change-icon=change],[data-change-icon=rename-pure],[data-change-icon=rename-changed]{color:var(--diffs-modified-base)}[data-change-icon=new]{color:var(--diffs-addition-base)}[data-change-icon=deleted]{color:var(--diffs-deletion-base)}[data-change-icon=file]{opacity:.6}[data-annotation-content]{z-index:2;isolation:isolate;align-self:flex-start;min-width:0;display:flow-root;position:relative}[data-overflow=scroll] [data-annotation-content],[data-overflow=scroll] [data-merge-conflict-actions-content]{width:var(--diffs-column-content-width,auto);left:var(--diffs-column-number-width,0);position:sticky}[data-annotation-slot]{text-wrap-mode:wrap;word-break:normal;white-space-collapse:collapse}[data-gutter-utility-slot]{touch-action:none;justify-content:flex-end;display:flex;position:absolute;top:0;bottom:0;right:0}[data-utility-button]{appearance:none;cursor:pointer;width:1lh;height:1lh;font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);background-color:var(--diffs-modified-base);color:var(--diffs-bg);fill:currentColor;z-index:4;touch-action:none;border:none;border-radius:4px;justify-content:center;align-items:center;margin-right:calc(1ch - 1lh);padding:0;display:flex;position:relative}[data-utility-button]:before{content:"";display:block;position:absolute;inset:0 0 0 -4px}[data-decoration-bar-stack]{pointer-events:none;isolation:isolate;z-index:1;background-color:var(--diffs-decoration-bar-color,transparent);box-sizing:content-box;border-left:2px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg);width:6px;position:absolute;top:0;bottom:0;right:-2px}[data-decoration-bar-depth="1"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 20%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="2"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 45%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="3"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 65%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-start] [data-decoration-bar-stack]{border-top-left-radius:5px;border-top-right-radius:5px}[data-decoration-bar-end] [data-decoration-bar-stack]{z-index:3;border-bottom-right-radius:5px;border-bottom-left-radius:5px}[data-placeholder]{contain:strict}[data-error-wrapper]{padding:var(--diffs-gap-block,var(--diffs-gap-fallback)) var(--diffs-gap-inline,var(--diffs-gap-fallback));scrollbar-width:none;max-height:400px;overflow:auto}[data-error-wrapper] [data-error-message]{color:var(--diffs-deletion-base);font-size:18px;font-weight:700}[data-error-wrapper] [data-error-stack]{color:var(--diffs-fg-number)}}@layer theme,rendered,unsafe;
@layer theme {
}</style><style data-theme-css="">@layer base, theme, rendered, unsafe;
@layer rendered {
:host {
--diffs-scrollbar-gutter-measured: var(--diffs-scrollbar-gutter-fallback);
--diffs-dark:#fafafa;--diffs-dark-bg:#0a0a0a;--diffs-dark-addition-color:#07c480;--diffs-dark-deletion-color:#ff2e3f;--diffs-dark-modified-color:#009fff;--diffs-light:#0a0a0a;--diffs-light-bg:#ffffff;--diffs-light-addition-color:#18a46c;--diffs-light-deletion-color:#d52c36;--diffs-light-modified-color:#009fff;
}
}</style><div data-diffs-header="default" data-change-type="change"><div data-header-content=""><slot name="header-prefix"></slot><svg width="16" height="16" viewBox="0 0 16 16" data-change-icon="change"><use href="#diffs-icon-symbol-modified"></use></svg><div data-title=""><bdi>Tests/StreamResolverTests.swift</bdi></div></div><div data-metadata=""><span data-deletions-count="">-1</span><span data-additions-count="">+59</span><slot name="header-metadata"></slot></div></div><pre data-diff="" data-diff-type="split" data-overflow="scroll" data-background="" data-indicators="bars" tabindex="0" style="--diffs-min-number-column-width-default:3ch;" data-dehydrated=""><code data-code="" data-container-size="" data-deletions=""><div data-gutter="" style="grid-row: span 88"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">39 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="40" data-line-index="39,39"><span data-line-number-content="">40</span></div><div data-line-type="context" data-column-number="41" data-line-index="40,40"><span data-line-number-content="">41</span></div><div data-line-type="context" data-column-number="42" data-line-index="41,41"><span data-line-number-content="">42</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="43" data-line-index="43,43"><span data-line-number-content="">43</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="44" data-line-index="45,45"><span data-line-number-content="">44</span></div><div data-line-type="context" data-column-number="45" data-line-index="46,46"><span data-line-number-content="">45</span></div><div data-line-type="context" data-column-number="46" data-line-index="47,47"><span data-line-number-content="">46</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">390 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="437" data-line-index="438,438"><span data-line-number-content="">437</span></div><div data-line-type="context" data-column-number="438" data-line-index="439,439"><span data-line-number-content="">438</span></div><div data-line-type="context" data-column-number="439" data-line-index="440,440"><span data-line-number-content="">439</span></div><div data-gutter-buffer="buffer" data-buffer-size="12" style="grid-row: span 12;min-height:calc(12 * 1lh);"></div><div data-line-type="context" data-column-number="440" data-line-index="453,453"><span data-line-number-content="">440</span></div><div data-line-type="context" data-column-number="441" data-line-index="454,454"><span data-line-number-content="">441</span></div><div data-line-type="context" data-column-number="442" data-line-index="455,455"><span data-line-number-content="">442</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">30 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="473" data-line-index="486,486"><span data-line-number-content="">473</span></div><div data-line-type="context" data-column-number="474" data-line-index="487,487"><span data-line-number-content="">474</span></div><div data-line-type="context" data-column-number="475" data-line-index="488,488"><span data-line-number-content="">475</span></div><div data-line-type="change-deletion" data-column-number="476" data-line-index="489,489"><span data-line-number-content="">476</span></div><div data-line-type="context" data-column-number="477" data-line-index="491,490"><span data-line-number-content="">477</span></div><div data-line-type="context" data-column-number="478" data-line-index="492,491"><span data-line-number-content="">478</span></div><div data-line-type="context" data-column-number="479" data-line-index="493,492"><span data-line-number-content="">479</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">2 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="482" data-line-index="496,495"><span data-line-number-content="">482</span></div><div data-line-type="context" data-column-number="483" data-line-index="497,496"><span data-line-number-content="">483</span></div><div data-line-type="context" data-column-number="484" data-line-index="498,497"><span data-line-number-content="">484</span></div><div data-gutter-buffer="buffer" data-buffer-size="44" style="grid-row: span 44;min-height:calc(44 * 1lh);"></div><div data-line-type="context" data-column-number="485" data-line-index="543,542"><span data-line-number-content="">485</span></div><div data-line-type="context" data-column-number="486" data-line-index="544,543"><span data-line-number-content="">486</span></div><div data-line-type="context" data-column-number="487" data-line-index="545,544"><span data-line-number-content="">487</span></div></div><div data-content="" style="grid-row: span 88"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">39 unmodified lines</span></div></div></div><div data-line="40" data-alt-line="40" data-line-type="context" data-line-index="39,39"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCachePrefetchPrioritizesSeekOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="41" data-alt-line="41" data-line-type="context" data-line-index="40,40"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheSeekPrimingIncludesObservedVLCStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="42" data-alt-line="42" data-line-type="context" data-line-index="41,41"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCachePrefetchUsesGlobalChunkBoundaries</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="43" data-alt-line="44" data-line-type="context" data-line-index="43,43"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheForegroundMissReprioritizesPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="44" data-alt-line="46" data-line-type="context" data-line-index="45,45"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeProbeFallsBackWhenServerIgnoresRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="45" data-alt-line="47" data-line-type="context" data-line-index="46,46"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeFetcherPreservesHeaders</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="46" data-alt-line="48" data-line-type="context" data-line-index="47,47"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"StreamResolverTests passed"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">390 unmodified lines</span></div></div></div><div data-line="437" data-alt-line="439" data-line-type="context" data-line-index="438,438"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">chunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 212_860_928</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 213_909_503</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="438" data-alt-line="440" data-line-type="context" data-line-index="439,439"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="439" data-alt-line="441" data-line-type="context" data-line-index="440,440">
</div><div data-content-buffer="" data-buffer-size="12" style="grid-row: span 12;min-height:calc(12 * 1lh)"></div><div data-line="440" data-alt-line="454" data-line-type="context" data-line-index="453,453"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheForegroundMissReprioritizesPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> async</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="441" data-alt-line="455" data-line-type="context" data-line-index="454,454"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queue </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> DispatchQueue</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">label</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "dreamio.range-cache-test"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="442" data-alt-line="456" data-line-type="context" data-line-index="455,455"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> requestedRanges: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">String</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">30 unmodified lines</span></div></div></div><div data-line="473" data-alt-line="487" data-line-type="context" data-line-index="486,486"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> Task.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sleep</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">nanoseconds</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 50_000_000</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="474" data-alt-line="488" data-line-type="context" data-line-index="487,487">
</div><div data-line="475" data-alt-line="489" data-line-type="context" data-line-index="488,488"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> ranges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queue.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sync</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> requestedRanges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">}</span></div><div data-line="476" data-line-type="change-deletion" data-line-index="489,489"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">ranges.contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"bytes=</span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">51818977-52867552</span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected foreground VLC </span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">range</span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> to </span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">be fetched</span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="477" data-alt-line="491" data-line-type="context" data-line-index="491,490"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">ranges.contains </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span></div><div data-line="478" data-alt-line="492" data-line-type="context" data-line-index="492,491"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range.hasPrefix</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"bytes=52428800-"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="479" data-alt-line="493" data-line-type="context" data-line-index="493,492"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected prefetch to restart on a global chunk boundary near VLC's foreground range, got </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">ranges</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">2 unmodified lines</span></div></div></div><div data-line="482" data-alt-line="496" data-line-type="context" data-line-index="496,495"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> Task.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sleep</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">nanoseconds</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 50_000_000</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="483" data-alt-line="497" data-line-type="context" data-line-index="497,496"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="484" data-alt-line="498" data-line-type="context" data-line-index="498,497">
</div><div data-content-buffer="" data-buffer-size="44" style="grid-row: span 44;min-height:calc(44 * 1lh)"></div><div data-line="485" data-alt-line="543" data-line-type="context" data-line-index="543,542"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> byteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">fromHeader</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> header</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">String</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contentLength</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> HTTPByteRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="486" data-alt-line="544" data-line-type="context" data-line-index="544,543"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> value </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> header.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">replacingOccurrences</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">of</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "bytes="</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, with</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> ""</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="487" data-alt-line="545" data-line-type="context" data-line-index="545,544"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> pieces </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> value.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">split</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">separator</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "-"</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, maxSplits</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">map</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">String</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE">init</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div></div></code><code data-code="" data-container-size="" data-additions=""><div data-gutter="" style="grid-row: span 88"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">39 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="40" data-line-index="39,39"><span data-line-number-content="">40</span></div><div data-line-type="context" data-column-number="41" data-line-index="40,40"><span data-line-number-content="">41</span></div><div data-line-type="context" data-column-number="42" data-line-index="41,41"><span data-line-number-content="">42</span></div><div data-line-type="change-addition" data-column-number="43" data-line-index="42,42"><span data-line-number-content="">43</span></div><div data-line-type="context" data-column-number="44" data-line-index="43,43"><span data-line-number-content="">44</span></div><div data-line-type="change-addition" data-column-number="45" data-line-index="44,44"><span data-line-number-content="">45</span></div><div data-line-type="context" data-column-number="46" data-line-index="45,45"><span data-line-number-content="">46</span></div><div data-line-type="context" data-column-number="47" data-line-index="46,46"><span data-line-number-content="">47</span></div><div data-line-type="context" data-column-number="48" data-line-index="47,47"><span data-line-number-content="">48</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">390 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="439" data-line-index="438,438"><span data-line-number-content="">439</span></div><div data-line-type="context" data-column-number="440" data-line-index="439,439"><span data-line-number-content="">440</span></div><div data-line-type="context" data-column-number="441" data-line-index="440,440"><span data-line-number-content="">441</span></div><div data-line-type="change-addition" data-column-number="442" data-line-index="441,441"><span data-line-number-content="">442</span></div><div data-line-type="change-addition" data-column-number="443" data-line-index="442,442"><span data-line-number-content="">443</span></div><div data-line-type="change-addition" data-column-number="444" data-line-index="443,443"><span data-line-number-content="">444</span></div><div data-line-type="change-addition" data-column-number="445" data-line-index="444,444"><span data-line-number-content="">445</span></div><div data-line-type="change-addition" data-column-number="446" data-line-index="445,445"><span data-line-number-content="">446</span></div><div data-line-type="change-addition" data-column-number="447" data-line-index="446,446"><span data-line-number-content="">447</span></div><div data-line-type="change-addition" data-column-number="448" data-line-index="447,447"><span data-line-number-content="">448</span></div><div data-line-type="change-addition" data-column-number="449" data-line-index="448,448"><span data-line-number-content="">449</span></div><div data-line-type="change-addition" data-column-number="450" data-line-index="449,449"><span data-line-number-content="">450</span></div><div data-line-type="change-addition" data-column-number="451" data-line-index="450,450"><span data-line-number-content="">451</span></div><div data-line-type="change-addition" data-column-number="452" data-line-index="451,451"><span data-line-number-content="">452</span></div><div data-line-type="change-addition" data-column-number="453" data-line-index="452,452"><span data-line-number-content="">453</span></div><div data-line-type="context" data-column-number="454" data-line-index="453,453"><span data-line-number-content="">454</span></div><div data-line-type="context" data-column-number="455" data-line-index="454,454"><span data-line-number-content="">455</span></div><div data-line-type="context" data-column-number="456" data-line-index="455,455"><span data-line-number-content="">456</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">30 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="487" data-line-index="486,486"><span data-line-number-content="">487</span></div><div data-line-type="context" data-column-number="488" data-line-index="487,487"><span data-line-number-content="">488</span></div><div data-line-type="context" data-column-number="489" data-line-index="488,488"><span data-line-number-content="">489</span></div><div data-line-type="change-addition" data-column-number="490" data-line-index="490,489"><span data-line-number-content="">490</span></div><div data-line-type="context" data-column-number="491" data-line-index="491,490"><span data-line-number-content="">491</span></div><div data-line-type="context" data-column-number="492" data-line-index="492,491"><span data-line-number-content="">492</span></div><div data-line-type="context" data-column-number="493" data-line-index="493,492"><span data-line-number-content="">493</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">2 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="496" data-line-index="496,495"><span data-line-number-content="">496</span></div><div data-line-type="context" data-column-number="497" data-line-index="497,496"><span data-line-number-content="">497</span></div><div data-line-type="context" data-column-number="498" data-line-index="498,497"><span data-line-number-content="">498</span></div><div data-line-type="change-addition" data-column-number="499" data-line-index="499,498"><span data-line-number-content="">499</span></div><div data-line-type="change-addition" data-column-number="500" data-line-index="500,499"><span data-line-number-content="">500</span></div><div data-line-type="change-addition" data-column-number="501" data-line-index="501,500"><span data-line-number-content="">501</span></div><div data-line-type="change-addition" data-column-number="502" data-line-index="502,501"><span data-line-number-content="">502</span></div><div data-line-type="change-addition" data-column-number="503" data-line-index="503,502"><span data-line-number-content="">503</span></div><div data-line-type="change-addition" data-column-number="504" data-line-index="504,503"><span data-line-number-content="">504</span></div><div data-line-type="change-addition" data-column-number="505" data-line-index="505,504"><span data-line-number-content="">505</span></div><div data-line-type="change-addition" data-column-number="506" data-line-index="506,505"><span data-line-number-content="">506</span></div><div data-line-type="change-addition" data-column-number="507" data-line-index="507,506"><span data-line-number-content="">507</span></div><div data-line-type="change-addition" data-column-number="508" data-line-index="508,507"><span data-line-number-content="">508</span></div><div data-line-type="change-addition" data-column-number="509" data-line-index="509,508"><span data-line-number-content="">509</span></div><div data-line-type="change-addition" data-column-number="510" data-line-index="510,509"><span data-line-number-content="">510</span></div><div data-line-type="change-addition" data-column-number="511" data-line-index="511,510"><span data-line-number-content="">511</span></div><div data-line-type="change-addition" data-column-number="512" data-line-index="512,511"><span data-line-number-content="">512</span></div><div data-line-type="change-addition" data-column-number="513" data-line-index="513,512"><span data-line-number-content="">513</span></div><div data-line-type="change-addition" data-column-number="514" data-line-index="514,513"><span data-line-number-content="">514</span></div><div data-line-type="change-addition" data-column-number="515" data-line-index="515,514"><span data-line-number-content="">515</span></div><div data-line-type="change-addition" data-column-number="516" data-line-index="516,515"><span data-line-number-content="">516</span></div><div data-line-type="change-addition" data-column-number="517" data-line-index="517,516"><span data-line-number-content="">517</span></div><div data-line-type="change-addition" data-column-number="518" data-line-index="518,517"><span data-line-number-content="">518</span></div><div data-line-type="change-addition" data-column-number="519" data-line-index="519,518"><span data-line-number-content="">519</span></div><div data-line-type="change-addition" data-column-number="520" data-line-index="520,519"><span data-line-number-content="">520</span></div><div data-line-type="change-addition" data-column-number="521" data-line-index="521,520"><span data-line-number-content="">521</span></div><div data-line-type="change-addition" data-column-number="522" data-line-index="522,521"><span data-line-number-content="">522</span></div><div data-line-type="change-addition" data-column-number="523" data-line-index="523,522"><span data-line-number-content="">523</span></div><div data-line-type="change-addition" data-column-number="524" data-line-index="524,523"><span data-line-number-content="">524</span></div><div data-line-type="change-addition" data-column-number="525" data-line-index="525,524"><span data-line-number-content="">525</span></div><div data-line-type="change-addition" data-column-number="526" data-line-index="526,525"><span data-line-number-content="">526</span></div><div data-line-type="change-addition" data-column-number="527" data-line-index="527,526"><span data-line-number-content="">527</span></div><div data-line-type="change-addition" data-column-number="528" data-line-index="528,527"><span data-line-number-content="">528</span></div><div data-line-type="change-addition" data-column-number="529" data-line-index="529,528"><span data-line-number-content="">529</span></div><div data-line-type="change-addition" data-column-number="530" data-line-index="530,529"><span data-line-number-content="">530</span></div><div data-line-type="change-addition" data-column-number="531" data-line-index="531,530"><span data-line-number-content="">531</span></div><div data-line-type="change-addition" data-column-number="532" data-line-index="532,531"><span data-line-number-content="">532</span></div><div data-line-type="change-addition" data-column-number="533" data-line-index="533,532"><span data-line-number-content="">533</span></div><div data-line-type="change-addition" data-column-number="534" data-line-index="534,533"><span data-line-number-content="">534</span></div><div data-line-type="change-addition" data-column-number="535" data-line-index="535,534"><span data-line-number-content="">535</span></div><div data-line-type="change-addition" data-column-number="536" data-line-index="536,535"><span data-line-number-content="">536</span></div><div data-line-type="change-addition" data-column-number="537" data-line-index="537,536"><span data-line-number-content="">537</span></div><div data-line-type="change-addition" data-column-number="538" data-line-index="538,537"><span data-line-number-content="">538</span></div><div data-line-type="change-addition" data-column-number="539" data-line-index="539,538"><span data-line-number-content="">539</span></div><div data-line-type="change-addition" data-column-number="540" data-line-index="540,539"><span data-line-number-content="">540</span></div><div data-line-type="change-addition" data-column-number="541" data-line-index="541,540"><span data-line-number-content="">541</span></div><div data-line-type="change-addition" data-column-number="542" data-line-index="542,541"><span data-line-number-content="">542</span></div><div data-line-type="context" data-column-number="543" data-line-index="543,542"><span data-line-number-content="">543</span></div><div data-line-type="context" data-column-number="544" data-line-index="544,543"><span data-line-number-content="">544</span></div><div data-line-type="context" data-column-number="545" data-line-index="545,544"><span data-line-number-content="">545</span></div></div><div data-content="" style="grid-row: span 88"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">39 unmodified lines</span></div></div></div><div data-line="40" data-alt-line="40" data-line-type="context" data-line-index="39,39"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCachePrefetchPrioritizesSeekOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="41" data-alt-line="41" data-line-type="context" data-line-index="40,40"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheSeekPrimingIncludesObservedVLCStart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="42" data-alt-line="42" data-line-type="context" data-line-index="41,41"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCachePrefetchUsesGlobalChunkBoundaries</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="43" data-line-type="change-addition" data-line-index="42,42"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheForegroundMissFetchesAlignedChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="44" data-alt-line="43" data-line-type="context" data-line-index="43,43"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheForegroundMissReprioritizesPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="45" data-line-type="change-addition" data-line-index="44,44"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheHitFollowsActualPostSeekReadArea</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="46" data-alt-line="44" data-line-type="context" data-line-index="45,45"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeProbeFallsBackWhenServerIgnoresRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="47" data-alt-line="45" data-line-type="context" data-line-index="46,46"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeFetcherPreservesHeaders</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="48" data-alt-line="46" data-line-type="context" data-line-index="47,47"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"StreamResolverTests passed"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">390 unmodified lines</span></div></div></div><div data-line="439" data-alt-line="437" data-line-type="context" data-line-index="438,438"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">chunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7">0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 212_860_928</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 213_909_503</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="440" data-alt-line="438" data-line-type="context" data-line-index="439,439"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="441" data-alt-line="439" data-line-type="context" data-line-index="440,440">
</div><div data-line="442" data-line-type="change-addition" data-line-index="441,441"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheForegroundMissFetchesAlignedChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="443" data-line-type="change-addition" data-line-index="442,442"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> ProgressiveHTTPRangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="444" data-line-type="change-addition" data-line-index="443,443"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> fetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPRangeRemoteFetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> URL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">string</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "https://example.test/video.mkv"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)!</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, headers</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> [</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="445" data-line-type="change-addition" data-line-index="444,444"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> contentLength</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 711_080_522</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="446" data-line-type="change-addition" data-line-index="445,445"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> durationProvider</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="447" data-line-type="change-addition" data-line-index="446,446"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span></div><div data-line="448" data-line-type="change-addition" data-line-index="447,447">
</div><div data-line="449" data-line-type="change-addition" data-line-index="448,448"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> chunks </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">alignedChunks</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">covering</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 48_234_649</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 49_185_907</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="450" data-line-type="change-addition" data-line-index="449,449">
</div><div data-line="451" data-line-type="change-addition" data-line-index="450,450"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assertEqual</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">chunks, [HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 48_234_496</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 49_283_071</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="452" data-line-type="change-addition" data-line-index="451,451"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="453" data-line-type="change-addition" data-line-index="452,452">
</div><div data-line="454" data-alt-line="440" data-line-type="context" data-line-index="453,453"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheForegroundMissReprioritizesPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> async</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="455" data-alt-line="441" data-line-type="context" data-line-index="454,454"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queue </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> DispatchQueue</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">label</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "dreamio.range-cache-test"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="456" data-alt-line="442" data-line-type="context" data-line-index="455,455"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> requestedRanges: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">String</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">30 unmodified lines</span></div></div></div><div data-line="487" data-alt-line="473" data-line-type="context" data-line-index="486,486"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> Task.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sleep</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">nanoseconds</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 50_000_000</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="488" data-alt-line="474" data-line-type="context" data-line-index="487,487">
</div><div data-line="489" data-alt-line="475" data-line-type="context" data-line-index="488,488"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> ranges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queue.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sync</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> requestedRanges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">}</span></div><div data-line="490" data-line-type="change-addition" data-line-index="490,489"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">ranges.contains</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"bytes=</span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">51380224-52428799</span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected foreground VLC </span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">miss</span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> to </span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">fetch aligned cache chunks</span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="491" data-alt-line="477" data-line-type="context" data-line-index="491,490"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">ranges.contains </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span></div><div data-line="492" data-alt-line="478" data-line-type="context" data-line-index="492,491"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range.hasPrefix</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"bytes=52428800-"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="493" data-alt-line="479" data-line-type="context" data-line-index="493,492"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected prefetch to restart on a global chunk boundary near VLC's foreground range, got </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">ranges</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">2 unmodified lines</span></div></div></div><div data-line="496" data-alt-line="482" data-line-type="context" data-line-index="496,495"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> Task.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sleep</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">nanoseconds</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 50_000_000</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="497" data-alt-line="483" data-line-type="context" data-line-index="497,496"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="498" data-alt-line="484" data-line-type="context" data-line-index="498,497">
</div><div data-line="499" data-line-type="change-addition" data-line-index="499,498"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> testRangeCacheHitFollowsActualPostSeekReadArea</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> async</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="500" data-line-type="change-addition" data-line-index="500,499"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queue </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> DispatchQueue</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">label</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "dreamio.range-cache-hit-follow-test"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="501" data-line-type="change-addition" data-line-index="501,500"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> requestedRanges: </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">[</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">String</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">]</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> []</span></div><div data-line="502" data-line-type="change-addition" data-line-index="502,501"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> MockURLProtocol.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">handler</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> request </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span></div><div data-line="503" data-line-type="change-addition" data-line-index="503,502"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> range </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> request.value</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">forHTTPHeaderField</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "Range"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> ??</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> ""</span></div><div data-line="504" data-line-type="change-addition" data-line-index="504,503"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queue.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sync</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="505" data-line-type="change-addition" data-line-index="505,504"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> requestedRanges.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">append</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="506" data-line-type="change-addition" data-line-index="506,505"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="507" data-line-type="change-addition" data-line-index="507,506"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> byteRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> byteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">fromHeader</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range, contentLength</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 80_000_000</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="508" data-line-type="change-addition" data-line-index="508,507"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> response </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPURLResponse</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="509" data-line-type="change-addition" data-line-index="509,508"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> request.url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">!</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="510" data-line-type="change-addition" data-line-index="510,509"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> statusCode</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 206</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="511" data-line-type="change-addition" data-line-index="511,510"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> httpVersion</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="512" data-line-type="change-addition" data-line-index="512,511"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> headerFields</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> [</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Content-Range"</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "bytes </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">byteRange.start</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">-</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">byteRange.end</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">/80000000"</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">]</span></div><div data-line="513" data-line-type="change-addition" data-line-index="513,512"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )!</span></div><div data-line="514" data-line-type="change-addition" data-line-index="514,513"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> (</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">Data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">repeating</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, count</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> Int</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">byteRange.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">length</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, response</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="515" data-line-type="change-addition" data-line-index="515,514"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="516" data-line-type="change-addition" data-line-index="516,515">
</div><div data-line="517" data-line-type="change-addition" data-line-index="517,516"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> ProgressiveHTTPRangeCacheSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="518" data-line-type="change-addition" data-line-index="518,517"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> fetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPRangeRemoteFetcher</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span></div><div data-line="519" data-line-type="change-addition" data-line-index="519,518"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> url</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> URL</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">string</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "https://cdn.example.test/movie.mp4"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)!</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="520" data-line-type="change-addition" data-line-index="520,519"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> headers</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> [</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">],</span></div><div data-line="521" data-line-type="change-addition" data-line-index="521,520"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> session</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> mockSession</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="522" data-line-type="change-addition" data-line-index="522,521"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="523" data-line-type="change-addition" data-line-index="523,522"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> contentLength</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 80_000_000</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">,</span></div><div data-line="524" data-line-type="change-addition" data-line-index="524,523"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> durationProvider</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 100</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="525" data-line-type="change-addition" data-line-index="525,524"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> )</span></div><div data-line="526" data-line-type="change-addition" data-line-index="526,525"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> defer</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="527" data-line-type="change-addition" data-line-index="527,526"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">cancelPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="528" data-line-type="change-addition" data-line-index="528,527"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="529" data-line-type="change-addition" data-line-index="529,528">
</div><div data-line="530" data-line-type="change-addition" data-line-index="530,529"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">store</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> Data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">repeating</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 7</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, count</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1_048_576</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 27_165_812</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="531" data-line-type="change-addition" data-line-index="531,530"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">prefetchForSeek</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 15_936_567</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="532" data-line-type="change-addition" data-line-index="532,531"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> _ </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> session.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 27_165_812</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, end</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 28_214_387</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">))</span></div><div data-line="533" data-line-type="change-addition" data-line-index="533,532"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> Task.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sleep</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">nanoseconds</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 100_000_000</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="534" data-line-type="change-addition" data-line-index="534,533">
</div><div data-line="535" data-line-type="change-addition" data-line-index="535,534"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> ranges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> queue.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sync</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> requestedRanges </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">}</span></div><div data-line="536" data-line-type="change-addition" data-line-index="536,535"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> assert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">ranges.contains </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">in</span></div><div data-line="537" data-line-type="change-addition" data-line-index="537,536"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> range.hasPrefix</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"bytes=27262976-"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="538" data-line-type="change-addition" data-line-index="538,537"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, </span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"Expected a cache hit far from the seek estimate to restart prefetch near VLC's real read area, got </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">ranges</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="539" data-line-type="change-addition" data-line-index="539,538"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> MockURLProtocol.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">handler</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="540" data-line-type="change-addition" data-line-index="540,539"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> Task.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">sleep</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">nanoseconds</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 50_000_000</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="541" data-line-type="change-addition" data-line-index="541,540"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="542" data-line-type="change-addition" data-line-index="542,541">
</div><div data-line="543" data-alt-line="485" data-line-type="context" data-line-index="543,542"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> static</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> byteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">fromHeader</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> header</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">String</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, </span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">contentLength</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> HTTPByteRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div><div data-line="544" data-alt-line="486" data-line-type="context" data-line-index="544,543"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> value </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> header.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">replacingOccurrences</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">of</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "bytes="</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, with</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> ""</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="545" data-alt-line="487" data-line-type="context" data-line-index="545,544"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> pieces </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> value.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">split</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">separator</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "-"</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, maxSplits</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">map</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">String</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">.</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE">init</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div></div></code></pre></section><h3>Related issues or PRs</h3><p>Beads issue <code>dreamio-mi1</code>.</p></section>
<section class="panel">
<h2>New Changes as of May 26, 2026 at 10:52 AM EDT</h2>
<h3>Summary of changes</h3>
<p>Updated the local HTTP range cache prefetch bookkeeping after reviewing fresh device logs from normal playback and a warmed-cache 15 second skip. Normal cold-cache misses are expected, but the warmed-cache skip showed the foreground read moving behind the active prefetch cursor while older prefetch state could still finish and mutate session state.</p>
<h3>Why this change was made</h3>
<p>The cache should follow the bytes VLC is actually reading after a skip, not keep stale prefetch state alive after a newer foreground read has reoriented the cache. This update makes canceled prefetch workers stop before inserting fetched bytes after cancellation and prevents stale workers from clearing newer active prefetch state.</p>
<h3>Code diffs</h3>
<p class="note">Rendered with <code>@pierre/diffs/ssr</code>.</p>
<section class="diff-file"><h3>Dreamio/ProgressiveHTTPRangeCache.swift</h3><svg data-icon-sprite aria-hidden="true" width="0" height="0">
<symbol id="diffs-icon-arrow-right-short" viewBox="0 0 16 16">
<path d="M8.47 4.22a.75.75 0 0 0 0 1.06l1.97 1.97H3.75a.75.75 0 0 0 0 1.5h6.69l-1.97 1.97a.75.75 0 1 0 1.06 1.06l3.25-3.25a.75.75 0 0 0 0-1.06L9.53 4.22a.75.75 0 0 0-1.06 0"/>
</symbol>
<symbol id="diffs-icon-brand-github" viewBox="0 0 16 16">
<path d="M8 0c4.42 0 8 3.58 8 8a8.01 8.01 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27s-1.36.09-2 .27c-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8"/>
</symbol>
<symbol id="diffs-icon-chevron" viewBox="0 0 16 16">
<path d="M1.47 4.47a.75.75 0 0 1 1.06 0L8 9.94l5.47-5.47a.75.75 0 1 1 1.06 1.06l-6 6a.75.75 0 0 1-1.06 0l-6-6a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-chevrons-narrow" viewBox="0 0 10 16">
<path d="M4.47 2.22a.75.75 0 0 1 1.06 0l3.25 3.25a.75.75 0 0 1-1.06 1.06L5 3.81 2.28 6.53a.75.75 0 0 1-1.06-1.06zM1.22 9.47a.75.75 0 0 1 1.06 0L5 12.19l2.72-2.72a.75.75 0 0 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0l-3.25-3.25a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-diff-split" viewBox="0 0 16 16">
<path d="M14 0H8.5v16H14a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2m-1.5 6.5v1h1a.5.5 0 0 1 0 1h-1v1a.5.5 0 0 1-1 0v-1h-1a.5.5 0 0 1 0-1h1v-1a.5.5 0 0 1 1 0"/><path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h5.5V0zm.5 7.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1 0-1" opacity=".3"/>
</symbol>
<symbol id="diffs-icon-diff-unified" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M16 14a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V8.5h16zm-8-4a.5.5 0 0 0-.5.5v1h-1a.5.5 0 0 0 0 1h1v1a.5.5 0 0 0 1 0v-1h1a.5.5 0 0 0 0-1h-1v-1A.5.5 0 0 0 8 10" clip-rule="evenodd"/><path fill-rule="evenodd" d="M14 0a2 2 0 0 1 2 2v5.5H0V2a2 2 0 0 1 2-2zM6.5 3.5a.5.5 0 0 0 0 1h3a.5.5 0 0 0 0-1z" clip-rule="evenodd" opacity=".4"/>
</symbol>
<symbol id="diffs-icon-expand" viewBox="0 0 16 16">
<path d="M3.47 5.47a.75.75 0 0 1 1.06 0L8 8.94l3.47-3.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 0 1 0-1.06"/>
</symbol>
<symbol id="diffs-icon-expand-all" viewBox="0 0 16 16">
<path d="M11.47 9.47a.75.75 0 1 1 1.06 1.06l-4 4a.75.75 0 0 1-1.06 0l-4-4a.75.75 0 1 1 1.06-1.06L8 12.94zM7.526 1.418a.75.75 0 0 1 1.004.052l4 4a.75.75 0 1 1-1.06 1.06L8 3.06 4.53 6.53a.75.75 0 1 1-1.06-1.06l4-4z"/>
</symbol>
<symbol id="diffs-icon-file-code" viewBox="0 0 16 16">
<path d="M10.75 0c.199 0 .39.08.53.22l3.5 3.5c.14.14.22.331.22.53v9A2.75 2.75 0 0 1 12.25 16h-8.5A2.75 2.75 0 0 1 1 13.25V2.75A2.75 2.75 0 0 1 3.75 0zm-7 1.5c-.69 0-1.25.56-1.25 1.25v10.5c0 .69.56 1.25 1.25 1.25h8.5c.69 0 1.25-.56 1.25-1.25V5h-1.25A2.25 2.25 0 0 1 10 2.75V1.5z"/><path d="M7.248 6.19a.75.75 0 0 1 .063 1.058L5.753 9l1.558 1.752a.75.75 0 0 1-1.122.996l-2-2.25a.75.75 0 0 1 0-.996l2-2.25a.75.75 0 0 1 1.06-.063M8.69 7.248a.75.75 0 1 1 1.12-.996l2 2.25a.75.75 0 0 1 0 .996l-2 2.25a.75.75 0 1 1-1.12-.996L10.245 9z"/>
</symbol>
<symbol id="diffs-icon-plus" viewBox="0 0 16 16">
<path d="M8 3a.75.75 0 0 1 .75.75v3.5h3.5a.75.75 0 0 1 0 1.5h-3.5v3.5a.75.75 0 0 1-1.5 0v-3.5h-3.5a.75.75 0 0 1 0-1.5h3.5v-3.5A.75.75 0 0 1 8 3"/>
</symbol>
<symbol id="diffs-icon-symbol-added" viewBox="0 0 16 16">
<path d="M8 4a.75.75 0 0 1 .75.75v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5A.75.75 0 0 1 8 4"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
</symbol>
<symbol id="diffs-icon-symbol-deleted" viewBox="0 0 16 16">
<path d="M4 8a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5A.75.75 0 0 1 4 8"/><path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/>
</symbol>
<symbol id="diffs-icon-symbol-diffstat" viewBox="0 0 16 16">
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.75 4.296a.75.75 0 0 0-1.5 0V6.25h-2a.75.75 0 0 0 0 1.5h2v1.5h1.5v-1.5h2a.75.75 0 0 0 0-1.5h-2zM5.25 10a.75.75 0 0 0 0 1.5h5.5a.75.75 0 0 0 0-1.5z"/>
</symbol>
<symbol id="diffs-icon-symbol-ignored" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m11.53-2.47a.75.75 0 0 0-1.06-1.06l-6 6a.75.75 0 1 0 1.06 1.06z"/>
</symbol>
<symbol id="diffs-icon-symbol-modified" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706s.826.607 1.706.802c.898.2 2.091.288 3.704.288s2.806-.088 3.704-.288c.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5s-2.806.088-3.704.288c-.88.196-1.381.478-1.706.802s-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8M0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m8 3a3 3 0 1 0 0-6 3 3 0 0 0 0 6"/>
</symbol>
<symbol id="diffs-icon-symbol-moved" viewBox="0 0 16 16">
<path d="M1.788 4.296c.196-.88.478-1.381.802-1.706s.826-.606 1.706-.802C5.194 1.588 6.387 1.5 8 1.5s2.806.088 3.704.288c.88.196 1.381.478 1.706.802s.607.826.802 1.706c.2.898.288 2.091.288 3.704s-.088 2.806-.288 3.704c-.195.88-.478 1.381-.802 1.706s-.826.607-1.706.802c-.898.2-2.091.288-3.704.288s-2.806-.088-3.704-.288c-.88-.195-1.381-.478-1.706-.802s-.606-.826-.802-1.706C1.588 10.806 1.5 9.613 1.5 8s.088-2.806.288-3.704M8 0C1.412 0 0 1.412 0 8s1.412 8 8 8 8-1.412 8-8-1.412-8-8-8"/><path d="M8.495 4.695a.75.75 0 0 0-.05 1.06L10.486 8l-2.041 2.246a.75.75 0 0 0 1.11 1.008l2.5-2.75a.75.75 0 0 0 0-1.008l-2.5-2.75a.75.75 0 0 0-1.06-.051m-4 0a.75.75 0 0 0-.05 1.06l2.044 2.248-1.796 1.995a.75.75 0 0 0 1.114 1.004l2.25-2.5a.75.75 0 0 0-.002-1.007l-2.5-2.75a.75.75 0 0 0-1.06-.05"/>
</symbol>
<symbol id="diffs-icon-symbol-ref" viewBox="0 0 16 16">
<path d="M1.5 8c0 1.613.088 2.806.288 3.704.196.88.478 1.381.802 1.706.286.286.71.54 1.41.73V1.86c-.7.19-1.124.444-1.41.73-.324.325-.606.826-.802 1.706C1.588 5.194 1.5 6.387 1.5 8m4 6.397c.697.07 1.522.103 2.5.103 1.613 0 2.806-.088 3.704-.288.88-.195 1.381-.478 1.706-.802s.607-.826.802-1.706c.2-.898.288-2.091.288-3.704s-.088-2.806-.288-3.704c-.195-.88-.478-1.381-.802-1.706s-.826-.606-1.706-.802C10.806 1.588 9.613 1.5 8 1.5c-.978 0-1.803.033-2.5.103zM0 8c0-6.588 1.412-8 8-8s8 1.412 8 8-1.412 8-8 8-8-1.412-8-8m7-2a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H8a1 1 0 0 1-1-1z"/>
</symbol>
</svg><style data-core-css="">@layer base, theme, rendered, unsafe;
@layer base,theme,rendered,unsafe;@layer base{:host{--diffs-font-fallback:"SF Mono", Monaco, Consolas, "Ubuntu Mono", "Liberation Mono", "Courier New", monospace;--diffs-header-font-fallback:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif;--diffs-mixer:light-dark(#000,#fff);--diffs-gap-fallback:8px;--diffs-scrollbar-gutter-fallback:6px;--diffs-scrollbar-gutter:var(--diffs-scrollbar-gutter-override,var(--diffs-scrollbar-gutter-measured,var(--diffs-scrollbar-gutter-fallback)));--diffs-added-light:#0dbe4e;--diffs-added-dark:#5ecc71;--diffs-modified-light:#009fff;--diffs-modified-dark:#69b1ff;--diffs-deleted-light:#ff2e3f;--diffs-deleted-dark:#ff6762;color-scheme:light dark;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);font-feature-settings:var(--diffs-font-features);--diffs-bg:light-dark(var(--diffs-light-bg,#fff),var(--diffs-dark-bg,#000));--diffs-bg-buffer:var(--diffs-bg-buffer-override,light-dark(color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92%, var(--diffs-mixer))));--diffs-bg-context:var(--diffs-bg-context-override,light-dark(color-mix(in lab, var(--diffs-bg) 98.5%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 92.5%, var(--diffs-mixer))));--diffs-bg-context-gutter:var(--diffs-bg-context-gutter-override,light-dark(color-mix(in lab, var(--diffs-bg-context) 90%, var(--diffs-bg)),color-mix(in lab, var(--diffs-bg-context) 45%, var(--diffs-bg))));--diffs-bg-separator:var(--diffs-bg-separator-override,light-dark(color-mix(in lab, var(--diffs-bg) 96%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-bg) 85%, var(--diffs-mixer))));--diffs-fg:light-dark(var(--diffs-light,#000),var(--diffs-dark,#fff));--diffs-fg-number:var(--diffs-fg-number-override,light-dark(color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg)),color-mix(in lab, var(--diffs-fg) 65%, var(--diffs-bg))));--diffs-fg-conflict-marker:var(--diffs-fg-conflict-marker-override,var(--diffs-fg-number));--diffs-deletion-base:var(--diffs-deletion-color-override,light-dark(var(--diffs-light-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-light))),var(--diffs-dark-deletion-color,var(--diffs-deletion-color,var(--diffs-deleted-dark)))));--diffs-addition-base:var(--diffs-addition-color-override,light-dark(var(--diffs-light-addition-color,var(--diffs-addition-color,var(--diffs-added-light))),var(--diffs-dark-addition-color,var(--diffs-addition-color,var(--diffs-added-dark)))));--diffs-modified-base:var(--diffs-modified-color-override,light-dark(var(--diffs-light-modified-color,var(--diffs-modified-color,var(--diffs-modified-light))),var(--diffs-dark-modified-color,var(--diffs-modified-color,var(--diffs-modified-dark)))));--diffs-bg-deletion:var(--diffs-bg-deletion-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-deletion-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-deletion-base))));--diffs-bg-deletion-emphasis:var(--diffs-bg-deletion-emphasis-override,light-dark(rgb(from var(--diffs-deletion-base) r g b / .15),rgb(from var(--diffs-deletion-base) r g b / .2)));--diffs-bg-addition:var(--diffs-bg-addition-override,light-dark(color-mix(in lab, var(--diffs-bg) 88%, var(--diffs-addition-base)),color-mix(in lab, var(--diffs-bg) 80%, var(--diffs-addition-base))));--diffs-bg-addition-emphasis:var(--diffs-bg-addition-emphasis-override,light-dark(rgb(from var(--diffs-addition-base) r g b / .15),rgb(from var(--diffs-addition-base) r g b / .2)));--diffs-selection-base:var(--diffs-modified-base);--diffs-selection-number-fg:light-dark(color-mix(in lab, var(--diffs-selection-base) 65%, var(--diffs-mixer)),color-mix(in lab, var(--diffs-selection-base) 75%, var(--diffs-mixer)));background-color:var(--diffs-bg);color:var(--diffs-fg);display:block}pre,code,[data-error-wrapper]{isolation:isolate;font-family:var(--diffs-font-family,var(--diffs-font-fallback));outline:none;margin:0;padding:0;display:block}pre,code{background-color:var(--diffs-bg)}code{contain:content}*,:before,:after{box-sizing:border-box}[data-icon-sprite]{display:none}[data-diffs-header],[data-separator]{font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback))}[data-diffs-header][data-sticky]{z-index:1;background-color:var(--diffs-bg);position:sticky;top:0}[data-file-info]{color:var(--fg);background-color:color-mix(in lab, var(--bg) 98%, var(--fg));border-block:1px solid color-mix(in lab, var(--bg) 95%, var(--fg));padding:10px;font-weight:700}[data-diff],[data-file]{--diffs-grid-number-column-width:minmax(min-content, max-content);--diffs-code-grid:var(--diffs-grid-number-column-width) 1fr}[data-dehydrated]:is([data-diff],[data-file]){--diffs-code-grid:var(--diffs-grid-number-column-width) minmax(0, 1fr)}:is([data-diff],[data-file]):hover [data-code]::-webkit-scrollbar-thumb{background-color:var(--diffs-bg-context)}@supports (-webkit-touch-callout:none){:host{--diffs-scrollbar-gutter-fallback:0px}}[data-line] span{color:light-dark(var(--diffs-token-light,var(--diffs-light)),var(--diffs-token-dark,var(--diffs-dark)));background-color:light-dark(var(--diffs-token-light-bg,inherit),var(--diffs-token-dark-bg,inherit));font-weight:light-dark(var(--diffs-token-light-font-weight,inherit),var(--diffs-token-dark-font-weight,inherit));font-style:light-dark(var(--diffs-token-light-font-style,inherit),var(--diffs-token-dark-font-style,inherit));-webkit-text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit));text-decoration:light-dark(var(--diffs-token-light-text-decoration,inherit),var(--diffs-token-dark-text-decoration,inherit))}[data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);color:var(--diffs-fg);background-color:var(--diffs-line-bg,var(--diffs-bg))}@media (pointer:fine){:is([data-line],[data-gutter-buffer],[data-column-number],[data-line-annotation],[data-no-newline],[data-merge-conflict],[data-merge-conflict-actions]):where([data-hovered]){--diffs-computed-hovered-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-selected-line-bg) 97%, var(--diffs-bg-hover-override,var(--diffs-mixer))),color-mix(in lab, var(--diffs-computed-selected-line-bg) 91%, var(--diffs-bg-hover-override,var(--diffs-mixer))));--diffs-line-bg:var(--diffs-computed-hovered-line-bg,inherit)}}[data-decoration-bg]:is([data-line],[data-no-newline]){--mix-deco-light:92%;--mix-deco-dark:85%}[data-decoration-bg][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]){--mix-deco-light:88%;--mix-deco-dark:80%}[data-decoration-bg][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]){--mix-deco-light:85%;--mix-deco-dark:78%}@media (pointer:fine){[data-decoration-bg][data-hovered]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:85%;--mix-deco-dark:85%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="2"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:83%;--mix-deco-dark:83%}[data-decoration-bg][data-hovered][data-decoration-bg-depth="3"]:is([data-line],[data-no-newline]):not([data-selected-line]){--mix-deco-light:81%;--mix-deco-dark:81%}}[data-decoration-bg]:is([data-line],[data-no-newline]){--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) var(--mix-deco-light), var(--diffs-decoration-bg)),color-mix(in lab, var(--diffs-bg) var(--mix-deco-dark), var(--diffs-decoration-bg)));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-line-annotation],[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context);--diffs-computed-decoration-bg:var(--diffs-annotation-bg);--diffs-computed-diff-line-bg:var(--diffs-annotation-bg);--diffs-computed-selected-line-bg:var(--diffs-annotation-bg);--diffs-line-bg:var(--diffs-annotation-bg)}[data-merge-conflict-actions],[data-gutter-buffer=merge-conflict-action],[data-gutter-buffer=merge-conflict-marker-base],[data-gutter-buffer=merge-conflict-marker-separator],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator]{--diffs-computed-decoration-bg:var(--diffs-bg-context);--diffs-computed-diff-line-bg:var(--diffs-bg-context);--diffs-computed-selected-line-bg:var(--diffs-bg-context);--diffs-line-bg:var(--diffs-bg-context)}[data-gutter-buffer=merge-conflict-marker-start],[data-merge-conflict=marker-start]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-current-header-override,var(--diffs-addition-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-gutter-buffer=merge-conflict-marker-end],[data-merge-conflict=marker-end]{--diffs-computed-decoration-bg:light-dark(color-mix(in lab, var(--diffs-bg) 78%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))),color-mix(in lab, var(--diffs-bg) 68%, var(--conflict-bg-incoming-header-override,var(--diffs-modified-base))));--diffs-computed-diff-line-bg:var(--diffs-computed-decoration-bg);--diffs-computed-selected-line-bg:var(--diffs-computed-decoration-bg);--diffs-line-bg:var(--diffs-computed-decoration-bg)}[data-has-merge-conflict] [data-line-annotation],[data-has-merge-conflict] [data-gutter-buffer=annotation]{--diffs-computed-decoration-bg:var(--diffs-bg);--diffs-computed-diff-line-bg:var(--diffs-bg);--diffs-computed-selected-line-bg:var(--diffs-bg);--diffs-line-bg:var(--diffs-bg)}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number]{--mix-light:91%;--mix-dark:85%}:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--mix-light:88%;--mix-dark:80%}:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]{--diffs-diff-line-mix-target:var(--diffs-bg)}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-deletion-override,var(--diffs-deletion-base))}@media (pointer:fine){[data-line-type=change-deletion][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:75%}}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-deletion-override,var(--diffs-deletion-base));--diffs-diff-line-mix-target:var(--diffs-bg-deletion-number-override,var(--diffs-deletion-base))}[data-line-type=change-deletion]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--diffs-bg-addition-override,var(--diffs-addition-base))}@media (pointer:fine){[data-line-type=change-addition][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--diffs-bg-addition-number-override,var(--diffs-addition-base))}[data-line-type=change-addition]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-current-override,var(--diffs-addition-base))}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-fg-number-addition-override,var(--diffs-addition-base));--diffs-diff-line-mix-target:var(--conflict-bg-current-number-override,var(--diffs-addition-base))}@media (pointer:fine){[data-merge-conflict=current][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=current]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-diff-line-mix-target:var(--conflict-bg-incoming-override,var(--diffs-modified-base))}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]):where([data-gutter-buffer],[data-column-number]){color:var(--diffs-modified-base);--diffs-diff-line-mix-target:var(--conflict-bg-incoming-number-override,var(--diffs-modified-base))}@media (pointer:fine){[data-merge-conflict=incoming][data-hovered]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--mix-light:80%;--mix-dark:70%}}[data-merge-conflict=incoming]:is(:where([data-background]) [data-gutter-buffer],:where([data-background]) [data-column-number],:where([data-background]) [data-line],:where([data-background]) [data-no-newline]){--diffs-computed-diff-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-light), var(--diffs-diff-line-mix-target)),color-mix(in lab, var(--diffs-computed-decoration-bg) var(--mix-dark), var(--diffs-diff-line-mix-target)));--diffs-computed-selected-line-bg:var(--diffs-computed-diff-line-bg);--diffs-line-bg:var(--diffs-computed-diff-line-bg,inherit)}[data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]{--diffs-selection-mix-target:var(--diffs-bg-selection-override,var(--diffs-selection-base))}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--mix-selection-light:82%;--mix-selection-dark:75%}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:75%;--mix-selection-dark:70%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]){--mix-selection-light:75%;--mix-selection-dark:60%;--diffs-selection-mix-target:var(--diffs-bg-selection-number-override,var(--diffs-selection-base))}@media (pointer:fine){[data-selected-line][data-hovered]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]):where([data-gutter-buffer],[data-column-number]):not([data-merge-conflict],[data-line-type=change-addition],[data-line-type=change-deletion]){--mix-selection-light:70%;--mix-selection-dark:55%}}[data-selected-line]:is([data-gutter-buffer],[data-column-number],[data-line],[data-line-annotation],[data-merge-conflict],[data-merge-conflict-actions],[data-no-newline]){--diffs-computed-selected-line-bg:light-dark(color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-light), var(--diffs-selection-mix-target)),color-mix(in lab, var(--diffs-computed-diff-line-bg) var(--mix-selection-dark), var(--diffs-selection-mix-target)));--diffs-line-bg:var(--diffs-computed-selected-line-bg,inherit)}[data-selected-line]:is([data-gutter-buffer],[data-column-number]){color:var(--diffs-selection-number-fg)}[data-no-newline]{-webkit-user-select:none;user-select:none}[data-no-newline] span{opacity:.6}[data-diff-type=split][data-overflow=scroll]{grid-template-columns:1fr 1fr;display:grid}[data-diff-type=split][data-overflow=scroll] [data-additions]{border-left:1px solid var(--diffs-bg)}[data-diff-type=split][data-overflow=scroll] [data-deletions]{border-right:1px solid var(--diffs-bg)}[data-code]{grid-auto-flow:dense;grid-template-columns:var(--diffs-code-grid);overflow:var(--diffs-overflow-override,scroll) clip;overscroll-behavior-x:none;tab-size:var(--diffs-tab-size,2);padding-top:var(--diffs-gap-block,var(--diffs-gap-fallback));padding-bottom:max(0px, calc(var(--diffs-gap-block,var(--diffs-gap-fallback)) - var(--diffs-scrollbar-gutter)));scrollbar-gutter:stable;align-self:flex-start;display:grid}[data-diffs-scrollbar-measure]{opacity:0;pointer-events:none;scrollbar-gutter:auto;grid-template-columns:none;width:100px;height:100px;padding:0;position:absolute;top:-200px;left:-200px}[data-container-size]{container-type:inline-size}[data-code]::-webkit-scrollbar{width:0;height:var(--diffs-scrollbar-gutter)}[data-code]::-webkit-scrollbar-track{background:0 0}[data-code]::-webkit-scrollbar-thumb{background-color:#0000;background-clip:content-box;border:1px solid #0000;border-radius:3px}[data-code]::-webkit-scrollbar-corner{background-color:#0000}@supports ((-moz-appearance:none)){[data-code]{scrollbar-width:thin;scrollbar-color:var(--diffs-bg-context) transparent;padding-bottom:var(--diffs-gap-block,var(--diffs-gap-fallback))}}:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]) [data-code],[data-overflow=wrap]:is([data-diffs-header]~[data-diff],[data-diffs-header]~[data-file]){padding-top:0}[data-gutter]{grid-template-rows:subgrid;grid-template-columns:subgrid;z-index:3;background-color:var(--diffs-bg);grid-column:1;display:grid;position:relative}[data-gutter] [data-gutter-buffer],[data-gutter] [data-column-number]{border-right:var(--diffs-gap-style,2px solid var(--diffs-bg))}[data-content]{grid-template-rows:subgrid;grid-template-columns:subgrid;background-color:var(--diffs-bg);grid-column:2;min-width:0;display:grid}[data-diff-type=split][data-overflow=wrap]{grid-auto-flow:dense;grid-template-columns:repeat(2, var(--diffs-code-grid));padding-block:var(--diffs-gap-block,var(--diffs-gap-fallback));display:grid}[data-diff-type=split][data-overflow=wrap] [data-deletions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-gutter]{grid-column:1}:is([data-diff-type=split][data-overflow=wrap] [data-deletions]) [data-content]{border-right:1px solid var(--diffs-bg);grid-column:2}[data-diff-type=split][data-overflow=wrap] [data-additions]{display:contents}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-gutter]{border-left:1px solid var(--diffs-bg);grid-column:3}:is([data-diff-type=split][data-overflow=wrap] [data-additions]) [data-content]{grid-column:4}[data-overflow=scroll] [data-gutter]{position:sticky;left:0}[data-interactive-lines] [data-line]{cursor:pointer}[data-interactive-line-numbers] [data-column-number]{cursor:pointer;touch-action:none}[data-content-buffer],[data-gutter-buffer]{-webkit-user-select:none;user-select:none;min-height:1lh;position:relative}[data-gutter-buffer]{padding-left:2ch;padding-right:1ch}[data-gutter-buffer]:before{content:"";min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));display:block}[data-gutter-buffer=annotation]{--diffs-annotation-bg:var(--diffs-bg-context-gutter);min-height:0}[data-gutter-buffer=buffer]{--diffs-line-bg:var(--diffs-bg-context-gutter)}[data-content-buffer]{background-position:5px 0;background-size:8px 8px;background-origin:border-box;background-image:repeating-linear-gradient(-45deg, transparent, transparent 4.242px, var(--diffs-bg-buffer) 4.242px, var(--diffs-bg-buffer) 5.656px);grid-column:1}[data-separator]{box-sizing:content-box;background-color:var(--diffs-bg)}[data-separator=simple]{min-height:4px}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata],[data-separator=simple]{background-color:var(--diffs-bg-separator)}[data-separator=line-info],[data-separator=line-info-basic],[data-separator=metadata]{height:32px;position:relative}[data-separator-wrapper]{-webkit-user-select:none;user-select:none;fill:currentColor;background-color:var(--diffs-bg);align-items:center;height:100%;display:flex;position:absolute;inset-inline:0}[data-content] [data-separator-wrapper]{display:none}[data-separator=metadata] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;color:var(--diffs-fg-number);white-space:nowrap;text-overflow:ellipsis;min-width:min-content;padding-inline:1ch;inset-inline:100% auto;overflow:hidden}[data-separator=line-info]{margin-block:var(--diffs-gap-block,var(--diffs-gap-fallback))}[data-separator=line-info] [data-separator-wrapper]{min-width:16px}[data-separator=line-info-basic],[data-separator=metadata]{margin-block:0}[data-separator=line-info][data-separator-first]{margin-top:0}[data-separator=line-info][data-separator-last]{margin-bottom:0}[data-expand-index] [data-separator-wrapper]{grid-template-columns:32px auto;display:grid}[data-expand-index] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:32px 32px auto}[data-expand-button],[data-separator-content]{background-color:var(--diffs-bg-separator);flex:none;align-items:center;display:flex}[data-expand-index] [data-separator-content]:hover{cursor:pointer;text-decoration:underline}[data-expand-button]{cursor:pointer;min-width:32px;color:var(--diffs-fg-number);border-right:2px solid var(--diffs-bg);flex-shrink:0;justify-content:center;align-self:stretch}[data-expand-button]:hover{color:var(--diffs-fg)}[data-expand-button][data-expand-all-button]{display:none}[data-expand-down] [data-icon]{transform:scaleY(-1)}[data-separator-content]{height:100%;color:var(--diffs-fg-number);flex:auto;justify-content:flex-start;padding:0 1ch;overflow:hidden}:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-content]{-webkit-user-select:none;user-select:none;height:100%;overflow:clip}[data-unmodified-lines]{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;display:block;overflow:hidden}@supports (width:1cqi){[data-unified] [data-separator=line-info] [data-separator-wrapper]{padding-inline:var(--diffs-gap-inline,var(--diffs-gap-fallback));width:100cqi}:is([data-unified] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content]{border-radius:6px}[data-unified] [data-separator=line-info][data-expand-index] [data-separator-wrapper] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-gutter] [data-separator=line-info] [data-separator-wrapper]{padding-left:var(--diffs-gap-inline,var(--diffs-gap-fallback))}[data-gutter] [data-separator=line-info] [data-separator-content]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-gutter] [data-separator=line-info][data-expand-index] [data-separator-content]{border-top-left-radius:unset;border-bottom-left-radius:unset}[data-additions] [data-content] [data-separator=line-info]{background-color:var(--diffs-bg)}:is([data-additions] [data-content] [data-separator=line-info]) [data-separator-wrapper]{display:none}[data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);border-top-right-radius:6px;border-bottom-right-radius:6px;height:100%;display:block}:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}[data-overflow=scroll] [data-additions] [data-gutter] [data-separator=line-info] [data-separator-wrapper]{width:calc(100cqi - var(--diffs-gap-inline,var(--diffs-gap-fallback)))}[data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]{background-color:var(--diffs-bg-separator);height:100%;margin-right:var(--diffs-gap-inline,var(--diffs-gap-fallback));border-top-right-radius:6px;border-bottom-right-radius:6px;display:block}:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-separator-content],:is([data-overflow=wrap] [data-additions] [data-content] [data-separator=line-info] [data-separator-wrapper]) [data-expand-button]{display:none}:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}@media (pointer:fine){[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:unset}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:6px;border-top-left-radius:unset}}}@media (pointer:coarse){[data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px 34px auto}:is([data-separator=line-info-basic] [data-separator-wrapper][data-separator-multi-button]) [data-separator-content]{grid-column:unset;grid-row:unset}@supports (width:1cqi){:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-both],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down],:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up],[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-up]{border-top-left-radius:6px;border-bottom-left-radius:6px}[data-separator-multi-button]:is([data-separator=line-info] [data-separator-wrapper]) [data-expand-down]{border-bottom-left-radius:unset;border-top-left-radius:unset}}}@media (pointer:fine){[data-separator-wrapper][data-separator-multi-button]{grid-template-rows:50% 50%;display:grid}[data-separator-wrapper][data-separator-multi-button] [data-separator-content]{grid-area:1/2/-1;min-width:min-content}[data-separator-wrapper][data-separator-multi-button] [data-expand-button]{grid-column:1}[data-separator=line-info] [data-separator-wrapper],[data-separator=line-info] [data-separator-wrapper][data-separator-multi-button]{grid-template-columns:34px auto}[data-separator=line-info-basic][data-expand-index] [data-separator-wrapper]{grid-template-columns:100% auto}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-up]{border-bottom:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}:is(:is([data-separator=line-info],[data-separator=line-info-basic]) [data-separator-multi-button]) [data-expand-down]{border-top:1px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg)}}[data-additions] [data-gutter] [data-separator-wrapper],[data-additions] [data-separator=line-info-basic] [data-separator-wrapper],[data-content] [data-separator-wrapper]{display:none}[data-line-annotation]{min-height:var(--diffs-annotation-min-height,0);z-index:2}[data-merge-conflict-actions]{z-index:2}[data-separator=custom]{grid-template-columns:subgrid;display:grid}[data-line],[data-column-number],[data-no-newline]{padding-inline:1ch;position:relative}[data-indicators=classic] [data-line]{padding-inline-start:2ch}:is([data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion]),[data-line]:is([data-indicators=classic] [data-line-type=change-addition],[data-indicators=classic] [data-line-type=change-deletion])):before{-webkit-user-select:none;user-select:none;width:1ch;height:1lh;display:inline-block;position:absolute;top:0;left:0}:is([data-line]:is([data-indicators=classic] [data-line-type=change-addition]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-addition])):before{content:"+";color:var(--diffs-addition-base)}:is([data-line]:is([data-indicators=classic] [data-line-type=change-deletion]),[data-no-newline]:is([data-indicators=classic] [data-line-type=change-deletion])):before{content:"-";color:var(--diffs-deletion-base)}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion],[data-indicators=bars] [data-line-type=change-addition]):before{content:"";-webkit-user-select:none;user-select:none;contain:strict;width:4px;height:100%;display:block;position:absolute;top:0;left:0}[data-column-number]:is([data-indicators=bars] [data-line-type=change-deletion]):before{background-image:linear-gradient(0deg, var(--diffs-bg-deletion) 50%, var(--diffs-deletion-base) 50%);background-repeat:repeat;background-size:2px 2px;background-size:calc(1lh/round(1lh / 2px)) calc(1lh/round(1lh / 2px))}[data-column-number]:is([data-indicators=bars] [data-line-type=change-addition]):before{background-color:var(--diffs-addition-base)}[data-overflow=wrap] [data-line],[data-overflow=wrap] [data-annotation-content]{white-space:pre-wrap;word-break:break-word}[data-overflow=scroll] [data-line]{white-space:pre;min-height:1lh}[data-column-number]{box-sizing:content-box;text-align:right;-webkit-user-select:none;user-select:none;color:var(--diffs-fg-number);padding-left:2ch}[data-line-number-content]{min-width:var(--diffs-min-number-column-width,var(--diffs-min-number-column-width-default,3ch));z-index:1;display:inline-block;position:relative}[data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]{min-width:4px;padding:0}:is([data-disable-line-numbers] [data-gutter-buffer],[data-disable-line-numbers] [data-column-number]):before{min-width:0}[data-disable-line-numbers] [data-line-number-content]{display:none}[data-disable-line-numbers] [data-gutter-utility-slot]{right:unset;justify-content:flex-start;left:0}[data-disable-line-numbers][data-indicators=bars] [data-gutter-utility-slot]{left:6px}[data-file][data-disable-line-numbers] [data-gutter-buffer],[data-file][data-disable-line-numbers] [data-column-number]{border-right:0;min-width:0}[data-diff-span]{-webkit-box-decoration-break:clone;box-decoration-break:clone;border-radius:3px}[data-line-type=change-addition] [data-diff-span]{background-color:var(--diffs-bg-addition-emphasis)}[data-line-type=change-deletion] [data-diff-span]{background-color:var(--diffs-bg-deletion-emphasis)}[data-merge-conflict=marker-start],[data-merge-conflict=marker-base],[data-merge-conflict=marker-separator],[data-merge-conflict=marker-end]{color:var(--diffs-fg);padding-left:1ch}[data-merge-conflict=marker-start],[data-merge-conflict=marker-end]{align-items:center;display:flex}:is([data-merge-conflict=marker-start],[data-merge-conflict=marker-end]):after{color:var(--diffs-fg-conflict-marker);font-size:.75rem;font-style:normal;line-height:1.25rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));padding-left:1ch}[data-merge-conflict=marker-start]:after{content:"(Current Change)"}[data-merge-conflict=marker-end]:after{content:"(Incoming Change)"}[data-merge-conflict-actions-content]{min-height:1.75rem;font-family:var(--diffs-header-font-family,var(--diffs-header-font-fallback));color:var(--diffs-fg);align-items:center;gap:.25rem;padding-inline:.5rem;font-size:.75rem;line-height:1.2;display:flex}[data-merge-conflict-action]{appearance:none;color:var(--diffs-fg-number);font:inherit;cursor:pointer;background:0 0;border:0;padding:0;font-style:normal}[data-merge-conflict-action]:hover{color:var(--diffs-fg)}[data-merge-conflict-action=current]:hover{color:var(--diffs-addition-base)}[data-merge-conflict-action=incoming]:hover{color:var(--diffs-modified-base)}[data-merge-conflict-action-separator]{color:var(--diffs-fg-number);opacity:.6;-webkit-user-select:none;user-select:none}[data-diffs-header=default]{background-color:var(--diffs-bg);justify-content:space-between;align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));min-height:calc(1lh + var(--diffs-gap-block,var(--diffs-gap-fallback))*3);z-index:2;flex-direction:row;padding-inline:16px;display:flex;position:relative;top:0}[data-header-content]{align-items:center;gap:var(--diffs-gap-inline,var(--diffs-gap-fallback));white-space:nowrap;flex-direction:row;min-width:0;display:flex}[data-header-content] [data-prev-name],[data-header-content] [data-title]{text-overflow:ellipsis;white-space:nowrap;direction:rtl;min-width:0;overflow:hidden}[data-prev-name]{opacity:.7}[data-rename-icon]{fill:currentColor;flex-grow:0;flex-shrink:0}[data-diffs-header=default] [data-metadata]{white-space:nowrap;align-items:center;gap:1ch;display:flex}[data-diffs-header=default] [data-additions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-addition-base)}[data-diffs-header=default] [data-deletions-count]{font-family:var(--diffs-font-family,var(--diffs-font-fallback));color:var(--diffs-deletion-base)}[data-change-icon]{fill:currentColor;flex-shrink:0}[data-change-icon=change],[data-change-icon=rename-pure],[data-change-icon=rename-changed]{color:var(--diffs-modified-base)}[data-change-icon=new]{color:var(--diffs-addition-base)}[data-change-icon=deleted]{color:var(--diffs-deletion-base)}[data-change-icon=file]{opacity:.6}[data-annotation-content]{z-index:2;isolation:isolate;align-self:flex-start;min-width:0;display:flow-root;position:relative}[data-overflow=scroll] [data-annotation-content],[data-overflow=scroll] [data-merge-conflict-actions-content]{width:var(--diffs-column-content-width,auto);left:var(--diffs-column-number-width,0);position:sticky}[data-annotation-slot]{text-wrap-mode:wrap;word-break:normal;white-space-collapse:collapse}[data-gutter-utility-slot]{touch-action:none;justify-content:flex-end;display:flex;position:absolute;top:0;bottom:0;right:0}[data-utility-button]{appearance:none;cursor:pointer;width:1lh;height:1lh;font-size:var(--diffs-font-size,13px);line-height:var(--diffs-line-height,20px);background-color:var(--diffs-modified-base);color:var(--diffs-bg);fill:currentColor;z-index:4;touch-action:none;border:none;border-radius:4px;justify-content:center;align-items:center;margin-right:calc(1ch - 1lh);padding:0;display:flex;position:relative}[data-utility-button]:before{content:"";display:block;position:absolute;inset:0 0 0 -4px}[data-decoration-bar-stack]{pointer-events:none;isolation:isolate;z-index:1;background-color:var(--diffs-decoration-bar-color,transparent);box-sizing:content-box;border-left:2px solid var(--diffs-bg);border-right:2px solid var(--diffs-bg);width:6px;position:absolute;top:0;bottom:0;right:-2px}[data-decoration-bar-depth="1"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 20%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="2"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 45%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-depth="3"] [data-decoration-bar-stack]{background-color:color-mix(in lab, var(--diffs-bg) 65%, var(--diffs-decoration-bar-color,transparent))}[data-decoration-bar-start] [data-decoration-bar-stack]{border-top-left-radius:5px;border-top-right-radius:5px}[data-decoration-bar-end] [data-decoration-bar-stack]{z-index:3;border-bottom-right-radius:5px;border-bottom-left-radius:5px}[data-placeholder]{contain:strict}[data-error-wrapper]{padding:var(--diffs-gap-block,var(--diffs-gap-fallback)) var(--diffs-gap-inline,var(--diffs-gap-fallback));scrollbar-width:none;max-height:400px;overflow:auto}[data-error-wrapper] [data-error-message]{color:var(--diffs-deletion-base);font-size:18px;font-weight:700}[data-error-wrapper] [data-error-stack]{color:var(--diffs-fg-number)}}@layer theme,rendered,unsafe;
@layer theme {
}</style><style data-theme-css="">@layer base, theme, rendered, unsafe;
@layer rendered {
:host {
--diffs-scrollbar-gutter-measured: var(--diffs-scrollbar-gutter-fallback);
--diffs-dark:#fafafa;--diffs-dark-bg:#0a0a0a;--diffs-dark-addition-color:#07c480;--diffs-dark-deletion-color:#ff2e3f;--diffs-dark-modified-color:#009fff;--diffs-light:#0a0a0a;--diffs-light-bg:#ffffff;--diffs-light-addition-color:#18a46c;--diffs-light-deletion-color:#d52c36;--diffs-light-modified-color:#009fff;
}
}</style><div data-diffs-header="default" data-change-type="change"><div data-header-content=""><slot name="header-prefix"></slot><svg width="16" height="16" viewBox="0 0 16 16" data-change-icon="change"><use href="#diffs-icon-symbol-modified"></use></svg><div data-title=""><bdi>Dreamio/ProgressiveHTTPRangeCache.swift</bdi></div></div><div data-metadata=""><span data-deletions-count="">-2</span><span data-additions-count="">+14</span><slot name="header-metadata"></slot></div></div><pre data-diff="" data-diff-type="split" data-overflow="scroll" data-background="" data-indicators="bars" tabindex="0" style="--diffs-min-number-column-width-default:3ch;" data-dehydrated=""><code data-code="" data-container-size="" data-deletions=""><div data-gutter="" style="grid-row: span 58"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">349 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="350" data-line-index="349,349"><span data-line-number-content="">350</span></div><div data-line-type="context" data-column-number="351" data-line-index="350,350"><span data-line-number-content="">351</span></div><div data-line-type="context" data-column-number="352" data-line-index="351,351"><span data-line-number-content="">352</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="353" data-line-index="353,353"><span data-line-number-content="">353</span></div><div data-line-type="context" data-column-number="354" data-line-index="354,354"><span data-line-number-content="">354</span></div><div data-line-type="context" data-column-number="355" data-line-index="355,355"><span data-line-number-content="">355</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">85 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="441" data-line-index="441,441"><span data-line-number-content="">441</span></div><div data-line-type="context" data-column-number="442" data-line-index="442,442"><span data-line-number-content="">442</span></div><div data-line-type="context" data-column-number="443" data-line-index="443,443"><span data-line-number-content="">443</span></div><div data-gutter-buffer="buffer" data-buffer-size="2" style="grid-row: span 2;min-height:calc(2 * 1lh);"></div><div data-line-type="context" data-column-number="444" data-line-index="446,446"><span data-line-number-content="">444</span></div><div data-line-type="context" data-column-number="445" data-line-index="447,447"><span data-line-number-content="">445</span></div><div data-line-type="context" data-column-number="446" data-line-index="448,448"><span data-line-number-content="">446</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">15 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="462" data-line-index="464,464"><span data-line-number-content="">462</span></div><div data-line-type="context" data-column-number="463" data-line-index="465,465"><span data-line-number-content="">463</span></div><div data-line-type="context" data-column-number="464" data-line-index="466,466"><span data-line-number-content="">464</span></div><div data-gutter-buffer="buffer" data-buffer-size="3" style="grid-row: span 3;min-height:calc(3 * 1lh);"></div><div data-line-type="context" data-column-number="465" data-line-index="470,470"><span data-line-number-content="">465</span></div><div data-line-type="context" data-column-number="466" data-line-index="471,471"><span data-line-number-content="">466</span></div><div data-line-type="context" data-column-number="467" data-line-index="472,472"><span data-line-number-content="">467</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">10 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="478" data-line-index="483,483"><span data-line-number-content="">478</span></div><div data-line-type="context" data-column-number="479" data-line-index="484,484"><span data-line-number-content="">479</span></div><div data-line-type="context" data-column-number="480" data-line-index="485,485"><span data-line-number-content="">480</span></div><div data-gutter-buffer="buffer" data-buffer-size="3" style="grid-row: span 3;min-height:calc(3 * 1lh);"></div><div data-line-type="context" data-column-number="481" data-line-index="489,489"><span data-line-number-content="">481</span></div><div data-line-type="context" data-column-number="482" data-line-index="490,490"><span data-line-number-content="">482</span></div><div data-line-type="context" data-column-number="483" data-line-index="491,491"><span data-line-number-content="">483</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">1 unmodified line</span></div></div></div><div data-line-type="context" data-column-number="485" data-line-index="493,493"><span data-line-number-content="">485</span></div><div data-line-type="context" data-column-number="486" data-line-index="494,494"><span data-line-number-content="">486</span></div><div data-line-type="context" data-column-number="487" data-line-index="495,495"><span data-line-number-content="">487</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="488" data-line-index="497,497"><span data-line-number-content="">488</span></div><div data-line-type="context" data-column-number="489" data-line-index="498,498"><span data-line-number-content="">489</span></div><div data-line-type="context" data-column-number="490" data-line-index="499,499"><span data-line-number-content="">490</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">21 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="512" data-line-index="521,521"><span data-line-number-content="">512</span></div><div data-line-type="context" data-column-number="513" data-line-index="522,522"><span data-line-number-content="">513</span></div><div data-line-type="context" data-column-number="514" data-line-index="523,523"><span data-line-number-content="">514</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="515" data-line-index="525,525"><span data-line-number-content="">515</span></div><div data-line-type="change-deletion" data-column-number="516" data-line-index="526,526"><span data-line-number-content="">516</span></div><div data-gutter-buffer="buffer" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh);"></div><div data-line-type="context" data-column-number="517" data-line-index="529,528"><span data-line-number-content="">517</span></div><div data-line-type="change-deletion" data-column-number="518" data-line-index="530,529"><span data-line-number-content="">518</span></div><div data-line-type="context" data-column-number="519" data-line-index="532,530"><span data-line-number-content="">519</span></div><div data-line-type="context" data-column-number="520" data-line-index="533,531"><span data-line-number-content="">520</span></div><div data-line-type="context" data-column-number="521" data-line-index="534,532"><span data-line-number-content="">521</span></div></div><div data-content="" style="grid-row: span 58"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">349 unmodified lines</span></div></div></div><div data-line="350" data-alt-line="350" data-line-type="context" data-line-index="349,349"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchTask: Task</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">&#x3C;</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Void</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, Never</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">>?</span></div><div data-line="351" data-alt-line="351" data-line-type="context" data-line-index="350,350"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchWindow: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></div><div data-line="352" data-alt-line="352" data-line-type="context" data-line-index="351,351"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchPreferredOffset: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="353" data-alt-line="354" data-line-type="context" data-line-index="353,353"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> recentSeekRange: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></div><div data-line="354" data-alt-line="355" data-line-type="context" data-line-index="354,354"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> recentForegroundRange: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></div><div data-line="355" data-alt-line="356" data-line-type="context" data-line-index="355,355">
</div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">85 unmodified lines</span></div></div></div><div data-line="441" data-alt-line="442" data-line-type="context" data-line-index="441,441"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="442" data-alt-line="443" data-line-type="context" data-line-index="442,442">
</div><div data-line="443" data-alt-line="444" data-line-type="context" data-line-index="443,443"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchTask</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">cancel</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-content-buffer="" data-buffer-size="2" style="grid-row: span 2;min-height:calc(2 * 1lh)"></div><div data-line="444" data-alt-line="447" data-line-type="context" data-line-index="446,446"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> window </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> explicitWindow </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">??</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="445" data-alt-line="448" data-line-type="context" data-line-index="447,447"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchWindow </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> window</span></div><div data-line="446" data-alt-line="449" data-line-type="context" data-line-index="448,448"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchPreferredOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> offset</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">15 unmodified lines</span></div></div></div><div data-line="462" data-alt-line="465" data-line-type="context" data-line-index="464,464"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">hasData</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> chunk</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="463" data-alt-line="466" data-line-type="context" data-line-index="465,465"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> do</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="464" data-alt-line="467" data-line-type="context" data-line-index="466,466"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> fetcher.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">fetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> chunk</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-content-buffer="" data-buffer-size="3" style="grid-row: span 3;min-height:calc(3 * 1lh)"></div><div data-line="465" data-alt-line="471" data-line-type="context" data-line-index="470,470"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data, at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> chunk.start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="466" data-alt-line="472" data-line-type="context" data-line-index="471,471"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> evictOverBudget</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">protecting</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> window</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="467" data-alt-line="473" data-line-type="context" data-line-index="472,472"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">10 unmodified lines</span></div></div></div><div data-line="478" data-alt-line="484" data-line-type="context" data-line-index="483,483"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="479" data-alt-line="485" data-line-type="context" data-line-index="484,484"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="480" data-alt-line="486" data-line-type="context" data-line-index="485,485"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-content-buffer="" data-buffer-size="3" style="grid-row: span 3;min-height:calc(3 * 1lh)"></div><div data-line="481" data-alt-line="490" data-line-type="context" data-line-index="489,489"><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">activePrefetchWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="482" data-alt-line="491" data-line-type="context" data-line-index="490,490"><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">activePrefetchPreferredOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="483" data-alt-line="492" data-line-type="context" data-line-index="491,491"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">1 unmodified line</span></div></div></div><div data-line="485" data-alt-line="494" data-line-type="context" data-line-index="493,493">
</div><div data-line="486" data-alt-line="495" data-line-type="context" data-line-index="494,494"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cancelPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="487" data-alt-line="496" data-line-type="context" data-line-index="495,495"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchTask</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">cancel</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="488" data-alt-line="498" data-line-type="context" data-line-index="497,497"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchWindow </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="489" data-alt-line="499" data-line-type="context" data-line-index="498,498"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchPreferredOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="490" data-alt-line="500" data-line-type="context" data-line-index="499,499"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">21 unmodified lines</span></div></div></div><div data-line="512" data-alt-line="522" data-line-type="context" data-line-index="521,521"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> abs</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range.start </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> preferredOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> >=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> responseChunkSize </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="513" data-alt-line="523" data-line-type="context" data-line-index="522,522"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="514" data-alt-line="524" data-line-type="context" data-line-index="523,523"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="515" data-alt-line="526" data-line-type="context" data-line-index="525,525"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="516" data-line-type="change-deletion" data-line-index="526,526"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> </span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioRangeCache] prefetch follow-foreground from=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span></span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">preferredOffset</span><span data-diff-span=""><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> to=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">range.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></span></div><div data-content-buffer="" data-buffer-size="1" style="grid-row: span 1;min-height:calc(1 * 1lh)"></div><div data-line="517" data-alt-line="529" data-line-type="context" data-line-index="529,528"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-line="518" data-line-type="change-deletion" data-line-index="530,529"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> </span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span></span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, forceRestart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="519" data-alt-line="531" data-line-type="context" data-line-index="532,530"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="520" data-alt-line="532" data-line-type="context" data-line-index="533,531">
</div><div data-line="521" data-alt-line="533" data-line-type="context" data-line-index="534,532"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> HTTPByteRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div></div></code><code data-code="" data-container-size="" data-additions=""><div data-gutter="" style="grid-row: span 58"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">349 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="350" data-line-index="349,349"><span data-line-number-content="">350</span></div><div data-line-type="context" data-column-number="351" data-line-index="350,350"><span data-line-number-content="">351</span></div><div data-line-type="context" data-column-number="352" data-line-index="351,351"><span data-line-number-content="">352</span></div><div data-line-type="change-addition" data-column-number="353" data-line-index="352,352"><span data-line-number-content="">353</span></div><div data-line-type="context" data-column-number="354" data-line-index="353,353"><span data-line-number-content="">354</span></div><div data-line-type="context" data-column-number="355" data-line-index="354,354"><span data-line-number-content="">355</span></div><div data-line-type="context" data-column-number="356" data-line-index="355,355"><span data-line-number-content="">356</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">85 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="442" data-line-index="441,441"><span data-line-number-content="">442</span></div><div data-line-type="context" data-column-number="443" data-line-index="442,442"><span data-line-number-content="">443</span></div><div data-line-type="context" data-column-number="444" data-line-index="443,443"><span data-line-number-content="">444</span></div><div data-line-type="change-addition" data-column-number="445" data-line-index="444,444"><span data-line-number-content="">445</span></div><div data-line-type="change-addition" data-column-number="446" data-line-index="445,445"><span data-line-number-content="">446</span></div><div data-line-type="context" data-column-number="447" data-line-index="446,446"><span data-line-number-content="">447</span></div><div data-line-type="context" data-column-number="448" data-line-index="447,447"><span data-line-number-content="">448</span></div><div data-line-type="context" data-column-number="449" data-line-index="448,448"><span data-line-number-content="">449</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">15 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="465" data-line-index="464,464"><span data-line-number-content="">465</span></div><div data-line-type="context" data-column-number="466" data-line-index="465,465"><span data-line-number-content="">466</span></div><div data-line-type="context" data-column-number="467" data-line-index="466,466"><span data-line-number-content="">467</span></div><div data-line-type="change-addition" data-column-number="468" data-line-index="467,467"><span data-line-number-content="">468</span></div><div data-line-type="change-addition" data-column-number="469" data-line-index="468,468"><span data-line-number-content="">469</span></div><div data-line-type="change-addition" data-column-number="470" data-line-index="469,469"><span data-line-number-content="">470</span></div><div data-line-type="context" data-column-number="471" data-line-index="470,470"><span data-line-number-content="">471</span></div><div data-line-type="context" data-column-number="472" data-line-index="471,471"><span data-line-number-content="">472</span></div><div data-line-type="context" data-column-number="473" data-line-index="472,472"><span data-line-number-content="">473</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">10 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="484" data-line-index="483,483"><span data-line-number-content="">484</span></div><div data-line-type="context" data-column-number="485" data-line-index="484,484"><span data-line-number-content="">485</span></div><div data-line-type="context" data-column-number="486" data-line-index="485,485"><span data-line-number-content="">486</span></div><div data-line-type="change-addition" data-column-number="487" data-line-index="486,486"><span data-line-number-content="">487</span></div><div data-line-type="change-addition" data-column-number="488" data-line-index="487,487"><span data-line-number-content="">488</span></div><div data-line-type="change-addition" data-column-number="489" data-line-index="488,488"><span data-line-number-content="">489</span></div><div data-line-type="context" data-column-number="490" data-line-index="489,489"><span data-line-number-content="">490</span></div><div data-line-type="context" data-column-number="491" data-line-index="490,490"><span data-line-number-content="">491</span></div><div data-line-type="context" data-column-number="492" data-line-index="491,491"><span data-line-number-content="">492</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">1 unmodified line</span></div></div></div><div data-line-type="context" data-column-number="494" data-line-index="493,493"><span data-line-number-content="">494</span></div><div data-line-type="context" data-column-number="495" data-line-index="494,494"><span data-line-number-content="">495</span></div><div data-line-type="context" data-column-number="496" data-line-index="495,495"><span data-line-number-content="">496</span></div><div data-line-type="change-addition" data-column-number="497" data-line-index="496,496"><span data-line-number-content="">497</span></div><div data-line-type="context" data-column-number="498" data-line-index="497,497"><span data-line-number-content="">498</span></div><div data-line-type="context" data-column-number="499" data-line-index="498,498"><span data-line-number-content="">499</span></div><div data-line-type="context" data-column-number="500" data-line-index="499,499"><span data-line-number-content="">500</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">21 unmodified lines</span></div></div></div><div data-line-type="context" data-column-number="522" data-line-index="521,521"><span data-line-number-content="">522</span></div><div data-line-type="context" data-column-number="523" data-line-index="522,522"><span data-line-number-content="">523</span></div><div data-line-type="context" data-column-number="524" data-line-index="523,523"><span data-line-number-content="">524</span></div><div data-line-type="change-addition" data-column-number="525" data-line-index="524,524"><span data-line-number-content="">525</span></div><div data-line-type="context" data-column-number="526" data-line-index="525,525"><span data-line-number-content="">526</span></div><div data-line-type="change-addition" data-column-number="527" data-line-index="527,526"><span data-line-number-content="">527</span></div><div data-line-type="change-addition" data-column-number="528" data-line-index="528,527"><span data-line-number-content="">528</span></div><div data-line-type="context" data-column-number="529" data-line-index="529,528"><span data-line-number-content="">529</span></div><div data-line-type="change-addition" data-column-number="530" data-line-index="531,529"><span data-line-number-content="">530</span></div><div data-line-type="context" data-column-number="531" data-line-index="532,530"><span data-line-number-content="">531</span></div><div data-line-type="context" data-column-number="532" data-line-index="533,531"><span data-line-number-content="">532</span></div><div data-line-type="context" data-column-number="533" data-line-index="534,532"><span data-line-number-content="">533</span></div></div><div data-content="" style="grid-row: span 58"><div data-separator="line-info" data-separator-first=""><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">349 unmodified lines</span></div></div></div><div data-line="350" data-alt-line="350" data-line-type="context" data-line-index="349,349"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchTask: Task</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">&#x3C;</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Void</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">, Never</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">>?</span></div><div data-line="351" data-alt-line="351" data-line-type="context" data-line-index="350,350"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchWindow: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></div><div data-line="352" data-alt-line="352" data-line-type="context" data-line-index="351,351"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchPreferredOffset: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></div><div data-line="353" data-line-type="change-addition" data-line-index="352,352"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchGeneration: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">UInt64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 0</span></div><div data-line="354" data-alt-line="353" data-line-type="context" data-line-index="353,353"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> recentSeekRange: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></div><div data-line="355" data-alt-line="354" data-line-type="context" data-line-index="354,354"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> var</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> recentForegroundRange: HTTPByteRange</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span></div><div data-line="356" data-alt-line="355" data-line-type="context" data-line-index="355,355">
</div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">85 unmodified lines</span></div></div></div><div data-line="442" data-alt-line="441" data-line-type="context" data-line-index="441,441"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="443" data-alt-line="442" data-line-type="context" data-line-index="442,442">
</div><div data-line="444" data-alt-line="443" data-line-type="context" data-line-index="443,443"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchTask</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">cancel</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="445" data-line-type="change-addition" data-line-index="444,444"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchGeneration </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span></div><div data-line="446" data-line-type="change-addition" data-line-index="445,445"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> generation </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchGeneration</span></div><div data-line="447" data-alt-line="444" data-line-type="context" data-line-index="446,446"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> window </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> explicitWindow </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">??</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> offset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="448" data-alt-line="445" data-line-type="context" data-line-index="447,447"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchWindow </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> window</span></div><div data-line="449" data-alt-line="446" data-line-type="context" data-line-index="448,448"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchPreferredOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> offset</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">15 unmodified lines</span></div></div></div><div data-line="465" data-alt-line="462" data-line-type="context" data-line-index="464,464"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> if</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">hasData</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">for</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> chunk</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="466" data-alt-line="463" data-line-type="context" data-line-index="465,465"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> do</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="467" data-alt-line="464" data-line-type="context" data-line-index="466,466"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> data </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> try</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> await</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> fetcher.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">fetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> chunk</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="468" data-line-type="change-addition" data-line-index="467,467"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> !</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">Task.isCancelled </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="469" data-line-type="change-addition" data-line-index="468,468"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="470" data-line-type="change-addition" data-line-index="469,469"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="471" data-alt-line="465" data-line-type="context" data-line-index="470,470"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> store.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">insert</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">data</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> data, at</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> chunk.start</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="472" data-alt-line="466" data-line-type="context" data-line-index="471,471"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> evictOverBudget</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">protecting</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> window</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="473" data-alt-line="467" data-line-type="context" data-line-index="472,472"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">10 unmodified lines</span></div></div></div><div data-line="484" data-alt-line="478" data-line-type="context" data-line-index="483,483"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="485" data-alt-line="479" data-line-type="context" data-line-index="484,484"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="486" data-alt-line="480" data-line-type="context" data-line-index="485,485"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="487" data-line-type="change-addition" data-line-index="486,486"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> guard</span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.prefetchGeneration </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">==</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> generation </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="488" data-line-type="change-addition" data-line-index="487,487"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="489" data-line-type="change-addition" data-line-index="488,488"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="490" data-alt-line="481" data-line-type="context" data-line-index="489,489"><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">activePrefetchWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="491" data-alt-line="482" data-line-type="context" data-line-index="490,490"><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C"> self</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#FFA359;--diffs-token-light:#D47628">activePrefetchPreferredOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> =</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="492" data-alt-line="483" data-line-type="context" data-line-index="491,491"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">1 unmodified line</span></div></div></div><div data-line="494" data-alt-line="485" data-line-type="context" data-line-index="493,493">
</div><div data-line="495" data-alt-line="486" data-line-type="context" data-line-index="494,494"><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> cancelPrefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="496" data-alt-line="487" data-line-type="context" data-line-index="495,495"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchTask</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">.</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">cancel</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">()</span></div><div data-line="497" data-line-type="change-addition" data-line-index="496,496"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> prefetchGeneration </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span></div><div data-line="498" data-alt-line="488" data-line-type="context" data-line-index="497,497"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchWindow </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="499" data-alt-line="489" data-line-type="context" data-line-index="498,498"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> activePrefetchPreferredOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> nil</span></div><div data-line="500" data-alt-line="490" data-line-type="context" data-line-index="499,499"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-separator="line-info"><div data-separator-wrapper=""><div data-separator-content=""><span data-unmodified-lines="">21 unmodified lines</span></div></div></div><div data-line="522" data-alt-line="512" data-line-type="context" data-line-index="521,521"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> abs</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">range.start </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">-</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> preferredOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> >=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> responseChunkSize </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">else</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> {</span></div><div data-line="523" data-alt-line="513" data-line-type="context" data-line-index="522,522"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> return</span></div><div data-line="524" data-alt-line="514" data-line-type="context" data-line-index="523,523"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> }</span></div><div data-line="525" data-line-type="change-addition" data-line-index="524,524"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> nextOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> range.end </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">+</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> 1</span></div><div data-line="526" data-alt-line="515" data-line-type="context" data-line-index="525,525"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">if</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> DEBUG</span></div><div data-line="527" data-line-type="change-addition" data-line-index="527,526"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> </span><span data-diff-span=""><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">let</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> reason </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">=</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> nextOffset </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">&#x3C;</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> </span></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">preferredOffset </span><span data-diff-span=""><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">?</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "reanchor-foreground"</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> :</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> "</span></span><span data-diff-span=""><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">follow-foreground"</span></span></div><div data-line="528" data-line-type="change-addition" data-line-index="528,527"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> print</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"[DreamioRangeCache] prefetch </span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">reason</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> from=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">preferredOffset</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43"> to=</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">\(</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">nextOffset</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">)</span><span style="--diffs-token-dark:#5ECC71;--diffs-token-light:#199F43">"</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="529" data-alt-line="517" data-line-type="context" data-line-index="529,528"><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">#</span><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61">endif</span></div><div data-line="530" data-line-type="change-addition" data-line-index="531,529"><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> prefetch</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> </span><span data-diff-span=""><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">nextOffset</span></span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">, forceRestart</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">:</span><span style="--diffs-token-dark:#68CDF2;--diffs-token-light:#1CA1C7"> true</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span></div><div data-line="531" data-alt-line="519" data-line-type="context" data-line-index="532,530"><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> }</span></div><div data-line="532" data-alt-line="520" data-line-type="context" data-line-index="533,531">
</div><div data-line="533" data-alt-line="521" data-line-type="context" data-line-index="534,532"><span style="--diffs-token-dark:#FF678D;--diffs-token-light:#D32A61"> private</span><span style="--diffs-token-dark:#D568EA;--diffs-token-light:#A631BE"> func</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF"> targetWindow</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">(</span><span style="--diffs-token-dark:#9D6AFB;--diffs-token-light:#693ACF">aroundByteOffset</span><span style="--diffs-token-dark:#A3A3A3;--diffs-token-light:#636363"> offset</span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A">: </span><span style="--diffs-token-dark:#FFAB16;--diffs-token-light:#D5901C">Int64</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">)</span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363"> -></span><span style="--diffs-token-dark:#FAFAFA;--diffs-token-light:#0A0A0A"> HTTPByteRange </span><span style="--diffs-token-dark:#636363;--diffs-token-light:#636363">{</span></div></div></code></pre></section>
<h3>Related issues or PRs</h3>
<p>Beads issue <code>dreamio-2hw</code>.</p>
</section>
</main>
</body>
</html>