CINXE.COM
Libby
<!DOCTYPE html> <html class="data-libby-ribbon_charlie"> <head> <title>Libby</title> <meta charset="utf-8" /> <meta name="description" content="All over the world, local libraries offer millions of ebooks and audiobooks. You can borrow them — for free, instantly — with a library card and Libby: the award-winning, much-loved app for libraries." /> <meta name="keywords" content="library,library card,library app, ebook,audiobook,magazine, novels,comics,manga, free ebooks,free audiobooks,epub" /> <link rel="author" href="https://overdrive.com" /> <meta name="x-dewey-version" content="18.3.1" /> <meta name="x-dewey-env" content="charlie" /> <meta name="x-roster-root" content="https://libbyapp.com" /> <meta name="x-sentry-uri" content="https://sentry.libbyapp.com" /> <meta name="x-sage-uri" content="https://sage.libbyapp.com" /> <meta name="x-vandal-uri" content="https://vandal.libbyapp.com" /> <meta name="x-thunder-uri" content="https://thunder.api.overdrive.com" /> <meta name="x-autocomplete-uri" content="https://autocomplete-cache.libbyapp.com" /> <meta name="x-autocomplete-key" content="ow232u624ymgimt8ilqxbq0ngu2ai502" /> <meta name="x-ntc-api-uri" content="https://ntc.api.overdrive.com" /> <meta name="x-ntc-site-uri" content="https://extras.overdrive.com" /> <meta name="x-ntc-target-client" content="ntc-website" /> <meta name="x-omc-faq-uri" content="" /> <meta name="viewport" content="initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no,viewport-fit=cover" /> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> <meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="mobile-web-app-capable" content="yes" /> <meta name="theme-color" content="#FFF" /> <meta name="color-scheme" content="light dark" /> <meta name="supported-color-schemes" content="light dark" /> <link rel="manifest" href="/dewey-18.3.1/inc/web-app-manifest.json" /> <link rel="icon" href="/dewey-18.3.1/inc/images/libby-icon-android-192.png" sizes="192x192" /> <link rel="apple-touch-icon" href="/dewey-18.3.1/inc/images/libby-icon-ios-180.png" sizes="180x180" /> <style type="text/css" id="SPARK-splash"> html { font-size: 10px; } body { background: #F7F7F7; } #SPARK-style-canary { position: absolute; width: 100px; height: 100px; } .resource-error body { overflow: auto; } .resource-error .splash, .resource-error .arena { display: none; } .resource-error-message { position: absolute; top: 50%; left: 0; right: 0; width: 300px; margin: auto; color: #111; font-size: 1.7rem; line-height: 1.5; font-family: -apple-system,".SFNSText-Regular","San Francisco",Roboto,"Segoe UI","Helvetica Neue","Lucida Grande",sans-serif; -webkit-tap-highlight-color: rgba(0,0,0,0); -webkit-text-size-adjust: none; -webkit-touch-callout: none; -ms-content-zooming: none; -ms-content-zoom-chaining: chained; -ms-content-zoom-limit-min: 100%; -ms-content-zoom-limit-max: 100%; -ms-touch-select: none; -webkit-user-select: none; -moz-user-select: none; user-select: none; } .resource-error-button { -webkit-appearance: none; -moz-appearance: none; -ms-appearance: none; appearance: none; -webkit-transform: translateY(-50%); -moz-transform: translateY(-50%); -ms-transform: translateY(-50%); transform: translateY(-50%); display: block; width: 100%; color: #FFF; background-color: #A61C49; padding-top: 2rem; padding-bottom: 2rem; border-radius: 12px; font-size: 2.4rem; font-weight: 600; text-shadow: -1px -1px 1px rgba(0, 0, 0, 0.25); outline: none !important; box-sizing: border-box; padding: 16px; border: 1px solid transparent; border-top-width: 0; border-bottom-width: 3px; border-bottom-color: rgba(0, 0, 0, 0.2); text-align: center; cursor: pointer; } .resource-error-button:active { border-width: 1px; border-top-width: 2px; border-color: rgba(0, 0, 0, 0.15); } .resource-error-message p { } .resource-error-message p a { color: #A61C49; text-decoration: underline; } .resource-error-reattempts { position: absolute; left: 0; right: 0; top: 100%; padding: 32px; text-align: center; font-size: 1.2rem; text-transform: uppercase; color: #CCC; } .spinner { position: absolute; top: 0; bottom: 0; left: 0; right: 0; margin: auto; width: 64px; height: 64px; } .spinner line { opacity: 0.2; animation: spinner-spoke 1440ms infinite; } .spinner line:nth-child(1) { animation-delay: 0ms; } .spinner line:nth-child(2) { animation-delay: 120ms; } .spinner line:nth-child(3) { animation-delay: 240ms; } .spinner line:nth-child(4) { animation-delay: 360ms; } .spinner line:nth-child(5) { animation-delay: 480ms; } .spinner line:nth-child(6) { animation-delay: 600ms; } .spinner line:nth-child(7) { animation-delay: 720ms; } .spinner line:nth-child(8) { animation-delay: 840ms; } .spinner line:nth-child(9) { animation-delay: 960ms; } .spinner line:nth-child(10) { animation-delay: 1080ms; } .spinner line:nth-child(11) { animation-delay: 1200ms; } .spinner line:nth-child(12) { animation-delay: 1320ms; } @keyframes spinner-spoke { 0% { opacity: 0.2; } 20% { opacity: 1; } 40% { opacity: 0.2; } } .splash { z-index: 999999; position: absolute; top: 0; left: 0; right: 0; bottom: 0; } .splash .wall { width: 100%; height: 100%; border: 40vw solid #F7F7F7; border-top-width: 40vh; border-bottom-width: 40vh; box-sizing: border-box; overflow: hidden; opacity: 1; transform: none; transition: opacity 100ms, transform 500ms ease-in-out; will-change: transform; } .splash .porthole { position: absolute; top: 0; right: 0; bottom: 0; left: 0; margin: auto; width: 54px; height: 54px; border-radius: 100%; box-shadow: 0 0 0 500px #F7F7F7; } .splash .spinner { width: 172px; height: 172px; opacity: 0.1; transition: opacity 300ms linear 200ms; } .splash .mascot-app { position: absolute; width: 56px; height: 56px; top: 0; right: 0; bottom: 0; left: 0; margin: auto; overflow: hidden; border-radius: 50%; background: #631A35; transition: opacity 300ms linear 200ms; } .splash .mascot-hide { display: none; } .splash .mascot-libby { transform: translate3d(176px, 467px, 0); } .splash .mascot-book { transform: translate3d(93px, 668px, 0); display: block; } .data-libby-ribbon_beta .splash .mascot-env { fill: #FF6557; } .data-libby-ribbon_alpha .splash .mascot-env { fill: #F9A61F; } .data-libby-ribbon_dev .splash .mascot-env { fill: #FF00FF; } .data-splash_animate .splash { pointer-events: none; } .data-splash_animate .splash .wall { opacity: 0; transform: scale(20); transition: opacity 100ms linear 900ms, transform 500ms ease-in-out 500ms; } .data-splash_animate .splash .spinner { opacity: 0; transition: opacity 600ms; } .data-splash_animate .splash .mascot-app { opacity: 0; transition: opacity 200ms linear 300ms; } .data-splash_animate .splash .mascot-libby { transform: translate3d(176px, 1200px, 0); transition: transform 400ms ease-in-out; } .data-splash_animate .splash .mascot-book { transform: translate3d(93px, 1000px, 0); transition: transform 400ms ease-in-out; } .data-splash_hide .splash { display: none; } @media screen and (prefers-color-scheme: dark) { body { background: #000; } .splash .wall { border-color: #000; } .splash .porthole { box-shadow: 0 0 0 500px #000; } .resource-error-message { color: #DDD; } .resource-error-reattempts { color: #555; } } </style> </head> <body> <noscript></noscript> <div class="intro"> <h1>Libby</h1> <h2>The library app by OverDrive.®</h2> <p>Welcome! Thousands of public libraries offer ebooks and audiobooks (for free!) in Libby. Let me guide you to your library.</p> </div> <div class="splash" aria-hidden="true"> <div class="wall"> <div class="porthole"></div> </div> <svg class="spinner" version="1.1" viewBox="0 0 64 64" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"> <g fill="none" fill-rule="evenodd" stroke="none" stroke-linecap="round" stroke-width="1"> <line class="icon-hollow" stroke="#000000" stroke-width="3" x1="32" x2="32" y1="12.875" y2="16.125" /> <line class="icon-hollow" stroke="#000000" stroke-width="3" x1="41.5625" x2="39.9375" y1="15.4372642" y2="18.2518467" /> <line class="icon-hollow" stroke="#000000" stroke-width="3" x1="48.5627358" x2="45.7481533" y1="22.4375" y2="24.0625" /> <line class="icon-hollow" stroke="#000000" stroke-width="3" x1="51.125" x2="47.875" y1="32" y2="32" /> <line class="icon-hollow" stroke="#000000" stroke-width="3" x1="48.5627358" x2="45.7481533" y1="41.5625" y2="39.9375" /> <line class="icon-hollow" stroke="#000000" stroke-width="3" x1="41.5625" x2="39.9375" y1="48.5627358" y2="45.7481533" /> <line class="icon-hollow" stroke="#000000" stroke-width="3" x1="32" x2="32" y1="51.125" y2="47.875" /> <line class="icon-hollow" stroke="#000000" stroke-width="3" x1="22.4375" x2="24.0625" y1="48.5627358" y2="45.7481533" /> <line class="icon-hollow" stroke="#000000" stroke-width="3" x1="15.4372642" x2="18.2518467" y1="41.5625" y2="39.9375" /> <line class="icon-hollow" stroke="#000000" stroke-width="3" x1="12.875" x2="16.125" y1="32" y2="32" /> <line class="icon-hollow" stroke="#000000" stroke-width="3" x1="15.4372642" x2="18.2518467" y1="22.4375" y2="24.0625" /> <line class="icon-hollow" stroke="#000000" stroke-width="3" x1="22.4375" x2="24.0625" y1="15.4372642" y2="18.2518467" /> </g> </svg> <svg class="mascot-app" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024"> <g class="mascot-symbol" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <path class="mascot-field mascot-neg" fill="#631A35" d="M0 0h1024v1024H0z" /> <g class="mascot-libby" transform="translate(176 467)"> <path class="mascot-bob" fill="#A61C49" d="M102.419 639.156C39.239 588.234 0 511.792 0 412.103 0 217.018 150.273 75.956 336.148 75.956c184.868 0 335.14 141.05 335.14 336.147 0 99.692-39.237 176.132-102.278 227.053H102.419Z" /> <circle class="mascot-face mascot-skin" fill="#FEA" cx="335.644444" cy="409.6" r="301.511111"></circle> <path class="mascot-ribbon mascot-env" fill="#29CFC3" d="M576.222 0s-55.7 27.256-67.855 27.256C496.212 27.256 439.69 0 439.69 0v71.386c51.51 15.05 98.043 42.975 136.533 77.947V0Z" /> <path class="mascot-right-hair" fill="#A61C49" d="M496.186 354.418c39.716-49.47 70.43-106.476 89.662-168.532 53.113 59.452 85.44 138.005 85.44 224.217 0 34.455-5.219 67.708-14.91 99.011L496.186 354.418Z" /> <g class="mascot-spectacles mascot-neg mascot-hide" fill="#631A35" transform="translate(100.982 353.223)"> <path class="mascot-spectacles-right-eye" d="M331.69 105.514a35.215 35.215 0 0 1-1.028-8.467c0-19.368 15.67-35.07 35-35.07s35 15.702 35 35.07c0 13.386-7.484 25.02-18.489 30.93-3.78-15.278-17.556-26.603-33.973-26.603a34.79 34.79 0 0 0-16.51 4.14Z" /> <path class="mascot-spectacles-frame" d="m86.882 0 3.98.015 8.908.06 2.425.011 3.262.006 1.82.012 1.85.024 1.404.027 1.42.033 1.913.057.965.033 1.947.077.982.044.985.047 1.986.105.999.059 2.009.128 1.01.07 2.029.15 2.04.167 1.537.136c.513.047 1.026.096 1.54.146l1.932.195 2.323.254 1.94.229 1.552.194 1.552.205c.517.07 1.034.141 1.551.215l1.55.225 1.547.237c.773.12 1.545.246 2.316.375l1.538.264c1.024.18 2.045.367 3.062.562l1.521.298 1.515.31 1.506.322 1.498.334 1.488.346c14.587 3.465 27.698 8.725 36.116 16.448 4.787 4.393 7.904 9.638 9.904 15.432h63.3c2-5.794 5.118-11.04 9.905-15.432 8.418-7.723 21.529-12.983 36.115-16.448l1.489-.346 1.497-.334 1.507-.322 1.514-.31 1.522-.298c1.016-.195 2.037-.383 3.061-.562l1.539-.264c.77-.13 1.542-.254 2.315-.375l1.548-.237 1.55-.225c.516-.074 1.034-.145 1.55-.215l1.553-.205 1.552-.194 1.551-.185 1.55-.174.775-.083 1.546-.16c.515-.052 1.03-.102 1.543-.15l1.923-.174 2.424-.2 2.029-.152 1.01-.07L354.18.61l.999-.059 1.985-.105 1.967-.091 1.947-.077 1.925-.063c1.276-.038 2.536-.066 3.778-.087l1.85-.024 1.82-.012 3.262-.006 2.425-.011 8.908-.06 3.98-.015h1.882l2.965.01 2.241.017 2.255.028 1.508.025 1.513.03 1.514.037 1.517.043 1.518.05 1.518.058 1.518.066 1.516.074 1.514.082 1.511.092.754.05 1.88.134 1.872.15 1.491.132 1.484.144c.74.075 1.476.154 2.21.238l1.461.173 1.452.187 1.441.2c12.201 1.754 23.135 4.986 30.524 10.88 6.334 5.051 10.447 11.797 13.106 19.484l43.254-8.326c1.656-.503 3.538 1.423 4.965 3.948l.247.451.12.23.231.465.111.236.214.475.102.24.194.479c.063.16.123.32.18.48l.166.477c.052.158.102.316.15.473l.132.467c.56 2.08.592 3.894-.245 4.521l-45.134 39.526-.03 2.839-.083 6.698-.015 1.637-.012 2.422-.001.798c0 50.163-46.736 90.828-104.387 90.828-57.652 0-104.388-40.665-104.388-90.828 0-3.027-.081-6.112-.189-9.227l-.106-2.881h-57.429l-.105 2.881c-.107 3.115-.189 6.2-.189 9.227 0 50.163-46.735 90.828-104.387 90.828C46.907 181.748.171 141.083.171 90.92l-.001-.798-.007-1.61-.03-3.274-.074-5.873-.045-4.282L0 72.488V69.88l.006-.872.016-1.745.03-1.888.027-1.26.034-1.259.065-1.887.053-1.257.061-1.256.07-1.253.08-1.25.09-1.247.1-1.244c.036-.414.073-.827.112-1.24l.122-1.234.066-.616.14-1.227c.049-.408.1-.815.153-1.22l.166-1.216C3.318 33.18 7.78 20.91 17.822 12.9c7.39-5.893 18.324-9.125 30.524-10.88l1.441-.2 1.452-.186 1.462-.173 1.103-.123 1.107-.115 1.484-.144 1.49-.132 1.872-.15 1.88-.135.755-.049 1.51-.092 1.515-.082 1.516-.074L68.45.298 69.97.241l1.517-.05 1.517-.044L74.518.11 76.03.08 77.54.055l2.254-.028 2.242-.018L84.999 0h1.883Zm.506 35.843h-3.28l-2.568.012-1.663.015-2.422.033-1.568.029-1.531.035-1.497.04-1.462.047-1.428.053-1.396.06-1.365.065-1.99.112-.65.04-1.276.086-1.25.093-1.222.1-1.493.136-1.455.147-1.137.126-1.116.133-1.094.142-1.075.15-1.157.172-.615.099-1.195.203c-3.122.553-5.736 1.203-7.791 1.914-.887.306-1.603.602-2.143.867l-.194.097-.25.137-.073.086c-.08.1-.175.239-.288.425-.133.22-.27.472-.407.757l-.208.45c-.313.715-.63 1.596-.938 2.655-.6 2.063-1.083 4.511-1.45 7.392l-.078.624-.12 1.07c-.093.87-.177 1.777-.25 2.72l-.054.716-.082 1.222-.038.626-.067 1.282-.058 1.323-.048 1.363-.039 1.404-.04 2.09-.017 1.326-.01 1.374-.001 1.731.003 1.127.03 3.868.12 10.114.02 4.189c0 29.174 29.667 54.986 68.546 54.986 38.49 0 67.951-25.299 68.537-54.112l.009-.874.004-1.449.014-1.457.024-1.49.046-2.073.063-2.223.06-1.799.321-8.668.069-2.118.033-1.165.038-1.674.024-1.587.008-1.011.002-1.45-.007-.922-.013-.89-.02-.855-.025-.825-.031-.793-.038-.764-.045-.735-.05-.707-.058-.68-.063-.655-.07-.63-.077-.605-.083-.583-.09-.56-.096-.54-.103-.52-.12-.545-.121-.488-.12-.434a9.942 9.942 0 0 0-.237-.71l-.058-.147-.111-.255-.067-.137-.047-.042-.256-.21a10.4 10.4 0 0 0-.309-.235l-.175-.125-.39-.265-.214-.14-.47-.294-.256-.153c-1.403-.828-3.164-1.686-5.254-2.534-4.638-1.883-10.5-3.563-17.295-4.934-12.48-2.518-27.295-3.83-41.548-3.908l-2.444-.004-16.06-.089Zm304.412 0-4.678.005-14.663.084h-1.108c-14.66 0-30.014 1.316-42.884 3.912-6.794 1.371-12.656 3.05-17.295 4.934-2.09.848-3.85 1.706-5.253 2.534-.787.465-1.391.877-1.815 1.211l-.308.256-.018.045-.11.237-.056.136-.115.306-.117.353c-.098.315-.197.68-.295 1.1l-.116.53-.107.54-.093.522-.087.54-.08.56-.075.58-.068.6-.063.621-.056.645-.05.67-.044.694-.039.721-.032.749-.027.777-.02.806-.016.838-.013 1.316v.92l.01 1.443.021 1.525.021 1.064.027 1.103.07 2.327.05 1.424.296 7.958.077 2.372.059 2.18.042 2.045.014.988.017 1.94.002.966c0 29.174 29.666 54.986 68.546 54.986 38.49 0 67.95-25.299 68.536-54.112l.01-.874.012-3.456.14-12.23.016-2.094.005-1.518-.002-1.774-.01-1.453-.019-1.403-.038-1.891-.05-1.749-.064-1.684-.03-.657-.068-1.282-.037-.626-.082-1.222-.092-1.184c-.385-4.658-1.003-8.39-1.86-11.338-.514-1.765-1.053-3.036-1.554-3.862l-.156-.245a3.196 3.196 0 0 0-.132-.18l-.073-.087-.25-.136c-.557-.289-1.339-.62-2.336-.964-2.441-.844-5.669-1.602-9.602-2.216l-1.156-.173-1.075-.15-1.095-.14-1.115-.134-1.138-.126-1.455-.147-1.492-.136-1.223-.1-1.249-.093-1.277-.086-.648-.04-1.991-.112-1.365-.065-1.396-.06-1.429-.053-1.462-.047-1.496-.04-1.532-.035-1.567-.029-2.422-.033-1.663-.015-2.57-.012Z" fill-rule="nonzero" /> </g> <path class="mascot-left-hair" fill="#A61C49" d="M22.522 530.941C7.974 493.441 0 452.69 0 410.103 0 224.23 150.273 73.956 336.148 73.956c93.25 0 177.698 38.234 238.497 99.986-64.492 208.97-259.17 360.814-489.312 360.814a517.144 517.144 0 0 1-62.811-3.815Z" /> <path class="mascot-smile mascot-neg" fill="#631A35" d="M337.2 635.644c31.793 0 65.509-24.578 57.308-41.75-4.354-8.853-28.28 11.26-57.308 11.597-27.64-.214-51.318-18.607-56.16-11.597-11.943 16.785 25.357 41.75 56.16 41.75Z" /> <path class="mascot-mustache mascot-neg mascot-hide" fill="#631A35" d="M364.754 550.097c-26.601 0-29.107 15.05-29.107 15.05s-2.51-15.05-29.108-15.05-33.123 36.125-61.734 36.125c-14.964 0-27.457-6.696-37.478-20.09a3.465 3.465 0 0 0-6.197 2.615c6.631 42.096 33.233 63.143 79.807 63.143 0 0 35.134 2.01 54.707-24.589 19.575 26.599 54.708 24.59 54.708 24.59 47.882 0 74.655-22.251 80.319-66.752a2.599 2.599 0 0 0-4.729-1.786c-10.337 15.246-23.491 22.87-39.464 22.87-28.598 0-35.123-36.126-61.724-36.126Z" fill-rule="nonzero" /> <path class="mascot-right-eye-closed mascot-neg mascot-hide" fill="#631A35" d="M478.863 507c-28.996 0-61.545-37.514-57.892-42.896 3.652-5.381 35.455 9.435 56.044 9.435 22.35 0 56.796-14.755 60.397-9.6 3.602 5.154-28.611 43.061-58.55 43.061Z" /> <path class="mascot-right-eye-open mascot-neg" fill="#631A35" d="M425.299 480.058a41.965 41.965 0 0 1-1.232-10.124c0-23.16 18.804-41.934 42-41.934s42 18.774 42 41.934c0 16.006-8.982 29.917-22.187 36.984-4.536-18.269-21.068-31.81-40.768-31.81a41.867 41.867 0 0 0-19.813 4.95Z" /> </g> <g class="mascot-book" transform="translate(93 668)"> <path class="mascot-pages-outline mascot-neg" fill="#631A35" d="M38 84.993c0-55.225 44.214-92.891 98.63-83.507 0 0 194.386 27.99 260.37 65.513 10.795.08 32.676.08 44 0C507.613 29.183 695.425 1.782 695.425 1.782 749.866-7.487 794 29.778 794 84.992V568H38V84.993Z" /> <path class="mascot-pages" fill="#FFF" d="M38 70.322c0-34.42 27.56-57.962 61.514-52.32 0 0 231.502 34.409 297.486 71.998 10.795-.05 32.676-.05 44 0 66.613-37.882 291.53-71.827 291.53-71.827 33.949-5.618 61.47 17.73 61.47 52.15V568H38V70.322Z" /> <path class="mascot-back-cover" fill="#29CFC3" d="M419 568V114L52 47C23.093 41.545.5 61.46 1 91L0 568h419Z" /> <path class="mascot-front-cover" fill="#23B0A7" d="M419 568V113l367-67c29.292-5.452 53 14.448 53 44v478H419Z" /> <path class="mascot-spine" fill="#26BFB5" d="M473 568V104H364v464z" /> </g> <g class="mascot-mortarboard mascot-hide" transform="translate(110 162)"> <path class="mascot-cap mascot-neg" fill="#631A35" d="M399.085 324.762v.106l-.144-.053-.146.053v-.107c-204.715-75.292-211.545-74.83-304.45-74.83l28.281-148.053H679.69l28.637 148.053c-94.074 0-101.947-.462-309.242 74.831Z" /> <path class="mascot-ribbon-shadow mascot-neg" fill="#631A35" d="M254.337 313.778v94.678l-40.772-16.349-40.773 16.35v-94.68c0-19.394 13.527-35.63 31.602-39.804V165.337l18.635 3.42v105.216c17.954 4.273 31.308 20.502 31.308 39.805Z" /> <path class="mascot-cap-board" fill="#A61C49" d="M383.016-.38c11.687-3.06 30.622-3.024 42.296.083l358.423 95.366c3.378.899 5.894 1.977 7.604 3.054 3.92 2.468 4.792 5.325 4.768 7.648-.023 2.325-.953 5.164-4.925 7.55-1.733 1.04-4.27 2.066-7.667 2.893l-358.219 87.22c-11.664 2.84-30.587 2.874-42.266.075L18.468 116.15c-3.393-.814-5.93-1.822-7.66-2.845-4.026-2.38-4.94-5.222-4.964-7.53-.024-2.307.83-5.168 4.805-7.63 1.71-1.06 4.224-2.12 7.6-3.004Z" stroke="#A61C49" stroke-width="11.449" /> <path class="mascot-cap-ribbon mascot-env" fill="#50DCD2" d="M240.442 305.334v94.678l-40.772-16.349-40.772 16.35v-94.68c0-19.394 13.527-35.631 31.602-39.804V160.313l193.685-62.667c1.832-4.778 8.651-8.328 16.784-8.328 9.537 0 17.268 4.881 17.268 10.902 0 6.02-7.731 10.902-17.268 10.902-2.162 0-4.23-.251-6.137-.709l-185.698 57.478v97.638c17.954 4.273 31.308 20.502 31.308 39.805Z" /> </g> </g> </svg> </div> <div class="runtime" aria-hidden="true"> <div id="SPARK-style-canary"></div> <script type="text/javascript" id="SPARK-error-handling"> window.SPARK = {}; SPARK.handleReady = function () { clearTimeout(SPARK.loadTimer); SPARK.reattempts(0); var scriptTag = document.querySelector('#SPARK-error-handling'); if (scriptTag) { scriptTag.parentNode.removeChild(scriptTag); } } SPARK.onScriptError = function (errorMessage, url, lineNumber) { if (window.stop) { window.stop(); } SPARK.handleError({ message: 'SCRIPT ERROR: '+errorMessage, source: url + (lineNumber ? ':' + lineNumber : '') }); } SPARK.onResourceError = function (elem) { if (window.stop) { window.stop(); } var source = elem; try { source = elem.href || elem.src || elem.outerHTML; } catch (e) {}; SPARK.handleError({ message: 'RESOURCE ERROR', source: source }); } SPARK.handleError = function (errorInfo) { var noscript = document.querySelector('noscript'); var intro = document.querySelector('.intro'); if (noscript && intro && noscript != intro.parentNode) { noscript.appendChild(intro); } console.warn('[SPARK] %s: %s', errorInfo.message, errorInfo.source); SPARK.errorInfo = errorInfo; SPARK.errorsDuringLaunch = SPARK.errorsDuringLaunch || []; SPARK.errorsDuringLaunch.push(errorInfo); SPARK.submitAutomaticErrorReport(); SPARK.schedule(SPARK.autoRepair, 250); } SPARK.submitAutomaticErrorReport = function () { SPARK.transmitViaBridge({ name: 'diagnostics:client:error', error: SPARK.errorInfo }); try { var sageURL = 'https://sage.libbyapp.com/submit/error'; var sageBody = JSON.stringify({ errorMessage: SPARK.errorInfo.message, errorSource: SPARK.errorInfo.source, errorData: { phase: 'launch' }, userAgentString: navigator.userAgent, userAgentWidth: window.innerWidth, userAgentHeight: window.innerHeight, shouldPersist: false }); if (location.origin.match(/^ms-local-stream/)) { sageURL += '?_nautilus_origin='+location.origin; } console.log('[SAGE] -> '+sageURL, sageBody); var xhr = new XMLHttpRequest(); xhr.open('POST', sageURL, true); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.send(sageBody); } catch (e) { console.warn('[SAGE] Error submitting auto report', e); } } SPARK.transmitViaBridge = function (msg) { try { msg.dest = msg.dest || 'shell'; if (window.BRIDGE && window.BRIDGE.clientToShell) { window.BRIDGE.clientToShell(msg); return true; } else if (window.BRIDGE && window.BRIDGE.clientToShellAsJSON) { window.BRIDGE.clientToShellAsJSON(JSON.stringify(msg)); return true; } } catch (e) {} console.warn('[SPARK] failed to transmit:', msg); return false; } SPARK.showRetryButton = function () { var msgBox = document.querySelector('.resource-error-message'); if (msgBox) { return msgBox; }; document.documentElement.className = 'resource-error'; msgBox = document.createElement('div'); msgBox.className = 'resource-error-message'; document.body.appendChild(msgBox); var retryForm = document.createElement('form'); retryForm.className = 'resource-error-form'; retryForm.setAttribute('action', '/'); retryForm.addEventListener('submit', function (evt) { evt.preventDefault(); SPARK.manualRepair(); }, false); msgBox.appendChild(retryForm); var retryTimestamp = document.createElement('input'); retryTimestamp.setAttribute('type', 'hidden'); retryTimestamp.setAttribute('name', 'repair'); retryTimestamp.setAttribute('value', (new Date()).getTime()); retryForm.appendChild(retryTimestamp); var retryButton = document.createElement('input'); retryButton.className = 'resource-error-button'; retryButton.setAttribute('type', 'submit'); retryButton.setAttribute('value', 'Try Again'); retryForm.appendChild(retryButton); var reattempts = SPARK.reattempts(); if (reattempts) { var reattemptCounter = document.createElement('div'); reattemptCounter.className = 'resource-error-reattempts'; reattemptCounter.innerHTML = 'Attempts'+': '+reattempts; msgBox.appendChild(reattemptCounter); } SPARK.transmitViaBridge({ name: 'client:view:reveal' }); return msgBox; } SPARK.manualRepair = function (callback) { SPARK.reattempts(SPARK.reattempts() + 1); SPARK.transmitViaBridge({ name: 'roster:wipe', roster: { id: 'dewey-js', version: '18.3.1' } }); SPARK.schedule(function () { document.documentElement.removeAttribute('class'); location.href = '/?repair='+(new Date()).getTime(); }, 200); } SPARK.autoRepair = function () { var reattempts = SPARK.reattempts(); if (reattempts < 1) { SPARK.schedule(SPARK.showRetryButton, 200); } else { SPARK.transmitViaBridge({ name: 'client:view:failure', error: SPARK.errorInfo }); SPARK.schedule(SPARK.fallbackWithApology, 500); } } SPARK.fallbackWithApology = function () { var msgBox = SPARK.showRetryButton(); var apologyPara = msgBox.querySelector('.resource-error-apology'); if (!apologyPara) { apologyPara = document.createElement('p'); apologyPara.className = 'resource-error-apology'; apologyPara.innerHTML = 'We’re having no luck repairing your access to Libby. Sorry, we understand this is frustrating. Consider reporting the problem to our <a href="https://www.surveygizmo.com/s3/3216684/Libby-Support-Form" target="_blank" rel="noopener" >Support</a> team.'; msgBox.appendChild(apologyPara); } } SPARK.schedule = function (callback, ms) { clearTimeout(SPARK.errorTimer); SPARK.errorTimer = setTimeout(callback, ms || 0); } SPARK.reattempts = function (assignValue) { var key = 'SPARK-retry-attempts'; if (typeof assignValue != 'undefined') { try { if (assignValue) { localStorage.setItem(key, assignValue); } else { localStorage.removeItem(key); } return assignValue; } catch (e) {}; } try { return parseFloat(localStorage.getItem(key)) || 0; } catch (e) {}; return 0; } SPARK.loadTimeout = function () { SPARK.handleError({ message: 'LOAD TIMEOUT' }); } SPARK.loadTimer = setTimeout(SPARK.loadTimeout, 30000); window.onerror = SPARK.onScriptError; window.addEventListener('environment:ready', SPARK.handleReady, true); </script> <link rel="stylesheet" type="text/css" href="/dewey-18.3.1/css/main.css" onerror="SPARK.onResourceError(this)" /> <style type="text/css" id="SPARK-display-area"></style> <script type="text/javascript" id="SPARK-script-loading"> SPARK.locale = (function () { var locale = {}; locale.available = ["en-US","de-DE","es-419","fr-CA","it-IT","ja-JP","ru-RU","sv-SE","zh-Hans-CN","zh-Hant-TW","en-GB","da-DK","is-IS","ko-KR","ms-SG","ta-SG","mi-NZ","cy-GB"]; var inferenceRanges = [ 'zh-cmn', 'zh-cmn-Hans', 'zh-cmn-Hant', 'zh-cmn-CN', 'zh-cmn-SG', 'zh-cmn-HK', 'zh-cmn-TW', 'zh-cmn-MO', 'zh-cmn-Hans-CN', 'zh-cmn-Hans-SG', 'zh-cmn-Hant-HK', 'zh-cmn-Hant-TW', 'zh-cmn-Hant-MO' ]; var inferenceRules = []; for (var i = 0, ii = inferenceRanges.length; i < ii; ++i) { var subtags = inferenceRanges[i].toUpperCase().split('-'); inferenceRules.push([ subtags.length - 2, subtags.slice(0, -2), subtags[subtags.length - 2], subtags[subtags.length - 1] ]); } inferenceRules.sort(function (a, b) { return a[0] - b[0]; }); var nautAndroidOverrides = function () { var navTags = Array.prototype.slice.apply(window.navigator.languages || []); if (navTags.length <= 1) { return []; } else if (navTags[navTags.length - 1] == 'en-US') { navTags.pop(); } var overrideTags = []; for (var i = 0, ii = navTags.length; i < ii; ++i) { if (!navTags[i].match('-')) { overrideTags = navTags; break; } overrideTags.push(navTags[i]); var lang = navTags[i].replace(/-[^-]*$/, ''); if ( overrideTags.indexOf(lang) < 0 && (navTags[i+1] || '').replace(/-[^-]*$/, '') != lang ) { overrideTags.push(lang); } } return overrideTags.slice(0, 16); } var prepareSubtags = function (tag, inferences) { var subtags = tag.toUpperCase().split('-'); for (var i = 0, ii = inferenceRules.length; i < ii; ++i) { var rule = inferenceRules[i]; var index = rule[0], prefix = rule[1], insert = rule[2], match = rule[3]; if (subtags[index] == match && subtags.slice(0,index).join('-') == prefix.join('-')) { if (inferences) { inferences[prefix] = inferences[prefix] || []; inferences[prefix].push(prefix.concat([insert])); } subtags.splice(index, 0, insert); } } return subtags; } var prepareRanges = function (ranges) { var inferences = {}; var out = []; for (var i = 0, ii = ranges.length; i < ii; ++i) { var range = ranges[i]; if (range == '*') { out.push(range); } else { var subtags = prepareSubtags(range, inferences); out.push(expandRange(subtags, inferences)); } } return flatten(out, 1); } var expandRange = function (range, inferences) { var out = []; if (inferences[range]) { for (var i = 0, ii = inferences[range].length; i < ii; ++i) { out.push(expandRange(inferences[range][i], inferences)); } } return flatten(out, 1).concat([range]); } var flatten = function (arr, level) { level = (typeof level == 'number') ? level : Infinity; var out = []; for (var i = 0, ii = arr.length; i < ii; ++i) { if (level && arr[i] instanceof Array) { out = out.concat(flatten(arr[i], level - 1)); } else { out.push(arr[i]); } } return out; } var compact = function (arr) { var out = []; for (var i = 0, ii = arr.length; i < ii; ++i) { if (arr[i] && out.indexOf(arr[i]) < 0) { out.push(arr[i]); } } return out; } locale.negotiate = function (requestedRanges, availableRanges) { if (!(requestedRanges instanceof Array)) { return []; } if (typeof requestedRanges[0] != 'string') { return []; } if (typeof availableRanges == 'undefined') { availableRanges = locale.available; } var availableRules = []; for (var i = 0, ii = availableRanges.length; i < ii; ++i) { availableRules.push([ availableRanges[i], prepareSubtags(availableRanges[i]) ]); } var ranges = prepareRanges(requestedRanges); var combos = []; for (var i = 0, ii = ranges.length; i < ii; ++i) { var range = ranges[i]; for (var j = 0, jj = availableRules.length; j < jj; ++j) { var tag = availableRules[j][0], subtags = availableRules[j][1]; var divergence = range.length; if (range[0] != '*') { for (var k = 0, kk = range.length; k < kk; ++k) { if (range[k] != subtags[k]) { divergence = k; break; } } } var precision = divergence / range.length; if (precision > 0) { combos.push([tag, precision, combos.length]); } } } combos.sort(function (a,b) { return (b[1] == a[1]) ? (a[2] - b[2]) : (b[1] - a[1]); }); var out = []; for (var i = 0, ii = combos.length; i < ii; ++i) { if (out.indexOf(combos[i][0]) < 0) { out.push(combos[i][0]); } } return out; } locale.determine = function () { this.userOverrideTags = [( window.localStorage && window.localStorage.getItem('SPARK:locale') )]; if (navigator.userAgent.match(/Dewey.*Android/)) { this.userOverrideTags.push.apply(this.userOverrideTags, nautAndroidOverrides()); } this.userOverrideTags = compact(this.userOverrideTags); this.userAgentTags = compact(flatten([ window.navigator.languages, window.navigator.language, window.navigator.browserLanguage ])); this.serverDefaultTag = 'en-US'; this.tag = ( this.negotiate(this.userOverrideTags)[0] || this.negotiate(this.userAgentTags)[0] || this.serverDefaultTag ); this.acceptTags = compact(flatten([this.userOverrideTags, this.userAgentTags])); this.isUserAgentDefault = (this.tag == this.negotiate(this.userAgentTags)[0]); this.isEnglish = this.tag.match(/^en(-|$)/) ? true : false; } locale.determine(); return locale; })(); SPARK.loadJavaScript = function (src) { var script = document.createElement('script'); script.setAttribute('type', 'text/javascript'); script.setAttribute('src', src); script.async = false; script.onerror = SPARK.onResourceError.bind(this); document.getElementsByClassName('runtime')[0].appendChild(script); return script; } if ( !window.Intl || !window.Intl.PluralRules || !window.Intl.ListFormat || !window.Intl.RelativeTimeFormat ) { SPARK.loadJavaScript('/dewey-18.3.1/inc/polyfills/i18n/'+SPARK.locale.tag+'.js'); } SPARK.loadJavaScript('/dewey-18.3.1/inc/str/'+SPARK.locale.tag+'.js'); SPARK.loadJavaScript('/dewey-18.3.1/src/main.js'); document.querySelector('noscript').appendChild(document.querySelector('.intro')); </script> </div> </body> </html>