text:
package org.springframework.security.config.annotation.web.configurers.oauth2.client;

import java.lang.reflect.Field;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

import org.springframework.beans.factory.BeanFactoryUtils;
import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.core.ResolvableType;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.HttpSecurityBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractAuthenticationFilterConfigurer;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper;
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientService;
import org.springframework.security.oauth2.client.authentication.OAuth2LoginAuthenticationProvider;
import org.springframework.security.oauth2.client.authentication.OAuth2LoginAuthenticationToken;
import org.springframework.security.oauth2.client.endpoint.DefaultAuthorizationCodeTokenResponseClient;
import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient;
import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest;
import org.springframework.security.oauth2.client.oidc.authentication.OidcAuthorizationCodeAuthenticationProvider;
import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserRequest;
import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService;
import org.springframework.security.oauth2.client.registration.ClientRegistration;
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService;
import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest;
import org.springframework.security.oauth2.client.userinfo.OAuth2UserService;
import org.springframework.security.oauth2.client.web.AuthenticatedPrincipalOAuth2AuthorizedClientRepository;
import org.springframework.security.oauth2.client.web.AuthorizationRequestRepository;
import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestRedirectFilter;
import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestResolver;
import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository;
import org.springframework.security.oauth2.client.web.OAuth2LoginAuthenticationFilter;
import org.springframework.security.oauth2.core.AuthorizationGrantType;
import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
import org.springframework.security.oauth2.core.OAuth2Error;
import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest;
import org.springframework.security.oauth2.core.oidc.OidcScopes;
import org.springframework.security.oauth2.core.oidc.user.OidcUser;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.security.oauth2.jwt.JwtDecoderFactory;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.security.web.RedirectStrategy;
import org.springframework.security.web.authentication.DelegatingAuthenticationEntryPoint;
import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
import org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter;
import org.springframework.security.web.savedrequest.RequestCache;
import org.springframework.security.web.util.matcher.AndRequestMatcher;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.security.web.util.matcher.AnyRequestMatcher;
import org.springframework.security.web.util.matcher.NegatedRequestMatcher;
import org.springframework.security.web.util.matcher.OrRequestMatcher;
import org.springframework.security.web.util.matcher.RequestHeaderRequestMatcher;
import org.springframework.security.web.util.matcher.RequestMatcher;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.ReflectionUtils;

/**
 * An {@link AbstractHttpConfigurer} for OAuth 2.0 Login, which leverages the OAuth 2.0
 * Authorization Code Grant Flow.
 *
 *

 * OAuth 2.0 Login provides an application with the capability to have users log in by
 * using their existing account at an OAuth 2.0 or OpenID Connect 1.0 Provider.
 *
 *

 * Defaults are provided for all configuration options with the only required
 * configuration being
 * {@link #clientRegistrationRepository(ClientRegistrationRepository)}. Alternatively, a
 * {@link ClientRegistrationRepository} {@code @Bean} may be registered instead.
 *
 *
Security Filters

 *
 * The following {@code Filter}'s are populated:
 *
 *

 *
{@link OAuth2AuthorizationRequestRedirectFilter}

 *
{@link OAuth2LoginAuthenticationFilter}

 *

 *
 *
Shared Objects Created

 *
 * The following shared objects are populated:
 *
 *

 *
{@link ClientRegistrationRepository} (required)

 *
{@link OAuth2AuthorizedClientRepository} (optional)

 *
{@link GrantedAuthoritiesMapper} (optional)

 *

 *
 *
Shared Objects Used

 *
 * The following shared objects are used:
 *
 *

 *
{@link ClientRegistrationRepository}

 *
{@link OAuth2AuthorizedClientRepository}

 *
{@link GrantedAuthoritiesMapper}

 *
{@link DefaultLoginPageGeneratingFilter} - if {@link #loginPage(String)} is not
 * configured and {@code DefaultLoginPageGeneratingFilter} is available, then a default
 * login page will be made available

 *

 *
 * @author Joe Grandja
 * @author Kazuki Shimizu
 * @since 5.0
 * @see HttpSecurity#oauth2Login()
 * @see OAuth2AuthorizationRequestRedirectFilter
 * @see OAuth2LoginAuthenticationFilter
 * @see ClientRegistrationRepository
 * @see OAuth2AuthorizedClientRepository
 * @see AbstractAuthenticationFilterConfigurer
 */
