PageSourceSearch

https://florian2richter.github.io/

html florian2richter.github.io collected 2026-10-03 08:20:46 UTC 26,417 bytes, 692 lines download raw bytes

1<!DOCTYPE html>
2<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
3
4<meta charset="utf-8">
5<meta name="generator" content="quarto-1.10.18">
6
7<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
8
9
10<title>Florian’s Blog</title>
11<style>
12/* Default styles provided by pandoc.
13** See https://pandoc.org/MANUAL.html#variables-for-html for config info.
14*/
15span.smallcaps{font-variant: small-caps;}
16div.columns{display: flex; gap: 1.5em;}
17div.column{flex: auto;}
18@media screen {
19div.columns{gap: min(4vw, 1.5em);}
20div.column{overflow-x: auto;}
21}
22div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
23ul.task-list{list-style: none;}
24ul.task-list li input[type="checkbox"] {
25  width: 0.8em;
26  margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ 
27  vertical-align: middle;
28}
29</style>
30
31
32<script src="site_libs/quarto-nav/quarto-nav.js"></script>
vendor: 1 bytes, line 32
32
33<script src="site_libs/quarto-nav/headroom.min.js"></script>
vendor: 1 bytes, line 33
33
34<script src="site_libs/clipboard/clipboard.min.js"></script>
vendor: 1 bytes, line 34
34
35<script src="site_libs/quarto-search/autocomplete.umd.js"></script>
vendor: 1 bytes, line 35
35
36<script src="site_libs/quarto-search/fuse.min.js"></script>
vendor: 1 bytes, line 36
36
37<script src="site_libs/quarto-search/quarto-search.js"></script>
37
38<meta name="quarto:offset" content="./">
39<script src="site_libs/quarto-listing/list.min.js"></script>
vendor: 1 bytes, line 39
39
40<script src="site_libs/quarto-listing/quarto-listing.js"></script>
vendor: 1 bytes, line 40
40
41<script src="site_libs/quarto-html/quarto.js" type="module"></script>
vendor: 1 bytes, line 41
41
42<script src="site_libs/quarto-html/tabsets/tabsets.js" type="module"></script>
vendor: 1 bytes, line 42
42
43<script src="site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 43
43
44<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
vendor: 1 bytes, line 44
44
45<script src="site_libs/quarto-html/anchor.min.js"></script>
45
46<link href="site_libs/quarto-html/tippy.css" rel="stylesheet">
47<link href="site_libs/quarto-html/quarto-syntax-highlighting-64a204ab8560d761af7679ceaba22944.css" rel="stylesheet" id="quarto-text-highlighting-styles">
48<script src="site_libs/bootstrap/bootstrap.min.js"></script>
48
49<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
50<link href="site_libs/bootstrap/bootstrap-2b00583592e815700529758077e730d0.min.css" rel="stylesheet" append-hash="true" id="quarto-bootstrap" data-mode="light">
51<script id="quarto-search-options" type="application/json">{
52  "location": "navbar",
53  "copy-button": false,
54  "collapse-after": 3,
55  "panel-placement": "end",
56  "type": "overlay",
57  "limit": 50,
58  "keyboard-shortcut": [
59    "f",
60    "/",
61    "s"
62  ],
63  "show-item-context": false,
64  "language": {
65    "search-no-results-text": "No results",
66    "search-matching-documents-text": "matching documents",
67    "search-copy-link-title": "Copy link to search",
68    "search-hide-matches-text": "Hide additional matches",
69    "search-more-match-text": "more match in this document",
70    "search-more-matches-text": "more matches in this document",
71    "search-clear-button-title": "Clear",
72    "search-text-placeholder": "",
73    "search-detached-cancel-button-title": "Cancel",
74    "search-submit-button-title": "Submit",
75    "search-label": "Search"
76  }
77}</script>
vendor: 1 bytes, line 77
77
78<script>
79
80  window.document.addEventListener("DOMContentLoaded", function (_event) {
81    const listingTargetEl = window.document.querySelector('#listing-listing .list');
82    if (!listingTargetEl) {
83      // No listing discovered, do not attach.
84      return; 
85    }
86
87    const options = {
88      valueNames: ['listing-image','listing-title',{ data: ['index'] },{ data: ['categories'] },{ data: ['listing-date-sort'] },{ data: ['listing-file-modified-sort'] }],
89      
90      searchColumns: ["listing-title","listing-author","listing-date","listing-image","listing-description"],
91    };
92
93    window['quarto-listings'] = window['quarto-listings'] || {};
94    window['quarto-listings']['listing-listing'] = new List('listing-listing', options);
95
96    if (window['quarto-listing-loaded']) {
97      window['quarto-listing-loaded']();
98    }
99  });
100
101  window.addEventListener('hashchange',() => {
102    if (window['quarto-listing-loaded']) {
103      window['quarto-listing-loaded']();
104    }
105  })
106  </script>
106
107<!-- GoatCounter page-view counting (no cookies). The path callback folds
108     /index.html into its directory so both URL forms of a page count as
109     one; count.js skips localhost on its own, so previews do not count. -->
110<script>
111  window.goatcounter = {
112    path: function (p) { return p.replace(/\/index\.html$/, '/'); }
113  };
114</script>
vendor: 1 bytes, line 114
114
115<script data-goatcounter="https://florian2richter.goatcounter.com/count" async="" src="//gc.zgo.at/count.js"></script>
115
116
117  
117<script>window.backupDefine = window.define; window.define = undefined;</script>
117<script src="https://cdn.jsdelivr.net/npm/katex@latest/dist/katex.min.js"></script>
117
118  
118<script>document.addEventListener("DOMContentLoaded", function () {
119 var mathElements = document.getElementsByClassName("math");
120 var macros = [];
121 for (var i = 0; i < mathElements.length; i++) {
122  var texText = mathElements[i].firstChild;
123  if (mathElements[i].tagName == "SPAN") {
124   katex.render(texText.data, mathElements[i], {
125    displayMode: mathElements[i].classList.contains('display'),
126    throwOnError: false,
127    macros: macros,
128    fleqn: false
129   });
130}}});
131  </script>
131
132  
132<script>window.define = window.backupDefine; window.backupDefine = undefined;</script>
132<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@latest/dist/katex.min.css">
133
134<script type="text/javascript">
135const typesetMath = (el) => {
136  if (window.MathJax) {
137    // MathJax Typeset
138    window.MathJax.typeset([el]);
139  } else if (window.katex) {
140    // KaTeX Render
141    var mathElements = el.getElementsByClassName("math");
142    var macros = [];
143    for (var i = 0; i < mathElements.length; i++) {
144      var texText = mathElements[i].firstChild;
145      if (mathElements[i].tagName == "SPAN" && texText && texText.data) {
146        window.katex.render(texText.data, mathElements[i], {
147          displayMode: mathElements[i].classList.contains('display'),
148          throwOnError: false,
149          macros: macros,
150          fleqn: false
151        });
152      }
153    }
154  }
155}
156window.Quarto = {
157  typesetMath
158};
159</script>
159
160
161<link rel="stylesheet" href="styles.css">
162<link rel="alternate" type="application/rss+xml" title="Florian's Blog" href="index.xml" data-external="1"><meta property="og:title" content="Florian’s Blog">
163<meta property="og:image" content="https://florian2richter.github.io/posts/clifford-roots/figures/teaser-art/clifford-teaser-og.png">
164<meta property="og:site_name" content="Florian’s Blog">
165<meta property="og:image:height" content="630">
166<meta property="og:image:width" content="1200">
167<meta name="twitter:title" content="Florian’s Blog">
168<meta name="twitter:image" content="https://florian2richter.github.io/posts/clifford-roots/figures/teaser-art/clifford-teaser-og.png">
169<meta name="twitter:card" content="summary_large_image">
170<meta name="twitter:image-height" content="630">
171<meta name="twitter:image-width" content="1200">
172</head>
173
174<body class="nav-fixed quarto-light">
175
176<div id="quarto-search-results"></div>
177  <header id="quarto-header" class="headroom fixed-top">
178    <nav class="navbar navbar-expand-lg " data-bs-theme="dark">
179      <div class="navbar-container container-fluid">
180      <div class="navbar-brand-container mx-auto">
181    <a class="navbar-brand" href="./index.html">
182    <span class="navbar-title">Florian’s Blog</span>
183    </a>
184  </div>
185            <div id="quarto-search" class="" title="Search"></div>
186          <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" role="menu" aria-expanded="false" aria-label="Toggle navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }">
187  <span class="navbar-toggler-icon"></span>
188</button>
189          <div class="collapse navbar-collapse" id="navbarCollapse">
190            <ul class="navbar-nav navbar-nav-scroll me-auto">
191  <li class="nav-item">
192    <a class="nav-link active" href="./index.html" aria-current="page"> 
193<span class="menu-text">Blog</span></a>
194  </li>  
195  <li class="nav-item">
196    <a class="nav-link" href="./about.html"> 
197<span class="menu-text">About</span></a>
198  </li>  
199</ul>
200            <ul class="navbar-nav navbar-nav-scroll ms-auto">
201  <li class="nav-item compact">
202    <a class="nav-link" href="https://github.com/Florian2Richter"> <i class="bi bi-github" role="img" aria-label="GitHub">
203</i> 
204<span class="menu-text"></span></a>
205  </li>  
206  <li class="nav-item compact">
207    <a class="nav-link" href="mailto:[email protected]"> <i class="bi bi-envelope" role="img" aria-label="Email">
208</i> 
209<span class="menu-text"></span></a>
210  </li>  
211</ul>
212          </div> <!-- /navcollapse -->
213            <div class="quarto-navbar-tools">
214</div>
215      </div> <!-- /container-fluid -->
216    </nav>
217</header>
218<!-- content -->
219<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-full page-navbar">
220<!-- sidebar -->
221<!-- margin-sidebar -->
222    <div id="quarto-margin-sidebar" class="sidebar margin-sidebar zindex-bottom">
223        
224    </div>
225<!-- main -->
226<main class="content column-page" id="quarto-document-content">
227
228<header id="title-block-header" class="quarto-title-block default">
229<div class="quarto-title">
230<h1 class="title">Florian’s Blog</h1>
231</div>
232
233
234
235<div class="quarto-title-meta column-page">
236
237    
238  
239    
240  </div>
241  
242
243
244</header>
245
246
247
248
249
250
251<div class="quarto-listing quarto-listing-container-grid" id="listing-listing">
252<div class="list grid quarto-listing-cols-3">
253<div class="g-col-1" data-index="0" data-categories="cXVhbnR1bSUyQ2NoYW5uZWxzJTJDY2xpZmZvcmQlMkNmaW5pdGUtZmllbGRz" data-listing-date-sort="1786147200000" data-listing-file-modified-sort="1789225426363" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="2" data-listing-word-count-sort="380">
254<a href="./posts/clifford-roots/index.html" class="quarto-grid-link">
255<div class="quarto-grid-item card h-100 card-left">
256<p class="card-img-top">
257<img loading="lazy" src="./posts/clifford-roots/figures/teaser-art/clifford-teaser-card.png" class="thumbnail-image card-img" style="height: 12rem;" alt="Thousands of faint teal chords trace Bloch vectors spiralling into a glowing grey core inside a dar
257k sphere silhouette">
258</p>
259<div class="card-body post-contents">
260<h5 class="no-anchor card-title listing-title">
261How finely can you divide a depolarizing channel?
262</h5>
263</div>
264</div></a>
265</div>
266</div>
267<div class="listing-no-matching d-none">No matching items</div>
268</div></main> <!-- /main -->
269<script id="quarto-html-after-body" type="application/javascript">
270  window.document.addEventListener("DOMContentLoaded", function (event) {
271    const icon = "";
272    const anchorJS = new window.AnchorJS();
273    anchorJS.options = {
274      placement: 'right',
275      icon: icon
276    };
277    anchorJS.add('.anchored');
278    const isCodeAnnotation = (el) => {
279      for (const clz of el.classList) {
280        if (clz.startsWith('code-annotation-')) {                     
281          return true;
282        }
283      }
284      return false;
285    }
286    const onCopySuccess = function(e) {
287      // button target
288      const button = e.trigger;
289      // don't keep focus
290      button.blur();
291      // flash "checked"
292      button.classList.add('code-copy-button-checked');
293      var currentTitle = button.getAttribute("title");
294      button.setAttribute("title", "Copied!");
295      let tooltip;
296      if (window.bootstrap) {
297        button.setAttribute("data-bs-toggle", "tooltip");
298        button.setAttribute("data-bs-placement", "left");
299        button.setAttribute("data-bs-title", "Copied!");
300        tooltip = new bootstrap.Tooltip(button, 
301          { trigger: "manual", 
302            customClass: "code-copy-button-tooltip",
303            offset: [0, -8]});
304        tooltip.show();    
305      }
306      setTimeout(function() {
307        if (tooltip) {
308          tooltip.hide();
309          button.removeAttribute("data-bs-title");
310          button.removeAttribute("data-bs-toggle");
311          button.removeAttribute("data-bs-placement");
312        }
313        button.setAttribute("title", currentTitle);
314        button.classList.remove('code-copy-button-checked');
315      }, 1000);
316      // clear code selection
317      e.clearSelection();
318    }
319    const getTextToCopy = function(trigger) {
320      const outerScaffold = trigger.parentElement.cloneNode(true);
321      const codeEl = outerScaffold.querySelector('code');
322      for (const childEl of codeEl.children) {
323        if (isCodeAnnotation(childEl)) {
324          childEl.remove();
325        }
326      }
327      return codeEl.innerText;
328    }
329    const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', {
330      text: getTextToCopy
331    });
332    clipboard.on('success', onCopySuccess);
333    if (window.document.getElementById('quarto-embedded-source-code-modal')) {
334      const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', {
335        text: getTextToCopy,
336        container: window.document.getElementById('quarto-embedded-source-code-modal')
337      });
338      clipboardModal.on('success', onCopySuccess);
339    }
340      var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
341      var mailtoRegex = new RegExp(/^mailto:/);
342        var filterRegex = new RegExp("https:\/\/florian2richter\.github\.io");
343      var isInternal = (href) => {
344          return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
345      }
346      // Inspect non-navigation links and adorn them if external
347     var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool):not(.about-link)');
348      for (var i=0; i<links.length; i++) {
349        const link = links[i];
350        if (!isInternal(link.href)) {
351          // undo the damage that might have been done by quarto-nav.js in the case of
352          // links that we want to consider external
353          if (link.dataset.originalHref !== undefined) {
354            link.href = link.dataset.originalHref;
355          }
356            // target, if specified
357            link.setAttribute("target", "_blank");
358            if (link.getAttribute("rel") === null) {
359              link.setAttribute("rel", "noopener");
360            }
361        }
362      }
363    function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
364      const config = {
365        allowHTML: true,
366        maxWidth: 500,
367        delay: 100,
368        arrow: false,
369        appendTo: function(el) {
370            return el.parentElement;
371        },
372        interactive: true,
373        interactiveBorder: 10,
374        theme: 'quarto',
375        placement: 'bottom-start',
376      };
377      if (contentFn) {
378        config.content = contentFn;
379      }
380      if (onTriggerFn) {
381        config.onTrigger = onTriggerFn;
382      }
383      if (onUntriggerFn) {
384        config.onUntrigger = onUntriggerFn;
385      }
386      window.tippy(el, config); 
387    }
388    const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
389    for (var i=0; i<noterefs.length; i++) {
390      const ref = noterefs[i];
391      tippyHover(ref, function() {
392        // use id or data attribute instead here
393        let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
394        try { href = new URL(href).hash; } catch {}
395        const id = href.replace(/^#\/?/, "");
396        const note = window.document.getElementById(id);
397        if (note) {
398          return note.innerHTML;
399        } else {
400          return "";
401        }
402      });
403    }
404    const xrefs = window.document.querySelectorAll('a.quarto-xref');
405    const processXRef = (id, note) => {
406      // Strip column container classes
407      const stripColumnClz = (el) => {
408        el.classList.remove("page-full", "page-columns");
409        if (el.children) {
410          for (const child of el.children) {
411            stripColumnClz(child);
412          }
413        }
414      }
415      stripColumnClz(note)
416      if (id === null || id.startsWith('sec-')) {
417        // Special case sections, only their first couple elements
418        const container = document.createElement("div");
419        if (note.children && note.children.length > 2) {
420          container.appendChild(note.children[0].cloneNode(true));
421          for (let i = 1; i < note.children.length; i++) {
422            const child = note.children[i];
423            if (child.tagName === "P" && child.innerText === "") {
424              continue;
425            } else {
426              container.appendChild(child.cloneNode(true));
427              break;
428            }
429          }
430          if (window.Quarto?.typesetMath) {
431            window.Quarto.typesetMath(container);
432          }
433          return container.innerHTML
434        } else {
435          if (window.Quarto?.typesetMath) {
436            window.Quarto.typesetMath(note);
437          }
438          return note.innerHTML;
439        }
440      } else {
441        // Remove any anchor links if they are present
442        const anchorLink = note.querySelector('a.anchorjs-link');
443        if (anchorLink) {
444          anchorLink.remove();
445        }
446        if (window.Quarto?.typesetMath) {
447          window.Quarto.typesetMath(note);
448        }
449        if (note.classList.contains("callout")) {
450          return note.outerHTML;
451        } else {
452          return note.innerHTML;
453        }
454      }
455    }
456    for (var i=0; i<xrefs.length; i++) {
457      const xref = xrefs[i];
458      tippyHover(xref, undefined, function(instance) {
459        instance.disable();
460        let url = xref.getAttribute('href');
461        let hash = undefined; 
462        if (url.startsWith('#')) {
463          hash = url;
464        } else {
465          try { hash = new URL(url).hash; } catch {}
466        }
467        if (hash) {
468          const id = hash.replace(/^#\/?/, "");
469          const note = window.document.getElementById(id);
470          if (note !== null) {
471            try {
472              const html = processXRef(id, note.cloneNode(true));
473              instance.setContent(html);
474            } finally {
475              instance.enable();
476              instance.show();
477            }
478          } else {
479            // See if we can fetch this
480            fetch(url.split('#')[0])
481            .then(res => res.text())
482            .then(html => {
483              const parser = new DOMParser();
484              const htmlDoc = parser.parseFromString(html, "text/html");
485              const note = htmlDoc.getElementById(id);
486              if (note !== null) {
487                const html = processXRef(id, note);
488                instance.setContent(html);
489              } 
490            }).finally(() => {
491              instance.enable();
492              instance.show();
493            });
494          }
495        } else {
496          // See if we can fetch a full url (with no hash to target)
497          // This is a special case and we should probably do some content thinning / targeting
498          fetch(url)
499          .then(res => res.text())
500          .then(html => {
501            const parser = new DOMParser();
502            const htmlDoc = parser.parseFromString(html, "text/html");
503            const note = htmlDoc.querySelector('main.content');
504            if (note !== null) {
505              // This should only happen for chapter cross references
506              // (since there is no id in the URL)
507              // remove the first header
508              if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
509                note.children[0].remove();
510              }
511              const html = processXRef(null, note);
512              instance.setContent(html);
513            } 
514          }).finally(() => {
515            instance.enable();
516            instance.show();
517          });
518        }
519      }, function(instance) {
520      });
521    }
522        let selectedAnnoteEl;
523        const selectorForAnnotation = ( cell, annotation) => {
524          let cellAttr = 'data-code-cell="' + cell + '"';
525          let lineAttr = 'data-code-annotation="' +  annotation + '"';
526          const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
527          return selector;
528        }
529        const selectCodeLines = (annoteEl) => {
530          const doc = window.document;
531          const targetCell = annoteEl.getAttribute("data-target-cell");
532          const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
533          const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
534          const lines = annoteSpan.getAttribute("data-code-lines").split(",");
535          const lineIds = lines.map((line) => {
536            return targetCell + "-" + line;
537          })
538          let top = null;
539          let height = null;
540          let parent = null;
541          if (lineIds.length > 0) {
542              //compute the position of the single el (top and bottom and make a div)
543              const el = window.document.getElementById(lineIds[0]);
544              top = el.offsetTop;
545              height = el.offsetHeight;
546              parent = el.parentElement.parentElement;
547            if (lineIds.length > 1) {
548              const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
549              const bottom = lastEl.offsetTop + lastEl.offsetHeight;
550              height = bottom - top;
551            }
552            if (top !== null && height !== null && parent !== null) {
553              // cook up a div (if necessary) and position it 
554              let div = window.document.getElementById("code-annotation-line-highlight");
555              if (div === null) {
556                div = window.document.createElement("div");
557                div.setAttribute("id", "code-annotation-line-highlight");
558                div.style.position = 'absolute';
559                parent.appendChild(div);
560              }
561              div.style.top = top - 2 + "px";
562              div.style.height = height + 4 + "px";
563              div.style.left = 0;
564              let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
565              if (gutterDiv === null) {
566                gutterDiv = window.document.createElement("div");
567                gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
568                gutterDiv.style.position = 'absolute';
569                const codeCell = window.document.getElementById(targetCell);
570                const gutter = codeCell.querySelector('.code-annotation-gutter');
571                gutter.appendChild(gutterDiv);
572              }
573              gutterDiv.style.top = top - 2 + "px";
574              gutterDiv.style.height = height + 4 + "px";
575            }
576            selectedAnnoteEl = annoteEl;
577          }
578        };
579        const unselectCodeLines = () => {
580          const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
581          elementsIds.forEach((elId) => {
582            const div = window.document.getElementById(elId);
583            if (div) {
584              div.remove();
585            }
586          });
587          selectedAnnoteEl = undefined;
588        };
589          // Handle positioning of the toggle
590      window.addEventListener(
591        "resize",
592        throttle(() => {
593          elRect = undefined;
594          if (selectedAnnoteEl) {
595            selectCodeLines(selectedAnnoteEl);
596          }
597        }, 10)
598      );
599      function throttle(fn, ms) {
600      let throttle = false;
601      let timer;
602        return (...args) => {
603          if(!throttle) { // first call gets through
604              fn.apply(this, args);
605              throttle = true;
606          } else { // all the others get throttled
607              if(timer) clearTimeout(timer); // cancel #2
608              timer = setTimeout(() => {
609                fn.apply(this, args);
610                timer = throttle = false;
611              }, ms);
612          }
613        };
614      }
615        // Attach click handler to the DT
616        const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
617        for (const annoteDlNode of annoteDls) {
618          annoteDlNode.addEventListener('click', (event) => {
619            const clickedEl = event.target;
620            if (clickedEl !== selectedAnnoteEl) {
621              unselectCodeLines();
622              const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
623              if (activeEl) {
624                activeEl.classList.remove('code-annotation-active');
625              }
626              selectCodeLines(clickedEl);
627              clickedEl.classList.add('code-annotation-active');
628            } else {
629              // Unselect the line
630              unselectCodeLines();
631              clickedEl.classList.remove('code-annotation-active');
632            }
633          });
634        }
635    const findCites = (el) => {
636      const parentEl = el.parentElement;
637      if (parentEl) {
638        const cites = parentEl.dataset.cites;
639        if (cites) {
640          return {
641            el,
642            cites: cites.split(' ')
643          };
644        } else {
645          return findCites(el.parentElement)
646        }
647      } else {
648        return undefined;
649      }
650    };
651    var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
652    for (var i=0; i<bibliorefs.length; i++) {
653      const ref = bibliorefs[i];
654      const citeInfo = findCites(ref);
655      if (citeInfo) {
656        tippyHover(citeInfo.el, function() {
657          var popup = window.document.createElement('div');
658          citeInfo.cites.forEach(function(cite) {
659            var citeDiv = window.document.createElement('div');
660            citeDiv.classList.add('hanging-indent');
661            citeDiv.classList.add('csl-entry');
662            var biblioDiv = window.document.getElementById('ref-' + cite);
663            if (biblioDiv) {
664              citeDiv.innerHTML = biblioDiv.innerHTML;
665            }
666            popup.appendChild(citeDiv);
667          });
668          return popup.innerHTML;
669        });
670      }
671    }
672  });
673  </script>
673
674</div> <!-- /content -->
675<footer class="footer">
676  <div class="nav-footer">
677    <div class="nav-footer-left">
678      &nbsp;
679    </div>   
680    <div class="nav-footer-center">
681<p>© 2026 Florian Richter</p>
682</div>
683    <div class="nav-footer-right">
684      &nbsp;
685    </div>
686  </div>
687</footer>
688
689
690
691
692</body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.