<xmp>.</xmp> <!-- framebuster code ends here --> <!-- for ng4 --> <app-root> <div class="loading-ball-anim"> <div class="ball" style="background-color:#4285F5"></div> <div class="ball" style="background-color:#EA4436;animation-delay:.25s" ></div> <div class="ball" style="background-color:#FBBD06;animation-delay:.5s" ></div> <div class="ball" style="background-color:#34A952;animation-delay:.75s" ></div> </div> </app-root> <script> setTimeout(function() { document.querySelector('.loading-ball-anim').classList.add('start'); }, 100); </script> <!-- for angularJS --> <div id="app" class="loading"> <div class="main-ctrl" ng-controller="main as mainCtrl"> <ui-view class="main-view-container"></ui-view> </div> </div> <div id="gated-signin" class="boxed-takeover"> <div id="signinMethod" class="box auth-box"> <h1>Welcome!</h1> <p>Please sign in to get started.</p> <button class="auth blue" onclick="signIn()"> Continue with Google </button> <button onclick="signInStep('enterEmail')" class="outline auth"> Continue with email </button> <div class="privacy-policy"> <a class="privacy-link" target="_blank" href="https://policies.google.com/privacy" >Privacy Policy</a > </div> </div> <div id="enterEmail" class="box hidden auth-box"> <h1>Sign in with email</h1> <div class="input-container"> <input type="email" id="emailAddress" /> <label>Enter email:</label> <div class="error-container hidden" id="invalid-email"> <i class="material-icons-extended">info</i> <span>Enter a valid email address</span> </div> </div> <div class="sign-in-buttons"> <div class="auth link"> <a onclick="signInStep('signinMethod')"> Back </a> </div> <button class="auth blue" onclick="checkEmail()">Next</button> </div> <div class="privacy-policy"> <a class="privacy-link" target="_blank" href="https://policies.google.com/privacy" >Privacy Policy</a > </div> </div> <div id="hasGoogleAccount" class="box hidden auth-box"> <h1>Sign in with Google</h1> <p> The email you entered is associated with a Google account. Sign in with Google to continue. </p> <div class="sign-in-buttons"> <div class="auth link"> <a onclick="signInStep('enterEmail')"> Back </a> </div> <button class="auth blue" onclick="signIn()"> Sign in with Google </button> </div> <div class="privacy-policy"> <a class="privacy-link" target="_blank" href="https://policies.google.com/privacy" >Privacy Policy</a > </div> </div> <div id="enterPassword" class="box hidden auth-box"> <h1>Sign in</h1> <p id="loginEmail" class="email"></p> <div class="input-container" id="password-container"> <label>Password:</label> <input type="password" id="loginPassword" required /> <div id="no-password" class="error-container hidden"> <i class="material-icons-extended">info</i> <span>Enter password</span> </div> <div id="invalid-password" class="error-container hidden"> <i class="material-icons-extended">info</i> <span >Wrong password. Try again or click Forgot password to reset it.</span > </div> </div> <div class="error-takeover hidden" id="login-retry-limit"> <div> <i class="material-icons-extended">report_problem</i> <h2>Too many failed attempts</h2> </div> <p class="error-message"> Unavailable because of too many failed attempts to sign in. Try again in a few minutes. </p> </div> <div class="sign-in-buttons"> <div class="auth link"> <a onclick="signInStep('resetPassword')"> Forgot Password? </a> </div> <div class="auth link right-anchor"> <a onclick="signInStep('enterEmail')"> Back </a> </div> <button class="auth blue" onclick="signInEmailPassword()" id="password-sign-in" > Next </button> </div> <div class="privacy-policy"> <a class="privacy-link" target="_blank" href="https://policies.google.com/privacy" >Privacy Policy</a > </div> </div> <div id="createAccount" class="box auth-box hidden"> <h1>Create Account</h1> <div class="input-container"> <label>Email Address:</label> <input type="email" id="accountEmail" disabled /> <div id="email-in-use" class="error-container hidden"> <i class="material-icons-extended">info</i> <span >This email is already in use. Please go back and select a different email</span > </div> </div> <div class="input-container"> <label>Password:</label> <input type="password" id="accountPassword" /> <div id="create-account-no-password" class="error-container hidden"> <i class="material-icons-extended">info</i> <span>Enter password</span> </div> <div id="weak-password" class="error-container hidden"> <i class="material-icons-extended">info</i> <span >Use 6 or more characters with a mix of letters, numbers & symbols</span > </div> </div> <div class="input-pair"> <div class="input-container"> <label>First Name:</label> <input type="text" id="accountFirstName" /> <div id="no-first-name" class="error-container hidden"> <i class="material-icons-extended">info</i> <span>Enter first name</span> </div> </div> <div class="input-container"> <label>Last Name:</label> <input type="text" id="accountLastName" /> <div id="no-last-name" class="error-container hidden"> <i class="material-icons-extended">info</i> <span>Enter last name</span> </div> </div> </div> <div class="sign-in-buttons"> <div class="auth link"> <a onclick="signInStep('enterEmail')"> Back </a> </div> <button class="auth blue" onclick="createAccount()">Next</button> </div> <div class="privacy-policy"> <a class="privacy-link" target="_blank" href="https://policies.google.com/privacy" >Privacy Policy</a > </div> </div> <div id="accountCreationConfirmation" class="box auth-box hidden"> <p> An email has been sent to <span id="emailConfirmation" class="email-text"></span>. Click the confirmation link in that email to verify your account. </p> <button class="auth blue" onclick="resendAccountConfirmation()"> Resend email </button> <button class="auth blue" onclick="accountCreationComplete()"> Done </button> <p id="confirmation-resent" class="hidden"> Confirmation email resent </p> <div class="privacy-policy"> <a class="privacy-link" target="_blank" href="https://policies.google.com/privacy" >Privacy Policy</a > </div> </div> <div id="resetPassword" class="box auth-box hidden"> <h1>Reset password</h1> <p> If you’ve forgotten your password, you can request to have an email sent with a link to create a new one. </p> <div class="sign-in-buttons"> <div class="auth link"> <a onclick="signInStep('enterPassword')"> Back </a> </div> <button class="auth blue" onclick="resetPassword()"> Reset Password </button> </div> <div class="privacy-policy"> <a class="privacy-link" target="_blank" href="https://policies.google.com/privacy" >Privacy Policy</a > </div> </div> <div id="postReset" class="box auth-box hidden"> <h1>Reset password</h1> <p> We've sent an email to <span id="email-text" class="email-text"></span>. Follow the instructions in that email to reset your password. </p> <div class="sign-in-buttons"> <div class="auth link"> <a onclick="signInStep('signinMethod')"> Back </a> </div> </div> <div class="privacy-policy"> <a class="privacy-link" target="_blank" href="https://policies.google.com/privacy" >Privacy Policy</a > </div> </div> </div> <div id="gated-signout" class="boxed-takeover"> <div class="box"> <h1>Forbidden</h1> <p>Sorry, you do not have permission to access this resource.</p> <button onclick="signOut()">Sign out</button> </div> </div> <div id="general-error" class="boxed-takeover"> <div class="box"> <h1>We'll be right back</h1> <p> We are having temporary difficulties, and are working to fix the issue. </p> </div> </div> <div id="cookie-error" class="boxed-takeover"> <div class="box"> <h1>Cookies are disabled</h1> <p> Cookies are required in order to sign in. Please enable cookies in your browser's settings and disable any adblockers. Then refresh this page. </p> </div> </div> <div id="auth-error" class="boxed-takeover"> <div class="box"> <h1>Error authenticating user</h1> <p> There was an error during authentication. Please refresh to try again. </p> </div> </div> <div id="offline-error" class="boxed-takeover"> <div class="box"> <h1>You're currently offline</h1> <p> Refresh the page when your connection is restored to return to the app. </p> </div> </div> <script defer src="/scripts/app.preload.b9736f16.js" ></script> <script> window.templateBundleMap = { platform: { "default": { script: "/scripts/app.platform.default.d5d0c567.js", style: "/styles/app.platform.default.780db3c4.css", }, "devfest": { script: "/scripts/app.platform.devfest.19439e2e.js", style: "/styles/app.platform.devfest.9a069068.css", }, "eduonair": { script: "/scripts/app.platform.eduonair.2e8a414b.js", style: "/styles/app.platform.eduonair.501a5548.css", }, "cloud": { script: "/scripts/app.platform.cloud.a3987863.js", style: "/styles/app.platform.cloud.1156bee2.css", }, }, event: { "default": { script: "/scripts/app.event.default.3cf3ccee.js", style: "/styles/app.event.default.3175cd49.css", }, "cloud_2017": { script: "/scripts/app.event.cloud_2017.b1534c7e.js", style: "/styles/app.event.cloud_2017.cfad198e.css", }, "cloud_2018": { script: "/scripts/app.event.cloud_2018.7599b302.js", style: "/styles/app.event.cloud_2018.44d3e09a.css", }, "cloud_summit_2018": { script: "/scripts/app.event.cloud_summit_2018.c8c0eb0e.js", style: "/styles/app.event.cloud_summit_2018.618c1cca.css", }, "cloud_transform_2018": { script: "/scripts/app.event.cloud_transform_2018.966a859d.js", style: "/styles/app.event.cloud_transform_2018.44d13652.css", }, "cloud_data_ai_2018": { script: "/scripts/app.event.cloud_data_ai_2018.8ac1eaf5.js", style: "/styles/app.event.cloud_data_ai_2018.bf11eb73.css", }, "devfest_2018": { script: "/scripts/app.event.devfest_2018.5d26ce92.js", style: "/styles/app.event.devfest_2018.548da493.css", }, "chrome_2018": { script: "/scripts/app.event.chrome_2018.8ecc9155.js", style: "/styles/app.event.chrome_2018.ed63b5ff.css", }, "cloud_q1_2019": { script: "/scripts/app.event.cloud_q1_2019.306730a7.js", style: "/styles/app.event.cloud_q1_2019.d9069726.css", }, "global_events_gml_2019": { script: "/scripts/app.event.global_events_gml_2019.7762ee7a.js", style: "/styles/app.event.global_events_gml_2019.fb6a40ff.css", }, "single_session": { script: "/scripts/app.event.single_session.10d2df39.js", style: "/styles/app.event.single_session.14af763a.css", }, }, angularJsDependencies: "/scripts/dependencies.3ee3557d.js" } </script> <!-- Google Tag Manager --> <noscript ><iframe src="//www.googletagmanager.com/ns.html?id=GTM-N4VX3K7" height="0" width="0" style="display:none;visibility:hidden" ></iframe ></noscript> <script> (function(w, d, s, l, i) { w[l] = w[l] || []; w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' }); var f = d.getElementsByTagName(s)[0], j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src = '//www.googletagmanager.com/gtm.js?id=' + i + dl; f.parentNode.insertBefore(j, f); })(window, document, 'script', 'dataLayer', 'GTM-N4VX3K7'); </script> <!-- End Google Tag Manager --> <noscript> <p style="margin:100px 6px;text-align:center;"> This app requires JavaScript <nobr>to function.</nobr><br /> Please enable javascript and reload <nobr>the page.</nobr> </p> </noscript> <div class="hidden" id="bad-browser"> <div id="bad-browser-shade"></div> <div id="bad-browser-text"> <span id="warning-icon" ><i class="material-icons-extended">warning</i></span > <h2> Your browser<br /> is not supported </h2> <p> For the full experience, use Google Chrome, Firefox, Safari or Edge. </p> </div> </div> <div class="container hidden" id="cookie-bar"> <span >This site uses cookies from Google to deliver services and to analyze traffic</span > <div class="buttons"> <a href="https://policies.google.com/technologies/cookies" rel="noopener" target="_blank" >See details</a > <button class="confirm">OK, Got it</button> </div> </div> <script> // Show bad browser modal for IE and Opera browsers. Separated into // independent code block to prevent other script errors from blocking. // Internet Explorer 6-11 var isIE = !!document.documentMode; // Opera browser var isOpera = /(Opera|OPR\/)/g.test(window.navigator.userAgent); if (isIE || isOpera) { document.getElementById('bad-browser').className = ''; document.body.className += ' unsupported'; } </script> <script> var cookieBarState = false; try { cookieBarState = window.localStorage.getItem('cookiebar_state'); } catch (e) { console.log('Failed to load cookie bar state'); } if (!cookieBarState) { var cookieBarEl = document.querySelector('#cookie-bar'); if (cookieBarEl) { cookieBarEl.classList.remove('hidden'); var button = cookieBarEl.querySelector('.confirm'); function buttonClickHandler(event) { try { window.localStorage.setItem('cookiebar_state', 'True'); } catch (e) { console.log('Failed to save cookiebar state'); } var cookieBarEl = document.querySelector('#cookie-bar'); cookieBarEl.classList.add('hidden'); } button.addEventListener('click', buttonClickHandler); } } function hideTempElements() { const elementIdsToHide = [ 'invalid-password', 'invalid-email', 'no-password', 'email-in-use', 'weak-password', 'create-account-no-password', 'no-first-name', 'no-last-name', 'login-retry-limit', 'confirmation-resent', ]; elementIdsToHide.forEach(id => { document.getElementById(id).classList.add('hidden'); }); } function signInStep(stepName) { hideTempElements(); document .getElementById('password-container') .classList.remove('hidden'); document.getElementById('password-sign-in').disabled = false; [ 'signinMethod', 'enterEmail', 'hasGoogleAccount', 'enterPassword', 'createAccount', 'accountCreationConfirmation', 'resetPassword', 'postReset', ] .filter(elementId => elementId !== stepName) .forEach(elementId => document.getElementById(elementId).classList.add('hidden') ); document.getElementById(stepName).classList.remove('hidden'); } function checkEmail() { document.getElementById('invalid-email').classList.add('hidden'); const enteredEmail = document.getElementById('emailAddress').value; if (/^.*@google\.com$/i.test(enteredEmail)) { signInStep('hasGoogleAccount'); } else { const emailRegex = /.+@.+\..+/; if (!enteredEmail || !emailRegex.test(enteredEmail)) { document.getElementById('invalid-email').classList.remove('hidden'); return; } window.firebase .auth() .fetchSignInMethodsForEmail(enteredEmail) .then(signinOptions => { if (signinOptions.length === 0) { document.getElementById('accountEmail').value = enteredEmail; signInStep('createAccount'); } else if (signinOptions.includes('google.com')) { signInStep('hasGoogleAccount'); } else { document.getElementById( 'loginEmail' ).textContent = enteredEmail; signInStep('enterPassword'); } }) .catch(error => console.error(error)); } } function signInEmailPassword() { document.getElementById('invalid-password').classList.add('hidden'); document.getElementById('no-password').classList.add('hidden'); document.getElementById('password-sign-in').disabled = false; const password = document.getElementById('loginPassword').value; if (!password) { document.getElementById('no-password').classList.remove('hidden'); return; } window.firebase .auth() .signInWithEmailAndPassword( document.getElementById('loginEmail').textContent, document.getElementById('loginPassword').value ) .then(() => { window.location.reload(true); }) .catch(error => { if (error.code === 'auth/wrong-password') { document .getElementById('invalid-password') .classList.remove('hidden'); console.debug('wrong password'); } else if (error.code === 'auth/too-many-requests') { document .getElementById('password-container') .classList.add('hidden'); document .getElementById('login-retry-limit') .classList.remove('hidden'); document.getElementById('password-sign-in').disabled = true; } else { console.error(error); } }); } function createAccount() { hideTempElements(); const accountEmail = document.getElementById('accountEmail').value; const accountPassword = document .getElementById('accountPassword') .value.trim(); const accountFirstName = document .getElementById('accountFirstName') .value.trim(); const accountLastName = document .getElementById('accountLastName') .value.trim(); document.getElementById('accountPassword').value = accountPassword; document.getElementById('accountFirstName').value = accountFirstName; document.getElementById('accountLastName').value = accountLastName; if (!accountPassword) { document .getElementById('create-account-no-password') .classList.remove('hidden'); } if (!accountFirstName) { document.getElementById('no-first-name').classList.remove('hidden'); } if (!accountLastName) { document.getElementById('no-last-name').classList.remove('hidden'); } if (!accountPassword || !accountFirstName || !accountLastName) return; window.firebase .auth() .createUserWithEmailAndPassword(accountEmail, accountPassword) .then(resp => { resp.user.updateProfile({ displayName: `${accountFirstName} ${accountLastName}`, }); document.getElementById( 'emailConfirmation' ).textContent = accountEmail; sendAccountConfirmation({ url: window.location.href }); signInStep('accountCreationConfirmation'); }) .catch(error => { if (error.code === 'auth/weak-password') { document .getElementById('weak-password') .classList.remove('hidden'); } else if (error.code === 'auth/email-already-in-use') { document .getElementById('email-in-use') .classList.remove('hidden'); } else { console.error(error); } }); } function sendAccountConfirmation() { window.firebase.auth().currentUser.sendEmailVerification({ url: window.location.href }); } function resendAccountConfirmation() { window.firebase.auth().currentUser.sendEmailVerification({ url: window.location.href }); document .getElementById('confirmation-resent') .classList.remove('hidden'); } function accountCreationComplete() { location.reload(true); } function resetPassword() { const email = document.getElementById('loginEmail').textContent; window.firebase .auth() .sendPasswordResetEmail(email, { url: window.location.origin }) .then(() => { this.document.getElementById('email-text').textContent = email; this.signInStep('postReset'); }); } </script> </body> </html>