CINXE.COM
DevFest OnAir 2018
<!DOCTYPE html> <html> <head> <script type="text/javascript"> window.dataLayer = window.dataLayer || []; function glueCookieNotificationBarLoaded() { // Google Tag Manager (internal) (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= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-P9X8WL8'); // End Google Tag Manager // Google Tag Manager (instance) (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= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-PNQG5VS'); // End Google Tag Manager } </script> <link rel="icon" href="/images/shared/platform/favicon.ico" /> <meta name="twitter:card" content="summary" /> <title>DevFest OnAir 2018</title> <meta property="og:title" content="DevFest OnAir 2018" /> <meta name="description" content="Join us for DevFest onAir '18, a global digital conference highlighting the best of this year's DevFest series. By tuning in, you'll see our highlight reel, plus exclusive content only available during the live webinar!" /> <meta property="og:description" content="Join us for DevFest onAir '18, a global digital conference highlighting the best of this year's DevFest series. By tuning in, you'll see our highlight reel, plus exclusive content only available during the live webinar!" /> <meta property="og:image" content="https://devfest.withgoogle.com/api/assets?path=/gs/gweb-gc-gather-production.appspot.com/files/L2FwcGhvc3RpbmdfZ2xvYmFsL2Jsb2JzL0FFbkIyVW9ERW1YQTFoXzB0XzA2b204Sy14SWpleDd1ZkNSSVJ2YVF6ZThUZHp5c3BrMV8wcFFpYUFWU09Mc2Y5ZFBBRWYyUHhlb1ctQUk4UmxwNnE5OEhDeGFCSlpLUTA4VE1WSVkxVllfaW4wY0ZuQWdtelRJLndfNUtSekpYSVotMHRQVjk" /> <meta property="og:image:alt" content="image"/> <meta name="robots" content="index,follow" /> <meta charset="utf-8" /> <meta content="initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no, width=device-width" name="viewport" /> <!-- Preemptively initiating a connection --> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <!-- Load Google Sans Text for Cookie bar --> <link rel="preload" href="https://fonts.googleapis.com/css2?family=Google+Sans+Text:wght@400&display=swap" as="style"> <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Google+Sans+Text:wght@400&display=swap"> <link href="//fonts.googleapis.com/css?family=Roboto+Mono|Google+Sans:400,500,600,700|Roboto:100,200,300,400,500,600,700&lang=en" rel="stylesheet" /> <link href="https://fonts.googleapis.com/css2?family=Google+Material+Icons:wght@400;500;700" rel="stylesheet"> <base href="/" /> <link rel="canonical" href="https://devfest.withgoogle.com/events/devfestonair18" /> <!-- Cookie bar styles from CDN --> <link href="https://www.gstatic.com/glue/cookienotificationbar/cookienotificationbar.min.css" rel="stylesheet"> <style> html.show-gated-signin, .show-gated-signin body, html.show-gated-signout, .show-gated-signout body, html.show-user-upgrade-error, .show-user-upgrade-error body, html.show-private-error, .show-private-error body, html.show-general-error, .show-general-error body, html.show-offline-error, .show-offline-error body, html.show-cookie-error, .show-cookie-error body, html.show-auth-error, .show-auth-error body { margin: 0px; height: 100%; min-width: max(100%, 360px); display: flex; flex-direction: column; } @media screen and (max-width: 359px) { html.show-gated-signin, .show-gated-signin body, html.show-gated-signout, .show-gated-signout body, html.show-user-upgrade-error, .show-user-upgrade-error body, html.show-private-error, .show-private-error body, html.show-general-error, .show-general-error body, html.show-offline-error, .show-offline-error body, html.show-cookie-error, .show-cookie-error body, html.show-auth-error, .show-auth-error body { min-width: 360px; overflow-x: auto; } } .show-gated-signin #app, .show-gated-signin app-root, .show-gated-signout #app, .show-gated-signout app-root, .show-user-upgrade-error #app, .show-user-upgrade-error app-root, .show-private-error #app, .show-private-error app-root, .show-general-error #app, .show-general-error app-root, .show-offline-error #app, .show-offline-error app-root, .show-auth-error #app, .show-auth-error app-root, .show-cookie-error #app, .show-cookie-error app-root { display: none; } .boxed-takeover { flex: 1; min-width: 100%; background-color: #fafafa; color: #212121; font-family: 'Roboto', sans-serif; display: none; align-items: flex-start; } .show-gated-signin #gated-signin, .show-gated-signout #gated-signout, .show-user-upgrade-error #user-upgrade-error, .show-private-error #private-error, .show-general-error #general-error, .show-offline-error #offline-error, .show-cookie-error #cookie-error, .show-auth-error #auth-error { display: flex; } .boxed-takeover .box { box-sizing: border-box; max-width: 450px; box-shadow: 0 0 4px rgba(0, 0, 0, 0.3); text-align: center; padding: 40px; background-color: #fff; margin: auto; } .boxed-takeover .box.auth-box { width: calc(100% - 240px); max-width: 600px; min-width: 320px; padding-bottom: 24px; transition: padding 0.5s ease-in-out; } .boxed-takeover h1 { font-weight: 400; font-size: 28px; line-height: 34px; margin: 0; } .boxed-takeover p { font-weight: 300; margin: 10px 0 40px 0; font-size: 16px; line-height: 22px; } #private-error.boxed-takeover .box div { font-size: 16px; font-weight: 300; line-height: 22px; margin: 10px 0 40px 0; } .boxed-takeover input { font-size: 16px; padding: 10px 14px; line-height: 22px; font-weight: 400; margin-top: 10px; border: 1px solid #000; } .boxed-takeover button { cursor: pointer; width: 100%; background-color: #3b78e7; color: #fff; outline-offset: 1px; font-size: 16px; padding: 10px 14px; line-height: 22px; font-weight: 500; margin-top: 10px; border: 1px solid #3b78e7; transition: all 0.2s ease-in-out; } .boxed-takeover button:hover { background-color: #000; border-color: #000; } .boxed-takeover button:focus-visible { outline: 2px solid #174EA6; } .boxed-takeover button.button-link { color: #1A73E8; border-color: transparent; background-color: #fff; padding: 15px 24px; } .boxed-takeover button.button-link:hover { color: #185ABC; } .boxed-takeover button.outline { background-color: inherit; color: #1a73e8; border-color: #1a73e8; } .boxed-takeover button.outline:hover { color: #185ABC; border-color: #185ABC; } .boxed-takeover button.auth { border-radius: 4px; font-family: 'Google Sans', 'Arial', sans-serif; } .boxed-takeover button.auth.blue { border-color: #1a73e8; background-color: #1a73e8; border: 2px solid #1a73e8; padding: 15px 24px; width: auto; } .boxed-takeover button.auth.blue:disabled, .boxed-takeover button.auth.blue:disabled:hover { color: #5f6368; background-color: #dbdce0; border-color: #dbdce0; } .boxed-takeover button.auth.blue:hover, .sign-in-buttons button.auth.blue:hover { border-color: #185ABC; background-color: #185ABC; } .boxed-takeover .sign-in-buttons { display: flex; align-items: center; justify-content: flex-end; text-align: left; column-gap: 10px; row-gap: 24px; } .boxed-takeover .sign-in-buttons button { margin: 0px; width: auto; } .boxed-takeover .input-container { display: flex; flex-wrap: wrap; position: relative; } .boxed-takeover .input-container input { border: 2px solid #1a73e8; border-radius: 4px; width: 100%; max-height: 42px; } .boxed-takeover .input-container label { position: absolute; font-size: 12px; top: 4px; padding: 0 4px; left: 22px; background-color: #ffffff; color: #1a73e8; } .boxed-takeover .box .input-pair { display: flex; flex-wrap: wrap; justify-content: space-between; } .boxed-takeover .input-pair .input-container { flex: 0 1 49%; } .boxed-takeover .error-container { text-align: left; color: #D93025; font-size: 12px; font-family: 'Google Sans', sans-serif; display: none; align-items: center; font-weight: 500; margin-top: 0.5em; } .boxed-takeover .error-container { display: flex; } .boxed-takeover .error-container i, .boxed-takeover .error-container i { font-size: 15px; padding-right: 5.5px; text-align: left; } .boxed-takeover .privacy-policy { margin-top: 74px; text-align: center; } .boxed-takeover .privacy-policy .privacy-link { color: #5f6368; font-family: 'Roboto', sans-serif; font-size: 14px; line-height: 22px; text-decoration: none; } #private-error button { padding-bottom: 10px; } #private-error .box { padding-bottom: 40px; } .sign-in-buttons .auth.link { color: #1a73e8; justify-content: center; font-family: 'Google Sans', 'Arial', sans-serif; cursor: pointer; } .sign-in-buttons .auth.right-anchor { margin-left: auto; } /* Align text of "Forgot Password?" button with left side of modal */ .sign-in-buttons .auth.forgot-password button.button-link { margin-left: -24px; } @media (max-width: 768px) { .sign-in-buttons { flex-wrap: wrap; } .sign-in-buttons .auth.right-anchor { flex: 1 } /* Align text of left-anchored "Back" button with left side of modal */ .sign-in-buttons .auth.right-anchor button.button-link { margin-left: -24px; } .sign-in-buttons .auth.forgot-password { order: 1; flex: 1 0 100%; } } .error-takeover { background-color: #fdf7e3; border-radius: 4px; padding: 25px 51px 33px; margin-bottom: 25px; } .error-takeover div { display: flex; align-items: center; padding-bottom: 8px; } .error-takeover div h2 { font-size: 20px; color: #202124; font-family: 'Google Sans', 'Arial', sans-serif; margin: 0; } .error-takeover div i { font-size: 24px; color: #e79c37; padding-right: 22px; } .error-takeover .error-message { text-align: left; margin: 0; } #enterEmail h1 { margin-bottom: 87px; } #signinMethod button, #accountCreationConfirmation button { width: 100%; max-width: 360px; } #accountCreationConfirmation #confirmation-resent { margin: 20px 0 0; } #enterEmail .input-container { margin-bottom: calc(74px - 1.25em); } #enterPassword .input-container { margin-bottom: 73px; } #enterPassword .email { color: #202124; font-family: 'Google Sans', 'Arial', sans-serif; margin-bottom: 43px; } #createAccount h1 { margin-bottom: 75px; } #createAccount .input-container { margin-bottom: 35px; } #createAccount .input-pair { margin-bottom: 68px; } #createAccount .input-pair .input-container { margin-bottom: 0; } @media (max-width: 768px) { #createAccount .input-pair { margin-bottom: 0px; } #createAccount .input-pair .input-container { flex: 0 1 100%; margin-bottom: 35px; } } #hasGoogleAccount h1 { margin-bottom: 58px; } #hasGoogleAccount p { text-align: left; margin-bottom: 120px; } #resetPassword h1, #postReset h1 { margin-bottom: 44px; } #resetPassword p { text-align: left; margin-bottom: 102px; } #postReset p { text-align: left; margin-bottom: 120px; } .email-text { font-weight: 700; } /* loading animation */ .loading-ball-anim { display: flex; flex: 1; justify-content: center; align-items: center; height: 100vh; opacity: 0; transition: opacity 1s; } .loading-ball-anim.start { opacity: 1; } .loading-ball-anim .ball { width: 22px; height: 22px; border-radius: 11px; margin: 0 10px; animation: 2s bounce ease infinite; } @keyframes bounce { 50% { transform: translateY(25px); } } .hidden { display: none !important; } body.unsupported { overflow: hidden; } #bad-browser { position: fixed; } #bad-browser-shade, #bad-browser { bottom: 0; left: 0; position: fixed; right: 0; top: 0; } #bad-browser-shade, #bad-browser-text, #bad-browser { z-index: 999999; } #bad-browser-shade { background: #000; opacity: 0.4; } #bad-browser .google-material-icons { color: #f9bb2d; font-size: 36px; } #bad-browser h2 { font-size: 42px; font-weight: 700; margin-bottom: 32px; padding: 16px 32px 0; font-family: 'Google Sans', 'Arial', sans-serif; } #bad-browser-text { background: #fff; border-radius: 8px; left: 50%; margin-left: -250px; margin-top: -250px; padding: 40px 40px 56px; position: relative; text-align: center; top: 50%; width: 500px; } @media only screen and (max-width: 600px) { .boxed-takeover .box { box-shadow: none; background-color: inherit; padding: 20px; } .boxed-takeover .box.auth-box { width: 100%; max-width: unset; min-width: unset; } } </style> <script src="//www.gstatic.com/firebasejs/7.24.0/firebase-app.js"></script> <script src="//www.gstatic.com/firebasejs/7.24.0/firebase-auth.js"></script> <script src="//www.gstatic.com/firebasejs/7.24.0/firebase-database.js"></script> <script> window.CONFIG = { protocol: "https", default_instance: "gatherplatform.withgoogle.com", default_language: "en", is_local_dev: false, gated: false, devMode: false, cloudFunctionsHost: "https://us-central1-gweb-gc-gather-production.cloudfunctions.net", devProfilesEndpoint: "https://developers.googleapis.com", firebase: { apiKey: 'AIzaSyC1a0zObeFwLX6lp3psqKSqeSvyTJl-2Xg', authDomain: 'gweb-gc-gather-production.firebaseapp.com', databaseURL: 'https://gweb-gc-gather-production-replica1.firebaseio.com/', projectId: 'gweb-gc-gather-production', storageBucket: 'gweb-gc-gather-production.appspot.com', messagingSenderId: '122167620338', appId: '1:122167620338:web:54e2dc54572219490bd66b', }, google_maps_api_key: "AIzaSyCztX6xvkUgIs3798bCXyhJQaeit0gYkgo", template: "DEFAULT", instance: "devfest.withgoogle.com", instance_product_id: 85493226, feature_flags: {}, templates: { angularjs: { instance: [ "DEFAULT", ], event: [ "CHROME_2018", "CLOUD_SUMMIT_2018", ] }, instance: [ "DEFAULT", "DEVFEST", "CLOUD", ], event: [ "DEFAULT", "CLOUD_2017", "CLOUD_2018", "CLOUD_SUMMIT_2018", "CLOUD_TRANSFORM_2018", "CLOUD_DATA_AI_2018", "DEVFEST_2018", "CHROME_2018", "CLOUD_Q1_2019", "GLOBAL_EVENTS_GML_2019", "SINGLE_SESSION", ] } } window.CONFIG.feature_flags['dev_profiles'] = true; window.CONFIG.feature_flags['dma_compliance'] = true; // Initialize Firebase window.firebase.initializeApp(window.CONFIG.firebase); </script> </head> <body> <!-- Google Tag Manager (noscript) (internal) --> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-P9X8WL8" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <!-- End Google Tag Manager (noscript) --> <!-- Google Tag Manager (noscript) (instance) --> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-PNQG5VS" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <!-- End Google Tag Manager (noscript) --> <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> <!-- framebuster code starts here --> <style> plaintext { display: none; } </style> <script> (function() { try { var win = this; while ('<plaintext>') { if (win.parent == win) { break; } eval('win.frameElement.src').substr(0, 1); win = win.parent; } if (win.frameElement != null) { throw 'busted'; } document.write('\x3Cxmp style\x3Ddisplay:none\x3E'); } catch (e) { try { if (!open(location, '_top')) { alert('this content cant be framed'); } top.location = location; } catch (e) {} } })(); </script> <!-- do not remove the plaintext nor xmp tags --> <plaintext /> <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> Sign in or create account </h1> <p> To register for events </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"> <label for="emailAddress"> Enter email: </label> <input type="email" id="emailAddress" oninput="hideErrors('invalid-email')" /> <div class="error-container hidden" id="invalid-email"> <i class="google-material-icons">info</i> <span> <output>Enter a valid email address</output> </span> </div> </div> <div class="sign-in-buttons"> <div class="auth link"> <button type="button" onclick="signInStep('signinMethod')" class="button-link"> Back </button> </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> <output>The email you entered is associated with a Google account. Sign in with Google to continue.</output> </p> <div class="sign-in-buttons"> <div class="auth link"> <button type="button" onclick="signInStep('enterEmail')" class="button-link"> Back </button> </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"> <form> <h1> Sign in with email </h1> <p id="loginEmail" class="email"></p> <div class="input-container" id="password-container"> <label for="loginPassword"> Password: </label> <input type="password" autocomplete="current-password" id="loginPassword" oninput="hideErrors('no-password', 'invalid-password')" required /> <div id="no-password" class="error-container hidden"> <i class="google-material-icons">info</i> <span> <output>Enter password</output> </span> </div> <div id="invalid-password" class="error-container hidden"> <i class="google-material-icons">info</i> <span> <output>Wrong password. Try again or click Forgot password to reset it.</output> </span> </div> </div> <div class="error-takeover hidden" id="login-retry-limit"> <div> <i class="google-material-icons">report_problem</i> <h2> Too many failed attempts </h2> </div> <p class="error-message"> <output>Unavailable because of too many failed attempts to sign in. Try again in a few minutes.</output> </p> </div> <div class="sign-in-buttons"> <div class="auth link forgot-password"> <button type="button" onclick="signInStep('resetPassword')" class="button-link"> Forgot Password? </button> </div> <div class="auth link right-anchor"> <button type="button" onclick="signInStep('enterEmail')" class="button-link"> Back </button> </div> <button type="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> </form> </div> <div id="createAccount" class="box auth-box hidden"> <form> <h1> Create Account </h1> <div class="input-container"> <label for="accountEmail">Email Address:</label> <input type="email" id="accountEmail" autocomplete="new-username" oninput="hideErrors('email-in-use')" disabled /> <div id="email-in-use" class="error-container hidden"> <i class="google-material-icons">info</i> <span> <output>This email is already in use. Please go back and select a different email</output> </span> </div> </div> <div class="input-container"> <label for="accountPassword"> Password: </label> <input type="password" autocomplete="new-password" id="accountPassword" oninput="hideErrors('create-account-no-password', 'weak-password')" /> <div id="create-account-no-password" class="error-container hidden"> <i class="google-material-icons">info</i> <span> <output>Enter password</output> </span> </div> <div id="weak-password" class="error-container hidden"> <i class="google-material-icons">info</i> <span> <output>Use 6 or more characters with a mix of letters, numbers & symbols</output> </span> </div> </div> <div class="input-pair"> <div class="input-container"> <label for="accountFirstName"> First Name: </label> <input type="text" id="accountFirstName" oninput="hideErrors('no-first-name')" /> <div id="no-first-name" class="error-container hidden"> <i class="google-material-icons">info</i> <span> <output>Enter first name</output> </span> </div> </div> <div class="input-container"> <label for="accountLastName"> Last Name: </label> <input type="text" id="accountLastName" oninput="hideErrors('no-last-name')" /> <div id="no-last-name" class="error-container hidden"> <i class="google-material-icons">info</i> <span> <output>Enter last name</output> </span> </div> </div> </div> <div class="sign-in-buttons"> <div class="auth link"> <button type="button" onclick="signInStep('enterEmail')" class="button-link"> Back </button> </div> <button type="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> </form> </div> <div id="accountCreationConfirmation" class="box auth-box hidden"> <p> <div id="emailConfirmation" class="email-text"></div> An email has been sent to the email address above. Click the confirmation link you've received to verify your account. </p> <p> Please check your promotional tab or spam folder. You can resend the message if you did not receive it. </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"> <button type="button" onclick="signInStep('enterPassword')" class="button-link"> Back </button> </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"> <button type="button" onclick="signInStep('signinMethod')" class="button-link"> Back </button> </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> <output>Sorry, you do not have permission to access this resource.</output> </p> <button onclick="signOut()"> Sign out </button> </div> </div> <div id="user-upgrade-error" class="boxed-takeover"> <div class="box"> <h1>User account conflict</h1> <p> <output>Sorry, the user account you are using is now linked to Google. Please sign in with Google to use this account.</output> </p> <button onclick="signOut()"> Sign out </button> </div> </div> <div id="private-error" class="boxed-takeover"> <div class="box"> <div class="formatted-html"><h1>Forbidden</h1><p>You do not have permission to access this private event</p></div> <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. If this issue persists, please sign out and sign back in after reloading. </p> <button onclick="signOut()"> Sign out </button> </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.97eb4396.js" ></script> <!-- Developer Profiles --> <script src="/static/scripts/developer_profiles_api_v0.2.3.js"></script> <script> window.templateBundleMap = { platform: { "default": { script: "/scripts/app.platform.default.js", style: "/styles/app.platform.default.css", }, "devfest": { script: "/scripts/app.platform.devfest.js", style: "/styles/app.platform.devfest.css", }, "cloud": { script: "/scripts/app.platform.cloud.04584a22.js", style: "/styles/app.platform.cloud.a9c1e38e.css", }, }, event: { "default": { script: "/scripts/app.event.default.77eb7c9f.js", style: "/styles/app.event.default.f4b51581.css", }, "cloud_2017": { script: "/scripts/app.event.cloud_2017.14fe68ec.js", style: "/styles/app.event.cloud_2017.978f9577.css", }, "cloud_2018": { script: "/scripts/app.event.cloud_2018.920955c7.js", style: "/styles/app.event.cloud_2018.4524a015.css", }, "cloud_summit_2018": { script: "/scripts/app.event.cloud_summit_2018.b80bb2df.js", style: "/styles/app.event.cloud_summit_2018.2828e67d.css", }, "cloud_transform_2018": { script: "/scripts/app.event.cloud_transform_2018.21a8e490.js", style: "/styles/app.event.cloud_transform_2018.fc10d7ff.css", }, "cloud_data_ai_2018": { script: "/scripts/app.event.cloud_data_ai_2018.502619fb.js", style: "/styles/app.event.cloud_data_ai_2018.66e30895.css", }, "devfest_2018": { script: "/scripts/app.event.devfest_2018.5614ac9a.js", style: "/styles/app.event.devfest_2018.55fd9704.css", }, "chrome_2018": { script: "/scripts/app.event.chrome_2018.cf503ed7.js", style: "/styles/app.event.chrome_2018.acf234a7.css", }, "cloud_q1_2019": { script: "/scripts/app.event.cloud_q1_2019.67fde800.js", style: "/styles/app.event.cloud_q1_2019.98f47d07.css", }, "global_events_gml_2019": { script: "/scripts/app.event.global_events_gml_2019.6695235b.js", style: "/styles/app.event.global_events_gml_2019.bb1763a3.css", }, "single_session": { script: "/scripts/app.event.single_session.6ddc3ca3.js", style: "/styles/app.event.single_session.d86eb8f4.css", }, }, theme: { gemini: "/styles/themes/gemini.f25f4bf0.css", youtube: "/styles/themes/youtube.6ad3b535.css", }, angularJsDependencies: "/scripts/dependencies.4f4b11f9.js" } </script> <div class="hidden" id="bad-browser"> <div id="bad-browser-shade"></div> <div id="bad-browser-text"> <span id="warning-icon" ><i class="google-material-icons">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> <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> const cookieBarScript = document.createElement('script') const lang = window.navigator.userLanguage || window.navigator.language || 'en'; cookieBarScript.setAttribute('data-glue-cookie-notification-bar-language', lang); cookieBarScript.setAttribute('src', 'https://www.gstatic.com/glue/cookienotificationbar/cookienotificationbar.min.js'); document.body.appendChild(cookieBarScript); </script> <script> 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(); const currentView = document.getElementById(stepName); 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') ); currentView.classList.remove('hidden'); const input = currentView.querySelector("input:not([disabled])"); if (input) { input.focus(); } } function checkEmail() { document.getElementById('invalid-email').classList.add('hidden'); const enteredEmail = document.getElementById('emailAddress').value; if (/^.*@google\.com$/i.test(enteredEmail)) { signInStep('hasGoogleAccount'); makeErrorAccessible(document.getElementById('hasGoogleAccount')); } else { const emailRegex = /.+@.+\..+/; if (!enteredEmail || !emailRegex.test(enteredEmail)) { document.getElementById('invalid-email').classList.remove('hidden'); makeErrorAccessible(document.getElementById('invalid-email')); 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 hideErrors(...errorIds) { for(let id of errorIds) { const errorToHide = document.getElementById(id); const errorMessage = errorToHide.querySelector("output"); if(!errorToHide.classList.contains("hidden")) { errorToHide.classList.add("hidden"); } errorMessage.removeAttribute("aria-role"); errorMessage.removeAttribute("aria-live"); } } function makeErrorAccessible(errorContainer) { const errorMessage = errorContainer.querySelector("output"); errorMessage.setAttribute("aria-role", "alert"); errorMessage.setAttribute("aria-live", "polite"); } 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'); makeErrorAccessible(document.getElementById('no-password')); 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'); makeErrorAccessible(document.getElementById('invalid-password')); } else if (error.code === 'auth/too-many-requests') { document .getElementById('password-container') .classList.add('hidden'); document .getElementById('login-retry-limit') .classList.remove('hidden'); makeErrorAccessible(document.getElementById('login-retry-limit')); 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'); makeErrorAccessible(document.getElementById('create-account-no-password')); } if (!accountFirstName) { document.getElementById('no-first-name').classList.remove('hidden'); makeErrorAccessible(document.getElementById('no-first-name')); } if (!accountLastName) { document.getElementById('no-last-name').classList.remove('hidden'); makeErrorAccessible(document.getElementById('no-last-name')); } if (!accountPassword || !accountFirstName || !accountLastName) return; window.firebase .auth() .createUserWithEmailAndPassword(accountEmail, accountPassword) .then(resp => { resp.user.updateProfile({ displayName: `${accountFirstName} ${accountLastName}`, }).then(() => { // Solves issue with Firebase profile data propagation to the // user after creation鈥搊utlined here: // https://buganizer.corp.google.com/issues/204450136 const unsubscribe = window.firebase .auth() .onAuthStateChanged(user => { user.getIdToken(true); unsubscribe(); }); }); const emailConfirmation = document.getElementById("emailConfirmation"); if(emailConfirmation) { 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'); makeErrorAccessible(document.getElementById('weak-password')) } else if (error.code === 'auth/email-already-in-use') { document .getElementById('email-in-use') .classList.remove('hidden'); makeErrorAccessible(document.getElementById('email-in-use')) } 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>