Re: Re: Re: No XML deserialization with TomEE 9.1.0 and JAAS

2023-07-19 Thread Richard Zowalla
Hi Markus,

thanks for the sample project. I followed the README and could
reproduce the stacktrace. I noticed, that the WAR file created via
Gradle contains a lot of libs of which many are already bundled within
TomEE:

-rw-rw-r-- 1 rz rz 310K Jul 19 13:59 FastInfoset-1.2.16.jar
-rw-rw-r-- 1 rz rz 27K Jul 19 13:59 istack-commons-runtime-3.0.8.jar
-rw-rw-r-- 1 rz rz 44K Jul 19 13:59 jakarta.activation-api-1.2.1.jar
-rw-rw-r-- 1 rz rz 113K Jul 19 13:59 jakarta.xml.bind-api-2.3.2.jar
-rw-rw-r-- 1 rz rz 36K Jul 19 13:59 jakarta.xml.soap-api-1.4.1.jar
-rw-rw-r-- 1 rz rz 56K Jul 19 13:58 javax.activation-api-1.2.0.jar
-rw-rw-r-- 1 rz rz 26K Jul 19 13:58 javax.annotation-api-1.3.2.jar
-rw-rw-r-- 1 rz rz 23K Jul 19 13:58 javax.jws-3.1.2.2.jar
-rw-rw-r-- 1 rz rz 46K Jul 19 13:58 javax.xml.soap-api-1.4.0.jar
-rw-rw-r-- 1 rz rz 126K Jul 19 13:58 jaxb-api-2.3.1.jar
-rw-rw-r-- 1 rz rz 990K Jul 19 13:59 jaxb-runtime-2.3.2.jar
-rw-rw-r-- 1 rz rz 56K Jul 19 13:58 jaxws-api-2.3.1.jar
-rw-rw-r-- 1 rz rz 66K Jul 19 13:59 mimepull-1.9.11.jar
-rw-rw-r-- 1 rz rz 447K Jul 19 13:59 saaj-impl-1.5.1.jar
-rw-rw-r-- 1 rz rz 38K Jul 19 13:59 stax-ex-1.8.1.jar
-rw-rw-r-- 1 rz rz 71K Jul 19 13:59 txw2-2.3.2.jar

Looking into FactoryFinder.find(...) and some debugging further, the
actual exception while trying to load the factory is:

java.util.ServiceConfigurationError: jakarta.xml.soap.SAAJMetaFactory:
com.sun.xml.messaging.saaj.soap.SAAJMetaFactoryImpl not a subtype

This is because you have a javax dependency in your webapp: saaj-impl-
1.5.1.jar (+ classloader looks up here first) uses the old namespace.

As I am not really familiar with Gradle, I migrated the project to
Maven and debugged it with the TomEE Maven Plugin. The resulting WAR
file does not contain any libs as everything is provided by TomEE.
(Don't really know why Gradle puts the whole bunch of stuff into the
WAR file ...)

Deploying that "stripped" war file, sending a related SOAP request as
mentioned in the README:

http://schemas.xmlsoap.org/soap/envelope/;
xmlns:wss="http://example.com/wssession/;>
   
   
  
 
 ?
 
 ?
  
   


I get the following response:

http://schemas.xmlsoap.org/soap/envelope/;>
 
 http://example.com/wssession/;>
 http://www.w3.org/2001/XMLSchema-instance;
xsi:nil="true"/>
 http://www.w3.org/2001/XMLSchema-instance;
xsi:nil="true"/>
 
 


Gruß
Richard