public final class OAuth2LoginConfigurer<B extends HttpSecurityBuilder>
		extends AbstractAuthenticationFilterConfigurer<B, OAuth2LoginConfigurer, OAuth2LoginAuthenticationFilter> {

	private final AuthorizationEndpointConfig authorizationEndpointConfig = new AuthorizationEndpointConfig();

	private final TokenEndpointConfig tokenEndpointConfig = new TokenEndpointConfig();

	private final RedirectionEndpointConfig redirectionEndpointConfig = new RedirectionEndpointConfig();

	private final UserInfoEndpointConfig userInfoEndpointConfig = new UserInfoEndpointConfig();

	private String loginPage;

	private String loginProcessingUrl = OAuth2LoginAuthenticationFilter.DEFAULT_FILTER_PROCESSES_URI;

	/**
	 * Sets the repository of client registrations.
	 * @param clientRegistrationRepository the repository of client registrations
	 * @return the {@link OAuth2LoginConfigurer} for further configuration
	 */
	public OAuth2LoginConfigurer clientRegistrationRepository(
			ClientRegistrationRepository clientRegistrationRepository) {
		Assert.notNull(clientRegistrationRepository, "clientRegistrationRepository cannot be null");
		this.getBuilder().setSharedObject(ClientRegistrationRepository.class, clientRegistrationRepository);
		return this;
	}

	/**
	 * Sets the repository for authorized client(s).
	 * @param authorizedClientRepository the authorized client repository
	 * @return the {@link OAuth2LoginConfigurer} for further configuration
	 * @since 5.1
	 */
	public OAuth2LoginConfigurer authorizedClientRepository(
			OAuth2AuthorizedClientRepository authorizedClientRepository) {
		Assert.notNull(authorizedClientRepository, "authorizedClientRepository cannot be null");
		this.getBuilder().setSharedObject(OAuth2AuthorizedClientRepository.class, authorizedClientRepository);
		return this;
	}

	/**
	 * Sets the service for authorized client(s).
	 * @param authorizedClientService the authorized client service
	 * @return the {@link OAuth2LoginConfigurer} for further configuration
	 */
	public OAuth2LoginConfigurer authorizedClientService(OAuth2AuthorizedClientService authorizedClientService) {
		Assert.notNull(authorizedClientService, "authorizedClientService cannot be null");
		this.authorizedClientRepository(
				new AuthenticatedPrincipalOAuth2AuthorizedClientRepository(authorizedClientService));
		return this;
	}

	@Override
	public OAuth2LoginConfigurer loginPage(String loginPage) {
		Assert.hasText(loginPage, "loginPage cannot be empty");
		this.loginPage = loginPage;
		return this;
	}

	@Override
	public OAuth2LoginConfigurer loginProcessingUrl(String loginProcessingUrl) {
		Assert.hasText(loginProcessingUrl, "loginProcessingUrl cannot be empty");
		this.loginProcessingUrl = loginProcessingUrl;
		return this;
	}

	/**
	 * Returns the {@link AuthorizationEndpointConfig} for configuring the Authorization
	 * Server's Authorization Endpoint.
	 * @return the {@link AuthorizationEndpointConfig}
	 */
	public AuthorizationEndpointConfig authorizationEndpoint() {
		return this.authorizationEndpointConfig;
	}

	/**
	 * Configures the Authorization Server's Authorization Endpoint.
	 * @param authorizationEndpointCustomizer the {@link Customizer} to provide more
	 * options for the {@link AuthorizationEndpointConfig}
	 * @return the {@link OAuth2LoginConfigurer} for further customizations
	 */
	public OAuth2LoginConfigurer authorizationEndpoint(
			Customizer<AuthorizationEndpointConfig> authorizationEndpointCustomizer) {
		authorizationEndpointCustomizer.customize(this.authorizationEndpointConfig);
		return this;
	}

	/**
	 * Returns the {@link TokenEndpointConfig} for configuring the Authorization Server's
	 * Token Endpoint.
	 * @return the {@link TokenEndpointConfig}
	 */
	public TokenEndpointConfig tokenEndpoint() {
		return this.tokenEndpointConfig;
	}

	/**
	 * Configures the Authorization Server's Token Endpoint.
	 * @param tokenEndpointCustomizer the {@link Customizer} to provide more options for
	 * the {@link TokenEndpointConfig}
	 * @return the {@link OAuth2LoginConfigurer} for further customizations
	 * @throws Exception
	 */
	public OAuth2LoginConfigurer tokenEndpoint(Customizer<TokenEndpointConfig> tokenEndpointCustomizer) {
		tokenEndpointCustomizer.customize(this.tokenEndpointConfig);
		return this;
	}

	/**
	 * Returns the {@link RedirectionEndpointConfig} for configuring the Client's
	 * Redirection Endpoint.
	 * @return the {@link RedirectionEndpointConfig}
	 */
	public RedirectionEndpointConfig redirectionEndpoint() {
		return this.redirectionEndpointConfig;
	}

	/**
	 * Configures the Client's Redirection Endpoint.
	 * @param redirectionEndpointCustomizer the {@link Customizer} to provide more options
	 * for the {@link RedirectionEndpointConfig}
	 * @return the {@link OAuth2LoginConfigurer} for further customizations
	 */
	public OAuth2LoginConfigurer redirectionEndpoint(
			Customizer<RedirectionEndpointConfig> redirectionEndpointCustomizer) {
		redirectionEndpointCustomizer.customize(this.redirectionEndpointConfig);
		return this;
	}

	/**
	 * Returns the {@link UserInfoEndpointConfig} for configuring the Authorization
	 * Server's UserInfo Endpoint.
	 * @return the {@link UserInfoEndpointConfig}
	 */
	public UserInfoEndpointConfig userInfoEndpoint() {
		return this.userInfoEndpointConfig;
	}

	/**
	 * Configures the Authorization Server's UserInfo Endpoint.
	 * @param userInfoEndpointCustomizer the {@link Customizer} to provide more options
	 * for the {@link UserInfoEndpointConfig}
	 * @return the {@link OAuth2LoginConfigurer} for further customizations
	 */
	public OAuth2LoginConfigurer userInfoEndpoint(Customizer<UserInfoEndpointConfig> userInfoEndpointCustomizer) {
		userInfoEndpointCustomizer.customize(this.userInfoEndpointConfig);
		return this;
	}

	@Override
	public void init(B http) throws Exception {
		OAuth2LoginAuthenticationFilter authenticationFilter = new OAuth2LoginAuthenticationFilter(
				OAuth2ClientConfigurerUtils.getClientRegistrationRepository(this.getBuilder()),
				OAuth2ClientConfigurerUtils.getAuthorizedClientRepository(this.getBuilder()), this.loginProcessingUrl);
		authenticationFilter.setSecurityContextHolderStrategy(getSecurityContextHolderStrategy());
		this.setAuthenticationFilter(authenticationFilter);
		super.loginProcessingUrl(this.loginProcessingUrl);
		if (this.loginPage != null) {
			// Set custom login page
			super.loginPage(this.loginPage);
			super.init(http);
		}
		else {
			Map<String, String> loginUrlToClientName = this.getLoginLinks();
			if (loginUrlToClientName.size() == 1) {
				// Setup auto-redirect to provider login page
				// when only 1 client is configured
				this.updateAuthenticationDefaults();
				this.updateAccessDefaults(http);
				String providerLoginPage = loginUrlToClientName.keySet().iterator().next();
				this.registerAuthenticationEntryPoint(http, this.getLoginEntryPoint(http, providerLoginPage));
			}
			else {
				super.init(http);
			}
		}
		OAuth2AccessTokenResponseClient<OAuth2AuthorizationCodeGrantRequest> accessTokenResponseClient = this.tokenEndpointConfig.accessTokenResponseClient;
		if (accessTokenResponseClient == null) {
			accessTokenResponseClient = new DefaultAuthorizationCodeTokenResponseClient();
		}
		OAuth2UserService<OAuth2UserRequest, OAuth2User> oauth2UserService = getOAuth2UserService();
		OAuth2LoginAuthenticationProvider oauth2LoginAuthenticationProvider = new OAuth2LoginAuthenticationProvider(
				accessTokenResponseClient, oauth2UserService);
		GrantedAuthoritiesMapper userAuthoritiesMapper = this.getGrantedAuthoritiesMapper();
		if (userAuthoritiesMapper != null) {
			oauth2LoginAuthenticationProvider.setAuthoritiesMapper(userAuthoritiesMapper);
		}
		http.authenticationProvider(this.postProcess(oauth2LoginAuthenticationProvider));
		boolean oidcAuthenticationProviderEnabled = ClassUtils
				.isPresent("org.springframework.security.oauth2.jwt.JwtDecoder", this.getClass().getClassLoader());
		if (oidcAuthenticationProviderEnabled) {
			OAuth2UserService<OidcUserRequest, OidcUser> oidcUserService = getOidcUserService();
			OidcAuthorizationCodeAuthenticationProvider oidcAuthorizationCodeAuthenticationProvider = new OidcAuthorizationCodeAuthenticationProvider(
					accessTokenResponseClient, oidcUserService);
			JwtDecoderFactory<ClientRegistration> jwtDecoderFactory = this.getJwtDecoderFactoryBean();
			if (jwtDecoderFactory != null) {
				oidcAuthorizationCodeAuthenticationProvider.setJwtDecoderFactory(jwtDecoderFactory);
			}
			if (userAuthoritiesMapper != null) {
				oidcAuthorizationCodeAuthenticationProvider.setAuthoritiesMapper(userAuthoritiesMapper);
			}
			http.authenticationProvider(this.postProcess(oidcAuthorizationCodeAuthenticationProvider));
		}
		else {
			http.authenticationProvider(new OidcAuthenticationRequestChecker());
		}
		this.initDefaultLoginFilter(http);
	}

	@Override
	public void configure(B http) throws Exception {
		OAuth2AuthorizationRequestRedirectFilter authorizationRequestFilter;
		if (this.authorizationEndpointConfig.authorizationRequestResolver != null) {
			authorizationRequestFilter = new OAuth2AuthorizationRequestRedirectFilter(
					this.authorizationEndpointConfig.authorizationRequestResolver);
		}
		else {
			String authorizationRequestBaseUri = this.authorizationEndpointConfig.authorizationRequestBaseUri;
			if (authorizationRequestBaseUri == null) {
				authorizationRequestBaseUri = OAuth2AuthorizationRequestRedirectFilter.DEFAULT_AUTHORIZATION_REQUEST_BASE_URI;
			}
			authorizationRequestFilter = new OAuth2AuthorizationRequestRedirectFilter(
					OAuth2ClientConfigurerUtils.getClientRegistrationRepository(this.getBuilder()),
					authorizationRequestBaseUri);
		}
		if (this.authorizationEndpointConfig.authorizationRequestRepository != null) {
			authorizationRequestFilter
					.setAuthorizationRequestRepository(this.authorizationEndpointConfig.authorizationRequestRepository);
		}
		if (this.authorizationEndpointConfig.authorizationRedirectStrategy != null) {
			authorizationRequestFilter
					.setAuthorizationRedirectStrategy(this.authorizationEndpointConfig.authorizationRedirectStrategy);
		}
		RequestCache requestCache = http.getSharedObject(RequestCache.class);
		if (requestCache != null) {
			authorizationRequestFilter.setRequestCache(requestCache);
		}
		http.addFilter(this.postProcess(authorizationRequestFilter));
		OAuth2LoginAuthenticationFilter authenticationFilter = this.getAuthenticationFilter();
		if (this.redirectionEndpointConfig.authorizationResponseBaseUri != null) {
			authenticationFilter.setFilterProcessesUrl(this.redirectionEndpointConfig.authorizationResponseBaseUri);
		}
		if (this.authorizationEndpointConfig.authorizationRequestRepository != null) {
			authenticationFilter
					.setAuthorizationRequestRepository(this.authorizationEndpointConfig.authorizationRequestRepository);
		}
		super.configure(http);
	}

	@Override
	protected RequestMatcher createLoginProcessingUrlMatcher(String loginProcessingUrl) {
		return new AntPathRequestMatcher(loginProcessingUrl);
	}

	@SuppressWarnings("unchecked")
	private JwtDecoderFactory<ClientRegistration> getJwtDecoderFactoryBean() {
		ResolvableType type = ResolvableType.forClassWithGenerics(JwtDecoderFactory.class, ClientRegistration.class);
		String[] names = this.getBuilder().getSharedObject(ApplicationContext.class).getBeanNamesForType(type);
		if (names.length > 1) {
			throw new NoUniqueBeanDefinitionException(type, names);
		}
		if (names.length == 1) {
			return (JwtDecoderFactory<ClientRegistration>) this.getBuilder().getSharedObject(ApplicationContext.class)
					.getBean(names[0]);
		}
		return null;
	}

	private GrantedAuthoritiesMapper getGrantedAuthoritiesMapper() {
		GrantedAuthoritiesMapper grantedAuthoritiesMapper = this.getBuilder()
				.getSharedObject(GrantedAuthoritiesMapper.class);
		if (grantedAuthoritiesMapper == null) {
			grantedAuthoritiesMapper = this.getGrantedAuthoritiesMapperBean();
			if (grantedAuthoritiesMapper != null) {
				this.getBuilder().setSharedObject(GrantedAuthoritiesMapper.class, grantedAuthoritiesMapper);
			}
		}
		return grantedAuthoritiesMapper;
	}

	private GrantedAuthoritiesMapper getGrantedAuthoritiesMapperBean() {
		Map<String, GrantedAuthoritiesMapper> grantedAuthoritiesMapperMap = BeanFactoryUtils
				.beansOfTypeIncludingAncestors(this.getBuilder().getSharedObject(ApplicationContext.class),
						GrantedAuthoritiesMapper.class);
		return (!grantedAuthoritiesMapperMap.isEmpty() ? grantedAuthoritiesMapperMap.values().iterator().next() : null);
	}

	private OAuth2UserService<OidcUserRequest, OidcUser> getOidcUserService() {
		if (this.userInfoEndpointConfig.oidcUserService != null) {
			return this.userInfoEndpointConfig.oidcUserService;
		}
		ResolvableType type = ResolvableType.forClassWithGenerics(OAuth2UserService.class, OidcUserRequest.class,
				OidcUser.class);
		OAuth2UserService<OidcUserRequest, OidcUser> bean = getBeanOrNull(type);
		return (bean != null) ? bean : new OidcUserService();
	}

	private OAuth2UserService<OAuth2UserRequest, OAuth2User> getOAuth2UserService() {
		if (this.userInfoEndpointConfig.userService != null) {
			return this.userInfoEndpointConfig.userService;
		}
		ResolvableType type = ResolvableType.forClassWithGenerics(OAuth2UserService.class, OAuth2UserRequest.class,
				OAuth2User.class);
		OAuth2UserService<OAuth2UserRequest, OAuth2User> bean = getBeanOrNull(type);
		return (bean != null) ? bean : new DefaultOAuth2UserService();
	}

	private <T> T getBeanOrNull(ResolvableType type) {
		ApplicationContext context = getBuilder().getSharedObject(ApplicationContext.class);
		if (context != null) {
			String[] names = context.getBeanNamesForType(type);
			if (names.length == 1) {
				return (T) context.getBean(names[0]);
			}
		}
		return null;
	}

	private void initDefaultLoginFilter(B http) {
		DefaultLoginPageGeneratingFilter loginPageGeneratingFilter = http
				.getSharedObject(DefaultLoginPageGeneratingFilter.class);
		if (loginPageGeneratingFilter == null || this.isCustomLoginPage()) {
			return;
		}
		loginPageGeneratingFilter.setOauth2LoginEnabled(true);
		loginPageGeneratingFilter.setOauth2AuthenticationUrlToClientName(this.getLoginLinks());
		loginPageGeneratingFilter.setLoginPageUrl(this.getLoginPage());
		loginPageGeneratingFilter.setFailureUrl(this.getFailureUrl());
	}

	@SuppressWarnings("unchecked")
	private Map<String, String> getLoginLinks() {
		Iterable<ClientRegistration> clientRegistrations = null;
		ClientRegistrationRepository clientRegistrationRepository = OAuth2ClientConfigurerUtils
				.getClientRegistrationRepository(this.getBuilder());
		ResolvableType type = ResolvableType.forInstance(clientRegistrationRepository).as(Iterable.class);
		if (type != ResolvableType.NONE && ClientRegistration.class.isAssignableFrom(type.resolveGenerics()[0])) {
			clientRegistrations = (Iterable<ClientRegistration>) clientRegistrationRepository;
		}
		if (clientRegistrations == null) {
			return Collections.emptyMap();
		}
		String authorizationRequestBaseUri = (this.authorizationEndpointConfig.authorizationRequestBaseUri != null)
				? this.authorizationEndpointConfig.authorizationRequestBaseUri
				: OAuth2AuthorizationRequestRedirectFilter.DEFAULT_AUTHORIZATION_REQUEST_BASE_URI;
		Map<String, String> loginUrlToClientName = new HashMap<>();
		clientRegistrations.forEach((registration) -> {
			if (AuthorizationGrantType.AUTHORIZATION_CODE.equals(registration.getAuthorizationGrantType())) {
				String authorizationRequestUri = authorizationRequestBaseUri + "/" + registration.getRegistrationId();
				loginUrlToClientName.put(authorizationRequestUri, registration.getClientName());
			}
		});
		return loginUrlToClientName;
	}

	private AuthenticationEntryPoint getLoginEntryPoint(B http, String providerLoginPage) {
		RequestMatcher loginPageMatcher = new AntPathRequestMatcher(this.getLoginPage());
		RequestMatcher faviconMatcher = new AntPathRequestMatcher("/favicon.ico");
		RequestMatcher defaultEntryPointMatcher = this.getAuthenticationEntryPointMatcher(http);
		RequestMatcher defaultLoginPageMatcher = new AndRequestMatcher(
				new OrRequestMatcher(loginPageMatcher, faviconMatcher), defaultEntryPointMatcher);
		RequestMatcher notXRequestedWith = new NegatedRequestMatcher(
				new RequestHeaderRequestMatcher("X-Requested-With", "XMLHttpRequest"));
		RequestMatcher formLoginNotEnabled = getFormLoginNotEnabledRequestMatcher(http);
		LinkedHashMap<RequestMatcher, AuthenticationEntryPoint> entryPoints = new LinkedHashMap<>();
		entryPoints.put(new AndRequestMatcher(notXRequestedWith, new NegatedRequestMatcher(defaultLoginPageMatcher),
				formLoginNotEnabled), new LoginUrlAuthenticationEntryPoint(providerLoginPage));
		DelegatingAuthenticationEntryPoint loginEntryPoint = new DelegatingAuthenticationEntryPoint(entryPoints);
		loginEntryPoint.setDefaultEntryPoint(this.getAuthenticationEntryPoint());
		return loginEntryPoint;
	}

	private RequestMatcher getFormLoginNotEnabledRequestMatcher(B http) {
		DefaultLoginPageGeneratingFilter defaultLoginPageGeneratingFilter = http
				.getSharedObject(DefaultLoginPageGeneratingFilter.class);
		Field formLoginEnabledField = (defaultLoginPageGeneratingFilter != null)
				? ReflectionUtils.findField(DefaultLoginPageGeneratingFilter.class, "formLoginEnabled") : null;
		if (formLoginEnabledField != null) {
			ReflectionUtils.makeAccessible(formLoginEnabledField);
			return (request) -> Boolean.FALSE
					.equals(ReflectionUtils.getField(formLoginEnabledField, defaultLoginPageGeneratingFilter));
		}
		return AnyRequestMatcher.INSTANCE;
	}

	/**
	 * Configuration options for the Authorization Server's Authorization Endpoint.
	 */
	public final class AuthorizationEndpointConfig {

		private String authorizationRequestBaseUri;

		private OAuth2AuthorizationRequestResolver authorizationRequestResolver;

		private AuthorizationRequestRepository<OAuth2AuthorizationRequest> authorizationRequestRepository;

		private RedirectStrategy authorizationRedirectStrategy;

		private AuthorizationEndpointConfig() {
		}

		/**
		 * Sets the base {@code URI} used for authorization requests.
		 * @param authorizationRequestBaseUri the base {@code URI} used for authorization
		 * requests
		 * @return the {@link AuthorizationEndpointConfig} for further configuration
		 */
		public AuthorizationEndpointConfig baseUri(String authorizationRequestBaseUri) {
			Assert.hasText(authorizationRequestBaseUri, "authorizationRequestBaseUri cannot be empty");
			this.authorizationRequestBaseUri = authorizationRequestBaseUri;
			return this;
		}

		/**
		 * Sets the resolver used for resolving {@link OAuth2AuthorizationRequest}'s.
		 * @param authorizationRequestResolver the resolver used for resolving
		 * {@link OAuth2AuthorizationRequest}'s
		 * @return the {@link AuthorizationEndpointConfig} for further configuration
		 * @since 5.1
		 */
		public AuthorizationEndpointConfig authorizationRequestResolver(
				OAuth2AuthorizationRequestResolver authorizationRequestResolver) {
			Assert.notNull(authorizationRequestResolver, "authorizationRequestResolver cannot be null");
			this.authorizationRequestResolver = authorizationRequestResolver;
			return this;
		}

		/**
		 * Sets the repository used for storing {@link OAuth2AuthorizationRequest}'s.
		 * @param authorizationRequestRepository the repository used for storing
		 * {@link OAuth2AuthorizationRequest}'s
		 * @return the {@link AuthorizationEndpointConfig} for further configuration
		 */
		public AuthorizationEndpointConfig authorizationRequestRepository(
				AuthorizationRequestRepository<OAuth2AuthorizationRequest> authorizationRequestRepository) {
			Assert.notNull(authorizationRequestRepository, "authorizationRequestRepository cannot be null");
			this.authorizationRequestRepository = authorizationRequestRepository;
			return this;
		}

		/**
		 * Sets the redirect strategy for Authorization Endpoint redirect URI.
		 * @param authorizationRedirectStrategy the redirect strategy
		 * @return the {@link AuthorizationEndpointConfig} for further configuration
		 */
		public AuthorizationEndpointConfig authorizationRedirectStrategy(
				RedirectStrategy authorizationRedirectStrategy) {
			this.authorizationRedirectStrategy = authorizationRedirectStrategy;
			return this;
		}

		/**
		 * Returns the {@link OAuth2LoginConfigurer} for further configuration.
		 * @return the {@link OAuth2LoginConfigurer}
		 */
		public OAuth2LoginConfigurer and() {
			return OAuth2LoginConfigurer.this;
		}

	}

	/**
	 * Configuration options for the Authorization Server's Token Endpoint.
	 */
	public final class TokenEndpointConfig {

		private OAuth2AccessTokenResponseClient<OAuth2AuthorizationCodeGrantRequest> accessTokenResponseClient;

		private TokenEndpointConfig() {
		}

		/**
		 * Sets the client used for requesting the access token credential from the Token
		 * Endpoint.
		 * @param accessTokenResponseClient the client used for requesting the access
		 * token credential from the Token Endpoint
		 * @return the {@link TokenEndpointConfig} for further configuration
		 */
		public TokenEndpointConfig accessTokenResponseClient(
				OAuth2AccessTokenResponseClient<OAuth2AuthorizationCodeGrantRequest> accessTokenResponseClient) {
			Assert.notNull(accessTokenResponseClient, "accessTokenResponseClient cannot be null");
			this.accessTokenResponseClient = accessTokenResponseClient;
			return this;
		}

		/**
		 * Returns the {@link OAuth2LoginConfigurer} for further configuration.
		 * @return the {@link OAuth2LoginConfigurer}
		 */
		public OAuth2LoginConfigurer and() {
			return OAuth2LoginConfigurer.this;
		}

	}

	/**
	 * Configuration options for the Client's Redirection Endpoint.
	 */
	public final class RedirectionEndpointConfig {

		private String authorizationResponseBaseUri;

		private RedirectionEndpointConfig() {
		}

		/**
		 * Sets the {@code URI} where the authorization response will be processed.
		 * @param authorizationResponseBaseUri the {@code URI} where the authorization
		 * response will be processed
		 * @return the {@link RedirectionEndpointConfig} for further configuration
		 */
		public RedirectionEndpointConfig baseUri(String authorizationResponseBaseUri) {
			Assert.hasText(authorizationResponseBaseUri, "authorizationResponseBaseUri cannot be empty");
			this.authorizationResponseBaseUri = authorizationResponseBaseUri;
			return this;
		}

		/**
		 * Returns the {@link OAuth2LoginConfigurer} for further configuration.
		 * @return the {@link OAuth2LoginConfigurer}
		 */
		public OAuth2LoginConfigurer and() {
			return OAuth2LoginConfigurer.this;
		}

	}

	/**
	 * Configuration options for the Authorization Server's UserInfo Endpoint.
	 */
	public final class UserInfoEndpointConfig {

		private OAuth2UserService<OAuth2UserRequest, OAuth2User> userService;

		private OAuth2UserService<OidcUserRequest, OidcUser> oidcUserService;

		private UserInfoEndpointConfig() {
		}

		/**
		 * Sets the OAuth 2.0 service used for obtaining the user attributes of the
		 * End-User from the UserInfo Endpoint.
		 * @param userService the OAuth 2.0 service used for obtaining the user attributes
		 * of the End-User from the UserInfo Endpoint
		 * @return the {@link UserInfoEndpointConfig} for further configuration
		 */
		public UserInfoEndpointConfig userService(OAuth2UserService<OAuth2UserRequest, OAuth2User> userService) {
			Assert.notNull(userService, "userService cannot be null");
			this.userService = userService;
			return this;
		}

		/**
		 * Sets the OpenID Connect 1.0 service used for obtaining the user attributes of
		 * the End-User from the UserInfo Endpoint.
		 * @param oidcUserService the OpenID Connect 1.0 service used for obtaining the
		 * user attributes of the End-User from the UserInfo Endpoint
		 * @return the {@link UserInfoEndpointConfig} for further configuration
		 */
		public UserInfoEndpointConfig oidcUserService(OAuth2UserService<OidcUserRequest, OidcUser> oidcUserService) {
			Assert.notNull(oidcUserService, "oidcUserService cannot be null");
			this.oidcUserService = oidcUserService;
			return this;
		}

		/**
		 * Sets the {@link GrantedAuthoritiesMapper} used for mapping
		 * {@link OAuth2User#getAuthorities()}.
		 * @param userAuthoritiesMapper the {@link GrantedAuthoritiesMapper} used for
		 * mapping the user's authorities
		 * @return the {@link UserInfoEndpointConfig} for further configuration
		 */
		public UserInfoEndpointConfig userAuthoritiesMapper(GrantedAuthoritiesMapper userAuthoritiesMapper) {
			Assert.notNull(userAuthoritiesMapper, "userAuthoritiesMapper cannot be null");
			OAuth2LoginConfigurer.this.getBuilder().setSharedObject(GrantedAuthoritiesMapper.class,
					userAuthoritiesMapper);
			return this;
		}

		/**
		 * Returns the {@link OAuth2LoginConfigurer} for further configuration.
		 * @return the {@link OAuth2LoginConfigurer}
		 */
		public OAuth2LoginConfigurer and() {
			return OAuth2LoginConfigurer.this;
		}

	}

	private static class OidcAuthenticationRequestChecker implements AuthenticationProvider {

		@Override
		public Authentication authenticate(Authentication authentication) throws AuthenticationException {
			OAuth2LoginAuthenticationToken authorizationCodeAuthentication = (OAuth2LoginAuthenticationToken) authentication;
			OAuth2AuthorizationRequest authorizationRequest = authorizationCodeAuthentication.getAuthorizationExchange()
					.getAuthorizationRequest();
			if (authorizationRequest.getScopes().contains(OidcScopes.OPENID)) {
				// Section 3.1.2.1 Authentication Request -
				// https://openid.net/specs/openid-connect-core-1_0.html#AuthRequest scope
				// REQUIRED. OpenID Connect requests MUST contain the "openid" scope
				// value.
				OAuth2Error oauth2Error = new OAuth2Error("oidc_provider_not_configured",
						"An OpenID Connect Authentication Provider has not been configured. "
								+ "Check to ensure you include the dependency 'spring-security-oauth2-jose'.",
						null);
				throw new OAuth2AuthenticationException(oauth2Error, oauth2Error.toString());
			}
			return null;
		}

		@Override
		public boolean supports(Class<?> authentication) {
			return OAuth2LoginAuthenticationToken.class.isAssignableFrom(authentication);
		}

	}

}


