Spring boot version is 4.0.0.
when spring build to native image with java 25.r25-nik
the repository like this
interface UserRepository : JpaRepository<User, Long> {
@Query("select u from User u where u.username = :username")
fun findByUsername(@Param("username") username: String, pageable: Pageable): Page<User>
}
the runtime throw exception like this
java.lang.ClassNotFoundException: java.lang.reflect.Parameter
at java.base@25/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:63) ~[demo.exe:na]
at java.base@25/java.lang.ClassLoader.loadClass(ClassLoader.java:490) ~[demo.exe:na]
at kotlin.reflect.jvm.internal.impl.descriptors.runtime.structure.Java8ParameterNamesLoader.buildCache(ReflectJavaMember.kt:87) ~[na:na]
at kotlin.reflect.jvm.internal.impl.descriptors.runtime.structure.Java8ParameterNamesLoader.loadParameterNames(ReflectJavaMember.kt:94) ~[na:na]
at kotlin.reflect.jvm.internal.impl.descriptors.runtime.structure.ReflectJavaMember.getValueParameters(ReflectJavaMember.kt:49) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.descriptors.runtime.structure.ReflectJavaMethod.getValueParameters(ReflectJavaMethod.kt:26) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaScope.resolveMethodToFunctionDescriptor(LazyJavaScope.kt:166) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaScope.declaredFunctions$lambda$0(LazyJavaScope.kt:94) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaScope.accessor$LazyJavaScope$lambda2(LazyJavaScope.kt) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaScope$$Lambda$2.invoke(Unknown Source) ~[na:na]
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$MapBasedMemoizedFunction.invoke(LockBasedStorageManager.java:578) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$MapBasedMemoizedFunctionToNotNull.invoke(LockBasedStorageManager.java:681) ~[na:na]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaScope.declaredFunctions$lambda$0(LazyJavaScope.kt:89) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaScope.accessor$LazyJavaScope$lambda2(LazyJavaScope.kt) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaScope$$Lambda$2.invoke(Unknown Source) ~[na:na]
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$MapBasedMemoizedFunction.invoke(LockBasedStorageManager.java:578) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$MapBasedMemoizedFunctionToNotNull.invoke(LockBasedStorageManager.java:681) ~[na:na]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaScope.functions$lambda$0(LazyJavaScope.kt:119) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaScope.accessor$LazyJavaScope$lambda4(LazyJavaScope.kt) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaScope$$Lambda$4.invoke(Unknown Source) ~[na:na]
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$MapBasedMemoizedFunction.invoke(LockBasedStorageManager.java:578) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$MapBasedMemoizedFunctionToNotNull.invoke(LockBasedStorageManager.java:681) ~[na:na]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaScope.getContributedFunctions(LazyJavaScope.kt:273) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaClassMemberScope.getContributedFunctions(LazyJavaClassMemberScope.kt:865) ~[na:na]
at kotlin.reflect.jvm.internal.impl.resolve.scopes.SubstitutingScope.getContributedFunctions(SubstitutingScope.kt:84) ~[na:na]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaClassMemberScope.getFunctionsFromSupertypes(LazyJavaClassMemberScope.kt:490) ~[na:na]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaClassMemberScope.computeNonDeclaredFunctions(LazyJavaClassMemberScope.kt:319) ~[na:na]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaScope.functions$lambda$0(LazyJavaScope.kt:123) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaScope.accessor$LazyJavaScope$lambda4(LazyJavaScope.kt) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaScope$$Lambda$4.invoke(Unknown Source) ~[na:na]
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$MapBasedMemoizedFunction.invoke(LockBasedStorageManager.java:578) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$MapBasedMemoizedFunctionToNotNull.invoke(LockBasedStorageManager.java:681) ~[na:na]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaScope.getContributedFunctions(LazyJavaScope.kt:273) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaClassMemberScope.getContributedFunctions(LazyJavaClassMemberScope.kt:865) ~[na:na]
at kotlin.reflect.jvm.internal.impl.resolve.scopes.SubstitutingScope.getContributedFunctions(SubstitutingScope.kt:84) ~[na:na]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaClassMemberScope.getFunctionsFromSupertypes(LazyJavaClassMemberScope.kt:490) ~[na:na]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaClassMemberScope.computeNonDeclaredFunctions(LazyJavaClassMemberScope.kt:319) ~[na:na]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaScope.functions$lambda$0(LazyJavaScope.kt:123) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaScope.accessor$LazyJavaScope$lambda4(LazyJavaScope.kt) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaScope$$Lambda$4.invoke(Unknown Source) ~[na:na]
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$MapBasedMemoizedFunction.invoke(LockBasedStorageManager.java:578) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$MapBasedMemoizedFunctionToNotNull.invoke(LockBasedStorageManager.java:681) ~[na:na]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaScope.getContributedFunctions(LazyJavaScope.kt:273) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.load.java.lazy.descriptors.LazyJavaClassMemberScope.getContributedFunctions(LazyJavaClassMemberScope.kt:865) ~[na:na]
at kotlin.reflect.jvm.internal.impl.resolve.scopes.SubstitutingScope.getContributedFunctions(SubstitutingScope.kt:84) ~[na:na]
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedClassDescriptor$DeserializedClassMemberScope.computeNonDeclaredFunctions(DeserializedClassDescriptor.kt:311) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedMemberScope$OptimizedImplementation.computeFunctions(DeserializedMemberScope.kt:277) ~[na:na]
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedMemberScope$OptimizedImplementation.functions$lambda$0(DeserializedMemberScope.kt:251) ~[na:na]
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedMemberScope$OptimizedImplementation.accessor$DeserializedMemberScope$OptimizedImplementation$lambda0(DeserializedMemberScope.kt) ~[na:na]
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedMemberScope$OptimizedImplementation$$Lambda$0.invoke(Unknown Source) ~[na:na]
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$MapBasedMemoizedFunction.invoke(LockBasedStorageManager.java:578) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$MapBasedMemoizedFunctionToNotNull.invoke(LockBasedStorageManager.java:681) ~[na:na]
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedMemberScope$OptimizedImplementation.getContributedFunctions(DeserializedMemberScope.kt:329) ~[na:na]
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedMemberScope$OptimizedImplementation.addFunctionsAndPropertiesTo(DeserializedMemberScope.kt:360) ~[na:na]
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedMemberScope.computeDescriptors(DeserializedMemberScope.kt:115) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedClassDescriptor$DeserializedClassMemberScope.allDescriptors$lambda$0(DeserializedClassDescriptor.kt:282) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedClassDescriptor$DeserializedClassMemberScope.accessor$DeserializedClassDescriptor$DeserializedClassMemberScope$lambda1(DeserializedClassDescriptor.kt) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedClassDescriptor$DeserializedClassMemberScope$$Lambda$1.invoke(Unknown Source) ~[na:na]
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:408) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:527) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.serialization.deserialization.descriptors.DeserializedClassDescriptor$DeserializedClassMemberScope.getContributedDescriptors(DeserializedClassDescriptor.kt:292) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.impl.resolve.scopes.ResolutionScope$DefaultImpls.getContributedDescriptors$default(ResolutionScope.kt:50) ~[na:na]
at kotlin.reflect.jvm.internal.KDeclarationContainerImpl.getMembers(KDeclarationContainerImpl.kt:58) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.KClassImpl$Data.declaredNonStaticMembers_delegate$lambda$0(KClassImpl.kt:206) ~[na:na]
at kotlin.reflect.jvm.internal.KClassImpl$Data.accessor$KClassImpl$Data$lambda11(KClassImpl.kt) ~[na:na]
at kotlin.reflect.jvm.internal.KClassImpl$Data$$Lambda$11.invoke(Unknown Source) ~[na:na]
at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(ReflectProperties.java:70) ~[na:na]
at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(ReflectProperties.java:32) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.KClassImpl$Data.getDeclaredNonStaticMembers(KClassImpl.kt:206) ~[na:na]
at kotlin.reflect.jvm.internal.KClassImpl$Data.allNonStaticMembers_delegate$lambda$0(KClassImpl.kt:215) ~[na:na]
at kotlin.reflect.jvm.internal.KClassImpl$Data.accessor$KClassImpl$Data$lambda15(KClassImpl.kt) ~[na:na]
at kotlin.reflect.jvm.internal.KClassImpl$Data$$Lambda$15.invoke(Unknown Source) ~[na:na]
at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(ReflectProperties.java:70) ~[na:na]
at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(ReflectProperties.java:32) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.KClassImpl$Data.getAllNonStaticMembers(KClassImpl.kt:215) ~[na:na]
at kotlin.reflect.jvm.internal.KClassImpl$Data.allMembers_delegate$lambda$0(KClassImpl.kt:221) ~[na:na]
at kotlin.reflect.jvm.internal.KClassImpl$Data.accessor$KClassImpl$Data$lambda18(KClassImpl.kt) ~[na:na]
at kotlin.reflect.jvm.internal.KClassImpl$Data$$Lambda$18.invoke(Unknown Source) ~[na:na]
at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(ReflectProperties.java:70) ~[na:na]
at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(ReflectProperties.java:32) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.KClassImpl$Data.getAllMembers(KClassImpl.kt:221) ~[na:na]
at kotlin.reflect.jvm.internal.KClassImpl.getMembers(KClassImpl.kt:250) ~[na:na]
at kotlin.reflect.full.KClasses.getFunctions(KClasses.kt:87) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.ReflectJvmMapping.getKotlinFunction(ReflectJvmMapping.kt:140) ~[na:na]
at org.springframework.core.Nullness$KotlinDelegate.forMethodReturnType(Nullness.java:189) ~[na:na]
at org.springframework.core.Nullness.forMethodReturnType(Nullness.java:90) ~[demo.exe:7.0.1]
at org.springframework.core.Nullness.forMethodParameter(Nullness.java:119) ~[demo.exe:7.0.1]
at org.springframework.data.util.NullnessMethodInvocationValidator$MethodNullness.isNullableParameter(NullnessMethodInvocationValidator.java:183) ~[na:na]
at org.springframework.data.util.NullnessMethodInvocationValidator$MethodNullness.of(NullnessMethodInvocationValidator.java:146) ~[na:na]
at org.springframework.data.util.NullnessMethodInvocationValidator.invoke(NullnessMethodInvocationValidator.java:82) ~[demo.exe:4.0.0]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[na:na]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:222) ~[na:na]
at jdk.proxy4/jdk.proxy4.$Proxy/s78162c86.findByUsername(Unknown Source) ~[na:na]
at com.xzcode.demo.controller.UserController.getUsers(UserController.kt:21) ~[demo.exe:na]
at java.base@25/java.lang.reflect.Method.invoke(Method.java:565) ~[demo.exe:na]
at kotlin.reflect.jvm.internal.calls.CallerImpl$Method.callMethod(CallerImpl.kt:97) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.calls.CallerImpl$Method$Instance.call(CallerImpl.kt:113) ~[na:na]
at kotlin.reflect.jvm.internal.KCallableImpl.callDefaultMethod$kotlin_reflection(KCallableImpl.kt:250) ~[demo.exe:2.2.21-release-469]
at kotlin.reflect.jvm.internal.KCallableImpl.callBy(KCallableImpl.kt:155) ~[demo.exe:2.2.21-release-469]
at org.springframework.web.method.support.InvocableHandlerMethod$KotlinDelegate.invokeFunction(InvocableHandlerMethod.java:336) ~[na:na]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:256) ~[demo.exe:7.0.1]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:190) ~[demo.exe:7.0.1]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[demo.exe:7.0.1]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:934) ~[demo.exe:7.0.1]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:853) ~[demo.exe:7.0.1]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:86) ~[demo.exe:7.0.1]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) ~[demo.exe:7.0.1]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:866) ~[demo.exe:7.0.1]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1003) ~[demo.exe:7.0.1]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:892) ~[demo.exe:7.0.1]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:622) ~[demo.exe:6.1]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:874) ~[demo.exe:7.0.1]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:710) ~[demo.exe:6.1]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:128) ~[na:na]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[demo.exe:11.0.14]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[na:na]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[demo.exe:7.0.1]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[demo.exe:7.0.1]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[na:na]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[demo.exe:7.0.1]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[demo.exe:7.0.1]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[na:na]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:199) ~[demo.exe:7.0.1]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[demo.exe:7.0.1]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[na:na]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165) ~[na:na]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:77) ~[na:na]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) ~[demo.exe:11.0.14]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113) ~[na:na]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83) ~[demo.exe:11.0.14]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72) ~[na:na]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341) ~[na:na]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397) ~[na:na]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[demo.exe:11.0.14]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903) ~[na:na]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778) ~[na:na]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[demo.exe:11.0.14]
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946) ~[na:na]
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480) ~[na:na]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57) ~[na:na]
at java.base@25/java.lang.Thread.runWith(Thread.java:1487) ~[demo.exe:na]
at java.base@25/java.lang.Thread.run(Thread.java:1474) ~[demo.exe:na]
at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:837) ~[demo.exe:na]
at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:813) ~[demo.exe:na]
Comment From: wilkinsona
Thanks for the report. This looks to me like a problem with Framework's Nullness support that's new in 7.0 when using Kotlin in a native image. I'm not sure if this can be fixed in Framework directly or if it'll require a change in Kotlin. We'll transfer this to the Framework team so that they can investigate further.