1<!doctype html><html lang="en"><head><meta charset="utf-8"><meta content="width=device-width, initial-scale=1" name="viewport"><meta content="light dark" name="color-scheme"><title>Sign in · IT Revolution</title><link href="/assets/favicon-32.png" rel="icon" sizes="32x32" type="image/png"><link href="/assets/favicon-192.png" rel="icon" sizes="192x192" type="image/png"><link href="/assets/favicon-192.png" rel="apple-touch-icon"><meta content="IT Revolution" property="og:site_name"><meta content="website" property="og:type"><meta content="Sign in" property="og:title"><meta content="summary" name="twitter:card"><meta content="noindex,follow" name="robots"><link href="https://fonts.googleapis.com" rel="preconnect"><link crossorigin="anonymous" href="https://fonts.gstatic.com" rel="preconnect"><link href="https://fonts.googleapis.com/css2?family=Sora:wght@400;500;600;700;800&family=Hanken+Grotesk:wght@400;500;600;700;800&family=Literata:opsz,[email protected],400;7..72,500;7..72,600&display=swap" rel="stylesheet">
1<script>document.documentElement.dataset.theme=matchMedia('(prefers-color-scheme: dark)').matches?'dark':'light';var mq=matchMedia('(prefers-color-scheme: dark)');if(mq.addEventListener)mq.addEventListener('change',function(e){document.documentElement.dataset.theme=e.matches?'dark':'light';});</script>
1<link href="/css/itrev.css?v=3a87308a" rel="stylesheet"><style> 2.membership-invite{width:100%;margin-top:72px;padding:0 28px 72px;background:var(--paper,#fff);color:var(--text,#101223);font-family:var(--f-ui,'Hanken Grotesk',system-ui,-apple-system,sans-serif)} 3.membership-invite *,.mfoot *{box-sizing:border-box} 4.membership-invite__inner{width:100%;max-width:1180px;margin:0 auto;padding:40px 0;display:grid;grid-template-columns:minmax(0,1fr) auto;gap:40px;align-items:center;border-top:1px solid var(--text,#101223);border-bottom:1px solid var(--text,#101223)} 5.membership-invite__copy{display:flex;flex-direction:column;gap:10px;max-width:720px} 6.membership-invite h2{margin:0;color:var(--text,#101223);font-family:var(--f-display,Sora,system-ui,sans-serif);font-size:30px;font-weight:800;line-height:1.12;letter-spacing:-.025em} 7.membership-invite p{margin:0;color:var(--muted,#626a79);font-size:16px;line-height:1.55} 8.membership-invite__button{display:inline-flex;align-items:center;justify-content:center;padding:14px 22px;border-radius:999px;background:linear-gradient(90deg,#0cabca,#38c89b);color:#06121a;text-decoration:none;white-space:nowrap;font-family:var(--f-display,Sora,system-ui,sans-serif);font-size:13.5px;font-weight:700;transition:filter .16s ease,transform .16s ease} 9.membership-invite__button:hover{filter:brightness(1.05)} 10.membership-invite__button:active{transform:translateY(1px)} 11.membership-invite :is(a,button):focus-visible,.mfoot :is(a,button):focus-visible{outline:none;box-shadow:0 0 0 3px var(--paper,#fff),0 0 0 5px var(--teal,#20abc3);border-radius:6px} 12.mfoot{width:100%;margin-top:72px;border-top:1px solid var(--hair,#e4e7ec);background:var(--paper,#fff);color:var(--text,#101223);font-family:var(--f-ui,'Hanken Grotesk',system-ui,-apple-system,sans-serif);font-weight:400;line-height:1.5;-webkit-font-smoothing:antialiased} 13.membership-invite+.mfoot{margin-top:0} 14.mfoot__grid{max-width:1180px;margin:0 auto;padding:54px 28px 30px;display:grid;grid-template-columns:1.5fr repeat(4,minmax(0,1fr));gap:36px} 15.mfoot__logo{display:inline-flex;align-items:center;width:134px;height:26px} 16.mfoot__logo img{display:block;width:134px;height:auto;opacity:.94} 17[data-theme='dark'] .mfoot__logo img{filter:brightness(0) invert(1)} 18.mfoot__blurb{margin:16px 0 18px;max-width:255px;color:var(--muted,#626a79);font-size:13.5px;line-height:1.62} 19.mfoot__social{display:flex;flex-wrap:wrap;gap:8px} 20.mfoot__social a{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:1px solid var(--hair,#e4e7ec);border-radius:999px;color:var(--muted,#626a79);transition:color .16s ease,border-color .16s ease,background .16s ease} 21.mfoot__social a:hover{border-color:var(--teal,#20abc3);color:var(--teal,#20abc3);background:var(--teal-08,rgba(32,171,195,.08))} 22.mfoot__social svg{width:15px;height:15px} 23.mfoot__col h4{margin:0 0 14px;color:var(--text,#101223);font-family:var(--f-display,Sora,system-ui,sans-serif);font-size:11.5px;font-weight:700;letter-spacing:.1em;text-transform:uppercase} 24.mfoot__col a{display:block;margin:9px 0;color:var(--muted,#626a79);font-size:13.5px;text-decoration:none} 25.mfoot__col a:hover{color:var(--text,#101223)} 26.mfoot__bottom{max-width:1180px;margin:6px auto 0;padding:20px 28px 28px;border-top:1px solid var(--hair,#e4e7ec);display:flex;justify-content:space-between;gap:16px;color:var(--faint,#8b93a2);font-size:12.5px} 27.mfoot__legal{display:flex;gap:20px;flex-wrap:wrap} 28.mfoot__legal a{color:var(--faint,#8b93a2);text-decoration:none} 29.mfoot__legal a:hover{color:var(--text,#101223)} 30@media(max-width:1023px){.mfoot__grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:32px}.mfoot__brand{grid-column:1/-1}} 31@media(max-width:639px){.membership-invite{margin-top:52px;padding:0 20px 52px}.membership-invite__inner{grid-template-columns:minmax(0,1fr);gap:20px;padding:32px 0}.membership-invite h2{font-size:25px}.membership-invite__button{width:100%}.mfoot__grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:28px;padding:40px 20px 26px}.mfoot__col a{min-height:44px;margin:0;display:flex;align-items:center}.mfoot__bottom{margin-top:2px;padding:20px 20px 26px;flex-direction:column;gap:12px}.mfoot__legal{gap:16px}} 32</style><style> 33.gnav-switch{display:inline-flex;align-items:center;gap:2px;padding:3px;border-radius:999px;background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.09);flex:0 0 auto} 34.gnav-switch__opt{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:30px;padding:5px 13px 5px 11px;border-radius:999px;color:#b9c0d0;font-family:Sora,system-ui,-apple-system,sans-serif;font-size:13px;font-weight:600;line-height:1.2;letter-spacing:-.005em;white-space:nowrap;transition:color .16s ease,background .16s ease} 35.gnav-switch__icon{display:inline-flex;flex:0 0 auto;opacity:.85}
36.gnav-switch__icon svg{width:14px;height:14px} 37.gnav-switch__opt.is-current{background:#fff;color:#0b0b1c} 38.gnav-switch__opt.is-current .gnav-switch__icon{opacity:1} 39.gnav-switch--sheet{display:flex;width:100%;margin-bottom:16px;padding:4px} 40.gnav-switch--sheet .gnav-switch__opt{flex:1 1 0;min-height:44px;font-size:14px} 41.gnav-plan-stack{display:flex;flex-direction:column;align-items:flex-end;justify-content:center;gap:3px;line-height:1.2;flex:0 0 auto} 42.gnav-plan-stack .gnav-member{line-height:1.2} 43.gnav-upgrade{font-family:Sora,'Hanken Grotesk',system-ui,-apple-system,sans-serif;font-size:12px;font-weight:600;line-height:1.2;color:var(--on-ink-accent,#3fc3dd);white-space:nowrap;text-decoration:none;border-radius:4px} 44.gnav-upgrade:hover{text-decoration:underline;text-underline-offset:2px} 45.gnav-upgrade:focus-visible{outline:none;box-shadow:0 0 0 2px #0b0b1c,0 0 0 4px #3fc3dd} 46.gnav-app-current{font-family:Sora,system-ui,-apple-system,sans-serif;font-weight:600;font-size:15px;color:#fff;letter-spacing:-.01em;white-space:nowrap;flex:0 0 auto} 47@media(hover:hover){.gnav-switch__opt:not(.is-current):hover{color:#fff;background:rgba(255,255,255,.08)}} 48/* In the desktop bar the toggle is words only until there is room for the 49 icons; the sheet always shows them. The bar's divider is redundant beside 50 the toggle's own outline, so it gives its 21px back. */ 51.gnav-bar .gnav-switch__icon{display:none} 52.gnav-bar .gnav-switch__opt{padding:5px 12px} 53.gnav-left:has(>.gnav-switch)>.gnav-divider{display:none} 54@media(min-width:1400px){.gnav-bar .gnav-switch__icon{display:inline-flex}.gnav-bar .gnav-switch__opt{padding:5px 13px 5px 11px}} 55</style>
55<script>(function(){if(window.readerTrack)return;var pageId=(self.crypto&&crypto.randomUUID)?crypto.randomUUID():String(Math.random()).slice(2);window.readerTrack=function(event,properties){try{if(navigator.webdriver)return;var props=Object.assign({},properties||{},{page_id:pageId});var body=JSON.stringify({event:event,path:location.pathname,properties:props});if(body.length>4096)return;if(!navigator.sendBeacon||!navigator.sendBeacon('/api/product-event',new Blob([body],{type:'application/json'})))fetch('/api/product-event',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:body}).catch(function(){});}catch(e){}};var sentHits={};if(typeof document!=='undefined')document.addEventListener('click',function(e){try{var t=e.target&&e.target.closest&&e.target.closest('a[href],button');if(!t)return;var hit=t.closest('[data-search-hit]'),box=hit&&hit.closest('[data-search-id]');if(!box)return;var sid=box.getAttribute('data-search-id'),res=hit.getAttribute('data-search-hit'),k=sid+':'+res;if(sentHits[k])return;sentHits[k]=1;readerTrack('search_result_clicked',{search_id:sid,surface:box.getAttribute('data-search-surface'),result:res,rank:parseInt(hit.getAttribute('data-search-rank'),10)});}catch(x){}},true);function readerAnnounce(msg){try{var live=document.getElementById('reader-copy-status');if(!live){live=document.createElement('span');live.id='reader-copy-status';live.className='sr-only';live.setAttribute('role','status');live.setAttribute('aria-live','polite');document.body.appendChild(live);}live.textContent=msg;}catch(e){}}window.readerCopyLink=function(button,url,kind,props){readerTrack(kind+'_share_clicked',props);function failed(){readerTrack(kind+'_link_copy_failed',props);if(button.type!=='submit')button.textContent='Copy unavailable';readerAnnounce('Could not copy the link.');}try{if(!navigator.clipboard){failed();return;}navigator.clipboard.writeText(url).then(function(){readerTrack(kind+'_link_copied',props);if(button.type!=='submit')button.textContent='Copied';readerAnnounce('Link copied.');},failed);}catch(e){failed();}};})();</script>
55<script>(function(){if(!window.readerTrack)return;var P=[["library","\/(?:library\/?)?"],["author_index","\/library\/authors\/?"],["author","\/library\/authors\/[a-z0-9][a-z0-9-]*\/?"],["excerpt","\/library\/[a-z0-9][a-z0-9-]*\/excerpt\/?"],["download_ready","\/library\/[a-z0-9][a-z0-9-]*\/download\/ready\/?"],["settings","\/(?:settings|account)\/?"],["settings_ai","\/settings\/ai\/?"],["settings_legal","\/settings\/legal\/?"],["legal_terms","\/legal\/terms\/?"],["legal_privacy","\/legal\/privacy\/?"],["legal_accept","\/legal\/accept\/?"],["community","\/community\/?"],["help","\/help\/?"],["feedback","\/(?:account\/)?feedback\/?"],["learning_paths","\/learning-paths\/?"],["membership","\/(?:account\/)?membership\/?"],["accessibility","\/accessibility\/?"],["tutor","\/tutor\/?"],["charlotte_cos","\/charlotte-chief-of-staff\/?"]];var p=location.pathname,k=null;for(var i=0;i<P.length;i++){if(new RegExp('^(?:'+P[i][1]+')$').test(p)){k=P[i][0];break;}}if(!k)return;if(k==='library'){try{var q=new URLSearchParams(location.search).get('q');if(q&&q.trim())k='library_search';}catch(e){}}readerTrack('page_viewed',{page:k});})();</script>
55<script src="/vendor/datastar-aliased.js?v=98df708f" type="module"></script>
55<meta content="noindex, nofollow" name="robots"></head><body><main class="auth auth--suite"><aside aria-label="IT Revolution membership apps" class="authsuite"><div class="authsuite__inner"><p class="authsuite__eyebrow">One account · every format</p><h2>Your books, talks, and coursesâtogether.</h2><p class="authsuite__lede">Sign in once to keep your place across the IT Revolution membership. Your library follows you from reading to watching and back again.</p><div class="authsuite__apps"><a class="authsuite__app" href="https://reader.itrevolution.com/library"><span aria-hidden="true" class="authsuite__app-mark"><svg aria-hidden="true" fill="none" focusable="false" height="19" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.8" viewBox="0 0 16 16" width="19" xmlns="http://www.w3.org/2000/svg"><path d="M2.5 3h3.9A1.6 1.6 0 0 1 8 4.6v8.6a1.4 1.4 0 0 0-1.4-1H2.5z"></path><path d="M13.5 3H9.6A1.6 1.6 0 0 0 8 4.6v8.6a1.4 1.4 0 0 1 1.4-1h4.1z"></path></svg></span><span><strong>Reader</strong><small>Books, audiobooks, papers & journals</small></span><span aria-hidden="true" class="authsuite__arrow">â</span></a><a class="authsuite__app" href="https://videos.itrevolution.com"><span aria-hidden="true" class="authsuite__app-mark authsuite__app-mark--video"><svg aria-hidden="true" fill="none" focusable="false" height="19" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.8" viewBox="0 0 16 16" width="19" xmlns="http://www.w3.org/2000/svg"><rect height="9.6" rx="2.2" width="12" x="2" y="3.2"></rect><path d="M6.9 6.4 10.2 8 6.9 9.6z"></path></svg></span><span><strong>Video Library</strong><small>Conference talks & immersion courses</small></span><span aria-hidden="true" class="authsuite__arrow">â</span></a></div><p class="authsuite__note">Reader beta access is currently by invitation. Existing Video Library access continues unchanged.</p></div></aside><section aria-label="Sign in" class="auth__form"><a aria-label="IT Revolution home" class="auth__logo foot-logo" href="https://itrevolution.com"></a><div class="auth__card"><div class="authicon authicon--grad"><svg aria-hidden="true" fill="none" focusable="false" height="26" stroke="#06121a" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.8" viewBox="0 0 24 24" width="26" xmlns="http://www.w3.org/2000/svg"><rect height="14" rx="2" width="18" x="3" y="5"></rect><path d="M3 7l9 6 9-6"></path></svg></div><h1>Sign in or create your account</h1><p class="auth__lead">Enter your email and we'll send a secure sign-in link. No password to remember â the same link creates your account if you're new.</p><form action="/auth/request-link" method="post"><input name="next" type="hidden" value="https://videos.itrevolution.com"><label class="label" for="auth-email">Email</label><div class="authfield"><div class="field"><svg aria-hidden="true" fill="none" focusable="false" height="17" stroke="var(--faint)" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.9" viewBox="0 0 24 24" width="17" xmlns="http://www.w3.org/2000/svg"><rect height="14" rx="2" width="18" x="3" y="5"></rect><path d="M3 7l9 6 9-6"></path></svg><input autocomplete="email" autofocus id="auth-email" inputmode="email" name="email" placeholder="[email protected]" required spellcheck="false" type="email"></div></div><button class="btn btn-ink btn-ink--block" type="submit">Email me a sign-in link</button></form><div class="orrule"><span></span><em>or</em><span></span></div><div class="oauth"><a class="oauth__btn" href="#" id="oauth-google"><svg aria-hidden="true" focusable="false" height="17" viewBox="0 0 48 48" width="17" xmlns="http://www.w3.org/2000/svg"><path d="M43.6 20.5H42V20H24v8h11.3C33.7 32.4 29.3 35 24 35c-6.6 0-12-5.4-12-12s5.4-12 12-12c3.1 0 5.9 1.2 8 3.1l5.7-5.7C34.5 5.1 29.5 3 24 3 12.9 3 4 11.9 4 23s8.9 20 20 20 20-9 20-20c0-1.3-.1-2.3-.4-3.5z" fill="#FFC107"></path><path d="M6.3 14.7l6.6 4.8C14.7 15.1 19 12 24 12c3.1 0 5.9 1.2 8 3.1l5.7-5.7C34.5 5.1 29.5 3 24 3 16.3 3 9.7 7.3 6.3 14.7z" fill="#FF3D00"></path><path d="M24 43c5.2 0 9.9-2 13.4-5.2l-6.2-5.2C29.2 34.5 26.7 35 24 35c-5.3 0-9.7-2.6-11.3-7.1l-6.5 5C9.6 39.6 16.2 43 24 43z" fill="#4CAF50"></path><path d="M43.6 20.5H42V20H24v8h11.3c-.8 2.2-2.2 4.1-4.1 5.6l6.2 5.2C41.5 36.9 44 31.2 44 24c0-1.3-.1-2.3-.4-3.5z" fill="#1976D2"></path></svg>Continue with Google</a><a class="oauth__btn" href="#" id="oauth-github"><svg aria-hidden="true" fill="currentColor" focusable="false" height="17" viewBox="0 0 24 24" width="17" xmlns="http://www.w3.org/2000/svg"><path d="M12 2C6.48 2 2 6.58 2 12.25c0 4.53 2.87 8.37 6.84 9.73.5.09.68-.22.68-.49 0-.24-.01-.87-.01-1.71-2.78.62-3.37-1.37-3.37-1.37-.45-1.18-1.11-1.49-1.11-1.49-.91-.63.07-.62.07-.62 1 .07 1.53 1.06 1.53 1.06.89 1.56 2.34 1.11 2.91.85.09-.66.35-1.11.63-1.36-2.22-.26-4.56-1.14-4.56-5.07 0-1.12.39-2.03 1.03-2.75-.1-.26-.45-1.3.1-2.71 0 0 .84-.27 2.75 1.05a9.3 9.3 0 0 1 5 0c1.91-1.32 2.75-1.05 2.75-1.05.55 1.41.2 2.45.1 2.71.64.72 1.03 1.63 1.03 2.75 0 3.94-2.34 4.81-4.57 5.06.36.32.68.94.68 1.9 0 1.37-.01 2.47-.01 2.81 0 .27.18.59.69.49A10.02 10.02 0 0 0 22 12.25C22 6.58 17.52 2 12 2z"></path></svg>Continue with GitHub</a><button aria-controls="phone-panel" aria-expanded="false" class="oauth__btn oauth__btn--wide" id="phone-toggle" type="button"><svg aria-hidden="true" fill="none" focusable="false" height="17" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.9" viewBox="0 0 24 24" width="17" xmlns="http://www.w3.org/2000/svg"><rect height="19" rx="2" width="10" x="7" y="2.5"></rect><path d="M10 5h4M11 18.5h2"></path></svg>Continue with phone</button></div><div class="phoneauth" hidden id="phone-panel"><p class="phoneauth__intro">Use a phone number youâve already linked to your membership.</p><form id="phone-send-form"><label class="label" for="phone-number">Mobile number</label><div class="authfield"><div class="field phonefield"><select aria-label="Country or region" autocomplete="tel-country-code" class="phonefield__country" id="phone-country"><option value="US">US +1</option><option value="CA">CA +1</option></select><input aria-describedby="phone-number-hint" autocomplete="tel-national" id="phone-number" inputmode="tel" placeholder="(503) 555-0123" required type="tel"></div><p class="phoneauth__hint" id="phone-number-hint">Spaces and punctuation are optional.</p></div><button class="btn btn-ink btn-ink--block" type="submit">Text me a code</button></form><form hidden id="phone-code-form"><label class="label" for="phone-code">Six-digit code</label><div class="authfield"><div class="field"><input autocomplete="one-time-code" id="phone-code" inputmode="numeric" maxlength="6" pattern="[0-9]{6}" placeholder="123456" required type="text"></div></div><button class="btn btn-ink btn-ink--block" type="submit">Sign in</button></form><div id="phone-login-recaptcha"></div><p aria-live="polite" class="phoneauth__msg" hidden id="phone-msg" role="status"></p><p class="phoneauth__legal">Available initially for U.S. and Canadian numbers. By continuing, you agree to re
55ceive a one-time verification text. Message and data rates may apply. Google processes the number for fraud and abuse prevention.</p></div><p class="field-msg" hidden id="fb-err" role="alert"></p><p class="auth__cc">Creative Commons papers & journals are free to download without an account.</p>
55<script type="module">import{initializeApp}from'https://www.gstatic.com/firebasejs/10.12.2/firebase-app.js';import{getAuth,GoogleAuthProvider,GithubAuthProvider,signInWithPopup,isSignInWithEmailLink,signInWithEmailLink,RecaptchaVerifier,signInWithPhoneNumber,deleteUser,signOut}from'https://www.gstatic.com/firebasejs/10.12.2/firebase-auth.js';import{bindNorthAmericanPhoneInput}from'/assets/phone-input-v1.js';const auth=getAuth(initializeApp({"apiKey":"AIzaSyCSo-EoqwtlFvKLkNKJwMvASm0dyo9eEvs","authDomain":"video-library-ef6bb.firebaseapp.com","projectId":"video-library-ef6bb","appId":"1:13268437476:web:1f15cf14df411e6782dff1"}));if(new URLSearchParams(location.search).get('phone_test')==='1')auth.settings.appVerificationDisabledForTesting=true;const NEXT="https://videos.itrevolution.com";const KEY='ereader-signin-email';function err(m){var e=document.getElementById('fb-err');if(e){e.textContent=m||'Sign-in failed.';e.hidden=false;}}async function finish(cred){const t=await cred.user.getIdToken();const r=await fetch('/auth/firebase',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({idToken:t,next:NEXT})});const j=await r.json().catch(function(){return{}});if(r.ok&&j.redirect){localStorage.removeItem(KEY);location=j.redirect;}else if(j.error==='email-unverified'){err('That account\u2019s email isn\u2019t verified \u2014 use the email link instead.');}else{err('The server rejected the sign-in.');}}const f=document.querySelector('form[action="/auth/request-link"]');if(f)f.addEventListener('submit',function(){const email=(document.getElementById('auth-email')||{}).value||'';if(email)localStorage.setItem(KEY,email);});for(const[id,P]of[['oauth-google',GoogleAuthProvider],['oauth-github',GithubAuthProvider]]){const b=document.getElementById(id);if(b)b.addEventListener('click',function(ev){ev.preventDefault();signInWithPopup(auth,new P()).then(finish).catch(function(){err('That sign-in could not be completed.');});});}const pt=document.getElementById('phone-toggle'),pp=document.getElementById('phone-panel');const ps=document.getElementById('phone-send-form'),pc=document.getElementById('phone-code-form');const pn=document.getElementById('phone-number'),pr=document.getElementById('phone-country'),code=document.getElementById('phone-code');const pm=document.getElementById('phone-msg');let phoneConfirmation=null,phoneVerifier=null;const phoneInput=pn&&pr?bindNorthAmericanPhoneInput(pn,pr):null;function pmsg(m,bad){if(pm){pm.textContent=m;pm.hidden=false;pm.classList.toggle('field-msg',!!bad);}}function perr(e){const c=e&&e.code;if(c==='phone/input-invalid'||c==='auth/invalid-phone-number')return'Enter a valid 10-digit mobile number.';if(c==='auth/too-many-requests'||c==='auth/quota-exceeded')return'Too many attempts right now. Please use your email link or try again later.';if(c==='auth/invalid-verification-code')return'That code does not match. Check the message and try again.';return'We could not verify that number. Please try again or use your email link.';}function clearVerifier(){if(phoneVerifier){phoneVerifier.clear();phoneVerifier=null;}}if(pt&&pp)pt.addEventListener('click',function(){const open=pp.hidden;pp.hidden=!open;pt.setAttribute('aria-expanded',String(open));if(open&&pn)pn.focus();});if(ps)ps.addEventListener('submit',async function(ev){ev.preventDefault();pmsg('Sending your codeâ¦',false);try{const e164=phoneInput.e164Value();clearVerifier();phoneVerifier=new RecaptchaVerifier(auth,'phone-login-recaptcha',{size:'invisible'});phoneConfirmation=await signInWithPhoneNumber(auth,e164,phoneVerifier);ps.hidden=true;pc.hidden=false;pmsg('Code sent to '+phoneInput.displayValue()+'. It may take a moment to arrive.',false);if(code)code.focus();}catch(e){clearVerifier();pmsg(perr(e),true);}});if(pc)pc.addEventListener('submit',async function(ev){ev.preventDefault();pmsg('Checking your codeâ¦',false);try{const cred=await phoneConfirmation.confirm(code.value.trim());if(!cred.user.email||!cred.user.emailVerified){try{await deleteUser(cred.user);}catch(_e){}try{await signOut(auth);}catch(_e){}pc.hidden=true;ps.hidden=false;pmsg('That number is not linked to a membership yet. Sign in by email, then add it in Settings.',true);return;}await finish(cred);}catch(e){pmsg(perr(e),true);}});</script>
55</div><p class="auth__foot">Passwordless by design â we never ask for a password, so there is nothing for you to remember and nothing here worth stealing.</p></section></main></body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.