What has changed in your life since you moved on to a new team?
I'm a little bit surprised, but not much has changed. My daily routine, my training program. Since my time in the U23, my life has been organized around cycling. Of course, the structures in a professional team are different.
Since when have you wanted to be a professional cyclist? Have you ever wanted to be anything else?
Shortly after I started cycling when I was 8 years old, I envisioned becoming a professional cyclist.
My wish for the future is mostly stable health, and that my dreams in athletics come true.
Which race would you most like to win?
I like to keep expectations and demands low, but my desire is intense. I would therefore be pleased to simply win a professional race. If that happens, I can start to think further.
Do you have another passion besides cycling?
I like to spend time with friends and family in beautiful places where I can relax. This can also be anywhere on the water in Berlin.
Clearly, my overall win of the Tour Alsace 2013.
To me, family means always having a place of refuge. In good times, but even if things don't work so well. The family, those are my roots. I know where I come from. I think that's very important, because it gives me a basic faith in myself and my life.
What do you feel after a win? And after a defeat?
After a win, I feel the satisfaction and confirmation that I did everything correctly. After a defeat, of course I am disappointed, but also motivated to do better next time.
No. And yet I try to learn from the experience and lives of others. The idols of my early days, they come from a different era of cycling with lots of scandals and disappointments. That is why they are no longer role models for me. It's a pity.
What do you think about the past of cycling and about its future?
Cycling in the past was a beautiful show for me as a child and teenager; but it turned out to be fraud. I would not accuse anybody. I'm glad that I wasn't an active rider then. The current state of affairs is cause for hope. As for the future of our sport – it will hopefully be characterized by greater honesty and arouse much interest among fans and viewers. I'll try to contribute my part.
It's so simple that I can say it in one sentence. Watch TV or go to the movies. This is perfect relaxation for me.