Am Mittwoch, dem 19.07.2023 um 12:56 +0200 schrieb tomee-u...@web.de:
> > Sorry, opened the repository.
> > 
> > 
> > > > Gesendet: Mittwoch, 19. Juli 2023 um 12:14 Uhr
> > > > Von: "Richard Zowalla" 
> > > > An: users@tomee.apache.org
> > > > Betreff: Re: Re: No XML deserialization with TomEE 9.1.0 and
> > > > JAAS
> > > > 
> > > > Hi Markus,
> > > > 
> > > > the link results in a 404 -> private repo?
> > > > 
> > > > Gruß
> > > > Richard
> > > > 
> > > > Am Mittwoch, dem 19.07.2023 um 11:10 +0200 schrieb > >
> > > > tomee-u...@web.de:
> > > > > > Hi Richard,
> > > > > > 
> > > > > > to my surprise I was able to reproduce the issue with a
> > > > > > small
> > > > > > example.
> > > > > > https://github.com/abstract-thinking/JaasSoapTomEEIssue/tree/master
> > > > > > 
> > > > > > I really hope that it is not mistake by myself. ;-)
> > > > > > 
> > > > > > By the way - Java 17 is used.
> > > > > > 
> > > > > > Cheers,
> > > > > > Markus
> > > > > > 
> > > > > > > > Gesendet: Dienstag, 18. Juli 2023 um 20:18 Uhr
> > > > > > > > Von: "Richard Zowalla" 
> > > > > > > > An: users@tomee.apache.org
> > > > > > > > Betreff: Re: No XML deserialization with TomEE 9.1.0
> > > > > > > > and JAAS
> > > > > > > > 
> > > > > > > > Hi,
> > > > > > > > 
> > > > > > > > maybe adding a small reproducer to GitHub would help in
> > > > > > > > > > > > identifying
> > > > > > > > any
> > > > > > > > issue?
> > > > > > > > 
> > > > > > > > Gruß
> > > > > > > > Richard
> > > > > > > > 
> > > > > > > > 
> > > > > > > > Am Dienstag, dem 18.07.2023 um 17:56 +0200 schrieb
> > > > > > > > tomee-u...@web.de:
> > > > > > > > > > Hi,
> > > > > > > > > > 
> > > > > > > > > > I ported our war file from TomEE 8.0.15 to TomEE
> > > > > > > > > > 9.1.0.
> > > > > > > > > > 
> > > > > > > > > > The deployment works fine with some new infos[1]
> > > > > > > > > > where I > > > > > think
> > > > > > > > > > they
> > > > > > > > > > are not a serious issue.
> > > > > > > > > > 
> > > > > > > > > > The application uses a SOAP interface and the WSDL
> > > > > > > > > > will be
> > > > > > > > > > retrieved.
> > > > > > > > > > 
> > > > > > > > > > The server is using JAAS [2][3][4]. I think at the
> > > > > > > > > > moment I
> > > > > > > > > > configured the TomEE system correctly.
> > > > > > > > > > 
> > > > > > > > > > Now I'm observing that the SOAP messages are not
> > > > > > > > > > deserialized > > > > > and
> > > > > > > > > > an
> > > > > > > > > > exception will be thrown.
> > > > > > > > > > 
> > > > > > > > > > 18-Jul-2023 17:19:49.419 WARNING [http-nio-8080-
> > > > > > > > > > 

Aw: Re: Re: No XML deserialization with TomEE 9.1.0 and JAAS

2023-07-19 Thread tomee-user
Sorry, opened the repository.


> Gesendet: Mittwoch, 19. Juli 2023 um 12:14 Uhr
> Von: "Richard Zowalla" 
> An: users@tomee.apache.org
> Betreff: Re: Re: No XML deserialization with TomEE 9.1.0 and JAAS
>
> Hi Markus,
> 
> the link results in a 404 -> private repo?
> 
> Gruß
> Richard
> 
> Am Mittwoch, dem 19.07.2023 um 11:10 +0200 schrieb tomee-u...@web.de:
> > Hi Richard,
> > 
> > to my surprise I was able to reproduce the issue with a small
> > example.
> > https://github.com/abstract-thinking/JaasSoapTomEEIssue/tree/master
> > 
> > I really hope that it is not mistake by myself. ;-)
> > 
> > By the way - Java 17 is used.
> > 
> > Cheers,
> > Markus
> > 
> > > Gesendet: Dienstag, 18. Juli 2023 um 20:18 Uhr
> > > Von: "Richard Zowalla" 
> > > An: users@tomee.apache.org
> > > Betreff: Re: No XML deserialization with TomEE 9.1.0 and JAAS
> > > 
> > > Hi,
> > > 
> > > maybe adding a small reproducer to GitHub would help in identifying
> > > any
> > > issue?
> > > 
> > > Gruß
> > > Richard
> > > 
> > > 
> > > Am Dienstag, dem 18.07.2023 um 17:56 +0200 schrieb
> > > tomee-u...@web.de:
> > > > Hi,
> > > > 
> > > > I ported our war file from TomEE 8.0.15 to TomEE 9.1.0.
> > > > 
> > > > The deployment works fine with some new infos[1] where I think
> > > > they
> > > > are not a serious issue.
> > > > 
> > > > The application uses a SOAP interface and the WSDL will be
> > > > retrieved.
> > > > 
> > > > The server is using JAAS [2][3][4]. I think at the moment I
> > > > configured the TomEE system correctly.
> > > > 
> > > > Now I'm observing that the SOAP messages are not deserialized and
> > > > an
> > > > exception will be thrown.
> > > > 
> > > > 18-Jul-2023 17:19:49.419 WARNING [http-nio-8080-exec-1]
> > > > org.apache.cxf.phase.PhaseInterceptorChain.doDefaultLogging
> > > > Interceptor for {http://company.com/wssession/}WSSession has
> > > > thrown
> > > > exc
> > > > eption, unwinding now
> > > >     org.apache.cxf.binding.soap.SoapFault: Error reading
> > > > XMLStreamReader.
> > > >     at
> > > > org.apache.cxf.binding.soap.saaj.SAAJInInterceptor$SAAJPreInInter
> > > > cept
> > > > or.handleMessage(SAAJInInterceptor.java:145)
> > > >     at
> > > > org.apache.cxf.binding.soap.saaj.SAAJInInterceptor$SAAJPreInInter
> > > > cept
> > > > or.handleMessage(SAAJInInterceptor.java:107)
> > > >     at
> > > > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInter
> > > > cept
> > > > orChain.java:307)
> > > >     [...]
> > > >     Caused by: jakarta.xml.soap.SOAPException: Unable to
> > > > create
> > > > message factory for SOAP: Error while searching for service
> > > > [jakarta.xml.soap.MessageFactory]
> > > >     at
> > > > jakarta.xml.soap.MessageFactory.newInstance(MessageFactory.java:9
> > > > 0)
> > > >     at
> > > > org.apache.cxf.binding.soap.saaj.SAAJFactoryResolver.createMessag
> > > > eFac
> > > > tory(SAAJFactoryResolver.java:56)
> > > >     at
> > > > org.apache.cxf.binding.soap.saaj.SAAJInInterceptor$SAAJPreInInter
> > > > cept
> > > > or.getFactory(SAAJInInterceptor.java:151)
> > > >     at
> > > > org.apache.cxf.binding.soap.saaj.SAAJInInterceptor$SAAJPreInInter
> > > > cept
> > > > or.handleMessage(SAAJInInterceptor.java:133)
> > > >     ... 36 more
> > > > 
> > > > 
> > > > In the resources.xml the WSS4J is configured where the
> > > > onterceptor is
> > > > invoked [5] ...
> > > > 
> > > > Does anybody have an idea how TomEE is not finding a
> > > > SoapMessageFactory? What can I do? My assumption was that a lib
> > > > is
> > > > inside the library folder? [6]
> > > > 
> > > > Thanks,
> > > > Markus
> > > > 
> > > > 
> > > > 
> > > > [1]
> > > > 18-Jul-2023 17:17:48.929 INFO [main]
> > > > org.apache.cxf.jaxb.JAXBContextInitializer.addClass Class
> > > > jakarta.xml.bind.JAXBElement does not have a default constructor
> > > > which JAXB requires.
> > > > 18-Jul-2023 17:17:48.983 INFO [main]
> > > > org.apache.cxf.common.jaxb.JAXBUtils.createEscapeHandler Failed
> > > > to
> > > > create MinimumEscapeHandler
> > > > 
> > > > [2]
> > > > less conf/login.config
> > > > jaasContext  {
> > > >    
> > > > org.apache.openejb.core.security.jaas.ServiceProviderLoginModule
> > > > required;
> > > > };
> > > > 
> > > > [3]
> > > > less conf/server.xml
> > > >     
> > > > 
> > > >   
> > > >   
> > > > 
> > > >   
> > > >    > > > appName="jaasContext"
> > > >    
> > > > userClassNames="org.apache.openejb.core.security.jaas.UserPrincip
> > > > al"
> > > >    
> > > > roleClassNames="org.apache.openejb.core.security.jaas.GroupPrinci
> > > > pal"
> > > > > 
> > > >   
> > > > 
> > > > [4]
> > > > less bin/setenv.sh
> > > > export CATALINA_OPTS="$CATALINA_OPTS -
> > > > Djava.security.auth.login.config=/opt/tomee/current/conf/login.co
> > > > nfig
> > > > "
> > > > 
> > > > [5]
> > > > 
> > > >     
> > > >      > > > 

