Being triggered by Laurent Schneider’s post “extract xml from the command line“; I completely forgot about the C-based XDK tooling you nowadays can find in your $ORACLE_HOME. You, probably just like me, weren’t even aware, there were some (C-based that is). Most of these are executable’s and not “just” Java tools, although xsql is a shell script that still starts Java. More information can be found here in the “Oracle® XML Developer’s Kit Programmer’s Guide 11.2”
I mean in principle they are not “new”, they were there since 8.1.x, but now they are compiled executables which you can use on the shell prompt and or in scripting and that is, at least for me, easier than doing the same via their $ORACLE_HOME/xdk Java counterparts.
A shortlist:
#66cc66;">[oracle@localhost bin#66cc66;">]$ pwd #66cc66;">/home#66cc66;">/oracle#66cc66;">/app#66cc66;">/oracle#66cc66;">/product#66cc66;">/11#66cc66;">.2#66cc66;">.0#66cc66;">/dbhome_2#66cc66;">/bin #66cc66;">[oracle@localhost bin#66cc66;">]$ ls #66cc66;">-l x#66cc66;">* schema #66cc66;">-rwxr#66cc66;">-xr#66cc66;">-x #cc66cc;">1 oracle oracle #cc66cc;">3433339 Jun #cc66cc;">23 #cc66cc;">19:#cc66cc;">56 schema #66cc66;">-rwxr#66cc66;">-xr#66cc66;">-x #cc66cc;">1 oracle oracle #cc66cc;">3582629 Jun #cc66cc;">23 #cc66cc;">19:#cc66cc;">55 xml #66cc66;">-rwxr#66cc66;">-xr#66cc66;">-x #cc66cc;">1 oracle oracle #cc66cc;">4006197 Jun #cc66cc;">23 #cc66cc;">19:#cc66cc;">56 xmlcg #66cc66;">-rwx#808080; font-style: italic;">------ 1 oracle oracle 49812 Mar 11 2009 xmlwf #66cc66;">-rwxr#66cc66;">-xr#66cc66;">-x #cc66cc;">1 oracle oracle #cc66cc;">3485095 Jun #cc66cc;">23 #cc66cc;">19:#cc66cc;">56 xsl #66cc66;">-rwxr#66cc66;">-xr#66cc66;">-x #cc66cc;">1 oracle oracle #cc66cc;">748 Nov #cc66cc;">12 #cc66cc;">2006 xsql #66cc66;">-rwxr#66cc66;">-xr#66cc66;">-x #cc66cc;">1 oracle oracle #cc66cc;">3496134 Jun #cc66cc;">23 #cc66cc;">19:#cc66cc;">56 xvm #66cc66;">[oracle@localhost bin#66cc66;">]$ file x#66cc66;">* schema xml: ELF #cc66cc;">32#66cc66;">-bit LSB executable#66cc66;">, Intel #cc66cc;">80386#66cc66;">, version #cc66cc;">1 #66cc66;">(SYSV#66cc66;">)#66cc66;">, #993333; font-weight: bold;">FOR GNU#66cc66;">/Linux 2#66cc66;">.2#66cc66;">.5#66cc66;">, dynamically linked #66cc66;">(uses shared libs#66cc66;">)#66cc66;">, #993333; font-weight: bold;">FOR GNU#66cc66;">/Linux 2#66cc66;">.2#66cc66;">.5#66cc66;">, #993333; font-weight: bold;">NOT stripped xmlcg: ELF #cc66cc;">32#66cc66;">-bit LSB executable#66cc66;">, Intel #cc66cc;">80386#66cc66;">, version #cc66cc;">1 #66cc66;">(SYSV#66cc66;">)#66cc66;">, #993333; font-weight: bold;">FOR GNU#66cc66;">/Linux 2#66cc66;">.2#66cc66;">.5#66cc66;">, dynamically linked #66cc66;">(uses shared libs#66cc66;">)#66cc66;">, #993333; font-weight: bold;">FOR GNU#66cc66;">/Linux 2#66cc66;">.2#66cc66;">.5#66cc66;">, #993333; font-weight: bold;">NOT stripped xmlwf: ELF #cc66cc;">32#66cc66;">-bit LSB executable#66cc66;">, Intel #cc66cc;">80386#66cc66;">, version #cc66cc;">1 #66cc66;">(SYSV#66cc66;">)#66cc66;">, #993333; font-weight: bold;">FOR GNU#66cc66;">/Linux 2#66cc66;">.2#66cc66;">.5#66cc66;">, dynamically linked #66cc66;">(uses shared libs#66cc66;">)#66cc66;">, #993333; font-weight: bold;">FOR GNU#66cc66;">/Linux 2#66cc66;">.2#66cc66;">.5#66cc66;">, #993333; font-weight: bold;">NOT stripped xsl: ELF #cc66cc;">32#66cc66;">-bit LSB executable#66cc66;">, Intel #cc66cc;">80386#66cc66;">, version #cc66cc;">1 #66cc66;">(SYSV#66cc66;">)#66cc66;">, #993333; font-weight: bold;">FOR GNU#66cc66;">/Linux 2#66cc66;">.2#66cc66;">.5#66cc66;">, dynamically linked #66cc66;">(uses shared libs#66cc66;">)#66cc66;">, #993333; font-weight: bold;">FOR GNU#66cc66;">/Linux 2#66cc66;">.2#66cc66;">.5#66cc66;">, #993333; font-weight: bold;">NOT stripped xsql: Bourne shell script text executable xvm: ELF #cc66cc;">32#66cc66;">-bit LSB executable#66cc66;">, Intel #cc66cc;">80386#66cc66;">, version #cc66cc;">1 #66cc66;">(SYSV#66cc66;">)#66cc66;">, #993333; font-weight: bold;">FOR GNU#66cc66;">/Linux 2#66cc66;">.2#66cc66;">.5#66cc66;">, dynamically linked #66cc66;">(uses shared libs#66cc66;">)#66cc66;">, #993333; font-weight: bold;">FOR GNU#66cc66;">/Linux 2#66cc66;">.2#66cc66;">.5#66cc66;">, #993333; font-weight: bold;">NOT stripped schema: ELF #cc66cc;">32#66cc66;">-bit LSB executable#66cc66;">, Intel #cc66cc;">80386#66cc66;">, version #cc66cc;">1 #66cc66;">(SYSV#66cc66;">)#66cc66;">, #993333; font-weight: bold;">FOR GNU#66cc66;">/Linux 2#66cc66;">.2#66cc66;">.5#66cc66;">, dynamically linked #66cc66;">(uses shared libs#66cc66;">)#66cc66;">, #993333; font-weight: bold;">FOR GNU#66cc66;">/Linux 2#66cc66;">.2#66cc66;">.5#66cc66;">, #993333; font-weight: bold;">NOT stripped
So here a small overview on what they can do…
The “schema” binary is probably the XML Schema Processor and can validate schemas, allowing use of simple and complex XML datatypes.
#66cc66;">[oracle@localhost bin#66cc66;">]$ schema #66cc66;">-h Unknown switch #66cc66;">-h Usage: schema #66cc66;">[flags#66cc66;">] #66cc66;"><instance#66cc66;">> #66cc66;">[schema#66cc66;">] #66cc66;">[working dir#66cc66;">] #993333; font-weight: bold;">WHERE: #66cc66;">instance#66cc66;">><instance#66cc66;">> #993333; font-weight: bold;">IS the XML instance document #993333; font-weight: bold;">TO validate #66cc66;">(required#66cc66;">) #66cc66;">[schema#66cc66;">] #993333; font-weight: bold;">IS the #993333; font-weight: bold;">DEFAULT schema #66cc66;">(optional#66cc66;">) #66cc66;">[working dir#66cc66;">] #993333; font-weight: bold;">IS the working directory #993333; font-weight: bold;">FOR processing #66cc66;">(optional#66cc66;">) Flags: #66cc66;">-#cc66cc;">0 Always exit #993333; font-weight: bold;">WITH code #cc66cc;">0 #66cc66;">(success#66cc66;">) #66cc66;">-c Extra tests #993333; font-weight: bold;">TO improve code coverage #66cc66;">-e #66cc66;"><encoding#66cc66;">> Specify #993333; font-weight: bold;">DEFAULT input file encoding #66cc66;">-E #66cc66;">encoding#66cc66;">><encoding#66cc66;">> Specify output#66cc66;">/#993333; font-weight: bold;">DATA#66cc66;">/presentation encoding #66cc66;">-i #993333; font-weight: bold;">IGNORE provided schema file #66cc66;">-o #66cc66;"><num#66cc66;">> Validation options #66cc66;">-p Print instance document #993333; font-weight: bold;">TO stdout #993333; font-weight: bold;">ON success #66cc66;">-v #993333; font-weight: bold;">SHOW version number #66cc66;">-u forced #993333; font-weight: bold;">TO Unicode path #66cc66;">[oracle@localhost bin#66cc66;">]$ schema #66cc66;">-v Oracle XML Developers Kit 11#66cc66;">.2#66cc66;">.0#66cc66;">.1#66cc66;">.0 #66cc66;">num#66cc66;">>encoding#66cc66;">>instance#66cc66;">>
Among others, “xml”, can be used for checks on XML well formedness and creates and parses XML with industry standard DOM and SAX interfaces.
#66cc66;">[oracle@localhost bin#66cc66;">]$ xml #66cc66;">-h Usage: xml #66cc66;">[switches#66cc66;">] #66cc66;">[document URI#66cc66;">] #993333; font-weight: bold;">OR xml #66cc66;">-f #66cc66;">[switches#66cc66;">] #66cc66;">[document filespec#66cc66;">] Switches: #66cc66;">-B #66cc66;"><baseuri#66cc66;">> #993333; font-weight: bold;">SET the Base uri #993333; font-weight: bold;">FOR XSLT processor#66cc66;">. BaseUri of http:#66cc66;">//pqr#66cc66;">/xsl#66cc66;">.txt resolves pqr#66cc66;">.txt #993333; font-weight: bold;">TO http:#66cc66;">//pqr#66cc66;">/pqr#66cc66;">.txt #66cc66;">-c Conformance #993333; font-weight: bold;">CHECK only#66cc66;">, no validation #66cc66;">-e #66cc66;"><encoding#66cc66;">> Specify #993333; font-weight: bold;">DEFAULT input file encoding #66cc66;">(#66cc66;">-ee #993333; font-weight: bold;">TO force#66cc66;">) #66cc66;">-E #66cc66;">encoding#66cc66;">><encoding#66cc66;">> Specify output#66cc66;">/#993333; font-weight: bold;">DATA#66cc66;">/presentation encoding #66cc66;">-f File #66cc66;">- Interpret #66cc66;"><document#66cc66;">> #993333; font-weight: bold;">AS filespec#66cc66;">, #993333; font-weight: bold;">NOT URI #66cc66;">-G #66cc66;"><xptr exprs#66cc66;">> evaluates XPointer scheme examples give #993333; font-weight: bold;">IN a file #66cc66;">-h Help #66cc66;">- #993333; font-weight: bold;">SHOW this usage help #66cc66;">(#66cc66;">-hh #993333; font-weight: bold;">FOR more options#66cc66;">) #66cc66;">-i #66cc66;"><n#66cc66;">> Number of times #993333; font-weight: bold;">TO iterate the XSLT processing #66cc66;">-l #66cc66;"><language#66cc66;">> #993333; font-weight: bold;">LANGUAGE #993333; font-weight: bold;">FOR error reporting #66cc66;">-o #66cc66;"><xsloutfile#66cc66;">> Specify output file of XSLT processor #66cc66;">-p Print document#66cc66;">/DTD structures after parse #66cc66;">-P Pretty print #993333; font-weight: bold;">FROM root element #66cc66;">-PP Pretty print #993333; font-weight: bold;">FROM root node #66cc66;">(DOC#66cc66;">); includes XMLDecl #66cc66;">-PE #66cc66;"><encoding#66cc66;">> Specify encoding #993333; font-weight: bold;">FOR #66cc66;">-P #993333; font-weight: bold;">OR #66cc66;">-PP output #66cc66;">-PX Include XMLDecl #993333; font-weight: bold;">IN output always #66cc66;">-s #66cc66;"><style sheet#66cc66;">> Style sheet #66cc66;">- specifies the XSL style sheet #66cc66;">-v Version #66cc66;">- #993333; font-weight: bold;">SHOW parser version #993333; font-weight: bold;">AND exit #66cc66;">-V #66cc66;"><var#66cc66;">> #66cc66;"><value#66cc66;">> #993333; font-weight: bold;">TO test top level #993333; font-weight: bold;">VARIABLES #993333; font-weight: bold;">IN CXSLT #66cc66;">-w Whitespace #66cc66;">- preserve #993333; font-weight: bold;">ALL whitespace #66cc66;">-W Warning #66cc66;">- stop parsing after a warning #66cc66;">-x Exercise SAX interface #993333; font-weight: bold;">FOR parser #66cc66;">(prints document#66cc66;">) #66cc66;">-Y control characters are valid #66cc66;">[oracle@localhost bin#66cc66;">]$ xml #66cc66;">-cf #66cc66;">/tmp#66cc66;">/otn_dev_xsd_schema#66cc66;">.xml #66cc66;">[oracle@localhost bin#66cc66;">]$ xml #66cc66;">-cf #66cc66;">/tmp#66cc66;">/otn_dev_xsd_schema#66cc66;">.invalid#66cc66;">.xml #993333; font-weight: bold;">IN line #cc66cc;">14 of #66cc66;">/tmp#66cc66;">/otn_dev_xsd_schema#66cc66;">.invalid#66cc66;">.xml: LPX#66cc66;">-00225: end#66cc66;">-element tag #ff0000;">"OWNER" does #993333; font-weight: bold;">NOT match start#66cc66;">-element tag #ff0000;">"ROW" #66cc66;">[oracle@localhost bin#66cc66;">]$ xml #66cc66;">-v Oracle XML Developers Kit 11#66cc66;">.2#66cc66;">.0#66cc66;">.1#66cc66;">.0 #66cc66;">value#66cc66;">>var#66cc66;">>style#66cc66;">>encoding#66cc66;">>xsloutfile#66cc66;">>language#66cc66;">>n#66cc66;">>xptr#66cc66;">>document#66cc66;">>encoding#66cc66;">>baseuri#66cc66;">>
“xmlcg” is a C++ tool to generate C++ classes based on XML input.
#66cc66;">[oracle@localhost bin#66cc66;">]$ xmlcg #66cc66;">-h Error: Unknown switch Usage: xmlcg #66cc66;">[switches#66cc66;">] #66cc66;"><document#66cc66;">> #66cc66;">-d #66cc66;"><name#66cc66;">> DTD #66cc66;">- input #993333; font-weight: bold;">IS external DTD #66cc66;">(specify output name#66cc66;">) #66cc66;">-o #66cc66;"><directory#66cc66;">> Output #66cc66;">- specify output directory #66cc66;">-e #66cc66;"><encoding#66cc66;">> Encoding #66cc66;">- specify input file encoding #66cc66;">-h Help #66cc66;">- #993333; font-weight: bold;">SHOW this usage help #66cc66;">-v Version #66cc66;">- #993333; font-weight: bold;">SHOW Class Generator version#808080; font-style: italic;"># #66cc66;">-s #66cc66;"><name#66cc66;">> Schema #66cc66;">- input #993333; font-weight: bold;">IS an XML Schema #66cc66;">(spec#66cc66;">. output name#66cc66;">) #66cc66;">[oracle@localhost bin#66cc66;">]$ xmlcg #66cc66;">/tmp#66cc66;">/otn_dev_xsd_schema#66cc66;">.xml Generating classes #993333; font-weight: bold;">FROM DTD#66cc66;">... #66cc66;">[oracle@localhost bin#66cc66;">]$ xmlcg #66cc66;">/tmp#66cc66;">/otn_dev_xsd_schema#66cc66;">.invalid#66cc66;">.xml #993333; font-weight: bold;">IN line #cc66cc;">14 of #66cc66;">/tmp#66cc66;">/otn_dev_xsd_schema#66cc66;">.invalid#66cc66;">.xml: LPX#66cc66;">-00225: end#66cc66;">-element tag #ff0000;">"OWNER" does #993333; font-weight: bold;">NOT match start#66cc66;">-element tag #ff0000;">"ROW" Parse failed#66cc66;">, code #cc66cc;">225 #66cc66;">[oracle@localhost bin#66cc66;">]$ xmlcg #66cc66;">-v Oracle XML Developers Kit 11#66cc66;">.2#66cc66;">.0#66cc66;">.1#66cc66;">.0 #66cc66;">name#66cc66;">>encoding#66cc66;">>directory#66cc66;">>name#66cc66;">>document#66cc66;">>
The “xmlwf” tool is not described in the XDK manual and just / “only” checks on XML well formedness which can be useful in itself.
#66cc66;">[oracle@localhost bin#66cc66;">]$ xmlwf #66cc66;">-h usage: xmlwf #66cc66;">[#66cc66;">-n#66cc66;">] #66cc66;">[#66cc66;">-p#66cc66;">] #66cc66;">[#66cc66;">-r#66cc66;">] #66cc66;">[#66cc66;">-s#66cc66;">] #66cc66;">[#66cc66;">-w#66cc66;">] #66cc66;">[#66cc66;">-x#66cc66;">] #66cc66;">[#66cc66;">-d output#66cc66;">-dir#66cc66;">] #66cc66;">[#66cc66;">-e encoding#66cc66;">] file #66cc66;">... #66cc66;">[oracle@localhost bin#66cc66;">]$ xmlwf #66cc66;">/tmp#66cc66;">/otn_dev_xsd_schema#66cc66;">.xml #66cc66;">[oracle@localhost bin#66cc66;">]$ xmlwf #66cc66;">/tmp#66cc66;">/otn_dev_xsd_schema#66cc66;">.invalid#66cc66;">.xml #66cc66;">/tmp#66cc66;">/otn_dev_xsd_schema#66cc66;">.invalid#66cc66;">.xml:#cc66cc;">14:#cc66cc;">17: mismatched tag #66cc66;">[oracle@localhost bin#66cc66;">]$ xmlwf #66cc66;">-v xmlwf #993333; font-weight: bold;">USING expat_2#66cc66;">.0#66cc66;">.1 sizeof#66cc66;">(XML_Char#66cc66;">)#66cc66;">=#cc66cc;">1#66cc66;">, sizeof#66cc66;">(XML_LChar#66cc66;">)#66cc66;">=#cc66cc;">1#66cc66;">, XML_DTD#66cc66;">, XML_CONTEXT_BYTES#66cc66;">=#cc66cc;">1024#66cc66;">, XML_NS
Tool “xsl” is a C XSLT generator and can transform XML into other text-based formats such as HTML.
#66cc66;">[oracle@localhost bin#66cc66;">]$ xsl #66cc66;">-h Usage: xsl #66cc66;">[switches#66cc66;">] #66cc66;"><stylesheet#66cc66;">> #66cc66;"><instance#66cc66;">> #993333; font-weight: bold;">OR xsl #66cc66;">-f #66cc66;">[switches#66cc66;">] #66cc66;">[document filespec#66cc66;">] Switches: #66cc66;">-B #66cc66;"><baseuri#66cc66;">> #993333; font-weight: bold;">SET the Base uri #993333; font-weight: bold;">FOR XSLT processor#66cc66;">. BaseUri of http:#66cc66;">//pqr#66cc66;">/xsl#66cc66;">.txt resolves pqr#66cc66;">.txt #993333; font-weight: bold;">TO http:#66cc66;">//pqr#66cc66;">/pqr#66cc66;">.txt #66cc66;">-e #66cc66;"><encoding#66cc66;">> Specify #993333; font-weight: bold;">DEFAULT input file encoding #66cc66;">(#66cc66;">-ee #993333; font-weight: bold;">TO force#66cc66;">) #66cc66;">-E #66cc66;">encoding#66cc66;">><encoding#66cc66;">> Specify output#66cc66;">/#993333; font-weight: bold;">DATA#66cc66;">/presentation encoding #66cc66;">-f File #66cc66;">- Interpret #66cc66;"><document#66cc66;">> #993333; font-weight: bold;">AS filespec#66cc66;">, #993333; font-weight: bold;">NOT URI #66cc66;">-G #66cc66;"><xptr exprs#66cc66;">> evaluates XPointer scheme examples give #993333; font-weight: bold;">IN a file #66cc66;">-h Help #66cc66;">- #993333; font-weight: bold;">SHOW this usage help #66cc66;">(#66cc66;">-hh #993333; font-weight: bold;">FOR more options#66cc66;">) #66cc66;">-i #66cc66;"><n#66cc66;">> Number of times #993333; font-weight: bold;">TO iterate the XSLT processing #66cc66;">-l #66cc66;"><language#66cc66;">> #993333; font-weight: bold;">LANGUAGE #993333; font-weight: bold;">FOR error reporting #66cc66;">-o #66cc66;"><xsloutfile#66cc66;">> Specify output file of XSLT processor #66cc66;">-v Version #66cc66;">- #993333; font-weight: bold;">SHOW parser version #993333; font-weight: bold;">AND exit #66cc66;">-V #66cc66;"><var#66cc66;">> #66cc66;"><value#66cc66;">> #993333; font-weight: bold;">TO test top level #993333; font-weight: bold;">VARIABLES #993333; font-weight: bold;">IN CXSLT #66cc66;">-w Whitespace #66cc66;">- preserve #993333; font-weight: bold;">ALL whitespace #66cc66;">-W Warning #66cc66;">- stop parsing after a warning #66cc66;">value#66cc66;">>var#66cc66;">>xsloutfile#66cc66;">>language#66cc66;">>n#66cc66;">>xptr#66cc66;">>document#66cc66;">>encoding#66cc66;">>baseuri#66cc66;">>instance#66cc66;">>stylesheet#66cc66;">>
Combines XML, SQL, and XSLT in the server to deliver dynamic Web content.
#66cc66;">[oracle@localhost bin#66cc66;">]$ xsql Oracle XML Developers Kit 11#66cc66;">.2#66cc66;">.0#66cc66;">.2#66cc66;">.0 #66cc66;">- Production XML#66cc66;">-#cc66cc;">25009: Missing arguments #993333; font-weight: bold;">ON command line Usage: xsql xsqlFileURI #66cc66;">[outFileName#66cc66;">] #66cc66;">[param1#66cc66;">=value1 #66cc66;">... paramN#66cc66;">=valueN#66cc66;">]
“xvm” is the C alternative of the XSLT Virtual Machine (XVM) which provides a high-performance XSLT transformation engine that supports compiled stylesheets.
#66cc66;">[oracle@localhost bin#66cc66;">]$ xvm #66cc66;">-h Usage: xvm switches #66cc66;"><xslfile#66cc66;">> #66cc66;"><xmlfile#66cc66;">> xvm switches #66cc66;"><xpath#66cc66;">> #66cc66;"><xmlfile#66cc66;">> Switches: #66cc66;">-c Compile #66cc66;"><xslfile#66cc66;">>. The bytecode #993333; font-weight: bold;">IS #993333; font-weight: bold;">IN #ff0000;">'.xvm' #66cc66;">. #66cc66;">-ct Compile #66cc66;"><xslfile#66cc66;">> #993333; font-weight: bold;">AND transform #66cc66;"><xmlfile#66cc66;">>. #66cc66;">-t Transform #66cc66;">xmlfile#66cc66;">><xmlfile#66cc66;">> #993333; font-weight: bold;">USING bytecode #993333; font-weight: bold;">FROM #66cc66;"><xslfile#66cc66;">>. #66cc66;">-xc Compile #66cc66;"><xpath#66cc66;">>. The bytecode #993333; font-weight: bold;">IS #993333; font-weight: bold;">IN #ff0000;">'code.xvm'#66cc66;">. #66cc66;">-xct Compile #993333; font-weight: bold;">AND evaluate #66cc66;">xpath#66cc66;">><xpath#66cc66;">> #993333; font-weight: bold;">WITH #66cc66;"><xmlfile#66cc66;">>. #66cc66;">-xt Evaluate XPath bytecode #993333; font-weight: bold;">FROM #66cc66;"><xpath#66cc66;">> #993333; font-weight: bold;">WITH #66cc66;"><xmlfile#66cc66;">>. Examples: xvm #66cc66;">-ct db#66cc66;">.xsl db#66cc66;">.xml xvm #66cc66;">-t db#66cc66;">.xvm db#66cc66;">.xml xvm #66cc66;">-xct #ff0000;">"doc/emloyee[15]/family" db#66cc66;">.xml #66cc66;">xmlfile#66cc66;">>xpath#66cc66;">>xmlfile#66cc66;">>xpath#66cc66;">>xslfile#66cc66;">>xmlfile#66cc66;">>xslfile#66cc66;">>xmlfile#66cc66;">>xslfile#66cc66;">>xmlfile#66cc66;">>xpath#66cc66;">>xmlfile#66cc66;">>xslfile#66cc66;">>
Recent comments
21 weeks 1 day ago
31 weeks 4 hours ago
32 weeks 5 days ago
35 weeks 6 days ago
38 weeks 1 day ago
47 weeks 5 days ago
49 weeks 1 day ago
50 weeks 2 days ago
50 weeks 3 days ago
1 year 1 week ago