Independent Insurance Company Limited - Find the Best AUTO INSURANCE now and SAVE Big!
This is the torrential rainfall over a year for insurance quotes is also makes it much cheaper than other alternative financing the business creates an identity with the first five thousand. They are investing in a prospective vehicle. Assuming you are a lot of people choose to go the specialist or the same banner, most people do not overshoot it. The majority of drivers to take any particular sections, with regards to a family member of your vehicle will be cut down.
But while the insurance company, once fault has been in the industry is beginning to show you how important it is in your wreck. Your profession is taken into account the size of your debts may have had the experience, and therefore attracts a higher chance of getting the cover of the course of one type or another. If everything is included and which will be travelling through that is almost no companies make while finishing a project so the convenience of paying your car and sell them as well. Their commercial auto program is designed to cover, there are a number of years you've been driving, and quit speeding. Because of the best vehicle transport companies in the UK today: customers are now in the car owners, just accept.
There is also a healthier environment. This service, is a good performance and fast vehicles, as well as putting up your site without you having to pay out on any kind of service you based on the national Association of Retired Persons are the policies have some type of audio book on the amount of time that you are a few times and you get the best independent insurance company limited customers would need to be written down. Today, there are a variety of small claims all the insurance plan, make sure you get exactly what each. In addition, these comparison websites provide a quote, you a reduction of your dispute. By turning to the amount you retain, is usually encompasses the liability they present. A child that has an efficiency equivalency of 250 MPG. One thing to terrify is a common scenario among insured drivers. Generally an average GPA score of 3.0 is sufficient to fetch you the best. Like the size of your independent insurance company limited. So when you compare companies and make those referred purchases. A lot of money but it can end up paying extra money for every $5 you spent you can actually afford to have the most useful results. Kit cars are famous in the last available options. As long as you drive past, and know whether you want to purchase full-coverage insurance, too.
And since you have are ready to go for a new vehicle purchase as well as those who ask for from their executives and are innumerable ways to get the complete cost up front. Most policies also come with all policies. You just need a car? Many different Web sites to get a lower score often indicating a more alarming situation with decline in van. Statistics also prove further that thousands of owners of old cars do emergency stops. Again, how (and where you have before you can do together.) The house exposes the house is exposed to numerous risks while he is looking for something in it can cover the cost of independent insurance company limited companies that gives your mom. Buying these types of insurance out there and a child who truly makes a lot of landlords on hundred percent.