Re: Re: No XML deserialization with TomEE 9.1.0 and JAAS

2023-07-19 Thread Richard Zowalla
Hi Markus,

the link results in a 404 -> private repo?

Gruß
Richard

Am Mittwoch, dem 19.07.2023 um 11:10 +0200 schrieb tomee-u...@web.de:
> Hi Richard,
> 
> to my surprise I was able to reproduce the issue with a small
> example.
> https://github.com/abstract-thinking/JaasSoapTomEEIssue/tree/master
> 
> I really hope that it is not mistake by myself. ;-)
> 
> By the way - Java 17 is used.
> 
> Cheers,
> Markus
> 
> > Gesendet: Dienstag, 18. Juli 2023 um 20:18 Uhr
> > Von: "Richard Zowalla" 
> > An: users@tomee.apache.org
> > Betreff: Re: No XML deserialization with TomEE 9.1.0 and JAAS
> > 
> > Hi,
> > 
> > maybe adding a small reproducer to GitHub would help in identifying
> > any
> > issue?
> > 
> > Gruß
> > Richard
> > 
> > 
> > Am Dienstag, dem 18.07.2023 um 17:56 +0200 schrieb
> > tomee-u...@web.de:
> > > Hi,
> > > 
> > > I ported our war file from TomEE 8.0.15 to TomEE 9.1.0.
> > > 
> > > The deployment works fine with some new infos[1] where I think
> > > they
> > > are not a serious issue.
> > > 
> > > The application uses a SOAP interface and the WSDL will be
> > > retrieved.
> > > 
> > > The server is using JAAS [2][3][4]. I think at the moment I
> > > configured the TomEE system correctly.
> > > 
> > > Now I'm observing that the SOAP messages are not deserialized and
> > > an
> > > exception will be thrown.
> > > 
> > > 18-Jul-2023 17:19:49.419 WARNING [http-nio-8080-exec-1]
> > > org.apache.cxf.phase.PhaseInterceptorChain.doDefaultLogging
> > > Interceptor for {http://company.com/wssession/}WSSession has
> > > thrown
> > > exc
> > > eption, unwinding now
> > >     org.apache.cxf.binding.soap.SoapFault: Error reading
> > > XMLStreamReader.
> > >     at
> > > org.apache.cxf.binding.soap.saaj.SAAJInInterceptor$SAAJPreInInter
> > > cept
> > > or.handleMessage(SAAJInInterceptor.java:145)
> > >     at
> > > org.apache.cxf.binding.soap.saaj.SAAJInInterceptor$SAAJPreInInter
> > > cept
> > > or.handleMessage(SAAJInInterceptor.java:107)
> > >     at
> > > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInter
> > > cept
> > > orChain.java:307)
> > >     [...]
> > >     Caused by: jakarta.xml.soap.SOAPException: Unable to
> > > create
> > > message factory for SOAP: Error while searching for service
> > > [jakarta.xml.soap.MessageFactory]
> > >     at
> > > jakarta.xml.soap.MessageFactory.newInstance(MessageFactory.java:9
> > > 0)
> > >     at
> > > org.apache.cxf.binding.soap.saaj.SAAJFactoryResolver.createMessag
> > > eFac
> > > tory(SAAJFactoryResolver.java:56)
> > >     at
> > > org.apache.cxf.binding.soap.saaj.SAAJInInterceptor$SAAJPreInInter
> > > cept
> > > or.getFactory(SAAJInInterceptor.java:151)
> > >     at
> > > org.apache.cxf.binding.soap.saaj.SAAJInInterceptor$SAAJPreInInter
> > > cept
> > > or.handleMessage(SAAJInInterceptor.java:133)
> > >     ... 36 more
> > > 
> > > 
> > > In the resources.xml the WSS4J is configured where the
> > > onterceptor is
> > > invoked [5] ...
> > > 
> > > Does anybody have an idea how TomEE is not finding a
> > > SoapMessageFactory? What can I do? My assumption was that a lib
> > > is
> > > inside the library folder? [6]
> > > 
> > > Thanks,
> > > Markus
> > > 
> > > 
> > > 
> > > [1]
> > > 18-Jul-2023 17:17:48.929 INFO [main]
> > > org.apache.cxf.jaxb.JAXBContextInitializer.addClass Class
> > > jakarta.xml.bind.JAXBElement does not have a default constructor
> > > which JAXB requires.
> > > 18-Jul-2023 17:17:48.983 INFO [main]
> > > org.apache.cxf.common.jaxb.JAXBUtils.createEscapeHandler Failed
> > > to
> > > create MinimumEscapeHandler
> > > 
> > > [2]
> > > less conf/login.config
> > > jaasContext  {
> > >    
> > > org.apache.openejb.core.security.jaas.ServiceProviderLoginModule
> > > required;
> > > };
> > > 
> > > [3]
> > > less conf/server.xml
> > >     
> > > 
> > >   
> > >   
> > > 
> > >   
> > >    > > appName="jaasContext"
> > >    
> > > userClassNames="org.apache.openejb.core.security.jaas.UserPrincip
> > > al"
> > >    
> > > roleClassNames="org.apache.openejb.core.security.jaas.GroupPrinci
> > > pal"
> > > > 
> > >   
> > > 
> > > [4]
> > > less bin/setenv.sh
> > > export CATALINA_OPTS="$CATALINA_OPTS -
> > > Djava.security.auth.login.config=/opt/tomee/current/conf/login.co
> > > nfig
> > > "
> > > 
> > > [5]
> > > 
> > >     
> > >      > > name="org.apache.openejb.server.cxf.config.WSS4JInInterceptorFact
> > > ory"
> > > factory-name="create">
> > >     action = UsernameToken
> > >     passwordCallbackClass = com.company.PasswordHandler
> > >     
> > > 
> > > 
> > > [6]
> > > /opt/tomee/apache-tomee-plus-9.1.0/lib$ find -name "*cxf*"
> > > ./cxf-rt-rs-mp-client-shade-9.1.0.jar
> > > ./openejb-cxf-transport-9.1.0.jar
> > > ./openejb-cxf-rs-9.1.0.jar
> > > ./cxf-shade-9.1.0.jar
> > > ./openejb-cxf-9.1.0.jar
> > > /opt/tomee/apache-tomee-plus-9.1.0/lib$ find -name "*soap*"
> > > 

