startSignIn(auth, tenantInfo = undefined) {
    return new GoogPromise((resolve, reject) => {
      const apiKey = auth['app']['options']['apiKey'];
      if (!this.configs_.hasOwnProperty(apiKey)) {
        reject(
            new Error('Invalid project configuration: API key is invalid!'));
      }
      const signInConfig =
          this.configs_[apiKey].getSignInConfigForTenant(
              auth['tenantId'] ||
              UiHandlerConfig.ConfigKeys.TOP_LEVEL_CONFIG_KEY,
              tenantInfo && tenantInfo['providerIds']);
      this.disposeCurrentComponent_();
      // Passes the sign-in related callbacks to FirebaseUI.
      const signInCallbacks = {};
      signInCallbacks['signInSuccessWithAuthResult'] = (userCredential) => {
        resolve(userCredential);
        return false;
      };
      const signInUiShownCallback =
          this.configs_[apiKey].getSignInUiShownCallback();
      let uiShown = false;
      signInCallbacks['uiChanged'] = (fromPageId, toPageId) => {
        // Processing redirect result.
        if (fromPageId === null && toPageId === 'callback') {
          // Hide callback page if available.
          const callbackElement = dom.getElementByClass(
              'firebaseui-id-page-callback', this.container_);
          if (callbackElement) {
            element.hide(callbackElement);
          }
          // Show spinner. This will trigger null -> spinner uiChanged.
          this.progressBar_ = new Spinner();
          this.progressBar_.render(this.container_);
        } else if (!uiShown &&
                   !(fromPageId === null && toPageId === 'spinner') &&
                   // Do not trigger callback for immediate federated redirect
                   // to IdP page.
                   (toPageId !== 'blank')) {
          // Remove spinner if still showing.
          if (this.progressBar_) {
            this.progressBar_.dispose();
            this.progressBar_ = null;
          }
          // Trigger the signInUiShown callback. This should be triggered once.
          uiShown = true;
          if (signInUiShownCallback) {
             signInUiShownCallback(auth['tenantId']);
          }
        }
      };
      signInConfig['callbacks'] = signInCallbacks;
      // Do not support `credentialHelper` for sign-in flow.
      signInConfig['credentialHelper'] = 'none';
      let signInHint;
      if (tenantInfo && tenantInfo['email']) {
        signInHint = {
          'emailHint': tenantInfo['email'],
        };
      }
      const startAuthUi = (signInConfig, signInHint) => {
        this.ui_ = new AuthUI(auth);
        this.ui_.startWithSignInHint(this.container_, signInConfig, signInHint);
      };
      // If the AuthUI instance is not null, delete it before re-initialization.
      if (this.ui_) {
        this.ui_.delete().then(() => {
          startAuthUi(signInConfig, signInHint);
        });
      } else {
        startAuthUi(signInConfig, signInHint);
      }
    });
  }
Starts sign in with the corresponding Auth instance. The sign in options
used are based on auth.tenantId.
@param {!firebase.auth.Auth} auth The Auth instance.
@param {!SelectedTenantInfo=} tenantInfo The optional selected tenant and
    the matching providers.
@return {!GoogPromise<!firebase.auth.UserCredential>}
@override