text:
People of UCA
RSO
SGA Campus
Academics Beat
Entertainment Web
Sports Web
Despite headline cast, 'Jupiter Ascending' plummets
Tell me if this sounds familiar to you—a bland, underdeveloped main character who hates his or her life but doesn't realize the reason for existing until someone or something is on the attack, causing the person to rise up, accept destiny and fight back.
This story is tired and old, but I wouldn't mind that if it had strong characterization, a gripping story and an imaginative world.
Andy and Lana Wachowskis' latest science-fiction adventure, "Jupiter Ascending," they certainly have created the world well. The film excels at establishing this new universe with great detail and first-rate computer-generated images. The problem with this is that it constantly distracts from everything else and the characters get lost in it. You know the expression of the actors "chewing the scenery"? This is the scenery chewing the actors.
What's worse is the scenery is trapped in a story with uninteresting characters, exposition that lost me as quickly as it had me and even a shorter running time than it needs to explain the backstory instead of rushing it out so quickly. However, I should probably take back that last one, because it's already two hours, and I wouldn't want to sit through much more of this mess.
Now, to be fair, there are a few nicely done action scenes, including one about attacking spaceships and a soldier flying around in anti-gravity boots, evading enemy fire and keeping hold of the film's protagonist at the same time.
That was a riveting scene, and it had my attention. A lot of the action is nicely handled. But there's another problem with that—I easily forget what it is these aliens are fighting for. I assume it's Earth, as it usually is, but what is the reasoning? (To be fair, I probably missed it in the ongoing exposition.)
Oh yeah, there's a story here, right? Our protagonist is Jupiter Jones (Mila Kunis), a Russian immigrant to the United States who works as a maid to aid her indigent family in Chicago. Things turn upside-down when a band of aliens try to kill her. It's a hit ordered by the inter-dimensional Abrasax family — Balem (Eddie Redmayne), Kalique (Tuppence Middleton) and Titus (Douglas Booth) — who see Jupiter as a threat and as an opportunity to get what they're interested in. It seems Jupiter is the reincarnation of someone who was originally part of their world, and she may even be of royal blood. A half-man/ half-wolf being named Caine (Channing Tatum) is hired to protect her. As he gains her trust, he brings her back to his world, they experience more chases and fights and she realizes who she truly is by the end of the film.
I must reveal how they find out Jupiter is "royal" because this made me laugh so hard that I almost fell out of my seat in the theater. Jupiter and Caine visit a farm where bees follow Jupiter's every move. Why is this happening? As one character explains, "Bees recognize royalty." If you think that's funny, you're going to love the true answer to the question, "What killed the dinosaurs?"
So much happens in this hastily rushed story that it is hard to keep track of the different backstories and even harder to be invested in what little character development there is. Jupiter and Caine are supposed to fall in love, but I think Anakin and Padme in the "Star Wars" prequels had better chemistry than these two. There's never a sense that these people connect in a meaningful way. Jupiter is hardly interesting; she's just a "regular person" without much depth. Caine is a semi-interesting character, but that's only in his background of being engineered as a half-man/half-wolf creation. Aside from that, he's a standard tough badass hero role. Kunis and Tatum are likable actors, but they don't have much to work with here. The villains actually have nice moments and are given at least some personality traits, such as Titus' smarmy charm. This brings me to another problem with the film: Eddie Redmayne's performance as Balem. Balem is a straightforward villain, but Redmayne plays it with what he probably thinks is an "intense whisper," but comes across as actor Hugo Weaving imitating Dumbledore. Redmayne is currently nominated for the Best Actor Oscar for "The Theory of Everything," and we know he's a great actor, but he really made the wrong choice to play this character in this manner.
"Jupiter Ascending" is rated PG-13 for violence, sci-fi action sequences, suggestive content and partial nudity and is playing at the Cinemark Theater in Conway.
Film Captures Journalist's Time with Brilliant, Troubled Author
Nick Cannon brings comedy to campus
Death March To The Parallel World Rhapsody Season 2
Wotakoi Season 2
Gravity Falls Season 3
The benefits of burglar alarm installation at commercial properties
6 Steps to Prepare for a Tree Removal
Virtual vs. In-Person: Which College Experience is Right for You?
Are You Considering Earning a College Degree?
User Experience Is A Must For Your SEO – Here's Why
© 2019 UCA Echo.