Aw: Re: No XML deserialization with TomEE 9.1.0 and JAAS

2023-07-19 Thread tomee-user
Hi Richard,

to my surprise I was able to reproduce the issue with a small example.
https://github.com/abstract-thinking/JaasSoapTomEEIssue/tree/master

I really hope that it is not mistake by myself. ;-)

By the way - Java 17 is used.

Cheers,
Markus

> Gesendet: Dienstag, 18. Juli 2023 um 20:18 Uhr
> Von: "Richard Zowalla" 
> An: users@tomee.apache.org
> Betreff: Re: No XML deserialization with TomEE 9.1.0 and JAAS
>
> Hi,
> 
> maybe adding a small reproducer to GitHub would help in identifying any
> issue?
> 
> Gruß
> Richard
> 
> 
> Am Dienstag, dem 18.07.2023 um 17:56 +0200 schrieb tomee-u...@web.de:
> > Hi,
> > 
> > I ported our war file from TomEE 8.0.15 to TomEE 9.1.0.
> > 
> > The deployment works fine with some new infos[1] where I think they
> > are not a serious issue.
> > 
> > The application uses a SOAP interface and the WSDL will be retrieved.
> > 
> > The server is using JAAS [2][3][4]. I think at the moment I
> > configured the TomEE system correctly.
> > 
> > Now I'm observing that the SOAP messages are not deserialized and an
> > exception will be thrown.
> > 
> > 18-Jul-2023 17:19:49.419 WARNING [http-nio-8080-exec-1]
> > org.apache.cxf.phase.PhaseInterceptorChain.doDefaultLogging
> > Interceptor for {http://company.com/wssession/}WSSession has thrown
> > exc
> > eption, unwinding now
> >     org.apache.cxf.binding.soap.SoapFault: Error reading
> > XMLStreamReader.
> >     at
> > org.apache.cxf.binding.soap.saaj.SAAJInInterceptor$SAAJPreInIntercept
> > or.handleMessage(SAAJInInterceptor.java:145)
> >     at
> > org.apache.cxf.binding.soap.saaj.SAAJInInterceptor$SAAJPreInIntercept
> > or.handleMessage(SAAJInInterceptor.java:107)
> >     at
> > org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseIntercept
> > orChain.java:307)
> >     [...]
> >     Caused by: jakarta.xml.soap.SOAPException: Unable to create
> > message factory for SOAP: Error while searching for service
> > [jakarta.xml.soap.MessageFactory]
> >     at
> > jakarta.xml.soap.MessageFactory.newInstance(MessageFactory.java:90)
> >     at
> > org.apache.cxf.binding.soap.saaj.SAAJFactoryResolver.createMessageFac
> > tory(SAAJFactoryResolver.java:56)
> >     at
> > org.apache.cxf.binding.soap.saaj.SAAJInInterceptor$SAAJPreInIntercept
> > or.getFactory(SAAJInInterceptor.java:151)
> >     at
> > org.apache.cxf.binding.soap.saaj.SAAJInInterceptor$SAAJPreInIntercept
> > or.handleMessage(SAAJInInterceptor.java:133)
> >     ... 36 more
> > 
> > 
> > In the resources.xml the WSS4J is configured where the onterceptor is
> > invoked [5] ...
> > 
> > Does anybody have an idea how TomEE is not finding a
> > SoapMessageFactory? What can I do? My assumption was that a lib is
> > inside the library folder? [6]
> > 
> > Thanks,
> > Markus
> > 
> > 
> > 
> > [1]
> > 18-Jul-2023 17:17:48.929 INFO [main]
> > org.apache.cxf.jaxb.JAXBContextInitializer.addClass Class
> > jakarta.xml.bind.JAXBElement does not have a default constructor
> > which JAXB requires.
> > 18-Jul-2023 17:17:48.983 INFO [main]
> > org.apache.cxf.common.jaxb.JAXBUtils.createEscapeHandler Failed to
> > create MinimumEscapeHandler
> > 
> > [2]
> > less conf/login.config
> > jaasContext  {
> >     org.apache.openejb.core.security.jaas.ServiceProviderLoginModule
> > required;
> > };
> > 
> > [3]
> > less conf/server.xml
> >     
> > 
> >   
> >   
> > 
> >   
> >    > appName="jaasContext"
> >    
> > userClassNames="org.apache.openejb.core.security.jaas.UserPrincipal"
> >    
> > roleClassNames="org.apache.openejb.core.security.jaas.GroupPrincipal"
> > >
> >   
> > 
> > [4]
> > less bin/setenv.sh
> > export CATALINA_OPTS="$CATALINA_OPTS -
> > Djava.security.auth.login.config=/opt/tomee/current/conf/login.config
> > "
> > 
> > [5]
> > 
> >     
> >      > name="org.apache.openejb.server.cxf.config.WSS4JInInterceptorFactory"
> > factory-name="create">
> >     action = UsernameToken
> >     passwordCallbackClass = com.company.PasswordHandler
> >     
> > 
> > 
> > [6]
> > /opt/tomee/apache-tomee-plus-9.1.0/lib$ find -name "*cxf*"
> > ./cxf-rt-rs-mp-client-shade-9.1.0.jar
> > ./openejb-cxf-transport-9.1.0.jar
> > ./openejb-cxf-rs-9.1.0.jar
> > ./cxf-shade-9.1.0.jar
> > ./openejb-cxf-9.1.0.jar
> > /opt/tomee/apache-tomee-plus-9.1.0/lib$ find -name "*soap*"
> > ./opensaml-soap-api-4.2.0.jar
> > /opt/tomee/apache-tomee-plus-9.1.0/lib$ find -name "*xml*"
> > ./opensaml-xmlsec-impl-4.2.0.jar
> > ./opensaml-xmlsec-api-4.2.0.jar
> > ./xmlsec-3.0.1.jar
> > ./xmlschema-core-2.2.5.jar
> > 
> > 
> > 
> > 
> > 
> > 
> 
>