private @Nullable ProviderAndData acquireData(@NotNull String urlWithoutUsername,
                                                @NotNull Function<? super AuthDataProvider, ? extends AuthData> dataAcquirer) {
    return myAuthenticationGate.waitAndCompute(() -> {
      for (AuthDataProvider provider : getProviders(urlWithoutUsername)) {
        try {
          AuthData data = dataAcquirer.apply(provider);
          if (data != null && data.getPassword() != null) {
            return new ProviderAndData(provider, data.getLogin(), data.getPassword());
          }
        }
        catch (ProcessCanceledException pce) {
          LOG.debug("Auth process cancelled by" + provider);
          myAuthenticationGate.cancel();
          return new ProviderAndData(new CancelledProvider(urlWithoutUsername), "", "");
        }
        catch (CredentialHelperShouldBeUsedException e) {
          LOG.debug("Auth switched to credential helper");
          myAuthenticationGate.cancel();
          myCredentialHelperShouldBeUsed = true;
          return null;
        }
        catch (Throwable e) {
          LOG.error("Can't get password from " + provider, e);
        }
      }
      return null;
    });
  }
private @Nullable ProviderAndData acquireData(@NotNull String urlWithoutUsername,
                                                @NotNull Function<? super AuthDataProvider, ? extends AuthData> dataAcquirer)