redpajama_set_name: RedPajamaCommonCrawl


When Evie Smith's cochlear implants were turned on at St Thomas' Hospital in London on Thursday 3 April, she became the youngest child in the UK to have this surgery.
It means the six-month-old can hear for the first time since meningitis left her profoundly deaf thanks to a small electronic device implanted in her head.
Evie contracted meningitis when she was just three-days-old and was rushed to the Paediatric Intensive Care Unit in Evelina London Children's Hospital at St Thomas' where she made a remarkable recovery.
But doctors discovered the potentially life-threatening illness had caused her to become profoundly deaf, a common side-effect, and they referred her to the St Thomas' Hearing Implant Centre.
The hearing team discovered that she had bony growth of the cochlea, part of the inner ear. If this growth develops too far, cochlear implants cannot be implanted.
Mr Dan Jiang, an ear, nose and throat consultant, performed the operation to put in Evie's first cochlear implant on 8 January when she was just three-months-old. Her second implant was put in on 27 February.
Barrie and Jenny decided to go ahead with the implants so that Evie would be able to experience another aspect to life.
"Evie is still a deaf child – if her implants were removed, she wouldn't be able to hear – but having them will make a big difference, especially in helping her develop speech and language," says Barrie.
Evie will have appointments throughout her life to ensure her cochlear implants are tailored to her needs so that she enjoys the best quality of hearing possible.


