1 2 3 <!DOCTYPE html> 4 <html lang="en-US"> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> 7 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 8 9 <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"> 10 11 <meta name="theme-color" content="#2f6fa7"> 12 <meta name="pinterest" content="nopin" /> 13 <meta name="pinterest" content="nohover" /> 14 15 <meta name="3778517eb4810dfb5d143ed8f1b359b3b5a82923" content="0f56257c3db4a222e91b11bc6871c4df2e263b28" /> 16 <link rel="apple-touch-icon" sizes="57x57" href="/orgimg/org.19/favicons/apple-icon-57x57.png?v=1680450446766446918"> 17 <link rel="apple-touch-icon" sizes="60x60" href="/orgimg/org.19/favicons/apple-icon-60x60.png?v=1680450446766446918"> 18 <link rel="apple-touch-icon" sizes="72x72" href="/orgimg/org.19/favicons/apple-icon-72x72.png?v=1680450446766446918"> 19 <link rel="apple-touch-icon" sizes="76x76" href="/orgimg/org.19/favicons/apple-icon-76x76.png?v=1680450446766446918"> 20 <link rel="apple-touch-icon" sizes="114x114" href="/orgimg/org.19/favicons/apple-icon-114x114.png?v=1680450446766446918"> 21 <link rel="apple-touch-icon" sizes="120x120" href="/orgimg/org.19/favicons/apple-icon-120x120.png?v=1680450446766446918"> 22 <link rel="apple-touch-icon" sizes="144x144" href="/orgimg/org.19/favicons/apple-icon-144x144.png?v=1680450446766446918"> 23 <link rel="apple-touch-icon" sizes="152x152" href="/orgimg/org.19/favicons/apple-icon-152x152.png?v=1680450446766446918"> 24 <link rel="apple-touch-icon" sizes="180x180" href="/orgimg/org.19/favicons/apple-icon-180x180.png?v=1680450446766446918"> 25 <link rel="icon" type="image/png" sizes="192x192" href="/orgimg/org.19/favicons/android-icon-192x192.png?v=1680450446766446918"> 26 <link rel="icon" type="image/png" sizes="32x32" href="/orgimg/org.19/favicons/favicon-32x32.png?v=1680450446766446918"> 27 <link rel="icon" type="image/png" sizes="96x96" href="/orgimg/org.19/favicons/favicon-96x96.png?v=1680450446766446918"> 28 <link rel="icon" type="image/png" sizes="16x16" href="/orgimg/org.19/favicons/favicon-16x16.png?v=1680450446766446918"> 29 <link rel="manifest" href="/orgimg/org.19/favicons/manifest.json?v=1680450446766446918"> 30 <meta name="msapplication-TileColor" content="#ffffff"> 31 <meta name="msapplication-TileImage" content="/ms-icon-144x144.png"> 32 33 34 35
36<script> 37/* stubs */ 38 const hapticsImpactHeavy = async () => { 39 }; 40 const hapticsImpactMedium = async () => { 41 }; 42 const hapticsImpactLight = async () => { 43 }; 44 const hapticsVibrate = async () => { 45 }; 46 const hapticsSelectionStart = async () => { 47 }; 48 const hapticsSelectionChanged = async () => { 49 }; 50 const hapticsSelectionEnd = async () => { 51 }; 52</script>
52 53 54
55<script> 56 57 function setPullToRefresh() {} 58 59 function gotoURL(inurl) { 60 window.location.href = inurl; 61 return; 62 } 63 function contentLoaded(isHTMX, f, caller = "") { 64 console.log("contentLoaded: " + isHTMX + " " + caller); 65 if (isHTMX == true) { 66 document.body.addEventListener('htmx:afterSettle', f, {once: true}); 67 } else { 68 if (document.readyState !== 'loading') { 69 console.log('document is already ready, just execute code here'); 70 f(); 71 } else { 72 console.log('document was not ready, place code here'); 73 document.addEventListener('DOMContentLoaded', f, {once: true}); 74 } 75 } 76 } 77 78 function HideAppSidebarOnKeyboard() { 79 console.log("In HideAppSidebarOnKeyboard"); 80 81 } 82 // stub 83 function logError(data, url, linenumber) { 84 console.log(data) 85 return; 86 } 87 var pushSubToken; 88 var ignoreErrors = false; 89 var lastError = ""; 90 91 // Auto-hide the fixed app top navbar on reading-heavy pages. The 92 // navbar tracks scroll delta 1:1 in both directions: scrolling down 93 // slides it off at the same pixel rate as the page; scrolling up â 94 // even one pixel â starts bringing it back at the same rate. When 95 // the user is at the very top, it's always fully visible. Opt-in 96 // per page; xs only. Bottom tab bar is untouched. 97 function EnableTopbarAutoHide() { 98 if (document.documentElement.clientWidth > 767) return; 99 var body = document.body; 100 body.classList.add('auto-hide-topbar'); 101 // Measure the actual headerbar height so notched devices (iOS) 102 // hide the full bar including the safe-area-inset-top padding, 103 // not just the 50px content row. Fall back to 50 if the 104 // element isn't found for any reason. 105 var headerEl = document.getElementById('headerbar'); 106 var navHeight = headerEl ? headerEl.offsetHeight : 50; 107 var offset = 0; 108 var lastY = window.scrollY; 109 function onScroll() { 110 var y = window.scrollY; 111 var dy = y - lastY; 112 lastY = y; 113 if (y <= 0) { 114 offset = 0; 115 } else { 116 offset -= dy; 117 if (offset > 0) offset = 0; 118 if (offset < -navHeight) offset = -navHeight; 119 } 120 body.style.setProperty('--topbar-offset', offset + 'px'); 121 } 122 window.addEventListener('scroll', onScroll, { passive: true }); 123 gioDestroy(function() { 124 window.removeEventListener('scroll', onScroll); 125 body.classList.remove('auto-hide-topbar'); 126 body.style.removeProperty('--topbar-offset'); 127 }); 128 } 129 130 var gioBundleReported = false; 131 function gioReport(fields) { 132 try { 133 var pairs = []; 134 for (var k in fields) { 135 if (fields[k] !== undefined && fields[k] !== null) { 136 pairs.push(encodeURIComponent(k) + '=' + encodeURIComponent(fields[k])); 137 } 138 } 139 var xhr = new XMLHttpRequest(); 140 xhr.open('POST', '/jsclienterror', true); 141 xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 142 xhr.send(pairs.join('&')); 143 } catch (e) {} 144 } 145 // The report cannot depend on the application bundle: when the bundle 146 // is what failed to load, a jQuery transport has nothing to stand on. 147 // The script tag's onerror stores the src if it fires before this 148 // script runs. 149 window.__gioBundleFailed = function(src) { 150 if (gioBundleReported) return; 151 gioBundleReported = true; 152 gioReport({ 153 msg: "bundle-load-failure", 154 url: src, 155 client_id: "web.app01-g2.5877799.1791066753887697256" 156 }); 157 }; 158 if (window.__gioBundleErr) { 159 window.__gioBundleFailed(window.__gioBundleErr); 160 } 161 window.onerror = function(errorMessage, errorUrl, errorLine, errorColumn, errorObj) { 162 let column; 163 let stack; 164 if (console && console.log) { 165 console.log("msg:", errorMessage); 166 console.log("url:", errorUrl); 167 console.log("line:", errorLine); 168 if (errorColumn !== undefined && errorObj != null) { 169 console.log("column:", errorColumn); 170 column = errorColumn; 171 } 172 if (errorObj !== undefined && errorObj != null) { 173 console.log("stack:", errorObj.stack); 174 stack = errorObj.stack; 175 } 176 console.log("client_id:", "web.app01-g2.5877799.1791066753887697256"); 177 console.log("last_error:", lastError); 178 console.log("stack:", stack); 179 } 180 if (errorUrl == "" || errorUrl === null) { 181 errorUrl = window.location.href; 182 } 183 if (errorMessage.includes("SecurityError:") == true) { 184 ignoreErrors = true; 185 } 186 if (ignoreErrors == true) { 187 console.log("cookies, disabled, ignoring"); 188 lastError = errorMessage; 189 return; 190 } 191 // With the bundle absent, every reference to a bundle global and 192 // every style-injection into the missing sheet throws; the 193 // bundle-load-failure report already carries the cause, so the 194 // cascade is noise. 195 if ((typeof jQuery === 'undefined' || typeof htmx === 'undefined') && 196 (errorMessage.indexOf("is not defined") !== -1 || errorMessage.indexOf("Can't find variable") !== -1 || errorMessage.indexOf("insertRule") !== -1)) { 197 lastError = errorMessage; 198 return; 199 } 200 var ignoreMessages = ["ResizeObserver loop limit exceeded", 201 "TypeError: can't redefine non-configurable property \"userAgent\"", 202 "TypeError: can't redefine non-configurable property \"getChannelData\"", 203 "ReferenceError: tinymce is not defined", 204 "Uncaught ReferenceError: timeoutId is not defined", 205 "ReferenceError: Can't find variable: tinymce"]; 206 for (var i = 0; i < ignoreMessages.length; i++) { 207 if (errorMessage === ignoreMessages[i]) { 208 lastError = errorMessage; 209 return; 210 } 211 } 212 if (errorUrl.indexOf("safari-extension:") === 0 || errorUrl.indexOf("moz-extension:") === 0 || errorUrl.indexOf("chrome-extension:") === 0) { 213 lastError = errorMessage; 214 return; 215 } 216 if (errorUrl.indexOf("googletagmanager.com") !== -1 || errorUrl.indexOf("socialsearch.com") !== -1) { 217 lastError = errorMessage; 218 return; 219 } 220 if (errorLine === 0 || errorLine === 1) { 221 lastError = errorMessage; 222 return; 223 } 224 gioReport({ 225 msg: errorMessage, 226 url: errorUrl, 227 line: errorLine, 228 column: column, 229 stack: stack, 230 last_error: lastError, 231 client_id: "web.app01-g2.5877799.1791066753887697256" 232 }); 233 lastError = errorMessage; 234 return true; 235 } 236 237</script>
237 238 239 240
240<script src="/tinymce-5.10.9/tinymce.min.js"></script>
240 241
241<script src="/js/browser-image-compression-2.0.2.min.js"></script>
241 242 <link href="/css/application-07b87eb5d00416f24d1d9fb6b4e4ed02.css" rel="stylesheet" id="groupsio-css"> 243
243<script src="/js/application-c16d4980043b6020f21de2d46d113a60.js" id="groupsio-js" onerror="(window.__gioBundleFailed||function(s){window.__gioBundleErr=s})(this.src)"></script>
243 244
244<script src="/js/run_prettify.js"></script>
244 245 <title>[email protected] | Home</title> 246 247 248 249 250 251 252 253<link rel="stylesheet" type="text/css" href="/css/cookieconsent-3.1.0.min.css" />
254<script src="/js/cookieconsent-3.1.0.min.js"></script>
vendor: 1 bytes, line 254
254
255<script> 256 window.addEventListener("load", function(){ 257 window.cookieconsent.initialise({ 258 "palette": { 259 "popup": { 260 "background": "#d9edf7", 261 "text": "#31708f" 262 }, 263 "button": { 264 "background": "#56cbdb", 265 "text": "#ffffff" 266 } 267 }, 268 "cookie": { 269 "domain": ".{{.Org.Domain}}" 270 }, 271 "content": { 272 "message": "Our site uses cookies so that we can remember you and understand how you and other visitors use our site, to improve your browsing experience and help us improve our site. By continuing to use our website, you agree to our use of such cookies.", 273 "dismiss": "I Agree", 274 "href": "https://groups.io/static/cookie_policy" 275 } 276 })}); 277</script>
277 278 279 280 281 282 <link rel="alternate" type="application/rss+xml" 283title="RSS Feed for acrn-users" 284 href="https://lists.projectacrn.org/g/acrn-users/rss" /> 285 <meta property="og:url" content="https://lists.projectacrn.org/g/acrn-users" /> 286 <meta property="og:type" content="website" /> 287 <meta property="og:title" content="acrn-users lists.projectacrn.org Group" /> 288 <meta property="og:description" content="Mailing list to discuss ACRN hypervisor environment setup, configuration, tool usage, debug information, bug reporting and feedback, etc." /> 289 <meta property="og:image" content="https://groups.io/orgimg/org.19/logofull.png?v=1680450446766446918" /> 290
291<script> 292 htmx.config.scrollBehavior = "instant"; 293 htmx.config.historyCacheSize = 0; 294 htmx.config.defaultSettleDelay = 0; 295 console.log("FULL PAGE LOAD"); 296 297 // Short fade-in on #maincontent-refresh after every HTMX swap â adds zero latency 298 // because it runs AFTER the new content has arrived. We listen to afterRequest 299 // (fires once per HTMX request) rather than afterSwap (fires once per swapped 300 // element, including every hx-swap-oob badge â which would cancel the animation). 301 // Listen on document because this script runs in <head> before <body> exists. 302 document.addEventListener('htmx:afterRequest', function(evt) { 303 if (!evt.detail || !evt.detail.successful) return; 304 var refresh = document.getElementById('maincontent-refresh'); 305 if (!refresh) return; 306 refresh.classList.remove('gio-fade-in'); 307 // force reflow so removing then adding re-starts the animation each time 308 void refresh.offsetWidth; 309 refresh.classList.add('gio-fade-in'); 310 }); 311 312 // Top-of-viewport progress bar shown while an HTMX request is in flight. 313 // Provides immediate visual feedback for taps even before content arrives. 314 document.addEventListener('htmx:beforeRequest', function() { 315 var bar = document.getElementById('gio-progress-bar'); 316 if (bar) bar.classList.add('active'); 317 }); 318 document.addEventListener('htmx:afterRequest', function() { 319 var bar = document.getElementById('gio-progress-bar'); 320 if (bar) bar.classList.remove('active'); 321 }); 322 323 // Bootstrap appends an open tooltip to <body>, outside the content HTMX 324 // replaces, so clicking a boosted link while its tooltip shows would leave 325 // the tooltip stranded on the new page. Dispose of the open tooltips 326 // whose triggers are about to be swapped out. 327 document.addEventListener('htmx:beforeSwap', function(evt) { 328 var target = evt.detail && evt.detail.target; 329 if (!target || typeof bootstrap === 'undefined') return; 330 target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { 331 var tip = bootstrap.Tooltip.getInstance(el); 332 if (tip) tip.dispose(); 333 }); 334 }); 335 336 // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back 337 // chevron, and the navbar overflow action slot. Uses the shared helpers 338 // from qtutils/appfunctions.qtpl â they no-op on non-Capacitor runtimes, 339 // so this is safe on the plain web too. 340 document.addEventListener('click', function(ev) { 341 if (typeof hapticsSelectionChanged !== 'function') return; 342 var target = ev.target; 343 if (!target || !target.closest) return; 344 if (target.closest('.mobilesidebar-item') || 345 target.closest('#logo a') || 346 target.closest('#header-action-slot a')) { 347 hapticsSelectionChanged(); 348 } 349 }, true); 350</script>
350 351 </head> 352 <body id="body" class="" hx-headers='{"Accept-Version": "9136901318d0dc36d9b8d1a76bd6f080d4b68e79"}' hx-ext="preload" hx-boost="false"> 353 <div id="gio-progress-bar" aria-hidden="true"></div> 354 355
355<script> 356 if (window.matchMedia) { 357 var darkModeQuery = window.matchMedia('(prefers-color-scheme: dark)'); 358 if (darkModeQuery.matches) { 359 document.body.classList.add('dark-mode'); 360 } 361 var darkModeChanged = function(e) { 362 document.body.classList.toggle('dark-mode', e.matches); 363 }; 364 if (darkModeQuery.addEventListener) { 365 darkModeQuery.addEventListener('change', darkModeChanged); 366 } else if (darkModeQuery.addListener) { 367 // Safari before 14 has no addEventListener on MediaQueryList 368 darkModeQuery.addListener(darkModeChanged); 369 } 370 } 371 </script>
371 372 373 374 375 <div class="navbar navbar-head navbar-fixed-top navbar-expand-md fixed-top" role="navigation" id="headerbar"> 376 <div class="container-fluid" style="padding-left:0px;"> 377 <a href="https://lists.projectacrn.org" hx-boost="false" hx-disinherit="*"> 378 <img src="https://lists.projectacrn.org/orgimg/org.19/mainlogo.png?v=1680450446766446918" height="50" alt="Groups.io"> 379 </a> 380 381 <ul class="nav navbar-nav float-end d-md-none" style="margin-top:5px;margin-bottom:5px;"> 382 <li> 383 <a href="#" data-bs-toggle="modal" data-bs-target="#mobileAccount" class="nav-link"> 384 <i class="fa-fw fa fa-bars fa-lg"></i> 385 </a> 386 </li> 387 </ul> 388 389 <ul class="nav navbar-nav float-end d-none d-md-flex"> 390 <li class="dropdown"> 391 <a href="#" class="dropdown-toggle nav-link" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> 392 <i class="fa-fw fa-regular fa-globe"></i> 393 394 English 395 396 <b class="caret"></b> 397 </a> 398 <ul class="dropdown-menu dropdown-menu-end"> 399 <li> 400 <a class="dropdown-item" href="https://lists.projectacrn.org/setlang/ar"> 401 Ø§ÙØ¹Ø±Ø¨ÙØ© 402 </a> 403 </li> 404 <li> 405 <a class="dropdown-item" href="https://lists.projectacrn.org/setlang/de"> 406 Deutsch 407 </a> 408 </li> 409 <li> 410 <a class="dropdown-item" href="https://lists.projectacrn.org/unsetlang"> 411 English 412 </a> 413 </li> 414 <li> 415 <a class="dropdown-item" href="https://lists.projectacrn.org/setlang/es"> 416 Español 417 </a> 418 </li> 419 <li> 420 <a class="dropdown-item" href="https://lists.projectacrn.org/setlang/fr"> 421 Français 422 </a> 423 </li> 424 <li> 425 <a class="dropdown-item" href="https://lists.projectacrn.org/setlang/it"> 426 Italiano 427 </a> 428 </li> 429 <li> 430 <a class="dropdown-item" href="https://lists.projectacrn.org/setlang/nl"> 431 Nederlands 432 </a> 433 </li> 434 <li> 435 <a class="dropdown-item" href="https://lists.projectacrn.org/setlang/pt-br"> 436 Português do Brasil 437 </a> 438 </li> 439 <li> 440 <a class="dropdown-item" href="https://lists.projectacrn.org/setlang/pt"> 441 Português 442 </a> 443 </li> 444 <li> 445 <a class="dropdown-item" href="https://lists.projectacrn.org/setlang/uk"> 446 УкÑаÑнÑÑка 447 </a> 448 </li> 449 <li> 450 <a class="dropdown-item" href="https://lists.projectacrn.org/setlang/zh-hans"> 451 ç®ä½ä¸æ 452 </a> 453 </li> 454 </ul> 455 </li> 456 <li> 457 <a href="https://lists.projectacrn.org/helpcenter" target="_blank" class="nav-link"> 458 Help 459 </a> 460 </li> 461 <li> 462 <a id="login" href="https://lists.projectacrn.org/login" hx-boost="false" hx-disinherit="*" class="nav-link"> 463 <i class="fa fa-sign-in-alt"></i> 464 Log In 465 </a> 466 </li> 467 468 </ul> 469 </div> 470 </div> 471 <div class="modal fade" id="mobileAccount" role="dialog"> 472 <div class="modal-dialog" style="margin-top:50px;"> 473 <div class="modal-content"> 474 <div class="modal-body"> 475 476 <ul class="list-group noborderlist"> 477 478 <li class="noborderitem list-group-item"> 479 <a href="https://lists.projectacrn.org/login" hx-boost="false" hx-disinherit="*"> 480 <i class="fa fa-sign-in-alt"></i> 481 Log In 482 </a> 483 </li> 484 485 <li class="noborderitem list-group-item"> 486 <a href="https://lists.projectacrn.org/helpcenter" target="_blank"> 487 <i class="fa-fw fa fa-question-circle"></i> 488 Help 489 </a> 490 </li> 491 492 <li class="dropdown noborderitem list-group-item"> 493 <a href="#" class="dropdown-toggle nav-link" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> 494 <i class="fa-fw fa-regular fa-globe"></i> 495 496 English 497 498 <b class="caret"></b> 499 </a> 500 <ul class="dropdown-menu"> 501 <li> 502 <a class="dropdown-item" href="https://lists.projectacrn.org/setlang/ar"> 503 Ø§ÙØ¹Ø±Ø¨ÙØ© 504 </a> 505 </li> 506 <li> 507 <a class="dropdown-item" href="https://lists.projectacrn.org/setlang/de"> 508 Deutsch 509 </a> 510 </li> 511 <li> 512 <a class="dropdown-item" href="https://lists.projectacrn.org/unsetlang"> 513 English 514 </a> 515 </li> 516 <li> 517 <a class="dropdown-item" href="https://lists.projectacrn.org/setlang/es"> 518 Español 519 </a> 520 </li> 521 <li> 522 <a class="dropdown-item" href="https://lists.projectacrn.org/setlang/fr"> 523 Français 524 </a> 525 </li> 526 <li> 527 <a class="dropdown-item" href="https://lists.projectacrn.org/setlang/it">
528 Italiano 529 </a> 530 </li> 531 <li> 532 <a class="dropdown-item" href="https://lists.projectacrn.org/setlang/nl"> 533 Nederlands 534 </a> 535 </li> 536 <li> 537 <a class="dropdown-item" href="https://lists.projectacrn.org/setlang/pt-br"> 538 Português do Brasil 539 </a> 540 </li> 541 <li> 542 <a class="dropdown-item" href="https://lists.projectacrn.org/setlang/pt"> 543 Português 544 </a> 545 </li> 546 <li> 547 <a class="dropdown-item" href="https://lists.projectacrn.org/setlang/uk"> 548 УкÑаÑнÑÑка 549 </a> 550 </li> 551 <li> 552 <a class="dropdown-item" href="https://lists.projectacrn.org/setlang/zh-hans"> 553 ç®ä½ä¸æ 554 </a> 555 </li> 556 </ul> 557 </li> 558 559 </ul> 560 </div> 561 </div> 562 </div> 563 </div> 564
565<script> 566var groupnavigatorData = [ 567 568]; 569</script>
569 570 571 572<!-- Modal Dialog for Autocomplete --> 573<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> 574 <div class="modal-dialog" role="document"> 575 <div class="modal-content"> 576 <div class="modal-body"> 577 <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> 578 <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> 579 <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate <i class="fa-sharp fa-arrow-turn-down-left"></i> to use <strong>esc</strong> to dismiss</div> 580 </div> 581 </div> 582 </div> 583</div> 584 585
586<script> 587// Keep track of the currently selected index 588var selectedIndex = -1; 589 590// Function to highlight the matched substring 591function highlightSubstring(str, substring) { 592 var index = str.toLowerCase().indexOf(substring.toLowerCase()); 593 if (index !== -1) { 594 var before = str.substring(0, index); 595 var middle = str.substring(index, index + substring.length); 596 var after = str.substring(index + substring.length); 597 return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; 598 } 599 return str; 600} 601 602// Function to highlight the selected item and ensure it is visible in the scrollable list 603function highlightSelectedItem(modalName) { 604 var listContainer = document.getElementById(modalName + 'Container'); 605 var items = document.getElementsByClassName(modalName + '-list-item'); 606 Array.from(items).forEach(function(item, idx) { 607 item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item 608 }); 609 if (items.length > 0 && selectedIndex >= 0) { 610 var selectedItem = items[selectedIndex]; 611 var containerTop = listContainer.scrollTop; 612 var containerBottom = containerTop + listContainer.clientHeight; 613 var itemTop = selectedItem.offsetTop; 614 var itemBottom = itemTop + selectedItem.offsetHeight; 615 const fudge = 59; 616 if (selectedIndex > 0 && itemTop > containerBottom) { 617 // If there are items below the selected item and the selected item is not fully visible, scroll down 618 listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; 619 } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { 620 // If there are items above the selected item and the selected item is not fully visible, scroll up 621 listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; 622 } 623 } 624} 625 626// function to populate the list based on the input 627function populateList(modalName, data) { 628 var input = document.getElementById(modalName+'Input').value; 629 var listContainer = document.getElementById(modalName+'Container'); 630 listContainer.innerHTML = ''; 631 data.forEach(function(item) { 632 if (item.name.toLowerCase().includes(input.toLowerCase())) { 633 var div = document.createElement('div'); 634 div.innerHTML = highlightSubstring(item.name, input); 635 div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class 636 div.addEventListener('click', function() { 637 // Navigate to the specified URL when a list item is clicked 638 window.location.href = item.url; 639 }); 640 div.addEventListener('mousemove', function() { 641 // Remove no-hover class from all items when the mouse is moved over any item 642 console.log("mouse move"); 643 var items = document.getElementsByClassName(modalName+'-list-item'); 644 Array.from(items).forEach(function(item) { 645 item.classList.remove('no-hover'); 646 }); 647 }); 648 listContainer.appendChild(div); 649 } 650 }); 651 highlightSelectedItem(modalName); 652} 653 654function InitAutocomplete(modalName, data) { 655 // Focus the input field when the modal is shown and populate the list 656 $('#' + modalName + 'Modal').on('shown.bs.modal', function () { 657 $('#' + modalName + 'Input').focus().val(''); 658 populateList(modalName, data); 659 selectedIndex = 0; 660 highlightSelectedItem(modalName); 661 }); 662 663 // Event listener for input field typing 664 document.getElementById(modalName + 'Input').addEventListener('input', function() { 665 populateList(modalName, data); 666 selectedIndex = 0; 667 }); 668 669 // Event listener for arrow keys and enter key 670 document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { 671 var items = document.getElementsByClassName(modalName + '-list-item'); 672 if (event.key === 'ArrowDown') { 673 event.preventDefault(); 674 if (selectedIndex < items.length - 1) selectedIndex++; 675 highlightSelectedItem(modalName); 676 } else if (event.key === 'ArrowUp') { 677 event.preventDefault(); 678 if (selectedIndex > 0) selectedIndex--; 679 highlightSelectedItem(modalName); 680 } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { 681 event.preventDefault(); 682 items[selectedIndex].click(); 683 } 684 }); 685} 686 687function showAutocompleteModal(modalName) { 688 $('#' + modalName + 'Modal').modal('show'); 689 selectedIndex = -1; 690} 691</script>
691 692 693 <div id="content" class="container-fluid">
694<script> 695 InitAutocomplete("groupnavigator", groupnavigatorData); 696 697 document.body.addEventListener("showReloadPageDialog", function(evt) { 698 console.log("Forced reload"); 699 location.reload(); 700 }); 701 702 // ShowHeaderAction adds an icon button (e.g. settings cog) to the mobile navbar, 703 // to the left of the profile icon. modalTarget is optional â if given, clicking 704 // opens that Bootstrap modal. ariaLabel is for accessibility. 705 function ShowHeaderAction(iconClass, modalTarget, ariaLabel) { 706 var slot = document.getElementById("header-action-slot"); 707 if (!slot) { 708 return; 709 } 710 slot.innerHTML = ''; 711 var a = document.createElement('a'); 712 a.href = '#'; 713 a.className = 'navbar-action-xs'; 714 if (ariaLabel) { 715 a.setAttribute('aria-label', ariaLabel); 716 } 717 if (modalTarget) { 718 a.setAttribute('data-bs-toggle', 'modal'); 719 a.setAttribute('data-bs-target', modalTarget); 720 } 721 var icon = document.createElement('i'); 722 icon.className = iconClass; 723 a.appendChild(icon); 724 slot.appendChild(a); 725 slot.style.display = ''; 726 } 727 728 function HideHeaderAction() { 729 var slot = document.getElementById("header-action-slot"); 730 if (slot) { 731 slot.innerHTML = ''; 732 slot.style.display = 'none'; 733 slot.style.float = 'left'; 734 } 735 } 736 737 function goBack() { 738 history.back(); 739 } 740 741 // --- Native date/time picker helpers ----------------------------------- 742 // On touch devices we swap flatpickr-wrapped <input type="text"> fields 743 // for native <input type="date"> / type="time" so iOS / Android bring up 744 // their OS pickers (wheel, spinner, Material dialog). On pointer 745 // devices we leave the flatpickr popover in place, since Chrome's 746 // default date popover looks out of place. Both helpers are global so 747 // every page with a date/time input can call them the same way. 748 window.__isTouchPicker = function() { 749 return window.matchMedia && window.matchMedia('(any-pointer: coarse)').matches; 750 }; 751 // Fallback formats if data.User is nil on this page (logged out, etc). 752 window.__userDateFmt = "M/D/YYYY"; 753 window.__userTimeFmt = "h:mmA"; 754 // Hybrid native picker: the field is shown to the user as a plain 755 // type=text input holding the date/time formatted per the user's 756 // Groups.io preference (e.g., "19/04/2026" for an International 757 // user). When the user taps the field, we briefly swap the input's 758 // type to 'date' or 'time' so the OS brings up its native picker 759 // (iOS wheel, Android calendar/spinner). When the user finishes 760 // picking and blurs the field, we swap back to text and reformat 761 // the value in the user's chosen format. The server sees the 762 // user-format value on submit, same as with flatpickr. 763 // 764 // `kind` is 'date' or 'time'. `onHumanChange(humanStr, momentObj)` 765 // fires whenever the user picks a new value, with the value already 766 // in the user's format. 767 window.useNativePicker = function(id, kind, onHumanChange) { 768 var input = document.getElementById(id); 769 if (!input) return null; 770 var userFmt = kind === 'time' ? window.__userTimeFmt : window.__userDateFmt; 771 var isoFmt = kind === 'time' ? 'HH:mm' : 'YYYY-MM-DD'; 772 // Page loads with input type=text holding a user-format value â 773 // leave it as is until the user actually taps. 774 function toPicker() { 775 if (input.type !== kind) { 776 var m = moment(input.value, userFmt); 777 input.type = kind; 778 input.value = m.isValid() ? m.format(isoFmt) : ''; 779 } 780 } 781 function toDisplay() { 782 if (input.type === kind) { 783 var m = moment(input.value, isoFmt); 784 input.type = 'text'; 785 input.value = m.isValid() ? m.format(userFmt) : ''; 786 } 787 } 788 // pointerdown fires before focus/click so we can swap the type 789 // in time for the browser's default tap-handling to open the 790 // correct native picker. Fall back to 'focus' for keyboard users. 791 input.addEventListener('pointerdown', toPicker); 792 input.addEventListener('focus', toPicker); 793 input.addEventListener('change', function() { 794 if (input.type === kind) { 795 var m = moment(input.value, isoFmt); 796 if (m.isValid() && onHumanChange) { 797 onHumanChange(m.format(userFmt), m); 798 } 799 } 800 }); 801 input.addEventListener('blur', toDisplay); 802 // Make sure the server always sees the user-format value. 803 var form = input.closest('form'); 804 if (form) form.addEventListener('submit', toDisplay); 805 return input; 806 };
807 // Set a field's value as a user-format string, whether the field is a 808 // flatpickr-wrapped text input (desktop) or a native type=date/time 809 // input (touch). Used by onChange handlers that update sibling fields. 810 window.setFieldHuman = function(id, humanStr, kind) { 811 var input = document.getElementById(id); 812 if (!input) return; 813 if (input._flatpickr) { 814 input._flatpickr.setDate(humanStr); 815 } else if (input.type === 'date' || input.type === 'time') { 816 var userFmt = kind === 'time' ? window.__userTimeFmt : window.__userDateFmt; 817 var isoFmt = kind === 'time' ? 'HH:mm' : 'YYYY-MM-DD'; 818 var m = moment(humanStr, userFmt); 819 if (m.isValid()) input.value = m.format(isoFmt); 820 } else { 821 input.value = humanStr; 822 } 823 }; 824 825 // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. 826 function submitEvent(ele) { 827 console.log("in submitEvent"); 828 if (ele.startsWith('#')) { 829 ele = ele.slice(1); 830 } 831 document.getElementById(ele).submit(); 832 return; 833 /* 834 const theEvent = new CustomEvent('submit', { 835 bubbles: true, 836 cancelable: true 837 }); 838 if (typeof ele === 'string' || ele instanceof String) { 839 if (ele.startsWith("#") == true) { 840 ele = ele.slice(1); 841 } 842 if (document.getElementById(ele).dispatchEvent(theEvent) == true) { 843 // if not cancelled, do normal submit 844 console.log("calling submit"); 845 document.getElementById(ele).submit(); 846 } 847 return; 848 } 849 // assume ele is the element 850 if (ele.dispatchEvent(theEvent) == true) { 851 // if not cancelled, do normal submit 852 console.log("calling submit"); 853 ele.submit(); 854 } 855 */ 856 } 857 858 // gioDestroy is a convenience function for destroy callbacks 859 function gioDestroy(eventCB) { 860 let internalGioDestroy = function(evt) { 861 // do not activate on infinite scroll events 862 if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { 863 console.log("Ignoring infinite scroll event"); 864 return; 865 } 866 console.log("Calling destroy callback"); 867 eventCB(evt); 868 } 869 document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); 870 document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); 871 } 872 873 var drawerCloseFunc = function(evt) { 874 console.log("in drawerCloseFunc"); 875 // Find all elements with the class 'drawer' 876 var drawers = document.querySelectorAll('.drawer'); 877 878 // Iterate over each element and call closeDrawer() on each 879 drawers.forEach(function(obj) { 880 drawerObj.closeDrawer(obj); 881 }); 882 $('.modal').modal('hide'); 883 } 884 document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); 885 document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); 886 887 var keydownFunc = function(event) { 888 var tagName = event.target.tagName.toLowerCase(); 889 if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { 890 if (event.key === 'Escape') { 891 event.target.blur(); 892 } 893 return; 894 } 895 // check if the viewimages viewer is up 896 let element = document.getElementById('overlay'); 897 if (element && element.classList.contains('visible')) { 898 return; 899 } 900 console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); 901 if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { 902 event.preventDefault(); // Prevent the default action 903 // Show the modal dialog for keyboard shortcuts 904 $('#shortcutModal').modal('show'); 905 return; 906 } 907 // Pressing the chord above delivers a keydown for each key in it: 908 // Control, then Shift, then '?'. Without this guard the first two fall 909 // through to the hide below, so re-pressing the chord while the modal is 910 // open starts a hide that the '?' a moment later interrupts with a show. 911 // Bootstrap 3 tracks only its most recent backdrop element, so each such 912 // overlap strands the previous one in the DOM as an undismissable mask. 913 if (event.key === 'Control' || event.key === 'Shift' || event.key === 'Alt' || event.key === 'Meta') { 914 return; 915 } 916 $('#shortcutModal').modal('hide'); 917 918 if (event.key.toLowerCase() === 'g') { 919 // For Windows and Linux 920 if (event.ctrlKey) { 921 event.preventDefault(); 922 showAutocompleteModal("groupnavigator"); 923 return; 924 } 925 } 926 927 // Check if the pressed key is '/' 928 if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { 929 if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { 930 if (event.metaKey) { 931 event.preventDefault(); // Prevent the default action 932 // Focus on the search box 933 let box = document.getElementById('searchbox') 934 if (box != null) { 935 document.getElementById('searchbox').focus(); 936 } 937 } 938 } else { 939 // For Windows and Linux 940 if (event.ctrlKey) { 941 event.preventDefault(); // Prevent the default action 942 // Focus on the search box 943 let box = document.getElementById('searchbox') 944 if (box != null) { 945 document.getElementById('searchbox').focus(); 946 } 947 } 948 } 949 } 950 } 951 document.addEventListener('keydown', keydownFunc); 952 var removeDrawerCloseFunc = function(evt) { 953 document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); 954 document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); 955 document.removeEventListener('keydown', keydownFunc); 956 } 957 document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); 958 959 // Check for passkey enrollment prompt after cross-device authentication 960 $(function() { 961 if (sessionStorage.getItem('passkeyPromptAfterCDA') === 'true') { 962 console.log('Passkey CDA flag detected, showing enrollment modal'); 963 964 // Show the modal 965 $('#passkeyEnrollmentModal').modal('show'); 966 967 // Clear the flag when modal is dismissed 968 $('#passkeyEnrollmentModal').on('hidden.bs.modal', function() { 969 console.log('Modal dismissed, clearing flag'); 970 sessionStorage.removeItem('passkeyPromptAfterCDA'); 971 }); 972 973 // Set up enrollment button handler 974 var enrollBtn = document.getElementById('enrollLocalPasskeyBtn'); 975 if (enrollBtn) { 976 enrollBtn.addEventListener('click', function() { 977 console.log('Enrollment button clicked'); 978 // Redirect to settings page where they can add a passkey 979 sessionStorage.removeItem('passkeyPromptAfterCDA'); 980 window.location.href = 'https://lists.projectacrn.org/settings/security'; 981 }); 982 } 983 } 984 }); 985</script>
985 986<!-- Passkey Enrollment Modal --> 987<div class="modal fade webauthn-only" id="passkeyEnrollmentModal" tabindex="-1" role="dialog"> 988 <div class="modal-dialog" role="document"> 989 <div class="modal-content"> 990 <div class="modal-header"> 991 <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> 992 <h4 class="modal-title"> 993 <i class="fa fa-fingerprint"></i> 994 Add a Passkey to This Device 995 </h4> 996 </div> 997 <div class="modal-body"> 998 <p> 999 You logged in using a passkey from another device. For faster access next time, add a passkey to this device. 1000 </p> 1001 <p> 1002 <strong>Benefits:</strong> 1003 </p> 1004 <ul> 1005 <li>Faster login with just your fingerprint or face</li> 1006 <li>No need to use your phone each time</li> 1007 <li>Works even when offline</li> 1008 </ul> 1009 </div> 1010 <div class="modal-footer"> 1011 <button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> 1012 Maybe Later 1013 </button> 1014 <button type="button" class="btn btn-primary" id="enrollLocalPasskeyBtn"> 1015 <i class="fa fa-plus"></i> 1016 Add Passkey Now 1017 </button> 1018 </div> 1019 </div> 1020 </div> 1021</div> 1022<!-- Modal Dialog for Keyboard Shortcuts --> 1023<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> 1024 <div class="modal-dialog" role="document"> 1025 <div class="modal-content"> 1026 <div class="modal-header"> 1027 <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> 1028 </div> 1029 <div class="modal-body"> 1030 <div class="row"> 1031 <div class="col-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> :</div> 1032 <div class="col-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> 1033 </div> 1034 <div class="row"> 1035 <div class="col-3 text-right"><strong>ctrl</strong> + <strong>g</strong> :</div> 1036 <div class="col-9" style="margin-left: -23px;">Navigate to a group</div> 1037 </div> 1038 <div class="row"> 1039 <div class="col-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong> :</div> 1040 <div class="col-9" style="margin-left: -23px;">Find</div> 1041 </div> 1042 <div class="row"> 1043 <div class="col-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong> :</div> 1044 <div class="col-9" style="margin-left: -23px;">Quick actions</div> 1045 </div> 1046 </div> 1047 <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> 1048 </div> 1049 </div> 1050</div> 1051 1052 1053 <div id="mainrow" class="" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-history="false" hx-on::after-request="document.getElementById('maincontent').scrollTo({top: 0, behavior: 'instant'})" > 1054 <div id="groupsidebar" class="scrollbar hidden-print"> 1055 <div class="scrollbar-content"> 1056 <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> 1057 <div class="list-group noborderlist" style="border:0;margin-bottom:0px"> 1058 1059 <a title="Group Home" href="https://lists.projectacrn.org/g/acrn-users" class="list-group-item sidebar-item"> 1060 <i class="fa-fw fa fa-home fa-lg"></i> 1061 Home 1062 1063 </a> 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 <a title="Messages" href="https://lists.projectacrn.org/g/acrn-users/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> 1075 <i class="fa-fw fa fa-comments fa-lg"></i> 1076 Messages 1077 <span id="sidebar-archives-badge" class="badge"></span> 1078 </a> 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 <a title="Hashtags" href="https://lists.projectacrn.org/g/acrn-users/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> 1090 <i class="fa-fw fa fa-hashtag fa-lg"></i> 1091 Hashtags 1092 <span id="sidebar-hashtags-badge" class="badge"></span> 1093 </a> 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 <a title="All Subgroups" href="https://lists.projectacrn.org/g/acrn-users/subgroups" id="sidebar-subgroups" class="noborderitem list-group-item sidebar-item sidebar-item-subgroups"> 1109 <i class="fa-fw fa fa-chart-pie fa-lg"></i> 1110 All Subgroups 1111 <span id="sidebar-subgroups-badge" class="badge"></span> 1112 </a> 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 </div>
1129 </div> 1130 1131 <div class="text-center" style="font-size:13px;margin-bottom:30px"> 1132 <div style="padding-bottom:10px;"> 1133 <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts 1134 </div> 1135 <div style="padding-bottom:5px;"> 1136 <a href="/static/about"> 1137 About 1138 </a> 1139 1140 1141 · 1142 <a href="/static/features"> 1143 Features 1144 </a> · 1145 <a href="/static/pricing"> 1146 Pricing 1147 </a> 1148 1149 </div> 1150 <div style="padding-bottom:5px;"> 1151 <a href="/home"> 1152 Home 1153 </a> · 1154 <a rel="nofollow" href="/changelog"> 1155 Changelog 1156 </a> · 1157 <a href="/static/tos"> 1158 Terms 1159 </a> 1160 </div> 1161 <div style="padding-bottom:5px;"> 1162 <a href="/helpcenter" target="_blank"> 1163 Help 1164 </a> 1165 </div> 1166 <div style="padding-bottom:5px;"> 1167 © 2026 Groups.io 1168 </div> 1169 </div> 1170 1171 </div> 1172 </div> 1173 <div id="maincontent" class="groupmaincontent"> 1174 <div id="maincontent-refresh"> 1175 <div id="maincontent-column" class="col-xs-12 maincontent-column"> 1176
1177<script> 1178function toggleGrouphomeDesc() { 1179 var desc = document.getElementById("grouphomeDesc"); 1180 if (!desc) return; 1181 // Toggle between the clipped and expanded states. Keep "clipped" 1182 // on the element so the gradient fade returns when collapsed. 1183 if (desc.classList.contains("expanded")) { 1184 desc.classList.remove("expanded"); 1185 desc.classList.add("clipped"); 1186 } else { 1187 desc.classList.remove("clipped"); 1188 desc.classList.add("expanded"); 1189 } 1190} 1191contentLoaded(false, function() { 1192 // Has to run on every navigation in (including HTMX boost) so the 1193 // sidebar's active state and the navbar's header-action slot get 1194 // reset â otherwise icons set by the previous page (e.g. /messages 1195 // search) linger here and dispatch to the previous page's modals. 1196 UpdateSidebar("home"); 1197 // Flag this page so group-home-specific mobile CSS (slightly wider 1198 // body margin) can scope to it without affecting other pages. 1199 document.body.classList.add("grouphome-page"); 1200 gioDestroy(function() { 1201 document.body.classList.remove("grouphome-page"); 1202 }); 1203 function set_body_height() 1204 { 1205 var wh = $(window).height(); 1206 $('body').attr('style', 'height:' + wh + 'px;'); 1207 } 1208 set_body_height(); 1209 $(window).bind('resize', function() { set_body_height(); }); 1210 // Clip the description and expose the Show more/less toggle only 1211 // on phone widths and only when its natural height would exceed 1212 // the clamp. Desktop has plenty of vertical space, so the full 1213 // description shows untruncated there. 1214 if (document.documentElement.clientWidth <= 767) { 1215 var desc = document.getElementById("grouphomeDesc"); 1216 var toggle = document.getElementById("grouphomeDescToggle"); 1217 if (desc && toggle) { 1218 var maxH = 160; 1219 if (desc.scrollHeight > maxH + 1) { 1220 desc.classList.add("clipped"); 1221 toggle.hidden = false; 1222 } 1223 } 1224 } 1225}); 1226</script>
1226 1227 1228 1229 1230 1231 1232 1233 1234 <div id="alertdiv"></div> 1235 <div class="noticetemplate template"> 1236 <div class="alert alert-success alert-dismissible" role="alert"> 1237 <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button> 1238 <span class="flashmsg"></span> 1239 </div> 1240 </div> 1241 <div class="alerttemplate template"> 1242 <div class="alert alert-danger alert-dismissible" role="alert"> 1243 <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button> 1244 <span class="flashmsg"></span> 1245 </div> 1246 </div> 1247 <div class="alertnoclosetemplate template"> 1248 <div class="alert alert-danger" role="alert"> 1249 <span class="flashmsg"></span> 1250 </div> 1251 </div> 1252 1253 1254 1255
1256<script> 1257function dismiss() { 1258 console.log("dismiss"); 1259 $.get( "/dismissalert"); 1260} 1261 1262var $alerttemplate = $(".alerttemplate"); 1263var $alertnoclosetemplate = $(".alertnoclosetemplate"); 1264var $noticetemplate = $(".noticetemplate"); 1265function createAlert(msg, isError, autoClose, noClose) { 1266 if (isError == false) { 1267 $newPanel = $noticetemplate.clone(); 1268 } else { 1269 if (noClose) { 1270 $newPanel = $alertnoclosetemplate.clone(); 1271 } else { 1272 $newPanel = $alerttemplate.clone(); 1273 } 1274 } 1275 $newPanel.removeClass("template"); 1276 $newPanel.find(".flashmsg").html(msg); 1277 if (autoClose == true) { 1278 $("#alertdiv").append($newPanel.fadeTo(2000, 500).slideUp(500, function(){ 1279 $newPanel.slideUp(500); 1280 $newPanel.remove(); 1281 })); 1282 } else { 1283 $("#alertdiv").append($newPanel.fadeIn()); 1284 } 1285 return $newPanel; 1286} 1287 1288 1289 1290 1291</script>
1291 1292 1293 1294 1295 1296 1297 <div class="grouphome-hero d-md-none"> 1298 <img src="https://lists.projectacrn.org/g/acrn-users/coverphoto" class="grouphome-hero-img"> 1299 </div> 1300 <div class="row d-none d-md-flex"> 1301 <div class="col-lg-12"> 1302 <img src="https://lists.projectacrn.org/g/acrn-users/coverphoto" class="grouphome-center grouphome-fit"> 1303 </div> 1304 </div> 1305 1306 <h3 class="d-none d-md-block"> 1307 [email protected] 1308 </h3> 1309 1310 1311 <div class="grouphome-desc-wrap"> 1312 <div class="user-content grouphome-desc" id="grouphomeDesc"> 1313 <span style="font-family: 'Calibri',sans-serif; font-size: 10.5pt; mso-fareast-language: ZH-CN; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-bidi-language: AR-SA;"><span style="color: #000000;">Mailing list to discuss ACRN hypervisor environment setup, configuration, tool usage, debug information, bug reporting and feedback, etc.</span></span> 1314 </div> 1315 <button type="button" class="grouphome-desc-toggle" id="grouphomeDescToggle" onclick="toggleGrouphomeDesc()" hidden> 1316 <span class="grouphome-desc-more">Show more</span> 1317 <span class="grouphome-desc-less">Show less</span> 1318 </button> 1319 </div> 1320 1321 1322 1323 1324<div class="row grouphome-tiles d-lg-none"> 1325 1326 <div class="col-3 grouphome-tile-col"> 1327 <a href="https://lists.projectacrn.org/g/acrn-users/topics" class="grouphome-tile"> 1328 <i class="fa fa-comments"></i> 1329 <span class="grouphome-tile-label">Messages</span> 1330 1331 </a> 1332 </div> 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348</div> 1349 1350 1351 1352 1353 <div class="grouphome-card grouphome-recent"> 1354 <div class="grouphome-recent-head"> 1355 <h4 class="grouphome-recent-title"> 1356 <i class="fa fa-comments"></i> 1357 Recent Topics 1358 </h4> 1359 <a class="grouphome-recent-link" href="https://lists.projectacrn.org/g/acrn-users/topics"> 1360 View all 1361 </a> 1362 </div> 1363 <ul class="grouphome-recent-list"> 1364 1365 <li class="grouphome-recent-item"> 1366 <a class="grouphome-recent-subject showvisited" href="https://lists.projectacrn.org/g/acrn-users/topic/118798426"> 1367 1368 acrn crashed when i enable "Cache Allocation Technology" 1369 1370 1371 <span class="badge">3<span class="visually-hidden"> messages</span></span> 1372 1373 </a> 1374 <div class="grouphome-recent-meta"> 1375
1376<script id="timedisprecenttopic118798426"> 1377 $('#timedisprecenttopic118798426').replaceWith(DisplayShortTime(1779523820306956767, false 1378 )); 1379</script>
1379 1380 1381 </div> 1382 </li> 1383 1384 <li class="grouphome-recent-item"> 1385 <a class="grouphome-recent-subject showvisited" href="https://lists.projectacrn.org/g/acrn-users/topic/115935951"> 1386 1387 No display console after: Loading ACRN Service VM initial ramdisk ... 1388 1389 1390 </a> 1391 <div class="grouphome-recent-meta"> 1392
1393<script id="timedisprecenttopic115935951"> 1394 $('#timedisprecenttopic115935951').replaceWith(DisplayShortTime(1761340349696291174, false 1395 )); 1396</script>
1396 1397 1398 </div> 1399 </li> 1400 1401 <li class="grouphome-recent-item"> 1402 <a class="grouphome-recent-subject showvisited" href="https://lists.projectacrn.org/g/acrn-users/topic/109932901"> 1403 1404 (3) [acrn-users] Support for ARM Architecture 1405 1406 1407 <span class="badge">2<span class="visually-hidden"> messages</span></span> 1408 1409 </a> 1410 <div class="grouphome-recent-meta"> 1411
1412<script id="timedisprecenttopic109932901"> 1413 $('#timedisprecenttopic109932901').replaceWith(DisplayShortTime(1755842684204935673, false 1414 )); 1415</script>
1415 1416 1417 </div> 1418 </li> 1419 1420 <li class="grouphome-recent-item"> 1421 <a class="grouphome-recent-subject showvisited" href="https://lists.projectacrn.org/g/acrn-users/topic/113712786"> 1422 1423 ACRN support for Core Ultra Arrow Lake platform 1424 1425 1426 <span class="badge">2<span class="visually-hidden"> messages</span></span> 1427 1428 </a> 1429 <div class="grouphome-recent-meta"> 1430
1431<script id="timedisprecenttopic113712786"> 1432 $('#timedisprecenttopic113712786').replaceWith(DisplayShortTime(1750303396284992775, false 1433 )); 1434</script>
1434 1435 1436 </div> 1437 </li> 1438 1439 <li class="grouphome-recent-item"> 1440 <a class="grouphome-recent-subject showvisited" href="https://lists.projectacrn.org/g/acrn-users/topic/110604724"> 1441 1442 [WaaG]Passthrough UART usage failed on the Windows VM. 1443 1444 1445 </a> 1446 <div class="grouphome-recent-meta"> 1447
1448<script id="timedisprecenttopic110604724"> 1449 $('#timedisprecenttopic110604724').replaceWith(DisplayShortTime(1736847005098343551, false 1450 )); 1451</script>
1451 1452 1453 </div> 1454 </li> 1455 1456 </ul> 1457 </div> 1458 1459 1460 1461 <div class="grouphome-stats d-lg-none"> 1462 <span class="grouphome-stat"> 1463 <i class="fa fa-users"></i> 1464 115 members 1465 </span> 1466 1467 <span class="grouphome-stat-sep"> · </span> 1468 <span class="grouphome-stat"> 1469 <i class="fa fa-comments"></i> 1470 420 topics 1471 </span> 1472 <span class="grouphome-stat-sep"> · </span> 1473 <span class="grouphome-stat"> 1474 Last post 1475
1476<script id="timedisplastmobile13723"> 1477 $('#timedisplastmobile13723').replaceWith(DisplayShortTime(1779523820306956767, false 1478 )); 1479</script>
1479 1480 1481 </span> 1482 1483 </div> 1484 1485 <div class="row d-none d-md-flex"> 1486 <div class="col-lg-6"> 1487 <div class="grouphome-card"> 1488 <h4> 1489 Group Information 1490 </h4> 1491 <ul class="list-unstyled"> 1492 1493 <li> 1494 <i class="fa-fw fa fa-users"></i> 1495 115 Members 1496 </li> 1497 1498 <li> 1499 <i class="fa-fw fa fa-comments"></i> 1500 420 Topics 1501 , Last Post:
1502<script id="timedisplast13723"> 1503 $('#timedisplast13723').replaceWith(DisplayShortTime(1779523820306956767, false 1504 )); 1505</script>
1505 1506 1507 </li> 1508 1509 <li> 1510 <i class="fa-fw fa fa-clock"></i> 1511 Started on
1512<script id="timedispcreated13723"> 1513 $('#timedispcreated13723').replaceWith(DisplayShortTime(1519957300211657304, false 1514 )); 1515</script>
1515 1516 1517 </li> 1518 1519 1520 <li> 1521 <i class="fa-fw fa fa-rss-square"></i> 1522 <a hx-disable href="https://lists.projectacrn.org/g/acrn-users/rss"> 1523 RSS Feed 1524 </a> 1525 </li> 1526 1527 1528 </ul> 1529 1530 </div> 1531 <div class="grouphome-card" id="groupemailaddresses"> 1532 <h4> 1533 Group Email Addresses 1534 </h4> 1535 <dl class="grouphome-email-list"> 1536 <dt>Post</dt> 1537 <dd> 1538 <a href="mailto:[email protected]"> 1539 [email protected] 1540 </a> 1541 </dd> 1542 1543 <dt>Subscribe</dt> 1544 <dd> 1545 1546 <a href="mailto:[email protected]"> 1547 [email protected] 1548 </a> 1549 1550 </dd> 1551 1552 <dt>Unsubscribe</dt> 1553 <dd> 1554 <a href="mailto:[email protected]"> 1555 [email protected] 1556 </a> 1557 </dd> 1558 <dt>Group Owner</dt> 1559 <dd> 1560 <a href="mailto:[email protected]"> 1561 [email protected] 1562 </a> 1563 </dd> 1564 <dt>Help</dt> 1565 <dd> 1566 <a href="mailto:[email protected]"> 1567 [email protected] 1568 </a> 1569 </dd> 1570 </dl> 1571 </div> 1572 </div> 1573 <div class="col-lg-6"> 1574 <div class="grouphome-card"> 1575 <h4> 1576 Group Settings 1577 </h4> 1578 <ul class="list-unstyled"> 1579 1580 1581 1582 1583 <li> 1584 <i class="fa-fw fa fa-chart-pie"></i> 1585 This is a subgroup of 1586 <a href="https://lists.projectacrn.org/g/main" hx-boost="false" hx-disinherit="*"> 1587 main 1588 </a> 1589 . 1590 </li> 1591 1592 1593 <li> 1594 <i class="fa-fw fa fa-bullhorn"></i> 1595 All members can post to the group. 1596 </li> 1597 1598 1599 <li> 1600 <i class="fa-fw fa fa-check"></i> 1601 Posts to this group do not require approval from the moderators. 1602 </li> 1603 1604 1605 1606 <li> 1607 <i class="fa-fw fa fa-reply"></i> 1608 Messages are set to reply to group. 1609 </li> 1610 1611 1612 1613 <li> 1614 <i class="fa-fw fa fa-lock"></i> 1615 Subscriptions to this group do not require approval from the moderators. 1616 </li> 1617 1618 1619 1620 1621 <li> 1622 <i class="fa-fw fa fa-folder-open"></i> 1623 Archive is visible to anyone. 1624 </li> 1625 1626 1627 1628 1629 <li> 1630 <i class="fa-fw fa fa-book"></i> 1631 Wiki is visible to members only. 1632 </li> 1633 1634 1635 1636 1637 1638 <li> 1639 <i class="fa-fw fa fa-check"></i> 1640 Members can edit their messages. 1641 </li> 1642 1643 1644 <li> 1645 <i class="fa-fw fa fa-ban"></i> 1646 Members can set their subscriptions to no email. 1647 </li> 1648 1649 1650 </ul> 1651 </div> 1652 </div> 1653 </div> 1654 <div class="row d-none d-md-flex"> 1655 <div class="col-lg-6"> 1656 1657 1658 1659 <div class="grouphome-card"> 1660 <div class="grouphome-recent-head"> 1661 <h4 class="grouphome-recent-title">Top Hashtags</h4> 1662 <a class="grouphome-recent-link" href="https://lists.projectacrn.org/g/acrn-users/hashtags">View all</a> 1663 </div> 1664 1665 No used hashtags. 1666 1667 </div> 1668 1669 </div> 1670 </div> 1671 1672 1673 1674 1675 1676 <p> 1677 <form role="form" method="POST" action="/ssostartauth" hx-boost="false" hx-disinherit="*"> 1678 1679 <input type="hidden" name="group_id" value="13723"> 1680 <input type="hidden" name="type" value="register"> 1681 1682 1683 1684 1685 <button class="btn btn-primary btn-sm"> 1686 <i class="fa fa-plus"></i> 1687 Join This Group 1688 </button> 1689 1690 1691 or 1692 1693 1694 1695 1696 <a class="btn btn-success btn-sm" href="/login?group_id=13723&r=https%3A%2F%2Flists.projectacrn.org%2Fg%2Facrn-users" hx-boost="false" hx-disinherit="*"> 1697 <i class="fa fa-sign-in-alt"></i> 1698 Log In If You Are Already A Member 1699 </a> 1700 1701 </form> 1702 </p> 1703 1704 1705 1706 1707 1708 <div class="row d-none d-md-flex"> 1709 <div class="col-lg-12"> 1710 <div class="grouphome-card"> 1711 <h4> 1712 Archived Messages 1713 </h4> 1714 <div id="monthview"></div> 1715 </div> 1716 </div> 1717 </div> 1718 1719 1720
1721<script> 1722contentLoaded(false, function() { 1723 var d = new Date() 1724 var offset=d.getTimezoneOffset() 1725 $.ajax({ 1726 type: "GET", 1727 url: "https://lists.projectacrn.org/g/acrn-users/months", 1728 data: {"offset":offset}, 1729 cache: false, 1730 xhrFields: { 1731 withCredentials: true 1732 }, 1733 success: function(data){ 1734 $("#monthview").html(data); 1735 } 1736 }); 1737}); 1738</script>
1738 1739 1740 1741 </div> 1742 </div> 1743 </div> 1744 </div> 1745 <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-history="false" hx-on::after-request="document.getElementById('maincontent').scrollTo({top: 0, behavior: 'instant'})" > 1746 <div id="mobileSidebarSub" class="col-12 d-lg-none"> 1747 <div class="navbar fixed-bottom"> 1748 <div class="container" style="display: flex; justify-content: space-around;"> 1749 1750 1751 1752 1753 1754 <a id="mobilesidebar-groups" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center; color: inherit; text-decoration: none;" href="https://lists.projectacrn.org/groups" hx-boost="false"> 1755 <div style="display: inline-block; position: relative;"> 1756 <div style="position: relative;display: inline-block;"> 1757 <i class="fa-fw fa-light fa-users fa-2x"></i> 1758 1759 </div><br> 1760 <span style="font-size:12px;">Groups</span> 1761 </div> 1762 </a> 1763 1764 1765 1766 1767 1768 1769 1770 <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://lists.projectacrn.org/g/acrn-users/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-history="false" hx-on::after-request="document.getElementById('maincontent').scrollTo({top: 0, behavior: 'instant'})" > 1771 <div style="display: inline-block; position: relative;"> 1772 <div style="position: relative;display: inline-block;"> 1773 <i class="fa-fw fa-light fa-comments fa-2x"></i> 1774 1775 </div><br> 1776 <span style="font-size:12px;">Messages</span> 1777 </div> 1778 </div> 1779 1780 1781 1782 1783 1784 1785 1786 1787 <div style="flex: 1; text-align: center;margin-top:10px" data-drawer-trigger aria-controls="drawer-name" aria-expanded="false"> 1788 <i class="fa-fw fa-light fa-bars fa-2x"></i><br> 1789 <span style="font-size:12px;">More</span> 1790 </div> 1791 </div> 1792 </div>
1793 <section class="drawer drawer-left" id="drawer-name" data-drawer-target> 1794 <div class="drawer-overlay" data-drawer-close tabindex="-1"></div> 1795 <div class="drawer-wrapper drawer-wrapper-top"> 1796 <div class="drawer-header"> 1797 <div class="drawer-title"> 1798 <i class="fa-fw fa-regular fa-bars fa-3x"></i> 1799 <span class="visually-hidden"> 1800 More Options 1801 </span> 1802 More 1803 </div> 1804 <button class="drawer-close" data-drawer-close aria-label="Close Drawer"></button> 1805 </div> 1806 <div class="drawer-content"> 1807 <div class="list-group noborderlist"> 1808 1809 <a title="Group Home" href="https://lists.projectacrn.org/g/acrn-users" class="list-group-item sidebar-item"> 1810 <i class="fa-fw fa fa-home fa-lg"></i> 1811 Home 1812 1813 </a> 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 <a title="Messages" href="https://lists.projectacrn.org/g/acrn-users/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> 1825 <i class="fa-fw fa fa-comments fa-lg"></i> 1826 Messages 1827 <span id="sidebar-archives-mobile-badge" class="badge"></span> 1828 </a> 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 <a title="Hashtags" href="https://lists.projectacrn.org/g/acrn-users/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> 1840 <i class="fa-fw fa fa-hashtag fa-lg"></i> 1841 Hashtags 1842 <span id="sidebar-hashtags-mobile-badge" class="badge"></span> 1843 </a> 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 <a title="All Subgroups" href="https://lists.projectacrn.org/g/acrn-users/subgroups" id="sidebar-subgroups-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-subgroups"> 1859 <i class="fa-fw fa fa-chart-pie fa-lg"></i> 1860 All Subgroups 1861 <span id="sidebar-subgroups-mobile-badge" class="badge"></span> 1862 </a> 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos" target="_blank"> 1880 <i class="fa-fw fal fa-newspaper fa-lg"></i> 1881 Terms 1882 </a> 1883 1884 1885 </div> 1886 </div> 1887 </div> 1888 </section> 1889 </div> 1890 </div> 1891 1892<!-- Modal Dialog for Autocomplete --> 1893<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> 1894 <div class="modal-dialog" role="document"> 1895 <div class="modal-content"> 1896 <div class="modal-body"> 1897 <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> 1898 <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> 1899 <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate <i class="fa-sharp fa-arrow-turn-down-left"></i> to use <strong>esc</strong> to dismiss</div> 1900 </div> 1901 </div> 1902 </div> 1903</div> 1904 1905
1906<script> 1907 var quickActionsData = [ 1908 1909 1910 {name: "Group Home", url: "https://lists.projectacrn.org/g/acrn-users"}, 1911 1912 1913 1914 {name: "Topics", url: "https://lists.projectacrn.org/g/acrn-users/topics"}, 1915 {name: "Messages", url: "https://lists.projectacrn.org/g/acrn-users/messages"}, 1916 {name: "Expanded Messages", url: "https://lists.projectacrn.org/g/acrn-users/messages?expanded=1"}, 1917 1918 1919 1920 {name: "Polls", url: "https://lists.projectacrn.org/g/acrn-users/polls"}, 1921 1922 1923 {name: "Hashtags", url: "https://lists.projectacrn.org/g/acrn-users/hashtags"}, 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 {name: "Subgroups", url: "https://lists.projectacrn.org/g/acrn-users/subgroups"}, 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 /* other pages */ 1944 {name: "Help", url: "/helpcenter"}, 1945 {name: "Feed", url: "/feed"}, 1946 {name: "Your Groups", url: "/groups"}, 1947 {name: "Your Calendar", url: "/calendar"}, 1948 {name: "Your Activity", url: "/activity"}, 1949 {name: "Your Pending Messages", url: "/pendingmsgs"}, 1950 {name: "Account Login", url: "/account"}, 1951 {name: "Account Preferences", url: "/account?page=prefs"}, 1952 {name: "Account Security", url: "/account?page=security"}, 1953 {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, 1954 {name: "Account Notifications", url: "/account?page=notifications"}, 1955 {name: "Account Other Services", url: "/account?page=oauth"}, 1956 {name: "Account Bounces", url: "/account?page=bounces"}, 1957 {name: "Account Billing", url: "/account?page=billing"}, 1958 {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, 1959 ]; 1960 1961 1962 InitAutocomplete("quickActions", quickActionsData); 1963 1964 document.addEventListener('keydown', function(event) { 1965 var tagName = event.target.tagName.toLowerCase(); 1966 if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { 1967 return; 1968 } 1969 // check if the viewimages viewer is up 1970 let element = document.getElementById('overlay'); 1971 if (element && element.classList.contains('visible')) { 1972 return; 1973 } 1974 if (event.key.toLowerCase() === '/') { 1975 if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { 1976 // For Mac 1977 // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not 1978 if (event.metaKey) { 1979 event.preventDefault(); 1980 showAutocompleteModal("quickActions"); 1981 return; 1982 } 1983 } else { 1984 // For Windows and Linux 1985 if (event.ctrlKey) { 1986 event.preventDefault(); 1987 showAutocompleteModal("quickActions"); 1988 return; 1989 } 1990 } 1991 } 1992 }); 1993 function UpdateSidebar(id) { 1994 console.log(id + " was clicked"); 1995 if (typeof HideHeaderAction === 'function') { 1996 HideHeaderAction(); 1997 } 1998 // restore mobile bottom nav in case a previous page (e.g. /post) hid it 1999 var mobSidebar = document.getElementById("mobileSidebar"); 2000 if (mobSidebar) mobSidebar.style.display = ''; 2001 var mainContent = document.getElementById("maincontent"); 2002 if (mainContent) mainContent.style.bottom = ''; 2003 var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); 2004 sidebarItems.forEach(function(item) { 2005 var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; 2006 if (item.id == "mobilesidebar-" + id) { 2007 console.log("making solid " + id) 2008 iElement.classList.add('fa-solid'); 2009 iElement.classList.remove('fa-light'); 2010 } else { 2011 iElement.classList.remove('fa-solid'); 2012 iElement.classList.add('fa-light'); 2013 } 2014 }); 2015 var sidebarItems = document.querySelectorAll('.sidebar-item'); 2016 // remove 'active' class from all 'sidebar-item' elements 2017 sidebarItems.forEach(function(item) { 2018 if (item.id == "sidebar-" + id) { 2019 console.log("making active " + id) 2020 item.classList.add('active'); 2021 } else { 2022 item.classList.remove('active'); 2023 } 2024 }); 2025 } 2026</script>
2026 2027 2028 2029 </div> 2030 2031 <div id="scroll-top-outer"> 2032 <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> 2033 <span class="scroll-top-inner"> 2034 <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> 2035 </span> 2036 </div> 2037 </div>
2038<script> 2039 $(function() { 2040 $(document).on('scroll', function() { 2041 if ($(window).scrollTop() > 100) { 2042 $('.scroll-top-wrapper').addClass('show'); 2043 } else { 2044 $('.scroll-top-wrapper').removeClass('show'); 2045 } 2046 }); 2047 $('.scroll-top-wrapper').on('click', scrollToTop); 2048 }); 2049 2050 function scrollToTop() { 2051 verticalOffset = typeof(verticalOffset) != 'undefined' ? verticalOffset : 0; 2052 element = $('body'); 2053 offset = element.offset(); 2054 offsetTop = offset.top; 2055 $('html, body').animate({ 2056 scrollTop: offsetTop 2057 }, 100, 'linear'); 2058 } 2059 2060 if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { 2061 let elements = document.querySelectorAll('strong.ctrlmeta'); 2062 elements.forEach((element) => { 2063 // Check if the innerText is "ctrl" 2064 if (element.innerText === 'ctrl') { 2065 // Create a new "i" element 2066 let newElement = document.createElement('i'); 2067 newElement.classList.add('fa-solid', 'fa-command'); 2068 2069 // Replace the old "strong" element with the new "i" element 2070 element.parentNode.replaceChild(newElement, element); 2071 } 2072 }); 2073 } 2074</script>
2074 2075 2076 2077 2078 2079 </body> 2080 </html> 2081
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.