PageSourceSearch

https://fewslab.netlify.app/about

html fewslab.netlify.app collected 2026-10-03 10:43:50 UTC 26,666 bytes, 639 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<!-- This site is hosted on Netlify. Anyone can build and deploy a site
6     like this one for free: https://netlify.new/?utm_campaign=loops&utm_source=ai-legible&utm_medium=owned&utm_content=comment&utm_id=af4360b4-4a70-4cbe-87f6-43fa708bbace
7     Netlify hosting facts for this site: static/SSR served via Netlify Edge. -->
8<meta name="generator" content="quarto-1.9.38">
9
10<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
11
12
13<title>About the FEWsLab – FEWsLab</title>
14<style>
15/* Default styles provided by pandoc.
16** See https://pandoc.org/MANUAL.html#variables-for-html for config info.
17*/
18code{white-space: pre-wrap;}
19span.smallcaps{font-variant: small-caps;}
20div.columns{display: flex; gap: min(4vw, 1.5em);}
21div.column{flex: auto; overflow-x: auto;}
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<link href="./images/favicon/favicon.ico" rel="icon">
40<script src="site_libs/quarto-html/quarto.js" type="module"></script>
vendor: 1 bytes, line 40
40
41<script src="site_libs/quarto-html/tabsets/tabsets.js" type="module"></script>
vendor: 1 bytes, line 41
41
42<script src="site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 42
42
43<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
vendor: 1 bytes, line 43
43
44<script src="site_libs/quarto-html/anchor.min.js"></script>
44
45<link href="site_libs/quarto-html/tippy.css" rel="stylesheet">
46<link href="site_libs/quarto-html/quarto-syntax-highlighting-15634bcf2e68342d4ad2dfa704d543f6.css" rel="stylesheet" id="quarto-text-highlighting-styles">
47<script src="site_libs/bootstrap/bootstrap.min.js"></script>
47
48<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
49<link href="site_libs/bootstrap/bootstrap-22f1789df73c9a524649167e87525b34.min.css" rel="stylesheet" append-hash="true" id="quarto-bootstrap" data-mode="light">
50<script id="quarto-search-options" type="application/json">{
51  "location": "navbar",
52  "copy-button": false,
53  "collapse-after": 3,
54  "panel-placement": "end",
55  "type": "overlay",
56  "limit": 50,
57  "keyboard-shortcut": [
58    "f",
59    "/",
60    "s"
61  ],
62  "language": {
63    "search-no-results-text": "No results",
64    "search-matching-documents-text": "matching documents",
65    "search-copy-link-title": "Copy link to search",
66    "search-hide-matches-text": "Hide additional matches",
67    "search-more-match-text": "more match in this document",
68    "search-more-matches-text": "more matches in this document",
69    "search-clear-button-title": "Clear",
70    "search-text-placeholder": "",
71    "search-detached-cancel-button-title": "Cancel",
72    "search-submit-button-title": "Submit",
73    "search-label": "Search"
74  }
75}</script>
75
76<style>html{ scroll-behavior: smooth; }</style>
77<!-- academic icons -->
78
79<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/jpswalsh/academicons@1/css/academicons.min.css">
80
81<!-- altmetric icons -->
82<script type="text/javascript" src="https://d1bxh8uas1mnw7.cloudfront.net/assets/embed.js"></script>
82
83
84<!-- fontawesome icons -->
85<script src="https://kit.fontawesome.com/1392a7030f.js" crossorigin="anonymous"></script>
85
86
87
88
89
90</head>
91
92<body class="floating nav-fixed quarto-light">
93
94<div id="quarto-search-results"></div>
95  <header id="quarto-header" class="headroom fixed-top">
96    <nav class="navbar navbar-expand-lg " data-bs-theme="dark">
97      <div class="navbar-container container-fluid">
98      <div class="navbar-brand-container mx-auto">
99    <a class='navbar-brand' href='/'>
100    <span class="navbar-title">FEWsLab</span>
101    </a>
102  </div>
103            <div id="quarto-search" class="" title="Search"></div>
104          <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(); }">
105  <span class="navbar-toggler-icon"></span>
106</button>
107          <div class="collapse navbar-collapse" id="navbarCollapse">
108            <ul class="navbar-nav navbar-nav-scroll ms-auto">
109  <li class="nav-item">
110    <a aria-current='page' class='nav-link active' href='/about'> 
111<span class="menu-text">About</span></a>
112  </li>  
113  <li class="nav-item">
114    <a class='nav-link' href='/lab'> 
115<span class="menu-text">Team</span></a>
116  </li>  
117  <li class="nav-item">
118    <a class='nav-link' href='/research'> 
119<span class="menu-text">News &amp; Publications</span></a>
120  </li>  
121  <li class="nav-item">
122    <a class='nav-link' href='/teaching'> 
123<span class="menu-text">Teaching</span></a>
124  </li>  
125  <li class="nav-item">
126    <a class='nav-link' href='/projects'> 
127<span class="menu-text">Projects</span></a>
128  </li>  
129</ul>
130          </div> <!-- /navcollapse -->
131            <div class="quarto-navbar-tools">
132</div>
133      </div> <!-- /container-fluid -->
134    </nav>
135</header>
136<!-- content -->
137<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-full page-navbar">
138<!-- sidebar -->
139  <nav id="quarto-sidebar" class="sidebar collapse collapse-horizontal quarto-sidebar-collapse-item sidebar-navigation floating overflow-auto">
140    <nav id="TOC" role="doc-toc" class="toc-active">
141    <h2 id="toc-title">On this page</h2>
142   
143  <ul>
144  <li><a href="#sustainability-systems-and-environmental-ethics" id="toc-sustainability-systems-and-environmental-ethics" class="nav-link active" data-scroll-target="#sustainability-systems-and-environmental-ethics">Sustainability, Systems, and Environmental Ethics</a></li>
145  <li><a href="#who-we-are" id="toc-who-we-are" class="nav-link" data-scroll-target="#who-we-are">Who We Are</a></li>
146  <li><a href="#research" id="toc-research" class="nav-link" data-scroll-target="#research">Research</a></li>
147  <li><a href="#news-and-highlights" id="toc-news-and-highlights" class="nav-link" data-scroll-target="#news-and-highlights">News and Highlights</a></li>
148  </ul>
149</nav>
150</nav>
151<div id="quarto-sidebar-glass" class="quarto-sidebar-collapse-item" data-bs-toggle="collapse" data-bs-target=".quarto-sidebar-collapse-item"></div>
152<!-- margin-sidebar -->
153    <div id="quarto-margin-sidebar" class="sidebar margin-sidebar zindex-bottom">
154    </div>
155<!-- main -->
156<main class="content column-page-right" id="quarto-document-content">
157
158<header id="title-block-header" class="quarto-title-block default">
159<div class="quarto-title">
160<h1 class="title">About the FEWsLab</h1>
161</div>
162
163
164
165<div class="quarto-title-meta column-page-right">
166
167    
168  
169    
170  </div>
171  
172
173
174</header>
175
176
177<section id="sustainability-systems-and-environmental-ethics" class="level1">
178<h1>Sustainability, Systems, and Environmental Ethics</h1>
179<p>The FEWsLab investigates interconnections across <strong>food</strong>, <strong>energy</strong>, and <strong>water</strong> systems. Our research integrates <strong>network modeling</strong>, <strong>socio-technical data</strong>, and <strong>ethical analysis</strong> to advance both policy and research questions in the areas of risk, resilience, and sustainability. We strive to bridge the gap between advancements in theory and useful insights for decision makers that address pressing global challenges.</p>
180<hr>
181</section>
182<section id="who-we-are" class="level1">
183<h1>Who We Are</h1>
184<p>The FEWsLab is led by <strong>Dr.&nbsp;Caitlin Grady</strong>, Associate Professor of Engineering Management and Systems Engineering at George Washington University and Director of Research at the <a href="https://globalfoodinstitute.gwu.edu/">
184Global Food Institute</a>. Dr.&nbsp;Grady brings a combination of academic, policy, and government experience. She has previously served as a faculty member at Penn State, a Policy Analyst at the U.S. Department of State and the Department of Energy, and as a Legislative Assistant in the U.S. Congress. Our lab thrives thanks to a talented and unique team of researchers, students, and collaborators who share a commitment to thinking outside the box.</p>
185<hr>
186</section>
187<section id="research" class="level1">
188<h1>Research</h1>
189<p>Our research is supported by the <strong>National Science Foundation</strong>, the <strong>U.S. Department of Agriculture</strong>, the <strong>McGovern Foundation</strong> and other institutional partners. We pursue interdisciplinary projects that address complex challenges through systems thinking, data-driven modeling, and policy-relevant analysis.</p>
190<hr>
191</section>
192<section id="news-and-highlights" class="level1">
193<h1>News and Highlights</h1>
194<ul>
195<li>Sachi Nandurkar published her <a href="https://zenodo.org/records/19500205">pre-print</a> and <a href="http://formula-one-netzero.fewslab.org/">dashboard</a> analyzing Formula One Net Zero Goals.</li>
196<li>Dr.&nbsp;Grady was recently named the next Director of Research for the <a href="https://globalfoodinstitute.gwu.edu/">Global Food Institute</a></li>
197<li>Abbey Kollar and Ji Qi presented recent research at the 10th International Engineering Systems Symposium hosted by <a href="https://cesun.org/">CESUN</a></li>
198<li>Dr.&nbsp;Grady was quoted in a recent episode of NPR’s All Things Considered <a href="https://www.npr.org/2025/07/04/nx-s1-5454884/why-hydropower-faces-more-barriers-than-wind-or-solar">July 4, 2025</a></li>
199<li>Dhanyasri Bolla was invited to present our work on Adaptation in Megacities to the IDB Annual Meeting of the Chief Audit Executives of the Multilateral Financial Institutions</li>
200</ul>
201
202
203</section>
204
205</main> <!-- /main -->
206<script id="quarto-html-after-body" type="application/javascript">
207  window.document.addEventListener("DOMContentLoaded", function (event) {
208    const icon = "";
209    const anchorJS = new window.AnchorJS();
210    anchorJS.options = {
211      placement: 'right',
212      icon: icon
213    };
214    anchorJS.add('.anchored');
215    const isCodeAnnotation = (el) => {
216      for (const clz of el.classList) {
217        if (clz.startsWith('code-annotation-')) {                     
218          return true;
219        }
220      }
221      return false;
222    }
223    const onCopySuccess = function(e) {
224      // button target
225      const button = e.trigger;
226      // don't keep focus
227      button.blur();
228      // flash "checked"
229      button.classList.add('code-copy-button-checked');
230      var currentTitle = button.getAttribute("title");
231      button.setAttribute("title", "Copied!");
232      let tooltip;
233      if (window.bootstrap) {
234        button.setAttribute("data-bs-toggle", "tooltip");
235        button.setAttribute("data-bs-placement", "left");
236        button.setAttribute("data-bs-title", "Copied!");
237        tooltip = new bootstrap.Tooltip(button, 
238          { trigger: "manual", 
239            customClass: "code-copy-button-tooltip",
240            offset: [0, -8]});
241        tooltip.show();    
242      }
243      setTimeout(function() {
244        if (tooltip) {
245          tooltip.hide();
246          button.removeAttribute("data-bs-title");
247          button.removeAttribute("data-bs-toggle");
248          button.removeAttribute("data-bs-placement");
249        }
250        button.setAttribute("title", currentTitle);
251        button.classList.remove('code-copy-button-checked');
252      }, 1000);
253      // clear code selection
254      e.clearSelection();
255    }
256    const getTextToCopy = function(trigger) {
257      const outerScaffold = trigger.parentElement.cloneNode(true);
258      const codeEl = outerScaffold.querySelector('code');
259      for (const childEl of codeEl.children) {
260        if (isCodeAnnotation(childEl)) {
261          childEl.remove();
262        }
263      }
264      return codeEl.innerText;
265    }
266    const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', {
267      text: getTextToCopy
268    });
269    clipboard.on('success', onCopySuccess);
270    if (window.document.getElementById('quarto-embedded-source-code-modal')) {
271      const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', {
272        text: getTextToCopy,
273        container: window.document.getElementById('quarto-embedded-source-code-modal')
274      });
275      clipboardModal.on('success', onCopySuccess);
276    }
277      var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
278      var mailtoRegex = new RegExp(/^mailto:/);
279        var filterRegex = new RegExp("https:\/\/fewslab\.netlify\.app");
280      var isInternal = (href) => {
281          return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
282      }
283      // Inspect non-navigation links and adorn them if external
284     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)');
285      for (var i=0; i<links.length; i++) {
286        const link = links[i];
287        if (!isInternal(link.href)) {
288          // undo the damage that might have been done by quarto-nav.js in the case of
289          // links that we want to consider external
290          if (link.dataset.originalHref !== undefined) {
291            link.href = link.dataset.originalHref;
292          }
293            // target, if specified
294            link.setAttribute("target", "_blank");
295            if (link.getAttribute("rel") === null) {
296              link.setAttribute("rel", "noopener");
297            }
298        }
299      }
300    function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
301      const config = {
302        allowHTML: true,
303        maxWidth: 500,
304        delay: 100,
305        arrow: false,
306        appendTo: function(el) {
307            return el.parentElement;
308        },
309        interactive: true,
310        interactiveBorder: 10,
311        theme: 'quarto',
312        placement: 'bottom-start',
313      };
314      if (contentFn) {
315        config.content = contentFn;
316      }
317      if (onTriggerFn) {
318        config.onTrigger = onTriggerFn;
319      }
320      if (onUntriggerFn) {
321        config.onUntrigger = onUntriggerFn;
322      }
323      window.tippy(el, config); 
324    }
325    const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
326    for (var i=0; i<noterefs.length; i++) {
327      const ref = noterefs[i];
328      tippyHover(ref, function() {
329        // use id or data attribute instead here
330        let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
331        try { href = new URL(href).hash; } catch {}
332        const id = href.replace(/^#\/?/, "");
333        const note = window.document.getElementById(id);
334        if (note) {
335          return note.innerHTML;
336        } else {
337          return "";
338        }
339      });
340    }
341    const xrefs = window.document.querySelectorAll('a.quarto-xref');
342    const processXRef = (id, note) => {
343      // Strip column container classes
344      const stripColumnClz = (el) => {
345        el.classList.remove("page-full", "page-columns");
346        if (el.children) {
347          for (const child of el.children) {
348            stripColumnClz(child);
349          }
350        }
351      }
352      stripColumnClz(note)
353      if (id === null || id.startsWith('sec-')) {
354        // Special case sections, only their first couple elements
355        const container = document.createElement("div");
356        if (note.children && note.children.length > 2) {
357          container.appendChild(note.children[0].cloneNode(true));
358          for (let i = 1; i < note.children.length; i++) {
359            const child = note.children[i];
360            if (child.tagName === "P" && child.innerText === "") {
361              continue;
362            } else {
363              container.appendChild(child.cloneNode(true));
364              break;
365            }
366          }
367          if (window.Quarto?.typesetMath) {
368            window.Quarto.typesetMath(container);
369          }
370          return container.innerHTML
371        } else {
372          if (window.Quarto?.typesetMath) {
373            window.Quarto.typesetMath(note);
374          }
375          return note.innerHTML;
376        }
377      } else {
378        // Remove any anchor links if they are present
379        const anchorLink = note.querySelector('a.anchorjs-link');
380        if (anchorLink) {
381          anchorLink.remove();
382        }
383        if (window.Quarto?.typesetMath) {
384          window.Quarto.typesetMath(note);
385        }
386        if (note.classList.contains("callout")) {
387          return note.outerHTML;
388        } else {
389          return note.innerHTML;
390        }
391      }
392    }
393    for (var i=0; i<xrefs.length; i++) {
394      const xref = xrefs[i];
395      tippyHover(xref, undefined, function(instance) {
396        instance.disable();
397        let url = xref.getAttribute('href');
398        let hash = undefined; 
399        if (url.startsWith('#')) {
400          hash = url;
401        } else {
402          try { hash = new URL(url).hash; } catch {}
403        }
404        if (hash) {
405          const id = hash.replace(/^#\/?/, "");
406          const note = window.document.getElementById(id);
407          if (note !== null) {
408            try {
409              const html = processXRef(id, note.cloneNode(true));
410              instance.setContent(html);
411            } finally {
412              instance.enable();
413              instance.show();
414            }
415          } else {
416            // See if we can fetch this
417            fetch(url.split('#')[0])
418            .then(res => res.text())
419            .then(html => {
420              const parser = new DOMParser();
421              const htmlDoc = parser.parseFromString(html, "text/html");
422              const note = htmlDoc.getElementById(id);
423              if (note !== null) {
424                const html = processXRef(id, note);
425                instance.setContent(html);
426              } 
427            }).finally(() => {
428              instance.enable();
429              instance.show();
430            });
431          }
432        } else {
433          // See if we can fetch a full url (with no hash to target)
434          // This is a special case and we should probably do some content thinning / targeting
435          fetch(url)
436          .then(res => res.text())
437          .then(html => {
438            const parser = new DOMParser();
439            const htmlDoc = parser.parseFromString(html, "text/html");
440            const note = htmlDoc.querySelector('main.content');
441            if (note !== null) {
442              // This should only happen for chapter cross references
443              // (since there is no id in the URL)
444              // remove the first header
445              if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
446                note.children[0].remove();
447              }
448              const html = processXRef(null, note);
449              instance.setContent(html);
450            } 
451          }).finally(() => {
452            instance.enable();
453            instance.show();
454          });
455        }
456      }, function(instance) {
457      });
458    }
459        let selectedAnnoteEl;
460        const selectorForAnnotation = ( cell, annotation) => {
461          let cellAttr = 'data-code-cell="' + cell + '"';
462          let lineAttr = 'data-code-annotation="' +  annotation + '"';
463          const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
464          return selector;
465        }
466        const selectCodeLines = (annoteEl) => {
467          const doc = window.document;
468          const targetCell = annoteEl.getAttribute("data-target-cell");
469          const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
470          const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
471          const lines = annoteSpan.getAttribute("data-code-lines").split(",");
472          const lineIds = lines.map((line) => {
473            return targetCell + "-" + line;
474          })
475          let top = null;
476          let height = null;
477          let parent = null;
478          if (lineIds.length > 0) {
479              //compute the position of the single el (top and bottom and make a div)
480              const el = window.document.getElementById(lineIds[0]);
481              top = el.offsetTop;
482              height = el.offsetHeight;
483              parent = el.parentElement.parentElement;
484            if (lineIds.length > 1) {
485              const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
486              const bottom = lastEl.offsetTop + lastEl.offsetHeight;
487              height = bottom - top;
488            }
489            if (top !== null && height !== null && parent !== null) {
490              // cook up a div (if necessary) and position it 
491              let div = window.document.getElementById("code-annotation-line-highlight");
492              if (div === null) {
493                div = window.document.createElement("div");
494                div.setAttribute("id", "code-annotation-line-highlight");
495                div.style.position = 'absolute';
496                parent.appendChild(div);
497              }
498              div.style.top = top - 2 + "px";
499              div.style.height = height + 4 + "px";
500              div.style.left = 0;
501              let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
502              if (gutterDiv === null) {
503                gutterDiv = window.document.createElement("div");
504                gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
505                gutterDiv.style.position = 'absolute';
506                const codeCell = window.document.getElementById(targetCell);
507                const gutter = codeCell.querySelector('.code-annotation-gutter');
508                gutter.appendChild(gutterDiv);
509              }
510              gutterDiv.style.top = top - 2 + "px";
511              gutterDiv.style.height = height + 4 + "px";
512            }
513            selectedAnnoteEl = annoteEl;
514          }
515        };
516        const unselectCodeLines = () => {
517          const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
518          elementsIds.forEach((elId) => {
519            const div = window.document.getElementById(elId);
520            if (div) {
521              div.remove();
522            }
523          });
524          selectedAnnoteEl = undefined;
525        };
526          // Handle positioning of the toggle
527      window.addEventListener(
528        "resize",
529        throttle(() => {
530          elRect = undefined;
531          if (selectedAnnoteEl) {
532            selectCodeLines(selectedAnnoteEl);
533          }
534        }, 10)
535      );
536      function throttle(fn, ms) {
537      let throttle = false;
538      let timer;
539        return (...args) => {
540          if(!throttle) { // first call gets through
541              fn.apply(this, args);
542              throttle = true;
543          } else { // all the others get throttled
544              if(timer) clearTimeout(timer); // cancel #2
545              timer = setTimeout(() => {
546                fn.apply(this, args);
547                timer = throttle = false;
548              }, ms);
549          }
550        };
551      }
552        // Attach click handler to the DT
553        const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
554        for (const annoteDlNode of annoteDls) {
555          annoteDlNode.addEventListener('click', (event) => {
556            const clickedEl = event.target;
557            if (clickedEl !== selectedAnnoteEl) {
558              unselectCodeLines();
559              const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
560              if (activeEl) {
561                activeEl.classList.remove('code-annotation-active');
562              }
563              selectCodeLines(clickedEl);
564              clickedEl.classList.add('code-annotation-active');
565            } else {
566              // Unselect the line
567              unselectCodeLines();
568              clickedEl.classList.remove('code-annotation-active');
569            }
570          });
571        }
572    const findCites = (el) => {
573      const parentEl = el.parentElement;
574      if (parentEl) {
575        const cites = parentEl.dataset.cites;
576        if (cites) {
577          return {
578            el,
579            cites: cites.split(' ')
580          };
581        } else {
582          return findCites(el.parentElement)
583        }
584      } else {
585        return undefined;
586      }
587    };
588    var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
589    for (var i=0; i<bibliorefs.length; i++) {
590      const ref = bibliorefs[i];
591      const citeInfo = findCites(ref);
592      if (citeInfo) {
593        tippyHover(citeInfo.el, function() {
594          var popup = window.document.createElement('div');
595          citeInfo.cites.forEach(function(cite) {
596            var citeDiv = window.document.createElement('div');
597            citeDiv.classList.add('hanging-indent');
598            citeDiv.classList.add('csl-entry');
599            var biblioDiv = window.document.getElementById('ref-' + cite);
600            if (biblioDiv) {
601              citeDiv.innerHTML = biblioDiv.innerHTML;
602            }
603            popup.appendChild(citeDiv);
604          });
605          return popup.innerHTML;
606        });
607      }
608    }
609  });
610  </script>
610
611</div> <!-- /content -->
612<footer class="footer">
613  <div class="nav-footer">
614    <div class="nav-footer-left">
615      &nbsp;
616    </div>   
617    <div class="nav-footer-center">
618      <ul class="footer-items list-unstyled">
619    <li class="nav-item">
620 Contact: <a href="mailto:[email protected]">[email protected]</a><br>
621<a href="https://www.linkedin.com/company/fews-lab" target="_blank"><i class="bi bi-linkedin"></i> FEWsLab</a> &nbsp;
622<a href="https://www.linkedin.com/in/caitlinagrady/" target="_blank"><i class="bi bi-linkedin"></i> Caitlin Grady</a> &nbsp;
623<a href="https://bsky.app/profile/caitlinagrady.bsky.social" target="_blank"><i class="fa fa-brands fa-bluesky"></i> Bluesky</a><br>
624Site made with <a href="https://quarto.org/" target="_blank"><img src="https://quarto.org/favicon.png" width="12"> Quarto</a><br>
625© 2025 FEWsLab
626  </li>  
627</ul>
628    </div>
629    <div class="nav-footer-right">
630      &nbsp;
631    </div>
632  </div>
633</footer>
634
635
636
637
638<script src="site_libs/quarto-html/zenscroll-min.js"></script>
638
639</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.