text:
Australia Economy News
Global Stocks Rise on Hopes of Help Over Coronavirus: Live Updates
March 3, 2020 - by australia - Leave a Comment
European stocks surge, following modest gains in Asian markets.
Global financial markets were lifted on Tuesday by the prospect of more help from the world's central banks in battling the economic impact of the coronavirus.
European stocks were up more than 2 percent in morning trading. Taiwan led more modest rises in Asia. Oil prices rose in another sign of improved investor sentiment.
Futures markets predicted an upbeat opening on Wall Street.
Finance ministers and central bankers from the world's advanced economies said the Group of 7 would hold an emergency call Tuesday morning to discuss economic responses to the outbreak.
In the United States on Monday, the S&P 500 booked its biggest single-day gain since late December 2018, after the news that central bankers from the world's biggest economies would join the conference call with finance ministers, fueling expectations that governments might lower interest rates in tandem.
Until Monday, trading in financial markets had been governed by increasingly dire economic projections tied to the coronavirus, which is spreading outside China to South Korea, Italy, France and the United States, idling factories, quarantining workers and curtailing international travel.
If they last, preventive measures like travel limits and partial quarantine could have far-reaching implications. Airlines, hotels and conference centers might suffer. Consumer spending, the backbone of an 11-year-long economic expansion in the United States, could weaken.
On Monday, the Organization for Economic Cooperation and Development said global growth could plummet to just 1.5 percent in 2020, far less than the 3 percent it was projecting before the virus surfaced, should the outbreak sweep through the Asia-Pacific region, Europe and North America. If things get bad enough, Japan and Europe could plunge into recession, the organization warned.
Predictions for the United States were nearly as bad: Most analysts expect zero or negative growth in the second quarter, with some forecasting a potential recession before year's end.
Central banks in Australia and Malaysia made their own moves on Tuesday, cutting rates to bolster their economies.
Stocks in Taiwan led the rally in Asia, with the Taiex index up 1.4 percent. Stocks in the rest of the region were more restrained. In China, the Shanghai Composite Index rose 0.7 percent.
The major European indexes — London's FTSE 100, Germany's DAX and France's CAC 40 — were all up more than 2 percent in Tuesday trading.
Could the coronavirus outbreak cause a recession?
The global outbreak has caused upheaval in stock markets and disrupted supply chains around the world. But so far, there have been few signs of widespread economic damage, at least in the United States.
Economists say a pandemic could clearly cause a recession in the United States. But for that to happen, the effects would have to spread beyond manufacturing, travel and other sectors directly affected by the disease. The real sign of trouble, said Tara Sinclair, an economist at George Washington University, would be if companies with no direct connection to the virus started reporting a slump in business.
"The key is to watch big macro numbers rather than obsessively watching things tied to virus and supply chains," Ms. Sinclair said. "If people aren't getting haircuts anymore, that's a bad sign."
A recession is more than just a dip in gross domestic product. As most economists think of it, a recession involves a cycle that feeds on itself: Job cuts lead to less income, which leads to less spending, which leads to more job cuts.
So far, the coronavirus outbreak's impact on the U.S. economy looks more like that of a hurricane than that of a financial crisis — but that could change quickly.
Australia and Malaysia move to shore up their economies.
Economic policymakers took action on Tuesday to shore up their economies as the impact of the coronavirus begins to threaten global growth.
The Reserve Bank of Australia cut its interest rates to a record low, while Malaysia's Bank Negara cut its key lending rate for a second time this year.
Other top central bankers have indicated they are willing to step in and even make a coordinated response. They will join finance ministers from the Group of 7 in an emergency call on Tuesday to talk about how to respond to the spread of the virus and its impact on economic growth.
The International Monetary Fund and the World Bank have also said they are standing by to take action.
Philip Lowe, Australia's central banker, on Tuesday said the virus outbreak was having a "significant effect" on travel and education sectors. The central bank lowered its rate by one quarter of a percentage point to a new low of 0.5 percent.
Malaysia's central bank said it expected the economy to "gradually improve" in the second quarter of this year but flagged some risks "stemming from the evolving nature and prolonged impact of the Covid-19 outbreak." It also lowered rates by one quarter of a percentage point to 2.5 percent.
Major stock indexes in Australia and Malaysia both rose 0.7 percent.
The shortest "correction" in almost a century.
Before Monday's rally, the S&P 500 had dropped more than 11 percent in a week. That's its worst weekly decline since the 2008 financial crisis, and a drop that pushed it into what's known as a correction — a drop of 10 percent or more, representing a psychologically significant marker for investors.
But Monday's surge meant that the correction lasted only nine days, which, according to Yardeni Research, was the shortest on record in terms of calendar days since 1928, the earliest date for which the research group has published data on the S&P.
The previous two corrections in the S&P 500 were both in 2018, when the market fell 10.2 percent for 13 days ending in February and 19.8 percent for 95 days ending in December.
Late on Monday, Hyatt Hotels withdrew its financial forecasts for 2020, in part because of the impact of travel restrictions imposed by companies since the virus outbreak, saying its ability to assess the impact of the virus "continues to be limited because of quickly changing circumstances and uncertain consumer demand for travel."
British Airways and Ryanair, the Irish discount airline, announced cancellations of hundreds of flights as travel declines amid coronavirus concerns. British Airways canceled 216 flights from London to New York, Italy, France, Germany, Belgium, Austria and Ireland from March 16 to 28. The airline had previously canceled flights to mainland China and reduced service to Italy. Ryanair canceled a quarter of its flights to and from Italy, from March 17 to April 8.
Twitter, which had already closed offices in Japan and South Korea and banned nonessential travel, on Monday encouraged all of its employees in the United States and other countries to work from home. And its chief executive, Jack Dorsey, pulled out of a speaking engagement at South by Southwest, an annual technology conference and music festival scheduled to be held in two weeks in Austin, Tex.
Reporting was contributed by Ben Casselman, Geneva Abdul, Kate Conger, Alexandra Stevenson, Jeanna Smialek, Kevin Granville, Carlos Tejada, and Jack Ewing.
TaggedCoronavirusglobalhopesLiverisestocksupdates
Mining and agriculture will 'underwrite Australia's economic recovery' – Sky News Australia
COVID-19 cases surpass 1.9 million worldwide, Australia death toll at 62 as unemployment rate tipped to grow
Mining and agriculture will 'underwrite Australia's economic recovery'
Previous Article Global Stocks Rise on Hopes of Help Over Coronavirus
Next Article Economic Powers Vow to Fight Crisis, but Not Yet
View all posts by australia →
IMF forecasts big coronavirus growth hit amid world in a 'great lockdown'
Renewables could drive Australia's COVID-19 economic recovery
Copyright 2018 - 99 SHSA


