<feed xmlns='http://www.w3.org/2005/Atom'>
<title>coq/contrib/omega, branch master</title>
<subtitle>The formal proof system</subtitle>
<link rel='alternate' type='text/html' href='https://git.0x7felf.com/coq/'/>
<entry>
<title>Directory 'contrib' renamed into 'plugins', to end confusion with archive of user contribs</title>
<updated>2009-03-20T01:22:58+00:00</updated>
<author>
<name>letouzey</name>
</author>
<published>2009-03-20T01:22:58+00:00</published>
<link rel='alternate' type='text/html' href='https://git.0x7felf.com/coq/commit/?id=7d220f8b61649646692983872626d6a8042446a9'/>
<id>7d220f8b61649646692983872626d6a8042446a9</id>
<content type='text'>
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@11996 85f007b7-540e-0410-9357-904b9bb8a0f7
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@11996 85f007b7-540e-0410-9357-904b9bb8a0f7
</pre>
</div>
</content>
</entry>
<entry>
<title>Makefile: ml dependencies of contribs are moved to .mllib files</title>
<updated>2009-03-14T11:29:46+00:00</updated>
<author>
<name>letouzey</name>
</author>
<published>2009-03-14T11:29:46+00:00</published>
<link rel='alternate' type='text/html' href='https://git.0x7felf.com/coq/commit/?id=eb93dfaceccbba06f62eb92ef5e12a133c7959d4'/>
<id>eb93dfaceccbba06f62eb92ef5e12a133c7959d4</id>
<content type='text'>
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@11977 85f007b7-540e-0410-9357-904b9bb8a0f7
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@11977 85f007b7-540e-0410-9357-904b9bb8a0f7
</pre>
</div>
</content>
</entry>
<entry>
<title>- Added support for subterm matching in SearchAbout.</title>
<updated>2008-12-29T17:15:52+00:00</updated>
<author>
<name>herbelin</name>
</author>
<published>2008-12-29T17:15:52+00:00</published>
<link rel='alternate' type='text/html' href='https://git.0x7felf.com/coq/commit/?id=b18a6d179903546cbf5745e601ab221f06e30078'/>
<id>b18a6d179903546cbf5745e601ab221f06e30078</id>
<content type='text'>
- Backtrack on precise unfolding of "iff" in "tauto": it has effects on
  the naming of hypotheses (especially when doing "case H" with H of
  type "{x|P&lt;-&gt;Q}" since not unfolding will eventually introduce a name
  "i" while unfolding will eventually introduce a name "a" (deep sigh).
- Miscellaneous (error when a plugin is missing, doc hnf, standardization
  of names manipulating type constr_pattern, ...).



git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@11725 85f007b7-540e-0410-9357-904b9bb8a0f7
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- Backtrack on precise unfolding of "iff" in "tauto": it has effects on
  the naming of hypotheses (especially when doing "case H" with H of
  type "{x|P&lt;-&gt;Q}" since not unfolding will eventually introduce a name
  "i" while unfolding will eventually introduce a name "a" (deep sigh).
- Miscellaneous (error when a plugin is missing, doc hnf, standardization
  of names manipulating type constr_pattern, ...).



git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@11725 85f007b7-540e-0410-9357-904b9bb8a0f7
</pre>
</div>
</content>
</entry>
<entry>
<title>- Another bug in get_sort_family_of (sort-polymorphism of constants and</title>
<updated>2008-12-28T19:03:04+00:00</updated>
<author>
<name>herbelin</name>
</author>
<published>2008-12-28T19:03:04+00:00</published>
<link rel='alternate' type='text/html' href='https://git.0x7felf.com/coq/commit/?id=f5eb06f0d2b28fe72db12fb57458b961b9ae9d85'/>
<id>f5eb06f0d2b28fe72db12fb57458b961b9ae9d85</id>
<content type='text'>
  inductive types was not taken into account).
- Virtually extended tauto to 
  - support arbitrary-length disjunctions and conjunctions,
  - support arbitrary complex forms of disjunctions and
    conjunctions when in the contravariant of an implicative hypothesis,
  - stick with the purely propositional fragment and not apply reflexivity.
  This is virtual in the sense that it is not activated since it breaks 
  compatibility with the existing tauto.
- Modified the notion of conjunction and unit type used in hipattern in a 
  way that is closer to the intuitive meaning (forbid dependencies 
  between parameters in conjunction; forbid indices in unit types).
- Investigated how far "iff" could be turned into a direct inductive
  definition; modified tauto.ml4 so that it works with the current and
  the alternative definition.
- Fixed a bug in the error message from lookup_eliminator.
- Other minor changes.



git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@11721 85f007b7-540e-0410-9357-904b9bb8a0f7
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
  inductive types was not taken into account).
- Virtually extended tauto to 
  - support arbitrary-length disjunctions and conjunctions,
  - support arbitrary complex forms of disjunctions and
    conjunctions when in the contravariant of an implicative hypothesis,
  - stick with the purely propositional fragment and not apply reflexivity.
  This is virtual in the sense that it is not activated since it breaks 
  compatibility with the existing tauto.
- Modified the notion of conjunction and unit type used in hipattern in a 
  way that is closer to the intuitive meaning (forbid dependencies 
  between parameters in conjunction; forbid indices in unit types).
- Investigated how far "iff" could be turned into a direct inductive
  definition; modified tauto.ml4 so that it works with the current and
  the alternative definition.
- Fixed a bug in the error message from lookup_eliminator.
- Other minor changes.



git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@11721 85f007b7-540e-0410-9357-904b9bb8a0f7
</pre>
</div>
</content>
</entry>
<entry>
<title>Take advantage of natdynlink when available: almost all contribs become loadable plugins</title>
<updated>2008-12-16T13:56:19+00:00</updated>
<author>
<name>letouzey</name>
</author>
<published>2008-12-16T13:56:19+00:00</published>
<link rel='alternate' type='text/html' href='https://git.0x7felf.com/coq/commit/?id=c215c4429a85a6d73cc1a33041258cacbe4de199'/>
<id>c215c4429a85a6d73cc1a33041258cacbe4de199</id>
<content type='text'>
- Any contrib foo leads to contrib/foo/foo_plugin.cmxs (and .cma for bytecode).
- Features that were available without any Require are now loaded systematically
  when launching coqtop (see Coqtop.load_initial_plugins):
     extraction, jprover, cc, ground, dp, recdef, xml
- The other plugins are loaded when a corresponding Require is done:
     quote, ring, field, setoid_ring, omega, romega, micromega, fourier
- I experienced a crash (segfault) while turning subtac into a plugin, so this
  one stays statically linked into coqtop for now
- When the ocaml version doesn't support natdynlink, or if "-natdynlink no"
  is explicitely given to configure, coqtop is statically linked with all of
  the above code as usual. Some messages [Ignore ML file Foo_plugin] may appear.
- How should coqdep handle a "Declare ML Module "foo"" if foo is an archive
  and not a ml file ? For now, we suppose that the foo.{cmxs,cma} are at the
  same location as the .v during the build, but can be moved later in any place of
  the ml loadpath.

This is clearly an experimentation. Feedback most welcome...

git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@11687 85f007b7-540e-0410-9357-904b9bb8a0f7
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- Any contrib foo leads to contrib/foo/foo_plugin.cmxs (and .cma for bytecode).
- Features that were available without any Require are now loaded systematically
  when launching coqtop (see Coqtop.load_initial_plugins):
     extraction, jprover, cc, ground, dp, recdef, xml
- The other plugins are loaded when a corresponding Require is done:
     quote, ring, field, setoid_ring, omega, romega, micromega, fourier
- I experienced a crash (segfault) while turning subtac into a plugin, so this
  one stays statically linked into coqtop for now
- When the ocaml version doesn't support natdynlink, or if "-natdynlink no"
  is explicitely given to configure, coqtop is statically linked with all of
  the above code as usual. Some messages [Ignore ML file Foo_plugin] may appear.
- How should coqdep handle a "Declare ML Module "foo"" if foo is an archive
  and not a ml file ? For now, we suppose that the foo.{cmxs,cma} are at the
  same location as the .v during the build, but can be moved later in any place of
  the ml loadpath.

This is clearly an experimentation. Feedback most welcome...

git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@11687 85f007b7-540e-0410-9357-904b9bb8a0f7
</pre>
</div>
</content>
</entry>
<entry>
<title>- Officialisation de la notation "pattern c at -1" (cf wish 1798 sur coq-bugs)</title>
<updated>2008-06-10T19:35:23+00:00</updated>
<author>
<name>herbelin</name>
</author>
<published>2008-06-10T19:35:23+00:00</published>
<link rel='alternate' type='text/html' href='https://git.0x7felf.com/coq/commit/?id=5d8d8e858e56c0d12cb262d5ff8e733ae7afc102'/>
<id>5d8d8e858e56c0d12cb262d5ff8e733ae7afc102</id>
<content type='text'>
- Changement au passage de la convention "at -n1 ... -n2" en 
  "at - n1 ... n2" qui me paraît plus clair à partir du moment où on peut
  pas mélanger des positifs et des négatifs.
- Au passage:
  - simplification de gclause avec fusion de onconcl et concl_occs,
  - généralisation de l'utilisation de la désignation des occurrences par la
    négative aux cas de setoid_rewrite, clrewrite et rewrite at,
  - correction d'un bug de "rewrite in at" qui utilisait le at de la
    conclusion dans les hyps.


git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@11094 85f007b7-540e-0410-9357-904b9bb8a0f7
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- Changement au passage de la convention "at -n1 ... -n2" en 
  "at - n1 ... n2" qui me paraît plus clair à partir du moment où on peut
  pas mélanger des positifs et des négatifs.
- Au passage:
  - simplification de gclause avec fusion de onconcl et concl_occs,
  - généralisation de l'utilisation de la désignation des occurrences par la
    négative aux cas de setoid_rewrite, clrewrite et rewrite at,
  - correction d'un bug de "rewrite in at" qui utilisait le at de la
    conclusion dans les hyps.


git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@11094 85f007b7-540e-0410-9357-904b9bb8a0f7
</pre>
</div>
</content>
</entry>
<entry>
<title>Bugs, nettoyage, et améliorations diverses</title>
<updated>2008-04-13T21:41:54+00:00</updated>
<author>
<name>herbelin</name>
</author>
<published>2008-04-13T21:41:54+00:00</published>
<link rel='alternate' type='text/html' href='https://git.0x7felf.com/coq/commit/?id=bd0219b62a60cfc58c3c25858b41a005727c68be'/>
<id>bd0219b62a60cfc58c3c25858b41a005727c68be</id>
<content type='text'>
- vérification de la cohérence des ident pour éviter une option -R
  avec des noms non parsables (la vérification est faite dans
  id_of_string ce qui est très exigeant; faudrait-il une solution plus
  souple ?)
- correction message d'erreur inapproprié dans le apply qui descend dans les 
  conjonctions
- nettoyage autour de l'échec en présence de métas dans le prim_refiner
- nouveau message d'erreur quand des variables ne peuvent être instanciées
- quelques simplifications et davantage de robustesse dans inversion
- factorisation du code de constructor and co avec celui de econstructor and co

Documentation des tactiques
- edestruct/einduction/ecase/eelim et nouveautés apply
- nouvelle sémantique des intropatterns disjonctifs et documentation des
  pattern -&gt; et &lt;-
- relecture de certaines parties du chapitre tactique


git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@10785 85f007b7-540e-0410-9357-904b9bb8a0f7
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- vérification de la cohérence des ident pour éviter une option -R
  avec des noms non parsables (la vérification est faite dans
  id_of_string ce qui est très exigeant; faudrait-il une solution plus
  souple ?)
- correction message d'erreur inapproprié dans le apply qui descend dans les 
  conjonctions
- nettoyage autour de l'échec en présence de métas dans le prim_refiner
- nouveau message d'erreur quand des variables ne peuvent être instanciées
- quelques simplifications et davantage de robustesse dans inversion
- factorisation du code de constructor and co avec celui de econstructor and co

Documentation des tactiques
- edestruct/einduction/ecase/eelim et nouveautés apply
- nouvelle sémantique des intropatterns disjonctifs et documentation des
  pattern -&gt; et &lt;-
- relecture de certaines parties du chapitre tactique


git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@10785 85f007b7-540e-0410-9357-904b9bb8a0f7
</pre>
</div>
</content>
</entry>
<entry>
<title>small copy&amp;paste bug in zify: some Pmult should be Nmult</title>
<updated>2007-11-08T09:44:31+00:00</updated>
<author>
<name>letouzey</name>
</author>
<published>2007-11-08T09:44:31+00:00</published>
<link rel='alternate' type='text/html' href='https://git.0x7felf.com/coq/commit/?id=9a57002cd644bac29e0ad338756d1a01613e6c13'/>
<id>9a57002cd644bac29e0ad338756d1a01613e6c13</id>
<content type='text'>
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@10301 85f007b7-540e-0410-9357-904b9bb8a0f7
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@10301 85f007b7-540e-0410-9357-904b9bb8a0f7
</pre>
</div>
</content>
</entry>
<entry>
<title>A generic preprocessing tactic zify for (r)omega</title>
<updated>2007-07-18T22:38:06+00:00</updated>
<author>
<name>letouzey</name>
</author>
<published>2007-07-18T22:38:06+00:00</published>
<link rel='alternate' type='text/html' href='https://git.0x7felf.com/coq/commit/?id=8e9c794b42f00ff4dbcd0e1961a95335e5b88c85'/>
<id>8e9c794b42f00ff4dbcd0e1961a95335e5b88c85</id>
<content type='text'>
------------------------------------------------ 

See file PreOmega for more details and/or test-suite/succes/*Omega*.v

The zify tactic performs a Z-ification of your current goal,
transforming parts of type nat, N, positive, taking advantage of many
equivalences of operations, and of the positivity implied by these
types.

Integration with omega and romega:
 (r)omega : the earlier tactics, 100% compatible 
 (r)omega with * : full zify applied before the (r)omega run
 (r)omega with &lt;types&gt;, where &lt;types&gt; is a sub-list of {nat,N,positive,Z}, 
   applies only specific parts of zify (btw "with Z" means take advantage 
   of Zmax, Zmin, Zabs and Zsgn). 

As a particular consequence, "romega with nat" should now be a
close-to-perfect replacement for omega. Slightly more powerful, since
(forall x:nat, x*x&gt;=0) is provable and also slightly less powerful: if
False is somewhere in the hypothesis, it doesn't use it. 

For the moment zify is done in a direct way in Ltac, using rewrite
when necessary, but crucial chains of rewrite may be made reflexive
some day.

Even though zify is designed to help (r)omega, I think it might be 
of interest for other tactics (micromega ?). Feel free to complete
zify if your favorite operation / type isn't handled yet. 


Side-effects: 

- additional results for ZArith, NArith, etc...
- definition of Ple, Plt, Pgt, Pge and notations for them in positive_scope
- romega now start by doing "intros". Since the conclusion will be negated, 
  and this operation will be justified by means of decidability, it helps
  to have as little as possible in the conclusion. 






git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@10028 85f007b7-540e-0410-9357-904b9bb8a0f7
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
------------------------------------------------ 

See file PreOmega for more details and/or test-suite/succes/*Omega*.v

The zify tactic performs a Z-ification of your current goal,
transforming parts of type nat, N, positive, taking advantage of many
equivalences of operations, and of the positivity implied by these
types.

Integration with omega and romega:
 (r)omega : the earlier tactics, 100% compatible 
 (r)omega with * : full zify applied before the (r)omega run
 (r)omega with &lt;types&gt;, where &lt;types&gt; is a sub-list of {nat,N,positive,Z}, 
   applies only specific parts of zify (btw "with Z" means take advantage 
   of Zmax, Zmin, Zabs and Zsgn). 

As a particular consequence, "romega with nat" should now be a
close-to-perfect replacement for omega. Slightly more powerful, since
(forall x:nat, x*x&gt;=0) is provable and also slightly less powerful: if
False is somewhere in the hypothesis, it doesn't use it. 

For the moment zify is done in a direct way in Ltac, using rewrite
when necessary, but crucial chains of rewrite may be made reflexive
some day.

Even though zify is designed to help (r)omega, I think it might be 
of interest for other tactics (micromega ?). Feel free to complete
zify if your favorite operation / type isn't handled yet. 


Side-effects: 

- additional results for ZArith, NArith, etc...
- definition of Ple, Plt, Pgt, Pge and notations for them in positive_scope
- romega now start by doing "intros". Since the conclusion will be negated, 
  and this operation will be justified by means of decidability, it helps
  to have as little as possible in the conclusion. 






git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@10028 85f007b7-540e-0410-9357-904b9bb8a0f7
</pre>
</div>
</content>
</entry>
<entry>
<title>Improvements / Bug fixes for ROmega </title>
<updated>2007-07-09T13:49:57+00:00</updated>
<author>
<name>letouzey</name>
</author>
<published>2007-07-09T13:49:57+00:00</published>
<link rel='alternate' type='text/html' href='https://git.0x7felf.com/coq/commit/?id=9c4f65ebe124d972ae1506e388bb206cb7298ce4'/>
<id>9c4f65ebe124d972ae1506e388bb206cb7298ce4</id>
<content type='text'>
-----------------------------------

All romega tests in the test-suite are now bug-free. The only known
remaining limitation of romega with respect to omega is that it cannot
handle stuff on nat.

* Equivalences A&lt;-&gt;B are now understood by romega (as well as omega), 
  and seen as (A-&gt;B)/\(B-&gt;A). There might be a smarter way to procede, 
  for instance having a primitive Iff construct and trying to break 
  equivalences as late as possible. 

* Conclusion-as-Pprop issue: 
  After the resolution by the abstract omega machinery, useless parts
  are discarded from the reification process by replacing them with
  Pprop construct (see really_useful_prop). This allow to decrease 
  the size of the proof terms and speed up their normalisation, I guess.   
  But when such Pprop are created in the conclusion, this leads to 
  failure, since concl is negated, and this is donc only if it is 
  decidable. And introducing some Pprop might change the decidability 
  status of the concl: for instance, Pfalse is decidable, whereas 
  Pprop False is considered as _not_ decidable. Quick fix: no more 
  really_useful_prop applied on concl (needs careful computation of 
  useful_var). 

* NEGATE_CONTRADICT(_INV): 
  This trace instrution comes in fact in two flavors, according to a
  boolean flag. We now translate to O_NEGATE_CONTRADICT_INV if this 
  flag is false. (fix Besson's bug #1298)

* EXACT_DIVIDE: 
  could be used on NeqTerm and not only on EqTerm. 

* h_step indexes: 
  The abstract omega machinery can introduce new hyps. In the list of hyps, 
  they appears _before_ the regular one (but after the goal seen as an hyp 
  by negating it). But the normalization steps were applied to regular hyps
  thanks to their indexes counted _before_ the addition extra hyps. 

* extra hyps (a)normal forms: 
  extra hyps and variables are initially of the shape 
     poly(v1,...,v(n-1)) = vn
  but O_STATE was expecting them in form 0 = poly(...) + -vn
  (by the way, SPLIT_INEQ should be checked someday). 

Since the above is one weekend's worth of debugging, there might well
remain some more bugs :-(. 

For the record, here's the less painful way to debug a failed romega run: 
 - activate debug flag in omega.ml and refl_omega.ml 
 - at the bottom of refl_omega, replace normalise_vm_in_concl with 
   convert_no_check (see comment there): this allow to skip the usually 
   _huge_ error message about "Impossible to unify True with ..."
 - run the romega
 - try to run Qed, and enjoy the nice errror message about a 
   (omega_tactic ? ? ? ?) that should be reducible to True. 
   Here starts the real debug work...



git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@9962 85f007b7-540e-0410-9357-904b9bb8a0f7
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
-----------------------------------

All romega tests in the test-suite are now bug-free. The only known
remaining limitation of romega with respect to omega is that it cannot
handle stuff on nat.

* Equivalences A&lt;-&gt;B are now understood by romega (as well as omega), 
  and seen as (A-&gt;B)/\(B-&gt;A). There might be a smarter way to procede, 
  for instance having a primitive Iff construct and trying to break 
  equivalences as late as possible. 

* Conclusion-as-Pprop issue: 
  After the resolution by the abstract omega machinery, useless parts
  are discarded from the reification process by replacing them with
  Pprop construct (see really_useful_prop). This allow to decrease 
  the size of the proof terms and speed up their normalisation, I guess.   
  But when such Pprop are created in the conclusion, this leads to 
  failure, since concl is negated, and this is donc only if it is 
  decidable. And introducing some Pprop might change the decidability 
  status of the concl: for instance, Pfalse is decidable, whereas 
  Pprop False is considered as _not_ decidable. Quick fix: no more 
  really_useful_prop applied on concl (needs careful computation of 
  useful_var). 

* NEGATE_CONTRADICT(_INV): 
  This trace instrution comes in fact in two flavors, according to a
  boolean flag. We now translate to O_NEGATE_CONTRADICT_INV if this 
  flag is false. (fix Besson's bug #1298)

* EXACT_DIVIDE: 
  could be used on NeqTerm and not only on EqTerm. 

* h_step indexes: 
  The abstract omega machinery can introduce new hyps. In the list of hyps, 
  they appears _before_ the regular one (but after the goal seen as an hyp 
  by negating it). But the normalization steps were applied to regular hyps
  thanks to their indexes counted _before_ the addition extra hyps. 

* extra hyps (a)normal forms: 
  extra hyps and variables are initially of the shape 
     poly(v1,...,v(n-1)) = vn
  but O_STATE was expecting them in form 0 = poly(...) + -vn
  (by the way, SPLIT_INEQ should be checked someday). 

Since the above is one weekend's worth of debugging, there might well
remain some more bugs :-(. 

For the record, here's the less painful way to debug a failed romega run: 
 - activate debug flag in omega.ml and refl_omega.ml 
 - at the bottom of refl_omega, replace normalise_vm_in_concl with 
   convert_no_check (see comment there): this allow to skip the usually 
   _huge_ error message about "Impossible to unify True with ..."
 - run the romega
 - try to run Qed, and enjoy the nice errror message about a 
   (omega_tactic ? ? ? ?) that should be reducible to True. 
   Here starts the real debug work...



git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@9962 85f007b7-540e-0410-9357-904b9bb8a0f7
</pre>
</div>
</content>
</entry>
</feed>