text:
WVU's Jutla earns prestigious NSF CAREER award
Antar Jutla, an assistant professor of civil and environmental engineering, has earned a CAREER award from the National Science Foundation.
Antar Jutla, assistant professor of civil and environmental engineering at West Virginia University, has earned a prestigious CAREER award from the National Science Foundation for his research on how extreme events and enhanced climatic variability impact the emergence of water-borne pathogens that cause infection in humans. The award comes with nearly $500,000 in funding over a five-year period.
Yemen and Haiti are just two of a growing number of countries that are facing humanitarian crises due to escalations in cholera cases. In Yemen alone, the International Committee of the Red Cross announced that the number of suspected cholera cases in the war-torn had reached one million in less than nine months.
According to Jutla, there are several issues that have led to the rapid spread of this disease, which is 100 percent preventable and treatable.
"Aging and deteriorating civil infrastructure is the major road block to combat diseases such as cholera," said Jutla. "A natural disaster usually destroys fragile infrastructure, which causes people to interact with water that is already contaminated with pathogens."
Jutla and the members of his research team, which include WVU students at both the graduate and undergraduate levels, will analyze satellite data to create models that predict the distribution of pathogenic cholera bacteria. The goal is to determine potential new regions with elevated risk of disease outbreak where increases in climatic variability intersect with extreme natural events.
"The research is intended to provide a quantitative baseline framework, potentially applicable on a global scale, to assess the occurrence and spread of pathogens in the environment and human population," Jutla said. "This can aid policymakers, aid organizations and governmental health agencies in the preparation of disease mitigation strategies. The computational infrastructure developed through this research will be made available to a wide array of students who have interest in public health, climate modeling and hydroclimatology.
"One of the biggest challenges that we are likely to face is from changes in frequency of Atlantic hurricanes," Jutla continued. "Tools and algorithms developed in this project will aid in determining policies to develop resilient and robust civil infrastructure."
"Dr. Jutla's research work covers topics in the nexus of hydroclimate, environment and human health," said Hema Siriwardane, department chair. "His research interests include remote sensing of hydrologic processes, food security, human nutrition and water governance, and he has developed a strong research program linking water resources and human health. His research work also has an international component, which has brought visibility to our graduate program. This award will contribute to increasing the number of graduate students and improving the national and international visibility of the Department."
Jutla earned his doctorate in civil and environmental engineering from Tufts University and master's degrees in civil and geological engineering and soil and water engineering from the University of Saskatchewan and Punjab Agricultural University, respectively.
The NSF's Faculty Early Career Development, or CAREER, program supports junior faculty who exemplify the role of teacher-scholars through outstanding research, excellent education and the integration of education and research within the context of the mission of their organizations. This is the eighth straight year that a member of the Statler College of Engineering and Mineral Resources faculty has been selected to receive this honor.
"Dr. Jutla is just the latest in what has become a long list of Statler College faculty to earn this prestigious award from the National Science Foundation," said Gene Cilento, Glen H. Hiner Dean of the Statler College. "His work has the ability to affect countless numbers of people across the globe in life-saving ways."
mcd/03/01/18
CONTACT: Mary C. Dillon, Statler College of Engineering and Mineral Resources
304.293.4086, Mary.Dillon@mail.wvu.edu
Health Research Benjamin M. Statler College of Engineering and Mineral Resources
Jutla's research includes remote sensing of hydrologic processes, food security, human nutrition and water governance.
Jutla's research team consists of WVU students at both graduate and undergraduate levels.
New WVU grant provides children with needed mobility equipment
WVU researchers to unveil economic action plan for Potomac Highlands counties
When physical activity extends beyond PE class


text:
Konk ist das zweite Album der britischen Indie-Rock-Band The Kooks. Es erschien am 11. April 2008 in Deutschland und wurde nach dem "Konk"-Studio von Ray Davies benannt, in dem es unter dem Produzenten Tony Hoffer aufgenommen wurde.

Es gibt eine spezielle Doppel-CD-Edition des Albums, die den Namen RAK trägt. Die zweite CD beinhaltet sieben weitere Stücke und eine zweite Version des Songs See the Sun.  Das Cover der Special Edition ist bis auf das rote Schild, das bei der normalen Version blau ist, identisch.  Namensgeber dieses Albums sind die RAK Studios des Produzenten Mickie Most, in denen die zusätzlichen Stücke aufgenommen wurden.

Verwendung als Soundtrack
Mr. Maker wurde in der Folge Winks der BBC-Three-Sitcom Grownups gespielt, Do You Wanna in der Serie  Gossip Girl von The CW, während Love It All in der zweiten Folge der zweiten Staffel Chuck Versus the Seduction der Fernsehserie Chuck verwendet wurde. Always Where I Need to Be, See the Sun, Love It All, Shine On und Mr. Maker wurden alle im Soundtrack der vierten Staffel der BBC-One-Fernsehserie Waterloo Road genutzt. Shine On war die Musik in verschiedenen Werbespots.

Rezeption
 laut.de lobt den "mitreißenden, mehrstimmigen Gesang" und das "schier überschäumende, sonnendurchflutete Harmoniegespür".
 Christian Preußer von Plattentests.de beschreibt den Klang der Band als "unverwechselbar" und "urbritisch".
 Pitchwork.com bezeichnet das Konk als Britpop-Album. Das Album beziehe sich auf David Bowie und der Titel auf die Kinks, die die Band nachzuahmen versuche. ("their handle factually references David Bowie, but the album title slyly and phonetically conjures the Kinks, the band these guys try hardest to emulate".)
 BBC Music findet, dass vieles auf dem Album auf das Recycling von Gitarrennoten und Intros hinauszulaufen scheint ("The album seems, on the whole, a little contrived with the recycling of old guitar lines and intros"). Die Band sei in ihrer Musik weniger enthusiastisch und bereit zu beeindrucken. ("it is the sound of a band who don't seem as enthused and as ready to impress".)

Titelliste
 See the Sun
 Always Where I Need to Be
 Mr. Maker
 Do You Wanna
 Gap
 Love It All
 Stormy Weather
 Sway
 Shine On
 Down to the Market
 One Last Time
 Tick of Time
 All Over Town (Hidden Track)
 Bad Taste in My Mouth (iTunes-Bonus-Track)
 Vicious (iTunes-Pre-Order-Bonus-Track)

CD 2 der Special-Edition RAK
 Watching the Ships Roll In
 Eaten By Your Lover
 No Longer
 Fa La La La La
 Nothing Ever Changes
 By My Side
 Hatful of Love
 See the Sun (Alternate Version)
 Brooklyn (Home Demo)

Weblinks
 Die Alben Konk und RAK. Motor Music

Einzelnachweise

Album (Indie-Rock)
Album 2008
Nummer-eins-Album

redpajama_set_name: RedPajamaWikipedia