changeset 1528:9e04f3c0d4d1 stable

merge with inactive compat branch
author Pierre-Yves David <pierre-yves.david@fb.com>
date Tue, 23 Jun 2015 16:46:54 -0700
parents e8f875227901 (diff) 4c132d78db8b (current diff)
children b0a5ce178da6
files
diffstat 116 files changed, 21811 insertions(+), 4983 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore
+++ b/.hgignore
@@ -5,6 +5,12 @@
 ^html/
 \.pyc$
 ~$
+\.swp$
 \.orig$
 \.rej$
 \.err$
+^tests/easy_run.sh$
+^build/
+^MANIFEST$
+^docs/tutorials/.*\.rst$
+\.ico$
--- a/.hgtags
+++ b/.hgtags
@@ -8,3 +8,31 @@
 18a0d96ed559089edf90206c469f3f8c26681c64 0.7
 18a0d96ed559089edf90206c469f3f8c26681c64 0.7
 1b2757c1bd918509184f6c1d06b2329a847e31b0 0.7
+b18b000363550f02f413aed008f8e306318c608c 1.0.0
+ca5bb72d14aeb6e6053e3a53c064a2b7dc8010e5 1.0.1
+b1bdcb4506defef0e857e2710633f7686d8034a5 1.0.2
+5559e5a4b656978c592d364f242edc62369d7e84 1.0.2
+c062edbcaf13135d0312fd2039deca74573ff4f0 1.1.0
+22cacfce2a65ab965c6179ae862b148f4abc7d8a 1.1.0
+d43e80504e55db9ad4826e860e50530103a27b0f 2.0.0
+f9d305deeff3dba782e65faf4ef3fd1569995859 2.1.0
+862b6b71a35836e81f090ba7229c2888e8ed2f9f 3.0.0
+cdb52bbbe5b8770d5e68943b7e73bee4ba136ecc 3.1.0
+c3ba8a965a7a173e388d84819e936ea9bae9797f 3.2.0
+83882f2fbecba0b7e7f7e5d490b57db93bd7fa22 3.3.0
+fc04758ea9f549684989ee673b04d9724756dc85 3.3.1
+a03ea39aca2a66ea36817512d586dcbc99dbfe9b 3.3.2
+0304fc2bab158658df53a8f4edd5aa300a9497d2 4.0.0
+e914884fb7210d6350d94909cb25ebc602359680 4.0.1
+4d5d101e878f6d6264a8e036b11afdf922c4ef94 4.1.0
+c13b408c00066af78cda88734909c6f2f3505f76 5.0.0
+51e1e962172c0178394cd36652d90181319f5416 5.0.1
+51e1e962172c0178394cd36652d90181319f5416 5.0.1
+0f30907852831f818bd0d01141b4ab7d8d71b821 5.0.1
+dbd0733e584073d6a7b6dea933767853e9cfe845 5.0.2
+bfe9be352453640233371cc7deb409a09decacf9 5.1.0
+9b8628e0a142e0e094e27430c388e3c12ceba513 5.1.1
+e886bc501796d53e0a19e608c6e5a6071191819e 5.1.2
+c52c15100fb2d85c3525d6d085b3663ec4f90fe6 5.1.3
+891c3ce894fa879532299910735bcc2a968245b1 5.1.4
+1377f6a7f9ecb25e9b8885fce8f6f42e0d6f3f12 5.1.5
new file mode 100644
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+	51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year  name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
new file mode 100644
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,21 @@
+recursive-include docs/figures *.svg
+include docs/figures/hgview-example.png
+include docs/*.rst
+include docs/*.py
+include docs/tutorials/*.t
+include docs/makefile
+include docs/static/*.svg
+include hgext/__init__.py
+include hgext/evolve.py
+include hgext/pushexperiment.py
+include hgext/simple4server.py
+include setup.py
+include README
+include COPYING
+include tests/*.t
+include tests/*.py
+include tests/_exc-util.sh
+include tests/dummyssh
+exclude tests/test-oldconvert.t
+exclude tests/test-qsync.t
+exclude tests/test-drop.t
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,7 @@
 PYTHON=python
 HG=`which hg`
+VERSION=$(shell python setup.py --version)
+
 
 help:
 	@echo 'Commonly used make targets:'
@@ -24,4 +26,13 @@
 all-version-tests: tests-1.3.1 tests-1.4.3 tests-1.5.4 \
                    tests-1.6.4 tests-1.7.5 tests-1.8 tests-tip
 
+deb-prepare:
+	python setup.py sdist --dist-dir ..
+	mv -f ../hg-evolve-$(VERSION).tar.gz ../mercurial-evolve_$(VERSION).orig.tar.gz
+	tar xf ../mercurial-evolve_$(VERSION).orig.tar.gz
+	rm -rf ../mercurial-evolve_$(VERSION).orig
+	mv hg-evolve-$(VERSION) ../mercurial-evolve_$(VERSION).orig
+	cp -r debian/ ../mercurial-evolve_$(VERSION).orig/
+	@cd ../mercurial-evolve_$(VERSION).orig && echo 'debian build directory ready at' `pwd`
+
 .PHONY: tests all-version-tests
--- a/README
+++ b/README
@@ -2,46 +2,275 @@
 Mutable History For Mercurial
 =============================
 
-:obsolete:
+This package supplies the ``evolve`` extension for Mercurial, which
+provides several commands to mutate history and deal with the
+resulting issues.
+
+It also:
+
+    - enables the "changeset obsolescence" feature of Mercurial
+    - issues several warning messages when trouble appears in your repository
+
+**This extension is experimental and not yet meant for production.**
+
+You can enable it by adding the line below to the ``extensions``
+section of your hgrc::
+
+    evolve = PATH/TO/mutable-history/hgext/evolve.py
+
+We recommend reading the documentation first. An online version is
+available here:
+
+    http://evolution.experimentalworks.net/doc/
+
+Or see the ``doc/`` directory for a local copy.
+
+Contribute
+==========
+
+Bugs are to be reported on the mercurial's bug tracker: http://bz.selenic.com/
+Use the the "evolution" component.
+
+Please use the patchbomb extension to send email to mercurial devel. Please
+make sure to use the evolve-ext flag when doing so. You can use a command like
+this:
+
+    hg email --to mercurial-devel@selenic.com --flag evolve-ext --rev '<your patches>'
+
+See also
+http://mercurial.selenic.com/wiki/ContributingChanges#Patch_descriptions
+for guidelines on the patch description.
+
+Please don't forget to update and run the tests when you fix a bug or
+add a feature. To run the tests:
+
+    cd tests
+    python run-tests.py --with-hg=/path/to/hg
+
+
+Changelog
+=========
+
+5.1.5 -- 2015-06-23
 
-    Introduce an ``obsolete`` concept that tracks new versions of rewritten
-    changesets.
+- minor documentation cleanup
+- support -i option for `hg amend` if commit supports it (3.4)
+- fix the `debugrecordpruneparents` utility
+- fix some possible crash during command abort (release non-existant transaction)
+- fix simple4server bug tracker URL
+- compatibility with bookmark API change in future Mercurial 3.5
+- prune no longer move the active bookmark for no reason (issue4559)
+- evolve: stop reporting divergence base as missing when we actually have it
+- significant performance improvement for all revsets.
+
+5.1.4 -- 2015-04-23
+
+- significant documentation update
+- fix issue4616: pulling with bundle2 would crash if common marker when
+  discovered on non-served changesets.
+- fix the debugobsrelsethashtree command
+
+5.1.3 -- 2015-04-20
+
+- discovery: fix misbehaving discovery accros python version
+- pull: properly install the bundle2 par generator
+  (avoid sending all markers for each pull)
+- commit: avoid potential deadlock (acquires wlock before lock)
+- graft: avoid potential deadlock (acquires wlock before lock)
+
+5.1.2 -- 2015-04-01
 
-:evolve:
+- evolve: prevent a crash in httpclient_pushobsmarkers() when pushing
+
+5.1.1 -- 2015-03-05
+
+- debugobsconvert: fix invalid markers during conversion
+- discovery: cache some of the obs hash computation to improve performance (issue4518)
+- revset: fix some crash with (issue4515)
+
+5.1 -- 2015-01-30
+
+- evolve: explicitly disable bookmark on evolve (issue4432)
+- evolve: don't abort Mercurial on version mismatch
+- comptatibility with mercurial 3.3
 
-    A collection of commands to rewrite the mutable part of the history.
+5.0.2 -- 2014-12-14
+
+- evolve: remove dependency to the rebase extension
+
+5.0.1 -- 2014-11-25
+
+- amend: fix --logfile argument
+- evolve: preserve branch change when evolving
+- evolve: fix potential crash while solving `bumped` changesets.
+- uncommit: abort when rev specifies the current changeset
+- evolve: various message improvement
+- evolve: fix selection of changeset to evolve from the middle of a stack (issue4434)
+- evolve: make next/prev only move bookmarks optionally
+- evolve: tell user which "base of divergent changeset" is not found
 
 
 
-**These extensions are experimental and are not meant for production.**
-
-You can quicky enable them using::
-
-    ./enable.sh >> ~/.hgrc
-
-But it's recommended to look at the doc in the first place.
-
-See doc/ directory for details.
-
-Online version of the doc is available:
+5.0.0 -- 2014-10-22
 
-    http://hg-lab.logilab.org/doc/mutable-history/html/
-
-Contribute
-==================
-
-The simplest way to contribute is to issue a pull request on bitbucket.
+- drop compat with Mercurial pre 3.2
+- uncommit: add a --rev argument
+- evolve: add a `working directory now at xxxxxxxxxx` message
+- evolve: automatically translate obsolete hashes when evolving
+- properly skip marker creating if patch apply cleanly
+- prune: work around a massive slowdown from lazy revset
+- grab: "fix" the grab alias on window
 
-However, some cutting edge change may be found in a mutable repository hosted
-by logilab before they are published.
-
-    http://hg-lab.logilab.org/wip/mutable-history/
-
-Make sure to check lastest draft changeset before submitting new changeset.
+- fix an issue where prune performance were quadratic with the number of
+  changesets pruned.
+- pull: use discovery to pull less obsmarkers through bundle2
 
 
-Changelog
-==================
+4.1.0 -- 2014-08-08
+
+- amend: add -D/--current-date option
+- amend: add -U/--current-user option
+- evolve: add a --tool option
+- evolve: add a --confirm option
+- mark "commit -o", "graft -o" and "graft -O" as deprecated since they are
+  unlikely to eventually make it into core.
+- push obsmarkers and phases in the same transaction than changesets
+  (when using hg >= 3.1 and bundle2-exp is enabled)
+- hide message about the obsolescence marker exchange behind a
+  `experimental.verbose-obsolescence-exchange` variable (default to False).
+
+4.0.1 -- 2014-08-08
+
+- createmarkers() accept an iterable (for compat with other extension)
+
+4.0.0 -- 2014-06-03
+
+- require Mercurial version 3.0.1 or above
+- some compatibility fixes with future 3.1.0
+- deprecated `gup` and `gdown` in favor of prev and next
+- record parent of pruned parent at prune time
+- added a `debugobsstorestat` command to gather data on obsmarker content.
+- added a `debugrecordpruneparents` command to upgrade existing prune marker
+  with parent information. Please run it once per repo after upgrading.
+- improvement to obsolescence marker exchange:
+  - added progress when pushing obsmarkers
+  - added multiple output during obsolescence markers exchange
+  - only push markers relevant to pushed subset
+  - add a new experimental way to exchange marker (when server support):
+    - added progress when pulling obsmarkers
+    - only pull markers relevant to pulled subset
+    - avoid exchanging common markers in some case
+    - use bundle2 as transport when available.
+ - add a hook related to the new commands
+
+3.3.2 -- 2014-05-14
+
+- fix a bug where evolve were creating changeset with 2 parents on windows
+  (fix issues #16, #35 and #42)
+- adds a --obsolete flag to import (requieres Mercurial 3.0)
+- prune: update to successor rather than parent when pruning '.' with -s
+- fold: add missing --message and --logfile option
+- fold: add squash as an alias
+
+3.3.1 -- 2014-04-23
+
+- various language fix
+- active bookmark now move when using prev/next (#37)
+- fix some preservation of rename information on evolve (#33)
+- abort when evolve tries to move a node on top of itself (will helps on the #35 front)
+- fold: enable --date and --user options
+
+3.3.0 -- 2014-03-04
+
+- raise Mercurial's minimal requirement to 2.7
+- drop `latercomer` and `conflicting` compatibility. Those old alias are
+  deprecated for a long time now.
+- add verbose hint about how to handle corner case by hand.
+  This should help people until evolve is able to to it itself.
+- removed the qsync extension. The only user I knew about (logilab) is not
+  using it anymore. It not compatible with coming Mercurial version 2.9.
+- add progress indicator for long evolve command
+- report troubles creation from `hg import`
+
+3.2.0 -- 2013-11-15
+
+- conform to the Mercurial custom of lowercase messages
+- added a small extension to experiment with obsolescence marker push
+- amend: drop the deprecated note option
+- amend: use core mechanism for amend (fix multiple bugs)
+- parents command: add "working directory parent is obsolete" message
+- evolve command: allow updating to the successor if the parent is
+  obsolete
+- gdown and gup commands: add next and previous alias, respectively
+- make grab aliases compatible with Mercurial 2.8
+- Tested with 2.6, 2.7 and 2.8
+
+3.1.0 -- 2013-02-11
+
+- amend: drop deprecated --change option for amend
+- alias: add a grab aliast to be used instead of graft -O
+- touch: add a --duplicate option to *not* obsolete the old version
+- touch: fix touching multiple revision at the same time
+- evolve: add a --all option
+- prune: various minor improvements
+- prune: add option to prune a specific bookmark
+- prune: add -u and -d option to control metadata
+
+3.0.0 -- 2013-02-02
+
+- compatibility with 2.5
+
+2.2.0 --
+
+- make evolve smarter at picking next troubled to solved without --any
+
+2.1.0 -- 2012-12-03
+
+- qsync fixes
+- have qfold ask for commit message
+
+2.0.0 -- 2012-10-26
+
+- compat with mercurial 2.4
+
+1.1.0 -- 2012-10-26
+
+- fix troubles creation reporting from rebase
+- rename latecomer to bumped
+- renamed conflicting to divergent
+- smarter divergent handling
+
+1.0.2 -- 2012-09-19
+
+- fix hg fold bug
+- fix hg pull --rebase
+- fix detection of conflict with external tools
+- adapt to core movement (caches and --amend)
+
+1.0.1 -- 2012-08-31
+
+- documentation improvement
+- fix a performance bug with hgweb
+
+1.0 -- 2012-08-29
+
+- Align with Mercurial version 2.3 (drop 2.2 support).
+- stabilize handle killed parent
+- stabilize handle late comer
+- stabilize handle conflicting
+- stabilize get a --continue switch
+- merge and update ignore extinct changeset in most case.
+- new "troubled()" revset
+- summary now reports troubles changesets
+- new touch command
+- new fold command
+- new basic olog alias
+
+- rebase refuse to work on public changeset again
+- rebase explicitly state that there is nothing to rebase because everything is
+  extinct() when that happen.
+- amend now cleanly abort when --change switch is misused
+
 
 0.7 -- 2012-08-06
 
@@ -84,7 +313,6 @@
 
 0.3.0 -- 2012-06-27
 
-- 
 - obsolete:  Add "latecomer" error detection (stabilize does not handle resolution yet)
 - evolve:    Introduce a new `uncommit` command to remove change from a changeset
 - rebase:    allow the use of --keep again
new file mode 100644
--- /dev/null
+++ b/contrib/nopushpublish.py
@@ -0,0 +1,36 @@
+# Extension which prevent changeset to be turn public by push operation
+#
+# Copyright 2011 Logilab SA        <contact@logilab.fr>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+
+from mercurial import extensions, util
+from mercurial import discovery
+
+def checkpublish(orig, repo, remote, outgoing, *args):
+
+    # is remote publishing?
+    publish = True
+    if 'phases' in remote.listkeys('namespaces'):
+        remotephases = remote.listkeys('phases')
+        publish = remotephases.get('publishing', False)
+
+    npublish = 0
+    if publish:
+        for rev in outgoing.missing:
+            if repo[rev].phase():
+                npublish += 1
+    if npublish:
+        repo.ui.warn("Push would publish %s changesets" % npublish)
+
+    ret = orig(repo, remote, outgoing, *args)
+    if npublish:
+        raise util.Abort("Publishing push forbiden",
+                         hint="Use `hg phase -p <rev>` to manually publish them")
+
+    return ret
+
+def uisetup(ui):
+    extensions.wrapfunction(discovery, 'checkheads', checkpublish)
new file mode 100644
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,88 @@
+mercurial-evolve (5.1.5-1) UNRELEASED; urgency=medium
+
+  * New upstream release.
+
+ -- Pierre-Yves David <pyd@marginatus.alto.octopoid.net>  Tue, 23 Jun 2015 15:30:07 -0700
+
+mercurial-evolve (5.1.3-1) unstable; urgency=medium
+
+  * new upstream release
+
+ -- Julien Cristau <julien.cristau@logilab.fr>  Mon, 20 Apr 2015 14:44:45 +0200
+
+mercurial-evolve (5.0.2-1) unstable; urgency=medium
+
+  * new upstream release
+
+ -- Pierre-Yves David <pierre-yves.david@ens-lyon.org>  Sun, 14 Dec 2014 12:43:28 -0800
+
+mercurial-evolve (5.0.1-1) unstable; urgency=medium
+
+  * New upstream release.
+
+ -- Faheem Mitha <faheem@faheem.info>  Wed, 12 Nov 2014 11:24:28 +0530
+
+mercurial-evolve (5.0.0+-1) UNRELEASED; urgency=low
+
+  * new upstream snapshot
+
+ -- Julien Cristau <julien.cristau@logilab.fr>  Mon, 17 Nov 2014 15:44:32 +0100
+
+mercurial-evolve (4.1.0-1) unstable; urgency=medium
+
+  * new upstream release
+
+ -- Pierre-Yves David <pyd@marginatus.alto.octopoid.net>  Fri, 08 Aug 2014 23:15:11 -0700
+
+mercurial-evolve (4.0.1-1) unstable; urgency=medium
+
+  * new upstream release
+
+ -- Pierre-Yves David <pyd@marginatus.alto.octopoid.net>  Fri, 08 Aug 2014 15:50:09 -0700
+
+mercurial-evolve (4.0.0-1) unstable; urgency=low
+
+  [ Julien Cristau ]
+  * New upstream release.
+
+  [ Pierre-Yves David ]
+  * new upstream release
+
+ -- Pierre-Yves David <pyd@marginatus.alto.octopoid.net>  Fri, 08 Aug 2014 15:48:16 -0700
+
+mercurial-evolve (3.1.0-1) UNRELEASED; urgency=low
+
+  * New upstream release.
+
+ -- Pierre-Yves David <pierre-yves.david@logilab.fr>  Mon, 04 Mar 2013 18:02:15 +0100
+
+mercurial-evolve (2.1.0-1) UNRELEASED; urgency=low
+
+  * New upstream release
+
+ -- Pierre-Yves David <pierre-yves.david@logilab.fr>  Mon, 03 Dec 2012 15:19:19 +0100
+
+mercurial-evolve (1.1.0-1) UNRELEASED; urgency=low
+
+  * New upstream release.
+
+ -- Pierre-Yves David <pierre-yves.david@logilab.fr>  Tue, 20 Nov 2012 16:28:12 +0100
+
+mercurial-evolve (1.0.2-1) UNRELEASED; urgency=low
+
+  * New upstream Release
+
+ -- Pierre-Yves David <pierre-yves.david@logilab.fr>  Wed, 19 Sep 2012 17:38:47 +0200
+
+mercurial-evolve (1.0.1-1) UNRELEASED; urgency=low
+
+  * New bug fix release
+  * remove conflicting __init__.py
+
+ -- Pierre-Yves David <pierre-yves.david@logilab.fr>  Fri, 31 Aug 2012 11:31:03 +0200
+
+mercurial-evolve (1.0.0-1) UNRELEASED; urgency=low
+
+  * Initial release.
+
+ -- Julien Cristau <jcristau@debian.org>  Fri, 24 Aug 2012 16:46:30 +0200
new file mode 100644
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1,1 @@
+8
new file mode 100644
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,40 @@
+Source: mercurial-evolve
+Section: vcs
+Priority: optional
+Maintainer: Logilab <contact@logilab.fr>
+Uploaders:
+ Julien Cristau <julien.cristau@logilab.fr>,
+ Pierre-Yves David <pierre-yves.david@logilab.fr>,
+Standards-Version: 3.9.3
+Build-Depends:
+ mercurial (>= 3.4~),
+ python,
+ debhelper (>= 8),
+ python-sphinx (>= 1.0.8),
+ imagemagick,
+ librsvg2-bin,
+ wget,
+Python-Version: >= 2.6
+Homepage: https://bitbucket.org/marmoute/mutable-history
+
+Package: mercurial-evolve
+Architecture: all
+Depends:
+ ${python:Depends},
+ ${misc:Depends},
+ mercurial (>= 3.3~),
+Description: evolve extension for Mercurial
+ This package provides the experimental "evolve" extension for the Mercurial
+ DVCS.
+ .
+ This extension provides several commands to mutate history and deal with issues
+ it may raise.
+ .
+ It also:
+  - enables the "Changeset Obsolescence" feature of mercurial,
+  - alters core command and extension that rewrite history to use this feature,
+  - improves some aspects of the early implementation in Mercurial 2.3.
+ .
+ **These extensions are experimental and are not meant for production.**
+
+
new file mode 100644
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,15 @@
+This software was downloaded from
+https://bitbucket.org/marmoute/mutable-history
+
+Copyright 2011 Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
+               Logilab SA        <contact@logilab.fr>
+               Pierre-Yves David <pierre-yves.david@ens-lyon.org>
+	       Patrick Mezard <patrick@mezard.eu>
+
+
+This software may be used and distributed according to the terms of the GNU
+General Public License version 2 or any later version.
+
+On Debian systems, the complete text of the GNU General Public License version
+2 can be found in `/usr/share/common-licenses/GPL-2'.
+
new file mode 100644
--- /dev/null
+++ b/debian/docs
@@ -0,0 +1,2 @@
+html
+README
new file mode 100755
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,28 @@
+#!/usr/bin/make -f
+#export DH_VERBOSE=1
+
+%:
+	dh $@ --with python2 --buildsystem=python_distutils
+
+override_dh_auto_build:
+	dh_auto_build
+	$(MAKE) -C docs
+
+ifeq (,$(filter nocheck, $(DEB_BUILD_OPTIONS)))
+override_dh_auto_test:
+	cd tests &&  python run-tests.py --with-hg=`which hg` --blacklist=$(CURDIR)/debian/test-blacklist
+endif
+
+override_dh_python2:
+	# avoid conflict with mercurial's own hgext/__init__.py
+	find debian -name __init__.py -delete
+	dh_python2
+
+override_dh_auto_clean: clean-docs
+	dh_auto_clean
+	rm -f tests/*.err
+
+clean-docs:
+	rm -rf html
+	rm -f docs/static/logo-evolve.ico
+	rm -f docs/tutorials/tutorial.rst
new file mode 100644
--- /dev/null
+++ b/debian/source/format
@@ -0,0 +1,1 @@
+3.0 (quilt)
new file mode 100644
--- /dev/null
+++ b/debian/test-blacklist
@@ -0,0 +1,3 @@
+test-drop.t
+test-simple4server.t
+tests/test-simple4server-bundle2.t
new file mode 100644
--- /dev/null
+++ b/docs/concepts.rst
@@ -0,0 +1,223 @@
+.. Copyright 2014 Greg Ward <greg@gerg.ca>
+
+----------------
+Evolve: Concepts
+----------------
+
+Getting the most out of software requires an accurate understanding of
+the concepts underlying it. For example, you cannot use Mercurial to
+its full potential without understanding the DAG (directed acyclic
+graph) of changesets and the meaning of parent/child relationships
+between nodes in that graph. Mercurial with changeset evolution adds
+some additional concepts to the graph of changesets. Understanding
+those concepts will make you an informed and empowered user of
+``evolve``.
+
+.. note:: This document contains math! If you have a pathological fear
+          of set theory and the associated notation, you might be
+          better off just reading the `user guide`_. But if you
+          appreciate the theoretical rigour underlying core Mercurial,
+          you will be happy to know that it continues right into
+          changeset evolution.
+
+.. note:: This document is incomplete! (The formatting of the math
+          isn't quite right yet, and the diagrams are missing for
+          malformatted.)
+
+This document follows standard set theory notation::
+
+  x ∈ A: x is a member of A
+
+  A ∪ B: union of A and B: { x | x ∈ A or x ∈ B }
+
+  A ∖ B: set difference: { x | x ∈ A and x ∉ B }
+
+  A ⊇ B: superset: if x ∈ B, then x ∈ A
+
+.. _`user guide`: user-guide.html
+
+Phases
+------
+
+First, every changeset in a Mercurial repository (since 2.3) has a
+*phase*. Phases are independent of ``evolve`` and they affect
+Mercurial usage with or without changeset evolution. However, they
+were implemented in order to support evolution, and are a critical
+foundation of ``evolve``.
+
+Phases are strictly ordered:
+
+  secret > draft > public
+
+Changesets generally only move from a higher phase to a lower phase.
+Typically, changesets start life in *draft* phase, and move to
+*public* phase when they are pushed to a public repository. (You can
+set the default phase of new commits in Mercurial configuration.)
+
+The purpose of phases is to prevent modifying published history.
+``evolve`` will therefore only let you rewrite changesets in one of
+the two *mutable* phases (secret or draft).
+
+Run ``hg help phases`` for more information on phases.
+
+Obsolete changesets
+-------------------
+
+*Obsolescence* is they key concept at the heart of changeset
+evolution. Everything else in this document depends on understanding
+obsolescence. So: what does it mean for a changeset to be obsolete?
+
+In implementation terms, there is an *obsolescence marker* associated
+with changesets: every changeset is either obsolete or not.
+
+The simplest way that a changeset becomes obsolete is by *pruning* it.
+The ``hg prune`` command simply marks the specified changesets
+obsolete, as long as they are mutable.
+
+More commonly, a changeset *A* becomes obsolete by *amending* it.
+Amendment creates a new changeset *A'* that replaces *A*, which is now
+obsolete. *A'* is the successor of *A*, and *A* the predecessor of *A'*:
+
+  [diagram: A and A' with pred/succ edge]
+
+The predecessor/successor relationship forms an additional
+*obsolescence graph* overlaid on top of the traditional DAG formed by
+changesets and their parent/child relationships. In fact, the
+obsolescence graph is second-order version control. Where the
+traditional parent/child DAG tracks changes to your source code, the
+obsolescence graph tracks changes to your changesets. It tracks the
+evolution of your changesets.
+
+(If you prefer a calculus metaphor to set theory, it might help to
+think of the traditional parent/child DAG as the first derivative of
+your source code, and the obsolescence DAG as the second derivative.)
+
+Troubled changesets (unstable, bumped, divergent)
+-------------------------------------------------
+
+Evolving history can introduce problems that need to be solved. For
+example, if you prune a changeset *P* but not its descendants, those
+descendants are now on thin ice. To push a changeset to another
+repository *R*, all of its ancestors must be present in *R* or pushed
+at the same time. But Mercurial does not push obsolete changesets like
+*P*, so it cannot push the descendants of *P*. Any non-obsolete
+changeset that is a descendant of an obsolete changeset is said to be
+*unstable*.
+
+  [diagram: obsolete cset with non-obsolete descendant]
+
+Another sort of trouble occurs when two developers, Alice and Bob,
+collaborate via a shared non-publishing repository. (This is how
+developers can safely `share mutable history`_.) Say Alice and Bob
+both start the day with changeset *C* in *draft* phase. If Alice
+pushes *C* to their public repository, then it is now published and
+therefore immutable. But Bob is working from a desert island and
+cannot pull this change in *C*'s phase. For Bob, *C* is still in draft
+phase and therefore mutable. So Bob amends *C*, which marks it
+obsolete and replaces it with *C'*. When he is back online and pulls
+from the public repository, Mercurial learns that *C* is public, which
+means it cannot be obsolete. We say that *C'* is *bumped*, since it is
+the successor of a public changeset.
+
+.. _`share mutable history`: sharing.html
+
+(Incidentally, the terminology here comes from airline overbooking: if
+two people have bought tickets for the same seat on a plane and they
+both show up at the airport, only one of them gets on the plane. The
+passenger who is left behind in the airport terminal has been
+"bumped".)
+
+The third sort of trouble is when Alice and Bob both amend the same
+changeset *C* to have different successors. When this happens, the
+successors are both called *divergent* (unless one of them is in
+public phase; only mutable changesets are divergent).
+
+The collective term for unstable, bumped, and divergent changeset is
+*troubled*::
+
+  troubled = unstable ∪ bumped ∪ divergent
+
+It is possible for a changeset to be in any of the troubled categories
+at the same time: it might be unstable and divergent, or bumped and
+divergent, or whatever.
+
+  [diagram: Venn diagram of troubled changesets, showing overlap]
+
+The presence of troubled changesets indicates the need to run ``hg
+evolve``.
+
+Hidden (and visible) changesets
+-------------------------------
+
+Some obsolete changesets are *hidden*: deliberately suppressed by
+Mercurial and usually not visible through the UI. (As of Mercurial
+2.9, there are still some commands that inadvertently reveal hidden
+changesets; these are bugs and will be fixed in due course.)
+
+All hidden changesets are obsolete, and all obsolete changesets are
+part of your repository. Mathematically speaking::
+
+  repo ⊇ obsolete ⊇ hidden
+
+Or, putting it visually:
+
+  [diagram: Venn diagram showing nested strict subsets]
+
+However, the presence of obsolete but not hidden changesets should be
+temporary. The desired end state for any history mutation operation is
+that all obsolete changesets are hidden, i.e.:
+
+  repo ⊇ obsolete, obsolete = hidden
+
+Visually:
+
+  [diagram: Venn diagram showing obsolete = hidden, subset of repo]
+
+
+Why is this changeset visible?
+------------------------------
+
+Any changeset which is not hidden is *visible*. That is, ::
+
+  visible = repo ∖ hidden
+
+(Recall that ∖ means set difference: *visible* is the set of
+changesets that are in *repo* but not in *hidden*.)
+
+After amending or pruning a changeset, you might expect it to be
+hidden. It doesn't always work out that way. The precise rules are::
+
+  hideable = obsolete
+  blockers = bookmarks ∪ parents(workingcopy) ∪ localtags
+  hidden = hideable ∖ ancestors((repo ∖ hideable) ∪ blockers)
+
+This will probably be clearer with a worked example. First, here's a
+repository with some obsolete changesets, some troubled changesets,
+one bookmark, a working copy, and some hidden changesets::
+
+        x-x
+       /
+  -o-o-o-o
+     \
+      x-x-o
+
+Here's the computation required to determine which changesets are
+hidden::
+
+  repo = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }
+
+  hideable = obsolete = { 2, 4, 5, 8 }
+
+  blockers = { 6 } ∪ { 4 } ∪ {}
+
+  blockers = { 4, 6 }
+
+  hidden = hideable ∖ ancestors((repo ∖ { 2, 4, 5, 8 }) ∪ { 4, 6 })
+
+  hidden = hideable ∖ ancestors({ 0, 1, 3, 6, 7 } ∪ { 4, 6 })
+
+  hidden = hideable ∖ ancestors({ 0, 1, 3, 4, 6, 7 })
+
+  hidden = { 2, 4, 5, 8 } ∖ { 0, 1, 2, 3, 4, 5, 6, 7 }
+
+  hidden = { 8 }
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -12,8 +12,8 @@
 master_doc = 'index'
 
 # General substitutions.
-project = 'Obsolete experimentation'
-copyright = '2010-2011, pierre-yves.david@logilab.fr'
+project = 'evolve extension for Mercurial'
+copyright = '2010-2014, Pierre-Yves David, Greg Ward, and contributors'
 
 # The default replacements for |version| and |release|, also used in various
 # other places throughout the built documents.
@@ -73,17 +73,17 @@
 
 # The name of an image file (within the static path) to place at the top of
 # the sidebar.
-#html_logo = None
+#html_logo = 'logo-evolve.svg'
 
 # The name of an image file (within the static path) to use as favicon of the
 # docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
 # pixels large.
-#html_favicon = None
+html_favicon = 'logo-evolve.ico'
 
 # Add any paths that contain custom static files (such as style sheets) here,
 # relative to this directory. They are copied after the builtin static files,
 # so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['.static']
+html_static_path = ['static']
 
 # If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
 # using the given strftime format.
deleted file mode 100644
--- a/docs/evolve-collaboration.rst
+++ /dev/null
@@ -1,133 +0,0 @@
-
-------------------------------------------------
-Collaboration Using Evolve: A user story
-------------------------------------------------
-
-
-After having written some code for ticket #42, Alice starts a patch
-(this will be kind of like a 'work-in-progress' checkpoint
-initially)::
-
-    $ hg ci -m '[entities] remove magic'
-
-Instant patch ! Note how the default phase of this changeset is (still)
-in "draft" state.
-
-This is easily checkable::
-
-    $ hg phase tip
-    827: draft
-
-See? Until the day it becomes a "public" changeset, this can be
-altered to no end. How? It happens with an explicit::
-
-    $ hg phase --public
-
-In practice, pushing to a "publishing" repository can also turn draft
-changesets into public ones. Older Mercurial releases are automatically
-"publishing" since they do not have the notion of non-public changesets
-(or mutable history).
-
-During the transition from older mercurial servers to new ones, this will
-happen often, so be careful.
-
-Now let's come back to our patch. Next hour sees good progress and Alice
-wants to complete the patch with the recent stuff (all that's shown by
-an "hg diff") to share with a co-worker, Bob::
-
-    $ hg amend -m '[entities] fix frobulator (closes #42)'
-
-Note that we also fix the commit message. (For recovering mq users: this
-is just like "hg qrefresh -m").
-
-Before leaving, let's push to the central shared repository. That will
-give Bob the signal that something is ripe for review / further amendments::
-
-    $ hg push # was done with a modern mercurial, draft phase is preserved
-
-The next day, Bob, who arrives very early, can immediately work out
-some glitches in the patch.
-
-He then starts two others, for ticket #43 and #44 and finally commits them.
-Then, as original worker arrives, he pushes his stuff.
-
-Alice, now equipped with enough properly sugared coffee to survive the
-next two hours::
-
-    $ hg pull
-
-Then::
-
-    $ hg up "tip ~ 2"
-
-brings her to yesterday's patch. Indeed the patch serial number has
-increased (827 still exists but has been obsoleted).
-
-She understands that his original patch has been altered. But how did it
-evolve?
-
-The enhanced hgview shows the two patches. By default only the most
-recent version of a patch is shown.
-
-Now, when Alice installed the mutable-history extensions, she got an alias
-that allows her to see the diff between two amendments, defined like this::
-
-    odiff=diff --rev 'limit(obsparents(.),1)' --rev .
-
-She can see exactly how Bob amended her work.
-
-* odiff
-
-
-Amend ... Stabilize
---------------------
-
-Almost perfect ! Alice just needs to fix a half dozen grammar oddities in
-the new docstrings and it will be publishable.
-
-Then, another round of:
-
-    $ hg amend
-
-and a quick look at hgview ... shows something strange (at first).
-
-Ticket #42 yesterday's version is still showing up, with two descendant lineages:
-
-* the next version, containing grammar fixes,
-
-* the two stacked changesets for tickets #43 .. 44 committed by Bob.
-
-Indeed, since this changeset still has non-obsolete descendant
-changesets it cannot be hidden. This branch (old version of #42 and
-the two descendants by C.W.) is said to be _unstable_.
-
-Why would one want such a state? Why not auto-stabilize each time "hg
-amend" is typed out?
-
-Alice for one, wouldn't want to merge each time she amends something that
-might conflict with the descendant changesets. Remember she is
-currently updating the very middle of an history!
-
-Being now done with grammar and typo fixes, Alice decides it is time to
-stabilize again the tree. She does::
-
-    $ hg stabilize
-
-two times, one for each unstable descendant. The last time, hgview
-shows her a straight line again. Wow! that feels a bit like a
-well-planned surgical operation. At the end, the patient tree has
-been properly trimmed and any conflict properly handled.
-
-Of course nothing fancy really happened: each "stablilize" can be
-understood in terms of a rebase of the next unstable descendant to the
-newest version of its parent (including the possible manual conflict
-resolution intermission ...).
-
-Except that rebase is a destructive (it removes information from the
-repository), unrecoverable operation, and the "evolve + obsolete"
-combo, using changeset copy and obsolescence marker, provide evolution
-semantics by only adding new information to the repository (but more
-on that later).
-
-She pushes again.
-
--- a/docs/evolve-faq.rst
+++ b/docs/evolve-faq.rst
@@ -1,104 +1,88 @@
+.. Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
+..                Logilab SA        <contact@logilab.fr>
 
----------------------------------------------------------------------
+-------------
 Evolve How To
----------------------------------------------------------------------
+-------------
 
 
 
 Add a changeset: ``commit``
-------------------------------------------------------------
+---------------------------
 
 Just use commit as usual. New changesets will be in the `draft` phase.
 
-Rewrite a changeset: ``amend``
-------------------------------------------------------------
+Rewrite a changeset: ``commit --amend``
+---------------------------------------
 
-A new command ``hg amend`` is added by the extension. It writes a new
-changeset combining working-directory parent changes and parent. It
-will work on any `draft` or `secret` changeset. It will not work on
-`public` changesets.
+It writes a new changeset combining working-directory parent changes and parent.
+It will work on any `draft` or `secret` changeset. It will not work on `public`
+changesets.
 
 To understand what the result of amend will be I use the two following
-aliases  [#]_::
+aliases   [#]_::
 
-    # diff what amend will look likes
+    # diff what amend will look like
     pdiff=diff --rev .^
 
-    # status what amend will look likes
+    # status what amend will look like
     pstatus=status --rev .^
 
-It takes various options to pick an author, a date and the branch of the
-result... (see ``hg help amend`` for details).
-
-This command can even be invoked on changesets with children (provided
-none is public) !
+This command can even be invoked on changesets with children, provided
+none are public.
 
-.. note:: the amend command is very similar to mq's ``qrefresh``, a ``refresh``
-          alias for amend is also available. But note that contrary to
-          ``qrefresh``, ``amend`` does not exclude changes on file not specified
-          on the command line.
-
-          XXX add idank example
-
-
-.. [#] (added by enable.sh)
+.. [#] (defined by the evolve extension for you)
 
 
 
-Move a changeset: ``graft``
-------------------------------------------------------------
-
-The graft command introduced in 2.0 allows to "copy changes from other
-branches onto the current branch".
+Move a changeset: ``grab``
+--------------------------
 
-The graft command has been altered to allow the creation of an
-obsolete marker indicating both the result cset and its source
-(actually recording changeset movements).
+You can use ``hg grab <rev>`` to move a rev at your current location, making the
+old version obsolete.
 
-This is achieved using a new flag `-O` (or `old-obsolete`) [#]_.
+.. note:: grab is an alias for ``hg rebase --dest . --rev $@; hg up <result>``
 
 
-XXX example
-
-.. warning:: when using graft --continue after conflict resolution you **MUST**
-             pass `-O` or `-o` flag again because they are not saved for now
-
-
-.. [#] add this `-O` to graft instead of a dedicated command is probably
-       abusive. But this was very convenient for experimental purposes.
-       This will likely change in non experimental release.
-
 Delete a changeset: ``prune``
-------------------------------------------------------------
+-----------------------------
 
 A new ``prune`` command allows removing a changeset.
 
 Just use ``hg prune <some-rev>``.
 
-Moving within the history: ``up`` ``gdown`` and ``gup``
-------------------------------------------------------------
+
+Moving within the history: ``gdown`` and ``gup``
+------------------------------------------------
 
 While working on mutable part of the history you often need to move between
-mutable commit.
+mutable commits.
 
 You just need to use standard update to work with evolve. For convenience, you
-can use ``hg gup`` to move to children commit or ``hg gdown`` to move to working
-directory parent commit.
+can use ``hg gup`` to move to the child commit or ``hg gdown`` to move to the parent commit.
 
-.. note:: those command only exist for the convenience of getting qpush and qpop
+Those command have ``previous`` and ``next`` alias.
+
+.. note:: Those commands only exist for the convenience of getting qpush and qpop
           feeling back.
 
-Collapse changesets: ``amend``
-------------------------------------------------------------
+Collapse changesets: ``fold``
+-----------------------------
+
+You can use ``hg fold`` to collapse multiple changesets in a single one.
 
-you can use amend -c to collapse multiple changeset in a single one.
+It takes two forms:
+
+``hg fold <rev>`` folds everything from you current changeset to `<rev>`
+
+``hg fold -r <revset>`` fold everything changeset matching the revset together.
 
 Getting changes out of a commit
-------------------------------------------------------------
+-------------------------------
 
-the ``hg uncommit`` commands allow you to rewrite the current commit to not
-include change for some file. The content of target files are not altered on
-disk and back as "modified"::
+The ``hg uncommit`` command lets you rewrite the parent commit without
+selected changed files. Target files content is not altered and
+appears again as "modified"::
 
   $ hg st
   M babar
@@ -110,12 +94,11 @@
   M celestine
 
 Split a changeset
------------------------
+-----------------
 
-I you just want to split whole file, you can just use the ``uncommit`` command.
+To split on file boundaries, just use ``uncommit`` command.
 
-
-If you need fine-grained split, there is no official command for that yet.
+If you need a fine-grained split, there is no official command for that yet.
 However, it is easily achieved by manual operation::
 
   ### you want to split changeset A: 42
@@ -131,14 +114,18 @@
   # current changeset (.) and previous one (.^) replace A (42)
   $ hg prune --new . --new .^ 42
 
+For more complexe scenario we recommend the use of the histedit_ extension.
 
-Update my current work in progess after a pull
-----------------------------------------------
+.. _histedit: http://mercurial.selenic.com/wiki/HisteditExtension
+
 
-Whenever you are working on some changesets, it is more likely that a pull 
+Update my current work in progress after a pull
+-----------------------------------------------
+
+Whenever you are working on some changesets, it is more likely that a pull
 will, eventually, import new changesets in your tree.
 
-And it is likely that you will want your work in progress changsets to be 
+And it is likely that you will want your work in progress changesets to be
 rebased on the top of this newly imported subtree.
 
 Doing so is only a matter of rebasing.
@@ -146,15 +133,15 @@
 
 
 Move multiple changesets: ``rebase``
-------------------------------------------------------------
+------------------------------------
 
 You can still use rebase to move a whole segment of the changeset graph together.
 
-.. warning:: Beware that rebasing obsolete changesets will result in
-             conflicting versions of the changesets.
+.. warning:: Beware that rebasing changesets already obsolete will likely result in
+             divergent versions of the changesets.
 
-Stabilize history: ``stabilize``
-------------------------------------------------------------
+Resolve history troubles: ``evolve``
+------------------------------------
 
 When you rewrite (amend) a changeset with children without rewriting
 those children you create *unstable* changesets and *suspended
@@ -162,69 +149,61 @@
 
 When you are finished amending a given changeset, you will want to
 declare it stable, in other words rebase its former descendants on its
-newest version. This is not done automatically to avoid the
-proliferation of useless hidden changesets.
-
-.. warning:: ``hg stabilize`` have no --continue to use after conflict
-             resolution
+newest version.
 
-.. warning:: stabilization does not handle deletion yet.
-
-.. warning:: obsolete currently relies on changesets in secret phase
-              to avoid exchanging obsolete and unstable changesets.
-
-             XXX details issue here
+You can also use evolve to solve `bumped` and `divergent` changeset/
 
 
 Fix my history afterward: ``prune -n``
-------------------------------------------------------------
+--------------------------------------
 
 Sometimes you need to create an obsolete marker by hand. This may happen when
 upstream has applied some of your patches for example.
 
-you can use ``hg prune --new <new-changeset> <old-changeset>`` to add obsolete
+you can use ``hg prune <old-changeset> --succ <new-changeset>`` to add obsolete
 marker.
 
-Export to mq: ``synchronize``
-------------------------------------------------------------
-
-Another extension allows to export your changes to mq.
-
 View diff from the last amend
-------------------------------------------------------------
+-----------------------------
 
 An ``odiff`` alias have been added by ``enable.sh``
 
-:: 
+::
     [alias]
     odiff = diff --rev 'limit(precursors(.),1)' --rev .
 
 View obsolete markers
-------------------------------------------------------------
+---------------------
+
+hgview_ is the only viewer that currently supports this feature. You
+need version 1.6.2
 
-hgview is the only viewer that support this feature. You need an experimental
-version available here:
+.. _hgview: http://www.logilab.org/project/hgview/
 
-    $ hg clone http://hg-dev.octopoid.net/hgwebdir.cgi/hgview/
+.. image:: figures/hgview-example.png
+    :scale: 50%
+
 
 You can also use a debug command
 
-    $ hg debugsuccessors
+    $ hg debugobsolete
       5eb72dbe0cb4 e8db4aa611f6
       c4cbebac3751 4f1c269eab68
 
 
 
 Important Note
-=====================================================================
+==============
 
 View change to your file
-------------------------------------------------------------
+------------------------
 
 Extinct changesets are hidden using the *hidden* feature of mercurial.
 
-Only ``hg log`` and ``hgview`` support it. ``hg glog`` Only support that since
-2.2. Other visual viewer don't.
+Only ``hg log`` and ``hgview`` support it, other
+graphical viewer do not.
+
+You can use ``hg log --graph --hidden`` from the command line
 
 
 
@@ -234,4 +213,3 @@
 
 
 
-
--- a/docs/evolve-good-practice.rst
+++ b/docs/evolve-good-practice.rst
@@ -1,9 +1,12 @@
+.. Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
+..                Logilab SA        <contact@logilab.fr>
+
 -----------------------------------------
-Good pratice for (early) user of evolve
+Good practice for (early) users of evolve
 -----------------------------------------
 
 Avoid unstability
---------------------------------
+-----------------
 
 The less unstability you have the less you need to resolve.
 
@@ -11,25 +14,25 @@
 not ready neither.
 
 Branch as much as possible
---------------------------------
+--------------------------
 
-This is not MQ, you are not constrainted to linear history.
+This is not MQ; you are not constrained to linear history.
 
 Making a branch per independent branch will help you avoid unstability
 and conflict.
 
-Rewrite you change only
-------------------------------------------------
+Rewrite your changes only
+-------------------------
 
 There is no descent conflict detection and handling right now.
 Rewriting other people's changesets guarantees that you will get
 conflicts. Communicate with your fellow developers before trying to
 touch other people's work (which is a good pratice in any case).
 
-Using multiple branch will help you to achieve this goal.
+Using multiple branches will help you to achieve this goal.
 
-Prefer pushing unstability than touching other people changeset
-------------------------------------------------------------------
+Prefer pushing unstability to touching other people changesets
+--------------------------------------------------------------
 
 
 If you have children changesets from other people that you don't really care
@@ -37,7 +40,7 @@
 
 
 Do not get too confident
----------------------------
+------------------------
 
 This is an experimental extension and a complex concept. This is beautiful,
 powerful and robust on paper, but the tool and your mind may not be prepared for
deleted file mode 100644
--- a/docs/figures/error-conflicting.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="342 1890 349 427" width="349pt" height="427pt"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2012-03-18 23:47Z</dc:date><!-- Produced by OmniGraffle Professional 5.3.6 --></metadata><defs><filter id="Shadow" filterUnits="userSpaceOnUse"><feGaussianBlur in="SourceAlpha" result="blur" stdDeviation="3.488"/><feOffset in="blur" result="offset" dx="0" dy="4"/><feFlood flood-color="black" flood-opacity=".75" result="flood"/><feComposite in="flood" in2="offset" operator="in"/></filter><font-face font-family="Helvetica" font-size="26" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.31641" slope="0" x-height="522.94922" cap-height="717.2852" ascent="770.0196" descent="-229.98048" font-weight="500"><font-face-src><font-face-name name="Helvetica"/></font-face-src></font-face><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledDiamond_Marker" viewBox="-1 -3 6 6" markerWidth="6" markerHeight="6" color="blue"><g><path d="M 3.7333333 0 L 1.8666667 -1.4 L 0 0 L 1.8666667 1.4 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/></g></marker><font-face font-family="Helvetica" font-size="17" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.316406" slope="0" x-height="532.22656" cap-height="719.72656" ascent="770.01953" descent="-229.98047" font-weight="bold"><font-face-src><font-face-name name="Helvetica-Bold"/></font-face-src></font-face></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><g><use xl:href="#id465_Graphic" filter="url(#Shadow)"/><use xl:href="#id466_Graphic" filter="url(#Shadow)"/><use xl:href="#id472_Graphic" filter="url(#Shadow)"/><use xl:href="#id471_Graphic" filter="url(#Shadow)"/><use xl:href="#id475_Graphic" filter="url(#Shadow)"/><use xl:href="#id718_Graphic" filter="url(#Shadow)"/><use xl:href="#id722_Graphic" filter="url(#Shadow)"/></g><g id="id465_Graphic"><rect x="362.1148" y="1906.3591" width="308.04614" height="386.30615" fill="white" fill-opacity=".5"/><rect x="362.1148" y="1906.3591" width="308.04614" height="386.30615" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id466_Graphic"><path d="M 460.24097 2058.0142 C 471.311 2069.0842 471.311 2087.032 460.24097 2098.102 C 449.171 2109.1721 431.22305 2109.1721 420.15308 2098.102 C 409.08304 2087.032 409.08304 2069.0842 420.15308 2058.0142 C 431.22305 2046.9441 449.171 2046.9441 460.24097 2058.0142" fill="yellow"/><path d="M 460.24097 2058.0142 C 471.311 2069.0842 471.311 2087.032 460.24097 2098.102 C 449.171 2109.1721 431.22305 2109.1721 420.15308 2098.102 C 409.08304 2087.032 409.08304 2069.0842 420.15308 2058.0142 C 431.22305 2046.9441 449.171 2046.9441 460.24097 2058.0142" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><text transform="translate(422.51984 2062.5581)" fill="maroon"><tspan font-family="Helvetica" font-size="26" font-weight="500" fill="maroon" x="6.1180782" y="25" textLength="23.118164">A’</tspan></text></g><line x1="508.74466" y1="2219.2893" x2="453.23264" y2="2104.9158" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id472_Graphic"><path d="M 525.1753 2222.4712 C 530.71033 2228.0061 530.71033 2236.9802 525.1753 2242.5151 C 519.64032 2248.0503 510.66632 2248.0503 505.13132 2242.5151 C 499.5963 2236.9802 499.5963 2228.0061 505.13132 2222.4712 C 510.66632 2216.936 519.64032 2216.936 525.1753 2222.4712" fill="black"/><path d="M 525.1753 2222.4712 C 530.71033 2228.0061 530.71033 2236.9802 525.1753 2242.5151 C 519.64032 2248.0503 510.66632 2248.0503 505.13132 2242.5151 C 499.5963 2236.9802 499.5963 2228.0061 505.13132 2222.4712 C 510.66632 2216.936 519.64032 2216.936 525.1753 2222.4712" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id471_Graphic"><path d="M 525.1753 2268.4714 C 530.71033 2274.0063 530.71033 2282.9805 525.1753 2288.5154 C 519.64032 2294.0505 510.66632 2294.0505 505.13132 2288.5154 C 499.5963 2282.9805 499.5963 2274.0063 505.13132 2268.4714 C 510.66632 2262.9363 519.64032 2262.9363 525.1753 2268.4714" fill="black"/><path d="M 525.1753 2268.4714 C 530.71033 2274.0063 530.71033 2282.9805 525.1753 2288.5154 C 519.64032 2294.0505 510.66632 2294.0505 505.13132 2288.5154 C 499.5963 2282.9805 499.5963 2274.0063 505.13132 2268.4714 C 510.66632 2262.9363 519.64032 2262.9363 525.1753 2268.4714" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="515.15332" y1="2247.1665" x2="515.15332" y2="2263.8201" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="515.15332" y1="2217.8198" x2="515.15332" y2="2168.1504" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id475_Graphic"><path d="M 535.19727 2119.26 C 546.26727 2130.3301 546.26727 2148.2778 535.19727 2159.3479 C 524.12732 2170.418 506.17935 2170.418 495.10938 2159.3479 C 484.03934 2148.2778 484.03934 2130.3301 495.10938 2119.26 C 506.17935 2108.19 524.12732 2108.19 535.19727 2119.26" fill="yellow" fill-opacity=".5"/><path d="M 535.19727 2119.26 C 546.26727 2130.3301 546.26727 2148.2778 535.19727 2159.3479 C 524.12732 2170.418 506.17935 2170.418 495.10938 2159.3479 C 484.03934 2148.2778 484.03934 2130.3301 495.10938 2119.26 C 506.17935 2108.19 524.12732 2108.19 535.19727 2119.26" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(497.47614 2123.804)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="463.31088" y1="2096.9441" x2="482.01135" y2="2112.2239" marker-end="url(#FilledDiamond_Marker)" stroke="blue" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke-dasharray="1,4"/><g id="id718_Graphic"><path d="M 618.86163 2058.0142 C 629.93164 2069.0842 629.93164 2087.032 618.86163 2098.102 C 607.7917 2109.1721 589.8437 2109.1721 578.77374 2098.102 C 567.70374 2087.032 567.70374 2069.0842 578.77374 2058.0142 C 589.8437 2046.9441 607.7917 2046.9441 618.86163 2058.0142" fill="#ff6"/><path d="M 618.86163 2058.0142 C 629.93164 2069.0842 629.93164 2087.032 618.86163 2098.102 C 607.7917 2109.1721 589.8437 2109.1721 578.77374 2098.102 C 567.70374 2087.032 567.70374 2069.0842 578.77374 2058.0142 C 589.8437 2046.9441 607.7917 2046.9441 618.86163 2058.0142" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><text transform="translate(581.14056 2062.5581)" fill="maroon"><tspan font-family="Helvetica" font-size="26" font-weight="500" fill="maroon" x="3.2298946" y="25" textLength="28.894531">A’’</tspan></text></g><line x1="522.14453" y1="2219.5881" x2="584.5973" y2="2104.3074" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><line x1="574.73132" y1="2095.6902" x2="549.68903" y2="2114.0222" marker-end="url(#FilledDiamond_Marker)" stroke="blue" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke-dasharray="1,4"/><line x1="470.04346" y1="2078.1025" x2="568.97186" y2="2078.2505" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="7"/><g id="id722_Graphic"><path d="M 419.06274 2052.1411 C 459.63675 2034.4656 555.9978 2028.5737 616.85608 2041.7183 C 677.71497 2054.8606 641.8429 2119.8875 608.87634 2121.7026 C 575.90967 2123.5149 553.70416 2096.4143 553.70416 2096.4148 L 498.5315 2097.185 C 498.5315 2097.185 500.21146 2125.1155 452.02893 2119.2227 C 403.84808 2113.3301 378.49112 2069.8181 419.06274 2052.1411 Z" fill="red" fill-opacity=".15000001"/><path d="M 419.06274 2052.1411 C 459.63675 2034.4656 555.9978 2028.5737 616.85608 2041.7183 C 677.71497 2054.8606 641.8429 2119.8875 608.87634 2121.7026 C 575.90967 2123.5149 553.70416 2096.4143 553.70416 2096.4148 L 498.5315 2097.185 C 498.5315 2097.185 500.21146 2125.1155 452.02893 2119.2227 C 403.84808 2113.3301 378.49112 2069.8181 419.06274 2052.1411 Z" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" stroke-dasharray="4,9,1,5"/></g><text transform="translate(481.40805 1999.724)" fill="red"><tspan font-family="Helvetica" font-size="17" font-weight="bold" fill="red" x=".11987305" y="16" textLength="43.429688">Confl</tspan><tspan font-family="Helvetica" font-size="17" font-weight="bold" fill="red" x="43.54956" y="16" textLength="45.330566">icting</tspan></text></g></g></svg>
deleted file mode 100644
--- a/docs/figures/error-extinct.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="286 1306 644 435" width="644pt" height="435pt"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2012-03-18 23:47Z</dc:date><!-- Produced by OmniGraffle Professional 5.3.6 --></metadata><defs><filter id="Shadow" filterUnits="userSpaceOnUse"><feGaussianBlur in="SourceAlpha" result="blur" stdDeviation="3.488"/><feOffset in="blur" result="offset" dx="0" dy="4"/><feFlood flood-color="black" flood-opacity=".75" result="flood"/><feComposite in="flood" in2="offset" operator="in"/></filter><font-face font-family="Helvetica" font-size="26" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.31641" slope="0" x-height="522.94922" cap-height="717.2852" ascent="770.0196" descent="-229.98048" font-weight="500"><font-face-src><font-face-name name="Helvetica"/></font-face-src></font-face><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledDiamond_Marker" viewBox="-1 -2 4 4" markerWidth="4" markerHeight="4" color="blue"><g><path d="M 1.6 0 L .8 -.60000002 L 0 0 L .8 .60000002 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/></g></marker><font-face font-family="Helvetica" font-size="17" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.316406" slope="0" x-height="532.22656" cap-height="719.72656" ascent="770.01953" descent="-229.98047" font-weight="bold"><font-face-src><font-face-name name="Helvetica-Bold"/></font-face-src></font-face></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><g><use xl:href="#id581_Graphic" filter="url(#Shadow)"/><use xl:href="#id423_Graphic" filter="url(#Shadow)"/><use xl:href="#id422_Graphic" filter="url(#Shadow)"/><use xl:href="#id415_Graphic" filter="url(#Shadow)"/><use xl:href="#id567_Graphic" filter="url(#Shadow)"/><use xl:href="#id588_Graphic" filter="url(#Shadow)"/><use xl:href="#id565_Graphic" filter="url(#Shadow)"/><use xl:href="#id592_Graphic" filter="url(#Shadow)"/><use xl:href="#id595_Graphic" filter="url(#Shadow)"/><use xl:href="#id597_Graphic" filter="url(#Shadow)"/><use xl:href="#id599_Graphic" filter="url(#Shadow)"/><use xl:href="#id604_Graphic" filter="url(#Shadow)"/></g><g id="id581_Graphic"><rect x="538.9198" y="1322.60815" width="371" height="394" fill="white" fill-opacity=".5"/><rect x="538.9198" y="1322.60815" width="371" height="394" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id423_Graphic"><rect x="306.04608" y="1379.2305" width="160" height="280.84644" fill="white" fill-opacity=".5"/><rect x="306.04608" y="1379.2305" width="160" height="280.84644" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id422_Graphic"><circle cx="384.04633" cy="1522.2869" r="28.346533" fill="red"/><circle cx="384.04633" cy="1522.2869" r="28.346533" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(366.36917 1506.7869)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="371.27045" y1="1496.4152" x2="353.8865" y2="1461.212" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><path d="M 394.06836 1589.8818 C 399.60336 1595.4169 399.60336 1604.3907 394.06836 1609.9258 C 388.53336 1615.4608 379.55936 1615.4608 374.02435 1609.9258 C 368.48935 1604.3907 368.48935 1595.4169 374.02435 1589.8818 C 379.55936 1584.3468 388.53336 1584.3468 394.06836 1589.8818" fill="black"/><path d="M 394.06836 1589.8818 C 399.60336 1595.4169 399.60336 1604.3907 394.06836 1609.9258 C 388.53336 1615.4608 379.55936 1615.4608 374.02435 1609.9258 C 368.48935 1604.3907 368.48935 1595.4169 374.02435 1589.8818 C 379.55936 1584.3468 388.53336 1584.3468 394.06836 1589.8818" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><path d="M 394.06836 1635.8817 C 399.60336 1641.4167 399.60336 1650.3906 394.06836 1655.9257 C 388.53336 1661.4607 379.55936 1661.4607 374.02435 1655.9257 C 368.48935 1650.3906 368.48935 1641.4167 374.02435 1635.8817 C 379.55936 1630.3467 388.53336 1630.3467 394.06836 1635.8817" fill="black"/><path d="M 394.06836 1635.8817 C 399.60336 1641.4167 399.60336 1650.3906 394.06836 1655.9257 C 388.53336 1661.4607 379.55936 1661.4607 374.02435 1655.9257 C 368.48935 1650.3906 368.48935 1641.4167 374.02435 1635.8817 C 379.55936 1630.3467 388.53336 1630.3467 394.06836 1635.8817" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="384.05234" y1="1614.577" x2="384.05911" y2="1631.2305" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id415_Graphic"><circle cx="341.11066" cy="1435.3403" r="28.346533" fill="yellow"/><circle cx="341.11066" cy="1435.3403" r="28.346533" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(323.43347 1419.8403)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">B</tspan></text></g><line x1="384.04633" y1="1551.1333" x2="384.04636" y2="1585.2306" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id567_Graphic"><path d="M 649.09058 1405.5331 C 665.0907 1366.53296 703.09058 1353.5331 727.09058 1382.5331 C 751.0899 1411.5319 743.091 1543.5331 730.0907 1547.5327 C 717.09076 1551.5322 681.09106 1566.5331 662.09082 1553.533 C 643.0905 1540.5328 633.091 1444.5325 649.09058 1405.5331 Z" fill="blue" fill-opacity=".15000001"/><path d="M 649.09058 1405.5331 C 665.0907 1366.53296 703.09058 1353.5331 727.09058 1382.5331 C 751.0899 1411.5319 743.091 1543.5331 730.0907 1547.5327 C 717.09076 1551.5322 681.09106 1566.5331 662.09082 1553.533 C 643.0905 1540.5328 633.091 1444.5325 649.09058 1405.5331 Z" stroke="blue" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" stroke-dasharray="4,9,1,5"/></g><line x1="670.96875" y1="1499.7141" x2="608.7143" y2="1440.1655" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><path d="M 763.18304 1609.1852 C 768.7181 1614.7202 768.7181 1623.6941 763.18304 1629.2291 C 757.64807 1634.7642 748.67407 1634.7642 743.1391 1629.2291 C 737.60406 1623.6941 737.60406 1614.7202 743.1391 1609.1852 C 748.67407 1603.6501 757.64807 1603.6501 763.18304 1609.1852" fill="black"/><path d="M 763.18304 1609.1852 C 768.7181 1614.7202 768.7181 1623.6941 763.18304 1629.2291 C 757.64807 1634.7642 748.67407 1634.7642 743.1391 1629.2291 C 737.60406 1623.6941 737.60406 1614.7202 743.1391 1609.1852 C 748.67407 1603.6501 757.64807 1603.6501 763.18304 1609.1852" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><path d="M 763.18304 1655.1852 C 768.7181 1660.7202 768.7181 1669.6941 763.18304 1675.2291 C 757.64807 1680.7642 748.67407 1680.7642 743.1391 1675.2291 C 737.60406 1669.6941 737.60406 1660.7202 743.1391 1655.1852 C 748.67407 1649.6501 757.64807 1649.6501 763.18304 1655.1852" fill="black"/><path d="M 763.18304 1655.1852 C 768.7181 1660.7202 768.7181 1669.6941 763.18304 1675.2291 C 757.64807 1680.7642 748.67407 1680.7642 743.1391 1675.2291 C 737.60406 1669.6941 737.60406 1660.7202 743.1391 1655.1852 C 748.67407 1649.6501 757.64807 1649.6501 763.18304 1655.1852" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="753.16107" y1="1633.8804" x2="753.16107" y2="1650.5339" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id588_Graphic"><circle cx="587.5074" cy="1419.88025" r="28.346518" fill="yellow"/><path d="M 607.55133 1399.8363 C 618.62134 1410.90625 618.62134 1428.85425 607.55133 1439.9242 C 596.4814 1450.9943 578.5334 1450.9943 567.46344 1439.9242 C 556.39343 1428.85425 556.39343 1410.90625 567.46344 1399.8363 C 578.5334 1388.7662 596.4814 1388.7662 607.55133 1399.8363" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" stroke-dasharray="16,9"/><text transform="translate(569.83026 1404.38025)" fill="red"><tspan font-family="Helvetica" font-size="26" font-weight="500" fill="red" x="9.006262" y="25" textLength="17.341797">B</tspan></text></g><g id="id565_Graphic"><circle cx="691.8144" cy="1519.6537" r="28.346518" fill="red" fill-opacity=".5"/><path d="M 711.85834 1499.6097 C 722.92834 1510.6797 722.92834 1528.6277 711.85834 1539.6976 C 700.7884 1550.7677 682.8404 1550.7677 671.77045 1539.6976 C 660.70044 1528.6277 660.70044 1510.6797 671.77045 1499.6097 C 682.8404 1488.5397 700.7884 1488.5397 711.85834 1499.6097" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(674.13727 1504.1537)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="706.95093" y1="1544.2173" x2="745.4616" y2="1606.7125" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><line x1="784.66077" y1="1519.52405" x2="730.5608" y2="1519.5996" marker-end="url(#FilledDiamond_Marker)" stroke="blue" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" stroke-dasharray="1,3"/><g id="id592_Graphic"><circle cx="813.5072" cy="1519.4838" r="28.346518" fill="red"/><circle cx="813.5072" cy="1519.4838" r="28.346518" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(795.8301 1503.9838)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="6.5243282" y="25" textLength="22.305664">A'</tspan></text></g><line x1="798.56934" y1="1544.1689" x2="760.75946" y2="1606.6506" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id595_Graphic"><circle cx="426.39252" cy="1435.3403" r="28.346533" fill="#ff8000"/><circle cx="426.39252" cy="1435.3403" r="28.346533" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(408.71533 1419.8403)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="8.2889767" y="25" textLength="18.776367">C</tspan></text></g><line x1="396.6806" y1="1496.3458" x2="413.75824" y2="1461.2814" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id597_Graphic"><circle cx="817.5072" cy="1419.88025" r="28.346518" fill="#ff8000"/><circle cx="817.5072" cy="1419.88025" r="28.346518" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(799.8301 1404.38025)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="5.807043" y="25" textLength="23.740234">C'</tspan></text></g><line x1="816.34967" y1="1448.7037" x2="814.66473" y2="1490.6603" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id599_Graphic"><circle cx="691.8144" cy="1419.88025" r="28.346518" fill="#ff8000" fill-opacity=".5"/><path d="M 711.85834 1399.8363 C 722.92834 1410.90625 722.92834 1428.85425 711.85834 1439.9242 C 700.7884 1450.9943 682.8404 1450.9943 671.77045 1439.9242 C 660.70044 1428.85425 660.70044 1410.90625 671.77045 1399.8363 C 682.8404 1388.7662 700.7884 1388.7662 711.85834 1399.8363" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(674.13727 1404.38025)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="8.2889767" y="25" textLength="18.776367">C</tspan></text></g><line x1="691.8196" y1="1448.7267" x2="691.82715" y2="1490.80725" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><line x1="788.66077" y1="1419.88025" x2="730.56085" y2="1419.88025" marker-end="url(#FilledDiamond_Marker)" stroke="blue" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" stroke-dasharray="1,3"/><text transform="translate(557.16095 1491.30725)" fill="blue"><tspan font-family="Helvetica" font-size="17" font-weight="bold" fill="blue" x=".13012695" y="16" textLength="72.739746">Obsolete</tspan></text><g id="id604_Graphic"><path d="M 548.05884 1393.9442 C 562.8297 1376.26746 597.9101 1370.3754 620.06622 1383.5195 C 642.22168 1396.6632 634.83734 1456.4924 622.8358 1458.3053 C 610.83466 1460.118 577.60083 1466.9171 560.06024 1461.0248 C 542.51978 1455.1326 533.28845 1411.6206 548.05884 1393.9442 Z" fill="#ff8000" fill-opacity=".15000001"/><path d="M 548.05884 1393.9442 C 562.8297 1376.26746 597.9101 1370.3754 620.06622 1383.5195 C 642.22168 1396.6632 634.83734 1456.4924 622.8358 1458.3053 C 610.83466 1460.118 577.60083 1466.9171 560.06024 1461.0248 C 542.51978 1455.1326 533.28845 1411.6206 548.05884 1393.9442 Z" stroke="#ff8000" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" stroke-dasharray="4,9,1,5"/></g><text transform="translate(551.5074 1339.08044)" fill="#ff8000"><tspan font-family="Helvetica" font-size="17" font-weight="bold" fill="#ff8000" x=".103271484" y="16" textLength="71.793457">Unstable</tspan></text><line x1="631.31445" y1="1469.267" x2="752.31433" y2="1469.267" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke-dasharray="4,3,1,3"/><text transform="translate(712.3343 1373.30725)" fill="maroon"><tspan font-family="Helvetica" font-size="17" font-weight="bold" fill="maroon" x=".103271484" y="16" textLength="54.793457">extinct</tspan></text><text transform="translate(580.1609 1539.234)" fill="#008040"><tspan font-family="Helvetica" font-size="17" font-weight="bold" fill="#008040" x=".13012695" y="16" textLength="89.739746">suspended</tspan></text></g></g></svg>
deleted file mode 100644
--- a/docs/figures/error-obsolete.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="125 130 278 413" width="278pt" height="413pt"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2012-03-18 23:47Z</dc:date><!-- Produced by OmniGraffle Professional 5.3.6 --></metadata><defs><filter id="Shadow" filterUnits="userSpaceOnUse"><feGaussianBlur in="SourceAlpha" result="blur" stdDeviation="3.488"/><feOffset in="blur" result="offset" dx="0" dy="4"/><feFlood flood-color="black" flood-opacity=".75" result="flood"/><feComposite in="flood" in2="offset" operator="in"/></filter><font-face font-family="Helvetica" font-size="26" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.31641" slope="0" x-height="522.94922" cap-height="717.2852" ascent="770.0196" descent="-229.98048" font-weight="500"><font-face-src><font-face-name name="Helvetica"/></font-face-src></font-face><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledDiamond_Marker" viewBox="-1 -2 4 4" markerWidth="4" markerHeight="4" color="blue"><g><path d="M 1.6 0 L .8 -.60000002 L 0 0 L .8 .60000002 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/></g></marker><font-face font-family="Helvetica" font-size="17" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.316406" slope="0" x-height="532.22656" cap-height="719.72656" ascent="770.01953" descent="-229.98047" font-weight="bold"><font-face-src><font-face-name name="Helvetica-Bold"/></font-face-src></font-face></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><g><use xl:href="#id411_Graphic" filter="url(#Shadow)"/><use xl:href="#id410_Graphic" filter="url(#Shadow)"/><use xl:href="#id408_Graphic" filter="url(#Shadow)"/><use xl:href="#id407_Graphic" filter="url(#Shadow)"/><use xl:href="#id395_Graphic" filter="url(#Shadow)"/><use xl:href="#id394_Graphic" filter="url(#Shadow)"/><use xl:href="#id391_Graphic" filter="url(#Shadow)"/><use xl:href="#id390_Graphic" filter="url(#Shadow)"/><use xl:href="#id724_Graphic" filter="url(#Shadow)"/></g><g id="id411_Graphic"><rect x="145" y="146" width="238" height="373" fill="white" fill-opacity=".5"/><rect x="145" y="146" width="238" height="373" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id410_Graphic"><circle cx="290.34644" cy="351.50146" r="28.34651" fill="red"/><circle cx="290.34644" cy="351.50146" r="28.34651" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(272.66928 336.0015)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="216.72533" y1="434.68497" x2="271.22772" y2="373.10342" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id408_Graphic"><circle cx="207.00024" cy="445.67322" r="14.173263" fill="black"/><circle cx="207.00024" cy="445.67322" r="14.173263" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id407_Graphic"><circle cx="206.30316" cy="488.67325" r="14.173263" fill="black"/><circle cx="206.30316" cy="488.67325" r="14.173263" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="206.7624" y1="460.34457" x2="206.541" y2="474.0019" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id395_Graphic"><circle cx="206.30315" cy="266.11322" r="24.803194" fill="#ff8000" fill-opacity=".5"/><path d="M 223.8416 248.57477 C 233.52788 258.26099 233.52788 273.96545 223.8416 283.65167 C 214.15538 293.33795 198.45091 293.33795 188.76469 283.65167 C 179.07841 273.96545 179.07841 258.26099 188.76469 248.57477 C 198.45091 238.88849 214.15538 238.88849 223.8416 248.57477" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(191.46063 250.61322)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="5.4543362" y="25" textLength="18.776367">C</tspan></text></g><g id="id394_Graphic"><circle cx="206.30315" cy="351.50146" r="24.803194" fill="yellow" fill-opacity=".5"/><path d="M 223.8416 333.96301 C 233.52788 343.64923 233.52788 359.3537 223.8416 369.03992 C 214.15538 378.7262 198.45091 378.7262 188.76469 369.03992 C 179.07841 359.3537 179.07841 343.64923 188.76469 333.96301 C 198.45091 324.27673 214.15538 324.27673 223.8416 333.96301" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(191.46063 336.00146)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="6.1716213" y="25" textLength="17.341797">B</tspan></text></g><line x1="206.89162" y1="431.00034" x2="206.49045" y2="376.80396" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="206.30315" y1="326.1983" x2="206.30315" y2="291.41638" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id391_Graphic"><circle cx="290.34644" cy="269.6565" r="28.346504" fill="yellow"/><circle cx="290.34644" cy="269.6565" r="28.346504" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(272.66928 254.15652)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="6.1180782" y="25" textLength="23.118164">B’</tspan></text></g><g id="id390_Graphic"><circle cx="290.34644" cy="187.80643" r="28.3465" fill="#ff8000"/><circle cx="290.34644" cy="187.80643" r="28.3465" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(272.66928 172.30643)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="5.400793" y="25" textLength="24.552734">C’</tspan></text></g><line x1="290.34644" y1="322.655" x2="290.34644" y2="298.50296" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><line x1="290.3464" y1="240.81003" x2="290.3464" y2="216.65289" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><line x1="269.24112" y1="207.47118" x2="232.0592" y2="242.11519" marker-end="url(#FilledDiamond_Marker)" stroke="blue" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" stroke-dasharray="1,3"/><line x1="269.68039" y1="289.78198" x2="231.52318" y2="326.9411" marker-end="url(#FilledDiamond_Marker)" stroke="blue" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" stroke-dasharray="1,3"/><text transform="translate(154.02574 177.80643)" fill="blue"><tspan font-family="Helvetica" font-size="17" font-weight="bold" fill="blue" x=".13012695" y="16" textLength="72.739746">Obsolete</tspan></text><g id="id724_Graphic"><path d="M 167.93994 250.66768 C 182.56549 215.87003 217.30066 204.27097 239.23875 230.14594 C 261.17621 256.02005 253.8645 373.79715 241.98106 377.36597 C 230.09801 380.93442 197.19122 394.31873 179.82327 382.71951 C 162.45541 371.1203 153.31494 285.46457 167.93994 250.66768 Z" fill="blue" fill-opacity=".15000001"/><path d="M 167.93994 250.66768 C 182.56549 215.87003 217.30066 204.27097 239.23875 230.14594 C 261.17621 256.02005 253.8645 373.79715 241.98106 377.36597 C 230.09801 380.93442 197.19122 394.31873 179.82327 382.71951 C 162.45541 371.1203 153.31494 285.46457 167.93994 250.66768 Z" stroke="blue" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" stroke-dasharray="4,9,1,5"/></g></g></g></svg>
deleted file mode 100644
--- a/docs/figures/error-unstable.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="305 746 658 435" width="658pt" height="435pt"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2012-03-18 23:47Z</dc:date><!-- Produced by OmniGraffle Professional 5.3.6 --></metadata><defs><filter id="Shadow" filterUnits="userSpaceOnUse"><feGaussianBlur in="SourceAlpha" result="blur" stdDeviation="3.488"/><feOffset in="blur" result="offset" dx="0" dy="4"/><feFlood flood-color="black" flood-opacity=".75" result="flood"/><feComposite in="flood" in2="offset" operator="in"/></filter><font-face font-family="Helvetica" font-size="26" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.31641" slope="0" x-height="522.94922" cap-height="717.2852" ascent="770.0196" descent="-229.98048" font-weight="500"><font-face-src><font-face-name name="Helvetica"/></font-face-src></font-face><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledDiamond_Marker" viewBox="-1 -2 4 4" markerWidth="4" markerHeight="4" color="blue"><g><path d="M 1.6 0 L .8 -.60000002 L 0 0 L .8 .60000002 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/></g></marker><font-face font-family="Helvetica" font-size="17" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.316406" slope="0" x-height="532.22656" cap-height="719.72656" ascent="770.01953" descent="-229.98047" font-weight="bold"><font-face-src><font-face-name name="Helvetica-Bold"/></font-face-src></font-face></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><g><use xl:href="#id672_Graphic" filter="url(#Shadow)"/><use xl:href="#id673_Graphic" filter="url(#Shadow)"/><use xl:href="#id674_Graphic" filter="url(#Shadow)"/><use xl:href="#id680_Graphic" filter="url(#Shadow)"/><use xl:href="#id689_Graphic" filter="url(#Shadow)"/><use xl:href="#id692_Graphic" filter="url(#Shadow)"/><use xl:href="#id702_Graphic" filter="url(#Shadow)"/><use xl:href="#id714_Graphic" filter="url(#Shadow)"/><use xl:href="#id688_Graphic" filter="url(#Shadow)"/></g><g id="id672_Graphic"><rect x="571.2267" y="762.23743" width="371" height="394" fill="white" fill-opacity=".5"/><rect x="571.2267" y="762.23743" width="371" height="394" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id673_Graphic"><rect x="325.28735" y="817.17517" width="160" height="280.84595" fill="white" fill-opacity=".5"/><rect x="325.28735" y="817.17517" width="160" height="280.84595" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id674_Graphic"><circle cx="403.28784" cy="960.2316" r="28.346495" fill="red"/><circle cx="403.28784" cy="960.2316" r="28.346495" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(385.61066 944.73157)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="390.51233" y1="934.3598" x2="373.12732" y2="899.1533" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><path d="M 413.30957 1027.8263 C 418.84457 1033.3613 418.84457 1042.3352 413.30957 1047.87024 C 407.77457 1053.4053 398.80057 1053.4053 393.26556 1047.87024 C 387.73056 1042.3352 387.73056 1033.3613 393.26556 1027.8263 C 398.80057 1022.29126 407.77457 1022.29126 413.30957 1027.8263" fill="black"/><path d="M 413.30957 1027.8263 C 418.84457 1033.3613 418.84457 1042.3352 413.30957 1047.87024 C 407.77457 1053.4053 398.80057 1053.4053 393.26556 1047.87024 C 387.73056 1042.3352 387.73056 1033.3613 393.26556 1027.8263 C 398.80057 1022.29126 407.77457 1022.29126 413.30957 1027.8263" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><path d="M 413.30957 1073.8263 C 418.84457 1079.3613 418.84457 1088.3352 413.30957 1093.87024 C 407.77457 1099.4053 398.80057 1099.4053 393.26556 1093.87024 C 387.73056 1088.3352 387.73056 1079.3613 393.26556 1073.8263 C 398.80057 1068.29126 407.77457 1068.29126 413.30957 1073.8263" fill="black"/><path d="M 413.30957 1073.8263 C 418.84457 1079.3613 418.84457 1088.3352 413.30957 1093.87024 C 407.77457 1099.4053 398.80057 1099.4053 393.26556 1093.87024 C 387.73056 1088.3352 387.73056 1079.3613 393.26556 1073.8263 C 398.80057 1068.29126 407.77457 1068.29126 413.30957 1073.8263" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="403.1737" y1="1052.5211" x2="403.04446" y2="1069.1771" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id680_Graphic"><circle cx="360.3518" cy="873.2816" r="28.346495" fill="yellow"/><circle cx="360.3518" cy="873.2816" r="28.346495" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(342.67462 857.7816)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">B</tspan></text></g><line x1="403.28772" y1="989.078" x2="403.2876" y2="1023.17505" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><line x1="718.2204" y1="930.3955" x2="718.53784" y2="874.86414" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><path d="M 789.4242 1048.76624 C 794.95923 1054.3013 794.95923 1063.27515 789.4242 1068.8102 C 783.8892 1074.3452 774.9152 1074.3452 769.38025 1068.8102 C 763.8452 1063.27515 763.8452 1054.3013 769.38025 1048.76624 C 774.9152 1043.2312 783.8892 1043.2312 789.4242 1048.76624" fill="black"/><path d="M 789.4242 1048.76624 C 794.95923 1054.3013 794.95923 1063.27515 789.4242 1068.8102 C 783.8892 1074.3452 774.9152 1074.3452 769.38025 1068.8102 C 763.8452 1063.27515 763.8452 1054.3013 769.38025 1048.76624 C 774.9152 1043.2312 783.8892 1043.2312 789.4242 1048.76624" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><path d="M 789.4242 1094.7661 C 794.95923 1100.30115 794.95923 1109.275 789.4242 1114.81006 C 783.8892 1120.3451 774.9152 1120.3451 769.38025 1114.81006 C 763.8452 1109.275 763.8452 1100.30115 769.38025 1094.7661 C 774.9152 1089.2311 783.8892 1089.2311 789.4242 1094.7661" fill="black"/><path d="M 789.4242 1094.7661 C 794.95923 1100.30115 794.95923 1109.275 789.4242 1114.81006 C 783.8892 1120.3451 774.9152 1120.3451 769.38025 1114.81006 C 763.8452 1109.275 763.8452 1100.30115 769.38025 1094.7661 C 774.9152 1089.2311 783.8892 1089.2311 789.4242 1094.7661" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="779.4223" y1="1073.4614" x2="779.44507" y2="1090.1149" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id689_Graphic"><circle cx="718.0555" cy="959.24146" r="28.34648" fill="red" fill-opacity=".5"/><path d="M 738.09943 939.19757 C 749.16943 950.2675 749.16943 968.2155 738.09943 979.28546 C 727.0295 990.35547 709.0815 990.35547 698.01154 979.28546 C 686.94153 968.2155 686.94153 950.2675 698.01154 939.19757 C 709.0815 928.12756 727.0295 928.12756 738.09943 939.19757" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(700.37836 943.7415)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="733.1928" y1="983.8047" x2="771.7024" y2="1046.2938" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><line x1="800.166" y1="959.2338" x2="756.80194" y2="959.2374" marker-end="url(#FilledDiamond_Marker)" stroke="blue" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" stroke-dasharray="1,3"/><g id="id692_Graphic"><circle cx="829.01245" cy="959.23145" r="28.34648" fill="red"/><circle cx="829.01245" cy="959.23145" r="28.34648" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(811.33533 943.73145)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="6.5243282" y="25" textLength="22.305664">A'</tspan></text></g><line x1="816.1477" y1="985.059" x2="785.96265" y2="1045.65894" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><text transform="translate(687.9198 889.0216)" fill="blue"><tspan font-family="Helvetica" font-size="17" font-weight="bold" fill="blue" x=".13012695" y="16" textLength="72.739746">Obsolete</tspan></text><g id="id702_Graphic"><path d="M 678.60693 819.58557 C 693.37787 801.90887 728.45825 796.0167 750.6144 809.16083 C 772.7699 822.3045 765.3855 882.13373 753.38397 883.94666 C 741.3828 885.75934 708.149 892.5584 690.6084 886.66614 C 673.06793 880.7739 663.8366 837.26196 678.60693 819.58557 Z" fill="#ff8000" fill-opacity=".15000001"/><path d="M 678.60693 819.58557 C 693.37787 801.90887 728.45825 796.0167 750.6144 809.16083 C 772.7699 822.3045 765.3855 882.13373 753.38397 883.94666 C 741.3828 885.75934 708.149 892.5584 690.6084 886.66614 C 673.06793 880.7739 663.8366 837.26196 678.60693 819.58557 Z" stroke="#ff8000" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" stroke-dasharray="4,9,1,5"/></g><text transform="translate(674.40198 774.87)" fill="#ff8000"><tspan font-family="Helvetica" font-size="17" font-weight="bold" fill="#ff8000" x=".103271484" y="16" textLength="71.793457">Unstable</tspan></text><g id="id714_Graphic"><path d="M 679.4558 933.30554 C 694.08136 915.6288 728.81653 909.73657 750.75464 922.88074 C 772.6921 936.0244 765.38037 995.85364 753.49695 997.66656 C 741.6139 999.47925 708.7071 1006.2783 691.33917 1000.3861 C 673.9713 994.49384 664.8308 950.9819 679.4558 933.30554 Z" fill="blue" fill-opacity=".15000001"/><path d="M 679.4558 933.30554 C 694.08136 915.6288 728.81653 909.73657 750.75464 922.88074 C 772.6921 936.0244 765.38037 995.85364 753.49695 997.66656 C 741.6139 999.47925 708.7071 1006.2783 691.33917 1000.3861 C 673.9713 994.49384 664.8308 950.9819 679.4558 933.30554 Z" stroke="blue" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" stroke-dasharray="4,9,1,5"/></g><g id="id688_Graphic"><circle cx="718.0555" cy="845.52167" r="28.34648" fill="yellow"/><path d="M 738.09943 825.47766 C 749.16943 836.5476 749.16943 854.4956 738.09943 865.56555 C 727.0295 876.63556 709.0815 876.63556 698.01154 865.56555 C 686.94153 854.4956 686.94153 836.5476 698.01154 825.47766 C 709.0815 814.40765 727.0295 814.40765 738.09943 825.47766" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" stroke-dasharray="16,9"/><text transform="translate(700.37836 830.0216)" fill="red"><tspan font-family="Helvetica" font-size="26" font-weight="500" fill="red" x="9.006262" y="25" textLength="17.341797">B</tspan></text></g></g></g></svg>
deleted file mode 100644
--- a/docs/figures/example-1-update.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="47 621 426 249" width="426pt" height="249pt"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2012-03-21 08:32Z</dc:date><!-- Produced by OmniGraffle Professional 5.3.6 --></metadata><defs><filter id="Shadow" filterUnits="userSpaceOnUse"><feGaussianBlur in="SourceAlpha" result="blur" stdDeviation="3.488"/><feOffset in="blur" result="offset" dx="0" dy="4"/><feFlood flood-color="black" flood-opacity=".75" result="flood"/><feComposite in="flood" in2="offset" operator="in"/></filter><font-face font-family="Helvetica" font-size="26" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.31641" slope="0" x-height="522.94922" cap-height="717.2852" ascent="770.0196" descent="-229.98048" font-weight="500"><font-face-src><font-face-name name="Helvetica"/></font-face-src></font-face><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledDiamond_Marker" viewBox="-1 -3 6 6" markerWidth="6" markerHeight="6" color="red"><g><path d="M 3.7333333 0 L 1.8666667 -1.4 L 0 0 L 1.8666667 1.4 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/></g></marker></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><g><use xl:href="#id464_Graphic" filter="url(#Shadow)"/><use xl:href="#id463_Graphic" filter="url(#Shadow)"/><use xl:href="#id465_Graphic" filter="url(#Shadow)"/><use xl:href="#id466_Graphic" filter="url(#Shadow)"/><use xl:href="#id472_Graphic" filter="url(#Shadow)"/><use xl:href="#id471_Graphic" filter="url(#Shadow)"/><use xl:href="#id475_Graphic" filter="url(#Shadow)"/></g><g id="id464_Graphic"><rect x="67" y="637.9972" width="141" height="207.84595" fill="white" fill-opacity=".5"/><rect x="67" y="637.9972" width="141" height="207.84595" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id463_Graphic"><circle cx="128.71246" cy="718.34644" r="28.346489" fill="red"/><circle cx="128.71246" cy="718.34644" r="28.346489" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(111.035286 702.84644)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="128.93794" y1="770.9975" x2="128.83687" y2="747.19263" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><circle cx="129.000244" cy="785.6706" r="14.173275" fill="black"/><circle cx="129.000244" cy="785.6706" r="14.173275" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><circle cx="129.000244" cy="831.6706" r="14.173275" fill="black"/><circle cx="129.000244" cy="831.6706" r="14.173275" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="128.96199" y1="800.3438" x2="128.91855" y2="816.99756" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id465_Graphic"><rect x="277" y="637.99725" width="176" height="207.84595" fill="white" fill-opacity=".5"/><rect x="277" y="637.99725" width="176" height="207.84595" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id466_Graphic"><circle cx="407.34644" cy="703.95215" r="28.346495" fill="red"/><circle cx="407.34644" cy="703.95215" r="28.346495" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(389.66928 688.45215)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="6.1180782" y="25" textLength="23.118164">A’</tspan></text></g><line x1="378.9428" y1="772.1349" x2="396.34451" y2="730.6261" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id472_Graphic"><circle cx="373.26825" cy="785.67053" r="14.173267" fill="black"/><circle cx="373.26825" cy="785.67053" r="14.173267" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id471_Graphic"><circle cx="373.26825" cy="831.67053" r="14.173267" fill="black"/><circle cx="373.26825" cy="831.67053" r="14.173267" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="373.26837" y1="800.34375" x2="373.26852" y2="816.9973" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="365.1879" y1="773.41925" x2="335.23688" y2="728.00824" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id475_Graphic"><circle cx="319.30762" cy="703.95215" r="28.346495" fill="red" fill-opacity=".5"/><path d="M 339.35156 683.9082 C 350.4216 694.97815 350.4216 712.92615 339.35156 723.9961 C 328.28159 735.0661 310.33365 735.0661 299.26367 723.9961 C 288.19363 712.92615 288.19363 694.97815 299.26367 683.9082 C 310.33365 672.8382 328.28159 672.8382 339.35156 683.9082" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(301.63046 688.45215)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="378.49997" y1="703.95215" x2="362.1041" y2="703.95215" marker-end="url(#FilledDiamond_Marker)" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke-dasharray="1,4"/></g></g></svg>
deleted file mode 100644
--- a/docs/figures/example-2-split.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="27 1004 488 344" width="488pt" height="344pt"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2012-03-21 08:32Z</dc:date><!-- Produced by OmniGraffle Professional 5.3.6 --></metadata><defs><filter id="Shadow" filterUnits="userSpaceOnUse"><feGaussianBlur in="SourceAlpha" result="blur" stdDeviation="3.488"/><feOffset in="blur" result="offset" dx="0" dy="4"/><feFlood flood-color="black" flood-opacity=".75" result="flood"/><feComposite in="flood" in2="offset" operator="in"/></filter><font-face font-family="Helvetica" font-size="26" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.31641" slope="0" x-height="522.94922" cap-height="717.2852" ascent="770.0196" descent="-229.98048" font-weight="500"><font-face-src><font-face-name name="Helvetica"/></font-face-src></font-face><font-face font-family="Helvetica" font-size="15" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.316406" slope="0" x-height="522.94922" cap-height="717.28516" ascent="770.01953" descent="-229.98045" font-weight="500"><font-face-src><font-face-name name="Helvetica"/></font-face-src></font-face><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledDiamond_Marker" viewBox="-1 -3 6 6" markerWidth="6" markerHeight="6" color="red"><g><path d="M 3.7333333 0 L 1.8666667 -1.4 L 0 0 L 1.8666667 1.4 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/></g></marker></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><g><use xl:href="#id478_Graphic" filter="url(#Shadow)"/><use xl:href="#id479_Graphic" filter="url(#Shadow)"/><use xl:href="#id481_Graphic" filter="url(#Shadow)"/><use xl:href="#id482_Graphic" filter="url(#Shadow)"/><use xl:href="#id485_Graphic" filter="url(#Shadow)"/><use xl:href="#id488_Graphic" filter="url(#Shadow)"/><use xl:href="#id489_Graphic" filter="url(#Shadow)"/><use xl:href="#id491_Graphic" filter="url(#Shadow)"/><use xl:href="#id492_Graphic" filter="url(#Shadow)"/><use xl:href="#id495_Graphic" filter="url(#Shadow)"/></g><g id="id478_Graphic"><rect x="47" y="1087.16406" width="143" height="202.84595" fill="white" fill-opacity=".5"/><rect x="47" y="1087.16406" width="143" height="202.84595" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id479_Graphic"><circle cx="118.50046" cy="1155.5105" r="28.346527" fill="#ff8000"/><circle cx="118.50046" cy="1155.5105" r="28.346527" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(100.823296 1140.0105)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="118.50029" y1="1215.66406" x2="118.50038" y2="1184.3569" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id481_Graphic"><path d="M 128.52223 1220.3153 C 134.05725 1225.85034 134.05725 1234.8242 128.52223 1240.35925 C 122.98724 1245.8943 114.013245 1245.8943 108.478256 1240.35925 C 102.94323 1234.8242 102.94323 1225.85034 108.478256 1220.3153 C 114.013245 1214.7803 122.98724 1214.7803 128.52223 1220.3153" fill="black"/><path d="M 128.52223 1220.3153 C 134.05725 1225.85034 134.05725 1234.8242 128.52223 1240.35925 C 122.98724 1245.8943 114.013245 1245.8943 108.478256 1240.35925 C 102.94323 1234.8242 102.94323 1225.85034 108.478256 1220.3153 C 114.013245 1214.7803 122.98724 1214.7803 128.52223 1220.3153" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id482_Graphic"><path d="M 128.52223 1265.8153 C 134.05725 1271.35034 134.05725 1280.3242 128.52223 1285.85925 C 122.98724 1291.3943 114.013245 1291.3943 108.478256 1285.85925 C 102.94323 1280.3242 102.94323 1271.35034 108.478256 1265.8153 C 114.013245 1260.2803 122.98724 1260.2803 128.52223 1265.8153" fill="black"/><path d="M 128.52223 1265.8153 C 134.05725 1271.35034 134.05725 1280.3242 128.52223 1285.85925 C 122.98724 1291.3943 114.013245 1291.3943 108.478256 1285.85925 C 102.94323 1280.3242 102.94323 1271.35034 108.478256 1265.8153 C 114.013245 1260.2803 122.98724 1260.2803 128.52223 1265.8153" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="118.500244" y1="1245.0105" x2="118.500244" y2="1261.1641" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id485_Graphic"><rect x="277" y="1020" width="218" height="303.08691" fill="white" fill-opacity=".5"/><rect x="277" y="1020" width="218" height="303.08691" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="384.58325" y1="1251.5149" x2="356.10718" y2="1212.0704" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id488_Graphic"><path d="M 403.19525 1253.3916 C 408.73026 1258.9266 408.73026 1267.9005 403.19525 1273.43555 C 397.66025 1278.9706 388.68625 1278.9706 383.15125 1273.43555 C 377.61624 1267.9005 377.61624 1258.9266 383.15125 1253.3916 C 388.68625 1247.8566 397.66025 1247.8566 403.19525 1253.3916" fill="black"/><path d="M 403.19525 1253.3916 C 408.73026 1258.9266 408.73026 1267.9005 403.19525 1273.43555 C 397.66025 1278.9706 388.68625 1278.9706 383.15125 1273.43555 C 377.61624 1267.9005 377.61624 1258.9266 383.15125 1253.3916 C 388.68625 1247.8566 397.66025 1247.8566 403.19525 1253.3916" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id489_Graphic"><path d="M 403.19525 1298.8916 C 408.73026 1304.4266 408.73026 1313.4005 403.19525 1318.93555 C 397.66025 1324.4706 388.68625 1324.4706 383.15125 1318.93555 C 377.61624 1313.4005 377.61624 1304.4266 383.15125 1298.8916 C 388.68625 1293.3566 397.66025 1293.3566 403.19525 1298.8916" fill="black"/><path d="M 403.19525 1298.8916 C 408.73026 1304.4266 408.73026 1313.4005 403.19525 1318.93555 C 397.66025 1324.4706 388.68625 1324.4706 383.15125 1318.93555 C 377.61624 1313.4005 377.61624 1304.4266 383.15125 1298.8916 C 388.68625 1293.3566 397.66025 1293.3566 403.19525 1298.8916" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="393.17325" y1="1278.0868" x2="393.17325" y2="1294.24036" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id491_Graphic"><circle cx="437.34644" cy="1188.5874" r="28.346533" fill="red"/><circle cx="437.34644" cy="1188.5874" r="28.346533" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(419.66928 1171.0874)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="4.8351192" y="25" textLength="17.341797">A</tspan><tspan font-family="Helvetica" font-size="15" font-weight="500" x="22.176916" y="32" textLength="8.342285">1</tspan></text></g><g id="id492_Graphic"><circle cx="437.34644" cy="1105.34644" r="28.346533" fill="yellow"/><circle cx="437.34644" cy="1105.34644" r="28.346533" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(419.66928 1087.84644)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="4.8351192" y="25" textLength="17.341797">A</tspan><tspan font-family="Helvetica" font-size="15" font-weight="500" x="22.176916" y="32" textLength="8.342285">2</tspan></text></g><line x1="400.63443" y1="1250.7749" x2="422.67834" y2="1213.4341" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><line x1="437.3464" y1="1159.741" x2="437.3464" y2="1134.1929" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id495_Graphic"><circle cx="339.34644" cy="1188.5874" r="28.346533" fill="#ff8000"/><path d="M 359.39038 1168.54346 C 370.46042 1179.6134 370.46042 1197.5614 359.39038 1208.63135 C 348.3204 1219.7014 330.37247 1219.7014 319.30249 1208.63135 C 308.23245 1197.5614 308.23245 1179.6134 319.30249 1168.54346 C 330.37247 1157.4734 348.3204 1157.4734 359.39038 1168.54346" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(321.66928 1173.0874)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="393.50046" y1="1152" x2="374.81244" y2="1164.626" marker-end="url(#FilledDiamond_Marker)" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke-dasharray="1,4"/><line x1="417.8144" y1="1126.5746" x2="393.50046" y2="1153" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke-dasharray="1,4"/><line x1="416.74606" y1="1168.3948" x2="399" y2="1151" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke-dasharray="1,4"/></g></g></svg>
new file mode 100644
--- /dev/null
+++ b/docs/figures/figure-ug01.svg
@@ -0,0 +1,400 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="200"
+   height="150"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="figure-ug01.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mstart"
+       style="overflow:visible">
+      <path
+         id="path3998"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,4,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3976">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3978" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3980" />
+    </linearGradient>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible">
+      <path
+         id="path5316"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path5292"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path5289"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.8,0,0,0.8,10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5253">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5255" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop5257" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5245"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5247" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5207"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5209" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5253"
+       id="linearGradient5259"
+       x1="384.79102"
+       y1="262.99402"
+       x2="391.83789"
+       y2="262.99402"
+       gradientUnits="userSpaceOnUse" />
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-6"
+       style="overflow:visible">
+      <path
+         id="path5316-5"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3976"
+       id="linearGradient3986"
+       x1="21.490866"
+       y1="78.901947"
+       x2="53.729759"
+       y2="78.901947"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(1.9995778e-6,24.148893)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="73.6273"
+     inkscape:cy="87.13832"
+     inkscape:document-units="px"
+     inkscape:current-layer="svg2"
+     showgrid="false"
+     inkscape:window-width="976"
+     inkscape:window-height="802"
+     inkscape:window-x="18"
+     inkscape:window-y="350"
+     inkscape:window-maximized="0"
+     showguides="false"
+     inkscape:snap-global="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid8451"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       originx="0.078084198px"
+       originy="-2924.5747px" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0.0780842,2022.2125)" />
+  <g
+     id="g6159"
+     transform="matrix(0.9999958,0,0,1,-382.57893,-238.18697)">
+    <rect
+       y="238.83586"
+       x="383.08054"
+       height="18.05327"
+       width="21.481829"
+       id="rect2987"
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text5217"
+       y="252.23067"
+       x="390.00699"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         style="stroke:none"
+         y="252.23067"
+         x="390.00699"
+         id="tspan5219"
+         sodipodi:role="line">0</tspan></text>
+  </g>
+  <g
+     id="g3802"
+     transform="translate(10.633744,0.14889301)">
+    <rect
+       y="0.50000465"
+       x="49.866257"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4"
+       style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       transform="scale(0.9999979,1.0000021)"
+       sodipodi:linespacing="125%"
+       id="text5217-8"
+       y="13.894781"
+       x="56.792801"
+       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         id="tspan6156"
+         sodipodi:role="line"
+         x="56.792801"
+         y="13.894781">1</tspan></text>
+  </g>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:0.99999791px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend);display:inline"
+     d="m 21.981735,9.6755275 38.518266,4.2e-6"
+     id="path8263"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-start="#g6159"
+     inkscape:connection-end="#g3802"
+     inkscape:connection-end-point="d4" />
+  <text
+     xml:space="preserve"
+     style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+     x="46.543751"
+     y="42.826393"
+     id="text5217-8-0"
+     sodipodi:linespacing="125%"
+     transform="scale(0.9999979,1.0000021)"><tspan
+       sodipodi:role="line"
+       id="tspan8594"
+       x="46.543751"
+       y="42.826393">hg commit --amend</tspan></text>
+  <path
+     style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+     d="m 36.655932,74.035228 3.649333,6.320665 3.711171,-6.427764"
+     id="path8598"
+     inkscape:connector-curvature="0" />
+  <g
+     id="g3821"
+     transform="matrix(1,0,0,1.5998137,5.836184,-16.712267)">
+    <path
+       inkscape:connector-curvature="0"
+       id="path8466-5"
+       d="M 35.5,23.60911 35.5,59.5"
+       style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path8466-4-7"
+       d="M 33.5,23.60911 33.5,59.5"
+       style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+  </g>
+  <g
+     id="g6159-9"
+     transform="matrix(0.9999958,0,0,1,-382.5698,-144.46361)">
+    <rect
+       y="238.83586"
+       x="383.08054"
+       height="18.05327"
+       width="21.481829"
+       id="rect2987-41"
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text5217-7"
+       y="252.23067"
+       x="390.00699"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         style="stroke:none"
+         y="252.23067"
+         x="390.00699"
+         id="tspan5219-3"
+         sodipodi:role="line">0</tspan></text>
+  </g>
+  <g
+     id="g3916"
+     transform="translate(9.5649648e-7,23.723361)">
+    <rect
+       y="107.72337"
+       x="60.5"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4-4"
+       style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       transform="scale(0.9999979,1.0000021)"
+       sodipodi:linespacing="125%"
+       id="text5217-8-7"
+       y="121.11791"
+       x="65.68634"
+       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         y="121.11791"
+         x="65.68634"
+         id="tspan3914"
+         sodipodi:role="line">1'</tspan></text>
+  </g>
+  <g
+     id="g3969"
+     transform="translate(4.0851082,20.999957)">
+    <path
+       transform="matrix(2.0019166,-0.33373336,0.24981576,1.1431983,-230.26746,31.077255)"
+       inkscape:transform-center-y="-0.9468898"
+       inkscape:transform-center-x="-0.82266973"
+       d="m 157.12291,94.440838 c -1.18183,1.454597 -8.91272,-1.300343 -10.79635,-1.00274 -1.88363,0.297602 -2.27986,5.900632 -3.98505,5.130533 -1.7052,-0.7701 -3.74374,-5.759198 -4.73141,-7.362338 -0.98766,-1.603141 -6.98979,-4.377117 -7.06039,-6.057672 -0.0706,-1.680555 6.93719,-0.349919 7.75648,-1.903786 0.81928,-1.553866 0.0513,-8.775377 1.58159,-9.477758 1.53031,-0.70238 3.98957,4.754872 5.63472,5.323605 1.64516,0.568733 10.20851,-0.835155 11.23768,0.484831 1.02916,1.319987 -4.3673,5.790377 -4.35486,7.530709 0.0124,1.740332 5.89943,5.880018 4.71759,7.334616 z"
+       inkscape:randomized="0.15"
+       inkscape:rounded="0.2"
+       inkscape:flatsided="false"
+       sodipodi:arg2="1.268675"
+       sodipodi:arg1="0.64035647"
+       sodipodi:r2="6.7602978"
+       sodipodi:r1="13.520596"
+       sodipodi:cy="85.499779"
+       sodipodi:cx="144.7717"
+       sodipodi:sides="5"
+       id="path3943"
+       style="fill:none;stroke:#686868;stroke-width:0.68990517;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       sodipodi:type="star" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text3957"
+       y="84.170212"
+       x="69.021271"
+       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       xml:space="preserve"><tspan
+         y="84.170212"
+         x="69.021271"
+         id="tspan3959"
+         sodipodi:role="line">poof!</tspan></text>
+  </g>
+  <path
+     style="fill:none;stroke:url(#linearGradient3986);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2, 1;stroke-dashoffset:0;marker-mid:none;marker-end:none"
+     d="m 21.990865,103.39791 57.925771,-0.005"
+     id="path3974"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-end-point="d4"
+     inkscape:connection-end="#g3969"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-start="#g6159-9" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-6)"
+     d="m 21.990865,110.03677 38.509136,23.79872"
+     id="path5012"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g6159-9"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g3916"
+     inkscape:connection-end-point="d4" />
+  <text
+     xml:space="preserve"
+     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     x="46.760448"
+     y="58.872295"
+     id="text5223"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan5227"
+       x="46.760448"
+       y="58.872295">(destructive, not using evolve)</tspan></text>
+</svg>
new file mode 100644
--- /dev/null
+++ b/docs/figures/figure-ug02.svg
@@ -0,0 +1,590 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="250"
+   height="250"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="figure-ug02.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM"
+       style="overflow:visible">
+      <path
+         id="path4193"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotS"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotS"
+       style="overflow:visible">
+      <path
+         id="path4196"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mstart"
+       style="overflow:visible">
+      <path
+         id="path3998"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,4,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible">
+      <path
+         id="path5316"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path5292"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path5289"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.8,0,0,0.8,10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5253">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5255" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop5257" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5245"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5247" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5207"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5209" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5253"
+       id="linearGradient5259"
+       x1="384.79102"
+       y1="262.99402"
+       x2="391.83789"
+       y2="262.99402"
+       gradientUnits="userSpaceOnUse" />
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-6"
+       style="overflow:visible">
+      <path
+         id="path5316-5"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-9"
+       style="overflow:visible">
+      <path
+         id="path5316-4"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-1"
+       style="overflow:visible">
+      <path
+         id="path5316-9"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible">
+      <path
+         id="path5316-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.7318511"
+     inkscape:cx="113.8845"
+     inkscape:cy="138.3052"
+     inkscape:document-units="px"
+     inkscape:current-layer="svg2"
+     showgrid="false"
+     inkscape:window-width="974"
+     inkscape:window-height="1048"
+     inkscape:window-x="104"
+     inkscape:window-y="103"
+     inkscape:window-maximized="0"
+     showguides="false"
+     inkscape:snap-global="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid8451"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       originx="0.078088198px"
+       originy="-2937.8154px" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0.0780882,2135.4532)" />
+  <g
+     id="g6159"
+     transform="matrix(0.9999958,0,0,1,-382.57893,-236.94626)">
+    <rect
+       y="238.83586"
+       x="383.08054"
+       height="18.05327"
+       width="21.481829"
+       id="rect2987"
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text5217"
+       y="252.23067"
+       x="390.00699"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         style="stroke:none"
+         y="252.23067"
+         x="390.00699"
+         id="tspan5219"
+         sodipodi:role="line">0</tspan></text>
+  </g>
+  <g
+     id="g3802"
+     transform="translate(10.633748,1.389597)">
+    <rect
+       y="0.50000465"
+       x="49.866257"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4"
+       style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       transform="scale(0.9999979,1.0000021)"
+       sodipodi:linespacing="125%"
+       id="text5217-8"
+       y="13.894781"
+       x="56.792801"
+       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         id="tspan6156"
+         sodipodi:role="line"
+         x="56.792801"
+         y="13.894781">1</tspan></text>
+  </g>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:0.99999791px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend);display:inline"
+     d="m 21.981735,10.916236 38.51827,1e-6"
+     id="path8263"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-start="#g6159"
+     inkscape:connection-end="#g3802"
+     inkscape:connection-end-point="d4" />
+  <g
+     id="g6159-9"
+     transform="matrix(1.0000075,0,0,1,-382.57429,-102.14843)">
+    <rect
+       y="238.83586"
+       x="383.08054"
+       height="18.05327"
+       width="21.481829"
+       id="rect2987-41"
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text5217-7"
+       y="252.23067"
+       x="390.00699"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         style="stroke:none"
+         y="252.23067"
+         x="390.00699"
+         id="tspan5219-3"
+         sodipodi:role="line">0</tspan></text>
+  </g>
+  <g
+     id="g4101"
+     transform="translate(3.9991556e-6,76)">
+    <rect
+       y="131.44673"
+       x="60.5"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4-4"
+       style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       transform="scale(0.9999979,1.0000021)"
+       sodipodi:linespacing="125%"
+       id="text5217-8-7"
+       y="144.84122"
+       x="67.447083"
+       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         y="144.84122"
+         x="67.447083"
+         id="tspan3914"
+         sodipodi:role="line">3</tspan></text>
+  </g>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-6);display:inline"
+     d="m 18.903026,154.7407 44.684935,52.70603"
+     id="path5012"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g6159-9"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g4101"
+     inkscape:connection-end-point="d4" />
+  <g
+     id="g6499"
+     transform="translate(1.9995778e-6,23.240701)">
+    <text
+       transform="scale(0.9999979,1.0000021)"
+       sodipodi:linespacing="125%"
+       id="text5217-8-0"
+       y="42.826412"
+       x="46.543755"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+       xml:space="preserve"><tspan
+         y="42.826412"
+         x="46.543755"
+         id="tspan8594"
+         sodipodi:role="line">hg commit --amend</tspan></text>
+    <text
+       sodipodi:linespacing="125%"
+       id="text5223"
+       y="54.872299"
+       x="46.760452"
+       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       xml:space="preserve"><tspan
+         y="54.872299"
+         x="46.760452"
+         id="tspan5227"
+         sodipodi:role="line">(safe, using evolve)</tspan></text>
+  </g>
+  <g
+     id="g4022"
+     transform="translate(3.9991556e-6,42.31518)">
+    <rect
+       y="94.372253"
+       x="60.5"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4-0"
+       style="fill:none;stroke:#404040;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0" />
+    <text
+       transform="scale(0.9999979,1.0000021)"
+       sodipodi:linespacing="125%"
+       id="text5217-8-9"
+       y="107.76683"
+       x="67.426567"
+       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         id="tspan6156-7"
+         sodipodi:role="line"
+         x="67.426567"
+         y="107.76683">1</tspan></text>
+  </g>
+  <path
+     style="fill:none;stroke:#404040;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.94117647;stroke-dasharray:none;marker-end:url(#Arrow2Mend);display:inline"
+     d="m 21.991109,145.71407 38.508895,0"
+     id="path8263-2"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g6159-9"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g4022"
+     inkscape:connection-end-point="d4" />
+  <text
+     xml:space="preserve"
+     style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+     x="122.10091"
+     y="140.49216"
+     id="text4115"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4117"
+       x="122.10091"
+       y="140.49216" /></text>
+  <g
+     id="g5472"
+     transform="translate(1.9995778e-6,1.240699)">
+    <rect
+       y="135.44673"
+       x="120.5"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4-0-0"
+       style="fill:none;stroke:#404040;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0" />
+    <text
+       inkscape:transform-center-x="2.6044813"
+       transform="scale(0.9999979,1.0000021)"
+       sodipodi:linespacing="125%"
+       id="text5217-8-9-2"
+       y="148.84123"
+       x="127.4267"
+       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         id="tspan6156-7-4"
+         sodipodi:role="line"
+         x="127.4267"
+         y="148.84123">2</tspan></text>
+  </g>
+  <text
+     xml:space="preserve"
+     style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+     x="140.76923"
+     y="136.65099"
+     id="text4119"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4121"
+       x="140.76923"
+       y="136.65099"
+       style="font-size:8px;font-weight:bold;-inkscape-font-specification:Sans Bold">T</tspan></text>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#DotM)"
+     d="m 71.240874,154.7407 0,52.70603"
+     id="path4123"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g4022"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g4101"
+     inkscape:connection-end-point="d4" />
+  <text
+     xml:space="preserve"
+     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     x="175.07857"
+     y="112.16577"
+     id="text4787"
+     sodipodi:linespacing="100%"><tspan
+       sodipodi:role="line"
+       x="175.07857"
+       y="112.16577"
+       id="tspan4791">temporary</tspan><tspan
+       sodipodi:role="line"
+       x="175.07857"
+       y="122.16577"
+       id="tspan4795">amend</tspan><tspan
+       sodipodi:role="line"
+       x="175.07857"
+       y="132.16577"
+       id="tspan4797">commit</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     x="51.716301"
+     y="112.74194"
+     id="text4799"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4801"
+       x="51.716301"
+       y="112.74194">obsolete (and hidden)</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     x="94.602974"
+     y="171.26965"
+     id="text4803"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4805"
+       x="94.602974"
+       y="171.26965">precursor</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     x="94.461372"
+     y="189.68568"
+     id="text4807"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4809"
+       x="94.461372"
+       y="189.68568">successor</tspan></text>
+  <path
+     style="fill:none;stroke:#7d7d7d;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
+     d="M 92.837054,168.99918 C 80.990247,168.9329 79.499863,165.60079 77.196029,156.38545"
+     id="path5061"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:none;stroke:#7d7d7d;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
+     d="M 93.341603,186.6584 C 79.50523,184.42591 75.177832,194.04021 75.177832,205.32672"
+     id="path5263"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
+     d="m 173.06037,115.51697 c -10.90807,9.681 -3.90454,20.30854 -25.22746,18.66832"
+     id="path5689"
+     inkscape:connector-curvature="0" />
+  <path
+     style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#Arrow2Mend-2);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+     d="m 97.377997,116.02152 c 1.765752,12.09244 -25.911587,2.23195 -29.768403,17.65922"
+     id="path5893"
+     inkscape:connector-curvature="0" />
+  <path
+     style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#Arrow2Mend-2);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+     d="m 99.093394,115.78744 c -1.76575,12.09244 25.911586,2.23195 29.768406,17.65922"
+     id="path5893-7"
+     inkscape:connector-curvature="0" />
+  <g
+     id="g6493"
+     transform="translate(1.9995778e-6,1.240701)">
+    <path
+       inkscape:connector-curvature="0"
+       id="path8598"
+       d="m 36.655934,114.93533 3.649333,6.32067 3.711171,-6.42777"
+       style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+    <g
+       transform="translate(0.73014858,0)"
+       id="g6489">
+      <path
+         style="fill:none;stroke:#808080;stroke-width:1.21219063;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 40.606,21.314861 0,98.078949"
+         id="path8466-5"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#808080;stroke-width:1.10104096;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 38.5505,21.370511 0,98.078949"
+         id="path8466-5-3"
+         inkscape:connector-curvature="0" />
+    </g>
+  </g>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker-end:url(#Arrow2Mend-2)"
+     d="m 81.981743,145.71407 38.518257,0"
+     id="path3069"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g4022"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g5472"
+     inkscape:connection-end-point="d4" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/docs/figures/figure-ug03.svg
@@ -0,0 +1,402 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="200"
+   height="150"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="figure-ug03.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mstart"
+       style="overflow:visible">
+      <path
+         id="path3998"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,4,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible">
+      <path
+         id="path5316"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path5292"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path5289"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.8,0,0,0.8,10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5253">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5255" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop5257" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5245"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5247" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5207"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5209" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5253"
+       id="linearGradient5259"
+       x1="384.79102"
+       y1="262.99402"
+       x2="391.83789"
+       y2="262.99402"
+       gradientUnits="userSpaceOnUse" />
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-6"
+       style="overflow:visible">
+      <path
+         id="path5316-5"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-7"
+       style="overflow:visible">
+      <path
+         id="path5316-3"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.4712371"
+     inkscape:cx="72.857038"
+     inkscape:cy="79.643357"
+     inkscape:document-units="px"
+     inkscape:current-layer="svg2"
+     showgrid="false"
+     inkscape:window-width="976"
+     inkscape:window-height="802"
+     inkscape:window-x="179"
+     inkscape:window-y="330"
+     inkscape:window-maximized="0"
+     showguides="false"
+     inkscape:snap-global="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid8451"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       originx="0.078084198px"
+       originy="-2924.5747px" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0.0780842,2022.2125)" />
+  <g
+     id="g6622"
+     transform="translate(0,18)">
+    <g
+       id="g6602">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="rect2987"
+         width="21.481739"
+         height="18.05327"
+         x="0.49999696"
+         y="0.64889121" />
+      <text
+         xml:space="preserve"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         x="7.4264359"
+         y="14.043668"
+         id="text5217"
+         sodipodi:linespacing="125%"
+         transform="scale(0.9999979,1.0000021)"><tspan
+           sodipodi:role="line"
+           id="tspan5219"
+           x="7.4264359"
+           y="14.043668"
+           style="stroke:none">3</tspan></text>
+    </g>
+    <g
+       id="g6612">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="rect2987-4"
+         width="21.481739"
+         height="18.05327"
+         x="60.5"
+         y="0.64889765" />
+      <text
+         xml:space="preserve"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         x="67.426567"
+         y="14.043674"
+         id="text5217-8"
+         sodipodi:linespacing="125%"
+         transform="scale(0.9999979,1.0000021)"><tspan
+           y="14.043674"
+           x="67.426567"
+           sodipodi:role="line"
+           id="tspan3900">4</tspan></text>
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       inkscape:connector-type="polyline"
+       id="path8263"
+       d="m 21.981735,9.6755275 38.518266,4.2e-6"
+       style="fill:none;stroke:#000000;stroke-width:0.99999791px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend);display:inline" />
+  </g>
+  <g
+     id="g6397"
+     transform="translate(1.2139669,17.353636)">
+    <text
+       transform="scale(0.9999979,1.0000021)"
+       sodipodi:linespacing="125%"
+       id="text5217-8-0"
+       y="53.910118"
+       x="46.543751"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+       xml:space="preserve"><tspan
+         y="53.910118"
+         x="46.543751"
+         id="tspan8594"
+         sodipodi:role="line">hg prune .</tspan></text>
+    <g
+       id="g6372">
+      <path
+         style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 36.655932,74.035228 3.649333,6.320665 3.711171,-6.427764"
+         id="path8598"
+         inkscape:connector-curvature="0" />
+      <g
+         id="g3821"
+         transform="matrix(1,0,0,1.5998137,5.836184,-16.712267)">
+        <path
+           inkscape:connector-curvature="0"
+           id="path8466-5"
+           d="M 35.5,23.60911 35.5,59.5"
+           style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path8466-4-7"
+           d="M 33.5,23.60911 33.5,59.5"
+           style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      </g>
+    </g>
+  </g>
+  <g
+     id="g6607">
+    <rect
+       y="101.77834"
+       x="0.49999696"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-7"
+       style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       transform="scale(0.9999979,1.0000021)"
+       sodipodi:linespacing="125%"
+       id="text5217-9"
+       y="115.1729"
+       x="7.4264359"
+       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         id="tspan3904"
+         style="stroke:none"
+         y="115.1729"
+         x="7.4264359"
+         sodipodi:role="line">3</tspan></text>
+  </g>
+  <g
+     id="g6617">
+    <rect
+       y="101.77834"
+       x="60.500004"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4-2"
+       style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999791,1.99999583;stroke-dashoffset:0" />
+    <text
+       transform="scale(0.9999979,1.0000021)"
+       sodipodi:linespacing="125%"
+       id="text5217-8-2"
+       y="115.1729"
+       x="67.426567"
+       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         id="tspan3908"
+         sodipodi:role="line"
+         x="67.426567"
+         y="115.1729">4</tspan></text>
+  </g>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:0.99999791px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend);display:inline"
+     d="m 21.981736,110.80498 38.518268,0"
+     id="path8263-2"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g6607"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g6617"
+     inkscape:connection-end-point="d4" />
+  <text
+     xml:space="preserve"
+     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     x="120.84515"
+     y="108.62753"
+     id="text4799"
+     sodipodi:linespacing="100%"><tspan
+       sodipodi:role="line"
+       id="tspan4801"
+       x="120.84515"
+       y="108.62753"
+       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans Italic">obsolete,</tspan><tspan
+       sodipodi:role="line"
+       x="120.84515"
+       y="118.62753"
+       id="tspan4155"
+       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans Italic">hidden,</tspan><tspan
+       sodipodi:role="line"
+       x="120.84515"
+       y="128.62753"
+       id="tspan4157"
+       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans Italic">no successors</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     x="87.810272"
+     y="8.7751856"
+     id="text4353"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4355"
+       x="87.810272"
+       y="8.7751856">working dir</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     x="20.528839"
+     y="144.07831"
+     id="text4353-8"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4355-6"
+       x="20.528839"
+       y="144.07831">working dir</tspan></text>
+  <path
+     style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#Arrow2Mend-7)"
+     d="m 20.030453,140.89525 c -8.427525,-2.11036 -7.688456,-10.62543 -7.688456,-18.00718"
+     id="path5792"
+     inkscape:connector-curvature="0" />
+  <path
+     style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-mid:none;marker-end:url(#Arrow2Mend-7)"
+     d="M 118.5641,115.19962 C 102.21283,112.97531 103.7629,98.729709 86.191648,105.48788"
+     id="path5986"
+     inkscape:connector-curvature="0" />
+  <path
+     style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#Arrow2Mend-7)"
+     d="M 85.382337,4.3239755 C 75.008244,4.2518573 73.079961,8.1306941 70.814734,16.058989"
+     id="path6831"
+     inkscape:connector-curvature="0" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/docs/figures/figure-ug04.svg
@@ -0,0 +1,547 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="240"
+   height="205"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="figure-ug04.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM"
+       style="overflow:visible">
+      <path
+         id="path4193"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotS"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotS"
+       style="overflow:visible">
+      <path
+         id="path4196"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mstart"
+       style="overflow:visible">
+      <path
+         id="path3998"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,4,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible">
+      <path
+         id="path5316"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path5292"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path5289"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.8,0,0,0.8,10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5253">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5255" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop5257" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5245"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5247" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5207"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5209" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5253"
+       id="linearGradient5259"
+       x1="384.79102"
+       y1="262.99402"
+       x2="391.83789"
+       y2="262.99402"
+       gradientUnits="userSpaceOnUse" />
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-6"
+       style="overflow:visible">
+      <path
+         id="path5316-5"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-9"
+       style="overflow:visible">
+      <path
+         id="path5316-4"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-1"
+       style="overflow:visible">
+      <path
+         id="path5316-9"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible">
+      <path
+         id="path5316-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.6388172"
+     inkscape:cx="115.17834"
+     inkscape:cy="50.304612"
+     inkscape:document-units="px"
+     inkscape:current-layer="svg2"
+     showgrid="false"
+     inkscape:window-width="974"
+     inkscape:window-height="1048"
+     inkscape:window-x="104"
+     inkscape:window-y="103"
+     inkscape:window-maximized="0"
+     showguides="false"
+     inkscape:snap-global="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid8451"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       originx="0.078090195px"
+       originy="-3032.6372px" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0.0780902,2185.275)" />
+  <g
+     id="g4373"
+     transform="translate(1.9967556e-6,-0.17817035)">
+    <rect
+       y="1.3195724"
+       x="0.4999969"
+       height="18.05327"
+       width="21.481733"
+       id="rect2987"
+       style="fill:none;stroke:#000000;stroke-width:0.99999779;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       transform="scale(0.9999978,1.0000022)"
+       sodipodi:linespacing="125%"
+       id="text5217"
+       y="14.714343"
+       x="7.426435"
+       style="font-size:11.9999733px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         style="stroke:none"
+         y="14.714343"
+         x="7.426435"
+         id="tspan5219"
+         sodipodi:role="line">3</tspan></text>
+  </g>
+  <g
+     id="g4378"
+     transform="translate(1.9967556e-6,-0.17817035)">
+    <rect
+       y="1.3195724"
+       x="60.499989"
+       height="18.05327"
+       width="21.481733"
+       id="rect2987-4"
+       style="fill:none;stroke:#000000;stroke-width:0.99999779;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       transform="scale(0.9999978,1.0000022)"
+       sodipodi:linespacing="125%"
+       id="text5217-8"
+       y="14.714343"
+       x="67.426567"
+       style="font-size:11.9999733px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         id="tspan6156"
+         sodipodi:role="line"
+         x="67.426567"
+         y="14.714343">5</tspan></text>
+  </g>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:0.99999779px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend);display:inline"
+     d="m 21.981731,10.168036 38.518259,10e-7"
+     id="path8263"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0" />
+  <g
+     id="g4383"
+     transform="translate(1.9967556e-6,-36.178171)">
+    <g
+       transform="matrix(1.0000072,0,0,1,-382.57418,-102.71846)"
+       id="g6159-9">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="rect2987-41"
+         width="21.481829"
+         height="18.05327"
+         x="383.08054"
+         y="238.83586" />
+      <text
+         xml:space="preserve"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         x="390.00699"
+         y="252.23067"
+         id="text5217-7"
+         sodipodi:linespacing="125%"><tspan
+           sodipodi:role="line"
+           id="tspan5219-3"
+           x="390.00699"
+           y="252.23067"
+           style="stroke:none">3</tspan></text>
+    </g>
+  </g>
+  <g
+     id="g4395"
+     transform="translate(1.9967556e-6,-36.178171)">
+    <g
+       transform="translate(4.0689943e-6,75.42997)"
+       id="g4101">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="rect2987-4-4"
+         width="21.481739"
+         height="18.05327"
+         x="60.5"
+         y="131.44673" />
+      <text
+         xml:space="preserve"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         x="67.447083"
+         y="144.84122"
+         id="text5217-8-7"
+         sodipodi:linespacing="125%"
+         transform="scale(0.9999979,1.0000021)"><tspan
+           sodipodi:role="line"
+           id="tspan3914"
+           x="67.447083"
+           y="144.84122">6</tspan></text>
+    </g>
+  </g>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-6);display:inline"
+     d="m 18.903021,117.9925 44.684942,52.70603"
+     id="path5012"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-end="#g4395"
+     inkscape:connection-end-point="d4"
+     inkscape:connection-start="#g4383"
+     inkscape:connection-start-point="d4" />
+  <g
+     id="g4389"
+     transform="translate(1.9967556e-6,-36.178171)">
+    <g
+       transform="translate(4.0689943e-6,41.74515)"
+       id="g4022">
+      <rect
+         style="fill:none;stroke:#404040;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0"
+         id="rect2987-4-0"
+         width="21.481739"
+         height="18.05327"
+         x="60.5"
+         y="94.372253" />
+      <text
+         xml:space="preserve"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         x="67.426567"
+         y="107.76683"
+         id="text5217-8-9"
+         sodipodi:linespacing="125%"
+         transform="scale(0.9999979,1.0000021)"><tspan
+           y="107.76683"
+           x="67.426567"
+           sodipodi:role="line"
+           id="tspan6156-7">5</tspan></text>
+    </g>
+  </g>
+  <path
+     style="fill:none;stroke:#404040;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.94117647;stroke-dasharray:none;marker-end:url(#Arrow2Mend);display:inline"
+     d="m 21.991099,108.96587 38.508907,0"
+     id="path8263-2"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0" />
+  <text
+     xml:space="preserve"
+     style="font-size:9.99999905px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+     x="122.10089"
+     y="139.74393"
+     id="text4115"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4117"
+       x="122.10089"
+       y="139.74393" /></text>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999986, 2.99999958;stroke-dashoffset:0;marker-start:url(#DotM)"
+     d="m 71.240876,117.9925 0,52.70603"
+     id="path4123"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0" />
+  <text
+     xml:space="preserve"
+     style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     x="131.67636"
+     y="97.973274"
+     id="text4799"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4801"
+       x="131.67636"
+       y="97.973274">obsolete, hidden</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     x="94.602959"
+     y="134.52141"
+     id="text4803"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4805"
+       x="94.602959"
+       y="134.52141">precursor</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     x="94.461357"
+     y="152.93744"
+     id="text4807"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4809"
+       x="94.461357"
+       y="152.93744">successor</tspan></text>
+  <path
+     style="fill:none;stroke:#7d7d7d;stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
+     d="M 92.83703,132.25098 C 80.990226,132.18468 79.499843,128.85259 77.19601,119.63725"
+     id="path5061"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:none;stroke:#7d7d7d;stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
+     d="M 93.341579,149.9102 C 79.50521,147.67771 75.177813,157.29201 75.177813,168.57852"
+     id="path5263"
+     inkscape:connector-curvature="0" />
+  <text
+     xml:space="preserve"
+     style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     x="131.8273"
+     y="14.09236"
+     id="text4799-8"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4801-4"
+       x="131.8273"
+       y="14.09236">working dir (clean)</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     x="133.3548"
+     y="177.91992"
+     id="text4799-8-1"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       x="133.3548"
+       y="177.91992"
+       id="tspan3129">working dir</tspan><tspan
+       sodipodi:role="line"
+       x="133.3548"
+       y="190.41992"
+       id="tspan3137">(with uncommitted</tspan><tspan
+       sodipodi:role="line"
+       x="133.3548"
+       y="202.91992"
+       id="tspan3135">changes to f1 f2 ...)</tspan></text>
+  <path
+     style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#Arrow2Mend-2);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+     d="M 127.70873,11.814007 C 109.60365,21.89832 105.56713,4.2966494 86.402349,8.4033887"
+     id="path4609"
+     inkscape:connector-curvature="0" />
+  <path
+     style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#Arrow2Mend-2);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+     d="M 127.70873,95.185669 C 112.22803,107.58577 114.03479,115.58851 86.023391,109.58606"
+     id="path5019"
+     inkscape:connector-curvature="0" />
+  <g
+     id="g5433"
+     transform="translate(1.9967556e-6,-0.17817035)">
+    <text
+       transform="scale(0.9999978,1.0000022)"
+       sodipodi:linespacing="125%"
+       id="text5217-8-0"
+       y="58.841717"
+       x="46.92271"
+       style="font-size:11.99999809px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+       xml:space="preserve"><tspan
+         y="58.841717"
+         x="46.92271"
+         id="tspan8594"
+         sodipodi:role="line">hg uncommit <tspan
+   id="tspan3131"
+   style="font-style:italic">f1 f2 ...</tspan></tspan></text>
+    <g
+       transform="translate(-0.59241834,4.9316169)"
+       id="g6372">
+      <path
+         style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 36.655932,74.035228 3.649333,6.320665 3.711171,-6.427764"
+         id="path8598-5"
+         inkscape:connector-curvature="0" />
+      <g
+         id="g3821"
+         transform="matrix(1,0,0,1.5998137,5.836184,-16.712267)">
+        <path
+           inkscape:connector-curvature="0"
+           id="path8466-5-0"
+           d="M 35.5,23.60911 35.5,59.5"
+           style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path8466-4-7"
+           d="M 33.5,23.60911 33.5,59.5"
+           style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      </g>
+    </g>
+  </g>
+  <path
+     style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#Arrow2Mend-2);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+     d="M 129.98248,191.8189 C 105.83194,202.48442 106.0295,178.82045 86.402349,177.41851"
+     id="path5443"
+     inkscape:connector-curvature="0" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/docs/figures/figure-ug05.svg
@@ -0,0 +1,723 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="300"
+   height="250"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="figure-ug05.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM"
+       style="overflow:visible">
+      <path
+         id="path4193"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotS"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotS"
+       style="overflow:visible">
+      <path
+         id="path4196"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mstart"
+       style="overflow:visible">
+      <path
+         id="path3998"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,4,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible">
+      <path
+         id="path5316"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path5292"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path5289"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.8,0,0,0.8,10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5253">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5255" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop5257" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5245"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5247" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5207"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5209" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5253"
+       id="linearGradient5259"
+       x1="384.79102"
+       y1="262.99402"
+       x2="391.83789"
+       y2="262.99402"
+       gradientUnits="userSpaceOnUse" />
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-6"
+       style="overflow:visible">
+      <path
+         id="path5316-5"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-9"
+       style="overflow:visible">
+      <path
+         id="path5316-4"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-1"
+       style="overflow:visible">
+      <path
+         id="path5316-9"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible">
+      <path
+         id="path5316-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-3"
+       style="overflow:visible">
+      <path
+         id="path5316-7-6"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4448"
+       style="overflow:visible">
+      <path
+         id="path4450"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-0"
+       style="overflow:visible">
+      <path
+         id="path4193-1"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-4"
+       style="overflow:visible">
+      <path
+         id="path4193-5"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.5123284"
+     inkscape:cx="139.72657"
+     inkscape:cy="132.43442"
+     inkscape:document-units="px"
+     inkscape:current-layer="svg2"
+     showgrid="false"
+     inkscape:window-width="974"
+     inkscape:window-height="1048"
+     inkscape:window-x="73"
+     inkscape:window-y="50"
+     inkscape:window-maximized="0"
+     showguides="false"
+     inkscape:snap-global="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid8451"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       originx="0.078088198px"
+       originy="-2937.8154px" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0.0780882,2135.4532)" />
+  <g
+     id="g3155">
+    <rect
+       y="1.4467304"
+       x="0.49999774"
+       height="18.053268"
+       width="21.481806"
+       id="rect2987"
+       style="fill:none;stroke:#000000;stroke-width:0.99999946;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text5217"
+       y="14.841532"
+       x="7.4264469"
+       style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         style="stroke:none"
+         y="14.841532"
+         x="7.4264469"
+         id="tspan5219"
+         sodipodi:role="line">6</tspan></text>
+  </g>
+  <g
+     id="g3160">
+    <g
+       transform="matrix(1.0000031,0,0,0.99999992,-8.1553343e-7,-0.44287016)"
+       id="g3102">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="rect2987-4"
+         width="21.481739"
+         height="18.05327"
+         x="60.500004"
+         y="1.8896017" />
+      <text
+         xml:space="preserve"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         x="67.426575"
+         y="15.284375"
+         id="text5217-8"
+         sodipodi:linespacing="125%"
+         transform="scale(0.9999979,1.0000021)"><tspan
+           y="15.284375"
+           x="67.426575"
+           sodipodi:role="line"
+           id="tspan6156">7</tspan></text>
+    </g>
+  </g>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:0.99999946px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend);display:inline"
+     d="m 21.981805,10.473365 38.518392,1e-6"
+     id="path8263"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0" />
+  <g
+     id="g4516"
+     transform="translate(-0.00911713,4.7593041)">
+    <rect
+       y="136.68742"
+       x="0.50911897"
+       height="18.05327"
+       width="21.481989"
+       id="rect2987-41"
+       style="fill:none;stroke:#000000;stroke-width:1.0000037;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       transform="scale(1.0000037,0.99999628)"
+       sodipodi:linespacing="125%"
+       id="text5217-7"
+       y="150.08279"
+       x="7.3916588"
+       style="font-size:12.00004482px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         style="stroke:none"
+         y="150.08279"
+         x="7.3916588"
+         id="tspan5219-3"
+         sodipodi:role="line">6</tspan></text>
+  </g>
+  <g
+     id="g4533"
+     transform="translate(-48.885537,0)">
+    <rect
+       y="218.81546"
+       x="109.38554"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4-4"
+       style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       transform="scale(0.9999979,1.0000021)"
+       sodipodi:linespacing="125%"
+       id="text5217-8-7"
+       y="232.20978"
+       x="112.22823"
+       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         y="232.20978"
+         x="112.22823"
+         id="tspan3914"
+         sodipodi:role="line">10</tspan></text>
+  </g>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-6);display:inline"
+     d="m 18.241201,159.5 45.999463,59.31546"
+     id="path5012"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g4516"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g4533"
+     inkscape:connection-end-point="d4" />
+  <text
+     xml:space="preserve"
+     style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+     x="122.10091"
+     y="140.49216"
+     id="text4115"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4117"
+       x="122.10091"
+       y="140.49216" /></text>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+     d="m 71.240899,159.5 -2.6e-5,59.31546"
+     id="path4123"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-end="#g4533"
+     inkscape:connection-end-point="d4"
+     inkscape:connection-start="#g4837"
+     inkscape:connection-start-point="d4" />
+  <text
+     xml:space="preserve"
+     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     x="145.71631"
+     y="120.74194"
+     id="text4799"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       x="145.71631"
+       y="120.74194"
+       id="tspan4866">obsolete, hidden precursors</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     x="140.08366"
+     y="221.99774"
+     id="text4807"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4809"
+       x="140.08366"
+       y="221.99774">successor, working dir</tspan></text>
+  <g
+     id="g4748"
+     transform="translate(66,4)">
+    <text
+       transform="scale(0.9999979,1.0000021)"
+       sodipodi:linespacing="125%"
+       id="text5217-8-0"
+       y="75.774689"
+       x="46.543758"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+       xml:space="preserve"><tspan
+         y="75.774689"
+         x="46.543758"
+         id="tspan8594"
+         sodipodi:role="line">hg fold 7</tspan></text>
+    <g
+       transform="translate(1.9995778e-6,1.240701)"
+       id="g6493">
+      <path
+         style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 36.655934,114.93533 3.649333,6.32067 3.711171,-6.42777"
+         id="path8598"
+         inkscape:connector-curvature="0" />
+      <g
+         id="g6489"
+         transform="translate(0.73014858,0)">
+        <path
+           inkscape:connector-curvature="0"
+           id="path8466-5"
+           d="m 40.606,21.314861 0,98.078949"
+           style="fill:none;stroke:#808080;stroke-width:1.21219063;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path8466-5-3"
+           d="m 38.5505,21.370511 0,98.078949"
+           style="fill:none;stroke:#808080;stroke-width:1.10104096;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      </g>
+    </g>
+  </g>
+  <g
+     id="g3166">
+    <g
+       id="g3102-9"
+       transform="translate(59.999995,-0.442871)">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="rect2987-4-02"
+         width="21.481739"
+         height="18.05327"
+         x="60.500004"
+         y="1.8896017" />
+      <text
+         xml:space="preserve"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         x="67.426575"
+         y="15.284375"
+         id="text5217-8-72"
+         sodipodi:linespacing="125%"
+         transform="scale(0.9999979,1.0000021)"><tspan
+           y="15.284375"
+           x="67.426575"
+           sodipodi:role="line"
+           id="tspan6156-9">8</tspan></text>
+    </g>
+  </g>
+  <g
+     id="g3172">
+    <g
+       id="g3102-8"
+       transform="translate(120,-0.442871)">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="rect2987-4-026"
+         width="21.481739"
+         height="18.05327"
+         x="60.500004"
+         y="1.8896017" />
+      <text
+         xml:space="preserve"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         x="67.426575"
+         y="15.284375"
+         id="text5217-8-3"
+         sodipodi:linespacing="125%"
+         transform="scale(0.9999979,1.0000021)"><tspan
+           y="15.284375"
+           x="67.426575"
+           sodipodi:role="line"
+           id="tspan6156-0">9</tspan></text>
+    </g>
+  </g>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
+     d="m 81.981996,10.473366 38.518004,0"
+     id="path3178"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g3160"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g3166"
+     inkscape:connection-end-point="d4" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2)"
+     d="m 141.98174,10.473366 38.51826,0"
+     id="path3180"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g3166"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g3172"
+     inkscape:connection-end-point="d4" />
+  <g
+     id="g4837">
+    <rect
+       y="141.44673"
+       x="60.5"
+       height="18.053268"
+       width="21.481806"
+       id="rect2987-4-7"
+       style="fill:none;stroke:#000000;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.9999994, 2.99999821;stroke-dashoffset:0" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text5217-8-1"
+       y="154.84146"
+       x="67.426483"
+       style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         id="tspan6156-7"
+         sodipodi:role="line"
+         x="67.426483"
+         y="154.84146">7</tspan></text>
+  </g>
+  <g
+     id="g4842">
+    <rect
+       y="141.44673"
+       x="120.49981"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4-02-9"
+       style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999791, 2.99999374;stroke-dashoffset:0" />
+    <text
+       transform="scale(0.9999979,1.0000021)"
+       sodipodi:linespacing="125%"
+       id="text5217-8-72-7"
+       y="154.84122"
+       x="127.42651"
+       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         id="tspan6156-9-5"
+         sodipodi:role="line"
+         x="127.42651"
+         y="154.84122">8</tspan></text>
+  </g>
+  <g
+     id="g4847">
+    <rect
+       y="141.44673"
+       x="180.49982"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4-026-9"
+       style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999791, 2.99999374;stroke-dashoffset:0" />
+    <text
+       transform="scale(0.9999979,1.0000021)"
+       sodipodi:linespacing="125%"
+       id="text5217-8-3-2"
+       y="154.84122"
+       x="187.42664"
+       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         id="tspan6156-0-8"
+         sodipodi:role="line"
+         x="187.42664"
+         y="154.84122">9</tspan></text>
+  </g>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+     d="m 81.981806,150.47337 38.518004,0"
+     id="path3178-7"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g4837"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g4842"
+     inkscape:connection-end-point="d4" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+     d="m 141.98155,150.47337 38.51827,0"
+     id="path3180-3"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g4842"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g4847"
+     inkscape:connection-end-point="d4" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4448);display:inline"
+     d="M 21.981991,150.47336 60.5,150.47337"
+     id="path4542"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g4516"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g4837"
+     inkscape:connection-end-point="d4" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+     d="M 124.24048,159.5 78.241066,218.81546"
+     id="path4123-2"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g4842"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g4533"
+     inkscape:connection-end-point="d4" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+     d="M 180.49982,157.39844 81.981738,220.91702"
+     id="path4123-2-7"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g4847"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g4533"
+     inkscape:connection-end-point="d4" />
+  <path
+     style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#marker4448)"
+     d="m 160.40897,123.42419 c 2.57952,11.70065 19.72743,7.53006 26.27045,14.72737"
+     id="path5710"
+     inkscape:connector-curvature="0" />
+  <path
+     style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#marker4448)"
+     d="m 152.05019,123.02615 c -18.20742,12.2407 -49.96313,3.854 -68.064354,15.92149"
+     id="path5714"
+     inkscape:connector-curvature="0" />
+  <path
+     style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#marker4448)"
+     d="m 155.63252,123.42419 c -3.55115,8.6397 -12.38945,8.51306 -17.91167,13.53326"
+     id="path5716"
+     inkscape:connector-curvature="0" />
+  <path
+     style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#marker4448)"
+     d="m 152.44822,224.92366 c -12.26234,20.49653 -41.95881,1.63236 -63.685938,3.1843"
+     id="path5926"
+     inkscape:connector-curvature="0" />
+  <text
+     xml:space="preserve"
+     style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     x="219.76105"
+     y="45.381439"
+     id="text4799-8"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4801-4"
+       x="219.76105"
+       y="45.381439">working dir</tspan></text>
+  <path
+     style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#marker4448)"
+     d="m 216.5322,43.418725 c -17.12038,-3.247846 -32.15429,-0.004 -25.47437,-18.707746"
+     id="path6377"
+     inkscape:connector-curvature="0" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/docs/figures/figure-ug06.svg
@@ -0,0 +1,851 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="275"
+   height="310"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="figure-ug06.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM"
+       style="overflow:visible">
+      <path
+         id="path4193"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotS"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotS"
+       style="overflow:visible">
+      <path
+         id="path4196"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mstart"
+       style="overflow:visible">
+      <path
+         id="path3998"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,4,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible">
+      <path
+         id="path5316"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path5292"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path5289"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.8,0,0,0.8,10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5253">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5255" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop5257" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5245"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5247" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5207"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5209" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5253"
+       id="linearGradient5259"
+       x1="384.79102"
+       y1="262.99402"
+       x2="391.83789"
+       y2="262.99402"
+       gradientUnits="userSpaceOnUse" />
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-6"
+       style="overflow:visible">
+      <path
+         id="path5316-5"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-9"
+       style="overflow:visible">
+      <path
+         id="path5316-4"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-1"
+       style="overflow:visible">
+      <path
+         id="path5316-9"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible">
+      <path
+         id="path5316-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-3"
+       style="overflow:visible">
+      <path
+         id="path5316-7-6"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4448"
+       style="overflow:visible">
+      <path
+         id="path4450"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-0"
+       style="overflow:visible">
+      <path
+         id="path4193-1"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-4"
+       style="overflow:visible">
+      <path
+         id="path4193-5"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-37"
+       style="overflow:visible">
+      <path
+         id="path5316-7-5"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3150"
+       style="overflow:visible">
+      <path
+         id="path3152"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-7"
+       style="overflow:visible">
+      <path
+         id="path5316-7-50"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3230"
+       style="overflow:visible">
+      <path
+         id="path3232"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-8"
+       style="overflow:visible">
+      <path
+         id="path4193-53"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2"
+     inkscape:cx="124.00649"
+     inkscape:cy="153.46969"
+     inkscape:document-units="px"
+     inkscape:current-layer="svg2"
+     showgrid="false"
+     inkscape:window-width="974"
+     inkscape:window-height="1048"
+     inkscape:window-x="48"
+     inkscape:window-y="61"
+     inkscape:window-maximized="0"
+     showguides="false"
+     inkscape:snap-global="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid8451"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true"
+       originx="0.078088198px"
+       originy="-2937.8154px" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <text
+     xml:space="preserve"
+     style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+     x="112.5439"
+     y="113.7746"
+     id="text5217-8-0"
+     sodipodi:linespacing="125%"
+     transform="scale(0.9999979,1.0000021)"><tspan
+       sodipodi:role="line"
+       id="tspan8594"
+       x="112.5439"
+       y="113.7746">hg amend</tspan></text>
+  <g
+     id="g6493"
+     transform="translate(63.844066,39.240701)">
+    <path
+       inkscape:connector-curvature="0"
+       id="path8598"
+       d="m 36.655934,114.93533 3.649333,6.32067 3.711171,-6.42777"
+       style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+    <g
+       transform="translate(0.73014858,0)"
+       id="g6489">
+      <path
+         style="fill:none;stroke:#808080;stroke-width:1.21219063;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 40.606,21.314861 0,98.078949"
+         id="path8466-5"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:none;stroke:#808080;stroke-width:1.10104096;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         d="m 38.5505,21.370511 0,98.078949"
+         id="path8466-5-3"
+         inkscape:connector-curvature="0" />
+    </g>
+  </g>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0.0780882,2195.4532)" />
+  <rect
+     style="fill:none;stroke:#000000;stroke-width:0.99999946;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+     id="rect2987"
+     width="21.481806"
+     height="18.053268"
+     x="0.49999774"
+     y="35.446732" />
+  <text
+     xml:space="preserve"
+     style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+     x="3.3424675"
+     y="48.84153"
+     id="text5217"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan5219"
+       x="3.3424675"
+       y="48.84153"
+       style="stroke:none">10</tspan></text>
+  <rect
+     style="fill:none;stroke:#000000;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+     id="rect2987-4"
+     width="21.481806"
+     height="18.053268"
+     x="60.500191"
+     y="35.446732" />
+  <text
+     xml:space="preserve"
+     style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+     x="63.497932"
+     y="48.84153"
+     id="text5217-8"
+     sodipodi:linespacing="125%"><tspan
+       y="48.84153"
+       x="63.497932"
+       sodipodi:role="line"
+       id="tspan6156">11</tspan></text>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:0.99999946px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend);display:inline"
+     d="m 21.981805,44.473365 38.518386,10e-7"
+     id="path8263"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-end="#rect2987-4"
+     inkscape:connection-end-point="d4" />
+  <g
+     id="g3291"
+     transform="translate(0,34)">
+    <rect
+       y="141.44673"
+       x="0.50000185"
+       height="18.05327"
+       width="21.481989"
+       id="rect2987-41"
+       style="fill:none;stroke:#000000;stroke-width:1.0000037;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       transform="scale(1.0000037,0.9999963)"
+       sodipodi:linespacing="125%"
+       id="text5217-7"
+       y="154.84212"
+       x="3.3424876"
+       style="font-size:12.00004482px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         style="stroke:none"
+         y="154.84212"
+         x="3.3424876"
+         id="tspan5219-3"
+         sodipodi:role="line">10</tspan></text>
+  </g>
+  <rect
+     style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+     id="rect2987-4-4"
+     width="21.481739"
+     height="18.05327"
+     x="60.5"
+     y="252.81546" />
+  <text
+     xml:space="preserve"
+     style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+     x="63.342594"
+     y="266.20969"
+     id="text5217-8-7"
+     sodipodi:linespacing="125%"
+     transform="scale(0.9999979,1.0000021)"><tspan
+       sodipodi:role="line"
+       id="tspan3914"
+       x="63.342594"
+       y="266.20969">15</tspan></text>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-6);display:inline"
+     d="m 18.241201,193.5 45.999463,59.31546"
+     id="path5012"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-end="#rect2987-4-4"
+     inkscape:connection-end-point="d4"
+     inkscape:connection-start="#g3291"
+     inkscape:connection-start-point="d4" />
+  <text
+     xml:space="preserve"
+     style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+     x="122.10091"
+     y="174.49216"
+     id="text4115"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4117"
+       x="122.10091"
+       y="174.49216" /></text>
+  <g
+     id="g3118"
+     transform="translate(0,34)">
+    <rect
+       y="1.4467307"
+       x="120.5"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4-02"
+       style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       transform="scale(0.9999979,1.0000021)"
+       sodipodi:linespacing="125%"
+       id="text5217-8-72"
+       y="14.841505"
+       x="123.54487"
+       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         id="tspan6156-9"
+         sodipodi:role="line"
+         x="123.54487"
+         y="14.841505">12</tspan></text>
+  </g>
+  <g
+     id="g3126"
+     transform="translate(0,34)">
+    <rect
+       y="1.4467307"
+       x="180.5"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4-026"
+       style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       transform="scale(0.9999979,1.0000021)"
+       sodipodi:linespacing="125%"
+       id="text5217-8-3"
+       y="14.841505"
+       x="183.42488"
+       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         id="tspan6156-0"
+         sodipodi:role="line"
+         x="183.42488"
+         y="14.841505">13</tspan></text>
+  </g>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+     d="m 81.981997,44.473366 38.518003,0"
+     id="path3178"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#rect2987-4"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g3118"
+     inkscape:connection-end-point="d4" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+     d="m 141.98174,44.473366 38.51826,0"
+     id="path3180"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g3118"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g3126"
+     inkscape:connection-end-point="d4" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4448);display:inline"
+     d="M 21.981991,184.65238 60.5,185.29435"
+     id="path4542"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g3291"
+     inkscape:connection-start-point="d4" />
+  <text
+     xml:space="preserve"
+     style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     x="86.768402"
+     y="12.367264"
+     id="text4799-8"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4801-4"
+       x="86.768402"
+       y="12.367264">working dir</tspan></text>
+  <flowRoot
+     xml:space="preserve"
+     id="flowRoot3104"
+     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     transform="translate(0,34)"><flowRegion
+       id="flowRegion3106"><rect
+         id="rect3108"
+         width="60.309383"
+         height="49.300529"
+         x="-25.368233"
+         y="-22.34952" /></flowRegion><flowPara
+       id="flowPara3110"></flowPara></flowRoot>  <g
+     id="g5560"
+     transform="translate(0,34)">
+    <rect
+       y="141.44673"
+       x="60.5"
+       height="18.053268"
+       width="21.481806"
+       id="rect2987-4-8"
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 4;stroke-dashoffset:0" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text5217-8-4"
+       y="154.84152"
+       x="63.497734"
+       style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         id="tspan6156-4"
+         sodipodi:role="line"
+         x="63.497734"
+         y="154.84152">11</tspan></text>
+  </g>
+  <g
+     transform="translate(-2.0371355e-4,174)"
+     id="g3118-0">
+    <rect
+       y="1.4467307"
+       x="120.5"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4-02-4"
+       style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       transform="scale(0.9999979,1.0000021)"
+       sodipodi:linespacing="125%"
+       id="text5217-8-72-7"
+       y="14.841505"
+       x="123.54487"
+       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         id="tspan6156-9-7"
+         sodipodi:role="line"
+         x="123.54487"
+         y="14.841505">12</tspan></text>
+  </g>
+  <g
+     transform="translate(-2.0371355e-4,174)"
+     id="g3126-3">
+    <rect
+       y="1.4467307"
+       x="180.5"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4-026-8"
+       style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    <text
+       transform="scale(0.9999979,1.0000021)"
+       sodipodi:linespacing="125%"
+       id="text5217-8-3-9"
+       y="14.841505"
+       x="183.42488"
+       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         id="tspan6156-0-0"
+         sodipodi:role="line"
+         x="183.42488"
+         y="14.841505">13</tspan></text>
+  </g>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+     d="m 81.981806,184.47337 38.517994,0"
+     id="path3178-0"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-end="#g3118-0"
+     inkscape:connection-end-point="d4" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+     d="m 141.98154,184.47337 38.51826,0"
+     id="path3180-2"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g3118-0"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g3126-3"
+     inkscape:connection-end-point="d4" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+     d="m 71.240899,193.5 -2.6e-5,59.31546"
+     id="path4123"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-end="#rect2987-4-4"
+     inkscape:connection-end-point="d4" />
+  <text
+     xml:space="preserve"
+     style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     x="18.790892"
+     y="142.23888"
+     id="text4799-8-6"
+     sodipodi:linespacing="100%"><tspan
+       sodipodi:role="line"
+       id="tspan4801-4-0"
+       x="18.790892"
+       y="142.23888">obsolete</tspan><tspan
+       sodipodi:role="line"
+       x="18.790892"
+       y="152.23888"
+       id="tspan4452">but visible</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     x="150.66776"
+     y="148.39902"
+     id="text4454"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4456"
+       x="150.66776"
+       y="148.39902">unstable</tspan></text>
+  <path
+     style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#marker3230);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+     d="m 41.433633,155.93241 c 4.445697,11.92656 24.017716,1.13391 25.948336,14.64825"
+     id="path4880"
+     inkscape:connector-curvature="0" />
+  <path
+     style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#marker3230);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+     d="m 171.59383,151.74719 c -5.21207,17.59198 -29.77875,-3.6088 -34.31876,17.57791"
+     id="path5100"
+     inkscape:connector-curvature="0" />
+  <path
+     style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#marker3230);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+     d="m 174.94201,152.58423 c 1.6786,11.87585 15.90381,0.83843 15.90381,15.90382"
+     id="path5104"
+     inkscape:connector-curvature="0" />
+  <g
+     id="g5631"
+     transform="translate(-27.905601,-5.4032307)">
+    <rect
+       y="211.84996"
+       x="118.4056"
+       height="18.05327"
+       width="21.481739"
+       id="rect2987-4-0-0"
+       style="fill:none;stroke:#404040;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0" />
+    <text
+       inkscape:transform-center-x="2.6044813"
+       transform="scale(0.9999979,1.0000021)"
+       sodipodi:linespacing="125%"
+       id="text5217-8-9-2"
+       y="225.24431"
+       x="121.1868"
+       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         id="tspan6156-7-4"
+         sodipodi:role="line"
+         x="121.1868"
+         y="225.24431">14</tspan></text>
+  </g>
+  <text
+     xml:space="preserve"
+     style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+     x="108.67482"
+     y="206.41029"
+     id="text4119"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4121"
+       x="108.67482"
+       y="206.41029"
+       style="font-size:8px;font-weight:bold;-inkscape-font-specification:Sans Bold">T</tspan></text>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3230)"
+     d="m 79.976346,193.5 12.52908,12.94673"
+     id="path5636"
+     inkscape:connector-type="polyline"
+     inkscape:connector-curvature="0"
+     inkscape:connection-start="#g5560"
+     inkscape:connection-start-point="d4"
+     inkscape:connection-end="#g5631"
+     inkscape:connection-end-point="d4" />
+  <text
+     xml:space="preserve"
+     style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     x="143.52129"
+     y="224.8358"
+     id="text4787"
+     sodipodi:linespacing="100%"><tspan
+       sodipodi:role="line"
+       x="143.52129"
+       y="224.8358"
+       id="tspan4791">temporary</tspan><tspan
+       sodipodi:role="line"
+       x="143.52129"
+       y="234.8358"
+       id="tspan4795">amend</tspan><tspan
+       sodipodi:role="line"
+       x="143.52129"
+       y="244.8358"
+       id="tspan4797">commit;</tspan><tspan
+       sodipodi:role="line"
+       x="143.52129"
+       y="254.8358"
+       id="tspan6283">obsolete and</tspan><tspan
+       sodipodi:role="line"
+       x="143.52129"
+       y="264.83582"
+       id="tspan6285">hidden</tspan></text>
+  <text
+     xml:space="preserve"
+     style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+     x="95.495201"
+     y="291.81802"
+     id="text4799-8-7"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan4801-4-8"
+       x="95.495201"
+       y="291.81802">working dir</tspan></text>
+  <path
+     style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#marker3230);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+     d="M 114.6749,14.053603 C 108.77815,29.370318 80.769041,12.646358 73.241271,33.724116"
+     id="path6974"
+     inkscape:connector-curvature="0" />
+  <path
+     style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#marker3230)"
+     d="m 92.984542,288.7868 c -17.463809,1.31107 -20.109707,1.30681 -21.213204,-14.14214"
+     id="path7860"
+     inkscape:connector-curvature="0" />
+  <path
+     style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#marker3230)"
+     d="m 139.5,223.5 c -16.33548,3.61997 -8.82833,-10 -24.5,-10"
+     id="path8482"
+     inkscape:connector-curvature="0" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/docs/figures/figure-ug07.svg
@@ -0,0 +1,608 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="310"
+   height="220"
+   id="svg8082"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="figure-ug07.svg">
+  <defs
+     id="defs8084">
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mend"
+       style="overflow:visible">
+      <path
+         id="path4117"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(-0.4,0,0,-0.4,-4,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3230"
+       style="overflow:visible">
+      <path
+         id="path3232"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8231"
+       style="overflow:visible">
+      <path
+         id="path8233"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM"
+       style="overflow:visible">
+      <path
+         id="path4193"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible">
+      <path
+         id="path5316-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8239"
+       style="overflow:visible">
+      <path
+         id="path8241"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4448"
+       style="overflow:visible">
+      <path
+         id="path4450"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-6"
+       style="overflow:visible">
+      <path
+         id="path5316-5"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4448-9"
+       style="overflow:visible">
+      <path
+         id="path4450-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4448-8"
+       style="overflow:visible">
+      <path
+         id="path4450-6"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-6"
+       style="overflow:visible">
+      <path
+         id="path4193-5"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-7"
+       style="overflow:visible">
+      <path
+         id="path4193-7"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2"
+     inkscape:cx="126.91408"
+     inkscape:cy="102.44906"
+     inkscape:current-layer="layer1"
+     inkscape:document-units="px"
+     showgrid="false"
+     inkscape:window-width="887"
+     inkscape:window-height="875"
+     inkscape:window-x="342"
+     inkscape:window-y="160"
+     inkscape:window-maximized="0"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <metadata
+     id="metadata8087">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     transform="translate(0,18.65699)">
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+       x="113.19138"
+       y="21.624107"
+       id="text5217-8-0"
+       sodipodi:linespacing="125%"
+       transform="scale(0.9999979,1.0000021)"><tspan
+         sodipodi:role="line"
+         id="tspan8594"
+         x="113.19138"
+         y="21.624107">hg evolve --all</tspan></text>
+    <g
+       id="g6372"
+       transform="translate(63.844068,-32.28608)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8598"
+         d="m 36.655932,74.035228 3.649333,6.320665 3.711171,-6.427764"
+         style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <g
+         transform="matrix(1,0,0,1.5998137,5.836184,-16.712267)"
+         id="g3821">
+        <path
+           style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="M 35.5,23.60911 35.5,59.5"
+           id="path8466-5"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="M 33.5,23.60911 33.5,59.5"
+           id="path8466-4-7"
+           inkscape:connector-curvature="0" />
+      </g>
+    </g>
+    <g
+       id="g3291"
+       transform="translate(0,-82.02573)">
+      <rect
+         y="141.44673"
+         x="0.50000185"
+         height="18.05327"
+         width="21.481989"
+         id="rect2987-41"
+         style="fill:none;stroke:#000000;stroke-width:1.0000037;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         transform="scale(1.0000037,0.9999963)"
+         sodipodi:linespacing="125%"
+         id="text5217-7"
+         y="154.84212"
+         x="3.3424876"
+         style="font-size:12.00004482px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           style="stroke:none"
+           y="154.84212"
+           x="3.3424876"
+           id="tspan5219-3"
+           sodipodi:role="line">10</tspan></text>
+    </g>
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect2987-4-4"
+       width="21.481739"
+       height="18.05327"
+       x="60.5"
+       y="136.78973" />
+    <text
+       xml:space="preserve"
+       style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="63.342571"
+       y="150.18422"
+       id="text5217-8-7"
+       sodipodi:linespacing="125%"
+       transform="scale(0.9999979,1.0000021)"><tspan
+         sodipodi:role="line"
+         id="tspan3914"
+         x="63.342571"
+         y="150.18422">15</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-6);display:inline"
+       d="M 18.241201,77.474272 64.240665,136.78973"
+       id="path5012"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-end="#rect2987-4-4"
+       inkscape:connection-end-point="d4"
+       inkscape:connection-start="#g3291"
+       inkscape:connection-start-point="d4" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4448);display:inline"
+       d="M 21.981991,68.626653 60.499999,69.26862"
+       id="path4542"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g3291"
+       inkscape:connection-start-point="d4" />
+    <g
+       id="g5560"
+       transform="translate(0,-82.02573)">
+      <rect
+         y="141.44673"
+         x="60.5"
+         height="18.053268"
+         width="21.481806"
+         id="rect2987-4-8"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 4;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text5217-8-4"
+         y="154.84152"
+         x="63.497734"
+         style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-4"
+           sodipodi:role="line"
+           x="63.497734"
+           y="154.84152">11</tspan></text>
+    </g>
+    <g
+       id="g8702"
+       transform="translate(0,-16)">
+      <rect
+         y="75.421013"
+         x="120.49979"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-02-4"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 4;stroke-dashoffset:0" />
+      <text
+         transform="scale(0.9999979,1.0000021)"
+         sodipodi:linespacing="125%"
+         id="text5217-8-72-7"
+         y="88.815628"
+         x="123.54466"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-9-7"
+           sodipodi:role="line"
+           x="123.54466"
+           y="88.815628">12</tspan></text>
+    </g>
+    <g
+       id="g8707"
+       transform="translate(0,-16)">
+      <rect
+         y="75.421013"
+         x="180.4998"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-026-8"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 4;stroke-dashoffset:0" />
+      <text
+         transform="scale(0.9999979,1.0000021)"
+         sodipodi:linespacing="125%"
+         id="text5217-8-3-9"
+         y="88.815628"
+         x="183.42468"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-0-0"
+           sodipodi:role="line"
+           x="183.42468"
+           y="88.815628">13</tspan></text>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       d="m 81.981809,68.44765 38.517981,-2e-6"
+       id="path3178-0"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-end="#g8702"
+       inkscape:connection-end-point="d4" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       d="m 141.98153,68.447648 38.51827,0"
+       id="path3180-2"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g8702"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g8707"
+       inkscape:connection-end-point="d4" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+       d="m 71.240899,77.47427 -2.6e-5,59.31546"
+       id="path4123"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-end="#rect2987-4-4"
+       inkscape:connection-end-point="d4" />
+    <g
+       id="g5631"
+       transform="translate(-27.905602,-122.06022)">
+      <rect
+         y="211.84996"
+         x="118.4056"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-0-0"
+         style="fill:none;stroke:#404040;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0" />
+      <text
+         inkscape:transform-center-x="2.6044813"
+         transform="scale(0.9999979,1.0000021)"
+         sodipodi:linespacing="125%"
+         id="text5217-8-9-2"
+         y="225.24431"
+         x="121.1868"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#404040;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-7-4"
+           sodipodi:role="line"
+           x="121.1868"
+           y="225.24431">14</tspan></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="108.67482"
+       y="89.753288"
+       id="text4119"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan4121"
+         x="108.67482"
+         y="89.753288"
+         style="font-size:8px;font-weight:bold;-inkscape-font-specification:Sans Bold">T</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3230)"
+       d="M 80.157925,77.47427 92.323846,89.78974"
+       id="path5636"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g5560"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g5631"
+       inkscape:connection-end-point="d4" />
+    <flowRoot
+       xml:space="preserve"
+       id="flowRoot8394"
+       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       transform="translate(0,-36)"><flowRegion
+         id="flowRegion8396"><rect
+           id="rect8398"
+           width="311.2373"
+           height="172.50397"
+           x="13.690791"
+           y="268.24911" /></flowRegion><flowPara
+         id="flowPara8400" /></flowRoot>    <g
+       id="g8798"
+       transform="translate(28.427001,-38.337945)">
+      <rect
+         y="175.12769"
+         x="92.072998"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-4-9"
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         transform="scale(0.9999979,1.0000021)"
+         sodipodi:linespacing="125%"
+         id="text5217-8-7-4"
+         y="188.52202"
+         x="94.915642"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           y="188.52202"
+           x="94.915642"
+           id="tspan3914-6"
+           sodipodi:role="line">16</tspan></text>
+    </g>
+    <g
+       id="g8803"
+       transform="translate(8.4270009,-38.337945)">
+      <rect
+         y="175.12769"
+         x="172.073"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-4-4"
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         transform="scale(0.9999979,1.0000021)"
+         sodipodi:linespacing="125%"
+         id="text5217-8-7-46"
+         y="188.52202"
+         x="174.91582"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           y="188.52202"
+           x="174.91582"
+           id="tspan3914-1"
+           sodipodi:role="line">17</tspan></text>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4448);display:inline"
+       d="m 81.981739,145.81637 38.518261,0"
+       id="path4542-5"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#rect2987-4-4"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g8798"
+       inkscape:connection-end-point="d4" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4448);display:inline"
+       d="M 141.98174,145.77795 180.5,145.64016"
+       id="path4542-1"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g8798"
+       inkscape:connection-start-point="d4" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+       d="m 131.24068,77.474283 1.6e-4,59.315457"
+       id="path4123-1"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g8702"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g8798"
+       inkscape:connection-end-point="d4" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+       d="m 191.24069,77.474283 1.6e-4,59.315457"
+       id="path4123-14"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g8707"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g8803"
+       inkscape:connection-end-point="d4" />
+    <text
+       xml:space="preserve"
+       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       x="226.23938"
+       y="81.810745"
+       id="text3058"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3060"
+         x="226.23938"
+         y="81.810745">obsolete, hidden</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       x="243.1927"
+       y="151.52931"
+       id="text6402"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6404"
+         x="243.1927"
+         y="151.52931">working dir</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       x="102"
+       y="184.34302"
+       id="text7020"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan7022"
+         x="102"
+         y="184.34302">successors</tspan></text>
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 214.5,51.843009 c 2.26039,0.588947 4.4416,0.9416 5.5,2 2.95364,2.953636 2.98797,53.512031 0.5,56.000001 -3.15839,3.15839 -5.49327,6.33109 -9,7.5"
+       id="path7862"
+       inkscape:connector-curvature="0" />
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#marker4448-8);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 240,149.34301 c -2.15495,-0.66255 -7.61688,0.38312 -9,-1 -11.39271,-11.39271 -10.31018,-6 -25.5,-6"
+       id="path7864"
+       inkscape:connector-curvature="0" />
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 51.5,159.34301 c -0.275757,4.62088 1.079227,8.02641 5.5,9.5 11.41327,3.80442 21.457711,-0.70846 32.500001,1.5 27.298709,5.45974 71.848979,-2 99.499999,-2 8.52242,0 22,4.51185 22,-8.5"
+       id="path8084"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
new file mode 100644
--- /dev/null
+++ b/docs/figures/figure-ug08.svg
@@ -0,0 +1,415 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="250"
+   height="190"
+   id="svg8392"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="figure-ug08.svg">
+  <defs
+     id="defs8394">
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3230"
+       style="overflow:visible">
+      <path
+         id="path3232"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible">
+      <path
+         id="path5316-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8414"
+       style="overflow:visible">
+      <path
+         id="path8416"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-7"
+       style="overflow:visible">
+      <path
+         id="path5316-7-1"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8695"
+       style="overflow:visible">
+      <path
+         id="path8697"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8695-6"
+       style="overflow:visible">
+      <path
+         id="path8697-4"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2"
+     inkscape:cx="95.232262"
+     inkscape:cy="117.91553"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="824"
+     inkscape:window-height="830"
+     inkscape:window-x="647"
+     inkscape:window-y="278"
+     inkscape:window-maximized="0"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <metadata
+     id="metadata8397">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-769.99805)">
+    <g
+       id="g8678"
+       transform="translate(0,-6)">
+      <rect
+         y="793.80884"
+         x="0.4999997"
+         height="18.053268"
+         width="21.481806"
+         id="rect2987-4"
+         style="fill:none;stroke:#000000;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text5217-8"
+         y="807.20361"
+         x="3.4977415"
+         style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156"
+           sodipodi:role="line"
+           x="3.4977415"
+           y="807.20361">18</tspan></text>
+    </g>
+    <g
+       id="g3118"
+       transform="translate(-60.000001,786.36218)">
+      <rect
+         y="1.4467307"
+         x="120.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-02"
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         transform="scale(0.9999979,1.0000021)"
+         sodipodi:linespacing="125%"
+         id="text5217-8-72"
+         y="14.841505"
+         x="123.54487"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-9"
+           sodipodi:role="line"
+           x="123.54487"
+           y="14.841505">19</tspan></text>
+    </g>
+    <g
+       id="g3126"
+       transform="translate(-60.000192,786.36218)">
+      <rect
+         y="1.4467307"
+         x="180.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-026"
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         transform="scale(0.9999979,1.0000021)"
+         sodipodi:linespacing="125%"
+         id="text5217-8-3"
+         y="14.841505"
+         x="183.42488"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-0"
+           sodipodi:role="line"
+           x="183.42488"
+           y="14.841505">20</tspan></text>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       d="m 21.981806,796.83549 38.518193,4e-5"
+       id="path3178"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-end="#g3118"
+       inkscape:connection-end-point="d4"
+       inkscape:connection-start="#g8678"
+       inkscape:connection-start-point="d4" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       d="m 81.981738,796.83555 38.518072,0"
+       id="path3180"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g3118"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3126"
+       inkscape:connection-end-point="d4" />
+    <text
+       xml:space="preserve"
+       style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       x="192.95625"
+       y="783.27075"
+       id="text4799-8"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan4801-4"
+         x="192.95625"
+         y="783.27075">working dir</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+       x="80.662636"
+       y="851.4538"
+       id="text5217-8-0"
+       sodipodi:linespacing="125%"
+       transform="scale(0.9999979,1.0000021)"><tspan
+         sodipodi:role="line"
+         id="tspan8594"
+         x="80.662636"
+         y="851.4538">hg prune 19</tspan></text>
+    <g
+       id="g6372"
+       transform="translate(31.315375,797.54535)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8598"
+         d="m 36.655932,74.035228 3.649333,6.320665 3.711171,-6.427764"
+         style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <g
+         transform="matrix(1,0,0,1.5998137,5.836184,-16.712267)"
+         id="g3821">
+        <path
+           style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="M 35.5,23.60911 35.5,59.5"
+           id="path8466-5"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="M 33.5,23.60911 33.5,59.5"
+           id="path8466-4-7"
+           inkscape:connector-curvature="0" />
+      </g>
+    </g>
+    <g
+       transform="matrix(1.0000032,0,0,0.99999991,-8.2080488e-7,99.00007)"
+       id="g8678-6">
+      <rect
+         y="793.80884"
+         x="0.4999997"
+         height="18.053268"
+         width="21.481806"
+         id="rect2987-4-9"
+         style="fill:none;stroke:#000000;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text5217-8-32"
+         y="807.20361"
+         x="3.4977415"
+         style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-8"
+           sodipodi:role="line"
+           x="3.4977415"
+           y="807.20361">18</tspan></text>
+    </g>
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999946;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999946, 3.99999785;stroke-dashoffset:0"
+       id="rect2987-4-02-6"
+       width="21.481808"
+       height="18.053268"
+       x="60.5"
+       y="892.8089" />
+    <text
+       xml:space="preserve"
+       style="font-size:11.99999428px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="63.544647"
+       y="906.20331"
+       id="text5217-8-72-1"
+       sodipodi:linespacing="125%"><tspan
+         y="906.20331"
+         x="63.544647"
+         sodipodi:role="line"
+         id="tspan6156-9-8">19</tspan></text>
+    <g
+       id="g3126-8"
+       transform="matrix(1.0000032,0,0,0.99999991,-60.000385,891.36218)">
+      <rect
+         y="1.4467307"
+         x="180.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-026-7"
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         transform="scale(0.9999979,1.0000021)"
+         sodipodi:linespacing="125%"
+         id="text5217-8-3-8"
+         y="14.841505"
+         x="183.42488"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-0-9"
+           sodipodi:role="line"
+           x="183.42488"
+           y="14.841505">20</tspan></text>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       d="m 21.981875,901.83548 38.518126,5e-5"
+       id="path3178-9"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g8678-6"
+       inkscape:connection-start-point="d4" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       d="m 81.981808,901.83554 38.518382,0"
+       id="path3180-1"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-end="#g3126-8"
+       inkscape:connection-end-point="d4" />
+    <text
+       xml:space="preserve"
+       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       x="33.872818"
+       y="941.35645"
+       id="text9295"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan9297"
+         x="33.872818"
+         y="941.35645">obsolete</tspan><tspan
+         sodipodi:role="line"
+         x="33.872818"
+         y="953.85645"
+         id="tspan9299">but visible</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       x="125.75282"
+       y="939.66284"
+       id="text9301"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan9303"
+         x="125.75282"
+         y="939.66284">unstable</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       x="192.95625"
+       y="920.7381"
+       id="text4799-8-4"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan4801-4-2"
+         x="192.95625"
+         y="920.7381">working dir</tspan></text>
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#marker8695);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 188.0904,779.78292 c -26.25288,3.51598 -8.22083,22.5684 -39.59798,18.38478"
+       id="path9349"
+       inkscape:connector-curvature="0" />
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#marker8695);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 189.55807,918.25683 c -26.25288,-3.51598 -8.22083,-22.5684 -39.59798,-18.38478"
+       id="path9349-7"
+       inkscape:connector-curvature="0" />
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#marker8695-6);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 57.275649,931.10377 c 1.651424,-10.44392 15.963695,-1.81375 16.970563,-15.9099"
+       id="path9569"
+       inkscape:connector-curvature="0" />
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#marker8695-6);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 147.43176,929.68956 c -3.24422,-11.34319 -17.24529,-1.56955 -19.09188,-14.49569"
+       id="path9957"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
new file mode 100644
--- /dev/null
+++ b/docs/figures/figure-ug09.svg
@@ -0,0 +1,307 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="250"
+   height="150"
+   id="svg10360"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="figure-ug09.svg">
+  <defs
+     id="defs10362">
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible">
+      <path
+         id="path5316-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker10584"
+       style="overflow:visible">
+      <path
+         id="path10586"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM"
+       style="overflow:visible">
+      <path
+         id="path4193"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.180467"
+     inkscape:cx="119.78971"
+     inkscape:cy="57.203827"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="866"
+     inkscape:window-height="800"
+     inkscape:window-x="548"
+     inkscape:window-y="176"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata10365">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-52.986766,123.22995)">
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+       x="132.17838"
+       y="-88.939552"
+       id="text5217-8-0"
+       sodipodi:linespacing="125%"
+       transform="scale(0.9999979,1.0000021)"><tspan
+         sodipodi:role="line"
+         id="tspan8594"
+         x="132.17838"
+         y="-88.939552">hg evolve --all</tspan></text>
+    <g
+       id="g6372"
+       transform="translate(82.830913,-142.84994)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8598"
+         d="m 36.655932,74.035228 3.649333,6.320665 3.711171,-6.427764"
+         style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <g
+         transform="matrix(1,0,0,1.5998137,5.836184,-16.712267)"
+         id="g3821">
+        <path
+           style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="M 35.5,23.60911 35.5,59.5"
+           id="path8466-5"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="M 33.5,23.60911 33.5,59.5"
+           id="path8466-4-7"
+           inkscape:connector-curvature="0" />
+      </g>
+    </g>
+    <g
+       transform="matrix(1.0000032,0,0,0.99999991,52.986844,-844.35614)"
+       id="g8678-6">
+      <rect
+         y="793.80884"
+         x="0.4999997"
+         height="18.053268"
+         width="21.481806"
+         id="rect2987-4-9"
+         style="fill:none;stroke:#000000;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text5217-8-32"
+         y="807.20361"
+         x="3.4977415"
+         style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-8"
+           sodipodi:role="line"
+           x="3.4977415"
+           y="807.20361">18</tspan></text>
+    </g>
+    <g
+       id="g11168"
+       transform="translate(0,112)">
+      <rect
+         y="-162.54732"
+         x="113.48685"
+         height="18.053268"
+         width="21.481808"
+         id="rect2987-4-02-6"
+         style="fill:none;stroke:#000000;stroke-width:0.99999946;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999946, 3.99999783;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text5217-8-72-1"
+         y="-149.15291"
+         x="116.53148"
+         style="font-size:11.99999428px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-9-8"
+           sodipodi:role="line"
+           x="116.53148"
+           y="-149.15291">19</tspan></text>
+    </g>
+    <g
+       id="g11163"
+       transform="translate(0,112)">
+      <rect
+         y="-162.5473"
+         x="173.48705"
+         height="18.053268"
+         width="21.481808"
+         id="rect2987-4-026-7"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 4;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text5217-8-3-8"
+         y="-149.15244"
+         x="176.41162"
+         style="font-size:11.99999428px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-0-9"
+           sodipodi:role="line"
+           x="176.41162"
+           y="-149.15244">20</tspan></text>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       d="m 74.96872,-41.52073 38.51813,3.7e-5"
+       id="path3178-9"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-end="#g11168"
+       inkscape:connection-end-point="d4"
+       inkscape:connection-start="#g8678-6"
+       inkscape:connection-start-point="d4" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       d="m 134.96865,-41.520681 38.5184,1e-5"
+       id="path3180-1"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g11168"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g11163"
+       inkscape:connection-end-point="d4" />
+    <g
+       transform="matrix(1.0000032,0,0,0.99999991,172.98684,-795.29459)"
+       id="g8678-6-4">
+      <rect
+         y="793.80884"
+         x="0.4999997"
+         height="18.053268"
+         width="21.481806"
+         id="rect2987-4-9-5"
+         style="fill:none;stroke:#000000;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text5217-8-32-6"
+         y="807.20361"
+         x="3.4977415"
+         style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-8-9"
+           sodipodi:role="line"
+           x="3.4977415"
+           y="807.20361">21</tspan></text>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker10584)"
+       d="M 74.96872,-37.129348 173.48684,3.1494178"
+       id="path11202"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g8678-6"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g8678-6-4"
+       inkscape:connection-end-point="d4" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 3;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+       d="m 184.22792,-32.494034 -1.1e-4,31.0082104"
+       id="path4123-2"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g11163"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g8678-6-4"
+       inkscape:connection-end-point="d4" />
+    <text
+       xml:space="preserve"
+       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       x="188.27898"
+       y="-68.730186"
+       id="text11674"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan11676"
+         x="188.27898"
+         y="-68.730186">obsolete, hidden</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       x="229.09592"
+       y="4.1899796"
+       id="text11678"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan11680"
+         x="229.09592"
+         y="4.1899796">successor,</tspan><tspan
+         sodipodi:role="line"
+         x="229.09592"
+         y="16.68998"
+         id="tspan11682">working dir</tspan></text>
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#marker10584);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 224.96835,6.48307 c -14.81489,-0.42162 -8.84647,9.26545 -25.22395,4.58617"
+       id="path11688"
+       inkscape:connector-curvature="0" />
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#marker10584);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 230.01314,-64.60262 c -9.90102,12.73442 -31.46298,0.0328 -40.81693,11.46543"
+       id="path12074"
+       inkscape:connector-curvature="0" />
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#marker10584);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 225.88558,-65.97848 c -32.80764,7.84904 -73.26593,-8.64954 -95.3924,11.46544"
+       id="path12076"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
new file mode 100644
--- /dev/null
+++ b/docs/figures/figure-ug10.svg
@@ -0,0 +1,872 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="300"
+   height="400"
+   id="svg8392"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="figure-ug10.svg">
+  <defs
+     id="defs8394">
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3230"
+       style="overflow:visible">
+      <path
+         id="path3232"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible">
+      <path
+         id="path5316-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8414"
+       style="overflow:visible">
+      <path
+         id="path8416"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-7"
+       style="overflow:visible">
+      <path
+         id="path5316-7-1"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8695"
+       style="overflow:visible">
+      <path
+         id="path8697"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8695-6"
+       style="overflow:visible">
+      <path
+         id="path8697-4"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-5"
+       style="overflow:visible">
+      <path
+         id="path5316-7-0"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM"
+       style="overflow:visible">
+      <path
+         id="path4193"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-2"
+       style="overflow:visible">
+      <path
+         id="path4193-0"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-1"
+       style="overflow:visible">
+      <path
+         id="path5316-7-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3338"
+       style="overflow:visible">
+      <path
+         id="path3340"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3342"
+       style="overflow:visible">
+      <path
+         id="path3344"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-3"
+       style="overflow:visible">
+      <path
+         id="path4193-8"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-0"
+       style="overflow:visible">
+      <path
+         id="path5316-7-14"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.2724663"
+     inkscape:cx="124.3132"
+     inkscape:cy="243.92715"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="923"
+     inkscape:window-height="1064"
+     inkscape:window-x="106"
+     inkscape:window-y="54"
+     inkscape:window-maximized="0"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <metadata
+     id="metadata8397">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-559.99805)">
+    <g
+       id="g8678"
+       transform="translate(0,-214)">
+      <rect
+         y="793.80884"
+         x="0.4999997"
+         height="18.053268"
+         width="21.481806"
+         id="rect2987-4"
+         style="fill:none;stroke:#000000;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text5217-8"
+         y="807.20361"
+         x="3.4977415"
+         style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156"
+           sodipodi:role="line"
+           x="3.4977415"
+           y="807.20361">21</tspan></text>
+    </g>
+    <g
+       id="g3118"
+       transform="translate(-60.000001,578.36218)">
+      <rect
+         y="1.4467307"
+         x="120.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-02"
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         transform="scale(0.9999979,1.0000021)"
+         sodipodi:linespacing="125%"
+         id="text5217-8-72"
+         y="14.841505"
+         x="123.54487"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-9"
+           sodipodi:role="line"
+           x="123.54487"
+           y="14.841505">22</tspan></text>
+    </g>
+    <g
+       id="g3126"
+       transform="translate(-60.000192,578.36218)">
+      <rect
+         y="1.4467307"
+         x="180.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-026"
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         transform="scale(0.9999979,1.0000021)"
+         sodipodi:linespacing="125%"
+         id="text5217-8-3"
+         y="14.841505"
+         x="183.42488"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-0"
+           sodipodi:role="line"
+           x="183.42488"
+           y="14.841505">23</tspan></text>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       d="m 21.981806,588.83549 38.518193,4e-5"
+       id="path3178"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-end="#g3118"
+       inkscape:connection-end-point="d4"
+       inkscape:connection-start="#g8678"
+       inkscape:connection-start-point="d4" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       d="m 81.981738,588.83555 38.518072,0"
+       id="path3180"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g3118"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3126"
+       inkscape:connection-end-point="d4" />
+    <g
+       transform="matrix(1.0000032,0,0,0.99999991,-8.2080488e-7,-108.99993)"
+       id="g8678-6">
+      <rect
+         y="793.80884"
+         x="0.4999997"
+         height="18.053268"
+         width="21.481806"
+         id="rect2987-4-9"
+         style="fill:none;stroke:#000000;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text5217-8-32"
+         y="807.20361"
+         x="3.4977415"
+         style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-8"
+           sodipodi:role="line"
+           x="3.4977415"
+           y="807.20361">21</tspan></text>
+    </g>
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999946;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999946, 3.99999785;stroke-dashoffset:0"
+       id="rect2987-4-02-6"
+       width="21.481808"
+       height="18.053268"
+       x="60.5"
+       y="684.8089" />
+    <text
+       xml:space="preserve"
+       style="font-size:11.99999428px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="63.544647"
+       y="698.20331"
+       id="text5217-8-72-1"
+       sodipodi:linespacing="125%"><tspan
+         y="698.20331"
+         x="63.544647"
+         sodipodi:role="line"
+         id="tspan6156-9-8">22</tspan></text>
+    <g
+       id="g3126-8"
+       transform="matrix(1.0000032,0,0,0.99999991,-60.000385,683.36218)">
+      <rect
+         y="1.4467307"
+         x="180.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-026-7"
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         transform="scale(0.9999979,1.0000021)"
+         sodipodi:linespacing="125%"
+         id="text5217-8-3-8"
+         y="14.841505"
+         x="183.42488"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-0-9"
+           sodipodi:role="line"
+           x="183.42488"
+           y="14.841505">23</tspan></text>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       d="m 21.981875,693.83548 38.518126,5e-5"
+       id="path3178-9"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g8678-6"
+       inkscape:connection-start-point="d4" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       d="m 81.981808,693.83554 38.518382,0"
+       id="path3180-1"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-end="#g3126-8"
+       inkscape:connection-end-point="d4" />
+    <text
+       xml:space="preserve"
+       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       x="7.5114212"
+       y="652.66315"
+       id="text9295"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan9297"
+         x="7.5114212"
+         y="652.66315">obsolete</tspan><tspan
+         sodipodi:role="line"
+         x="7.5114212"
+         y="662.66315"
+         id="tspan9299">but visible</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       x="155.24913"
+       y="668.43335"
+       id="text9301"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan9303"
+         x="155.24913"
+         y="668.43335">unstable</tspan></text>
+    <g
+       id="g5433"
+       transform="translate(32.476727,584.47248)">
+      <text
+         transform="scale(0.9999978,1.0000022)"
+         sodipodi:linespacing="125%"
+         id="text5217-8-0"
+         y="58.841717"
+         x="46.92271"
+         style="font-size:11.99999809px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+         xml:space="preserve"><tspan
+           y="58.841717"
+           x="46.92271"
+           id="tspan8594"
+           sodipodi:role="line">hg uncommit <tspan
+   id="tspan3131"
+   style="font-style:italic">f1 f2 ...</tspan></tspan></text>
+      <g
+         transform="translate(-0.59241834,4.9316169)"
+         id="g6372-4">
+        <path
+           style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="m 36.655932,74.035228 3.649333,6.320665 3.711171,-6.427764"
+           id="path8598-5"
+           inkscape:connector-curvature="0" />
+        <g
+           id="g3821-3"
+           transform="matrix(1,0,0,1.5998137,5.836184,-16.712267)">
+          <path
+             inkscape:connector-curvature="0"
+             id="path8466-5-0"
+             d="M 35.5,23.60911 35.5,59.5"
+             style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path8466-4-7-7"
+             d="M 33.5,23.60911 33.5,59.5"
+             style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        </g>
+      </g>
+    </g>
+    <g
+       id="g3118-2"
+       transform="translate(-60.000001,733.29305)">
+      <rect
+         y="1.4467307"
+         x="120.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-02-8"
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         transform="scale(0.9999979,1.0000021)"
+         sodipodi:linespacing="125%"
+         id="text5217-8-72-3"
+         y="14.841505"
+         x="123.54487"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-9-3"
+           sodipodi:role="line"
+           x="123.54487"
+           y="14.841505">24</tspan></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       x="187.68906"
+       y="740.26349"
+       id="text3218"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan3220"
+         x="187.68906"
+         y="740.26349">working dir</tspan><tspan
+         sodipodi:role="line"
+         x="187.68906"
+         y="750.26349"
+         id="tspan4379">(with uncommitted</tspan><tspan
+         sodipodi:role="line"
+         x="187.68906"
+         y="760.26349"
+         id="tspan4381">changes to f1 f2 ...)</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       d="m 21.981875,702.7739 38.518124,32.05414"
+       id="path3178-9-5"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g8678-6"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3118-2"
+       inkscape:connection-end-point="d4" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999986, 2.99999958;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+       d="m 71.240897,702.86217 -2.2e-5,31.87761"
+       id="path4123"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#rect2987-4-02-6"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3118-2"
+       inkscape:connection-end-point="d4" />
+    <text
+       xml:space="preserve"
+       style="font-size:11.99999809px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+       x="79.694885"
+       y="791.03015"
+       id="text5217-8-0-7"
+       sodipodi:linespacing="125%"
+       transform="scale(0.9999978,1.0000022)"><tspan
+         id="tspan3316"
+         sodipodi:role="line"
+         x="79.694885"
+         y="791.03015">hg revert <tspan
+   id="tspan3314"
+   style="font-style:italic">f1 f2 ...</tspan></tspan><tspan
+         id="tspan3322"
+         sodipodi:role="line"
+         x="79.694885"
+         y="806.03015">hg evolve --all</tspan></text>
+    <g
+       id="g6372-4-2"
+       transform="translate(32.179684,745.12164)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8598-5-0"
+         d="m 36.655932,74.035228 3.649333,6.320665 3.711171,-6.427764"
+         style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <g
+         transform="matrix(1,0,0,1.5998137,5.836184,-16.712267)"
+         id="g3821-3-9">
+        <path
+           style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="M 35.5,23.60911 35.5,59.5"
+           id="path8466-5-0-9"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="M 33.5,23.60911 33.5,59.5"
+           id="path8466-4-7-7-4"
+           inkscape:connector-curvature="0" />
+      </g>
+    </g>
+    <g
+       id="g8678-6-1"
+       transform="matrix(1.0000032,0,0,0.99999991,-1e-6,45.40223)">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="rect2987-4-9-7"
+         width="21.481806"
+         height="18.053268"
+         x="0.4999997"
+         y="793.80884" />
+      <text
+         xml:space="preserve"
+         style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         x="3.4977415"
+         y="807.20361"
+         id="text5217-8-32-6"
+         sodipodi:linespacing="125%"><tspan
+           y="807.20361"
+           x="3.4977415"
+           sodipodi:role="line"
+           id="tspan6156-8-5">21</tspan></text>
+    </g>
+    <rect
+       y="839.21106"
+       x="60.5"
+       height="18.053268"
+       width="21.481808"
+       id="rect2987-4-02-6-9"
+       style="fill:none;stroke:#000000;stroke-width:0.99999946;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999946, 3.99999785;stroke-dashoffset:0" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text5217-8-72-1-2"
+       y="852.60547"
+       x="63.544647"
+       style="font-size:11.99999428px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       xml:space="preserve"><tspan
+         id="tspan6156-9-8-1"
+         sodipodi:role="line"
+         x="63.544647"
+         y="852.60547">22</tspan></text>
+    <g
+       id="g4295">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 4;stroke-dashoffset:0"
+         id="rect2987-4-026-7-9"
+         width="21.481808"
+         height="18.053268"
+         x="120.50019"
+         y="839.21106" />
+      <text
+         xml:space="preserve"
+         style="font-size:11.99999428px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         x="123.42475"
+         y="852.60547"
+         id="text5217-8-3-8-6"
+         sodipodi:linespacing="125%"><tspan
+           y="852.60547"
+           x="123.42475"
+           sodipodi:role="line"
+           id="tspan6156-0-9-3">23</tspan></text>
+    </g>
+    <path
+       inkscape:connection-start-point="d4"
+       inkscape:connection-start="#g8678-6-1"
+       inkscape:connector-curvature="0"
+       inkscape:connector-type="polyline"
+       id="path3178-9-1"
+       d="m 21.981875,848.23763 38.518124,2e-5"
+       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline" />
+    <path
+       inkscape:connector-curvature="0"
+       inkscape:connector-type="polyline"
+       id="path3180-1-7"
+       d="m 81.981809,848.23766 38.518381,3e-5"
+       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       inkscape:connection-end="#g4295"
+       inkscape:connection-end-point="d4" />
+    <g
+       transform="translate(-60.000001,887.69517)"
+       id="g3118-2-6">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="rect2987-4-02-8-4"
+         width="21.481739"
+         height="18.05327"
+         x="120.5"
+         y="1.4467307" />
+      <text
+         xml:space="preserve"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         x="123.54487"
+         y="14.841505"
+         id="text5217-8-72-3-4"
+         sodipodi:linespacing="125%"
+         transform="scale(0.9999979,1.0000021)"><tspan
+           y="14.841505"
+           x="123.54487"
+           sodipodi:role="line"
+           id="tspan6156-9-3-9">24</tspan></text>
+    </g>
+    <path
+       inkscape:connection-end-point="d4"
+       inkscape:connection-end="#g3118-2-6"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-start="#g8678-6-1"
+       inkscape:connector-curvature="0"
+       inkscape:connector-type="polyline"
+       id="path3178-9-5-1"
+       d="m 21.981875,857.17605 38.518124,32.05412"
+       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline" />
+    <path
+       inkscape:connection-end-point="d4"
+       inkscape:connection-end="#g3118-2-6"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-start="#rect2987-4-02-6-9"
+       inkscape:connector-curvature="0"
+       inkscape:connector-type="polyline"
+       id="path4123-8"
+       d="m 71.240897,857.26433 -2.2e-5,31.87757"
+       style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999986, 2.99999958;stroke-dashoffset:0;marker-start:url(#DotM);display:inline" />
+    <g
+       transform="translate(-1.0430814e-6,887.87361)"
+       id="g3118-2-6-6">
+      <rect
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="rect2987-4-02-8-4-3"
+         width="21.481739"
+         height="18.05327"
+         x="120.5"
+         y="1.4467307" />
+      <text
+         xml:space="preserve"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         x="123.54487"
+         y="14.841505"
+         id="text5217-8-72-3-4-9"
+         sodipodi:linespacing="125%"
+         transform="scale(0.9999979,1.0000021)"><tspan
+           y="14.841505"
+           x="123.54487"
+           sodipodi:role="line"
+           id="tspan6156-9-3-9-1">25</tspan></text>
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       inkscape:connector-type="polyline"
+       id="path4123-8-2"
+       d="m 131.24105,857.26433 -1.4e-4,32.05601"
+       style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999986, 2.99999958;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+       inkscape:connection-start="#g4295"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3118-2-6-6"
+       inkscape:connection-end-point="d4" />
+    <path
+       inkscape:connector-curvature="0"
+       inkscape:connector-type="polyline"
+       id="path3178-9-1-1"
+       d="M 81.981738,898.20048 120.5,898.31503"
+       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       inkscape:connection-start="#g3118-2-6"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3118-2-6-6"
+       inkscape:connection-end-point="d4" />
+    <text
+       xml:space="preserve"
+       style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       x="187.37656"
+       y="909.57391"
+       id="text4799-8-0"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="187.37656"
+         y="909.57391"
+         id="tspan4416">working dir</tspan><tspan
+         sodipodi:role="line"
+         x="187.37656"
+         y="922.07391"
+         id="tspan4420">(clean)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       x="175.91385"
+       y="840.83063"
+       id="text4404"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan4406"
+         x="175.91385"
+         y="840.83063">obsolete,</tspan><tspan
+         sodipodi:role="line"
+         x="175.91385"
+         y="850.83063"
+         id="tspan4408">hidden,</tspan><tspan
+         sodipodi:role="line"
+         x="175.91385"
+         y="860.83063"
+         id="tspan4410">precursors</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       x="53.690826"
+       y="380.35703"
+       id="text4412"
+       sodipodi:linespacing="100%"
+       transform="translate(0,559.99805)"><tspan
+         sodipodi:role="line"
+         id="tspan4414"
+         x="53.690826"
+         y="380.35703">successors</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       x="187.37656"
+       y="571.41107"
+       id="text4799-8-0-8"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="187.37656"
+         y="571.41107"
+         id="tspan4416-9">working dir</tspan><tspan
+         sodipodi:role="line"
+         x="187.37656"
+         y="583.91107"
+         id="tspan4420-1">(clean)</tspan></text>
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#Arrow2Mend-2-0)"
+       d="M 182.62097,9.6751729 C 149.31312,5.6732792 109.12827,-5.7223311 84.489703,18.916234"
+       id="path4446"
+       inkscape:connector-curvature="0"
+       transform="translate(0,559.99805)" />
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#Arrow2Mend-2-0)"
+       d="m 182.62097,177.33443 c -11.66919,2.11797 -39.69025,-8.27526 -48.84561,0.8801 -4.08681,4.08681 5.91098,7.3857 -1.32015,11.00126 -8.45778,4.22889 -37.224994,-3.5204 -45.765254,-3.5204"
+       id="path4452"
+       inkscape:connector-curvature="0"
+       transform="translate(0,559.99805)" />
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#Arrow2Mend-2-0)"
+       d="m 173.37991,274.14555 c -26.50591,-25.47484 -62.13868,-7.60786 -86.249903,3.5204"
+       id="path4458"
+       inkscape:connector-curvature="0"
+       transform="translate(0,559.99805)" />
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#Arrow2Mend-2-0)"
+       d="m 172.05976,275.4657 c -15.34118,-5.10156 -27.83143,-16.04735 -35.64409,0.8801"
+       id="path4466"
+       inkscape:connector-curvature="0"
+       transform="translate(0,559.99805)" />
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#Arrow2Mend-2-0)"
+       d="m 184.38118,349.39419 c -17.09613,-2.47468 -18.70357,-14.67863 -38.2844,-11.88137"
+       id="path4468"
+       inkscape:connector-curvature="0"
+       transform="translate(0,559.99805)" />
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#Arrow2Mend-2-0)"
+       d="m 90.21036,370.95666 c 5.346579,-17.09267 25.584,-5.21534 35.20404,-18.04207"
+       id="path4690"
+       inkscape:connector-curvature="0"
+       transform="translate(0,559.99805)" />
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#Arrow2Mend-2-0)"
+       d="M 87.570057,370.95666 C 90.583364,353.5751 71.256395,368.31133 69.968036,350.27429"
+       id="path4694"
+       inkscape:connector-curvature="0"
+       transform="translate(0,559.99805)" />
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#Arrow2Mend-2-0)"
+       d="m 29.043336,106.04624 c 9.697316,11.54911 30.278008,-0.41536 36.084144,15.84182"
+       id="path4908"
+       inkscape:connector-curvature="0"
+       transform="translate(0,559.99805)" />
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#Arrow2Mend-2-0)"
+       d="m 152.25749,104.72609 c -14.85295,-1.56817 -17.66404,5.2687 -18.48213,16.72192"
+       id="path5120"
+       inkscape:connector-curvature="0"
+       transform="translate(0,559.99805)" />
+  </g>
+</svg>
new file mode 100644
--- /dev/null
+++ b/docs/figures/figure-ug11.svg
@@ -0,0 +1,659 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="250"
+   height="260"
+   id="svg8392"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="figure-ug11.svg">
+  <defs
+     id="defs8394">
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3230"
+       style="overflow:visible">
+      <path
+         id="path3232"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible">
+      <path
+         id="path5316-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8414"
+       style="overflow:visible">
+      <path
+         id="path8416"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-7"
+       style="overflow:visible">
+      <path
+         id="path5316-7-1"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8695"
+       style="overflow:visible">
+      <path
+         id="path8697"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker8695-6"
+       style="overflow:visible">
+      <path
+         id="path8697-4"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-5"
+       style="overflow:visible">
+      <path
+         id="path5316-7-0"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM"
+       style="overflow:visible">
+      <path
+         id="path4193"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-2"
+       style="overflow:visible">
+      <path
+         id="path4193-0"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-1"
+       style="overflow:visible">
+      <path
+         id="path5316-7-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3338"
+       style="overflow:visible">
+      <path
+         id="path3340"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3342"
+       style="overflow:visible">
+      <path
+         id="path3344"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-3"
+       style="overflow:visible">
+      <path
+         id="path4193-8"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-0"
+       style="overflow:visible">
+      <path
+         id="path5316-7-14"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-8"
+       style="overflow:visible">
+      <path
+         id="path5316-7-6"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-0-3"
+       style="overflow:visible">
+      <path
+         id="path5316-7-14-4"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-0-5"
+       style="overflow:visible">
+      <path
+         id="path5316-7-14-6"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2"
+     inkscape:cx="131.9535"
+     inkscape:cy="63.06899"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="923"
+     inkscape:window-height="1064"
+     inkscape:window-x="75"
+     inkscape:window-y="87"
+     inkscape:window-maximized="0"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <metadata
+     id="metadata8397">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-551.69805)">
+    <g
+       id="g8678"
+       transform="translate(0,-222)">
+      <rect
+         y="793.80884"
+         x="0.4999997"
+         height="18.053268"
+         width="21.481806"
+         id="rect2987-4"
+         style="fill:none;stroke:#000000;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text5217-8"
+         y="807.20361"
+         x="3.4977415"
+         style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156"
+           sodipodi:role="line"
+           x="3.4977415"
+           y="807.20361">25</tspan></text>
+    </g>
+    <g
+       id="g3118"
+       transform="translate(-60.000001,570.36218)">
+      <rect
+         y="1.4467307"
+         x="120.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-02"
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         transform="scale(0.9999979,1.0000021)"
+         sodipodi:linespacing="125%"
+         id="text5217-8-72"
+         y="14.841505"
+         x="123.54487"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-9"
+           sodipodi:role="line"
+           x="123.54487"
+           y="14.841505">26</tspan></text>
+    </g>
+    <g
+       id="g3126"
+       transform="translate(-60.000192,570.36218)">
+      <rect
+         y="1.4467307"
+         x="180.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-026"
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         transform="scale(0.9999979,1.0000021)"
+         sodipodi:linespacing="125%"
+         id="text5217-8-3"
+         y="14.841505"
+         x="183.42488"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-0"
+           sodipodi:role="line"
+           x="183.42488"
+           y="14.841505">27</tspan></text>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       d="m 21.981806,580.83549 38.518193,4e-5"
+       id="path3178"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-end="#g3118"
+       inkscape:connection-end-point="d4"
+       inkscape:connection-start="#g8678"
+       inkscape:connection-start-point="d4" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       d="m 81.981738,580.83555 38.518072,0"
+       id="path3180"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g3118"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3126"
+       inkscape:connection-end-point="d4" />
+    <g
+       transform="matrix(1.0000032,0,0,0.99999991,-8.2080488e-7,-108.66406)"
+       id="g8678-6">
+      <rect
+         y="793.80884"
+         x="0.4999997"
+         height="18.053268"
+         width="21.481806"
+         id="rect2987-4-9"
+         style="fill:none;stroke:#000000;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text5217-8-32"
+         y="807.20361"
+         x="3.4977415"
+         style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-8"
+           sodipodi:role="line"
+           x="3.4977415"
+           y="807.20361">25</tspan></text>
+    </g>
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999946;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999946, 3.99999785;stroke-dashoffset:0"
+       id="rect2987-4-02-6"
+       width="21.481808"
+       height="18.053268"
+       x="60.5"
+       y="685.14484" />
+    <text
+       xml:space="preserve"
+       style="font-size:11.99999428px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="63.544647"
+       y="698.53925"
+       id="text5217-8-72-1"
+       sodipodi:linespacing="125%"><tspan
+         y="698.53925"
+         x="63.544647"
+         sodipodi:role="line"
+         id="tspan6156-9-8">26</tspan></text>
+    <g
+       id="g3126-8"
+       transform="matrix(1.0000032,0,0,0.99999991,-60.000385,683.69805)">
+      <rect
+         y="1.4467307"
+         x="180.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-026-7"
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         transform="scale(0.9999979,1.0000021)"
+         sodipodi:linespacing="125%"
+         id="text5217-8-3-8"
+         y="14.841505"
+         x="183.42488"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-0-9"
+           sodipodi:role="line"
+           x="183.42488"
+           y="14.841505">27</tspan></text>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       d="m 21.981875,694.17135 38.518126,5e-5"
+       id="path3178-9"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g8678-6"
+       inkscape:connection-start-point="d4" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       d="m 81.981808,694.17141 38.518382,0"
+       id="path3180-1"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-end="#g3126-8"
+       inkscape:connection-end-point="d4" />
+    <text
+       xml:space="preserve"
+       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       x="6.5114212"
+       y="652.66315"
+       id="text9295"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         id="tspan9297"
+         x="6.5114212"
+         y="652.66315">obsolete</tspan><tspan
+         sodipodi:role="line"
+         x="6.5114212"
+         y="662.66315"
+         id="tspan9299">but visible</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       x="159.24913"
+       y="668.43335"
+       id="text9301"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan9303"
+         x="159.24913"
+         y="668.43335">unstable</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:11.99999809px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+       x="79.399506"
+       y="627.31293"
+       id="text5217-8-0"
+       sodipodi:linespacing="125%"
+       transform="scale(0.9999978,1.0000022)"><tspan
+         sodipodi:role="line"
+         id="tspan8594"
+         x="79.399506"
+         y="627.31293">hg uncommit <tspan
+   style="font-style:italic"
+   id="tspan3131">f1 f2 ...</tspan></tspan><tspan
+         sodipodi:role="line"
+         x="79.399506"
+         y="642.31293"
+         id="tspan3124">hg commit</tspan></text>
+    <g
+       id="g6372-4"
+       transform="translate(31.884309,581.4041)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path8598-5"
+         d="m 36.655932,74.035228 3.649333,6.320665 3.711171,-6.427764"
+         style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <g
+         transform="matrix(1,0,0,1.5998137,5.836184,-16.712267)"
+         id="g3821-3">
+        <path
+           style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="M 35.5,23.60911 35.5,59.5"
+           id="path8466-5-0"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="M 33.5,23.60911 33.5,59.5"
+           id="path8466-4-7-7"
+           inkscape:connector-curvature="0" />
+      </g>
+    </g>
+    <g
+       id="g3118-2"
+       transform="translate(-60.000001,733.69805)">
+      <rect
+         y="1.4467307"
+         x="120.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-02-8"
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         transform="scale(0.9999979,1.0000021)"
+         sodipodi:linespacing="125%"
+         id="text5217-8-72-3"
+         y="14.841505"
+         x="123.54487"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-9-3"
+           sodipodi:role="line"
+           x="123.54487"
+           y="14.841505">28</tspan></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       x="187.37656"
+       y="781.10907"
+       id="text3218"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         x="187.37656"
+         y="781.10907"
+         id="tspan4381">working dir</tspan><tspan
+         sodipodi:role="line"
+         x="187.37656"
+         y="791.10907"
+         id="tspan3635">(clean)</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       d="m 21.981875,703.12214 38.518124,32.09853"
+       id="path3178-9-5"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g8678-6"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3118-2"
+       inkscape:connection-end-point="d4" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999986, 2.99999958;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+       d="m 71.240897,703.1981 -2.2e-5,31.94668"
+       id="path4123"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#rect2987-4-02-6"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3118-2"
+       inkscape:connection-end-point="d4" />
+    <text
+       xml:space="preserve"
+       style="font-size:9.99999905px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       x="187.37656"
+       y="563.41107"
+       id="text4799-8-0-8"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="187.37656"
+         y="563.41107"
+         id="tspan4416-9">working dir</tspan><tspan
+         sodipodi:role="line"
+         x="187.37656"
+         y="575.91107"
+         id="tspan4420-1">(clean)</tspan></text>
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#Arrow2Mend-2-0);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 182.62097,561.67322 c -33.30785,-4.00189 -73.4927,-15.3975 -98.131267,9.24106"
+       id="path4446"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g3118-2-4"
+       transform="translate(-1.0430813e-6,783.69805)">
+      <rect
+         y="1.4467307"
+         x="120.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-02-8-7"
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         transform="scale(0.9999979,1.0000021)"
+         sodipodi:linespacing="125%"
+         id="text5217-8-72-3-7"
+         y="14.841505"
+         x="123.54487"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-9-3-0"
+           sodipodi:role="line"
+           x="123.54487"
+           y="14.841505">29</tspan></text>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       d="M 81.981738,753.12214 120.5,785.22069"
+       id="path3180-1-6"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g3118-2"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3118-2-4"
+       inkscape:connection-end-point="d4" />
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#Arrow2Mend-2-0);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 30.44802,666.70515 c 9.697316,11.54911 30.278008,-0.41536 36.084144,15.84182"
+       id="path4908"
+       inkscape:connector-curvature="0" />
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#Arrow2Mend-2-0);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 155.00217,664.33755 c -14.85295,-1.56817 -17.66404,5.2687 -18.48213,16.72192"
+       id="path5120"
+       inkscape:connector-curvature="0" />
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;marker-end:url(#Arrow2Mend-2-0-5)"
+       d="m 184.5,777.49805 c -23.81983,-9.8642 -42.3145,-20.8823 -51.5,3"
+       id="path3662"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
new file mode 100644
--- /dev/null
+++ b/docs/figures/figure-ug12.svg
@@ -0,0 +1,606 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="270"
+   height="200"
+   id="svg3183"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="figure-ug12.svg">
+  <defs
+     id="defs3185">
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-0"
+       style="overflow:visible">
+      <path
+         id="path5316-7-14"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3206"
+       style="overflow:visible">
+      <path
+         id="path3208"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3210"
+       style="overflow:visible">
+      <path
+         id="path3212"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3214"
+       style="overflow:visible">
+      <path
+         id="path3216"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3218"
+       style="overflow:visible">
+      <path
+         id="path3220"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2"
+       style="overflow:visible">
+      <path
+         id="path5316-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM"
+       style="overflow:visible">
+      <path
+         id="path4193"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3226"
+       style="overflow:visible">
+      <path
+         id="path3228"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3230"
+       style="overflow:visible">
+      <path
+         id="path3232"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3234"
+       style="overflow:visible">
+      <path
+         id="path3236"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker3238"
+       style="overflow:visible">
+      <path
+         id="path3240"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-1"
+       style="overflow:visible">
+      <path
+         id="path5316-7-7"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-8"
+       style="overflow:visible">
+      <path
+         id="path4193-8"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker6080"
+       style="overflow:visible">
+      <path
+         id="path6082"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker6084"
+       style="overflow:visible">
+      <path
+         id="path6086"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker6088"
+       style="overflow:visible">
+      <path
+         id="path6090"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-3"
+       style="overflow:visible">
+      <path
+         id="path5316-7-2"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-5"
+       style="overflow:visible">
+      <path
+         id="path4193-3"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-2-0-5"
+       style="overflow:visible">
+      <path
+         id="path5316-7-14-6"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2"
+     inkscape:cx="121.99883"
+     inkscape:cy="102.73738"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="825"
+     inkscape:window-height="678"
+     inkscape:window-x="413"
+     inkscape:window-y="279"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata3188">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-852.36218)">
+    <g
+       id="g4234"
+       transform="translate(2,-8)">
+      <text
+         transform="scale(0.9999978,1.0000022)"
+         sodipodi:linespacing="125%"
+         id="text5217-8-0-7"
+         y="900.3703"
+         x="76.696045"
+         style="font-size:11.99999809px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Monospace;-inkscape-font-specification:Monospace"
+         xml:space="preserve"><tspan
+           y="900.3703"
+           x="76.696045"
+           sodipodi:role="line"
+           id="tspan3322">hg evolve --all</tspan></text>
+      <g
+         transform="translate(29.180861,844.4619)"
+         id="g6372-4-2">
+        <path
+           style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           d="m 36.655932,74.035228 3.649333,6.320665 3.711171,-6.427764"
+           id="path8598-5-0"
+           inkscape:connector-curvature="0" />
+        <g
+           id="g3821-3-9"
+           transform="matrix(1,0,0,1.5998137,5.836184,-16.712267)">
+          <path
+             inkscape:connector-curvature="0"
+             id="path8466-5-0-9"
+             d="M 35.5,23.60911 35.5,59.5"
+             style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path8466-4-7-7-4"
+             d="M 33.5,23.60911 33.5,59.5"
+             style="fill:none;stroke:#808080;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        </g>
+      </g>
+    </g>
+    <g
+       transform="matrix(1.0000032,0,0,0.99999991,-8.2250019e-7,130.00002)"
+       id="g8678-6">
+      <rect
+         y="793.80884"
+         x="0.4999997"
+         height="18.053268"
+         width="21.481806"
+         id="rect2987-4-9"
+         style="fill:none;stroke:#000000;stroke-width:0.9999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text5217-8-32"
+         y="807.20361"
+         x="3.4977415"
+         style="font-size:11.99999332px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-8"
+           sodipodi:role="line"
+           x="3.4977415"
+           y="807.20361">25</tspan></text>
+    </g>
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999946;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999946, 3.99999785;stroke-dashoffset:0"
+       id="rect2987-4-02-6"
+       width="21.481808"
+       height="18.053268"
+       x="60.5"
+       y="923.8089" />
+    <text
+       xml:space="preserve"
+       style="font-size:11.99999428px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+       x="63.544647"
+       y="937.20331"
+       id="text5217-8-72-1"
+       sodipodi:linespacing="125%"><tspan
+         y="937.20331"
+         x="63.544647"
+         sodipodi:role="line"
+         id="tspan6156-9-8">26</tspan></text>
+    <g
+       id="g4904">
+      <rect
+         y="923.80884"
+         x="120.50019"
+         height="18.053268"
+         width="21.481808"
+         id="rect2987-4-026-7"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1, 4;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text5217-8-3-8"
+         y="937.20325"
+         x="123.42475"
+         style="font-size:11.99999428px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-0-9"
+           sodipodi:role="line"
+           x="123.42475"
+           y="937.20325">27</tspan></text>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       d="m 21.981875,932.83543 38.518126,5e-5"
+       id="path3178-9"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g8678-6"
+       inkscape:connection-start-point="d4" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       d="m 81.981805,932.83549 38.518385,-1e-5"
+       id="path3180-1"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-end="#g4904"
+       inkscape:connection-end-point="d4" />
+    <g
+       id="g3118-2"
+       transform="translate(-60.000001,972.36213)">
+      <rect
+         y="1.4467307"
+         x="120.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-02-8"
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         transform="scale(0.9999979,1.0000021)"
+         sodipodi:linespacing="125%"
+         id="text5217-8-72-3"
+         y="14.841505"
+         x="123.54487"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-9-3"
+           sodipodi:role="line"
+           x="123.54487"
+           y="14.841505">28</tspan></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       x="188.87656"
+       y="965.77319"
+       id="text3218"
+       sodipodi:linespacing="100%"><tspan
+         sodipodi:role="line"
+         x="188.87656"
+         y="965.77319"
+         id="tspan4381">working dir</tspan><tspan
+         sodipodi:role="line"
+         x="188.87656"
+         y="975.77319"
+         id="tspan3635">(clean)</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       d="m 21.981875,941.78622 38.518124,32.09853"
+       id="path3178-9-5"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g8678-6"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3118-2"
+       inkscape:connection-end-point="d4" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999986, 2.99999958;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+       d="m 71.240897,941.86217 -2.2e-5,31.94669"
+       id="path4123"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#rect2987-4-02-6"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3118-2"
+       inkscape:connection-end-point="d4" />
+    <g
+       id="g3118-2-4"
+       transform="translate(-8.2250019e-7,1022.3622)">
+      <rect
+         y="1.4467307"
+         x="120.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-02-8-7"
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         transform="scale(0.9999979,1.0000021)"
+         sodipodi:linespacing="125%"
+         id="text5217-8-72-3-7"
+         y="14.841505"
+         x="123.54487"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-9-3-0"
+           sodipodi:role="line"
+           x="123.54487"
+           y="14.841505">29</tspan></text>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       d="M 81.981738,991.78623 120.5,1023.8848"
+       id="path3180-1-6"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g3118-2"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3118-2-4"
+       inkscape:connection-end-point="d4" />
+    <g
+       id="g3126-8-4"
+       transform="matrix(1.000012,0,0,0.99999991,-60.002151,972.36218)">
+      <rect
+         y="1.4467307"
+         x="180.5"
+         height="18.05327"
+         width="21.481739"
+         id="rect2987-4-026-7-1"
+         style="fill:none;stroke:#000000;stroke-width:0.99999791;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         transform="scale(0.9999979,1.0000021)"
+         sodipodi:linespacing="125%"
+         id="text5217-8-3-8-6"
+         y="14.841505"
+         x="183.42488"
+         style="font-size:11.9999752px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+         xml:space="preserve"><tspan
+           id="tspan6156-0-9-7"
+           sodipodi:role="line"
+           x="183.42488"
+           y="14.841505">30</tspan></text>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.00000155px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend-2);display:inline"
+       d="m 81.981738,982.8355 38.518272,4e-5"
+       id="path3180-1-4"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g3118-2"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3126-8-4"
+       inkscape:connection-end-point="d4" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:0.99999986, 2.99999958;stroke-dashoffset:0;marker-start:url(#DotM);display:inline"
+       d="m 131.24108,941.86211 -5e-5,31.9468"
+       id="path4123-8"
+       inkscape:connector-type="polyline"
+       inkscape:connector-curvature="0"
+       inkscape:connection-start="#g4904"
+       inkscape:connection-start-point="d4"
+       inkscape:connection-end="#g3126-8-4"
+       inkscape:connection-end-point="d4" />
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#Arrow2Mend-2-0-5);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 187.75,968.15572 c -23.81983,-9.8642 -42.3145,-20.8823 -51.5,3"
+       id="path3662"
+       inkscape:connector-curvature="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:10px;font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Italic"
+       x="175"
+       y="154.5"
+       id="text5013"
+       sodipodi:linespacing="100%"
+       transform="translate(0,852.36218)"><tspan
+         sodipodi:role="line"
+         id="tspan5015"
+         x="175"
+         y="154.5">two heads!</tspan><tspan
+         sodipodi:role="line"
+         x="175"
+         y="164.5"
+         id="tspan5019">(merge or rebase)</tspan></text>
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#Arrow2Mend-2-0-5);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 170,152.5 c -16.09308,-9.35441 4.39162,-25.49226 -23.5,-23.5"
+       id="path5021"
+       inkscape:connector-curvature="0"
+       transform="translate(0,852.36218)" />
+    <path
+       style="color:#000000;fill:none;stroke:#707070;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;marker-end:url(#Arrow2Mend-2-0-5);visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       d="m 169,153 c -11.30259,8.89405 -8.87795,25.5 -24,25.5"
+       id="path5025"
+       inkscape:connector-curvature="0"
+       transform="translate(0,852.36218)" />
+  </g>
+</svg>
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..33a51d7ff74e28deb36d96c5d708ff4fd22983a5
GIT binary patch
literal 217868
zc${2&1yCG8*X`g0hu{uD0>Ry#0E-59cXzko5<IvCcZc8-2q9P&cMa~cxW3Kz*Z03y
zud8-vcciEL_PytxGc`9_MM(x7g%||@0CYK7DOCV~$ANwXkzt{Gx-*HLpc^<h2|0CS
zWaQ;d<qhaxB6n$RcQq$VcP|rH3&6_J$-#oz&CJ!p!qLsz$^8tjR|Ehk0XZpgb?=<x
zTrYq1!J9rX^Rge0g_`U;c!}VN&fsrX)F^Y2WY~D9BI-=WLHlaB(&EpHDio^4vKj|b
zS4#WEz(IE7;;Mb;&h1c`#iBir7w;n1?&BJg)2R}_+j0))-WVEy82ZDQjSvmGxeEt^
zLtuL<2K$WJ#zXe4VS})s2dD+Iw0oXZ)Z{<^FwR2oT3=1Ew<Y?Y3!v92xJ4ocZw=k@
zwh$7cm9__qA`_zh8c$=6%+`fRL!8#{TSG+q?;X^T7VP_s|9h!N@OVTYA%A1t-YZFQ
zUt+0~=Axu}9aaUg=4ELIMuvb*gfbr^=L}e3OEhKtTy?&8?bmCDu`Uv1SJAQmIB>*1
zB4oDLkV=(1b-RYVqXNO2{adXmWH-Q&zWYy@Zg6(W$Ijm#uAJ-P*`IeI#U>K)J%bsR
zzdzJfTiar15!{7v>FIX0{t!;ys{r2%-K2agJ?bmtgt_KD%}*TP=zU-J`C}dYOVBl_
z-Urg->*<~MQAy0z*P<?S;e*b%@W*x|ZW&uR*Xuh41{ENG=9R^m7)I2o`4uxHpPso5
z>6e{(0nd-8Ue=dszqu*vb;&38H?qK(Vt<!UN;hKrs@2M#@Y@;BsV36=1MxoZC+M)w
zt2>m~{ZSHTyhMHMP>wmf!SEui5{mS4<Hs)~hMXm0Fl-Xm=xc~z^7ksKf2tr5Mw#EA
zUkhzVL*kQWKP}gBCp?c*NL3+>=;*z9SGUO7uSeBoBk~qLeYNTxfnkUs(H&WFH786d
z`^D=LqAoJBpAszS-FX1^OW=K-G#_klq=#mtC|yQ2mNISUuK2fbZ!%OlqqpY#-gr@A
z7xyXouy&(**?k^#SPMBDjea@^Fb1k$f}kdZk*KIeAWPoP919@L$$4>`okO1|?S?RP
zDf0)=osW=P7d;WM2x+~qEuff4t)3p(_zqlbn7Z|W$1B0D{i7{W&b<UL+;?JjnETHt
z9cf}0b<|r4Z+7X1dLIn)O#?9Ui#VRk?*f08-`kCI8iwBu>t!#%DnBS=t&|LW7vKM9
z5>f9P<x>}?I;E;o#tr_f*^Nv1=c;o?A(=tjBU4FUF>>44_V1U%;CX)MeUH-JChVWr
zZv@_z%9WplZj|~Ef4)v)#QnEK7XoT~ZsG02E|{~AMDtGm6^D}L2(>l-V2Fn=Ro9;x
z9|E?PNrCZ*V3EbZU$uub^stA7T|!H+v~O@fOL~b%vLh2v;@-7Kh@<VyWztawAd{fg
zd|7g|m}U$YS0_F^qk73OW<!^C(6w*UaFb+A(2Dxxe9hDPVXn{yT^!UeQ~czW&kg72
zZ%Ke7pbr*rM5HjQaub{ErTM`C?=kn6bNk(d?%})W`3%!>OO!7nIE15NHm<g|k+6F-
zGYUplYbwilE#27#FXVp{<Z|~Ks$jOH6$7+3y27&#j>brG3_dNJ??2#D(}+h2;lYyO
zj!z)ky)+{_g(|bQ_hGhLbv33x_UsZVcTZRq+m9DM(VTOL9*&)+YzWYQ{)7Z0N6qGx
zORy4TWwgwFmEUH`B8v0CRF?OKO)>TysoD}B*)~M{TgaPgY1xO5cjR+A24b*CGzwx<
zJOj|>EbX_$a1qlHTOjm#E>oPx)riXB=A28Lw}Rc&`t_kRkzqr`?LG<XEf#$9`C0Dk
zWMhPb?nJyjT4~9|p^TiK7aR%1FRGmgiWg^ZmHlUDRGSgAAbp;0Y3S3{cMnH4H9wX&
zQt%0^V}BS+z|Un|;Pn|3Q&h*B=~C28+xG>~AcnfQr68qjoKYc8(`=j*DjXFJA~Be-
zWgx;=Wk4Yd9YeL>n9Z^0#g`ZcKtS+UlMnd^caxLwFO*Qol5*#2@V_r8O@j^n!G(I-
z(`ls^8~k6~G|m!+2hN|y`P%NlJ#f#DH;%RpY|JE2xF-LO>soqE;8^r5T5H}$Q6duq
zjEsy~y2*4!f4*mrr%lY(sxnAw@s&=tWv)~H>#WTt8ia7#pCvlJN8a)$^(%2q*Hgb!
z?<=kQj_A#AxCZu!iPVJu+_^L}I2A=f9w{5WB{|)w&3<snP}nc5Hpb$^+#073Y~V2a
zztP#OHtUyA7n9>CIB<c3aqW3#MjG+#=)X`Hn4oMf7f#xy*Juku+HDG|pi>Kr%I^B$
zkY}JPU)EgR9!6~(R)jf?A~z?I8l&PT3w3^>0Ga<_ct-FK0~^TklrC3^1>O;_qaAd{
zFr1!ODxcFNV~enbXfl?>dWuTZ`bq40{$&Z{Z?#v~^On3Vl#0V;s3Jq`Y3Rs}M2-|o
ztrZAA;Kv@~mVd>QFU_cig?&6vG`5AikN+6o)>47c{yBn+1T?}ZdUyX`ToveJ8w<)O
zlAWgFlIP0<Gn9{g;J7^|q)myE&`Kg9a8?ZuD|~;OSwycaB_mBlT{MwDi@NB`WPQ}$
zTr+*JO~!;^{w^x!LNayrdLUwJ@!m2iicU7qqV49Q<59*vIjX#alb2MfZ2G`mQ(c`6
zZNP;z2>t5AXd{<m%6#JJ4o9W}OZr>*$qWfo|3;{})2)P^nmV&|6HB*~A}O9;B5An?
zs6ZglQj6WZ|J<`R17&uB*-*S9GcujAfah_W@upX|uP4g;^pu@18bSm2hA{bbRQgIW
z4ApGL#E9~#ZqIqu$No*@KV0CIVJRw7;}6p(cvzUexe|-jc(pIQ>baFG7IU!c?wIo@
zZ}G*qs`C>@-1`h*XW<L8b?6OL3g}_%p7QI^q=RM{-<*F-bY2zw#cPhx(g)G^1uZ+*
z;CJu%`1pJbrQ+sq4_N;0?C^-%BR~r-GQ)iP_wUXqf))yi_#b?v(MAFm{qoAnDccq<
z#cTz-s@bfsUvcs9W;Z-eL_ItpJvkW*QGdv;;bG7QE`*%E^RGRe=CeO1Bf3Z1of8MB
z>gebg8lJif?6|f|6kx>;Le0jQI>j~aqHkkkqoI+iRHjxniyvE3Utiz#ujyB)M?^-(
zN)>P<dk7dnM;L|TWZ^6XcF|Xp|765s*fr7XlwfLRf#q|rJ41$s_%5s;v{wKM7g0d!
zS)++}!Ani^j0;{lW=d}YF{NR_7bHZ9r1&s#aK!BSRH)+<ts-L5m>h1;4E`<AV~rlf
zl}ps{qz7M+g55~-^|l{Orumx&*SZ7lLW=}ZnZ}px7q0d&ZZFC=B@f45k9N(58ktct
ze|od9vUk9p3t_=y_QAmbNF1oRj3+M%FIjwiHr8jjpE>ReipM&P2cu=Xb!(Eb0Z*g>
z7a;)bvhpZOzWsTFFTU=DqAY2km!eDBcvyn?52R~v&70)ALu^dUrO-g<IO0FHCp3$a
zw-qcyfasRn)g_cYKKI>W8721lc!wiBHZGQ}xFmehUSs*Y!_j(guR5bcdB;s|SC)Zs
zPl?uY)8fab#RAPyKJpxvw9Tj}<mdRUd!ERn?}l>X>8wxJ!(i~9&zfli7X0TN*WXo?
z__0J04a+B%O*%!BzjrPxq02p`+PQk_%$J;;%!D7SREDZ6A&N^t5Lvh|hXQtC8s%xh
zMVE9&H)+?L@<*e?omnK)cEAYG);HHDsT%bILg=F36KUv|3uFbc<P_?ofnAki3Xd^5
zWtplP`GH`3Ilg!ZT97q-CcC1N*lpC--EGhMC^nZg4hunOKXKxCA4F*MGL=Pe$YqEn
zjr_^`=!2T?uaCBexP8m^ZD*%~D?=W>nMRMURZ^umvDT3(Nr1Te8Gk@PR4zSocIalX
zHsp3Ev<zYt=&h0qd%w9o_*bKo)s7p5U=#-s!xB0t1;YUYY#K@;`t*Bzd0Retk^QQp
z8GknWQ3<A;$%7&1R9~~llaiA5m1m62eC`{XtSopd+j%;>)od#bt9FQe1y8H1tD(jb
z33%YLt`OmK`70$M5%N*(7J~a8>hjpw*h+?%lOri#WpM~fO5XDYR*y9wfnL?e9V8=;
z7n{ngz<C^*)h`~IOz}l~sDoSq>{T0Se_VtxNpAJGrA=FOcTD*rHj#BZwzLgf)k6*6
zntSvcQ8X=*QcyTS5tJ@v(cY7f6hAhcM$TNqnUp>i6!+20#-?Im6B=VE;UQaXP@jq4
zk}&5P%jC2=S!yYG->%`hMJO>!*A~&7wQI&!@a@lO@D^Vl5`ps9U4sHz)x13##@w2I
z*-z9Vr3M}KVGH}CLhbM5rDbc;dDCFt*NxLP!uhO;&}2o=f`}C@6;j?kk+&0i-W2w7
zgNR05p%El>POgvnWw$DFWBv7_Z{{Mm^Lw3HM^@`%z56}!Z9|aYZYuaSxr&QP&EUF4
z-2GNt00wX*B2%Jk4GY*ia&QvD-fk}NFY;N8CvB1FhX?^b;J#*8GLC6x8NYLkMg-!K
z(zcQygS*Buo*LIDbB5mc62$Rc=%;I{C7S74nj?59;PYa>&;kRAka5e=@zL1W__Wa-
z0yno+E$X)Kk2IW|YBicE=4S9B0;KVO|C+`Q;*gLm2M?yDrrNYD9ZNte;iTUpc`3xr
zo(nm7HF^^G4O*{y35dSdabluV-0kHDVNi&4z0@wiW%{s0ka)?v>K7B|9!#;gK5ni^
z5{&SDGhjM0<;zuq3_3;b3Ng;e?S!At5AC>Sj$4NQm?)4$N~YnDcN56n+1WuGkfp&X
zQGEk=cCK1BCD9zX3qT+cH&@rCW*fD9!BhT#{v#VE78a497yn2MvJjT1-GLK*dj$CT
zM9pb`w9-xN1+plHDb1V@YBoOcYVT9ylRubdh9v)vuCIrU{lF-|Au#7$^9XfqdSuvO
zV8bRv)J<f_emEq8lO)W`B%_oXU=G++iqnjyZr}zD2Y=y_WAE5^E|H+K)c)RQ&F_48
znE%MauZ_rns1)()I(xxOkv=GONAeD1YWaNdvYR73!onwhPbYr#16$9N*lm{X#kQUr
z{%atQLe*cNwS#RIlErl|%Xo^MQ<-l|cismVQEaqBa4;Lr92O-O;I&1n0!6ON3I1HA
zc%)O^K77R#J!Rbob9I|p*Uvksmpqh@Xk>6J?51JU2VYPyz4BdT*rCwwxZdd{+Z$Lh
zJly41Ie>nnaqdj&b-cjdZODord!(1f=ADO$iOI^$EbMiv|9AsKX!gPnHK4BVUaDWy
z8Oa(g1Bjtej$j~(Mm$NXS!qpp)|rws=y7u8GaQnol@&cb{d^fqgh}jZjTvII+cH{|
zo*#|9@Yka0NIm<U*i8j|f_iwcr1Qs^bCck(u&~BP4&a*&@wn9nUu|O}G)3BS5!YzS
zCl?QzHfS^9;o;HJ($b~80gywYpdkE_BRGzPSLD18E)XXyJRI*otw8kc+qW8w8qOZG
z+u2S%J_jY~6YSzx0=czDy@76fe;np(4J0+Fa(LIg&F(LE_WtBnS@G9cHVd~!aCt+Z
z2Rp4N3)RY$_(|i-%gg`d3M%Icc<fIU0QGkBweMu&g<hW^*9^VlC_jwhsp|!?lB8Vb
zY%)RgpUMp|B4w$WyIti<65>JjLlFJ;-0rOQSJ1ABgE~pxR<iG!>t)@#x-Z<2OLv6w
z#y#abv?GQl0z1t*{kui~x|G*@<G{K##V)3dGGm-*^|I-bW_dCJ`#a{)h&CkZp!<W!
zlGjI@=h7PSdDT}OScwf`-L|K1x;0X|0$@l4+u%OTyq_MnBHhqovYAKsl-c@=W#qsx
zB@+B7q>gnBa&lDkgf@e?<?z0S&4`^t^^Fc0v4+XhVJfz21s9}W18AGe#sb)yjeJ|1
z+sZ_q)GE|3gut#(F%CLKi0)XEpQX2ImOSYcsy4hSgIfi4&>aGv?+XkEYG>CF^JH#9
z73eY_SAQUYG4Zv-DdA4DtdO4Zu<;S+tHY1d-~ccLrCmsXL$zvBA2P_b01t{Vi6`a9
zAtO6+<|7`O1pp!N@`)z^1zVYT(u27gz2~79MLIQA)v3eYCQgB$(zY}#_=8I@Fk(1j
zSbc8({$CuynO))re_h?&j_i1x{XyCF-(5ud{RDnS;_2`c46rj<d2z54%lVWrGnMnv
zQYmBmqNy{cPFi>Q-#6;kKymCe8l5E_byf3rTw1hUpCzlb)BS)t9knG)c+=<QGZOhi
zyPH)4xiBt@^f<iNs>giq>+_jXZlxA1d-ixbi^1WF&ORx_=dpZIQ98Pat+t$;9A(jG
z_puCiD7>gv&3f$F2d<!rgB(oX)o!Q4XMNxce7WBv;<Q}xJ*uGyyerVH>2ci|fljs6
zVR@H_r00G&`ym_sniW12JIdKfa^7T1%9KHsyx3L4+@4fUo(A`g5DYx_{C7!j^{-L|
zv~p9QEKUL+y@8OuI~Arzbqc3}X->n5qdJ+0vSxXQ_Z5f3ZmeT5QBm&g`h(Kpezz~r
zH`#U9$BU0Aw<1z-b-KAMRO}5E7H9y~?Qhkc-wcfmJ2=I`uB1ke-;J0ng}en=>3c&=
z+A*Rx%@9kIX(oACj_2~^NM1$GFg{WOJqB*u7tt-JGuU5RHwS1R%|YB#mngCF_`Mt>
zZVSuZVOS4pWwZXzhvhPBi`A+lK6z#DU0;-gdY__H9LO7<+t@*MQqN!8r?{+sC1w$G
zg5M7A@T9L+&xT(JWmM_oBei?)^w874Y4i%`%IU;MM+CHDV`-_eM_tk?8Og<@KIyg)
zKU>yR3V0nP58L-7<}xSAZe->E$mO-R=h3sYw9MvlsMh=tW68kCDB!#S0BzUaovVSP
z%;LWmC_T^CPPkFqo13}l=zblz!v-sr3A*pAv^uUHws$xN1_tWuugtm*osfM+L!udV
zBUQ!{!W09r`ULf>qp0PQ%IjyUrw_E#YQQV36&a^rNu%R^$n)}hGmEWLC13$Od>PZ6
zAH(%%qwR!BHLBp(>tJoE*!Pz|2SXx<%)jg}YZ^04<Wa{CN=!G)(!|8a_qZRZ%E`$|
zNx?UgnsX58e!(+o(XG*}8Z?Ev8c#Mev<V3X9|+`8>RC*D6E9QF_hdZ;VZjTq5yypx
zhwIkN?YI^oF-XO7qm%MYoESpoYl6tbex9)3$2ejQ&XR#mu``U)3hTEdFdjM>=)Vb!
z{GnXzV%e#;UDRT_Oj%|<=i%+jRv3kZLIBpG!?&o*59#KN%(^_%xMXGwJ&b8~%>u$;
z7cne4wTg>NX#)iu=0e6eS{i0pAaAdzs3;p`nSXV>*s16*At^rtxSuSoGA|gUoEfxw
z&W0$9KI~Sp=H*?$0$+#(O~w{1TT8Mi!d8mFfx_R^WrgNFz`VL^FP8K}MHZoVDFm@U
zscoftaRFJIA{i9hmYC5Cy#)PhGal~`>+<P!F0boWh-nrlXmRiib=AI*NfF2F&y>Np
zcqf&rj8;lYULAzcB$_7Z-ZOK?eNj5Hn>g~*T0};t1hRwFaZhT&%Da5lNo)E8RdQ55
zwl)8~p#P*R3%JMKDoISS`%gruj5Qyl8eP)w64k6iK#T?_+M0Oq3x$Z!rM0DH`>^}p
ztAo&?_;v#<{b&1#si~<ZEAU4dne1`P2os=h$JOItik5?eLr6%!Y}$s4I2BYfe{`gV
z3WP;Q9$h~~{il`xrzzzM@RMSsS?Humf4C>*cP)l$1d$ePCj2}o1)vOeW@j3xXBxWD
z_xPq2J}90-S@0%YKiR4I_l|39Nzd~5d-K^!Ht{~c>BuSEf;np<Q0>G%3ZuOe!I8TQ
zON5|XNn<}PV<QfBl8KF6(!e8f3z67@T3BJSIfst7x3_}Amq}|W5<URP+77N?KG|n+
zBeiN;EG#TM<h<y6#!sZtQB_sd*Vot8)z$n@)78yNO`UCb+dDsZPP0gwnnR9#@ENZU
z+KS^{YIW*`=GA4#&T(V5u9t@+!1>|ofI+R)eSd<AnwpxM`}&|PpM{zEdZf|oYz^vk
ztHx~2PU|lz$|4s`oSd8xqt^#5S65dlDXH7jRnfZ*IIxj&zKF2p7-2q9_>WdtTe~-n
zL|9N9eX?@G`tq^phw-`Zxyl}g-_3D?=u2B;qw2qh3IfedpA)SHATF0WQ3N6s62R}V
zv97b8M;sg+G{k`@>~}Y(tFeFTbecYvO<P!6`r>o=Ty8^Y3eQIBk7kuHcO-z4x`1u3
zkX^Ly?l84{AtR;pJ0U6xqkQZj4ONj`O&CZ~k<9xs<LavUrlO+z0rPmWQ#oNR!1v~$
zDvis(@3UAYLUOLh!8m`@Sss_;Plr~8EWTZ+B(>r&&~oe5y}I8P9Lf`N@&Bc!CWB7l
ze`~On_R{#1(@%45u-&PP!{zBWcI)cp23$(|(;YML)MRz*(0U^p^ipj#qQffkIMXbH
z0OEG+&t3JqTB;AM88AT#HVS+&IW9NZFME3G;;-xVA8Okih(yofav7_t>x#M}r8#_g
z_A3*9*(l!(J?pgkJAx+<=ivHGD}&rFqxHqJ&WU@d-AY<3=v)zB5M<xN&xcWSrGu`R
zY}JTj`$5RqY2b58J8=uzIJ#x-_q(<ux7w7y{c6-K{Q69oVIQd=r1i)1MFWw&d5!Ee
z(y)p+zZyr**$R^0$bh#QXsEg3rd2Is(QdJ=B&M%OZcAurf5P@5DPxk~E@9CB27;;7
z1u=6-rpg=x<nLAxi=X9xn#L67U_|QEsr@#Gf_&uYAf#*cKtWznQC_j;51?Ys1=~p4
zwlS~T;d@;<Y(8~#ZP`Rri%!05&r@vbi}4AG;OE~rqm588U|7I`tX?;44o$;QVHlT?
zfa&{0f~SOK?8U*7RwN5hBF6wg)xeH32M+e|rPz5_1|5m*#AKW*OW;Woj8g!ll}F!5
zMRU+aC`P5Sk@Nl|D&|C)<ji1o*KO%KapDWpHiIeQuK))#Gczb##wI6cNd-+F%30r0
zj3<5^!ibcl!SOg<X%`RiK@P!+mV&BRN2kz9Yya2hTLKpSs1+Gp>2ODb$;wK`s@V~U
zzmn3QE*}UQVrW^21xKbOI8WGVt?TAwx#(Nl)6>({)fF_FthusQR#xsId!kUjo6YNV
zGj{oKR2Ovq1Ic0eyFruXI8>LWq@>U*WB|ZWJQ<0wuRC-j`f_I$`osBPsssx2ot)52
zAwv;xbumN{bTLRUU!!+>v+UH#iBdYN6dj)cS!1OYVY$4VEldPWbo<>xnF)(-v-RJf
z(TD@+@;+TxQ}RrsECwC!&;bI$<my!5h`p_1%_=*5)s!sE%?h=$k6#F(iKW4Mk~&=C
zVk<#(&1Hxz=;=ZRN~>k!h)Xo9(pimO=JcEjjt2(^ms_2JAmhA}u5oP4C?+5T6<~`Z
zEAYgLFkpRPAF8l)JlB7i@$<L0#BG&J`J4KOGOMtt>@Jm8R=Osfe!`_q83uu3Qc~1D
z#*vq)GoqrPK*P!W&ru!IoqvO1?4YS(*M5_g<=7XyY0IIT8dQ;cCwu*D@lYp(V8|Z0
z=lobrPHq?s&cVaS&rA2B6+FTLu1<I<sX1()JGeQG{1Nby)4i@2CI?u%?i!sxJzi6I
zZ=e5wBAw^K)GXvFXWp>T`k_Q?Z6Z88H9eh--#^Nv^7e`=d;InGI=!w-pj9#ZuGj1A
z&Uwub9?MIyXTHi@RM8P@SiDcTl1mRy_07~&mDQ8)5~h%mjRzlD?Tf(@0DuPy@g9}+
z-@^hSKr)R@49?_sM=rrsazJMjY~FJH(Y^-2o^0y;3%xs5fib`_=4}662&M0L%*TKr
zA}leipKEX1w<3_yvwNIdV5PC&ij|l27?CH_B#i?AW69sNn<)nZ6*1I?(|mm@%g}GB
zU)zpif+~ik)V?+p_7Ag7;#zQJesyivEl32>?4+jVne^f`Xj9`Cb>gis^+TtAA;gLk
zojAVnh68T}37z{T5+wOhrI!?LX9+jJ28}z{b|F?)uxSGgA|64xYK3<mK~h)6NJRyX
z3yv-|H4&nAnn$}fyCNHtIF50{(%V9`%(BMmsVU-O8^>nQ0g0K~ZeUC77v(?9JWcv7
zyit_jv>x9tHx#{Qaz<0bk+>7^wZa%^bgssGI!j`ZJ`m^G5Jrd#uKO^kiicJsz;`s!
zrN|Xc&aBJPhEYjIv?V~p6Y6lM{6|Zh&i<Ff^m(W#>z>OFt*f3S0;kY`fU@|9>m#p+
zE1O%DhJnqy<0kOb^fb&yk_`DhG-u7#8pJlg^1JOyNlVul^^!}kTp!JY)o`k2AATTF
zppgp^0udNw9adm+uaBSMA9;9Xx`>ng1|!2aiW<<Do}jtut{{@!_j*>#DByZ_e}6yl
z`C&Ea^?4uy9S&$dqmoO$xR`If#=W%n7FOa$t&khnhuWB%5Uon9?jwwRC?YyBkNv{G
zfQ5iX<!O=yPut7}WALEoNSnd*KHrc43VA~91uUqgJJiL3lyZp^&H+nXEf|rMKX#oh
z@<i&`EHQYozACrEip$dA#8sa12{c>sE{#k>`1msIwhj&w+7qDG7k$0VUJH1*K2>|(
zR6LuZEipLUN)SrS^<ZFVUy3|)Z8yx}7Ubtg0Di^gx7loU<O+VLYT7&+L>=hw7kRlt
zy;}1)P5#`NNW<@W9A=dMa<zSBHA#68acyV8aX(?wib}xEI066`B_F{l7?HyC^nP=r
zb=MRsWV@@quh-sA5iaB2o|ens82~o-g>&faUY@2g-_j{v5(l48ZzCp=!mku@>I`yJ
z>}S<DuXb;kE<7cVz!qg%+`ndXQn7&G03)XLpv&YWN`|X*7a=~PwP9z1+AQ0*l*Uld
z-A-hbA_Xt!DkQ{5_h&CLbGxn<fB;zJ-weo<8(|jwA7q-N{`)RKyyU01LR1QIB!ZMC
zkKz85vXqqb@2$THusOkj=?8zoiseX209f!zqy&));ddE?ZQonr&QjA+EwyF`A~Ee+
zbeosc%a8zmq8ugqSe6OyL(z*Y3!U4jHme4uvgu7{N-!cAlA4-o?RpaZmcGON0LPly
z#l^+K!eXG4*fW<kHI|_&<7+HKdsuReEG``!{6cOu2$rJ)N^u%Zcw1nAeoOhB$HPdi
zI98Wi`eqxyif_I}E42*RH(N6Jr1$w(*YDE6qLE^Uc$c^pv$pA@(15h($<}5%oh*{^
z@oAs6O&#6gQj{-IZM6%hk*k_z#EBMw(lnLv+nlN3FOdkS_+97ysMeB>w;7sIAz%MV
z(zZ4};5`F_PM7z^&*-<j4olm4CzL6}zPG0*nQI5`fe!~|c5~J3t~)WK8p4NeoBar_
zw&j!7iQ~btva-LyU?d=N-~ufA`tP|(%L!h&%6mlgj-EILU0vc4Ldu#!M{7jX`d@>C
z4yzs4=bHnaUS}e%+rN#1o?C2ZE1^PVl8j+nIv4zLd`J%2usug<?{u{@-)EQTmIf(=
z@?$*d{q?+2k?2|X?Ha9o+VN5gYUa<;G-eVZZ|C>lTZfwY4v#T@;+pU1_vmY%x&abD
z7nhw8$d<z_tPF%aF1`2u<gSj|sAtu9W^)TsQ?t~*lb#hGuJ7t19o&VYx*s_bRTG6_
z-t$Lu^Xn8=t@l8%iN5^n?erhA<(OEMRn~*l59zCxp{f;9JaE(k0>7-8V1V>dkH2>f
zkEcNsd)tMRW<#&d+nqIfFNC~-)B|lV3tgMvmt|y2V5&_+YKyga>62vN;v@$?TnJ{5
zrzK4?vokDmewL+i&1L~6nyk*&HJ`Fla(B2P%Rwneto+DrG6)|zv78;=a^~&%r0uw&
zeyGLI)QN`+=2t_)JkEl$n$~=S^CR()EB~;{Z2RxC#O_%2t)F+^n0MBbvSOI4R!h*)
zy~j=-9!C7OL`R6LQ=$p$9gk3?qjD$Z-bNhdA3_6zTqdt_mH*Af^kr$y7kG@PD0>g8
zQr*EL_^@+%6CJ(h>dII%x82s(_16?oVZbfH!@EF)lm66@l!SFWhmI?)p`o#O;u*hX
zo#iQ0-=@!k`-nkaix@(A*jvT{hWwUt(Zl#HbpeX_dp2v^GHZ)oh+m@WbG*<11BdwJ
zb|d8y-l7;5v*S%a;6e(%6dG`4NfZ3)vva_H!eZF9up$2d1e+hIa`5sJZ{)t~?V-&}
z#>w_(uPanDCG^@nMv_VUz)wIb%CgqA$Zz@OoFg2aHECaMALA4g74-uP%bYcrbtP9v
zwzU~j)ofNqMiiasx5!8+AuRN-ji7;7&i+g@JT(PX6w&yz=q=E^Nkl~C_|9aZ-sEJt
zHJ{gMt#v&x_D{JwV_l`yc-B8Boj3HW(W*0KOsy;|H2oQcjS)GJ+gGJVC5I!eovA>V
zX7Oz8gc9E0#FAAChd%x{0HY7842EH=fr%oS1ae_tAb8k3i_2!JEI&}d<4`^Sw&9Oe
z(e4%ve4RcX9v(~j5fuGjFGpEd=_i?3-B((j*6;4_EJoANi8!{O?jb`76kd9`8QD1k
zop7PaJ+p?^O;(R=eQy#$#U>`cC7{%)+U_4%TX`f5DZ|u-vU(b+3Uu_ysvD9l6Rzb6
ztp$>i@rG)JqK{WwWXr8WPy27lrUi#BT$=`;Rye1HB;%zEN$`{Ck(14IfO_pQ(xHR?
zet*s4>2UNei{B3(cK?!s-5!RT^kCb?TR5DSwl-v-zrRbedi`}{i=y|nH$Tn4wZ4#=
zNg-&j*zdIc7REh%#}z?bUyCl45f8{1Pc@{ybAoCTB$!)S#?n=C#Q42YMh7dmkrO4v
zU`km57Lc%oJ0d_TYIL<!m>VoH0CTWApHC~ApwYL67_Jb8YlW@2o2rfTm-@(&76A0e
zI6KE9oHYOv4D({*v{$z|bNW~XroF$UO6gMiLmaGlmV)9j!IW=85<v*)(}?v@Y=-~_
zg6@e?QY;a2F>xLp`Zx`3c99quWok_Lkw@-0Ss%4lH{C(CibR+!A@AS4+k#r%vvYOF
z6}q~&9DG3V+@n{SI}!ss+S@A*8MFa5v@K`8l?Mxl6jF1JOx+qfWa@o~%1+M{U#OFp
z(U~*7Je%7{YkUOJV2a`NK@!!>1=0;JCnlugRDI{np*}EEEVs7S=S#g-4?{-NF;;i_
zx-Jt+-cuv<*f`cyM}9|})6_l<Z_WeHt1da+tXU;3&p63-;>>sK=_e=mW`J#SauQb>
znrD2JOsV8J_75h1AG@!wTwY!pbb4|RZ<On^B*exF`rTCLbB(66=Chmqf@<;Tm#dtd
z4GQzn_S<jB=rx{>lBQh=iE}xl+*ZHC>+gx<c3&RPMBVpQG&R$}dz|}L?^M{|$7G2F
zJbYzP^QWUk{(IVaX4q^!3AIkp^R-sE1iR<)f{JX2jmu1pA_J~z!`)rO0C5~~FlGW<
zj)(^b2V?TyeUz+ZMMGP2vuuf`p3kt4U|TJ^U7}|)C31X;oM6TG&M9g!hFZO0Y{Igc
z`c5gQ)ytu6ztdhwZRcdZwQC60R}h}`ryUE67Ft44lfPqo`66y~ZczRX_2Kqa0@%ez
z@VaROU&}8#^-rH7(hYsc0G7R7`=z$i*Pa*EI?UdHJK29;4b9HouqqXk$N*#NZP<W7
zw!ZQ|o*omY-l3G10)H-)pKFw<W{n7hRL3t<tO#Rg!c#oE25&~$?O}&K=CgU!==%1p
zMclZIj8%E&?Xjlwz3@4g1o0MB9lW}g=1@w*i(>)80`T8T!y;`Uu^$w3@PlD>?_V(e
z)_qN}fSfKB<0gJzFS+W>9k8SiymZl=OeK6KI;>Z;r*gE2&js~pBdA>nR43~H;BIej
zUNXDHA`&>iIY5@2{KwL&h{?ubxkJA;Y~T7^<p?gsVlgZ%tp8t=$W^l9$quNzG`x{?
z9!>4A0(pOO>qZQh5T9-amDo;~qN|$2)t~}jK^E@rR~0Gr`91Hpwo3{{F|8WJE`<{N
z%6?TEW~~f5w&D>GSXo#^5B?pDB@n$?Fyqi+TV|LEW6K`ym$=P8$-x7k>Rw75<U*9|
zl$;F`z7@f)U^DF(5Vz|aYG^=3trRtOj4)^RxNkSP4_>0E40Tc>jSWxsQBwq-IF@gB
zk772@KDc$w*KTJd72Pi3%};ZVo!#A=6TPE{-@kYM^51XXt_Kllw@FbStoOc-q<%2+
zzZi`0wd}I#e&jLV+oh-d>784#sGWbbi=YVg(D^l{-#B7b3LqMs)**_J0G=)s><}qx
zB0lF0D1q1;%T!yoa|H|E`d>}T9L?3}HJA>zxok;XcbVuCdw3$z$W3w8Oj`To(aWI(
ztJraoB2i=O!bNQJ^%PI#?M(bE9*mVzAHP_Kv?C0rN{^fi%!%9Nw4)oI3+=hKZ(kn8
zU#xa|B9DE*iH5Sg4v(Y!+t(xU=$|rxbov*^=xDihrWdHJHe&?`zN7pxS7YFD^}C>x
zZgs24T*_bKZ}S0Xpiw6yy&!6?iO$X0s^BUF>$}r(p=!n36vsRBH#V*TG%_<j395hJ
zeW*@vcKu|jB<<3kOZgsXefQa!V`VMn9!ShI@Z3@+mw}%YZkaoXhw&r%cxBfaG#pL+
z*01FYZ&u~qVa=bTK3g|^CMr1)JYd?NnuXi<q!dDVx=(U5Es}?X1ANaf^E(qEa8eO%
zx_g3qrr{n(%-d_tX~qu2m)2WJK3xXygo`<a3Qm*<NQ6i+S!!!C;ardY{`MY4QI~k3
zyHlHHs&e*{_=kk}RYN&T-rluuw=B)b$jH>uwe^5;GK~gf>K>YI@x{EAiPYD0n&I<v
zXXSiEfG=06YBr{F;=tXrQ<$1sqHeyE7LBEG(3nlOWXfUrdr4UtIA>)%V9l}hY_0of
zqCgTVm13f!8CX~_Ffm_mmYvReUtj8VNz*@nlJt}HN^{`5$&Kp$VM`6G&T+`8UNmV9
z9mGU3$g+uuxsNePcE*<bl2b}bN?k((ikh=l1`N2=srmT{b1Ea_<BA}VtBih_fYJf9
z*FPg8u))d6$xgk`bB?XbxdO8Z<&qI-I*sPT`;$dmTU$_hcMCnw(Axld%1!yFqF-N#
zAXn4MGSbo(R#y1}9wT<>nhFlyx)_V?;$siU85dhatq#jK&_OH9$~p_=E`N8>gZd1#
zx5*e(G6DDcMf>%DTZ8#p16mw8UteD=C>53nL%xB6Z9FNz>q?tTg7A&DyL<Dnxq$y2
z+mOpYdH6<ERn_<A7)sxr@Nsch{G6^w7@-|^KAv_Guo?>4OchhsA(w`$S$S=kw<j~k
zPYgDp4ZM{il9w-Bav>c`H0PITs3ar+?<_PQ9FTqRIh+ZP#br*8l-B)%(5&4L@&8Jt
z%b2t@?%}1H_ff(DF;pxwToTLtmb{y%_BEg{Sg#OmveVPisFx*J+8{sUWembu+IzmD
zmO{5)Hh%<xKv)bq?#8|lti1W9*am?hP*kZ`{*a8gXFXhKc<1AzWx%54;xgG2^djPW
z<qXd2rpOjp{h;&d)20kX7q9j2iMu=aGz+hjl~ZTFj@$j{z*LaMdcY%e^|(buOm1t*
z1ikEYUuK#NCEvhiGwHkLLu199gJH`xw_RVu)U{AMK$$3L+2x>>Y*r+Z!~lK%U5a%K
zp<q4Pj06<L&)MP{rZTm}v5SBIi51cF+;8{uo7L>dp6?OqQ*)*HWQ)7kE}Vl!PMXqi
z)3=_Ag$RgEQB+q^w&7se0ms~LgX+zD<0fFlao|<H_^i~lIO=XjL!(5GmRE<#G%0F}
zPhJBLh_co#Qr*GD4YO<Ehz=_(M{RG%Rdiz_DVeWI1tEh9yjTmBvBD$@WaZ@Aoi|}G
z`GH_5YUr;J&8lmC5+pKs^;oSq*$+EHo+#|ZaW*zkEJX+01;~~*h|t64gEE6^GzFo`
zuB)r-`SG?B%E2W<>F7L<<{TCqEubNUj*8l(&E(r1I2eQXP9|PKw)`xQqf2vibmwQ>
zz>Ogf98mA#0)wZQUqGBBOOrB8iV>;J^id6b;@LTAU2G#jO$|$AZ%wuq9CN+B@go#%
z;5{yiIhG+*Btp6B3^cs|#*~e#fED>|&34B!_r(fS%+1Z23_9GQ{5Wvx-@`{J_O1lO
z!2L9J$rlMoW76Sp-Io3AVPS6mbTLHnFMh`|Ijbrw|88xab)NM+@brZ~EbNV==c5mg
z49hEh86O$0s>wuOe&SvCcU$f7h$UcUVPq_{5#Z;)pVczTWj8~7@VMHa#1wrx_dDy>
zGBk8#BUH*4A^X|%sR@fJ1WK}O9&b({yW`oyemp2BXLB{nZ<U2MGk5d+PBXdfG@%jY
zSEZP@*NtD*w_-oDNQSE^fT_XQKTx!479(U-(_R1<9~pnqfD!VYy)V^V4JVv~y0LMa
zqh#)qsm%JVmCgQqJxn(`a6UC!2Y&Tln;9ydXf9XVV{u#eJ!>aYMj2bKHFyN$2VM`{
zt~1?j_j-1Y8%L3gm^NF5Ktmz0XJc#g-N*R~Wftf$fHFz8S=XR*=EiN!|13>h(w31K
zRKg)d?YeVWA}tNo@^o~xz3jKS<ib@1vWdgyb=?<p1o;832U7?&n!FAVU$Uy|Q0yC>
zhXbg$$yetzUhg}ELcZDl`E+;2*?M(G3I~8$7kthY*jJ1-)G2=1+?Pk`4q3fvn|zqD
zZ8_aqvL9FM<k+iWw)*55@8bmO-#CqK(Exy6`#<_!Ey<MDl);Fnqx63Tn&Ylh*63w8
zn_i#g+2vO@zI4`Qdo0Cei?Qna*bj=wf0LG7B*)UbJiVe4K@|$P@qg{<UUjHmJikZn
z$zlt14?pnz4f@p1USvlvX-)&+rlwWmqQvigVEmwymMT|5T*A@Yrd^^UON)c8sHI!u
z87WDZ^nTlwt9#Sivb1HT@T;Ly$iU`8tJCY)Ug^CJ9~d&m{qLcp{vJ4g{=i+cN~1)T
zDDIc%$r3jF=ebiUCFNUzJn;=3f`|02w(9EY`g*pM;bPSaki5K_n%bZ#yW%vibhH$8
zOyObgk;3&A8D{<){b?g8zn%a36}N19nC;7;sf$4FYNr>b=?NX{_F31v8||G{`kP4d
z#`SUv?@xPbxLBk^2Hn0IMU$kWfuyz4w1b0#1vWp!!^7#7^UQV9Xog>&ACc5KMjMeZ
z$*bEbAR!2-P|C2&DGvgnV6>LUL2cvf_$#G!#26pWS`!x^|LSb{-3NNYppaQxg9cZP
zaj=%0oE%hN98wSlG+k_gs~jno=J!P0Gj_ot;p^9jiwu+{e-(Nvv{&cS0%nG_WYB56
zPTX$tdud!fROdykUhn0Zw7keYBV%_GoOIMQbV?_rU76BXYHk;W^?ssw<YT{eZE~e%
zWGx;tsFRIS-IT+MQQ_PKi}D2Wovoe)=`SJcsRgy{Lzsh}8%$>(5E&HPw)Y+5NnPx|
z*+z`+beP@jHXdS(kom#`KmY1TB6`Il1k0?icigH|>9$<zQo{n)I4_UdogxNmw)m)k
zKrV~16CCh`Fyp4zK+uhGrw=aiD(7`aG{-8yJO?w9b?D;t{@|P<lT=P_G9G;uZI{v>
z5!g@5yE?9q0k<ycOqrn*^*p$;F}0qkoN8r5MssXcX(R|FV0M})a5{i|XD2uT{8%Zd
z`xL1Ql&I$I*<`WQRjYqUB~GoJGHqD0SB(y%K~9y}G$s72dqas&Ax`&sIaBPDdYMu#
zi(%LMR1nlPV)(_C5D$s3-)PAAtg2bAk|0lT)u_B@!k34hm6#hm7V)rvW{nZ?Xk^az
z?R#6<D-Jw6H1ldyY0}cs6&f?gZ-GFdKRNtr;9Sz<1R?6Bp4@Y7-$7InrZJbggiUzS
z8Mku8lR-M1Xnhs}#c7uG4@^u7b@K!S1VwRA)YQ~5v9WN>_<(Hk@l?rZ(mR=$n3xHL
zXy|u>=!^IE@1&$82`%ovnQy7yBv}Kn)r1NkivFAi@A1dZ&J~=ok*}zQN1e7Ri-lUQ
zI_39Wd@JUQFGc*)J(`g&9cv*3R%<Rk`|ZM0rSXyXihL6N!~q#Q-OcS10_k}@%?^A<
z;t3g_2<D2~mN<nb2;b|T8Lgl(*M_G!agcLB8k}55t6jN>Bo>YM6=>VGi3ke@>;M4C
zG<(Wt4--$Enwqd;Kvdw}a>HTY`rF5_IEoCy+Eh3(!)Twu@70P!)ff_TF^NQy`v)Ul
zWpiYc>Ld<ZMSQ0y;(qXE*g}9p;88wK=a+ATfQgvq&{&kuk>BkQBfL{4le1&!V_S9O
zlw)fZZcO2nYF4QQj$G!jRC2Ly1(yy}2_9a=xpVda6@K)Xh6W0kElD*mwho5%qhXqb
zPoA>8e5dcVt%e3vQ{qI!FQT0Wg;s70oOZ0J(IJP33G%xi&J4SSmwe-WD@N|m`@4oJ
zNfwF~3Un!;5}xdF+ZIg?jRGE}3^o&}qOfMs0_O>rs2=18y%04o_Cfq@Y#1b`WA^f5
zvqkgE8@@9E^&E>knVct@RRW2#N=FogjQFu7stj41lsM7QOg_Mt&SLPFk3~d;eBAzx
zyDmL|1rNPpVPWA{5G{%vl<YZcYT|z<3PG&-wKAj1h4zEHc$SMI^bG=3zc6N5UH%~*
z5z*0mLpl^uc5|4O#)KCO-Z4yOXb}q5FWCM`t>*H{Kc_biRg%WdZ36<{%@=ZEsxf<L
z0>5@vSiJdyn54fUOgvHaT<kVDdaLQen}yCva7rr&3y`v;QOdG5QE55^y&edB&qw{W
z3;@`^t4}gpMo(1hBcRENp3G^M#nI=sJ)s{>0DK~K2rf*G^b2MPWwZKDy0S;&aL9_r
z#?SDl^fX)$E^l?ys2e<xVL+`KHU<ZaOo^=eOKU8*cwAN<*RTi5oF3a8^htGV-g8sI
z*nnL=ecD%0wP#wYg|YagAA2R{78xG99WIFTCORoOSyfk8S4D*~6-43>`=JuGmS20@
zm0$Pzw{Uc!NtNV+Jx}al$gVo&(QjeqY|5z3fk+Awe?mpS^6F|SIw@ydT-@!wJwZ~8
zk5%JYJT;IG50i9OKf3p)6PrIX*fo=jSqxAxF`+yii?CMhwSaiWeA^ZPpmKtXcv3wr
zCx^5_`%85jC8+d0N~Zb#JwKF>FHPdBy{#)7-J_A%rnO^=mXLQw--KNZM0&Sf(BDjV
zc#J{K)%Zd)@Ic%u(MGtduy(Npe|4C{VZ0wV-M3VN1N7hYq6gz|I^3NN<#W5nO_zc*
zcmh5?kJ?}jhp!h|osu9wooXPFDcy8<7<;v+W6%p(iKx(E*EO(aasS-I_sfIdau9R3
zCb_*<`>V5Vz~o{}gmK^reD#w-=<oJ{S9Bh(Z1hPev1?hgTS1Yb`kPPo7ykW)&|-}m
z3IK=~G84<fTCb&6v*ZcVGIJEp%@+AnPb`Z8-xR+j<nWt)*L~ODuYfQA7#7C4xJXn{
z(HTz~%}Z#H5gAq5V(Ve}Dao)XY1I4zQPSh3kNAY-mTCKc-hzpEKV@V9FV1!6X!o1R
zrITsGQqOTOV$b7pW!8J*n>ar|e>SgEd`wKo^_*U4?dqnpx~6890$t~7o-$V1P{Mp_
zx(ps(G?b3&8yd4^%-TBhQHmPTr7+;4L=I3**jtwu5aT`!HZo;peNj-kEp-xC=0E4U
z|C28&8qjg8ibDvWb$=*wlNqt)UD}d?{)0PgQ&$c`f<%RhSIYg#%8N2}<frNIZd`9<
zWaI@Y1sTaJcwI1MnNDly2sSAvYfd<gFDdAF9%ALa78y-hO371zL0e~H@r#SU{|s9k
zi<6viro>=3NXw8%umo*rme7?32&O@PGmLg5HU2bzB4KHRbl@QN^P|iQn|!A`WOzN{
zbE+1HnAVXWJPbf1r_v=anOTbV^$YQW;C?W^)bh`T@6kQ<(&d9+;#!AotaNb&Evyw>
zO(Q8I%n*D?zUe|>gUQJR1xPWH3*UzTA^X!6DY7)gOH~AlpGd*-Qq+`D#TkTLG(;T^
zUV2=4B%eC994>8m+T`TrtM<Mk0xDIrlarGsCMJ1$MooZq0xw*!pN}yV-DYit(<5({
zL%m5RdaZL8vpzH=(l8K^`tC)>k?_7;j<Q~}mbHX@6%supTN>?RmqtNAN!|6{9o)EV
zWbVC>Q^@^iPb#)BlfFJG9z8s{Po@pt3+I!LdvMa9P{KhpI3BdaxJ`?DmHO04vQ?@)
zjbj<5v=e?@ZC<|lEDk}d?&i-_YCd@5Nz{~b8$Phed1mI#O?E=h$J=O<Unin=HoDP~
z8?>J$?#OTBopaiqeV(bzYOyQz;bFdg6$8<T);g&#|8y)^Q#gFg%zYmt0SOIdk&+!K
zF&*v+jf^rrq4>2EGZ#L`KjG?v88$!Ng&Sg6r&TqJ5n1$S2YXThZj*N2tvrGfxk5b#
zUrpjs@=-za)uReX@IvVW({@;0hSl{v-2CZ0wO8=TA|c^*{I{z#tuTCZuYg$4cmE-7
z`5XjdPC`KKB@y(so{T%vKt8~DAER0^ivo>p+2kvI&u~iQZ96D8wQc!j<+&Z>l);0X
zMl{_F?~+igdNA<zQIzlV2Ub>ahyGVRYu9#45UX7}7B(Ic_P#*<8cKjOW{ec|!BU06
zypp)N0}uw*z79={h_rLx#PXLFF1-)NXR<vvJ$lVem8Efkam4>@<8Nw)cB_zAZ$DUB
zieJpo4ju6VAq9!oM=2@e@OQ}2qh>Og2KDEirTFk~*`UAU;@G`2(P7tNmFqf{kwc0l
z>#dWOZAbjU+iylStI34CRko0WFU;3_o}t|uS5{vM5nauv(#Uli*3BP<8f72@wpr-^
zisdR&76=ERynL45ue#-LdBBdTg7d=34RmMo(3z91INJ~7*2e|^?|4`wX0lNU>+Nn@
zYN)Q9ArY2cV-a*n+5b9uOQY@gi;J>G<N9Z_^=TF#3gEazm0Vi5=*hBRU!MB$e4GkX
zeSc)=KgEO7q}G!l>84pz_Bb>i65A4Nf43F{B(wk271}5om%vV=^jU_AN*rbnd>8yr
z*)%Vvc12&aJ2J4)<Q1eA`}zMCAu_-{To=Gles~1^r+D$dyIE(&L1r@OcDnrkw`iNw
z{JFGdgTJ+)x_`;N|9?xeGk#GjRNYyv7X&<FJ}S?(Dkr=I_;tMgR4Ziv?-|+1=A2_b
z&la!4Yk{|LfU_RP|5MZLNS!#o;o43ZA<f1#%As%#GuntYT7SHna;D#7n!0RHnXS41
zpr)OXo<q0{<pYE@)%^c1Y+vjn(~<p=-l{W+<0KPc?s#Dd_rF!?Z@B-zqVfN&C*QTC
z=b@Vl3PH@ndEP`i3u?KO2Qu#eR+r`b{DGhW|Dn2tg=hvG9cux%-NL>%whK#kF`u!b
zrF;XtZ%>6wMXwcxu9T=M)sew}yln>_)?tj7<9pxY;AE@dpp{;Kf;>WRr28S|G|Tx)
z_IfEP=&41Rwj}qwE3-_=aq*G>KqK?i+xug%vgblU29I8{JL{>Y3nSd&Rr{W`?quGx
zq9XfsVJ_oxCW49s4fwk(WwoPU!>m~3OF|gIo~Zy8e0uGsi>oR0J-4TNacXs=JB&<B
z3vDjX&|SOR=DbQJ|1)ceA3H1ht>XY-r)ejvrug4?0bcP{Zqzc%MD*BRn-Cz%d3<XV
zg{w0&GUEfhB{py7?N)|{qg`5P?Ya=O>DTyeR@&ZtG#mczpvU91gbb_)JjVUNdS2L4
z4y&EAvJ?_M89ty(ISAjgBo%5~w`{6;3>g1nWptjo;Mgi(GBxq$e{5d*Qmx|_ntT4Z
z#LfEhXc0o01tJ$+5vr6<DfeLx2}dR9)Mo*l`Hq#9{73=ote4%_K(Ss%+!(sA=mpb^
z-G7?xvYl`AHOIfk?K#MTK*U1ZbDean&x7ekz3gR6!1Gg+a%E+ugjR(%Q}QU@<Rtrm
z%oiyu1-iEa-k!hI98&%+(G8OE)xRE;<^A5z;R!sJ1s3W}R=4H6t`26IxoI0DZKu9{
z4lwe$Uk?vQIOSL+x_xQdTeK?mI!T_ZFzci*6E@V;JXCUfd1@yx^7a(#H9T3S^*op{
znabV5BwaXT(6+GHsj3@0T;uMxG=xSowNeh>%gj|px1Xn?qTKQ9JF|zBg#0!a?W5Mz
z(a2R_dELit_9Dmi?+&9|3BqB9o?uo08oRD@wL0j4YK8l8+Z!M;-D|cfrTcYFZhxFR
zd)&~fva;Gsk@WWPL({}PuVH@NpR=X*fhK>^faX`QtV8ACcyJImxYu>(wKPX0_x_l3
z`tjy;uE*g2F!dKeadhF<Fgk?b?(Xgm0RjYfcMt9o+#$i;AwYoO?(V_e-QC?C{^mX3
zIrmN#R53j>yZhPeS<>CJG0fCk)pL7GNy6Zss(AMk^bdx|{c8O0pY{Y!9QkAl@HaXp
z#*;d4R(U%O-SO14Jl|xC+5AjGfE>Z{D!=tbL_sD!BO@lGfqP)Dh9xaM<M1$3yH_4D
z-TqOabQ8Za=V-zK6p;rx4-X`0#Pqro@AfdL_s~gIRTB;luKwi~if6jXF-ScXM_!=G
zeOfHMcjWpj=+76QlYvcPmli%A9xc+?y<J`1s+ai|D%sjaYdxII-%lU6N^IJHvF2RX
z_qEM<9g;qHIa}qWiomNg9WCza`V?ePsx~~CBR-bFcbek*RNJ4-pl!*T(t2gc{2RH-
zWH>Ya?9WC2o@`#8Sdz)mkktE&(RD5_mG$ZqmQ<xfZ*{Wi=*Zxp3s1V)c!v8`Xun+g
z*U4H|Bj(?!_<SCpEh7CPk(!Rn2M>0%^nXYRwh&n!=N!L8G+rt(*m7DHyLTnhF}a*A
z`0NuHaan7qtEuJB9}f=?`{=irb~R4!kEPp0Bn4#fR7AYDhnl3&Ag#2xPxnnJ8M%oB
zC>4ziHP`;w_Q<IsN1x)1T>KVi{8U#os9vE5qbmw0@Luca@eKCrak}1t1UhRw|M_E^
z$}JBiRODT|d23^H`&!@?9~898`4ZhxPbA=Ox_{Ot9&IM)ZO8-K+0}jBj+WKK;dLGS
z;&rnl@Qf%bDhl@R&PMyhg?G5RqV>kEU>XKA&L?m^P&J}lz~puRDu1e^#CJVpT)nPV
zq1}AKl_(W>6?B9OG%hH~WX<gqBguq1?8#x0%WT}tx9I>cj(l}rGwJa>_!{I#93s!J
z>&ANhg6FtKO9L}#hUMQm6I^GdmgTRQ(|1S2tWc%~{x4q^PhtERM)FC)!AHC8?A85U
zwEw*IIa7L3oykO>fZZ*`EH%};cGb4xnr%z-SF+`g8b#&N>k1u!8a0wq_&k$_cf(k*
z>rWq^GrfbktY4%l<2C8`?$<1GAFHzZ-V=*z?3x{RVXwGbALm-$Pxxxj|4nv_%X{BF
zCIhTZoomzDgrLVB`r2l5tbf1a>6^^R^#$LwjlD&F-3Nq>nGfZc!RKkS-tOFcr5_$1
zt|OQHyk@N1yra6LEI%GIjN#Bk%Gc(osE9ILEoLOCsfp9<yV~sRd)Jggy}Lou;IW&2
zJ9Sd7+XD9Oo{-P=Y+<b0y1N0>zf)&>rbv0fXt}}e9feFB>|aQ1&eJVkrP=ry5O=2w
z<dx9_`%FFV&)9sr2tdrcox#3u?t{H>`)O(p@Q~Xu-OR`HuZSSPTOL#zu*)LhxjY}u
zcBrbU*{(j#7b+Uz<|YAUo74c(;n6$WR?}NFP&%}&ygeB8@~?v<BlNWNpFtVhruyNA
zLh%}Rr^|q{igKh7E-O5AumTvpUgtWz-DH<#gRe24>>3$Swpp$}jhXxL5TZyLTR2uc
zp3#C_SS#z;#2qy}@-;AOxi%C@SJa$9EV#SMWwdy)VuY5F(dRPI?0u<unoZWD;8?o)
z>g#*YjCj4>vQ`asaQB%rC1W`P53+R6fuG5uQVt3M6-C1>nTAx$QQnqqT#6F5%(Rl4
z7D1|YNR&%v1S|H0V9_Kss=BX1tPueU8bKr=-1(YSj{A34SF9k3^BHad0U{7ju5-X_
z2iU*V*%C`Oyf2KEu|uie?8DX0K4M>`FH{(8g<5A?{SxTpSJdko8yDy_GEHzC^E6AQ
zIbsH6h11m``A!u)*K?JM_SzrEeAj#%3M=h_nV%dS7#KMBdEjO!%Xwc)uF$|J{3mO~
zN&k51$xdFOROE4chIVvBjyky0a_+r-y9nQHY@%DO#Q@uT%e|cexi}b4H8FZTMX?<&
zs^8z!1Bm^8ZBg_S{oH;w!qbIig~D83xQ|FS^^iOXpos=QI(`R2%<rc(?f*IK?q01h
z{@E|Wo|^#JrM>Q@+1aqMNwQ$^NbJ4GkGryHX=!V<7~D^tU3mUDG<^bHU0;7yo?ASB
zI{Ba_w<KcY(guueVCEIez1Gn0RS5((qkz`LwyeU-1XxH8D+uxBM)qESd3UUZl1RXZ
zp7(fa5bc9BwRCh^55mU<v>OL}PucX5Yda@j<S`qg@y4wO#>Uo~j65|p59b(sZI)`m
z(!Bu4v!>8HC1%r1A_g0srq055gZw_u6j_y3WoLgPaFRJkM?-@HneSt5<`%fJVrK&)
z5JkZIH24xt=(D3(rQ!83K@ye^3E!AUC=0j)p~11SI~^?1vPq}26>eJE;=)4n^EEy^
z&Qd&{oBGq`hO^~oB#?-xsPoAJ3W$`HR7y$;k#M2Ipu4%#Ke$w<>Se3fkDw77p3+H!
zelImXdbLrf9O2m4cS9cuH@lb*)Z%iA4-^Aq*mrce#o(E?Ve7|cm;2^V#>2xy05G<u
zFNN+x33QoUz22km3#}I88LJY}v<w`!8Xad>yDRhSZZ(Qpm_kRbtiaCPuXC}$Ur)yo
ziACVg7Rayjdp{u(u{fMA&2pxV>Q?*yk)!JWf#2_NATa+ntlLeuP<lBMG+Uxpu2(m8
zJ(3eG>wQyIL{jFoxu41S@}fM>cE9@0bWbfL+w6Q?K4~sPIUTm!fr){Ul$fLk%`EaW
zyYSuXViG{nmvp)DrTz9>L{2=waCaVCP3M?Z?9!=qT(7krPUlzCUjur-Dxiq|I_7z;
z@P2cyS<(736^`GZ^%-3>E1Cm@>>MozNMlTm#WrNiDk8|JFX9?s^7Z*#7fH5>2sBr!
zdHb(}5TDn!>*%AkMzBm<Z|CqZc6XJE&`m^)jh)D#f9*d~2>5jD^q+%m81HfKBwv6(
z={&qgtc*M;UI$RC*R3Ypuf1OkT10c>M?t+i6QxrBn(HRuwsa!npih`_2V~@KovVue
z`Ha`D{dp`+Do-j)B>^|mJmF<7tJ`Z%Lmt<ef+8%N9aq-U@>w$eT(iny)T(0K=8p%=
zFNGqN56ZnRb2aOD3d&5NO+0!g@;#g@<CTmPkH)u6n>tIs--FOv{VV7{U%u?rPvD9R
zKZ!0nynDr{%evGcUm^|%WEgK8&Xc>ulDQ~sZd!U7c||9U-*0!DWa=;VrVEwJiobwS
zA2+(A0Xr{Bsu+xD5#I5}Nka1R&0Ga5cAw$C@63^%sa96hvaODB`;Tw0P}$s&;)q1e
z4v$wc+QDNf&-I<iveQnrBp#c|`X<Isw=zVTF&ASk@1fyV+m1yP0yB>|O@l?UqiES5
z>Sjy8V||-?Yt%0r5*EgqBEzYzD%CRMdDe73DK5-=w(<qKiS_N7GBy95V>fFoy+r|C
zQ%Q#&Go07?>}pT@od4=zI}7<Y$S?D)!QrIPzyxDXK?T_o7Vi4#{xm%?Ufp#n=^LFD
zBINWhYC5_$k6TM1cqp)6Co%Z)-|na+nZ(v)7v*(-*Me^(gQI!4;-tgfbYXW}4=~QS
zo`Yi3caxKdnYzL#G3Dp70kWU+S*BCX^UO!AicL=D`q72mq(g|A&y_|u8Fd94=rHz2
zt(xb{NBGdfA1$_Pw&k?PpMRL;LTAu=NUg2j`_9bpE94?%*%r^|YA5v9uTNp5K%t+J
zupfHRrni@BJ1fW`(WoEFVE)?`ArIbE)pe&;>+g%0FVOYon^sdpss5d{&^MbXa2+qr
zd+sm%hRlL~`hQ}6G1=9S<~HPL-pUf13QO1PXxCnFSeT4{q>qtN$g=?<*!I@Zu(W-b
zS~oj?sWJigrS-8LhH$kx{Ew`(V!aVXpSv-<TxuTLkdr_1jEG;BLSN?XFdCn+7WA)P
zumAs|Btt51|GL`sPKu)@hrAva-rei9D>TLbFAR@HymU>a!c{)WxUX7&F`eW}a{J%>
z44-ci5<q(YgIQ4O|DM{*C;d%K@qcTbIVz*b#Gw9Pift+?w2O%oqaj$NqnP{~89otW
zepUCrtfi&7`{w)<poe3Fpr`2oOSkuG#|3&3@Z2ZB?49MfU|ZJkIM+RFlR!~GwpLU)
zL9n7{!M#<@p|m_<!Hr;0oasT$u5z```~?wF7(yC`Ab2RTm}k3w9^Lt4)uG`h#o~JR
z^}$Fw-~Ec?@E`4hnn=m_a$6TuNDm%%&R}(wL5b&mO#^p=%iQp?!G97+RCHvF`WKB4
zqmx$A*s}DZTdFDC!YvN&FY9t^YCD_ez6JawjD1f|n8EiQ>x_kHb{)*~{8{BS4H@7d
zS12|!x*WI${X((}aAxu)x{+yH!J#}P%6fmpgfJxvK~4VFLw0H*-noP5UMf9t5j>te
z1uES*2FqYA$zAs1$7Lk3;QB}qGTO#h);XwmfoP^egZdRO6^BRLtZ&o-(U#dbp;>Zs
zeROxG>~#(yY3Zer9RxV;PkYnXi{k>VQpH&nIUMXu!}E)AGL#revjpv_`kM0rP&8Yb
zI7d^ysdHA{S*2Je&d`dWja}n4rjgOLt{9mv+T&DKhw$nveQAu_pv7My^V6NJCDCmq
zWuaM&ZK1vHDk|Qr$1vArT-4<mt>nb`(kweqg$`)cSc7wi({`U{baRbu3#WTm^BdzX
ztFy;e*JS8#wob7YA@WF(juDUcQuI|K^;2;zxf&c8*Sseex;Q5$kIwdQIt+B@U(+>}
zMn8khthV0~j<r-e7rgnC#VDwpoHMz;8af|2b0$-9ts(hU@p~JWj@Lo;E<%`mCF~%e
z@LWji{rsh9!UlS@4b$PgdFC&#;Hn*zSV>tbB*MEEPq~;CvAOlG$_%H^hJ>oEqN;E@
zyAS%aS1NwvANBQ~Y{dZ*!g~J}_oJyIDqHk_;vAE2!|ua<{Sgtjk9?<uKEXnik;iBX
zPx+f$>GIycqy1z^M+s5OD};GHURlz*kFoZ6?A&^a1u8gdD+O7`hdOFZl;K(`TL~G4
zdgqMy{#I^D^<`q6J3js@*K;xQd^W;1=J#TtDXxiRAzfqY(ygm2OhMA0XRp=3J?@3z
zZdpnxmuu_Wx*(qwrUE<F2>W@bh#~n`hg`crz5_+UHCD;M{k4H68AQxj7;lW&R$3Sw
z=9&yn#uor;AWYs!Zh#xI#Y#ZQa?MD3XU{WhEFj3BxYS)u)m$m-x2tOM0=cOUYH((W
z%lM(`2~1x4fJWe*S>Rhz^skyzA2*GX!%F$V33CrQ%^xZRN#fmLebbaiam!S6-ZgD^
z+L~kUkBqD)s|w@$-hX+c?`T>u@Y{NyYd*RfHTQr1l0M``iVUmD89ReptWsyfUKOS5
z`)6kO{Vx8hwMz<gKy+qmklW(&?%cV5%~GO(q|NK-A1VIkuB8MHVxl`zlMOq@n0j2O
z>;L=P3}eGE{k~d?8a>Eki9{sOZQ;{DJF4n5O&yTiL$&2>?gFzsuVO_ia$uC}`}?ly
zY)4uTb&;u@^a1LQsiX4J1iu#gQWZM*X%21NH;e}^j!#o92trxebr9W^%uFp<d378z
zhb5t@T3@_=B6lw_rk6z$VW@6v!hsT<W$ljAz;(+mS5&|1v3J^X!l0a)2Jvu=Bu#T=
zh6FC9;=xDU*w=An#SB)I-~gCur7i*YyYvQc_E-e}cQ3gLM*O-q+^tTun2JL#(#Wfg
zcW7nBQS;?dbhf`-fYOwW${WSlB>R5*%{Ak7WfP^$`s_~GRm2FNaGL;c1_q?GM+pMu
zgw~nwztbdUfBr(|vJX#AO(6)c?dTs+epc?1zr-$OBP{JAc(~}B(FVuChK+N)ZEUhK
zw3ok+soVIfa}%soRuH1`3)=2ESMSa2&7BLPR4d|O1<Y8InQMvw_jK3NOsYUJRhzq_
z_;*Lat^~pULys&Km#Bj@4XLG5OzF<R)Mo=nCh_YBXje~1;r4GAt+jU#k)I5$A@#kg
zpI6#?sO7cU{7YZvp{9vw<GhuuYGHqbF5>u_?x(Z}H+wE>W7k)rkD5bCcc1q=$@3=!
z>fb>-5l(jRd)-|tYs!QEb!oWn_ACHY>hn+yn|nDphcfx-+SC`@v$*6Yf<y!WqYv{g
z(UXa3zcmdrIZ-(T6T^T)(Vnk?aGVf0+V2KE=9YXuImGwwqB4Gt;~R2f9ydUvwTIuY
zGpABa7g}Gc4e^V(sIaBVoAHIh*eBJwK&RJ)iId+lEKWj$h0z`p&?7k4Swu2eS5e@H
zT+!DB4HefPP$m;!ZytYlO=IEn)=!wj#WTN0JoMTe3y<SM03n~4vQhB6sUFo;b0PFx
zvq1&o98ap}=?RNxUD1g_yzpqVrfM|iAc1ZpOQ|ZXKJjR8wzunyhsotME~cG*aa1p-
z{`rj>8CvrXCzc#FdcA|&CzQwR?1{^;I~>s8%2Gs7#O;9+kyyA8Z<2YBmr4^%Lio&_
zWHrje_0}s;aXK`<L6>th@l}S&v%7rCrzJBxevB6RyckJr)4wINR6T+HSjO$A{8EVE
z7Z0Db*}OSsk$d|W4IRAf$EL5q)vs>q>L5kkrwVuGRc(wSUG^Z?qatXFOwZcvGe>uw
zuO0ue)gC|jr&N^u?l0%_QMoa7c>k*}Z>&DUS@lH+#5`A!+-@;2<h$Cnm5Ot8gW#OP
z&%CqmuPIfO;Bt%;8W8BYSn+g?3xW<Ha(|iXoU(rl8MsRA15dvGJxUK}#5YMlksU{M
zkJNnk_W{7cH}&Hl>S#-`={7SAzuF9)s?XlSx=<pG=N*5<OR-eA#hlLmN_XA-B=P!b
zzaIFEz+ml7z#tFB#v1w=ln=>cMcJ?0di^Pr?;U_{SSfmu4mPsj0f1bQId6IK>lFWP
zLJU<q0p~O^3Z#&W2N&a=qZun_gfcfL9<7;87XIM!J@q+GMH*_wY>Bc-+8&C~C`@Pb
z+WV}Cm!qfr?_6n<e6Q$(2XRM1n4I&gYw)i0E2pE4U)x*!ag4!yXpo^Zljo!&FXM~J
z%#r(IlNg6`nLdr12~-r@-MLob;+`^mZj8G|O;@hgQVB@RO?BGB`iavdx^K%D4P&1=
zCGdr>VPLIm<DgC)oz>mEc0T#_*9C&7A+>fZMnkk6)$rhDX9H0(VdI~I5?MU#!z|$f
z)J2k@6<0J;Qm1xbY#9Wn&!0&2=tKpR&0-XVDeQ(4$%gckuY9nH_*#RbBa3`gy|0_J
zZT!jHndr0^SD58nw(SVFUE!T-TmOv6>oCRO1zOIEb6Ahu46o~hE9)&EoLUR!#Wa3>
zd<%-Mq0lFGyLyV$Q3RyP^|qb}<=Bz`nLC;Z`o6k`V^*HqQN5Tt&%TZg!mm0NvPoX*
zmkWJf`?Sg9e`Y}Rg^z&Y=&x;t=h(j5EEhzxM)Wb-w_49k{v#K>W{>5XrWgEB7x%G=
zi!n}0(8R*fqQ}>k*8DPbwK)!MO&kM|+q!JBTpjZqfNT}mlw~=(=<Sx~WHq*TiQ&$i
z!g4#UubjAl%kr>SR!g!{>K+#a+;lyjnoTEv+rD<KD9No`SnjgdR)YK%dq`cDcd%5^
zmN{XEkEM!J1R|oVIM@`5?YU|i%d9gLsI8L;){fY6ThxWwJi9m38b^B}zt<Kf2;)4;
z>&=7yZL8a@oXGmGT3;k1ba^=RegZ)<mj=so=?5pUxn3TA=P(l4N6aRlpf<)+e)YyW
z7jP?q%!)=1_>`qEcXLx<%JWGiY=Ssj>@!ImnKW8J5IE^d$x&*3X1jk{TVY(4hmv(B
za&kvSZRCyeK<;bub%?GNETx)dq#7q<k-|Xk%)6%_(l@<vPmIIkzY=0_fn9)Zo!yyQ
zG-McH@0pr;oOYHhd^2O94IJHVT25;#HXOi>c*#A2#trz9n-?B|biI9qb6|c8=h%{}
zJ%R;|%uP`uDykt_EQypa;H9Pn2NK1&9n`;vajMg*rvkqhIAC{BV)8}vK5gz(o768-
z0I(?kZr`vK_QZ#^6va+cVWGj#lH}$dN^-v%5CZ+0bn?X<y&5x7C?`hf>uGB`17T}n
zf|KRsE{^ex!eE-iZiv$Igu_-}d~6l}r!4!|^^^dlp<Nh<4AlUSg^Wf;KP0#9a1C1l
z8h}C_ZWR#-c*=60_%d??dwW4nwdOJzH|d?(pBpv!7=8Q;J~0%R<{MmBX-`81Io&&c
z1~Eo=JbRU!Pl<@qL@}oG0JA8`!B(O0q(g^WYeaLK&NwWdnD(uSdh1+qAXoVCG0zSc
zv~d^DDlScyy{gQ4N<>)KjNpVzF)_<?uNk=09uJ;OWND=sadR;FCbtfcxa@E;Hyq{x
zYV_!E)3JN+oYcdr&YUhxnEcUBjtY6&@HJG5gjWkUqx~@fS^X+MtGL}JJ4J{Rn2ERb
zRiSJdIIt_&5|7V3!>AG@@lOGbpIa7xW1A}v*a$-;Q8pLfh6+GX8^@KTANDRY8Q)GX
z=&Vi8bM%<F%jU!q66|QomusK~c`phK3{M&YM{Q_ZWy$i1)pdg6XZJQh$$hTQ)7eTH
z$#Y5b?8wox9JM}emnZv%ACN-^AP4my<TUS#(BtA0C!0?8MQX;Z4fz;~oNGMqS3MA;
z-<5hu6d0<CdnpnzIn|veg%D~)J5ir=b6xDY<Y@zqZL%w53-p?=v(qwjO422L6zf{r
zEYy5LOR)utc(PM}<aS{}ix32Qjt_OWod7gKcZ|Ecmq1=!N`7q6I_`HoVr_`kT1@iN
z8@5CVVxGwfcg9O#Sc@B|M#><dVp}i6DlWDYv(8C)wiOa5r(5Sm_i7@R^HIFjf4~2B
z0w%gPsbp2SAX|%%8Z>Ef{wEWY6AM(n$|MzH&s1E<RBjw1)qdMZJ~ZFiy;iz$iwA<f
zuJ*iY4q6;hD#LmCoE0O<KZe=U2!jh)5Ie}=Hu{PVkB*RjEMN{~UPwXT-0m%!s<WXB
z(XVR3NZ4uJw<q!QlE6{^5=a-FJ8AOM^87r7h-PwQyrT7eIg-_}r@~`<jgvQ3XZQqQ
zM$nd%9rkh0h^B%kdw0lNugTCbT5$C%7k)boi0fJ(?|AY#sQCu=3?2k{zWWSSH}2Gi
z`F3F&2G}42gi-6sw2{5~wfZQ`L>bcCv#lw%Mm7|wF6M}UpYURRPcA<ixV^6rhp%`r
zgA1e!ym?vUq$nH0>xm!;7-(U-f1jsGpmQcOY5jQoL;}<OE#r14Y&KiTi&vA6sjQc-
z;OT!b0tTwj7?2CGKVP4f)lZw77-@Gn-_7G?nqZitGUriT;u1X|c4`O2^2pnUfi}n>
zlHpu*W?{&sl9`-Q6F);kNJWAkREU{OZg`rg01cb8P(Z<f&RP^78S39;aF`Ypgy~|S
znV#0BsViL49)($zp%FKp7eyRFmZ-)l@8nljl?V=Mb}A<2rU<2{8}xYa<_pA+y<}SP
zCXx2!pjK_A7^N8IcXJ7`<pl#(Nh|KOr%j-cT(xa4c%SL%8qooH*QB0ZN;;MF+`NcG
z<%CizDkpKWOHr}swZexR93%v4|3=KcqOGB(zC3}tXQF=b6qy*B;UBnpc72bos9JZF
zgUdi)9)+oT6NQ*g>$OZKv~6oAmJ<`oplYrNq`kVz#$~zHzUOOz=dlkb#cwVK-PK6Y
zVS7brJ_X98@)P&0t$g2(^$jT#8Or`;L^CWdN~OSYOK$MPEqls-83>EjzLzjrY7Hb^
z%kAY^w~JOO6+EB~xX-(Fk#~ELJ?XXD<BY2ewaimCra!P{ONsh=TVuHD3%)$8#MIAu
z9!||=S95;_neW;|2yFsB7egSBYh?OvYPIXe)5dDddK6wn_)!R~^<66~PVzib*4v}D
zvgy;$2?cfOMWXC7Ds^kR;Fe?Su@S*6<tM0fsbR&P7}%!AzySg$NswQ2(405c8Mt3!
zs9tVGH=x83rfPTFN-?8Uwmh0NLJ3MDGa<xHkEGIQMfc}?bXc%~Pdw+M0q0i<CdeY_
zA(^0WbZI3*I$>n<th;u&sao8GccyokK@W`&@o}k)ww$+-WnbI>D)gzu@v!)8@MP03
zX`xR#4?Zoio2TubFZ@x0$_s1Q+Uu$jmQSPfP>z-}8rEnC^5GhcgpNHY=s&j1KfnT!
zD{c~${rVHO)VCuXW~+ey$rvjE2*5;*GKlxpMvm_Hnd-FJM^J_QpE2qpqmsn3U9Dwq
zt*}SKN?#G}t31@Sq@9>2vgspl_0-u!Y^jfK{`X#hb-{{~l=gIb=UVDf`tsk@O@NeI
z!07TU<J$3iNRMvQsk+ejdZ{>lnw?ZYCtxT(s7HI@TaLQoMW5w5_>FVqRL{|*szAHf
z6%u)NFi|u%*Jp_KSBJ2pH2>#h53EZ~70YzT+g}Y6j-HLH2OvQaBJTAN2<tYN6}>Gh
zbk@Xaxq8-EiaDC-#vf#=SYQXm4w6sK_WdlM%SK|x)dYO|!ZNv)m7>jPUc>6wc0U=l
z)g?1x!4r8C#jouf?iMy7!3>evD}P{?Ji<b}^|V@U-RhI$9~0g>!>kd7`$NWnDMrq#
zE<Xf<vJRoXWg&HD_+gJy0CiqSA&OwwJeg)aM%(x<Oc))GVELTLv_YY?YXg@zrIBOh
zFGUH_(MI&x==uoc4Nb|if}E!CG8q1biyP<2wm?C@aMd3a{y8si<?>}w)Nm;xSI5?p
zI*={P>@|(M9FY!=Qlpr4x(c~&bc_h&QJ`ekOr<*Zxw@nudLb*W@hc(dgZD_$)#v83
zJC$Eru}qwMGIcB#qon~u1$cc0`IeRaL^nRw4jgN7LUc9U<LOWeuf8WIB&ZrF*b}sW
zARs`k`Ci(d@@uJhE0?r2WgYMiEDrtd-K?v2kISBjkyzMy>m)=p?MQEo%#ct=h9Hox
zjSiFeyOla%lP*C{|8G|}5aF`2cbTs@$6UO)q{Py4ZDw|s1v?@rC}?jle{K$wGi`L&
z;nAyo2S5B~5fYwwViXs2GJ*j5*T0xul{ji`7=FfebYv3^_Hr%Z6*x5?n&li>MlmbH
znQUhH7wvHSuWSzTKI%dmp3}XnhidP}bzr)61ew=~-A)_noihz;h0fU9wNu~U%Ek@3
z`7^BJ<B7g|n4K^g6@s?AgXP#*$6!$%Uxg8KLkla#^wJ1sc-|D6-39zCg@+wg*@TL1
z|E?h|Q>&OXj&|vwjkW8rc7yUu-PQ7))|vT9+{te7ISG4r8?s2DsJs7$zk<k?mYZBb
zj6fW1qok7%Br(Kqd2@Rk7;q;eW!!Hy=Byb(a6TPDKs4DIekJ)2Pl{>{yBc>~{@wXK
zQ0F{pWUk=Iq+(4?{?ss(kW1U1P&;4gDoX80jdF>(tY`yuE}9{cv|deC0E=>A#3Fz-
zO`;UQ_#e<hK28#3Z62n{n;{@R^RV0;y^`W4;uD>X?ZP3O?URTMiY_)Lh}yzk*XEk4
z{Hgf1;9{;M$r0bXx%r&C%-4rlOm+&LHcYfKDlHzarMrHzzDPSVeKt@h?zSklpD@Hw
zoLUGNP^#0pnhG>wsvCrnA>T6T0>qFTb8Ay+@0@{AP4<I^T<oMik73H5KjS_=d#ACX
z(tTp!|Bhzrv6KPd`lh?8cG5=clACWyeH--#asd4;Zf`2g_EF%HC*yl!h*e#rW%rNk
zTJCLafE)6FbbYGUpC~G&vS#ei|7}GVeDCWDcc~Cywrgx-T`29Vppo^r@WxX#{u#=f
z?aPUW9!oS6yi47k1FJyhs}3<bk93HTr<0M#6GWrN>VRinfiRqd)pgeT3|F#5$*{Si
zdB4(0deogF3QU5Dm*h^poHe8G_gtuSv7%xtSo=Ceml~3#Hlz_IJTAItG@MmPR8Ed|
zxF6iKV^|=<_EJ*0=sr+a+lgMntYo?9FjFz&buGeeWuD@oY}uc#>gM%nhY&uoGW-mH
z^Z^D5lqoK@;`wtaQ7cZ(r6)STRQ&d8J?1BIFQ}LS(6`8sej4xTN|*P@hw`&-kB5V)
zqEY&@5~;q~XVL21(-t>@qU80dDi*Jw8={)4QEaXq1UQlbNh)mjx&x8tM{8U&y9hZH
zr*mv!5omZst%a?z_m<ysTM*OxRQ6gBTz@sM!&okhxok!&fS~1h^ycCUM5m6e7i9OE
zb;$vC7I;rjK|W;R8B-6JDzY(;J$aLau;GK~#Y~#F;dimRi@7L*>1-L>D?}sXaYd%c
zN*pb*GrT>TTI~6zP3(8I6r^kB2&>ly27+fs4T?3kc74p1p=!2AizRiU5fzDq79tl<
zqFmBa(Zt1U^{BaZbMXpzt_?tb33$`B;O+@6j3Y*+!!p@c!faxI=O4T%u0EY0Z++jG
zUxcly5=_VD&5o)ivt~SxcD!HnY53`QvShS{F61Ovw31yM3frsw1DKB|G6pJ=uD0+N
zgg5TM#=ml9tVv#f9WfD}7-%4az+k#X`ptV&#o@apuqi#ULLI1|qt48^zbr!Jkr{d8
z$d(pRoSRarnnO}hG=#f9e(K!IX$b0bLyEl2kC9{=I`R>4jb5nuby50Br&Ld!<rq&B
zHmv!%7XI4;TjO<4`%mnkHUoB|raS6aJrs~c7=SxKra%*;<5g)A(f3EMhJ*6E0~i$j
zRbKD^134A^rZTkb)#rabeYZ+GRX23!aeiRmj(+A`>h~}#G3@$TB4nbwHDrw^FEag}
z|MCk{Ti2H?^|W72>SJLe_F92vr=w_PkM#D(9Y^j7-EOn~uu#5gqU4PD2e*TMjN5a_
z_m$;e3DQK`D3#`3rEU!dXD1eB<N7$f9)->8HWL?{oglV(7aFTEtF5+4Cp>oZiNBlc
zKQR+oiMw7UC1sWA`bG3x<O|_~hg)t7g*hiJCqSU#J7ce3+3a3J=FJG16hZ9Tw4vqF
zEYAyJz?%jAgYE>0(KWD-gFF@wCyUCg*J`Gg1g6fsVS~jjfbHN>`O6oYzrgaPS<s-}
zW#m#~lfWTQYl~I>J0LIe#;-q>@E(EvxLEvgvb1e9Pv~pSpt7&qV9@(}BDydbQgnf3
z996`@QhSfn_VrlsC*x0-pG2xmz?=UY9ugrFp(C$w%JXqxU(ZS**uKCXB;lK}7DdD~
z^WWzGc^#^3!zLT$KhA$5{X4SLX{}+c(PiQPyU{<$mo2poA(MqXVrIU^PSq%}B;~k&
zPW1oY-Q9t6Sc8z5m>7=5bhh5nk&}~?n5Zf_=&7HP%53l}@w4~yU9Yg+dOM%Pj)Z`K
zfVQ?a7gs|pnfO}!>l$Ij$;nAij|deNm8<K$#dN-^ib_b(+|10#AMWYZ)i&h<xg4=b
zkGEEWF%Ti=$QPPHiO%5rv)Qw$-jTk(snJoPQ8zBznbVmfSqW20n`1Ry4hX3&v+eoe
zwq!)vf)uj1)wZbby<r&b?d?QL)=<6Fi3Z(46ciLiWF%~Cj>mIlVFK@9O7|oPh3I%(
zwkI=1@uc#!R<q-&cTy)*Y3D=`k|nfyFZ@6FlOxvJwEKsKP~U4B8bZQYUr)Jo`8ya?
zZgd}iN=mU_-Emfwc#dN=dnQ{N88ulbKX+8~A_klX+#T2#7Z;b7mDSYLOlE_K$;ga0
z{{2knajtG?_*gW<e#4Jm@xZM@zvJz8ULOhqVsUZt@#$$SgRiB!T1o9_hw|eR3+cQ#
zgdd%H`G$p)i_6(`!T4wzmx<&v5^3A=#nEgDP$nEaJlDf1QC6qDk(7?`O5;IP(7|F2
z6`_`rlA*QrSEIfN2JQNhbl&^h<9XpAc=w0O(;DCVvsFAEr$Pnl7hr7l3O(=lx7SX8
zC}4h?T6Gv*dqPmSY*#eey&m&r(}1G@ru=44me)5KT~HL_@%bFV<K8rrPuumyO_x_n
zt!Y_7N$KiX8#D)2O2&AZ+HGxOJG@fQ=h*V?0i|80TrlB1!M}vk)YR10);8?xV`lY{
zFKrbO{C^c@uO&O4<H*ftt+%nVcigVf%4={bBlKAxk=fYmd#0v+eQ^X&4)=a<<Np!d
z-T8Je0B&cuHj+YQ$Xu@b?ODz|8gaiX5H3GIpM-?OToI_Dq@<)5zwdOuY{&asOMLwF
zN|WRL`8ty-I?vk28sDCG^fWXU+kKJ1>&(V82$;WrQ&x^wxt++Kh|0q@C&B=|y<Cs8
z81-S};Z^7~IeaY8pOsZtSEnTU$`#u#K|@YX{&7c?%h^gwVj=}5ZIX?^>kV3vL3c1x
zKT|L~4y*A1GATO?3kx;%!NFwCLx_ZfLv?KI<ht*BSxyc(2n-BtwZ(P4#%z2fg$-<@
zCloE3kdMdZM8nvayj;xO{Gi@uIf+4gP7g-x`Updl*iSJ>qrH6v2`xuQF5_#H=_rPu
zIS5n;<u_Y$8KW&j>3F%-`{eX0re@@A_3B>@l}eV#?!_2E!0U3dP(`E-hw!e*-g};d
zj5Fx`V-xI~*VhtxqIf<}r}pRaP??}ABkleu8&yH#VE;+;EvjD<Z8UIJR-M%*k=J`T
z@VGrk)4>R!j+bn06_F<UtfZ?)`Yo~lt9qN~J!Pzfcr>AC2+xnL&!7)5iHV7UCQ8&R
zE-o&}#G@i`*u<28%J1y#jHUCUC9kcm#Z$@iJMN7XD&~;S#?!%W{&yKsT1qO3QJ2U2
z=>}=f#m7Y=(}p+}eU+908Tw;wZ%oX+jSb>kFlA+B*g#U`T7-c8ogEQT(M?S_P<eUz
z*w`2_lf6t#dadR*Hj!9rpvwCCv$?Y6$LoCzm7t9g91oR*B7c9;2HSkI@u^-RB7yt}
zJhPoW)6E0(*qHBe>9XDD<EbVwzs=!6Z5}BanwpHd#Yi9shy=;_h?m#V(-V4cuMx9x
zPUQ5_KP=squ6AgOoBohE^1q4Oi7gM6US-pq@Nk*E!Z?{HbOt~7f?mik=j&-B0%EsT
zwm`(M?jD}9U%vXhxNY@>5)u-+xVUU?ZVnC(W@kY_K!k>dMny&W`1okoTcbR0HvZUN
zSy{m+AV5P!y}*%&=taf<>NYVpW(y$NvQI-nf!Sh;+}GEamzS4_D08vKY<{+l%m1VK
z3k#{Cpn`2zn^6Lh3mO~Ux&mO%&d%!V>-qWlbHt;QIADb;oermD(>OWU**AvoK7oT{
zObV)XO(vm3=;zt*4kb1=egQt=@87=(3FuX3#yH4jgk8|kx9IHY2ec?(VSwg(eY$nD
zw?|f0Dpm#C0Ql$f@)Fp2U=ED>qrC4<Qs|!tMn8#EiF_tO|IK0~cD~jonu86fMF0$%
ziX6S5o?b>`B8I`Kz}rLj(9lsqrcW1>e!G{2iHY;$mC0mniNX(LTq#iwy3MMuUJv&F
z{J?-u2WsU;u+rwq^(KV##s2$`A5{z2)kEA}drD=+-!Hqly`R|E6hy?uGkIMRt5Oxq
zsWna2In8<x{$f^d|6_)R-Qwgjy1gZj(a0q~CO`nusU18&rLH#$K5xOHiHnDu4Br^9
ziVUNejQpNETjhqs#AZ%e*zQkQ_nCg(OEV=RA_V>67H+7n_Ii0}L+m-26sxMrcgUe;
zq?G^tedo;9z{=`y+lb$zR#915+}i-=ly~s<02dFBjg772VGFJ)d%&1ARAg#)mVz7)
z8#`vuxaj{~RwJgThX)xmFbe&@i)u3fVQCX11FQfA3Q5BiQM@P5D=jUpuCD(0O75yz
zmB#4kXm4+CI3~l?)D)>lHa=pom}kY&lzA<ce8$GR@6}FdOG}G+VQ_Fi(0~ip^;@*M
zP1zjI#aRtp=Np23zaU1f<_`Eg@5;vnJVZjHxeQpV7_@);zV=qu?;#ObCL{w|vpbxo
zr1Tq9=_{~3mY(W<oeK6h``5{C?{a0<=EG(4?l7LCV^Lh&r>2p#`L7mA;Tahh!0UKj
zEyvQW_Vc+1_y<(xXH@2ETeEb$E!^GRU!U(QN=tP*d|s=J`c20(RwpLD1=QEp%A|4H
z0DAa*cX|w{TC~8MgvuDeB)$FpY$+pvVtsJQ+}xaSFyiR&u(Ak!C%}n&<C(zcc(kq+
zqZx^c1|}!Z2O;1^5eWb~b+xjh)8!2QA(b-eJhRKo&l{coaG3NOHKvh;@@zgY4?xWT
z?abtMH0=&T04PI;5ep<GB?VMitt0&s#bmA3J)Tl_YI?fGaUb9+SKx<A9ZC~Myg(Wi
z(!a{%_6XRkufA_ygK-pAbES(_M!}?-L2B|zC=*A6PZ+qA@lDo?)v6_GySux<K+y_7
zk5uTk1j&=0FE`j-?~MZH0|o{rFE3AtB4;{;Iw^!W4_$$+D*NH#0UH+=P{*z0l#~=F
z9^IQbp{#)5;O%5ub^L&!xI&}6q@<)2HZw##PV4auKA_t^Rsp@*9iE<=N&@=FWH@QQ
z;$xv}U3Nw%?&Lt7lI&^E$E#hyRY5>P67o2icm9I-5UK3wFw8*a7A0;vF{rv20$E9z
z6d^Eg?@J4?9$wtw!JZ_>S^d_=!@JYe!)a~f)dV{61Oz<X)YQs6X@tEImV=p4E?3*-
zr=+#EMM%i59PxDo{&siaW*1qjg-W$1#Rwuh6)mZ?))e<WnbjZ!pvYc~4LQvSmQQl(
z<vLlD=78=c)6vq<gvu2#X;$a9wzlTyn=aSe$Y*>_;c+fjQIz^|JjVdKxVcfe3nm_~
zN_d(}+RZUFGxKzJClK)Y%FH~`*OxDy%t%8+lgf4`s_2S(HjyRF!@~m<*6=<Ui74uv
zm4$<2wZpd~I2g)jy|<Twi%Xpv-4GiR1P_^0Ss63DTdhIQlRoyH*~`mIWEUF;2PRMm
z(%-<sqUf*G;9xU9e`^9dWe^zX3-7hZ9XrKcM448eodwMouisgD6rcSHspZz&De<_D
z&KA3wSx_`Iph5qp;_U3!>(%KvlL+vZ)h>mEo7&r356q{3eF`fmK!sz8jQ9)*DTE3G
zU3CfvLq_2&`E-4k3FU}5cFK|*P&A9DQ)L(!7}y(%Ms?uC(@FqNY;J3-S7R#MV7m$;
zrlj248%-;a&y0$WhVld8rKzPw$nT{gEe!|C&dz?iJ8k)~-3K)F00taLDC=W^=8rWc
zh<slr3*?DzjUpmH9=(A9K|xPXPh#TYSm@{*2+DvbiH??+l7iJkPft(xygLb%SN@O+
z?<Xe!sy$-9LPYT01IE<{8?ZlPV`G2*1Pc`bj4PFGwsTCPy;C#!rb83J;yDcsTp)PD
zuMdEE1Z?ylb_>)*DN#J+tp9`qxkIRX)86NC7mJCB34|@+^YRlM%AO)m%Xzig8ECP!
z8Z)FoAuvBcaR9rZ@B5mFosI#K4iRD)3aums#(_o$8!7^egfu=hl*(n7@r}6A{dy0O
z5})_i`@KC=UES5vQhFd+@U_)vsU^}O3JFUl&QvKmI$kf;S&@;Ff{4F-Sr{IsV_;yQ
zql3E#rKY9rkEW@sshL_?g$qP8?pMcHsXBRZSuY@?ql;Ka0y_~B7A7PTjQs!CC4yFT
zb1M;58Vi@(H#bgY?cR$I;Tq^b!}$7jcg|JVK_htEF$-Pg>u_f;EMH?W**?8_db8q;
zWt8P8E!R#>p;D4p%Ke$ptImZXI_LlK3lZcGRWqSjTW=_zsl;h#d$8Ov>ibXqn=>-d
zC;Q`>=aV^5dJ+@aU-|fu2)}+Y=n4RG6c{L7?j2x6Q9O4=MXAH+@tM$399rn5|JNcP
z3+t<@+N?DG0LTfj7X@<ZTJ2uk!QCkwR!Oj7uXKvT9oCkXQqt1L>m33tMxvE~O#rgP
z=|WZa?Ci(tHm>Juz31|&?1zA(065f`85^Lnb+2m#euUhIYHD_R%)1S+I$vMRyL$EW
z?e621rcup(hpJL~Eul~0=EcnLKq4?R8}>T3Z(0aKXl7x_XJo`gM8pK_6zH45CRM}U
zq|$nv2<a^Q{0dV`MHHZ2A0Z6LqMLGl<ju{^*><w>^71b?;Ec&>K&Fg|`BsaC9drxi
zluWc_x}@=afZtvRV#$IL2~Zu`Rl`wyzXLoD*lb2dMnpu!Hjmp+eqCKcpzl>0K-ms}
z!@R5i3s5VvWB$_85)eE9zt!S;&PYv-Okh!2Q$t5b_k7lJj?O}<1(1Al8l$8+dum||
zCIP|dcjk~POif6U5~^Wn^IPP6VIy<%5KpZyz%bQvv)^kLfjl8EA@R3W*TdSx1Oo+y
z<hT+}1Q(?j6(zUy(-FB^Tw!4$Fjn>A37}|z*&6xH;xCr7*$3d5GzrrW7eo99!fb6^
zc{$^n**~M&%F2VaHeMFXgQFu@Q1)f^a1+mf6w{i*1|6e4kLy{)nlyuSf=&%xMvbA9
z2;8FJ&5_AeQ%zt)!{b!mQ&rUo0$vZ*9}IVKD=Ro*p&lycUfb;5i^qS)hCM`Y|9V0h
z#Ke9bn7e%6@azgkGE-HFVP#tm+l?i=v0eR=l=R67eQ8OEi%ZX;`s{3#2k^Y|?zO4I
zyZHqLXyAP2S65eJ(S)b_`whPDZ-AkP$KyOnvuo#eK1zVihSs2;1M-WumKKnPXq+YF
z7|r{Yj<mItqG{1#(^6A8ZI;-*9xg&cLY$B1di(m`?w0Mme1an$eWD6?-!ixz^XuxI
zfvg!P*kdmWC_5<`*+&+=+K~idb6Bc~iuMAcUvIaL2>S8k2VgaUjlKF9K*BJDQ^$sf
z3^E7`3W6=3nec=8>?e<ltf6tSF4f(rvrsR~MIjmtjRDOp;;vCE@jgTI)D<YJ+iZV(
z695mH6!X2ykfv}f7<_%x{>#1nQ_T%%8I(wc|67JKbG)H4#vL;wDhhGa5*(Bwvv=tR
z`uCl=QRfVZWg=MkaGyW5Ru5t<udH|hObZak#>R$AC<+LZLCfiArYH~&%LNGI^77H0
z-+`c5sX-4iH#bLy{%rUZqDKh0SHM66DqdJtR##d1o5%SG2uLEc3djM7)u@bIx^V}G
zhoLU5m!p>OV#|M1>A{Co<%>~viVIQ?d-8uvlA~tjV#`n}6C?jlNeNwJXJhN;8j<`Z
zL6)tN?Vq6Z4Ye1IP7;Wb!QD-OhXDd<TU#688N0i>SlQTYY;3G7Ek#zv6X~M1aEmP{
z3>jFnvJMDVej-O=>5k0`s(D-nb@lADAy^wG!-mCKx%4`!MMRmC@P^nd|E{n1!bQNx
zf5^{Q!i=K3ikh27lj5W@<eGFiTQ9gfe`iFaqbmV{y8WaeQhV-#ClsRE_}&i`PXR|g
zo~ca8pZj))r;MVCg#W!%zoNy!-`1wAJuvY5(M%E!TWX?jFm(V=`!tZxwY0S_<#Kcs
zOVr9(+1Xbb?1=dBC(5)N!otFO!?CEy$zvqQSro(mZQ4`H{Ry$_0?1D7B{=)z;`qRo
zBA|4aPAKv&=WBd?d~LP0Gn12w9Jg;Kg|jyQT<uB41VMgMc^+<VA?>t#W9iQTp<-cR
z;NakBYHRoR^dN&v0D-BgsVQ6F!%OGn<dl+FN?z1`LqIrJ9qki~D`zA^qKG#Dc6u@g
zgRgdTf#qplzd<Hts@|{q?*?CZ?BG^+ku@je#Sci#PuAe&{2fb!wP^DHa$-&9FxdgH
zqQmAjH)|~tZ9Qk_%cb*p+?ZqZ;9_H+0CELz1mNma0Yw)5$woiH^64Mom)qZ-j%k$h
zH<E#znB74UD`6OEWMo9fVh3<-@HxHL+sh-MsA?5@HWn7#)(gx{S~TV0S)m$TyZO>_
zK|zq5X|fSCTSk$M%6U;9N|DUp|AA^fPEB|;0mB(5k(-)|JDJA8!BIUG{y!L+fQ_M8
zg2;0*%euU|VP|0(92o)nm*h-JOjI<T$9ZUOE=ej6IF6yjzd~T~fjnwTU?SY-#A(|I
zfeT`rPfs3$FfO7ZS)=7XW3+fVD|1Dwm)F~yR5XJ^fv&Z%4lAqf1#&da-N@bF4;1Fc
z(s_>O48)@*oSg$-pQ<nvXUC#COr*g<Uw!4c?Z0{6TJlLtzf~F#OwlR#yEfZz3eA`6
zh9W|0&4gnyy}Z7P>QB7Ay(Kg0+nSp*v$CS1QD8A9Kkp{%ueEzW1Gdo8$LI5=MmEZ|
z;_B+Eql1G8Ui_Ud$~DtBXW>@B&EK6a0|J7ECytJXX2P1n&CPA7y?5x;Tu@L@S9g0j
zU6A?JUC6roXu3ciAR>YH7k_;<6%{~Yg^OUAcytfW$J=~f)2DS*MLn)^%R;OyV8}?n
zq@<`&QDuY=d-^Kn!F>L=Yv|!|4k<b{wN?@^H}|WWm9=WQJqrx&SRHx7TnOSWaA*tj
ztvBfYy*!jpq)VbE$BgQUqIks&1j3EPBqRh<%jKNfu9gi0Lm5D#BO@|YR8-0LiVD_l
zZV$l3v$C@0%ckWIP-;0veER7(yc<>yDJLyW_9kC2{rdV^q2D35QdC?V*SypTsQhBJ
z2@oz~>yX)TWmOz&5kDJ#WE<MAgz`=~`-AaRkr5Fgy{Xj-3Vd$s&|xJ735UobnyS*$
zbj-{bKqwVaR#sJYzTT5HYzp795J8s~iP3>5Eh`%y8VXVVf{Tlb?mEzeN(U2UfP#Vo
z%+&DM80DYgmzNiSiU9apSXm863I%=&nou*LD*|Qz$+2OaFRuQF2Rk|a0t*M1$?skK
zi@M2FUBE0cO!4yQoka1Dpez-ikIz5@JNY4=&gNiZZqJmSLH2lo#pC_W+QueJskpiM
zDv7}=cRDbDZtAS?gcl~T3jjwLW4Ca4bzR-)_&8RX?ETs5H1L?8Peu<6>fe@4=eg~R
z!~;w+)|NkN7}@ZDw_@KN&m)0=@D~aN{2Cn@2_aC!&BZdzQV3}vjwa;$^bsrp($&<^
z2tjni2mCiRx>UIWE|)F7Pik6Jl$@mGATS|76#!ld58m6~e}CN11mLMcdkX|fC?rCB
zUKjc*I=8{xi2uD8!0KY769_T@zVvI&W22(RfVqT+hwnk0jv0P=9F>$5<8?WZ`Lm#<
zEuG3S{OtyM9|+%2@XR=@J;pB&m{wL`@u9nWN)VqkS~Z4nV#!gR&c_xz^b73t>jCaP
z(R|AEZJ&4P@2{!1o|KiFOXDnS$`5Ka4s9=0bZ~Xmv!bhat#J7UiWWojaHm;<rlh1~
zO_A|a0zKTS>w+Fk4LR}(CB7TPvfKVy=r%@es?NIFiVyeU^r7|bHUO{$4hb(IBlB`p
zQbEta5FQ>*#OG0KI*QvQpaaBlKQQnhcpO%r7dI;_E6Vtkv@|+oXiO%((!UFpm6iTb
zNKv>PmVjRJx}J%gJBjp5kj6H<p0@)Y1L)nQ<>gEu(2NVbqraZMJYL7g#krg;u>9ES
z0i2v>jVTIRDv+Wb_eLZoB<!7?cQ4({#xqQ+G#)0Af#(ej4A{)Z5}MmOS6ABre{sIn
z1_lPkjypO$3|Hn~8j!<46ABa?pj<pWJY8K~AVkY$^0yiG!Zytbr$HNh4)6%kFN(-j
z#iG|>wwx&h(v@r~dr@5-2RFB-w6ydQ%Bn*+Shfb~uL;<m{(if~Y6@;{_oZ43fJmj2
z=oO9cWYi2PGDE|{v}(;!Qe^sqr-7(>b8~aCS_|8kZ4D;;w>nV;q&POosoqmu{hP~f
zZK2A@Y&4a_<K_S`!hlr*%2mR7Lp^_Tv|qZ#GE{~O#6uuEX9CCdv1a^wXn6R4XF4{L
z0Wa|YFkZQS2O}qaA*EDXj({IN=wKy<2)#$QMyw<I7rXUB3%8{RdS2cRw<A0%sz!Oa
z7a`JEMqZ7E#{C(-<Yr)C!r7|q{)h$O&NzFwwq(FIh7#-LBWxD_J`Xc_%va32oY7C)
ze0!FIjy_v!^Hfz;&2Hz{n%NnQ?|3>YnamN7CKAYy%FE#M<Rl|A8vDa-%*stgB`$-$
z6t7eHz4P&UzdwpVTU%TD&+G2a4tYI^Hp+k3o692a6t}mw0Mqw=-|?=hrnaS>&Bn$y
zU#4A<VnZDB#=3p|7*8cn$%w_E^%(>J;^nxa<APTx>*8Xw8<=G|IXT0Q$nfz0PIMdf
z1I|HKMn*_j*!64$2N~Hf_~`gp00_1Zm)rP={k^>=v&E|0{n1oD(s@cqMEtGR0EUN?
zeth`@05Tx~y?0!}qXgvHkGR+D++3o5yto9LFYkLU{c~-tH5}{M=S|b~P{|w8AFx-@
z&>KFFc_SnjvT47s_wjBH45V@dC7}23*KxohTeZ;+kB66AQ&RqvHaM4*$D`Sut(a;a
z3q9YNL=!AG+olux3szU7?(ES%9a?#MdcN?kfG&<Jl0cPS5~+8SIiJ{SC@ogkmBcIr
zRXfx2x!&sEicjq?Zg2Sj#6R60V=?M1OidZu*~xniBSkhe+ylPI_w8{%Pdb?u8=j0T
z$Is7?spCb7riz4w1V~G`+zvYlG|DcgOL=k;X`D8x0=_-~qnWd7Nk|Nwcf9ihreLc9
zFxWsHH9r1t;cN+D6-7M@AR!?+IXMA_0-A~(b+EhJXn!nya&i(xj1K$g)m~}?2?W!R
z%M1WyvEhRf6IE?(8MUB9x=;?|MAX%}C@4%Ww|ar0SUEU!>#Y}SEv6^(<E=;oP>@Z<
zU!+XP%Ww$@yf^;++}SaHK~FE&Z8=+MnjRaITV(%K{a<@MJU!X2wF1iQ4n)NVbrlSK
zCdL$vL9+|zEPz^{o}NJ8DC0j?!@t}Tz41^~oWKyLQK^rEB_85l+6&WA#RNbjBPpo~
zM2k=~sy~1JU^417I_}GXgM(w-BwM-MI;s_6PpS%6m!U1M{}Pz^|ET)QusDKtYa1R2
z?(XgmfdIkX3GNaC!98ej3l72E-QC@SySux)+uPjt-p~HN`US@f-CbQ*t+mdn8v4vc
zneM-9;XMIW?ay-SOIj$nk7KtIqWV8bDyvX)a}VO<qopXa0-<g8<%}I_W3BxZVBGnG
z+Liv*qr&>*WFVWe<#<s4k#K%{aS;#@0K^YcjFO7V04F{=n$><!mOtbC<fIkQ8uzr6
zT$)<yq?njbprZe@e{AT~ayl(eWrpCBA8Sz>QsU2rI02`tE%*JzUMrRQpZvNGR+_E>
zB*Jj;c_aS;igevDeZl^9+W4d<0<CXk1PhAW#dIAU%x!L-)9-0S!w-TK7P51-)0J7R
z^w#gX+seXw^C;D*+B%rb0cOC<$6ED-k2~3JYS#}4NJvJVMuo2QCMd)V)~Ki`kwB!^
z_4l`Xso<##{Rc)P8_QJT=lSW1m-Us!>9O<<R;QZ@`7;tl#4FOM1wL0(VjgjqJK5@G
z!EQ-D9XA3u+mpo<lVt1vtQHrF*xO$NrQ70oY;0hlq@@K^j2a<8+6OrSUeKDFni-ii
zz*&>6drV+CziOCTj>J^?e_r5U(CA<2l|4lK``-m;3^;!!4UOM72a`b3^ze8c7#IL1
z?n|ur$Aa`jMb;sQdwQfKFE(~qPuAX!ZFl#^>nJxx*p9(o_ols_v|Tqr&&-QyZGb$1
zJL*yYoUmWO-`$^a_Kb{-2Fe*9*ZI=#GH<2ev|kkv(c6;x^k_mu2ab;)>6Cjvj_t)%
zOj})53G1l#)M@j7>+E=<lVKuWV;lQg-y2D8BmK{;SHU*AbKp-sr~LnKCH)-_=-a-m
zBurwGkP+q1jwGxD+~;Yw5<|7U)_Any|67sw+cLf5a3715WU(btQSmM)h!qU`!t&z>
zWKH+9v~(fV|D8C5+@n6LwbgyDR8zObX?AX|kEOJ+QR557`&uB*Kj_?=>guPP!=F}G
z-?9|K!oq-`$(<PH0j&TA0bu)rygW=4lnbD;f&$hWf01)@Ye`7-FD!igyH6t{qa*5S
z6ZxPB^_$Jp<*q^40Yes6CC;_k5+V7D)Az%}i)r~IxL9FZmVf<z<xF3s9<Pilf7-U{
zwU)<QqiY|Y8w`>0@x2z@NlLj5Mv0B5^KBdLbCcC>qcyq$sXklKT@ax9vz;ALs+jOt
zhUx45@rLSZb7v0}10EXjqD+|}l^Mkfzvw$fxH!|?=-pOA<t0>c<rM?MRq@vXAfI$r
z)(bE)Ufle-Jzn?Nmi<_Y4~~F_hc7I0Io}g_2PGj`%()Z9spK>_e>^Dzh&HaSu7FxG
z($J9jP7o2wiHSi5iw=#9h=zi@Fr^mKIJ5#BLBwVp=I8e*PP(qTI{E7_0~eR3(wV_;
zzFXzwOA>AFkJX9x7RJU@GBaN2hpPb}f57c9Ff&tYF<%~?1&__dO9sAH`4J?M8JU<k
z0MP^74~R3K51WD6+1U#V8e1i)Nl8hs&-eS+kN<r<kt86g)bi;s&*vT6S&NH{fD8*~
zv9Pl{4#zVBJ{BAtY!<zT;tb>(7JDiRiq6p#+go$D|17!d=(L_Of{sB!C5~3?fnDA^
zhLUnnK7v>KVOZi<c{@9ygWy@Q3YZT%&4_f<zhG-CD=)6Dl=P~VV&mfhlV&3&-P{{Z
zQD1J5wRnJdpz)XfG9_P6Rx;l4)r>gwba`_G_u-fsxW)eP`j=bv&sbO&T{6G$d7MCj
zpVr;4&yZ3O^*mwU-YRW3`xT`i8+ELKpjDyM6rGyd>UMty@OolmVsSAYFUINQW-7pr
zD=WNYWZ;Z&r`^H9!u>4(f%Qia%O|lK0r^}xUzQ7iVHFjXpFeXx*5YIB2q*dJ#sD7^
zZfpchJj$r{ooWi3R!mfMBhPR;{~G}923ZD+^@f9J2t7gaE)lqF#sET#9t=d0pPrs7
zD=Pyc54HjL8<cmA$#`;NB1q8Py)`sc#@w9lZSi7vI3Xo5F;&3pySh3ysM+Cg>-6+>
z*`|Z>MPc@SR|W;<$CfAz+!G7x(Edi3-@1o097%FxjVbEeIU|%`mD8yf3k!$}-P~gH
zOm~nx4xtt?k#S^cZ>go%nO%a;L+69;9gk*^2@Z!7m?6Qt{sp7^@u#ttWxXmiDO4?5
z0zijMP!#a~_4DVAO)wCP1I?d5oi-g^$?SquJu^j_T0RCfLe&^DZM5*(+LCesw8}qb
zXmD6SpdYhzzuySXR=|e#Yl5CTeLf)*@k+|ee|%^R5)~D7I9ma@!wZN;P%cD-V*u5m
zqoGMsC;^=o##r)4NB95h45YEMv$KCjf`Xj@B}Wi&v6@X$Nd3Q?E?4or4G65cc+!41
zi%@7%lVwxjJ|yhyb=nQqV`F1V#4Mbg1xiJ}4WBj*0brmyK0ZcA#l^#m9yENp`gs0D
zRn_mlPk?k4goX|SxeP-kU}FIF;s%17u(fsLK=E>-l^5tqSeT$TJ{kFDUwHj9I+dWq
z7m%PW%MYB9q)(uW3sM9k1P%_tJl{M@+0=(MOJgN8hr_G%i$okrS&WEZV+0yCP>Cb;
zv|2noM(7xyE@J-at=9{p!Cn-l!(&rW6G-9|W!MOS8ZQofpU{zj+yqbqV$9$_>hqJe
zd<te}n@(>qadB|~Cjh78gh>I%z`_DV0uLWwnFd2fX4v!fiJgOEDB5phvnLRsmHMix
zETy9O_;|pgOI^IaKLS;jo}TW&y*fO6Tqs(eBO)LRE~YNAQNnD!(uhh#Bv&w9R#pa3
zFn#eLaEM?29`5dPsb77*E7~7U<pl-701-<>r036{Kfol|zNeN=L?I+Z1a)<F;RK9!
z4c9`rxVQi!4<x5Nr6MLKCVI6}lp1#jhuZr3`rK%kngL9iN|SLSy0~U>Lm_YT&&A5Z
zxyIQlR$v>z2msj_xU#OU%>+G9#TAmET+&zpyB(MSec+(kc7PA>pPwV6$ygi4LHyR<
zDc5O2!@|lhE90|S<Nds9XJ^NP(4$TZ>I9DT89}?+5Z3eY<<TCYXKHFnlw3^3P?Rdf
zX9CyCR<wLDPKtznSj80X3k_0$kOs~db|EW9?|)>Jn&+mVL;>Q`(v2ZZ82C?CR-H0c
zGbyHA*|O;fd~V(9dSHHFE-saxd<<F;U|=AS#9vTA*K-{5)9oiOuSZ1;EMWsO9Q;rI
z;PLSj6~qJ9Dl@w`htojcKfc21<m3d%B%qrAn0H+r5D^gpEdYelPAp6J>u1G--(t@Q
zAQVhYNKiEvc9vMtHh0KlA;jqDXtFX*UiO)kH1PHcy^eGiecy%Gxw*Og{QU0j?uw2#
zEg6~6gJ8KNR)4vI@nrUr+*}|?aRcd7Kp^A7_$$HR1yEvqyqc$HyAmCM^yK2+9RfOy
zAbPb<=XIY0`t7byK|vs>Pj{z&H6~qSNUnF5JV7*ExNmRxAQDEzkdTc)Vh~7LrfVG8
z>D0GGUB3sa(L-ChLXb(|1;l3J+s==HDWr(H(wtWd!S%=Ar-=&)3sS+copSnnPkY9$
z#+0{8!f{)H#GZ*<_WAAYo{ArBvP`=H1Sk|VDk>@h)X(*H4}gX1YHE%bYfQ$Ld(xng
z2p)h$-{y92Y-Du0R5#q)>)*2}8K<nH6Q;kA-4H`-0QkYv<0J6eG4MtJC>uSVow6n6
zQhA)M{{^7}K^q_rjVgm)=XDS2BbrPR0S)lpA1pZ6d!x&>X38!uj{rxtzrVS4Cw!BU
z!RN9w1h@jo8R|e`0qXo`{o3pO-s|=0mW`dA570yaAwxq$$;rv}+FT()gM)()8wy%l
zT0mEje<yin04W_Hf%t@kkBx&shya|?gat>`6iARCt3SxZo<}o9V4t9Z=z=-mwHUep
zjxUf)OOB4NemHf7jQgol@JDh~v}n%S++12(8UWM^;5u0Cb_QIo_pDYL6;W>|q(o>k
zA|rp8n$kS=RuvZ)%Oo&`<8#W%a*9fI>a*Z{$OQlufN)c`Ao}?D077wic=%xC>e>uc
z-~pw-@Zn$Lrxz^EU4kejBS&!@9kq{{;61>KnGB97t*C>50f&PVv@X$_^9u(dkqvsT
z+&_VN{T7AdKi`Bc*PU2^sWIuvmD<>Yl1Zpvm6rsGh@iZ#=&54rG(-H}6_NOCOVa8J
z>2@!yhIO(8$;3pGqi6<A#OJzmddle9-`~FvxEBMKOjJe&kMm#goZFK{<#L)@cxozX
z+H$=PBv5;M`_LQ8PSal{U3g7E(M3i7q<^%vk3A9a@Tv-jdU8iTIk&gB!e$$Y4vLCV
zGYVM>iLtS{B_+!X3p7pwtgL9**4EbPNlCPLH{$~DD8vlYb8~ONU<7AoW|A;7Gy4d7
zf9%hgGW`NFH8YFK^QOqk>h2WW)W+>z(ING&^m?x!UTgDbV(OlotC#T+T*wP$`CN6%
zN-hFJGBO%R%PXJ<{4i|MLck`DL-4ZpX>zjL=hO0Ahk2ZWdc)~^C^kGIBBuO5p1E>e
z_(~W-n#%^K$!xLnbb4A;CQUM(cAbHJ893S^dQCfn!K>-vM{wFK>8jtC20i!6Q!UOm
z*w_hk4IG#-5W39{QnIoDI{*>@`VdXA9Sm&jn8BTohwGrSUtp1*Tgm+i2mo*wjS^a~
zVBy{BL(et9)yuT<p6dlS<dy*k2%2EhZAKvGPgVHJ%bN=0`gB7ZpkIxF1P_0Gb+u*J
z^kAf^nN(kY2guZ=j5|N4x>M4}qcVZg%vJlWGYAwDy7S8FDl8?caTNXB)RYnl%1AQ1
zjJEdkOp)>_S`JP~0*WY=H2VPHm_a<-ec^1MKX2N8wVM^8Ml5^T8H@o8<I$$%t}h&a
z(9jM@rWdcm{!Flq;09$?IG>;pf`Wrl;r!kC*MSHRU^E6Cq|KT{7!E2HR)7E%UXdY}
zI$d7K0mJM@kdDYOhAL5-ku*Cb-h|~U9R$kW4h%lN|Lkn{x0F9PcW0yYPvxQ=Is2pN
z;4r<?|IzL0FBCEUi;L&08N8aN7SCsG&A)OYWwGKDhJ&-4G+{_oG8N5;M@C11Gm^UQ
z15g10YK<d_+?@=^`D`!{NeUMt+-Pf%z0)V7psjs;aDan@Gq8O*K^sR0cgij8$Y}Uj
z*kH4s&S|rDx!upK+k7)EFMx}WudSgGlys@rGqo#Vv@)Q$V{>?waddpFj7$K@Zh{ZE
zbp){h|L=<*gMPFCPXMNU3yc(y^gS<ovEN^=kv#>dsrN&f+hLH9<YZ)8+#jz#J}3&u
zcRrXP<#p%_!v+5SV@>k-=m^k?z6j#+{cE8lG3Bx{+j}MiTyUH@Cu$PV%F5E)_@<yZ
z6aqe!gX=OOg5MvA-#m=WkVw#K<q&#$KoaC8^z{P+rSq#Qq#*}|BSuOps6slQNy2`q
zCXJF*MO1YT$@^3MDX?d7U;u~166dw-+h+tBNy*Lx?t_Da-!3j?0F=+`d3iisWT9~F
z?jIZgcV}+kYnyM+W~olo)cpK>XQ#JZ0W>u9r_SjDd9cj7y4$nW7LfpiuC+Z^K|$~3
zWgUq?&jE-KeM7^Y{e1}?ZXTZP>zc;yZ1P=T9#_}5Rcn;;IG-U9a>rgd5tfICf0LCR
zsk4~JnDiMn*6Z-}m?=~Q;*b*Y#PoD%csL~!5Lj#}CxK#(AK(AjpvumEJC!H%=>oF%
zs29dO7A220N;(ff5|jjyK%}yglHu|3gc2e$Gt*tLA1jR?Pon+T>1A$iuA`G$S65eP
z5E2VPNSFpBAJHR&pFiIp_ldDW9pB$PfHeK13mjl@cS1RFai}V5A*P^Mx{?|Ozu_VF
zUW-3un)zebcoeWmP#zwYmEK(T8==fU=9w;`F<c~$54;U&v08%Td-gy1U7jJE^dYc(
z_E~G|b%yzi4{c<0QGX?5PWP|Zr>-uQ#=)U;7+$T^ThGfs5IN5?>Q>pOXA=Mbe#I(B
z3{z}5T15yTvH=AI+%JCjhspz2>RzFi|4OL2q@<*s-4y`d0JhZGZgvB-*XnX@40s@&
z>8*`enRQPTxdh;16zVi!-W3%#4c4pTVK~14E@oq6GjKKC?Dp^L>jTu_Xud*EM`z_P
zA&=|*8K1=*gS-A>u2hT~U{Y4g900ZeW9%cy;&7nw^XJdrhO^H}Bq-hsQ6B$}>)MGL
zbsio~GN;#H%d}?eTb1b8j0Npjfk>6WEMje~y_~hsx*q7iuxb0oYY^D;7`VTDEJ>OA
z^yJEv@O(WkFfFE0XRdmxos!Pu%*4&@x;qr->FLSA!EroSraaU@^|4_S=p>*u%zEvq
zDJh{X3J<lkF@qQ|5C+ifXmXg`H{?_br7AI!6hsjcGz?A$DWz;1I0ylPB$btwC~ao?
z`iko61wlv%P=4e4<YSF9v$K>sR-jA;n#O2TAhIsc%zW%qz4%Xa3PzowA<dMf!o$N;
zDpJ{+T3I0g9UUF*6bDM;X}N%cLPCHjD*f#nq_?lHFF=%1<qAr<6bHx0p>!ltKt(QC
z-i@YkvazzhyuJeElarmz%E}6uq>8RC;}W`{pJY)r_b}_%fr0;@Dq8FywqEf*u`DbP
zsQnUYIr~vV$A15<A^UwK9Q=;wo-US5B_DD01OiM*Il0JWIFNz@=>Dv(Od-1DsL39M
z5RqQpH-mU#p|jbMaKVLzg9A$&QcF)SLO+o#&>EnghT2*bxBZFi38vIU8nGWWi$IQV
z_IiH<B9X3+4#s;H4PE2kYIl{-!XhHNy1M6*_~EbP*>h50Kp!0)97K_Y6pK`di8G$>
z&$kogGx!makn)346}+9baS@=}KYIcEaJ@h7b-CpagkGRxD=L`V6~%=R5Pd|!sjk~n
zWQ~`d=tV?GV)Vxd9<F4>AkWs3ulIXS7OfJHiQBQIvw}Dwh-)NJ(ZCa!d`jqTo1&qm
z{(SY<adjA+?T#DXH&;~Q6%s>p=b1_6vTu*oSC)|I2jU~RppZ}(vDZtL=_DCGehQ$Y
zboi5Ruh0AA83NB%a=aLWup%NNXu<#71?B-N<cAGFiW`QO$ute4K$EiMv9Yo$Q}GWE
z3j<)((XsAe^ytXEm1D4XU?501OGQnsIFq8A!LAo51|oj<#{cd$;r)F<BIZLbvt#^c
zh!P@pP?RcWaMRY*CM^^&3XnI@eVyA0l2~XELQiybG>6qvt;h4-%!~>jUz?C0RIrpn
z4aLU8(^GO%QeHv9{@&hJ+Mk7mg`Pm<<>lpR(=P^E9c>DtCYn&txJ?|E3oMYQnU?WI
zNxgU=5}LwO3QEnwi@$0@e;XP`PA8*(;80L@<$tU6;K|MRO()ujlP@p+`?u1W86+qK
z_HqdgfD8vmW?u@Je?vn<qD4wZ#(I%5wdQqOb}Fw6D>rxY!H>-U0*W1A>mR#XhlZLR
z4x^JzUW-mX2qpUBH}8$<uovR23I6wX_oSpGE~gWX&wf|I%#9$BpohmRko1FYL3ej|
z_vh>Tc1{02EiNuTJv{{k1pFfe(t)0yp0@Tf(7XNpkG)d5zshRsvShFu-5*!eLf}a5
zRHhG6&_ChgZft=Q5uLwEiIISi_S^Wh-^bTn`o(^^gT0*IZX<nlweiL1f>TpateVFO
zZxbcQdLgZ%=CG{Fs!G72cM7f&>ka5b6O1C0JeOpKCUDkST_+Cg|7CPeBcAj8dP3~X
zQ)9C>(wgQ`qpYTH)*gqsv&-JTQc<pUqCSwRB*Zj5N~!eJ8;~D3#ee}0=J|$8C9l@>
zNB~Cq!n?IU$Vb&sJuaB1v|AD(p7Z$hBrYoYm5Zy1Lu^x+ld~Z*5`{aBDXpQ51R6hB
zlne#tX2)FEGX{b??QD1VR-t?@G$h1uIIB`bAO>NGTvemq9ukzBm-q3dpD@{+N!ObL
zAP!NroQH&jr1QFL9Uqr`(^8?U1KbZFoDI9CQ6;n%jat-YfDT)n&jSJj<&(cirTBKs
zRk34{MF>;Ukz>HwthLfUyX_8P0>zGujC^`3ifg%>_p!mNXHy5DhL^|d?f!`Q$w@_~
zj5!To3<x224-aCXl1~=dG#f}cI6js&PbPB$?XoA}c;=N%93h#QCEDj|nW4i~=eF`e
z1-)PHaaUQnnwvMar+=Fo_91N8ZY;5X^&;wvfIjrdY%8|5MnMC2;QnIomSD_cJd)_^
z3%)4Z3W%gc1W`C4kJ`3BO~_iSi?XK{YCR1Cwwxvg2U(QqRPKjpHhVmC^g&bBO32Kk
zE=#E5V0+vgD5|N&Ull&ghaDxj(}YN8XkT7lf^6^4bkWh#0a|!$_+~PeDx|355-<f=
zgr$`g(9NMAEPy)8rG8b^)onZL>4N|`NjYB@7cfp=NO&3yX$=jH-@hM{*)4L>m$tUH
z{u1#W?e2<E#pt!WyBy8XdU?HX_5^a$%iwc#7AjsGS5%s!#>RD>EPiV}SZ(R*hlWD%
z_J{8pf?Kc*`U@2dp>l>IN#dPBOdx>tv){Lk?~i|1)z5EavWcMOdLdgD23<Hx%1XoF
zrL^?bRi9yhatXle3soXhrptW>W2kEuExqYL3ss*$BpVWPu42ti<&VHXVg5u9R?vXq
zv=MHw9$L30K@0Lf=}x)iY*}=&xa1@N;(C+L8Q|-!t*wPB=74!Sov)p4Z?paA1g;HR
zOH;FI@#NsZG+4CSYPo)8WrfRrPd4@I<m{{}1)9IV|K)GqLn8PgJ3D)OLPEk1nrLnH
z5hQtdd?Xa`bU#_38jbJ&-@O1;z_ixa*Y8iB`xk(SFCLC}dtA}Mq*Ys3T55TBvUrsf
zvyk<!1y#qqb9+4h@u=^)Qce5)v9iKKjRxy9KrEUu`BONo@BkeH#t0l7yiw;2K!qZe
zqoFwZI$4YPa$P_hPuDx%fe^>Yz`)AJw!OU#2ua1IaG1fQQfWklJTP9B`aSK>XD#&V
z<pbklX4WBPRVZQ7Dgj+TO10_$P##)bd<2fVKbE#!V-lfae*)emm~#c%I5}CVF&UpN
zQSb12|LzhH9jm708w)Tx1Ox<1@V|DCXK+E_0vsJ3$;rr6ta~8KYV55X)YLa{>he9f
zeyD5KB>Nig;z9cv^X0rlaskKt_>kym_Tr6iVBH-@YG<!Im5b#US!1)WB!s?x=eEy~
zI3+vg%Bub-UgW6)<La~O-ILoi)j}<7badunK;E}Rzzov)-16npnvI6BfQadMtOh73
zfXy-@pLv@L3k$Qe$z1e^wJ`$Vv2k&WNZ^+LvsMk<+}GFF;h`Zzo-!^jF2|_74%&t6
zN?i%adGKWkLQd<{xVX520_rrmi12Ve*PFud@Ni24oC2`jv{;pPzUcJ<F|w$I<>lvx
z2O8#4e%lSfitlX>j*h{i*-1%@50~3HIXS!JI?WD6z+83UP7}^@IGE5MPv@&96b6Rm
z`S!S=q=eq;V|9)}8*iO~Nl#o?M*$Af(LpqVKnNO9c$YIvN=}^moA5VT1u|6j&q5Mm
zg6At{FiLAuMU^Oo>~MLL3VeJH54Jat_81^UM5{2{J%pnT@94q86nxiB-=(xzQL>qJ
zVs=(xREWB2bD?wv466l^L!-B0{|0R9poL6V?c4<BNq_iBM0^$Nq8rxj-EMn$&J_jw
zGOQp`GA}PLa&mGAp;G=G3N9`eKvbxxs6@#o|NS%k7li73wj!h$J8C?h$~8SW7%WQ#
zxGXbs1pvP#F)?Xrh@cX+GNmMIef`Zs#T?Tw$?5597n?nK!zd!V=37_0!%R#}7;wFl
zla~Wg<UneQZqPWH@S^sE<DmsAe6WDNLm4q7JAp|zn(kz8&*}C^)yC%ha2mK}u|S|)
zYjXomr>ncFm?I8I{-E!dv)n(~rk0ka4hiyT!8<!UwLoHLj8jo(7)5&qRQTZV5Rgj%
zZyKn2v9w{tDd|X5nORw@fuT{Mn_XJsrl1hz2M=&v(3~#h4atT^CV~JxGR95hi~AdB
z`BsC|MV-me>+MakAETn8(xI!?+lR*$dW)y2VtsWg(;rZw`5Z=Pp{DHZ7w(Xey<<3=
zbu})HagEz%iCb*hODAtItQef6xxKCJ;|HziO{GnzPu*pl!)B5#Cr6VMHf36vfL)xg
zC=?T;2yz%r?qfSUD{OJwUPr{Q43QK6_3Lt`NLiC1{_o$hNK%m<E25qp?K<<gf^MhC
z#B7CIrqpU0OL-;z6m?oKFfcm%Kt{M_M-^MfN{<;r9w&#xDgQykXh{lue0)HOfw_Pv
z_MVYv#6wFuW!+P_=~tWaH{iM`QVtqjhN4T}cerVnjc5GCsO*aqRg|DDOKd{VNK)pP
zYAPYhE>6E;u3a{_@sn93V&`WY1x-ye3yT()>pdVVUMe5^`T_0Qf8*$g+vCY$QJqi#
zUGeKX(lO^5&R5e)j?csbu9XghFU!uvqlw&Ebs26wkN2b`fAr;gKpVPA#q!>$Ff5ih
zAn#)2Kd30(ED`#ki*m`+{T^F>E&?Qz|9;s)T}5Rkj$R!KnP}t(%gncLUH@rjV6?Qf
zR=WocSv0BRNouFLf3AxTj8=yutq;sgjgvGgzW*>Sv_{peaB4%q4JhAxU~M1AMhlLO
zk9Rs-X$lE}^YHM{(_05f4+j_5!@SM*zpefIg>{b?8o016yVGvyW7K1m$LSMVWPXk~
z1bAaJcm{G*)I<aG7hP!?L74Kra(7e#R{Cliw>*nq{GUv}ES)Yl2-IPH{ht;-;E3;e
z{p4W2VLE8x-Iu(iryk9?HSHMY8i`A{wZ`mY$A9w~+zm79IaH?l(Y?7!5jmjP;+O6J
zUW*1*{RZC4w`;FNPeUruN=b#{>*3&?EXeyGo&x5Id;%=!zSx3)KVofr<A0hv)y8VT
zJIg99!cXub4YDxQ;-|uRzE6o1g{Z>mArof^0iT0a7%=)SlJC=)3I3<0R-m|B^?2cc
zcWTg;NRl~_PpLqVgVHn=7$NL2vmm^y7}TN^4#ZU*8Ik_C{Us=tz=vDx?v#0KbIzT>
z?kBtcX-5Zfm9>pz0{n>amuOijH;b8-OXNOJyHt{d(Y*&Q1izX2Rg6mF?dl>oxxGax
z$){?@n^TvggXc0^=Xql8qA}meO|k0kGGQM(v7fRKepN~3pF8?8mTMiHe8?D0GQXeT
zMkX3&mlOAd6mcQMMhVQV;X#<eAzKi{U(wmRjK913kbCqq@$SP5b_GGWg{mHWaz(42
z6}V2>BmEQaKV{xtl;>f-pTK>Yj~2LodOg3g;o#3;geGqn+3ScWn(_8p;rMfkkU<;&
z<u{4;*@zJo|1(8MICtZ`!=s;_T+F%JYs_qLBZ=#A8drvBUc90feey5X<%|BW#y?If
zfuRw*ttPRIkds!di>xHsbAf`^#xUK?9Te3scxGubUJABcp0yc-Ur(%%e0Y<UBh~KZ
zT&*4Hu5plik5ozPt%4Hh`^KMs`@N0ErJXN1cqAgpgS$Wz_hm?N)oOrlU(Zw5>>tUk
zb%8<KNwNN(`hG(U;c~w=SSJiJpP8v#Q)iHn7T3(lh~@Kb4ny_u<EQ)F-aXEdKQ8HA
zxGpRr3_|i_wH-(6W0QZLdKOpKGZHM&m!yg2IVzSf^n4gm18t>+zxEb;c$MRvC3L<T
z#L*Khko}VUB_$aZV!_#mLE3MiLWKV_Wa%q%26}{Y#{xCym^!5OU<Pb{^9~Z0gO!2j
zrK*$RQoS~qKzd5e*eIFXY+Wb&{HNUgZ;mD08irnIaeu$Pi;<AMpHE3I;<g8|-k&s&
z%^j8mq&-s5)q%2b2&*|y6{W2PAdX|$PD6|R+gp@n%<*(gfO|R={<|JFW~M(Xm{A&^
z`WqD-&nlyH$U5fi__2k%UHmF9@pfe*U50K^-K{~~k$z~%P&xjM1s)s<cfaR5MT$C?
z&iZN*fvSznZWHdfXLMgyB+6q9@hto+s{)@?Q3QDnMJ^lY#6txyN~;8AsfF-UX4T%@
z8jUDQ;%tk)@}n6aV!`c~Sbw=Y)>_Rp6g<tvS#f9(Q+qLl_i|_&0xkszXEu1ZmgDo6
z>MdyEpW#_w=_bihN+`GBRBp613Jhc@xlw-`6ru}Rr(MNMyHXg`N$QYdwUw7BFDTJI
zIA%3t_~~I=U(}kGr_;bC8M#v{o7*%0d)&DYqp34nE~eZiKn?b;bO^F4pPCm84JF+F
zIbB+Od2VsCj_vga4D`U=-<Z4)>ilCJ(QL!xb};y_Y#Rv`7VW)#{^j|*g^yr+kT4}}
z`)@TDB|^2*sYqD2egE>bsn@l{F|SXZdmWyV%vBz@*9d4rb@0!)cBIX$?cVpli>^V~
zx}byY0b8Av#$!*Z0SJqUok^)CqJE;)U@<`w4CPo3xnx-kr{@0r<>o~8v8Xcxkqldg
zV{_SA0vk+D`1-;PZT|p-snz#769rh%hEc!mdZNRD)M0Vf-jQ@zPXa@GV#m)`)rmOw
z$LmJyV$|6jM2IqCRWuA?a{4Fk&xB#BEq+wZ6s)LG?h6%xK_sH!2U9`Se{K#%w*qe}
zMd~PG#)%Ws%~0?qTwnVbI6OtQ#LF}YViP**Dhst3#J~5FR2Y<Qqk%RUBRKiVr&*bN
zUXH>wEnn^zxpv8-d}}4;bjO`(Yv*k&x7W{TX%!Pp!4o*C`223E{t}@dr=>oX#^*2@
zr-*=Xgyx~W-EP_GxaVO6B|Jd0+H|NO@yZ*pjqi2E7GRkvQ<LsWA;<GNUN-O7%e@I#
zhScXBC5JWS{_S7YyrfnRL~zfOk^H~~4b^nVt!Qh#IqOT-&s-KXu9A#ieg(22dWMlR
zy8o=__5A09u=orc&T2$~anVOG^aHYY61(5^T-GCgO+imc{i<P&ws<c%Px-u5o$^P2
zzhK%M-t7!OcENYGNbL4S*8&*+5tiW5{ihSzJm$ZSS}70xDRiK(IEqJ&R8d$L`RC;`
zBdqNwOAY5P+Y!cE<+3EqAE$kLX5-pT72i&fc8gV7w%3O9_;pfU^0-h0gs*{8?rY3T
z^uI={K_>9M?|u2Yda6}FGpC}fl=~$m-JaD=V5jAc-Cm;^h^L*Mml}JLsykpITW$Ut
z;xUF(GrMosa{SspC1doPq0N_ziDxIFD}fS;<-LlD&9zI<vv;+U&w^~N(uk@&wf-y~
zr*Dzx-S=drN$Q1w0&#j6Ik0)GGE*gJ7Of;K^!z#SuF^Ms0=wg8&E-ndRb6x9s*>ay
z^PV{G=Ah{m!Q*n+NZoHH?O#0kI5PkI>q<6u>U+}Y>^B<I4mS6_BmIJwg<P=CSsVew
zx8py)cUPAZ1Pkjf*J9yPhVhyaJgv(c{V-GArZv0wzzcfX71LCC1tX)s>oG$a9B;rn
zm%LdARL@-rw4c;-kX4nL|4Nn-&im&n#sZQ3J1`BdJfJ`qzYM^=n+L@fvdL<Wp_&h*
zpAkSC#zOY2S#OsC;lBo#@XxIfXzk;gX{@&VJr`@8q#Q)et-j}x{I1RGc1c$tix-p%
zw|#CipbI8BE*u5aZ7(APuvvi!mV#&)llLM?_wnbSLOfQ&b%vI%RJcNNJPRo?gOtLX
zJx5w#A>|FVD4$YkD<m%tNQRw!1Sf*!GAt}d$WUt@eXYdAwx`%KTABt#e^G25YA#wZ
zFs7Q#;H#b(xj@3e2_&b`=HiU+x)kI(Oiyx6kEKhIys4?}CB)xN&CbSLRxQCmx<=#P
z2hCDJpkc?c#0jkLb$aKTPf+>@f~)jSq|5fTC7Yw81=B~dz*;rcsF{@=OqC2x41~-#
z>1c}#%@74tlNLb_vXdhjBHT~3R1H-9W!ChnnQ$|aURgqN62~xuK+@xVHM~nk#Tql7
z!T)t)qz;ebP5e3n`f;);%Zkdyx4fnkp`%3Zo~T2QlCv}ri>lXoy_PgJs<uCJe<w?K
z*<fPi={Ehn+~Kx%T2o+3n8AnbU4^3b90a294R|=Z`kN(CpT4wju)Ml;%LyML*AU0<
z?&y9Q7Q^N9>D&C@+OIdc4p)~aoj#6Lk1MO_Wyk)}K&Vjm8vpxLw0XP%sp>1IcGI-h
z$3SS{)bwL{H5-__85NdaJUP@c9JsvJDeyVrwb~S_l#3#po279#vfT`mSDOk$E+tqI
z9VBC#@kdUKW~MiPdeH4y(BGxP`Sgt2s3Wo`jA6t{<WXA4>KX};R(m<ddw-K<YS5D`
z4y1e?P|=3>uyZwgUB2fH7g`7@n$GP-46>W8WvH<%H`UbWdXwS+?iT%LRrvA!I?f!q
z1LMr<q1p!736%~;`ke>~xhBeBlDQmOC!uZl)Hdhz1LG9Cy=O#Oy7LB;^@mfw7rR{o
z`IZ1{>Xc!G=2pw~TolgG6IW8PRjF{h9WMT#GX3ER@jBnrRc6K(8EjSu*7NoyoS(Ea
z#<;NA-3uI>Z)ByyH(#CGoWj;CJ_lC?-bV&!PuKX3-qJ~%BM?*FV+0La>HP(PB2_fb
ztrrc+QUfVZzbiSmDF~BWc$TiaXn!Lm^R#Zp6Eky|+7V+9?U?2QO-xFc9J<57h|<KZ
z{Hp;9KbY83qbbcjZJ6(=mf?w-Q?!U@g6jK0!Z(W+!~(r|w!%Nb=}>U{(C<r?XiK6A
z4%8Ea+kTi%wb_BpW&&rDdy^f*Aa6OUKVwzI(@A;X3OQ^kqbZ2aWBpz=)Ou8Z^1n<_
zqrrmiV*BQt8r$D&Jv<I=Y^WS&v)m}!-G;Xvb2&}5spC%^Dv4}5!9g}uHKH_2N-C`j
zBe5$pb81)^8j*wdY0J|v5Fnhwl4Wu(7a7IL47tBc7HfDgpc34@VRJY&IC!MvWjZKw
zP|wJwIoOLLNEuTE7F04iny`yqI>P+bvcSRWx(Hj^x=%e&Ty;gJbTSW>$`$V<-E?|B
zm{!mD*czibQSn{pK$46EG%@Y73FxZC@5@c(quEPJo{l=A^*Bh-+TW3AyvcZ;-caa7
zxL#8w((@UH=PKe-VPhgZqalq)2_Jv{$G7OasXK?vQ0oY*LG3e)*QSZdNTI0$bXb^$
zVZOM}TP5@mj!!YcFu+vV0T&}Zkbb)~+4W*DrS@{ReTeo`wscQ(1j|hL)bm^OrEZ}(
z_8ZaEA_hUb;dfK(?|Gebk>H>nzMDWdcNR~H19Or4g@?0KxAfB4z0irAX{$EEBsfiF
zxitF7!V(OqxC;;BobzWK%xZt^Z2EBtbs|rtxwTmCoP^1n^njxP8Y7rqnxw*oa(hTL
z!jL2AO?A~1kT(bg7DiE3zp&OYyr@JL@Sy%m2urmW#UJGop4BT!a#SF}^*dQBUlt7I
z0@#26JS)L0bFEa(c9>U>09|SeZV<zPiQSgV<7{Fv>?(qaTGHJpo@w!VJf_`pH|E4w
zcfxdUS5nu7)m;9cJOX)9m?r3DFXR)#9WQUuAhQX<1a-dpv_(6UvkdqI8S)FU*qmvv
zOQ*1e4(Z2SajvTcd`#=-y^VLKG72;bW_1sFQufyC{3u9tKH~2|MD-poLf~Xz-k}u%
zV4X8W_mwdlaHdlJr*fl9U+b@xi)aoJ3L``*)n|J1gL|wpMT8X#w?Y_i*q!mq`>O(*
zk7druEfw+7zPKokPISoCZbkT(b8zSI9C98D)0Xem9-MGvKo+GaYEnznmthAfq$>zh
zqhl;dRYBY$kLvDN(6vEhnzms-^-dRCi&(WiXfZr5TSLj_IWI`$FIG2gb(?Q)Qs?#D
zoBUxmW7Zu&iy0>LBx#f9G42GR(*@h^I_{1rbHVt^Ua?N#6eDs&2t#vQZ9fbD)mYJ!
zpZ612Kl?U>A~|s?)~jApYzGP66}b9G>G;@a6^hk2%$ObT5<<kU1`{)w_q#eFp$jQ0
zd)+YOh$->+S#p@LITJz}##yC(4xe(~0TSdrK3SU<p@4zX=B($bN3y{KxzdvB<?xG%
z0-8}!Ikxoo-I+2%GodGz3zI>z=jH?cZx*SQl2l|@qx}%_el<~;!Tznlts!JE#kaw>
zd)Rs#YbJ_Eye$crr3FU?a(;_@P*SO`2nx<>up^1EqlbP!w#>xRQ=fWwwbaYejWb(;
z{z1_<rhjM-N5Ll-xkt}Jr+GQetcfbVGcIxF23hiV_R}$=olZ5GV1lIDG`D(?WDd`5
zTP2@Wo8rKI4*V_?W`=ns3E{HjdBo0zjE=Z5e21i?`lH3Z^Z&DaM5%EWyWP*GlWV0}
zw=J<15<rhzi_q{Ta?z@P|7GS%n~^6%FePN8gB{;Mu1q4#+)*Ajysw*9@w7VrF$I2@
zh@ujj_5BkHFQTWODSZ~hmr)2{7Jir8FC{XTQ#a3N@vX#EE(mVEURv-L{xAzr=M?GC
zGd)t@%)M$cwXx}X>EMv4?rVK%<TAl{*}h?i#P8Ox{69m5A$)=eqK@j^B@0V=d`J!s
z<i?RiWutp1vu5ti3L1A4x}_|+3}CbB+kcJ3<SE00z}nS0SF|RkNvi@qqFZ;8+TNaC
z9~=8=zk6Cwf>7|d3?eOR{XMyy(70otkgzoIZN|4R4qwyOe`^?%4VXNcsrtaQrD)ho
zsw$Tv)W^&*D6;+*9(>5rbaWr=$#h~&LBiOuV7<3I3lV_xB(nZa9m&ufNgWRYp`bv-
zE)D7t$H&jXasE|n<FC2>et<1s(u}D7v$zp_@C2DnekY1Au+Q13sZ?Ieqio~Q4jZK5
zSk@^R=s=#ixjIOqzItz|zmeApcn5^2NMZbn*}A8Q{$_r5c6F<}JuBD1ibGyf(-0IN
z3G=y~(X283@S1D@laB@^mJ4;koDAN%l?R!k=Z~&GqTt@riZP2Nss>RgV$PWHC$#3N
zl8oX)FHQBR#F(t8lUXQ75Ygu8jmgw|p%fU=TXq^8@(e;<Dh-3SWkpQ1YG*YLPY&5H
z7RKmQupqkQe<0g^uT#zyx|JJs#l<{#dp^6!jKd+)Js|Ta^<u*I9+Y21^C9mX$$%TM
zXAJlKeWwdtc9RG>;dLEB*Y>jHs~dz2WNwP<Je&XCkT4a1hF~6(O@-!7I-fyJ1_KJ>
zPjv3=Z5^&C;fSa@IUShDLn~<{J5MXR?d}tv$U}`g$8#(yDaDB6But?PaO3y^jm(!N
z_B*F!Q-Vs(`7g5x5;kl$b648;agDo?7%rvJRmQ`>{Ds0+xb}7f8zwwub-BW(`_Q|1
z62DQ*V9LU#^pHSQ@ksIB8MCP^DA6W!tw>E!W^{5QADGz}<lYmD)l#Xh!VdvXvG+XF
z((W;UlREgJVw$a;N01d#LXQ#S<UhW0{UiA#S3?*hC)__@W}B{M1CF|Cw{_^(dE0jE
zN6+CwC=itBVi?&5*kk>)V{3&hU+i)-v>oiCdQy1j?d|8xa*op885eCW-ts&4;&fSA
z=1X9%S}N@Z79(a{SSCoTT)y$4m%|7Nrkv6c70lT|Mk^BD)}i{J=F$dDK>_x$Cuyw1
ze}Ad8k9D5N+Q0n3r`>pJeR&2=31aCM@e<~odv#_Xdd9*~h5r~kfkkl!FpdV&6mZm`
zy^y3Y;KAOt!Prkm)5Y;yHv*VI;$57=jf)Hp3Z!IY>d=qYG>2WERtuz1e@S=Z_G&9L
zwigRPKyxaL*IHDhEg(DrBS}*C%5HUcd~=gQa|x&lX&-&O8rsD&mKl-F^IE^cFtJw)
z?FEOGe$13ll7s*Se0%-jK^7H6BD9xpAAae7w_#SGT$!`ov$Hf&7$Sy!g_S;zKdtGd
zC7+{z=E~~zSBx4Bg{I7EiaTL01OYc3QhO8~UbN6MH#>|R9ApN;Lq2r4cn6BqQSsUm
zdpxo@XS^Mp(#F%y$2h#oClOHIty7@u`g?9I<yJ4;J7eqk^mAV~C3>;|z2cz(--W~j
zNY*mf1d@zagJTk^OvDEDh7-`+^VW1V%`>WMLt)>;Id#pYUYiDn;3wlWciowJ(j3Vd
z^Bp+9OsaY)JJ-y*w6y!(Fji;aGo08cDKpD4ZyrwupMK7u*VC?Qa5)-+Wxw}SG=Zf6
z&z_hp#FqA!g8;=N1&a!XSg0_J^}$RPCUSq%TJ$!Jf#{<g6~-Tqh0gKRRvWOA<6Oo#
zl#@Q1D6kKLkcwRQZ(8Hjib1I-a2_5pq4%6n!tl+Uc3WG0HXVvGTNcg{XDM2-X%;ul
zDNa+IJY4Jo?#PbqR`0^>{F_OU9!Ji68kR9Ey0gquNh(#^;J@xCr#=-c@kqeGpLy7f
z2oWq57vz$CX~JPd5B~g2VrKn%@0Z%LSZ~gF&>V#|9GGYndxeNgL66n6-RBI~)2(Dj
z5253;6IjzEkUAQd*7{I<wN*0I;&U3<bX@nJdb$!CEVX;PMi>iA7l&h3|MyKVRpnQ2
z)S}~<F(R@X{wF&fFm+G)xWW@|T|C7Mxfz@#ot1-H6nqPAVad`8Xb_z*%r21*8VD@Y
z^^f?VmkM3`3rhCE=uuzqgE}2Oq7((PYs{nV7w|6i1YAYsW6_-EDbp(ncn535z*{R-
z2Fu9LvuZB-BHMLN^~Km6t%}@VgeXWvR&U2ff6>4mx*H~2aY=kRvkmAC`2$ql_kBAs
zZ*i&{+aG^=RR(4A3bh_6>gLqT-)S*&IMH{c-yHKu{dOiD(&AGf84Z2e(_|$XO6SG%
zG4PT$jz_{I%N$wrnv<t@kj)_IV51rYPac}TWJjPYJDJW9Ys)j*Pgd|<TmN_lEL*C>
zsLs-j3>FUjbFoAW+Z!j{+Dj1xkK>~>n74WQ@ADj`3cYCEd1`-gRoOG^$kxf%*>P)t
z1ZQt?L7l=Gr7Y}f5#l$s(_Lq5o$5L#bc&URjLPbglH0G@NRTp>22s~^kkx@A?D7ou
z=0y~_8En_W4wUMdjSvLnl5V{iUld)wKSPP8jMU@o_DQ&vRUS7O`M;ctki)yD=}F|e
zawYAxB<~LpThT})^xggni6O+x8$Gzi4y>?eblP|<+}v&vKTtSI$tz9~a~k;5=D;dY
zHBqG5G?D%}O#@ODeDS2tm#!-(Hn~b`WI#f(5qCV^+C4X%27&t9$F2Za?!(`6IXg?s
zp=m7qG+BHOtXVmjt07|TSIu-)kqwm{!FH)g@wGulV^`4OvN%WO*i|D<fo(`mP}&un
z2|h>EoFU!BRjMEqy-rB)mf%^cW(s(Z>KEZQfT=TSM$U2`jEzRJWVJ=4)wKzs{3DgS
z1TM3)lc~RRR_o(wZU|1(c9<ZqXS8Q_!1@RMY10p+o-M`ICrz6OAS^~~a_>q_O$`o!
zD*uuUBi2*Az^k%VPyi1)bKq7d<5JSv>z&9V`y<EgAi%e}y}SDpQS%N%T0?cVinW*7
zl_ltp>f?EdsDTOIEmX^sj@T{{zD4yE$&EEWe#TBL*q|Bww{N91hV>c*qeU?w%Nn(n
zwH<+fQ1bAO8IIFeIRO0XtJ&mewuP_N`0wY?36s;;3_ae1FMsOH{~X_Qmlwemi_6ma
zhd$D>RaKOdoIdc2b=62Fn%e7Sd$HV!rFa{vo(EI0-MFX)E9zhw$_Q5q+vIfTY$_F6
zj=s$TZ<c7YnV)zPtCM`~<zf=+kGm_)t^eH%;JnoRMy1BUnnL||tUM;O@)VyQWZRHy
z4;f7^KiqoaP)H#R5Q>v~T;a4{PP*1!cYiQ$d+uxHEAIMhykl=i+Euf@B@E0%(;<=9
zcm8_#;k6*NyZobt_0fmaaN#3=%dBQ;m-w+o+ZtQn0-*tj<F`}Cy406dgZ5&Bgf*nU
z7U=4T?91G8{<L)3)$v926uE7$KUdPxc@gVZ>5<x18)wE#bJZGm?Al+RTXom9?pNcM
z1SlL2f3U%O*csyr@Mko5RU<l~1Q;BBF^ho`{b{TnW*28x5hs3Zu1Q)DKhpx;q0QFq
zz8(0A)?(=i4f=J=E%|QUtXq3nk)6AN1ov!KpSX&C|8(-=(Rub0{y9*yN_vrZ^}x~@
zR(j!Xv`d~08k9PE<;qP_-d_K}x9nhi-cc(>*3fM*ws;FLRCDrv(7%6`oSwX-v*V1?
zn!nA1)7&m**~#TB2|Q$7^N06<9ME80d~=?^e9iI7&P@9|J5;m$YF8=$_RGq3r6CaK
z8Gn}HV06#5h&?%MU6CTT@EiPgP+W8rn-%`=wt*O|q&%9BT?4jE=dJ|H9TmTDB{1%?
zLXQoFPYrSm7QnPsfE;kJzWd#Y+mP&vHOBtP$lpuvC*Y1(r@2JoG}<9l{*oYjzUmXh
z<F*NAqS;lb&mnTW@s!Uk2f{?4u#-YBw_hT9xMG_p0+{@AvJ&XM_g(-sk4dPfN0jft
zQS`}1H;`{%@dlm|^MB!JY9aL{aU+Ty;Y}hJSENQiN)Misfl4w%FGgfQn@pBn)YXX|
z#zsN?=O@>4vS3}A4xGa1@Hqvi!c9+u7E3dF08*Db&93r(eDE~(;jb^rnyhi6GEc^i
zii?>n_@!@-$Pa5z-UJI_s=x&e`tx=;P@3aG#mcJhIyThqzIw>N015+V!af5wOup5K
zq3k1GkOI$!Eh#c+2JtJy(C8=7BUs=M=HVX|0s9cFUaX+Zex^Fv&-7R>y9(EFBBP<j
z_~OgZEr+X!mc;HQ7t1-ChGbLgNiK^WX)p1<vUHc-$Vfg3SKIK7RLwh)uya#ZUo^Qz
zEwGI4{i0Xkz@of=YfLeXTW~IXlgCeD<<_3odp*H&FJU>5_B2Xch!i@p?$_YW%xdp*
zn!7)@Xgw3xr&KpAl4n|&gym_Mo;j>gls~nf?2mHsl6nSUlA36^d29XTbW?7$`d%Pm
z*=(8z4)xN>Ab`<yzlKfq+NfAbfWJphH}B!=XBlB`c4zf)tZP-wXUume8gC8Xkl9vp
zwR*$T4=0d$?r-F4Svp8fw*q=*`rKwft$YNy_>~1+^Wssf#$olF@n-k6i=%sR+h?(Q
zO*V0qzVITs7yt!s5rg_ZoPo|FUTxuaxms9UQ4AlQy^a$$B!sdsIgg1ktHyDuB*O%1
z{R+9cy0ltuJyLOX^=x$uEI}ZSfR@d5Rnz@f9%hMy_ppUk^pC?Ctr}@(fy8ueeIW`-
zUIsR%@n^HjV(U*KWCpN83})_0jL~0yjZn~##iJ--3|mp6M?njnCVXeqaAnsc5%x$;
z#P%{Z$y%?ZgX+m?A?m-Yovz}@G^K^>ky6I;Ka~<Uo(Jo+86Wa;n_K8WykO`0DmKfH
zo0xrb@Nb7~&Hq5!M{>(RZkcn?Sg4~93a%whCG!KwkikJ&*xllY#Q&PN?u+8OCPA$4
z?Cu&Jd9uq+_{sUpzy<zyO?hlT;P@%`unl4U?}Ry2R|gf`{<^-$<Ub!jC=2xK%N%H#
zgpm%9`^m5(^b1U)|6OC(Bcx4P5fD-Qn!)xywF5@*|61xh(}QVG!lyY7=}aeArJg#g
zOApik_aZZ9leHiH+oI1qOh$3OEqvGiv`27-HqCsf3n^(mq)?@GMrn@%j^E=v3ppGP
ziZd-@iboZ_|L?8MT`h=T|F7Y7{{R1~uxdraun&DEbJoTZ!v6p^CBR#dNKMRb{f%Kt
zKxgydvw#xb(-x!K!PPw0Ixi_=<2c@>Dew#PTJ<h7as<<P%hzPC8`9Zxp@b%8`4`p9
zydAZx#zs3ggZjJ6g#O%Qy>JEW=3OhQ>#d&piQ`a%$4!;%U*_<q*Rd~;1x(}HoN>$J
zoIPOz#E;rz#;k$-DsN?B>r?YNY8{hGmNjH0qFloZM;=Jgn5Ohqj4{_yta(v$Ds3-y
zR@q+1HUuXp1Wi#k@2l(o!0t84iR!2@E&10@y)Kq;a^Lw5g>G9;Ikq3hLeYDpp^y!S
z7imYb<^{x?@o?*0V-6RFcW1w~Pv6T&<NxYhEz45o50+-ksg-8=d92-|7?C7GjHHbk
zld4S(-+gzGi=lb}+rBxzuBIOfE{iQEgyGbT{F5%<O0F{PA(r=|{jo9Vynz}k{(5#-
z?k83{rOGXG*c|TF#E+evLHzCYgn0{P)AjODk*C1%wL7&p3a7hYD(AVes{h&u6jxSN
zI~sWC$?BCz9cEPm5B(U8yx8EIN+R;Y4`wUBa}*?+<Vt9A^>)p8D=GB~xRQHqL{yMP
z+?*_ZM+T*Ll;JfUeM9DajVa+X#pq6Q^A|Xg6;^!EkF66QEZh0@tG6q*b(RRpitLna
zr&0#GbR$nAE6|NDU=QP(Nr36?f*Bm-q+|L!RTj_G+D6VMEB<TQ_GL<l-~5%D{IiDf
zOVzH-XZB2|N)yi+idqS-VXM5g{+O32(<Ijnm;5hNR8L+r_yw7zo|kJoV%wJa$o08O
z{96P*5gyOPny#HoxvA8dI__V8%uY7Nu{SU8XF!0I{f?0CT!?8EE&npE@AF?byr051
zHhQMqAm~Y^w`}*1{naeV|Nh?vcNoIz7e})=62mC?7`YX^<lPnu?#<YSBrwP?E)Gi8
zyv*$SicgI-m16oWws6_ssj5Ctt=e&vB$KCd4lS+urpJ%3y0Pz@=@`8X@;7tSy(pb9
zh_;mw-E5b9C)CKY;I@0*+EB)A_o*<DztNux9?CXcaaVkzD32DlwiD4eA%>oD#0QQq
zU5*U$Zd139vnXufk$F2`TAxORFh;D2eoNz6Fj(5?8;6i1GSz3hG&^_|Hfz}2>M;N{
zwzZ{X5#fTwZ#jM?KQY{RX3gwXQf|Mb=(wu9Oy7QqoHN}20@7e4yrupBsCvt=IJ#hK
zbO;ih;I6@);2zxF-3NDf65QS0-5Ch(?(PuW-TjjHeCNCO_A`IFd$(2Bs#>+z-aU|P
zVt>XrpHPqQZF?{!OLjkIv^zcmdfxLZ-^8>mqaH#Z-HyFuu|LL`3u7nsJ}LyWgn#?+
zua%|OXYDU#Gj-^oYFpoc=?i`wtRGzP-yR%R-pHcDpnOcbzKU&{|N7YxBTWVe;w(j^
z*$Img89X?HP5VJ<7~x6^u;OE8ZSOjsxBW$$_Xm>N8-<>SHf*xQyRGTPuPO*IHR!*`
zvA0|mzDyjh{WD&SV(<B8X4+dC27>g~hd7AR>VL2>nB;6%YclliVn35v!*_lhAIJG!
z`H$C9-fuY*tmC+g^K0X&5WwHPybHdQr(FIURT-64u>H%v@CWjXlnXp3B9WK4J}~F_
z1ZW81(GxNhmRlc#O<5>Jj50m`^cqTI5|UV!S27eoabe?ji7#N&rZFL9akG>f_^Ej3
ze<*69k_lrc*4bNen6?$9E9KE{sZCB+D=c!MVGzUwdn<dhzI181oIO(5CmF~M9h|4@
zL_WTo7;@_65Yg3Ttl!v>p1p#vTFO0;9+XJ2<d(Te_u(!SirvB?wOxqt(o|X`O;`)A
zUKALEP3as>ZC~L$MXfsukd9ycI_oR;tlAy=y6&qoZK{CgeF^@C94-2ByRU;N_9E{t
zyY4MV;O1*-hT)YWfR?ViQ_t}kWq-{knELY2f%$zx46pcA=Eif%)!qq6tmbmITCs9v
zxkEe1PmI)N%SONbau&KbA9+Wgcu!fBcko;M`R~_J#6rX3ER7-jCh`US-S0DgFTfoV
z(Ta%Dy)c$!<e!4Tvy|+O8d07+B%i<d-|lF0yMf2Y{Z-6a4=IFHXt{NU#E(IQ&&&*m
zKSvg(Dvr5go!+zVn&jrGA~MCyk2fnKS#jP{J|o)aP2$R#e({rhy4LnqjJQRT8>&d;
z=QK2tKHy{kNhk;PG{lt4g{=d5il2B78E@Q|;!#c=dZQ|;lm%pDO2_KjJZ84NljP?u
z4gOiGpIxpob2M(aZ>Uam*w6fO>B!LEn@}gzjPhsnGQ+!<>Tf0;vBFr&d~bWIoc3;U
zbNhKCy>gSPbgjio1&OTX)s1_k2q?g$`v=imZ=vqQEgg*R`^S*jjn1{jTAKQiZ6s)_
zZnYCZ;9Enn7Im;#b;$yFp@bw%Dx#4OEHLuXpYO5AwJXaMhM+EIFZduey7iH=NNN)D
z<<Q@jo_n|YoU{?o-3QBga+2Al`}`+caB9p^&CPb-{A`tz{Ro6#x!g0!+Xb01+ZCT!
z#oC(t1ahQ=F@|P@R(-d=F_w83e!YFNXvLcL=$m@}ExTTVCiZMW7Ck^ceG1B%x$V6|
z`B^PrOihU*ETj_ez^F_iK@?N=|LXBa#sI*@sInY=4+i>E6mLy>Y{Mh~VB-Q$L4#k4
zn-c}<EM85S*^g3oGOMYN2Cw{B(-O8a(UtJNe2|4baQCWJ|3aqndUjA>iuSvLg3Gqy
zF7>jf>us1{&Q^>Jbs`9p9O(GIv?k&?jDwAfEF~H<>&=xmTS|8K8XSoJ1*WAVJ|Am}
zIW-U_{{;Ym5dh@)jb0dcWt<rI=f%`>u31Yg?_~Ay5w0kahkZwp^SyVGDR!A?iNJ*{
z9Mvr*p}aQw${mQdLu1+Ao8N+coOyLVM2hSy#c=8Q_`Eljl_mOd#x6wX--{}@`RX!0
z<}$Gmfy*G7j4vqyc)H@|2Dn|e81{{%Y_&(&zRpxu={CFz2f6-KUK{3f0XjwIUR!Y|
zgWin?rcLmTAG~zh-3At#er>K)W*)g6PPTofSMW|yxJ>nO`w&Q%NY{tM`nV{dB)`2N
z7H;G*6ED?KOtUs+_mt$k@n(5vp^uM$N&Uhqit^L{JASgWbBnhB{GIu{lx;LDyn8E$
zKaNoPY0BVg8VC|JfJ2x&V*I-<>%75>7y5VRD{RmPn8JF--Nfr!tOUioOL>>=(MfW!
zheyjHlUZN*3HO~Q7U*2~`Tl8wOyzf~7OLn26T;&_W1T2vQjY04I(f!1IDnKSPuAd+
zXP{u=7B1r6PM<(yrMo92O}EQCT?GzsV#-;Tz+mJ=sN@ZGwC10e8Pzhw{CTpMYHAl+
zyM-cs6$gqsD@D6kSMafD+7tN!jMrN&O`Uf2buE?CA*{l(sv;JkhGyGmm^jzlKDHYF
zgQC!8H`#i>5CPKxT+&#e)X48PDhLN_T<UzMN^fKGdDb7zALUY>gI;{kQc$5$)>t`?
z5dOYWzE10JE;DawYlPKoW24iQDEXNIg6<fz>ZrD=@z=SQnD3Njw#-!N8XoU$wH(66
z#f57L{LAh5`0_J9fo3y-ZR&$)Fyr32j<eO|^fD^M@6l4=JA}i0*!A1{m)QF0^)V!x
zGX?8N?7`zmJH9EQPMxoSVpL}R_=_|1q|{{eIcni#3HO8kl<eSUp{ZmU{CVf~TJ7I}
z0n&kYJZbVU*^h?RwVJYmu)9lVwO=9dIfgm{ClVuDf4Et$dU#ikHp1zvF~!X^$1GY=
zHAIPteRM_t>Gxaz>GwM{U^zzI>-)OUfG@~pjPB8r<fK6MHhKjgj854~PLJ>W&*}`q
z!vk6xaeCmDXKWcAYC}256whfi8H8;W24oE|;SQ$3#lb?oW7AP*PQ5}rgKv1Ax1xN2
zsnWhFR{TM?bPEP-+$!;mzWt2j9j1jMfqkr#&%kSp0@jr^edv$a#6n=RTw~X>nlL{v
zKe@9I-gLSWRRPsoi5lwa!4=)a8ZSz@b=5=)q;~<4v7bFwMaY11lrCP}r$ZnBSY|eJ
zJLmjbD9j(Hn;?ymrnt^>reF?~8o>{n)~(nUkE@BmiJg~JFh5r@RS7a*DYO0Ut43p#
zx^v-{aJrpII-NqKf-D=_;?hZ%j7h$>25^9Wu%v(jG*^tnt4lXwdh1X+LNEm%*6#jl
z|2Ke#vp#mTkJs5nT!JIt%n=t}mfJ>EL0g=M7Bdb2{=%H6?I76WV(559chcxSyh#I8
z2NlkcfTy#6zFs?=z?oR;c+xMioS{_CJMipP(}bi+4E+rzWF+>J{kXHt_k?)(HYGQZ
z;Vg}p48Hm{1_0li3uypO*40hxo9<7s%KQxZF;bkuBo2m&+yJcO*gI^}FJE9Sr4rBw
zCU(NUm+l88P`tFvmI?z7SBHP%C}nzKv%nf`18(4u!Wv(ik~`j;A8ViiMb8>$N;TBW
zZd~=@@f-bjnT2$2o|dAE%?w%?*!jv#7O>o-fG$i)AHAcEVFgS8Mg)lSO09dIqF)gS
z{`)8noYMayN5=GrXG`rw)e&Xn=~kCh=9P9Kp0j8k^4YviQg_3jV^-b&$z0ZjakYH?
zYay_Jqyd&Q%tV7Z!EoD;h2F|y2RA2zY=^Bazg7iZBk%WI1+>9rRf0@Q17&yLhsl|o
zU+deRW1CH6P9xb`Y~DjSPlt8j8~E{Q`)XJJ$@l5WRyX{2o!;Rg5W}Or{E9;e-v?O2
z^tb&?F$v(8&V7IX{0a7VTSyO(a*X*a6QU_AEy3E=;_keb55Zq>23wvmbOgr$vzXj9
z5-dI-PhN$lficgb?e&w~<?==p28Gc{=EG4ilxaLyb7U-l+BeK><AFMq{qsr4nc9(g
zMD6L+mI3CF+P~y`cEXR8^LpylX$9U~$>^R3isJLbT#6FOo>-^KY=r34oIbtA_9d07
znwzt(0X+RXHSGamM;5!6iL_ftvD3Psw8i)(I+HgK{Fjc}+&CCDk}%WvYYc%H3Gi`H
zLPR8D=+dwLHLUDm<gk}?T(`p$>IZTY=)Sl!iDfm%aL1El$nBuyk<xi>jiz7HKSj0J
zH;_<I$0mX3<aL&<ILE_qp_EnH=jTLc%mBdeE;GwnaH?$JuSJSrX+hD4SQ-|+oBFN5
z&}EQ~%a|G!tEFi}e0yIVOVP6nlN*j6B;f7~jA#j3Eku!xEOaz|XXol{u@NdokOalQ
zF>_spakLR7pK+y*>fOdg8bDcLcE|=D5O;=IS1pQmkTeGuKzPg>P2;HQWY)(=5atb)
zSb8!Qf`6L&$*dgQw%>K&dGK(~#wQ}^!?5z|LLdYsgst|jhY{-<(FODynvQ<)<5-iM
z<*oZK?&YhtBZrV8xp-oq7*!4`s$zYQ_R8J8cr2Tr#Ve2%a!lo%yM9=Oj5eZq<B0?i
z-TG`1$qAWzmeuMfZe8_PD_OFQ+s7qpVN&Rr;)=qN7$sAS%9scAlMeIi<Iy@9uR1jl
zjVd-UxkWf>k*jL@b&gpwgkM<o$~WWuVHM45Us*}kwJg*1#O<AMu0L+6RJLF`w#ZFv
z@};@TaFxIJ6s}eqR6A7(A^H|aV#v*q{TlqAFmHBI0`41;*gu_n_2Nb;TdKklN+(83
zJm=tS9IGLX2!QZ%wCpX#=3Q6x_`{l-!sU3_yJ?H$iMQH6$&3LIyg<U)#s0)ZXl4Ln
z<YqUY?at8=9znZrG6YhvHiSUBp8f~am)u<&<)>UCc54!&R=aT&GXFu$Xgy3dH3px@
z^5hmw>m>*;BW_o*?ax5*$%j6->)xJl*J1@CDW#)j^>^wH(^aBaS-neR;89f`vwd>i
zo=VI~f-1weunIE#&B-y7=lc1<nXK~*FhF@!A@*V1CrP;^w~8sAesS>m`@S360laox
zWF)oRo#?W`-DYNMAE)&sV=PwkUprNGv6DX{foPNL$WUr)4p*`@N}^9yCi~{G8D56T
zUiEv1B7W~HhP0V6pk$X_!%~F|4TkKns_&Fng0n8(5DmSzb6xaycF+qy<f*PEyR@+y
zg*9)IC|<%LaDW8-r%7bYII<*ZiTUgqv@`-`?GXszhff{Yi@NTiuu@$wP>mSI*KVbl
zk46F(%P&Ow1rXAQz=~4C{&c;wJ?@z4(OU21EUp3)yzndW5HM;#`7D2-^6Brmxm&F{
zQfrT-fy;cqnu%FI9dLxI>`X=!U5pehx0N1v(VX#}n<^>CP$GYv2zm_5!kxXWEj<35
zNDcwKV+7V{H+CHPpP+64r<d{Q#8Sgv92|uC?2bcru+T11&e_x$KOj7>phFQSF7Mb&
zephu~i0EP*S-A2$EiSL7FXN|K5M8MduK%ETlZjy=q*;Yr5|YaDck9Slv+BnC!o{?*
z#f^a)$MuR98=6GTh!#z=y|YcpiRx7YOI1nYP(0c&8TI)Q<T8#HL1gpAei%>s=;TZ^
zDd@UNO|YNI6Dls<=(2{R?upxLo(4wIkltMI|D(y**+XIT;m4njO9}RVeR3ZlKUnFI
zaO7%oDP}9%SZ;Rd9mY<dkfvE}8d|HNHrvjoDb{`y&-@Cm^CNv$_=Y+PTEMS=?sSJY
zs&aQBT+G{T`QMbMK&5Ym2%ktz2ie;nu|_|*xYo@~d;Ox`kErp`Q|&zSx<4P~1Tf|$
z4@2nHf0Dce*RND%e{DGuYx$>CXu&ktAO#b~k(rK!QIO4LBz(vk%7|n)y=_fJlPmER
zU{V9zI2d<+;A91sx;tmldtAqp^Jd<?KNm-gBTHcJTQX?iyTCsm@!^9JHMg7#i*_Hg
zn<qIPN4O-7Fio1G)44Y3ZLid*ZqaGk@7sXnDZfck5(XiU90vmQ#jUTW<|*Pspi$<!
zZK`HX+c5__MV&L{i4um`SZR#lz`Eq4#|-0OAPO4FhGU$}6Mt%6EafWRVi(Zhwnk{9
zGrJqT79wP7@!Z|N`seM%pCwB_%3rLEFR3QCWMaR4Qf)9I&ZhG|J;?ItLJb@xQ+Ndf
z+v~g#2vW1W%xe!??Eb`8vKOTm&XfM4#Z$P^MDuboEO%oj2~rY8?NXOuE30o1MM$-4
zo~#E$Gl;nlaH&q)?A|i0<YkE7P@zA6mYt-r%+BNGju?oZ4&g|FAXy7zla^7;OfTsG
zS``g|(em`R$C45Z#-p%!MNM;3%{=cTP|-1{iRo0Ey}W8wlFT_K1bSueqXIJo<eu}v
z%~~GyNor>@6XtR!OTMF!3ZQ;uaQ|pyg)tblZ<_RWu}e+L`v#H8w|liwz7s{u`_04m
zTl~aJ(FL5fGKiUm_ife&AU*-&y;_`_AKX{RQ5(a$R^V&hvYGTsoGHLfN>N#z5EM&i
zDm<B#d~sz;Xzu?v?~?;k0S6hH40U0!-A&8cw@Ho06-JAF)c(o%CE`I_h_^10sdDEO
zlTUIs0*t6BV6YPNqlWn?I5YBQnVyfj<+0@OoPN@PH$qD(P7j7oZ!1=1$n(9?VnALh
zaMAhNRvIj)Ocm>?N|Wu?!bmb)syfjc862Q6Jm11a>dncmMA6**=ZIO5N9R!3kR%-(
zp!`LEa&byhUYRKNFcxR_?Yo-&db|AZ4O+_hxAr(KD{(T<nlyNc*$@al$KH@_NeUf&
zHQu1tY3j4|NrPlW^=upU6|kLIgkVn>`FAJqgfD$G_#!xS-@>NS8Fpdm@|NVIPq%WU
z^1pffIS%Hfi`5WUfc%iqPIPiWb}5PQ$wW9mzlM*d&ql*zuoYSP9-H$eSJ+2`_}&L@
zrT82;2(7UzSd4;NKW76V3lt@ObYYDMsdTEFu?Lw95zatU!q)q^OOc@xoL|AFnKd1o
zrCHsOP^S{j-Hu>$M=Srx)id>nLkj<MN3EM+@!fae8yuqCKh}GL1UvY^Je!OB&%3x1
z5BKsOE}a8Ur4=Cc8WSotVp)^Q-~-cU$VaKCQ%vB8HF3NgyD@0!em?04%v_(uDW9nY
zS(91|*25REs#Lc}8tk?-JFlx!m-ddNB&jJfJjsvFJLff}rQt`qD^K)yB1Mv1o~3<5
zUR@q8o0@0Sdp8r}Y~kX`j*_So%5T6HB5-iKwe<DO_GQ%f>cr$?@u^pKt{;WdaLSNH
zCj~CE(_pSJ53CmCRJ@yO_f8Z*n%qTiD32`I8~Ekf-H04<G^Z@(F=}&|C@h8a9Tr4h
zMH^Dv+FlgZJo${~D23v$9%*9FRtcj~039)+>Q$m<yQ8pct6N_M^1lV$Ge#{fwg;E<
zHRO?Y5-7XEDm3KEL`+sdeiGR|@@F)-?`5xPqs$K*`IKV>RgYCRV{)~Pz=o=`J1iDM
zS*D9mxPLyXGxMs1&}Y@2Sx05?IFbTsWJPIAdMY8|=Jb??eYQ){P#Rx>(CpmC$$(0+
zlG=LAEKG@$q}78O{ze-C=*sNh4eJw|xo(fRErAfE0N3G%%iqC<G_saC!@jL)+cr81
zBjh%Y2`M*JDi07e)yc$#EIg=#eQ;}uOWfZ$JKx_%C153bofpK!rNO7xA_}9gP6D)4
zp7=iQK*fJet>;9rC3DrT`Rb>l<Ol$)^u98&VPXC->r)w2Eawn3wamn2kepm+SVR3w
zo!Qu6UNu{T&Sc~h_F3o$X)%0O7ygo>s<NPD-4J~0-r{@#w~)op2AhzBIxy!X{KS&D
z&=7r-qlb@Yziau5?)PtNiu(s`s28}QU`sJo=O&l4IHniZ=A(#F@(tu9-Mng@P(#;H
zvUYY&%Zs?I64NE=jUGrav-=gmliD;nCI&`QM)pJU;>*b>so#hOvS>JwjHn4ej!kl;
zHqI|zNgFLjiUJlp@A8yF&k?0<+8>7^y%;cgsZ(<t6p{yc&NUBb9(<?Y!1I%3>zWwz
zfE@<|rgPIc(INjk7T{cO8w#*8<l1O(dz#bvtp5CR{hTU9r=?MY3*?T{eA{27X%6qG
zr80s8+Di33o<q18M<|ZdZIzZ&S=UvdL~0BqRTOr!V_Maom~uwFAB|V&ZA{>s>nMCz
zcO~f^^DA@UVhW0FfEi~^!BA@-umlY|!~G+eivJR#^+Ek_IaB(#iH?G}&fTA3_xaW1
zEpJLU$7`nT>dg7;1Dpts-K}HZFaUdsXYmgkuK4C7C*TaWEoR}n`{+{pA$xXz>sQ+4
zX1g_OnjHtWVC>9O5`kFj_hP<KJb+!J`)0k+$gz>*W-{)0!fH9@_fJ#La;_%J-g@s_
zBr~9(_GaDgT~Yby){gWj-BhfbzBK{|`Xe0$3r$<bc;P><iXriNRc7niBXbGUR~@VQ
z4Wd~nt@GwMZfD1yB*GPDv%bn)jc53o>*4zu`OnBjovNeUO}MzIETw=&uf5AHqOg>;
z`+NPOil63=&{}5zV}y;!rEWn%J+>mU<WIy(KKpgM_U#a9&uCwnlI!M6bYqgWKG6s5
zf>8{b?)YaF-ApXvg2Mg6kyEuwl$3+Y-Z%VCzjA{J5WQz>Zf{S&g%9glz7))kf{IEC
zbDR!(VB!17Iehgev1wmY&putB{_9X9<f`Uvez+@u0sZ^5Iga@zxycab*toEsqRV+W
zU_h2Q$k<w6VQ7J?Vg16v;lxcC;!2;1;o*d5sRtS`u#)oJ)TE1<tV{JxbH)r3^*Q@^
zXNxd(?q~rHHukUe80^VnKLwAZE>65~+uvEvOBDw%lS-IKl<lLuwijxE6Wg3OYn`i|
zm*~_<f@H^3jO4jZLFbZ+h}=Uy$(xz~3fR{pG2A(L4sre!BL2VnwzA1*s*O9p2?18w
zAM$%3SjMA1xD&3g=W<b#C9DPtf*8%>u6mGu-MXT#t{za?BabdRc&WmNoBe+s>`a$k
z;+Jx-Z?E*%H_teo+{gM5?A3mATjnS76svkZ29r8Jze5H}U*78nS|4xMb4dOtvv>5Y
zuLLx{ILO+-M2r9A!AnW@=SI5!@dbdUqFqHKXG*cI)_I4>mx$~{R9Gi!Rw8zOUe@W>
zMh9q<D1Ul#dzPEUdv;}l0Klf&*?Sk;+`MaeP~LrV79(%zH!-d17vA<dRWoy8n#X)!
zxa*~Hjf?)=tP{BchPAh<DqSmE*=*K|?w3Wy_Xy&o@CWkI3)}VW-}uv`yE8!(Cvw1w
zce?R`fS~oCMq&e$Dj4w<RYeVBb&@sp5p)`!{<auPhGL(d@TcP@NC`Wc0FzsDhJD<;
zlbu#9yVMYf_K7_7@gM(#yuI!rXUCI&(34oa_bB!~#`2;zdU>LypviQu$4hJqvk@Rj
zbo@n4*Q%&qN)nr62(uFO9W67nPWKH1%ge%J>K9}pYfF#^XkBL(Bf9gcbXPo;X?J?N
z9ZYoq9lT}0G9Dsa!_-=_<K?=knXE|ocV92@fx{((fBOcdlqi^jdK)ncdn(fRSRz9h
zFvtoU;?w}1r5(_%{>Y3!)feRB*;r?LZ;E9LZ20K&=XymsOkPXWw50!&$+C=hx!C}(
zF6Dolv?AAY{cNp}$}|-s=_KWX6Ea4dFKfh!68<dxxQA?^i}7p@eWSHemDmOV{;%*a
znezId@IUiG@c#<`Ctm@FN|i1DB=Zk+YRiB|)NGrqRo#WA!S3!S54+4OuV?*m5HmhM
z&3|7M_zne+$D*E|5>3df-eUZI)*20z&h)EB82qQiYyQ3LJCQ3wItCh7$PLqNo&AX!
z&p|b9ykq==h&bW<J3&5sQXXyM0Di-|>%aCy$gvGx=glu7=&XX?P{U2(TY=7*5t>cj
zsQ-;bQ2VlB{pirOA__AnD`)XXb^Mm}-<SayoIoP2yr6&IJn)~T-EBdj+RK(j$k@Lu
zwSaB<_J3#7CnotefgLy+DL8NB9rJ*?F|YsrUYQbUb`N)$*9-UmKg*4?zbmfY|GTjG
z{r^{UT2|$UFraitF53UiBE?80j8`I#LBe<CKusmgx4T_RB0=zu9mZ~9ST_{;V!nl|
zD!(@6eZ=r1-RqW*r?lvzN*Sn6%lcO)dHh1QO+JIkm!h^sPn?>WG3lyv>AaJaU!vSP
zzJjl+bX`}u!uxga33A^a=2)-^?K7d4JZ^uF;z|lePpOvI$|4jx6_ZpT^XV*#<Vv}6
zAAxVyGyJ&GI=UF70<B)K?$AHlUR_zdhEp{)(&Z(k9(KALHFAz5O{JZBF}W1R`Xg@=
z-{?spS#<H+;P$u#O(uBnSdC^jk9C=53)d=qeMqDCm7g#e&VHpRN3|EYUEp^7pYZ~!
zEIY=HThaDoT}uWpv+?1_CIU+YnF)Co#0COmH}Hs!lv6!{@u5Ak4+ak74XDeF<(qMs
z9ZY($mv5;Vf{pSz=PbZ24X$Ee@v@0+b$`Mga>7ZEYF)I(=rS1%@4b?9Hsiz_hR!M$
z!x)byrK{#gmEN)H30n&8#^|Ome#itKGgBE3zmWYK97>i`m+w!+G>nsPzMe~jj~_@1
zWt-ZG5{!M5nu=#WtA1{BWXXNEV|#cwhy=QxUev{Y{Q>VR-YMI_$<e>C8mgg6WAV?{
z*1Anw{DTJGtG&<1{4%`r7)50WyjG^3OH~qPvVr<yZnd|75I{)GTfc3=2Ys|sCkA_=
zb@wQOnB=Nv&mvGwtjM|*{c@+7^JI;-PE7|++mZLD$A)rKnZL+Ag~HL&tsVr)^#^@r
zLgrRDrQ>APiB)EY#ZszVo+8}0uxVn?S%Sj3An6)D&e@I<&BIo1P(e|*^T7RK!CHuE
zI-`U)Ug}aFON-rgUd`;fL-C`I!dqL%0EOxD_ze?cc<J?WqNWyuYAHcuNy%x8Kxa`d
zAlLEqL9Wg{vG;C0b7ZUh-G=Lbjl1Co`u|R=FMF)(bmfNnY4oeAT_J>svAikv_M#yx
zXx0N~M3BN0d!<4aI<n%_A|D)psi*R#>#Sck2p$Cxaop#inT~~{apfP)1lU!E{#}Je
zi))4Pqx;z(kk2+uA?x_W?|Fca*$?8qWUg<ot!dEV5>L$Y3xN%Tgu5q@VHr2`VA<O%
zd`R9cY$q*BwYX?k`z9=`{L>?L!*ki>W$g7GOMB78)x~`Jb?qXUe<_vwAj|W-o%!H?
zeQ{;8P5Ubf0Dz_P6=0hH2KdSBG*UZ>(YztFUh!HlZw`Zj-@K@)UTe5Vz`Xn+n)3$*
zkR+-d@@#byjhXyrx)sfWrpJEuw<YxJS0edBle)v8b#+mOw4V9Kr}Dzhs`dMck&@XP
zu|h!CAVn6n_4S|o1q&{VwZL|y<<x1Pdezv+u#W@)7(g1U8}~|fBiS@vTrF%R|2t>K
zIw!*zhKN3HA*BW8#7{Kmwsci@2#$JZez8`^Bpd2Y*ZiGftgnaQpc160`Ea*eC5GoK
zbxJ_Q)h?uO%EwOszV9U31G>mrzNTUMSG=8ZsJU%99@(zO+s4oiFWaw4(}1WiT>e3S
zAq3tFh@lZ6!P1Mu#fNgIZ3Z6>_Ea;7Hd5(`$+W71_)Mth%jZGEKT6Sh&&(Ud32Y~!
zFI-QKJ1s4s0J|#)06P;#3$frmYP5^R`QlLzO%_e$Otw|k$HLZh@HhJOf>DnJwZ*lB
z(M+re1jAyrjLb;UwC`$dN@~d@iKWmazenHJ#+~#0_`jWf1#6Cs8wUI8fJ=r7j=0Mv
z2?dTw1Qv3PdRv6e>R^F>L0B$FmFP^vDCfC<Y=3_-nRs}<zd)tCq>`yX)wDOIn|6E)
z{H^}c?HV;#m@uNONz&v0@<g&2>f;61fBZ;OX}#W9hO{rSkwu3s9ntI@_7FW^ocz!r
z4k972b}6|WC9^?%<u)<ejEs7ST2N~!^TN|09Pd1dS+B#GFMqL!mnu{wvzg2n@wmRP
zxLZhchov<B(zX2i{PPW%&Qqqa7{~E{bcU~sN_uQISD#g{`+&SRxw3unOUA2WSM86W
zsK}OUn)X}a#sPjj-rxXjYi!U5!Yq<qz9irNY>(6jY{=anc-KI|ezMDA8?V;&@E1$~
zrM2o)XS(Yv<R)jXpv6nf^QrpI+d^(j23LO?)(fGkhdhmW?)2C`9H1cip<+|Xv0n9@
zRNpGZ)r0I^HnXs1tBju}3@34M6LtnN>(x1wF4*O<85wvc`u1lT{zuw<pW#tY_DEGH
zI@;0j{BXpFo<#AN)_2vIWjw+n3vnG`1gsRqBs99PfQ$BxtM}UHFxA9r)R&zndVXCi
zAoJ7?!(*CECK*{w9w|H#r;s|~I52}RNjYx|N+87Sq77F?z?!#F_V>M<Y}M22?M~eV
zMVzan#oGqwwUwlKfaGYzCFQf%^gyUjyV7sH)lP$#`DN~fwws0A1IOdng+9D@gFQ@9
z2F20ogVLp5&#Fl`;GkCgYhBrDzg~v>ZKOuJSZgw%s{{9H)c5Umzm=wUP11SG)b_Qb
zYWC`LwKSj7(%#c~b9A^6S&?iqYZ3cMqrvnH_e-M}$Eo`*u(+Jg-{}^tYdngRZff7o
zh2rQW-MO$OQC+e2wrlqLSXiFR7QC>+VEHBx0H}*ePtz8rqi)ZmAXXP|#0C(F_uM-h
z;}4y(tXMI2b&27ptUmo@T4EPbtZit~dF$rsy$BZcH{xJ%w&deqAIi&bNjh8!MbxTl
zXm4oUuUt07z+d+$q^p*-|BFp{ZF5YgkwRlCCi-$vjBCj~mvujuT*TGRGmd>ECrVFA
zXGAmvv}IuOpDvirxQHu*+2+NBfvPD4(NP!|&@Y25oUwxI2fDkHWXt7C`7O=V)islF
z&~i}8dTUko&~01AUzaPs<7ZZ@E|NgB(Xv@_t|ibIhJ}&*S)=3A^-8$6l#=q2kkHiE
zCyj<f!eTGmjqjjFwBLGttqB$$`t-t2q&c~IDldg?j%25w-ridc{~C*GLR@^}tWOeM
z`ZS@Y$QY&wGQk?1oZFQ~gB}B@&sQt%-h=3fSs{G>YPoda6I35{BSzzA=V4%j>Z`ek
zj(ZiM_BDGm)SC0znHK7gN*c!}?It_Mx{E@ci44&VFHgwP7^U~)Le9L@JU#jBt(dRM
z13AR$gbygIjA<>b2XKWJ5dgmtHqe7s^G6mH`N19bPr4gzgNM_|CKN%dC?57avA|B(
z2EP69yi-?Ej}_)&K&Hc4`HN+z@6h^YD(FFUu%5fjnJSZA5{n23-sR~?iuLdP?6t9@
z01my2D1$uhteYG9NT{Bm<Y?m@u*?h<*lF#+{QB~2xWc5bchW&frISItted>M1f&Ku
ztba7fWU$8p^;aXxOP|R53^iA-K>XozFK0cvFP9E&^<-=;ff}tEg1)nS?8=8WgKJKu
zdunoWianJ;6~o%wMU^ZdB%%^)0ev16y!uzEu%yy}?4dKwE6=Agvll&rE3=dC4Nk>H
z;z1`I#o~!L6tgl?c-nu!D~$*GX~2E(DmS)FDU1ctG5_(YU*O*l=O^I_Yvj4&%PxGp
zo5_2$^_BE|8y24w{PD9mqtjrre3SQ9C8j{I)F7?JOf`zHv+|wvws-yHp)G0i@6Ltx
z+j++3@X1Y&VgTOqeL0NYnhhI^bNB>C#LLC@#kgqg-(p)Vmb3jq{%@-dte-nDMayfq
zxT1JFb+J!-raMu#d-yUp3+Mh?1wCOd46o6XBZMNMq<ki(9_)}~Osc{k0BGmE6oh3=
zP?A2=xdW<(6U)Ut+~8sIVnVb<Kdrwto0Y8PUhR}gtP9j)@kh05Vragf&o$X*%xWRy
zT%seeeX}Qf)JMV`41fr}eqXTos?c5@d(6#xr;{cp%kt_PS{@wIe4sh_8NgL=@@zXx
zsdhQCs^wqz&Olv_YWuINAJFD3XkFp%gCgSJU{M1EuRpN(0vtJs-65M{MJS8aRtexg
zdRDD#GwA?*mrpV{XA}sL3>@4{=Qe|Fx>_^_j1$i<wF+o}B3K9`I5>WDGmc&E9zjrW
z02*lP<$+$Z^t?!%DjSsYnFr8U8R<LrCk=7{`cvy<N?V)Nmnj&O06*;S)^SqCFE&mw
zgo}$vbCLlO^(Svbu4{9E?xjgse$HjP!)0V({}+HjS5P}^r;Y{hWkhrp2Lky(z&8WI
zp|d)sFFos=#Do~T3sghNE5U;}qOJC>yn8|z5d0LXj}-0MB+WRJ)oQPIDT}{XEe>x5
z0A`ee%vXrTF))A&f>I<qAijqS1ilD>XeIsNMRvn?lI7jW^HIEz%t!AGdw&4T&y<|=
zJ$9u`%G{4R{d5ue>QE37L8NOmAU}eHaab-!nbzC33W9>DS@_v1W9K1s{0I7kX|6>7
zjJO>A@}#gep<=e4s(W9=ADUumDhUG?@Uel_{GLwr?M99@41l5NWqJ!JJHyJ$APm(%
zC<T;DHMTO20u^)b9FO<z*>ZJKXj3rm+dfC4KdmYnS_0Wqqat)nV$tR2TvK3{D)}fj
zh@02$u9baBA{6we27GgJQA9G93r;GhG>)-m7v8|TV1fgDOw;W#rhNGax>_#qY%Il@
z+PCMo!mw4)mQ~&&QX469W0uYbkGrKs7pOMd`e}DJO=z-16iVJawX@=x1=yzpzUj@7
zmY5%%?EPjM?&D_vaKeHn_ws-$?O~hEo}R0V;qGHPP%(-5;YY#&IBj8r0}v2+rg6bG
zr)BD0+$<Uq(qkn`hmn~6L_j@rI5T@_t(%OJqJTb(F+$0G0`_j5PNa4V)?Lbn|Ce;`
zggyw)IuYlBS{)ApVP5WtByv(R6{dy0{p?6v@oXR)mjorro7o|Pvp(;!?&WJTjpn2w
zD3ZA_mODxW;Afkt3;X!=<ts(ayPEs7EM;82RWg72)E(JpWQW0(qIkT_&ffk^NuJeB
z{LgA+zlo3{Yrz2-L<N#olbW{Ig>1`u^2<ff+g3X#%$ep%2>A92PNcza20HEVz1vn0
z#8!y?;(<66e70t5i_;2)s^wQ3h|`9Jii=kIL_<8Q+<|VTLpGLLT3Ld~6MM&S630m$
z<o4vN@Blv|Mme+A+U8}Hzz_c185F9*I(A?vC%G=R7X}yWUs(#_5SrpDA#i{NUF@e<
zSqIgh>-ZBfGK{$xDb|x2GG(|uMu#y!>6o%V#;!Z~N5sNkJ{=8svvZZL%v+qD)lC<`
zJMU4lJl>UMMenyBhAo)6R(+gZsnVn3QyKWWwdof1Y`;Ph)4NLM6!R**I0j6U%8x2r
zTv{gbUW~;~*)D#;)Ed|Y2-Izm8#QX<9Er!ean}qb+$WcU{q`lSP_elD4P{dN#nZd!
zrbvn|S+Wp@xTnCd)MkMy(A&u+<*(6F3v(f9;50lVE`xv2p|4w#=!&(B?P$3gMCdZm
znxg`q=*-dxpO0&!=6n8Iszj6pUG0<PYMDLB`p-71U%ko*rQs!D;0s{1LxxH)6s)hx
zw#$i~%$@}S`KVH{T%%HdV<>`gq>l5Kn^M92mCYH2-%VT3KbDD;eYM^s2-mSB`i*qc
zYh@NQett95T`G)}KsxHNOC5pX3(``<)-Fi$-zrgdH}x)}Q-cLe%56Nn*P7<F-wb%{
zok;mOt%YtXVUlA+h9Zps{H%}aiy?vH0hMzKpC^coyGDwxPAuiHe@`W*H-R=Ze!TVh
zSxF|l=lo$-^$-xS5_pnKi4Tj=@tAx~fbQetA03#L1vV+?qFoO<*86I)Df#W8<m$jh
z)rbQC2qV(p9<>}10~sa>u;SjYAI6kl4G!XJfGRw}=n$I_+!#J0{XxUkkbtgEq=gmx
zBeATDv&(c0%94}0wuV*@jRO2IKi+KJm5MYBv;25w?}G88*Yh$LP;@8=)tmF^;K9fH
zO$-5nZl2W;%E*7|$l0`Z+P3Rve%^D1o6p4=d-4EAUh`{FBo(ddw(D_YjOZ+(x?RC6
zSdNb8;*U~9>2l%_hLiLTbF&$pKIpFZd)Gcv@;wV!)EjNjZ2Yi9tV{>GAXG!#_`tBi
zydzTxd`LQ3z|Uaq^6n6ZNfvKM*~uUdeF%e4^;B5?q*=~kImRkE5TSYm;PSQVn0Jwz
zFYDrm4}@G-p7RihNe_*N6$0Qy#h3x8y{y^-hHgy8Gd#EZR=nq<BG9#3_OV4ET*+2X
zGU|SDmLEM;*5?3|{oQ)b1#_q|?^-lmcb>KFN77Dp#-Q{Cf|@Q?bs=8mJK^4dbE84u
z^L2b!Apr@nUYVP<W|2Lw1}W4}<|N%1mW+-iZP_gl568bq&Gg9$V0O_>Tf0^B!>@sR
zl@TL&)kf0X8yL6qt0L-?f_=K_f3$=}>+}x022o!CBVCfCG`AbidtI(x#Ro9&A|59c
zNp?4FH3N@TAn9)~nC8kO94Xy0u-dVqFg4BoX_=hvL%l5b+jPh1LwZ9Fgzx9ZEq-(t
zC%<t&ebTY=huf>~$BYgITO=3&f*6a1E*`kFigJ>EW}??g=Pm0cFKXcL3UvN^Pq7IS
zo{wj!^8HwvCCpS`ty`6~nr$TZIXGc%L{!@8j*_}iUOP)20zrRi)V{GiMhP!;VEyD;
zW}*L8(g|cG4Sjjpqji?Mq1BHsTpGvw*q6o;LOR9!^-7U?*_L1YmWg``ksD3nTBsVg
z8UHu3rdKz(uP_%w$jcZSO~rh}ba9cnAg$jfS1I_KT(y`Jal4x}batFzDZ=AX6A-Vv
zk*`;7*G`@v=vJ4K-rf$#k<We22i--caba>9f&60|$D<bR7fB~hGBby=n_+v8u63}A
z24MEBt+g670pF%C%7O)PB7=x<`(!Qg2yUD08@0LcMQ~bQ+70NNi!6lNW^s(PC{xgB
zcBk&EZc^)Oo%(IjTNgcM=?<%MqL2YD+Sb0-K{wClO`|~@4OR}i0*mVm3-pjhxQ;gs
zrZzrnZ~$1`1Yd0%?;ZWj@R(W;y!kBsxgXY?ENH)gM>?DJz*5yd<`0QOhTJN=uYA0<
z>S-!;6x{N~P|)`qhjy4usZPS|M<G3Y;Jt$RsgX@mze+(6H}{KqB1Mn@<Y?eRkP{ly
zWnBUe9!HX<8)LLm!P_#&;ILk@cIDx6!VK3&u&IRaC8LT^eZP;mlb-+@ono)*vQBK{
zaDx{HDs9O%cu8Xt<4~HRgf~liL$1nam~%sm<)%s%9EzQm_Y!)YU}X}6LPZ8;=qJ}n
zeRzxrDnJWXgz?>-1t#+IUoSV7*FVud<z13WDc?2NF1<c}1;{V`eH+|^w8it97FnwE
zSQ`c-4~^5uya$c6di=aTPUJ(RRqFMA#+x{gxH&k%!J5k}(cu7B04i997N(ETZ^mV=
z|FyM9ObBe_7Q0@7KhPSdMvgwW7=?bT>C!*`MFsDrOasJzq?+EVESuA+o1eaiqUUvS
zB{U7jld3+vay_>eZdqljv)sdJF9fR5ctBXC#R!4>iEK3j?6^9mTpyHulH>i(iE)M!
zwuum5Xk6J5fA3Qz0=fjhMQ#M+f0YL}@ZX@?{JMg`&Cdd1-%zgf;ArdF8X}9dwRX1$
z%s(^+<1f`Z9tA?yEkFB$Pq{O~pEV-@0OJ7mmsi%5h+iUN<WD!Qz=qNJfd?rz$n;;b
z_XiZ{Qr?;BzYH7SvjYt&p04EDcU{RlPjdA}SqGA4?rB6b0IZ@*ht_!xL^ra_e;KEk
zvf6F}UCEnRoXoEyygmF$Ppgw!?6J&r+v_fLyh}{#un*O3H{NmaTSn%m3Y*nwGo_ae
z*<r(@<X686=+|}r)fRXt)cR4!;AoK}qY8SJS3OW?AV?1V&G`b40-LXaQVsPzYX5M4
z`Q(g*fVVHuXd$SoG2++-bbdBp*mb*3RqvATvnKdl#5<w)?X<`J?WeUv=xr*8*zurq
z8KM|#L)#LPXmIyGf9hR!b?7XRNZqt6Mo}n`B|NsUY$Uy<;S^FNq?1b{qh8lqg1<BV
zIQdMNUYQnO`V*ghg($_kk_MlFC+}mDTD<20(*3+Ctj>e;0sUJN+C_DGWl$2-9h%Q{
z!MP*l4`*uBw5C2O*4DwA?0a>MLf*M0p1(rT4WGY3;I%I|+udfy%;iyP|LMppncnXE
zENS&969{~}UB$_vKMhtwGdQ1A``{s_+rF)V${=k)I3K1F5zY2_@X#^9FCF9n;7DBD
zqs);CfPaIG`YcM3A$a(@YnXxW(I%e({m<9rL1CIz<xdQsDC%EK9Id-v6qd@;_*RQQ
zcKkC4Il^-GvO9U_%h@uDgW&4vx2*&~cN(3F^9^g({n%#;LJ2S6=ifGXvTCAEd>$Sd
zF(GOF$)+Xs?S-2Q9fH92JHSsLQ7meQpS>w!%U%N-XJD^y723zrT8F6a&hW>BtCN)l
z6VGXkn9zrg(qeA^zy5_xoz>NqPJ36QTkPk@m37|68Z$|Q;d<GqDrr%QAd?{vJHN@b
z_wHcaiVzgCCP_J0SMI4JIWCShiF)X)EaMsPCx_70K8Em}4r(8hmU`hKN=t?H3I(su
zo^>lHJqE|<w>-0vMY72O&X$!QT<GeeB1p0T_n!e|hDP2`rVB6Q&+iM@dZQ0jH`Cdr
zGn-fn5ZnF`orR6`Sk@;dlWW<_wN!gmbyx2^!)t^#Zx>#(j`5kA1!;rqYR8TCB^FBj
z%^(Mj0-c<c%KnhI)J#|eSsNOK`67ZV*^N$9t`F1P*xv%gr~tmSiytSgGf(_Uy!`zN
zRRjDy3tfgp)sr<&<pBI{dc0<w56)(j2#RDRP>1IKjs*}AyE_OuNkJiU^HF0(5E(M5
z*gD4pOBbygB?V6b$@%6ortu~9jT+^C@X0Su`#*8lN3ET%_<-KhO>B$}avHa0#9Jq2
z*?sIP-V@yp$V-85SvYS5tpD)f#c1x!HgOfGGw-6ka?QsrmtvSwM(m7?kAe@S(Xf$D
zllrhzIrv_tje0UgKHK5hu%Xd4wFfS8OiTMqUjw0z=N~3Y;}`T2!_pJF3DMekwO+T*
z5KzQ?wE=+TizrfGAE&mhPcHIA7y-{%TW1pE)qc9V#Nd;CeOF|<bKknc=1L8Ljo!`i
z%ct=$*puWd;5D;6zx`%|<55tjcs74WP8~%=C4G0e@`5g$hmf*r&amMv^$He&hVRfq
zZ>wJ>tDErD)AOE?aAH+h7yIo>7BJ-VU~qjPHn`~HWN7{Vb@WR{xwQGCc*9}(jSSL<
z!qxB>H3HPP$x<ld;QN(`4IM%%o|bZSUIZN+Z@p|yv_QCIT^q`<m3S|p=iO&%<&282
zX}t2*v|7~>RWW@o8iZdWVzM~oD`AemGi)*y)9_<i&)oWioa=Dm4cE)P)LU7qZS%j5
z^9Z6OYwE=}FB?-<z!(hru}dd8^pZy*-9j>d&vZ>_(l^8U@A=+hqOIDI+?Pj8-`zYH
zJjC4Z*vQm`L%%^h?Q75G`>Gm3Y@G}}15;O@&D+UP1pZz+e&66yewYpoLTp~x3~k?o
zsTO--mbQ{AZe~i+V`oz-onwK3*{XSnxJ<P%0tdiZ1)kvHZ&a4s4mQv`iJl$SbhfoG
zsHg_+p)(?r22E~WoS<r{S1?3I&$vWg`jnRK7ipgl>3i*+FStIa0I>S^wBZn+bE<rV
zWMo<~P^Zlmv^U@;Fq{z(iG@6E{L4cW@QS{mTj6bW2$KGIR@Nio`ID@N<aS~9R?l7L
zsr)Ay{D#R$O7Ho{NTlOgWe!r*yzP?K?1q1+TLY!s2AmS!3z<s~^!xIi4|6AtPGhOp
z1y^<l7;W@b^<dkAbv5iuiJyd!q1V$(_EqTHw(N2WKFQi!!lb9z$tH*Lfz9AtyCPUu
zl9Xe;iH~<xX_<_SQ0zC%`z#ROtiKh&571@zg?ai-@)LSRUzamHhA;e$?xcLEOs8Tv
zeBZO2`GBs7XQRIrdOqLs2Cw2K{bCDrWClL~u-nkfl%-uK6&FNe|Nc9lo%^o%yW(nb
zr##lbKDuj-hD<s4&W6@~VC9-Z*P})0>S)uXbxxzfA8yy19bG~^%g0xz{A$#bbxxGG
z<&A&6=8yU_9kes&pHPdAY-;jyj58<;niFv<al(?GPD7<$yGxjS5j%0!vnAXbdN%7A
zZ8}H~Y$^^@D44iLF_ZWYYAS@K%vE~S$N^iHlAaGVa1_w+6w(#xSYJe&6SX~0rjep5
zS8E>T?+J247SZ=KE_)JqA0!cnkL@Y+mhM{0t#1<iPLhNTMiX0>*?hfiR8-Ofg0_k2
zo9-*T9b0OF-~vQgQHGD1SA=vv$won_&_VeS0`mynIm8ESkL`8U_le%D7IerbqnmdL
z(KbiOfnu&4t;{p=C&0l5`A^&|s-b}>Qgx@n0iC)QZ+A19K_@ry_`d4qeNwp?CcU}n
zY?Lm*hH{XbU&`CM(E0Od7ko$C9ABBn#Ukt%z^co6b~@v@i|uQ>>OdHFOmTJZ*`1a*
z_6o4~g09k%rd-rvshPMNJbMJ#AC}l%yC=E2lTHK256{MR&<6{7#;Y04?#Q2YaqYmP
z0yh|z_%*5P;aV*cwVio&Xu0%3J|VF)_yH$LCX;PFE+!OnqP_0@Xs4LI!pH4s(}S@f
z(H9oy_hUmYGGN0wR(%y-wPFqRljxezmAOXGO~RpSuEHk~DQ#WgS7u{S+Wnm^Uzz*h
zogFgDi`HZtG3Xxw7oQgEe#oVyd0<`u`lElhGPf?5Fa5mdQM%9k^m)g*d;RP4RE2f+
zd_47EXEca&^W|p>)_g#fGDYYPX7S(<+}YQS2O9j2suk+BKUmZ^i$8pGRzzW>W#x{&
zRc$@uoJ+dH5?_AZFuZJ9qQ4u|V3#<<)}hm=R=^W_j0aIvt#Pwfs1M8n7*9Dtbk>gj
zch0{iz-V;G@fSiW{{4+>*uS=G;CydD0Fs7h{Kv=T+7V_p_gmiZDnkb}Lt5L*+Bs(S
z>Kh5b%>K+*))xwJG2!Eh<<#(h4ppzcj_zBrs&T;7nrTXGQiTWwSBuc_sdldYzYQEZ
z^{v^|oBc5seLS8W0d5pqbZE6n2><Q-uTeXe9tvIJu;T2@F)j{HdRl|#+4Dhm6FRK3
ztLw$8nzp9JWk|Si-F+wpAg8F2jgu8r+T2`R96W5?(%dr8KhV<Jd?c8Zm|U#gu{O07
zvh&Bk-P=i7`LRS{xAHnH%(~U(D16V3qq_6;I);?BmX9ibZv{7Bw~6u9QthMtZDC?S
z%pzjrjr3%8(y=3fcY%qtWt{@vp=9ec5RTK`y}DA5zd=(W1iuI?vd;NHmMio9^4b79
z;ORxiv>&C)6j)SL=qyzzO@0%prq{lB3?J~)7FAGCRHWN{z0mnSzxf9$zA9{Fq~-Z}
z2?jMtI86g8V?cn<Q!myYpVz(UL6{i_;nXVhQsME@3{M0Mpr|-KN7K;sUikEazS^9u
zs}{}EDcd{Go&Ki?<H?c6dxX?Vu_APb^Mc>Q!(&4CkG#VPMvwu)`FVYjoNLX+x<|@N
z{`c5nV?E!GH`H=9&p)k7Azvi_6|0$<_#$n4=;+IwoGSD4by)<6!8`1ReRIR{kX}2%
zOzAR$&N4EF4h}lryqU6uTW7qE&rV8tP&@gWU`pdbQBhH^J%X5_edF_>x{*tso6o1|
z5fr)u&z6(CzBya(%&RXC?*$G<;12Fw8UI+m8ylnJcHy~u+%YsY1(Z~kF4vkymxqu3
zZgxC!dLGZn$fuC~27%1v(IESG?9mN3ePf67=$3f(gsOIH8|jH(W5eok@M^XqQn`s8
zXQQ&BY^C0n;i;3t?JvapbGEG@QUoxntg7nj`WBCzw^IE{Y>F;1i^q|i`o|Ai(g4x?
zRNpSikF6`WC`3eG#{zT}73{_86L#F7#O{KttR>UOlytvkXy{0c;Zd;(vKcf<QXg0-
z01p8N7yN4T?7s5zk=pYxb3<V`<8_!SoS58H--PgKfUk5q*x=QtOWh6aF&D`g{YXuw
z*V}0GeyNw^?ccfT$`BJ%R95WSxmsIaD-qGy?l}^kpIcDuOLusxlPnB_M`{9rtSxQj
zCWlHY$~;`oG|A&(ymMp)b-dq_@VVEtbuby!bEeJciwdkZ8qbbcEhEBk+M=KRjMk`J
zT^+x_=nO@${5jb_F8g3+;=~4s1_#FS3;FvC`Cnu_BctHGc1Ggb?(fHG#Hq;x07wja
z6I*tGuFb`Vmu#Pr;nCSi6hd2D3Nf*oA7iH*^#`ltxH?}vC!MU~K_J(LdhFBPz66=q
zO}>}ic+c`IbQ&SVAcG`!02db*^lvPD407b~VD74~Nkf;HpFhva{>vXJEbsjF(a98B
z`f`A8-@&(<I%6VE4(B-FMTmdkMZ*(@L|4rVZdQrpW6BtOCjv_MMrGv$27Lqb;Q$n9
z7lA<EPqOCnJ~BdEnxCFz#>b<1uc4PW56<`R-{kmpWaYA%tZ`Cq4#mSHC11V0ks*eM
zNAtg#gu)f0ir`<gE!UsjAqJsvb6@b<5p~u~nJw~xO2U)r?Kv`3XjB=o-~o2A;y!B)
zM=O!IOgn=Q=>HGfUK!O!w6z^d3luK|cPZ{}g;Lzz-QC@-xVu|$DDF_CxVyW%7Y+8M
zcisE``p%k_Kbg!qv(Mg-WY4g>6Wu`#y08C0?dv)G95^&Qes_Cy#Csspv+Jk;{0jGj
z5=TS<GqUJ;*tGsxv}D?R=!^(pGIOIg`<}e!E>WJcQh!cHKzc8|eti**(mA>c2N=4P
z2H5Yn&GBoeujV|wMWf7Wv1lgIlctzAJ^x}H^u6frtgxc&csc>oR<Bu4IvDcW!g(Ag
zPa%ntjay9m9D=>5qswTdF}6|PJm&l;B8*^*-~CCN6<D|rzS|Z!Kcodo<r%Ntm;=Na
zWGt*LKF~`eMkMPdD~ip{t$8zlEh;Y-EmHh!V=WpSG9Z&x+P=Cr<9IWc-UjyM$Rzk?
z8s(d+tK{Ug(;unA&W;@-(YNzRt;DysP7kag<E1=Y8cs~4l+D6MXHCP-)Y42yNVGaV
z-FM{X{=wsOqFlA{-9=DALDA7s%&a84@;s@9%ZGr6hj%iISFC(w-|?&Ab)86Ll&kgH
zVKHkaC`c@(p{cRb>qbInXneJ~UgH<WXi9o?1~{c`FKy;$&w<JQJ{F^nrL`q!+B}Dl
z@LH+(h{t?*m{JOpuEqY^5VB4PX4jidG>|_d6Y;vTa$*5|U;oMh!eSya*nPl&9hMqa
z9Mh+reltdGb8E{TdoD~<XCb5AYQHxLSrUMM)ajyJ_BUQ;3R6pMd_V)lQocMLhNdzu
zMuTzfHy6IVN^qG*&!(=lwap$*uye3qx2!oB4aUUAEUdF6E0s)Uw|k!B0=yrOO8~@M
zfAu_$zt*eHgw8q5M_^D+W?7h91FxQDOJoq>;f7j#zkMSs(4uj1anRth%gL^^*<`zK
zc7GV<e+mx9Qc{FONyODviBfK&#dm!!i@Bbgca0dXr498CDeMOnU(PmpQL!ocHL0db
zkYywB7xZf-Cb?K$tevw@nzDp#?w$8NBAQC9Xw0~|-_Th-<27UWzZ6{m{&4$9ol(NO
zF(0kn88{%@-9PaWu!jYDMxM#hsc>;^`@0qM?e@af-L*1>C*mG?@64m24p*fjpce}3
zbFFj!ebXgtA22lu?$LW49||v^dv&y;v?cBKZrszECb_(>+!7MolrWI%_N|D*pq1Z)
zK^>v3Er2)~*G-^QWPV}(3H*4JB?{~16`!pms1QGG8UzLXSAobFhWArxU3qy$yVp&j
z1k7TiCVkBAH%AXkP26nRMfN$;-rj$pM8t<1u`xDoV{4(&X&nAm?`ORXQmw#29DuXC
z#JRq1ORWy3<7!U}VBwGh3ynG0Dstpjx91JaT?ThWZ!e|H*l<g+K>5c^LFF}-aE$R=
z%XFhR(XGN;?3*pW>$uxmocxaDQDCXGR+%xf3+*~)yyaDNIh(JjCiDM|Z^`w3XX+(8
zR@(yid`0izcXRw(FVZ(wfScCFSF%t@xQneT)OmPiUbB&4()MSN9LHKA-15}Y<6@JI
zY)p)k={VZelg;`0I6Zw^J8rb;d%loDd^|d(G!-2~r~NfZoE#Si8x8<LFvv}jeu=~y
z&z&@8vNblbS#Nb3H;RqdX`M54DJ(AfT2weDBR=IKj>t7|abas_b{IBYux#xrW@cuo
zxpMLPoa=q7plE$usr8IZh=>fI!D^MFo!=6dRJdU7+%eI9e^E4Tj&L}>``5iLC+8*t
z9<djYS6^}3PUIJbBf#%FlJvak3{I2$!VXkWS_8?(P|HZ`Fjki?LAW=!`ZA(Oie1x2
z(eWl%tC|1roKnv!Izh7J{;|`csZ8$0(N<m&uxK*MV%A$Mip&1-s&_P%mxre=Z7iUF
z9;-;v<KX4#Cl2eG2<WA!2faj2D`6T!?Hrjp3K|mNTa4snXPypF9oo*$P%c%3rzf_+
z%ynlu*_=Ff38Q5rcq^VP(a`8z1O!S*sK;U;hGVfkQ$NXyh>ZRUM+(8B<wh$gK*xHK
zw87T`if`_F;?Bx*g=uM4>FLiX1Q9V2mgd%3Ux=#bEhlpX{I;&PO9=gbUk1I>Z=|f2
z+%8nUh9U<C|AYiLjuse>#YmGRsRV5@$Nl^;wH%yBb?Z`qml-F}JoDAiaGNh`nAp}h
zU(0P~k+0Y#{+7p8@@p2qm{eK-_Y%4$BD2f%FMOYa$v?i}WZx6I$|8(ftS=6=9Rny=
zz01~+`sDGkyu?UH92xOCR8<hG^&&zNF@RijlFV~Y+~bp>AQCn)BvE8#Wx;A$_yl&z
z$rg>8Ql_4%Daq63Y!Cvj2aUDagF#>s6&WM|wy+Heb_fo6qHM`&Czoi~XwbC+kv+_+
z_0Yty0TZ^*W~G+f#jmo;PXLD0=OH1KV+sOpZk{U5TEmC8*F{!VD1X@!#tZ?0?#bBS
zqo(zPVqy@*$BGjbGB7YltM;~3x1Y{#^+=J@bSqMoeCP&zVLyKOl=F9p_V2fYgm*ZN
zA3(v5N4MfL%9cq<`&^MXqFp|cHDBkUfa%tAk9-j7jbUu@VPwlBmKQxaG#hmW|M1&c
z@YW&rkq#M2wb^g#?XXFTEaTZF0Moq7$Wkvl|1kJ=>h=}0{2O_pvL2|-XLwHsf40e)
z6Z(TuR^WJ3`J`@3_u)06USq_sBCyW}AWyXd-E{2g{^o=K7k>U^6_roH!N%8IscBSO
zf7PnBCHRld_wQEq{E7;T`5T<eG-}EJA$5FmqxUeHP5_Q{R419}V+^(+yn~xlVpzYx
zE7;0O3PD3PQAw$PVnPawo)kLl?2O~}8uqD6w7|l`Mu*9*N)~Bd04^}j2jd-X_Bc=c
zzvUthDHkd>X=z#4nr1)qVYHdEDh7tl_gf`MZDwh7sNnV1w0{2FhGB<Ekuth}<G}|&
zh5Oi+Kle6Z0z~XRm`vY2+xrMGA|<V}-Dn^$`10}E*{%9lRSYyS9H_31hlb_mq|wT<
zF=N<RRasTC&roSs=Rt)aKct7t2a*}aoC0OKa&mGb`=dsKQGyCdq$OPV$dUaJwW9ws
zt4C5)hR5qbx=w6ieEu%-{k6KL^eEUYhoq#aZ2rWEQqI-I?Q|t^&a`$-8+b1vE92ti
zqQmCLk25noeI2Uj%WPtHl10GJhAUqoSP-!0eXELtwiWttXEFJ8=8@0vPLkeZbQR(G
zoRR!1hEDC-#7a=>=d@7X<5%=zhJVi~RK|tn24?dK2`Q-mO;hD;kCP3J4{*07L=*Tl
zWM`xc1rNyo!{q|RMPh3vMmRJGc-z~fCG7^`GJOY17Cl~IVuy~y0E!eX!k?9uwfTBh
zGrd3m-?IsR!8>P9e<4_cpa+EET3TJ4Up$qvva%awin2bzeq}%z6KnhsWX(}Jf6}wF
zljrZ>nOgzb2+1Nvnnay;2czeU^$N8ray4N#Hjay>`oZ;adK%I|*^)ynOhO({pkUlq
z9`Qdds7>CXbnf%Jql538-{x=b*A?~xpJvhRnN~8JApWrz_2T6IaLVAYz%NY4uoVt>
zhs%0r6<qRPD^zzaZwwvO!mF0MzvKMnJ2>iLywj~~boSB}^KE%G_aTwE!_q_W3btki
z06q-y#d6~z_}0lEdc`zQVg31x84+cV1VRosP*-trIs5s!SQlQJBJt%Sfs32RRjOz&
z2!fpG1JSd7Q=5yNy8}p4eP|yYAONSezYn=9Hv33eOfno|cKXV^($e}0sm0pGm4$=7
zqtbcHQ#{<_qv-tb>}(gZazvQk=|3b-GhZ7u&-ahZ-t#e5mVQ4RWWEFcli{Br8NT_S
z442lSbh1>m{&kV~9l2UfMeVdib~Bbp-4GTtRbk1xsa`iWqf*}7ApGwBh9@-*GL4p|
zR<fkYSc?M$ZYr!SA>>f{tEzbEbQgl|(5x{E^1%7`tXM>N(smevv-9x-Wj$$)VP*Yw
zI%JMa`mMi^fV)U(3@ytmmd)iYPi^k3V=3K})Elkr4Yz6ClYZ&fw2a7NzZ;6HIgaK1
zIzE}2CNMY^G{{u?>jy<t`)t;CRJg0&YTXj3TNqQO?)7o|zV0p3MtpqOM({+vH3#6k
zGI>tY4=1Ou+Bz3#{4~JHv0^o4QvQvPfVDA^jt;nhZfPJQ3>Ob7mXdrUF5fpeO0k{J
z?888VrOKO|PF9-eALl)HQc1{_s_lo}P|>Q-M?3w{naDs49FN<+a0pdNXE6yD%;#|V
z;0`*pd}|y&a`VvVFUP<(t|#fLkuR7&!W23!@Ou9E>El1a`By?Bwp#NO;1CUcnQj5X
zxWia&&8ce5%AO}@%kcpLK9P|Xk&zwZ%9~SDjFqwzJogaSATR=!i!=;MquoG#**PuH
zWnFQ1f4h<L8hP-+fBNHo=<p#VPiX#&6P;{0wF}fw>HN3uK(bXRz)JEt_y><N0j~C6
zlZnO6J>QD<urJslD68&;pD8@B(<gjkjS|<P0QTBxO1HwCx6<K)WAso;G|3+Y<2q_Y
znbqS1K~x%E$&z1Vb}f#N)v9#o*C9U0EmiZEW+ejyJ;Wa|smBOxVMA^0rL%f``lPhG
z197PubSXdbADvEBD^<P3a@%<=ZvFV{3`HPL!O`-htlsR&`>myvs@{p}QfT&=wSgMc
zDU!`t%*O1Q9Tn#GkY!Dny1F!1_`KY#WCRGG|61PVaM!P&%@#<EnWD}pCx_T;X=#O*
znb9{f!ACgRyWRmRm!tyT-`=`sZh+5n6~(BcjDQ@Om776B`}TnE`SR)sN<PdcU!^{f
z!GZjOUs7;<e(UwOU+w~fLy6&n`ac7$FsK||)ivr+(N|E}aF^ge7ckNXe_%pn&=aiI
z?ntcXLjIXUIcX@Uw>bmJtt>Fi-ov<CRxZlM0ss&Qh=yUCs}bDUmR*7m&ulG?<y@GF
zU}GbV#L`bG1rNcW8Nz2|NuC}<@e>V*7%=Z%8(8w$FIg8!7Ws+fD}MlFj&nR)i<lIN
z7F>6A&_!qh8xhQiN6?rMS3CUtjFe`LV);nx>g!(weR{;A6C{gLXJ&@f(jjtfsJpu^
z0zN{9I;2m`hY3fyo`jcD%-pD8Q)m_oD3Xm&;BtA|)Wi|4{_DNUEnZyGZe5Wkd9Td{
zno4)A_-fC~I_4P~0M8rwM)h_YZDrSfrLFqRKf}2fQ>RlM+*!xJCvszE>y;zu&)|}Z
ztHwI5tClCS3=bf^*Ex0nDNTZuZv*FH0g>6SDtDcEg&*76zwq*QZi?3%3|}_<Dk<rT
zkE{PM5KUm!AUF3*9W%1gdK#4N^>88JY<>(9DK>@DAS46q?d{88b29MIM7)%B5&CO?
zC{m`m>#b0x$yTCjsD+p(LIA`ynwXm9%1NTZeKa5;0fPVe$z)LHHpED96Qz?{MrfJ-
z?N6c*txl}IA#Byw`w^=>k^iEOO#Hm%T6Scoono}WG9fFg&Cm=gFRv{N_dfOX@;t!8
zgtxIaXUkYth=J;R<Xnt@13{*4u1KH-0=l>DLwHMIgt{V{_YX)D>AHA_;e&gWc~eNu
zLNUVA)+C0>tvT|jqVOWcq6p^>O6DB#3Bo9e8XKa25~E^D7MkTbv8&4xju`)t2iS&}
zH~oO9N<@H_g-D$(=rGaz15^||L5hqH0RcWDk2=IzpIO_`r_(7bEAAX`=UeIjm-*5^
z_11L2qAbiUROz-l>f<dOrvdSJ4c1!jV~~+U$+rIby`6KSjOvC5-6{}$hw1#I4)F;t
zGUKKELP#GS7NrEslou8jS2y`-`vwMzYs)0MnB}$928~&U9ZjdiOG|&99i0_kd@Uj#
z;<&0fdUrg^`W@p9(9f4f@;zk3$?Bd@TL~eV(&3i(82TOvvxr~GQ}x{1?429-6}}c>
z0j0ONma@I?>%87AMid+n=I9+s`W))-zklS!IIY)~9*#l|v}81%XX`CVqzrOhc1#zp
z&wlML--+CbegXhmDJ5)mb3|vmoIH-4+fqx+AQdn)G4W?Z_kHq5EyVxF^4-d7i1fb+
zh0<9_D-MdIehe|7>#(zgILo(s1~dr|lcI|VX$n@biAzm$F0)O>+X=1Gi;}ci94Q`N
zX4QqQPLXPva$Az3u#7__4>vFayF<2QR!2u09v;C3cf`1Eq?`spj-ZzBS$rH8J@xC&
zxaPoUZ^3U6sJtx$Ukjo*Ev+qS=onmG9B{f9oF23Yjv2XPPKo$3^yDG=0g>+G2f%Dm
zyzilNQ-%`PP1?BW1R`I*w$T<hi2|Isz3lR5|BNO=SW4LSXV9yTpAc1O{|6Me9}i}#
zE2Z+<l_5QbY?N4^;k$>+O<T)jko%%6u!Eq+>3ipO2(~Ua>61^2w_T))AnYFig~?6Q
zUsM$E_J;Z2mjr@#A0dGmp`{_z?ey-p&Ea?ESs$KO=stvK8jj`$VG&VWBo1t%d3gCK
zj=0PC;saAai;C*NzT+qFPTx?>R$hZm9Le_kbM%#^u<Yz~X;U*ZGgH?l$)bqJ^Yv&p
z9-5Qx?cP<lOG5N7f(6r%h>ebnQV#UR6$rFHTsD7!BR6CY`eSZx{W~Y!f($jPeVxqk
zvr63wrP2b!UtKhFyuAL#XIf;Mh6wl6G61SI7Tw~AAHy2k07-&~QE>Q=U7eCw)tA8!
z)la(Kldl-CoEWdB#L<IWue`hC$SR>-Q<vg*wdc*QzUZ$-e>}|rk38VWC8NZWtgJWd
zso5&+R9P1_(NXrSZh^?Q>R5jD>nWk^RE9t4tXo@vZG=n2YtNoptHlgYOYmHopUrBM
z$MgO5^t3l&bwPc7Z5g$}0Al_0cvS4W)9C^|uWM9zSj`u>BpMYRpKpSwd*0eoeV#4t
z)esK_QH~I!t=;5ayUYw5felgY*Y^`+6Uc~gH5l*+5fKmze=LB9h1c$Mxp5m6RXQ|8
z*!pr+Yt$w?UUhLnHW(X=i0E9?Jm~N{uT;EZ9_;QB-`x3pJ-GB4y?CPoXWz$`CjuCa
zi1^$2>84*Qbs&~tl`J)v$4m8HBchbrR)Ksli2{f#o6cqdSqWsjA|t}4%o~SO8K#e&
zBc7Omps|_F7BGT~D71fS$>A`o8R|!p)UvqIJXVB8-2XibKwD8Bb<xZ_gdJKIgGho1
zv+HdLQY<5PQydu{&BP&+OOZRta&&f{GiQScI302{+~@<oym2j<ZU6-R;+7pAmujyR
z3V@O(JN=Q~{F|kzmK<iQE31BM4Hk;lXM3yrC#jo$u>NK_o)ItU-p7g%j{hqsU{e!%
z5XWSMdw-}3J~+QE71!>jOrj~QA|!z$=41pv?*sfh!t9;CPEdl@6^)gTvInU_M`u4`
z@Jl|yZX@4+j1dz2Qa<e;n;Jg=A^V%z>f3PU$0Ui41iz<jWWXffJTGB__h%W|qHoQz
zQq!*R2%lRW?@j`GLrY|H#`KvObUMcjYblP-#jHmPDk>`yhmFBVh?WXK25mhB;Pr>@
zYo(G1NlDV)Uavhzon94VGqIf9DJ*z}Xc?Kd6Ky4}Oqai=#_lb)(_MeuJeVMQj%nVy
z+rfMDPf%MfrED$?KtNCLl_1aVV9&j!{b8M8esPeJQ$T={QLbRxzEvBAv)Kfl;s}!`
zGzveQcqq9-4Ta#FB<jzh30qU|-?pW5v+Lig^N2YG^eX0WJbo+W=O<Fio-LZrG)d><
zP2QcZy{inDTfouxF}P1QWY6mCLg@z_{&oqF>+sqQay4m3P*Z%i-`7j@)k+0xF9pC+
zMC0u88N4^F*A7ygO6|@*@s?P79gmE1t~%i_BkPI0H(y><0GK3!t~T4rD7M}WB(L+3
z%Y@NKIAZ_p88V|+^AbP0Y(>&#V93S7f(Cd$(_^o$u2P}ZJ`Rf!$w<ob`<^6;7Sv+E
ziyaf-$OhCW&aP1Aw4^0Cg4ei%fBf0D*VfS<*tkHck^j}6xq6aJ+kCmv@z5P$5{ZRE
zF%ax@NXYAQa=7VBM(Iwc_xo|OQp;r$`~+suX`rI!e)3jKi2lxGu*S7c&k<=thN|7_
z*;ro@iNC4cX8xsh6JHP&tkipHHhU}wE)<VnTK3rf?SZAFs5m<#?CR=(PI)5dUmTXP
zgDK)DZ2?JcX^W%X^VcCE6rJDB7MFj5s3JT)JRwsJ=~I{U1H;*+{B}<m=Wvh!du!xa
z;Xl_@Armm7#O}-}GNNl$BeM)_my!v=B@S!X*>6Mi>aY`@sdT33MJN1$BhA#N01F=<
zGq*;*{88>I(;8x)yH*SX?+rZskP+JqD~q&CyyBtt=0n;a-sl#BVm(~Vu%&eMhr)Y9
zcuz3CO#acgYkh0uE}z%@1R*rcz+66|`Y)&(x^9XxUp{4uEWw2}I5$+_38LCNlBduQ
zh(2OBr~TPM3POQ{3R|va28s~*JZ`fdPUdp^5%w~nxIKJDz&csLRd9EPkPlkzk|=S_
z|25V%wA5e$oON}#T9pd%@uF(VN|A=O>XkM&txr$bA>2!=lw)bk6gw054>0@x$#KAU
zfd1;ls}p+ha)z#o#Xdij0Smxi9xpd$=5lxA?FBu@112z#m=@tp@X$c>KmA!rAbkJ3
z@1udGc2*U&Nx!6?@8f=IO<bHrt&ly>Ich}R&BN73$)@!Gr-!aTX;X6}CsGhFDF6#_
zf3~s8{PV9V{5B0S@`Xu2B1T4r)YavAm!}a7ibRWT_u^#O6s#PN1Ad^%zVE<_wY&Us
z6A}$A2^CxlL&swIfBMDAf&n0NEiW%w-JBo!`nBr1goIL<3=J2r|GvxbU$K6Cho0w<
zw12oIKa~&q*Mfc#2$U@mu)aoP|JQTI!FJ0)s#{p_Dh<ULjq8@*0~$Tps+xSgIHk?y
z!T9xL`@g=mVL$#t&cVCD?=0}aXjuql>8XCl6GbGSo=$~{_X7c-RL}RxZg%|t&K?oK
zwW{9^2&%Os(o_k4ezL%#Ygugjzb3o-lbOB^2cN!qW7K6AEZ{B#X+Z_)|9ar6bbXHr
z=IPow@yYW`D=RZA<^45{v}z|r+YXOo>2>8aL1KL|F|l--9|3nVGHSMK<`#CTv=Cd{
z+dpjKZCn_+QR|o7*m#_tE>l_gF(%U5hU|xsP!vIc@9kRaOhkmf-@8V$oHzmbFnt*(
zPrcr?*Pos%yF;Ib_Ji*lJu(GuT~u%Pr!zzu2OGF(>u($|+;eeRIlA(i;Ior?p$d%P
zC4-1*s^=J@lIi0}vvJ&-pC@f?11TxB1!7v*Z+7DAn-<-^@j2-p?7UvDiE<f8%X$@W
z1vuq>8_iF?az|Dwqmi3F69Qig>Tf)-6un|s3-W(X!5|<h3x|vhO;p@Uzs*~}fhqCc
zefyDfFxfd+bJRC_3^uuyDm%klPs4o1u#a2dmN%<sy5nep!^g)aDk|79?cx1O6w;{c
z{L!f^1!TwZqkhYsKK(CGRff#LR5jhfv*BnfOY(hMDr%{E+S;pAQw8!h8gzCju}h^?
zo#DGa;}rQ-waj-bjROa!5Ki1b;PB}As011VmjdK<b+Y5L*XLFu086XOG7&MZZVt?e
zP$-B4nMgY8>;3!t6EQJpW``MI&!G0{?QOExmy3@nl1f#&cbz`c7OBc3rnMl^=p9F{
zZ;nsnfq@-^G2ech$0v4t1I)2=5c0W5o*i+~GQ`N19Hu5^Nyt*bk+Lz#3q;hFmqRYO
z66YF9*{r*v{Fb^u9^!}p9{D=9B?%G!0R>`Sel4v~F|7P=*ich2u#Dvuf9>7g+f`oP
zWnFxHRDIu|ceaqx7(#dT&CDc*U`NVPlnviGz?$<nJ7y+u>HM`)-Mws@g{4u6Sq$=2
z@e<RDfGtORSl-Iz!BB~!@n?L-!j-Y;OY&-S<~`}UsbO7K*IR+&aes&$MW@`8+~2$2
z#c>AD|N8X}az{<h)TzBtPJ{%*l_QdnId{&a=||A8WGTx#%fd-FZpWk>H3=|*#$>3@
z&Mxai<CSIAeh~ct6Ev;%?S!0-gY)v6ulCL!o7ahQv}&g7?m$j~7?Dn0UkjBa5eC2!
z9$`|ajjd<a>E!2UstAteCYmHkDW@H%Zuj~>{mbcR9mK3NTUC9-5<7c^&*}eqcRwGW
z69t02eISR68?=v)-+FC9USXfbi#vddh8Eht|MO>SOay>8AD{1LM|)m_a@UvzTLwZ|
zSt6(aeRd{<G#Z8BITruP;lU2=eZ!P(W;)=C_fO8ex_yz)Y7@$)=jled*}fnJ9TgQF
z)se21!9G;K=F7$B3kJ*hN=(3uPZBROxAFd8!-7I8cmu(k8saCwM@#0PvSf6v=I~G`
znS52x(sfKja@;*ip8?0|FEI?@^8U*AJd5AK&9;pV&5XIcsb@g9FOly{ji)Q)nGU-H
z0o<`Md#WZyv7xYm#Gi_afFL@DZD&yFZZ@+;LbiPA^Rcm=AEe56ZX63{<w`}0)?5CV
z)}~D4$dt@NeLp*TT-@kb{`5(qK=kh48~m<PMG_VkMm;@4w;#S=*&HswhhLjQ2NGlQ
z%b^MzSd?W7&$x|6{v0(efct^k;erkI{mV~}_RnF&aGAqwVGMUG>`=KxxY%4Zra~fe
z`<Wg@#Z9{L7GA>A?e?oR^a@?x+K>HmCSB0}TQvxPmYV+ldX~TK@b5~u^NlfMsxFxX
zy{;kdD}I5Sjb;(IMLJep*VSteH*Gfr8pxB;>d&CdSy8g_Q-+t)t-qr-YV&E9Nj67f
zf9&LHVhR0kf&$h=hxNw<cP{Z8xzGUSYE^k7rdJ=W6`fTbP#Q~9?(Z8;7p?Gc=WwI_
zCsFSI;t}DLwXd#h_-^0qLy8<T65|URXft$iW+NvfUSV}9%qT4}sJHOQT&;HLM=j5d
zl;lKlp>$YO6fz2tbX4W}d1|$uow=<lRq`ITxwbP~==j1nEk#}5C-5D_f96NaK<E|B
z<Lu%_snhzSe8iwWn*jfye-Q7yZ7Mz~B_%x-7NGYIrUhKJu9c`&vQz|>{Z!IYByvpY
z8Ea{oi;B9RkYxx(|ANayK_@K`MGdW3A!hIq{*I0<`;G1k%jdr(a$RXT8#5~-ru8n8
zxQ#Rbh~F>P>DriC2$?arMH?=xH9D7ZCd?fF5Me0c5cwk@F+BV{JG%mtaY3Z^aETc+
zvDN-yEa0oEn3C1$eGu$$_(wooa&E5slcTe{yR|Y9;Oy%5UhDO+qfzf{)CFC^1;oWQ
z(N`rk(qQqr51yMlSWqR5#lj*uKRnM)&h;bXRHH}?&(1=lki%SAItt}fnV`0|oh!%0
z6iC>qt82jHY-?+`3GP`cE&cVIPpKYfJc7mK{_WrwRPSvFK0oTmKG}=`%n-$3NA8wC
z<V7j2qLwgSP4U4Ne})BFsWne16cU>gW^Ldlx$8?@bw^Menx=(<fU|~eQM!dG1#;$j
zzmG7V*S_Xw3a`@_=(G<L@oF9zS3~*lu-w=Fb&aLBasgU6Z=>X(NthfNjcS$^9G!u5
zq?^mi%q$zIGJ_)t*qusTn9@_4%)lZVDj2z=^D>2BuG|T$s)~}63ooq}3Y045+3)Tk
zf#+l#$wDY$jNs9I<$wmn^(!tIt#RjLs%*~fonOc{;Q+oHTUl8dDJkmOHZ1G=2gGJ*
zX-lK_wS>U|h~au1%^v?4)C_jav#~jk8lzvhwgSFK8hnfy#fYd_US{LbSwurZfFEI`
zmywo=L`EseH}{p0uo8pS=n==&(zL|{@_`=iFBwsEd;$ZeI7Pe<#~iIyn<>~!N*%`W
z0;=`7nhH!e=gY7F{vlIPd9ur>r1(#1hms^p>dQ*6F2e&D$8uSj&cc+EA$Px8uXj$N
zPJN#E2k|C;CqIyU7((bgMKl~cX9$x^7tq88TlKl|@myAqoc~o!&5h;7w8evYKyp`u
zEuTjHL2|MGss9N`lBucnfd9>s5v_l40Agois;U<5UDtJ@RlQz%f~U#EL_<SURh6|z
zhH4sXuOF_V{2{fN9g4!s%Qcq668uMh4~Tie>+8MW6Fh;8Y}$V^G&Ira{R+MfM|aUd
zhK^BKncX$FBf`WUGOXokZ)dHmN6F=`zqtp++?<>k9ZteNKK2a`&?JpW;o#s_E)4$(
z`0aHxhJzbHA)Vf{Ywrn+C|}V;9K->vD<0dmyNX2PvQw|rXmIhfBoK%FPDmI`W%va6
zC^CMcPqRIDd=e>H)Rq*_4B;K#{F(;P&RBmWT%d4BNCrD`qi1o{_sX2Il2U~-WvpuL
zbRL7i>`EI4jpe5~Wkrbs)ynb;UiXuv=Fq{wbk={pmeWNy0`8lmnIaBvU%lZui$bat
zU^BR=n;5+!7DD)u!@sI3$OLNVU0j@TE8D7&L7;#A@iqx^)4%K1P^?7;n+=EqlDL)k
z#)gK%;zKQAVP}DXyI2guKYy|{Hpvol%0?Ott5xC4NqZY_|L|#7NODq2You}Uq%E(A
z)oWpznY07<g~J!IK(M(;a^Dz4p%@8b^6GM2@Hg-jLgrjo#Etl&$Jy2zU3(hVQ6EHM
z;7A!HxCeB6Ai%2BUZQY4b6HcNA*UWUJ^9H1p|M_6C9Lt0X){ypMZITybjH;Nm#Oog
zE7$QIvx%baW$JXGyd-q2^=IW+{K{V@GWe@D91*={B2+)frH^+Um|7E5RYv>lKkBPz
zAVClm8Px8{cP;{o$iSr!nYLi7k4;^i%VWz3&CJwLFxBDmQFsM4<wF4wK~1RmgBG{#
zzcqNWtGvG8yjo`7D4gQr5uBeRNJ&95qUhT<NQB+R!vs0kpeOV*k)Hbdoq5(bS68>d
zox6jlnHd28UQ<R1@hOZ?u<_;=KYF(7&FnCN06?~=R2qxP&k{<HRN^ovYU+ZZAOcur
zXTbLuYWVg@zt8WR_`}jSBi7f5H$-^FND+C2YrN=SGcLL8ZNB6ezbq=tBqn3)ourql
z9({w$twwFyck-R=Cx-fA0DXB1V?>wF%Hd}i&s3~i+l@iPl-c;Sb?c;00EZanM8=6X
z(BrDkv>!4Z2K26@P+OT6SFwne7Swk_v>~=dPgz;HL&sK>@l3H!TST5#cHHr~G;9<s
zEWnkcQ$<-dV_7M&fCBaLu{VR;aTfPp5FrBtFEWAT<d`;-QHVw@IfTo(gM%S>wTKb^
zr|;<e;=;%4H6*gWzCNh;z~|ZdvX3@BUH1OoX?J%R(DY-w2^!YZXwGt#hsU(P|9GyY
z040zZE)e%G-x3{W;;=BPu-{&^Caluu5?M7pCj4AXbfJX|V!h4cl$6`Cv8ye8MLBqA
z#nS(<RH?Ms=a602ot+`_C|quq>XtO+nNk&{Y8~|D6^1naZ0WqE;p14Hc9y#OT_dAs
z$>NFsuvCQ}JR(aim>6z{B7TmIEee(x4piLf>uhgts+%KPV8Db8sT5gc<hFopC^dX|
zq~~%rY+8s)vtVZKa3aad_FJnfDg^BehZ2I;8Jf+M6x&Q#bXbGhvNC&qsg%uTrleCl
zxXPxn1S1|3qrJA8p@=vGK~!TK)miNNX&Z690iu!SY+<62z>OW{xf)S-n&$}$NeQeg
zuB937^F4YLtoaxrWQa5iX5}3MXd*%+^QemVVvFErr0M>V5m`5dh!jL4=TY(f&Pxut
zw-hP)^0pBHQoJv$UEfQsFO7l*2zJ7sP(eg?V|ETx>+E7=7G^cczxVVdlO;LXbAR?4
zLitM;fil%`eoa<Jz%z1k*2Vp=6)yF@ck4{)<%Q6N1rug%gO{0kSLEXCYRI**YRPgx
z&#_-H;^}GZ=;5il&{u0@^Z2rJa|8JW{$S<lxHDq;a^AGLBrVNLN5^yLM6p~}sbYnR
zqlc^S+gl=K>Ug>kL#Vl>%{Tj#qzZLD%RO<PY+Y?tR~qWif^h&MB0x({BAFVMAvj7$
z9XWO2Gw{(*^CcQFbueNe8VEzGKO?1zo?#ckNmwqROJ6;|)lr?PsFD7kp7`e--tnVg
z1}8VwOWHWhShSEM1PKcnui*!rx^Vyij`;J=aaYoNr45WF4IV;=zx?c%kl1t$PwbdQ
z4z?(QZ!5};W=z<Go?7r+VZw^(QQkFeoxalQX>URNgoGMTPbp!q0{0WV3=vjdTV_qY
z45K}YDY}JH3aEl2g5QI_oZ+%(m>Wt&g^T_*++gKrXCCh>nSMbtiVA0sC{?J<BMr<0
z8RkdMWQKJsHcyOQ#!kB|v(WWtJo(<oX1BUce0!M4PIt2HcX$zYbhI$pPpUOy=ZnZG
z5*Kdq{A;RUVc}#&8v^PZ7Oh?CS<?;&x!m2Iu#ZbpDc_~D;2`FwFBjo)?nxE}MMs0h
zk|uZQGX?bQt}O&XL7h=<>5Mi<Y#E;U+{>$G`+I!WmZTeRVE8!gZ$81_s|Y2g<9khO
z=kO37DJW>ZvJ+qEnCs`Auzq(gLyuNjiQ9`W)J*v3q86}WtcoYb+ulH{mPEBOHAkK}
z8U+2pcK=Xqz3XykOI|~(f}gHs5G7_C_r5MEO}f~U?qg>E4h|mg@^YDK4{-=<V{>!G
z8qAI72Hx#{>QMjHpCA=M)8b-qNN;@PN!=1sS3NFYG$*+Pj92f4kesK5Hi1cXFsGI9
zcjm&nly5^_GW)W`aJNng8$<i$J4`q&m5m4LWYLLxj!cNa5lT_=%wVW)K<<5%6`z(>
z@KCvuo3I~>glxWp2-51XEDYdDL^P&}g%FEOE^xRz*mNX{4!t$OlrcdgjaF}Int>`L
zSye>@3C~pA*b%)-3#3e?aC?-_3SZ=CX>C0T^9ku_Q-GSC{ca>VE&v)sa=-P~8F6s?
zdWs@j&&G#?CT15tn3RDh<EoUv+D1!Lt9qji10VG}k~-;8@~VAFp>V$PNfsl>^Rk7P
z_uY5vyQb*@o`VA*&UGI?bDU7XlkJ+`p`p>n#!etNetUaoh9q8lVk82e1F_d3{bl-Z
zET~kP!Hfla?_A;pAGhxCw1=pZ{$*20BZz(QB*^z~Y8&IsF&|y~-KEg{psI%-t|4Kc
z(N$l>!BK;QqI7XYw^>@L8=ZR17*w7FgDMtjN+d?w&Y)M<i}R)0yabR5D1@ZkQjKkj
zUjCOa#AuP+O$nxlYFmG>DnfxGahq#mev|*t*&2qp5bDlT(y%dhh|c81#K?qd@D2bw
z1cy{LUw)02(XFOdA=hRz69`4j{jH;>g^P}BX<;Oy-%!G&t}BL61ysuKGlxPMjpK9-
zz8lrhI4n}Es&$CV%_S)yZzP!()Ej6YOXc`AQ6LpQKvH(5AhV$6uTx%9kJ_eOZ6+di
zY3)V|_)msrI~;yl8W0sl!NqkRxU^-LmkTBzvj5b;%vZm{wX_1lR&{!R3krdu&7WEt
z8qy^%FD={t>rQ|cUXYzlV;W0@-^+exLTzClMjQsl0sW{bk<y*?3hI18Yn{TrkmCpE
z3IjcA@qEqL-Er-PO8S<lm~%sCEVwp5vUAK_|45Yl0t~il_Rv_Cd-;ecHfKc?8Emy`
zhf6uUKR3_%@b=ml@MLU250T(g$KMMq7MytFv+M#7uyDAShjBBoT~N}i#UhXtTxQY+
zMl~o>>mdu{U&KbZu|h#M_mWJZ3>{b1koky~jtE$?c1>MWRaT=-mQ-OCXr)3!M;1gy
zQV8)kT$(N{ghfJ{H8lDZOUdGbr6)JpbbmjV$yse?2JK%_P!Jj^1u+-HmRVqHWim1{
z2dPN#?t!_Pnx@9`%!=iT(w#1|=RU{YMr-fkwYaVs;CsO|-PqU(ksnP)MrI`)-JA~~
zzR1KvBv_ik&ca58Dp{he404oD_3Z3G4hf@y7VO`er3JOG3*9mR`;xnhs++F2%!lMK
zqi?+i5w2s8<-J6$9bKiHd^=3lt>4LhMAoUq(5erSO>XD^{sI_N|8U3UO_3WjC2+*~
zPG5opWBC}>x~jcKV~0^AL-6aaNv%x3ewhuovZG)%QWI70miSw{y)$)6zhS?K7!kh@
z4>LD62h9j7V?3V-fU3pIP5%4$yvu?rlDjgXH3uFfPC-HpsTJVyM?S(@1Mvd&EG6}{
zl=NYC4plw3rSIa-^7}u?c6AP<@Y1!b_(K{i3!nj9Fy2f<^RpUo5Hq%Sa;GwV9Ms}Q
zkge8t8Yd3Htlzjt6)Agyd+_Fqx?dw)eOM8DXV%ujddo`7%IwUEH#%ZmUELxgpZEx~
zMQ7E0v?;%p>VuDDsP6y?o^MGbSwq1CH<ACS#pPqRv&LCRSN*z7?P#-7u8~bXv8v(>
zY-aSVIqKfx#o>Hna57>N8Jp4swq0prEb-PZ!|=$qD2mw4B`$M%OMB!Ts)~%vR2m#J
zfQ^mW@e;elB*Q*>`i(Fl=O7%y1{yj(9pLnk0Z}FX&A2~59!5saL`XRzO~N246w_;J
z6?TFK?2XC(rlq6C>2jv-!}@?o&c<Xf|J}c(HNAKHDk|EIg8WEJSQr`!PlXC~ZehMm
ztb3k^fhv!)U6`}EL3y+5vS5DR-_15DVR*k0g|IZl@2X`D90GG^TDj83Ly<UaTKm(~
z6q29weuzBl%NxF$*1ud48c5tTTKx8(^~iWAyNXZ&OKd4<UNcW&+iCbpX-qlN27H=c
zib8=Ol(K$FC=w7>@tY0+AJd#YKRKD7ZDR_}oUm#~XMc0IJ?SDmTEpWA@hRwV=?zK%
zSA;Ka^T0Wc*C*cC=1z3@@I3g&Z|Jx{Sg#{m=1+$gyvc*=wCU6_G6x67{QL+0O>JWN
zcO0sPjRDh}G-eYOmGI$Va{5!4;;>z=2m`vtYA*$gGH~NUN($uka@KPK0+dYWC=Yfl
zxE>)P9OpKYO=Xzum<kKosv!92sKi4lO6-tzT3RInOiV1Nr89=qB2M{lN7`^96^oT1
zGQk36$Zv*5%1aA{@5(JMk4k@)O}7%Dco0gIf0d9=g@=SLrHMnORGYz$spTUZO9eWt
z)+)qwj;v@Jnnwgxo(F}5v=<eT($YqUnE6OJHwPXUa2Cx$i=S|Nq~j@;^N{EQ-R9Be
zn^S^FKy7sQx*N;3MdpvY?{o%J4zPF{CP-4<Y8ePTuV8uP$l%rRy>h+O8L*c)5Pr{=
zx@4;=J~T3ExVycmd`cRJaHYq13kA=MH&dC&R#q0`p31-YLp~vaxR{s-(bm$|y(s4R
zmaGj7|6D>JfsfdWHkn;fTAl$!pJm09gNDhrHL#sv<>*w>eyOQ-`2POJQxLye+9$nU
zHzKL>v#y-Rh>Q%qH>LfNGOrm8D>(`9-N%Rwkff@L>%hgwpw{t+?D9fKezi)le^Ww&
zf-fgoe#n>w!l?BK2>Xt$mft$R3v{6m4~NR;AYNVP&mN0>{R-JY5@=XbxE{k=wk|5T
z9u+OPF;p6!a?EvYj%kjC-aeV|0zWlMN%>>(iZ6gIo1NtV$)?l`d@4Bo+2u~}%lMSu
zce+hHE4*EE<9E05Z~~Kd_Cg%iD7AgRuc~bA*V=Mxaw~csM|hj;xPSAZwye6?3uXqo
za+pnWMpv8g73x9zp0hHDgA4b56L@6OI0F0~dpFDFK$1be36C*!w`G`(`L2qiu(&wr
z!I*v`0m8k@Np==XTN|IND}zF)0t~Vc<k!=q>Bqi4hz3SyNOi|`z^4?2!6RLeCC|74
zpMIv4BNT9BVBl#R<%dlGe);H7S3gQk=j`SH;Wd$>qUBH7o{1qJVF<Z>cxWljAVDWU
z8$M0~syNcy*g#+#;@A#8K!xl=VkHT5scWVTY<j<2+=7A*3;x26nvqVOG_v~i1W9*@
zmz`P5(uVcHp=6Y>!A2bDuTX<Tz4g0&bHlBygF{~&iB1Zk$Cr5Ehj34FwL9!{MFI}<
zsr<xY<c#Y7JqtkjE-MLtb*(^?oNBk0H+#$z`ol#7NgR^vsI4C$(3;L^r#mu&yLY)s
z5}!3WG}Y=E8<0L9v#W2Em=zyD3^$!+YGd%nn1$BL(wV{RSK@^#6Pl;C<TwAqoW#^t
zlA`k1{D6Q^xm<pq?ZE1i5@iahF4t%)>$UojL59eV2e*YQV7oUPgvZ{)Vo{I~@xfeo
zI-frSt`?HSbRJUc>lij$nB7*`qLbOYBp%}yx?<o_@Uf7OHvh1SnmB5nLsP^+*D|lw
zr$PfvizV@_`un957hKz7HQk^j(8eoo3zY*(D*CkZ`s@o!e-_A-%HH#6Cy6reP6nlr
zK(B@%c@{2JeMA7bTa5_qTsdN1-XJA%E1gPsQ`)&boN{whCM5R4pg_O~5{5c;y1P5S
zTMg$%7Z(V~*jggP{9}1pEucgj!2W)x-^;}0ZDWG~?eiBTz(<HyE~beO^PHNp=M~U1
zwvZ^8wmdm;yj;6}xK~9|n0~ZOTrFjYi9v2^Dq+;d<}i;d3zsl(a1e2EaaPBkU(Nf`
zyy|bTbnSGg9C|o23)S5}t>9C1@*70T8!zrvlUg4n1i{KDw@aF2NiyU?S#n%_0{XfJ
z@*f@GJ0a9PPuKghBq09ar{dx-LLsF*5?-<X!_BO9%ieZYMTHs2Y($-l6I+$>DP#cs
zU*lFz*=9Z(HJuU+P21|5;jPzFTLUO|KDZh9!-e%BX|R_#FRP^uvR0GVM{5FsZ<mQ#
zDy`!lnAY2Bo$vFyJ{W+PM}CVhC7le91|k!FnR|w;Da7JT`T?hFog+yB=9jDbMwB%0
z3^0t3BqtTruZTLTlPf)j;Kys6#j5NMcZD+L8xKC{X5Lyh&Rlkfoubo4B?g^@5o3Ig
z)qxSo{cAj`g@qN*lhbO-EFPD$vt_PElXcHHLuui@^hhi>LO$_=+4EnOgVDHmi_?@9
zr)@ku1EL}(+FicPtcioWpDH>Gxam?pr+R(kZ7-^f4k5-oIH*-nknPjw!yk0e)-wys
ztgr8C=ByPatL5WsMJC6g98Tq+qhMvAp?R7q0*9hRM@K=(q+L6?Zj_Xi`eTA2C2d;{
zNT*!Z)wK^XV%Kbvlr1Bu(#Bdjsk2{h*bYjfk^D2MTDK%sRCriRQnJh40zFi&06Epr
z)%DH_q<n;;^lO_MjBC{a{={KH(J~GmtwA}Tcp6Fk?At_QrOIIA=A3R=I182Uws(%O
z@d&aV&Na6?y!v1mHMqII;aSd`)IPjTxYCN;h(RxUE?SJ){UI7WPPYZupwXDhdAc9-
zFz%!2(RelN{_%g)Ib*-Q-9vqBaUnNL%dl4vTcs4zl1SL9VM1r{Jm+X`%nkt98dOC^
z+B!BZenWxn{oVm&{+$>c0X<`)h7&EC$>Vw!JemsGk{+fpNTT6k6lFLI8&0p&)7CfD
zFl{>`0YwaZEFwvp$*qX^0RCrzA6)!g{*j59a$=+*YkIVy10+|mBQg*^#tVhQJU*5t
z>z8Cm+ZKH2{yAO1sN3%PG=P*YZAyXKCoC+_+gTO_=)UmzTx$fvPAFm7ivgi9*ET}=
zFW{~tG?}*}@gh9X%Rcvwj*&Tyc;MdLoViO(6NC{IZ!B*52n$}rUj@!Nl}X>9Zgd#@
z`2*v500c6!@FL@1Ik-`}a(X!kEAZhh*sWsV%!};O{dwA}A5Ec?=1b=DI!G#EpNZLN
zE$9YrZmuB$Xg>%Pd&9uP!$%P2$y2dZ>ABU_v+meuXlYfica9sflr4xws0F!gxbJ=f
zid>TlwIWs1Jx3s?G^@I&dq_J*du_DIL&onUVm3`9C#Sddc8H$rH|AMdiHVLl8TXV2
zLIxva((2Vo9zS3BiRI%VDj_Z|VY$~RGJJ$u$f3$4M2dh5`Ts4!k40_`M)wkPyvW@Y
z+p)xT?XCWIV~^AkH|5^CSsvP_|Bn6&q<Q4mlbWO3&`4Q7IDn+|lga=mpoYeJ|F3F9
z;D5)CioYYCuAu9|8N-)UPlS%*XX*bg_CMn{yu591MF^UbZ}v4kz?<-%$Wj&he=~^W
z=6OjvTWM*5i=@~a8y`+jk|g&NQ20?xZJ=A<xBl?DU0P}zS{bqWU1$SJf0awh$W?n?
z<#lvq_Zu#+E(eDObC=qnYiTPcq{J(Dz4M0{VE!-=x4-Hhd=7E-u(9LPOLS~}TQP&m
z#l?P49K-OsIB$P9Et;5e;p}?jcz$kb&IAiL^Y_J7h0N5|on&Ox<O_MFtLhC;4_5g+
zLs)RkqK)+j8u*qaEhQ(%_vyy(?XFr^@`7Q}ZcV()xvZ!$x!=&I$-8wMD@Q_hVq*N&
zcsQYRK2-QjNm7Awk6oCuL*bIz<h)gx=1#cr)Pv~Y)&iKZ{q??KQvnF$c*k>YjF$Z<
zR}z#CAj0-X`ur!X<M-^0#c}HK`%~)9GHnxMj)G2*cg^=}cOh1Q{|JroAj81Wm!q(n
zDh^FA19Lk&fy69r=S#u}Pz*9MbAhM^--d1a8i>r?%4)U7<L}yXJplo}xG+@N=Ms{U
zv9T!f^@N!jt>xu?3=Es|b5T*zi&wCSsBqfRGIHH0owBlOj+{(oRha=3_N%tGE*`sN
zE|nv1ePM(1gPvd6ASVk8_;xo|Lh>y)#I`xVtc<!kuX|x&U}K`{*KchyHtQpKzs79a
zjEszlqQaK;)-Rzu2c~4mX6oitsiQVlR_(sK0}~xyhvVsFbxkn-5hEiVu*gfxD>1Rr
zCQR7P_4TpYTmif8TmDcwx~ozXi@J~0mu9`|A*q3NH#gAN*L{AJ_I>tevzu>7XxLK%
zc_7ft^036AO40tlTD9IKbVXb2-YvHrV~{q(;!Qdu;nd8ECkr(-7uC?_VybM3!0sG%
z4##AXVi_g4hkvN!5MyFxRQwD($u5vKN!*su@t#kIR0Jdj0(9>O7KspDa@e#;3fLKC
zNrU9lAI-HKiqK-R^CEv;*W@!sPeKUwqU+7_@(7y%qu;QW!PNMr)ok+l?}0<B_R$E4
zjEatC$FUXp{(cWMB*TTIkgTFYeq3x~JY-y#7Xba~gP@SnZgPd%=*Z}1u0ZY*sSflF
zo$}(`*;@PJ#)R$6<28Kn&JWF%+;%rc?+2Z15MnK>US!O{-={u5m>^Au2K2Vb-ai{T
z=J=$xg`%Y$+1cRjr#WQ+_SU5wKKSnP^1=Pm6L59D>9?Cg-|XZVrj?MHivnORkzr+F
z`2axSY#tYQ&&tk}n&ZB)qHb9B+v+YBXkPMMMh!(GK#Hc1#)qL~r#@G^x7+-s_2514
zbq9yb#bmzKZI)%Oq=X)`3;ptHBMdUjV(Vwk8%%~5nI>$HpDdzKdg*m=?V<n41-RJ#
z)b$#m-60!^C}zP1ha2_@=`1|DN;$Aeq2zBN|0BiY5!LO|=eAtNi{lum@0u_j`Cl}y
zViN9e5O2nZM=QLpw$3>>$yeYB&dxdCUz`S#X$uNKd9;x+c{Qa&z2iuNac67VXbO82
zSs_$6&bzvPI_9=jJU|VtK_Z?cHTk@0H^J`=Cq4a<kUXz1mNR2X2k2WF{q^g5^Q5P>
zT8blC`4?0j9qnIq^e&jd;0rSZK~(7KK?gow%E94jh4#rve=BS0f@ynvHHqSB^Rq#(
zePXztZTs7=B@UGVz~&UXuAAz)XDqG#${#UIL!?*V_cl~CtbE7TKLCbYF#$_BtE%I4
zqZVU2*^T#-uk)T39o(xgE}?0cuzps5j_1zY_5}|TMn`QqO|=~8Qo+6rV|HZ|!u5Dg
z{9SLG4bR6c%9!TNSF2mqA(1_8MXs^6cXgk$F+TvxFf1N2PXNK&3<i}rmEfIRelL!{
zE9?OE=etFKe$Oub^AQ=K6cWIfV1)hTWU7djFyU!3F&-W+)Ks?cehIV56gAZmV-_PL
zBfNO?lfLjnB_)>;l5IgBA4y9~6&V>ZG1zHpZW@*u^-4Rgt{SGV?2Qt19O!VOA)!{<
zvV>r3mQsG6Kx`joo0&q^;b91HM@2>bfI(8UTO6aMYKco(AjiziOou>=c871av9OGT
z#BgvV*5%^-^szIg*x*q-S@^(KS1eIib|N%j)%6VEAGfuYroiJG1OfQ1ADX!FpOp9o
zx+fXEAMNiF1k#g~b(DIy?b(vZsZ$vG%UhDOeO~s4!?t@vQScTrfnG{N&Kttnl`;T%
z6&)Y&+48fCi?-43)SsZxpFgqHiODs{6!^PpuC}&&FUK>@Y)pz0>L0oT78VvB4#sD(
z9Sf={x_4<fJzgI75U@@N`LMB3ufSH-Wv8lM?{7^6ykYS$0Q)=eos!uEA`u523m-lJ
zH#4K@<z{ruVs>qPO*#C;OLxc)1Vhe~h{ZLmbE;^X+WZT)`a^^nbfAAWy{=NEIC=NJ
zC9-0<mw#5*ciQSg>STSgo&qtDY)tH!KkM-Anf6Md!^j@OZ5yok7U1k|@&9r4mQi&q
zU9|Q_f(3VX3r--odvJFPB)Gdv2=4Cg9)i0=aCdii_uHIv-tQat)*r$c8NIu!)|&H~
zUELe`bgF@!A~X)r&`2RgMh-Wp{s_H9-w(}sdFk)r5CXbjC+puHpRVF(Rpl6#-F+q|
z!OzCjVyGtOf2DDX)0Sop?C5`otYf>6gB>iaky}sCAw?sU`_krPZLqm{tnIRg`0dEq
zbYkH9A3$79V<~Y+LzaIjVToo`G>w5k5x2LX@x_uQ2NEn56`hmaL&<x1kUj}|N^0^B
z7UrP?9_zTVF%3Fgya1e|+tP!gs_yFYBr3DPuRhm&#o%x1?&9Krr^7=D?*v03;Ja{B
z1>VO@nAR+Dav~ib70P5-{H=xh{5nid8UC;rv?eMx>o^I$R}#BZ^xO`imV@1Nb$WU{
zzz*{9WddcDv<~X+zg6sMgK5bxYTk~NpHZfz#}GOTQk2Lnu+i?E#6!HDd^_~2dA`3K
zmO~NXyPd+%b8lvLpT9U4*yu>#;C6vOt?N3OpfY3#m-_ez<~U)uRfG;>NTCs@zbv!k
z26K59i=KxLzW)NS#<MX%CRuS2KtLJXd+x~s4YJu_3jqAl?ugFQZR^wRlE~Gq-o=Fj
zm#2_6ek5RQ){LL%MHQ3_@onv|BH!-3y93~Z2{{$H4-yhE&CQQGz#usAWn<OTybdN`
zfBkY^bqj@Qbw69}><)Z#caIDYK8TWtQBvH7^DpsC=ebV)ArDckoZ@i0oHUW^zq{-D
z;RBUyCL25Z-Nhv-x-5rX&)OWj({K`E@HWuisKv^9&VpY}4^|<dfkG^hOU{v}QBqWL
zK3=?8ZE-E|c-=3euJ?LDe0jM8YL$+jexd1jeevn;ZN7DBaMI2~It(^)ZhZbet4$Z9
zM4lQo0v{F;4wuitq%)m+0E?k0j+_zGu8L-oQAhHtR44(9*o@@#*8dtVpFVL2iHMhr
zlup{jN>^RkfszwPFbZh9X5~m8bMis=hQ_Le<KyLJh3M#CX}7nxn=z;}*(6^CRd!@E
zdGT1x;`06d6>0rQ&CL-5l{8hw<~#F${D6nbtto@=>JAph4S#>x)GN5nO*Urg^iW!H
z{qa;Y@v}<Q@*lz$IO+_XO`~685SA>DUIc#(vAV^6$pr~(Nb?*~TF&wHHCxkKS`y+o
zDSk@hlOkfltwr9HM4xc}BgJ_bh8OzU5^j44-}*{I%G%%EO~|W}af%%%JT{si9^&Cp
zP>v8HMHpUADrfK}$Q2HSwkc1DWql?fDT%_%n8&v+=-C>t84C$g*U((0Wl*Jw4+yJj
z)Y6vz=M|tP^qG9vLWUBpI5kypAF)ZOpE*ThY&h@%hvxZHbR_jG-fN9Y42dks!(I#w
zxw*L`kUt4cZb~M#>NixK*kT8!UlWcO>ns11z=6WT!`D2v5LBEa<MVgQ4yNv?$hF&T
zAwU3{_SkOmtgIk3&LVTg5xB}cc!$mNt$vE&U>RjjxHlYR%O_zqUX9&&HN-dQ<KS6*
zwNJVk_w52}3xwKc-F-}cLZw>5I63NWPv7S84U(rS)^a{d?R~*wHcj^!m#chT>XUFV
z8vcry4grdGB7=V8byyjxj0}@x(!SFDxuGtjMGu1i150{06do2fZ^8DH_>e%vcr25B
z<HBexNsz~#VRW?p<w9K3?GaC@fEqmn2)_OOeI-`0hmm#okb*(8FzH{LZ;tk6D~T@F
zI#*Z4$RAyo>Y#6Kdgx_k<ghff<dQj}gY>P8Zja8|ODialJdJRsL8243hW)5AfBnEA
ztXJF8_2dP35Q`5EZk?Ra`oqZ#G&M9|YaC1YH~~MS|JB7#DMuMHIy&ogHO614*Tl+3
z**8C*)V~An6C51OCo@V;b=9!US#5;UIAy{WKeS^g7U^W`1m)vZQSoDEhlb*7NWN4R
zWZ_uGNRzAm;`YFyoNc7iu`L2gWAGwyNeT)Is~H(0G$$t~rZ_l$&<HsbCfkS6#^EBa
zP<|6@OWaiK>~7l<n-{|aLlB^wHaqZ`6af(d1y-kFY|oFP#4wxN>+-4!D2P5=E*heu
zHuCbjwdQt>X}t#V3GoX-BDlOvT$xyxX-;a!o*yD|irSiI^QAG!>&u!e!P7-0CjzO_
zi4*;Vz&KrN+<SuxxeF|(GI-_oY%dmA;zXiCSss^&Bs94!AE&A8kqr8?A`pMwL>_T3
z<l{R+7PwqXTm#ud%+GmEwItw`8GC)pe`lL?g3R~6Vt026)KSSVmhnpn4Cyc$*0v}S
zn)x2?Zu&{+5Q1E>xTqT1sAmJ@qfE1Nkc?9%yOGWfq=g`=pW4calxa;xR{M<6X`Ifo
z-z{Y>S1CJ%sLLvf6%uF1=Yw*nHxBn%rLGr}@ez$BB!Y7NAVLSqTD|#SE_c?PPd(07
zoDn|tdBe2Y;ceTw0s;ig?;;tPL4R1ZWPZ7&<=me?x5sPz?tSnEVj?FmPwq(gHoxnU
z5aGWwVFNNL9zh_CoY!9OoH&R3lev3de7*IyFVS+a&SnBe@9Gt1zcza(>3K=(2q}S(
z#=11h&~9@(eU~(TsUweh3%|c)Q_eQI<>)kHxu6B;ltUp!GX{^%_ONpt5D1KX)b=>x
zITK;JQO+c`9>x0+R=e4qJ|qW_D`8>b86ro3s7p08Kpo#d)6>%_GU~<+?TpIGZtJFf
z%6wb%eoH0KzLrY7{P?kVWTYfvJrDswH6cMV|4%`kQ=Vph{NF{*nc%O4k8~_WV1eBV
zL{6kkUo1^6RX*Wkpk%|LrlcO>83>9HqF@%dRib$I0Qn7Sx1uG76o_1&)@GQYqS)S$
zzyW{7Z1+y)tK;`00dn6O6SKf#Wa5I(D}~~wAl&4LX3CoK*gw#}lxo6KUGtk*Et1@P
zdk{jvCvz=at6p+wFvzI^Kx#ECtZ=z#k}tjk-(wgV_BM|_Zl3{H*LXY6R;D4q#C3b=
z3lABT1WaX+hQ=WRZx;5eY;$RK8#vIlM=j<7{3trJMY?^3`&wQvFJG&gn>V)l%rwub
z;ePD=9UrGUh5YGL$erMtj(AS}ITjZ2HiZ}JeGgS1`|pli#f}XK^waNm9BWf6ftB&n
zR~H{5r!CCf8hBgBPOx<+#F1VccIE?8SV}ZH`ty&btd00-__nlC%j?-|W4P#|XYp|+
z@XpiFjj(g{3N&$&JHEn!=#o2H0N?Nl>87t|Wf@Y*rhSzq<Z~zzD(10$WDWRs?qU)v
zTP>2AZfb65Xntk#r>HbEv^sX`mjA8A?j&Ut4E;^|ea{pFof;i(=DUfbG7-pHZj8SD
z*^YtY$7q=b$Of1o#8h6-LG(@c_08jDAa@=P;}9`2syI$Km;0uLakg=ppJ1`Kmn70*
z;DjdJzMW6`$T@H!5q<Y?$l6{{6f_S|4@_Z_N%=0*9T6y{P)zgl(~xqjVP}jX7$|&F
z%#lRq59Nn~dp`H>H#@ds*&L1#1G#d3MJ$io+_on|9!JGu^zPqMY8Bd}!^-JBwrMWs
zp!Jc1DF6hNrl#c5IlH$mg#7#va6T7}4CLi4KR^FHw{hp@W=o}ymT)>=%vYv?C9uJt
z`<<g4xSc)5?1zh{hyqFS9Tlz=X%HF|F6?+?gTLp5xPyzgR$0m-5-9H9y>l3v#Vimj
zmRtNUln?G)ayy@KadMft-~3x~S={W=-5W*qJUDnbU_K(G2a3EgWzn=qpa?`na3!TK
zEtmOmc>u8UF1Eg)v*c0kr<P}TEeyblP7Icm00a+E0Yl=^{<^%Tu9cbD;_B*Yj<Mqx
zO9{J0o%9<Fj{U~>S_@eIv)TjH8l{|o%mYU{aA57dQc+ScbpNoSnxSMl8u$R;$G`S$
zcs1>I|7_JylP<k^7(AD06oWvJU|a<ItTKT;6JS_LoAvf46$~aX!g;rRpG|qpf=aAq
z#ToM^6sHbOPCB*(O_;bWU~c2mpve%$X<~~rqb2g+-{o#<sjDfI&X#xK(S?uIMsIw-
z)q*UKzLFVb(_V23L|9gK7M5orM<^)Bnz}mO7KdP$ij|dRkCv7YDXFijVNBzrHPy8k
zDXDYQv$xV!YB9Qv2=#xeWga|kFh5zEu%^W4=N~$*jgRY-p%!}!Sy)<}t~OJ}O9lr&
zkk8=;p^aUPov(pq325IxrStPO*G(pvb1$99oFuu2zCHF>FQBd=1$U?QX@|p%TpDpw
z8cz^<79Qmzfpw%!6-O_{{g4#jm-6Iyo3pp7zxJ>te!LKdMw*>NH67fO3krqs0hEf}
zYK1E?#=yW}^XzD8<<}p3`@n#J07z)Gz(a_gU{e*vVrAYoX-cv%^2>1sS0fx{LF(m+
ziEJ-L(&&BVq@d+hPCIw;z-TaQ5103E`>S_W`+8|`ph%ZGlEG!W*>->bi%h&gI<3h1
zd&<TqAx1M8hdoNke8rnDL0sgh@_41fIfR_#gJ}0p4?2x*juz6xCu#VYp*uSp*(lkG
zUwk_j2M6cp8){mfy>tjJ?3`@v25G68cCHQ_-1IE{rs)5xm0z$15}Xcq2{)IRO4q1(
zC{-~rx*Ygf6T}Wom>gMZ5%`VxQXikw>*Jt8gpkkgx+}HwduhgxwQ)l~tY##Ul)y<}
zz}ixSG~bXLT~nPH{H+YY!Mx;p1#4@5k26^kP0yvmLI%KN($LY^**Pe4V*hvFN9Sjb
z$@4~cyoyS-@$ml6b`Hw7Z-8UqrKSLpS=yyV&+BPq;<vL-q7&szL6+bc7PdKRC@l>w
zL`@SeD`lQk{$xoC?#5QD(7ng&OB2`45|D65461_M#Jnt>FECwRkT26wx~c0wA-(Ua
zgS-Dpg%2>aQyw)=DH_G6;m#ou^!*eOPgR1rC54z$J>ogSg&@8=&WTdD@#zcJvh<^C
zvRlcUTY-~vakH8;%f;+SkCqL=Iv4VrIh?r!!?*E+!+M`ieGYC;07{ZmlQm%c5BbAC
z0(3Q@pinX(hHLk?(-vP;;RdJm!QcOoYkqM)E-t=!w5GPU7@qNR9E;p99bKOZs9Lzt
z5M|@*5h_a3rG>>^EcBv7Z!Ik?4cEptOLkV`+2nzN5f$pDdJR<9Ds0l(fr*O|_El;I
zdKn<_MExX{t788mLJ*!>gb?uU5Knb?XAcht2ZaS0zKm)yidJs@>_`g!cz9ss=JtA8
zw;(t1i=cmXuHjcxQ&-Us6ZL>7d$d<ntdA0KYiXsM`&~C=;1vOmrIwiMH3!ca$Y8Az
zsrLbW>;n`;TKf4PyPjqEdSs`^n{0eGJbVJ1nMx^BFs~$S#1GCU3!FjqRAM~B0i|Z9
zzL60^$<i+JZ#7Ufu5K<hHFYIo7qvBY2?_D8uDIWSEjPNWwZi)SD+>Q?nMdG%`b3}3
zX_>MCG4WNO2^;WiN*-NZ!A`%&$Mr1Y^ohSG(&6miOf@uO)t9LbTR-pLhy+{fuJ}QN
zY$_Y(f$^(f$-0;n(|?*U`+Ba^ufU`2?_x@?L2&OTUcD8N=FfkNmqr84N%Z)1#`|=K
z1P7ltb@1@vLoWqIcOU{;z-*MBIn0hF##!D-=HcfBsrBNXIN1C^3dyfEmgJyo_M^4z
z<NN&eIYCT83$CTLWyVE@!+P%aNN2*mVS7nx-e>a-Yuw2O>C=$XH>;R0u1QTq<s5B$
zt8H)o9+k{QxFEJ)Wk}qF%$M6mcdb~9I7=ZrBWg#L-#Bh%&Xv~KzCGeu2c@P4zp0sh
z1|wcJg#`Ja(WUY0t*Im=B*6J^K8EAfv9URDtt<{6*6!~UG&`LvH#^Jg6R-7%(8Q|D
zO|NqhVxUYcPuj6EPxKEB2~qbj(Y61UFIH~i;y#L-TAsYzdVA5EAJ2}~{Fp}yvw65_
zw>3-8C@1GzZ0hyx+w4f{Axc+w*KKdVUZdL=4(g)T+^w^%{uy`d0pUyyD1`Pezq-7M
z`1zQK1xVvF+HHLMw+^06!tj|5#$I2%33#yav5SC&&8Q17XFwz*9tO@s|LKbN=>iKm
z`LF&Rw&32oqr<*1!j&C=@?L{1b#drGjj6)3h4#1gjcz3>nZrM0zT~~D)5tMEEyoV<
zIKQ?i(@<dE4vda?(sQMZr?m)3>?^v0kW*5DKFQ$rZmTV)7qIM?c68G~gGozIlcl5}
zfe{+!Bq<O~j88n$=D~7P8$+1T(DRL5{?a|<`<&o-q%vNvt;9niCZ5gh#QeJ44TIPv
z?b4tepgc#+f!MPtI;M*Vf*G-O=YC#x)s&(|UBBD5iy`kB`8y%v=50MJ6l93KjWvl5
zXX7}#k;ZQ!;I-O^%?FRixf#7(zJvohUu_Y8At}Z(Ek3vw{TN5y7TaEVwlgg3J2m;g
zX90$Vz269MP&&VVW;FW#d*L|S>`3ycdcUNkbZK#MngHHTft)g}jylExjQC=@xGN_o
z%NJsan@c&IZr8}@@%Dfe#j(9Y_9jeCRb{2cliOrnU<Mom*9f*Ty^){9*V@2<43#-~
zc=743a;>40of+11IZztxaTyA}8<CK&jO(53Kn=}}#f+TZ+}ukOor3N<H0)|~X)P@P
z;ra`Gv#>ZevF3N&m!CmL(<35+6l5?qBII;}@3*yQsh-QpRatr522zC253{k_rKswv
zmhztw<DMgrL_v$}gABN!KJH%n^OSlTbD7+liP`xAGou9}GB2&Dw!d%k#G#|OM!c*f
zX5RA`Fpj1?P}XaISBP|8@0|?mDEc=8qt0s7^gj52?BC4M7%B%I4G!XW0LZhCaQ)qz
z)ysE=SK$<C>ty$MTUr_Pw&wZ53-Wl%tZZr-9O@=BS?{<iE=CRhr9QO0IB52|+=w+f
zDVxbl8!Z9&$+3kcH1r2BP~gaJY7)SL=<MuhE3QhEvg8GhW<#B}Y2UNXf6dQt70SL`
zE?M{J2b;!Hp3K)uVH}?Bvi;cXiJP9b|MbZNEjBwl`*1EMkgpovNuzENZf|!FEfrq7
z(M?6~th_XIDAl^fc4M>mzB>?z6aXs61*6r@rA!BgOI(j?S?A{!P-bxD%TvEUxlpEv
zAQ94QQ-yeY3mD*hwYT?kw(xr&$b|4#kdU)0;9-V-aqar0WIT$z1QQk!LW&7-qR4Ca
zH=YXS{E9m{F0YNQ397XW7P4oaTni7+z||2_FpYrVY`OJl+4VpLqqTT1V85)g<Lhb4
z#*Tp3P}2=fmJ159#@5GG1zm~UbUvv>3BnT>CXS+|IxoEelJmP>S;~nA%7)M@w54=%
zSVX+N)b+%Q@f0m&NHAI{k3;gB%u=gnJ;Td@zB@GNyrDJ$-0<7k;pDG-qZH}ffjLFF
ze%;%!Xv#|M5_C;nIiz^eK|nob{rmhzBZY>F4gyGn-MXayHzf3jgER#hhL8~>ehZVo
z14F_J(?ZnvEN<6X9aKYW=1COWP6e@k!d6~hvbq_H#oM-xU|wD*-GN7`iT7iWU_L8P
zs0RHau-9Xrc`kwi>e8T&ohImTV!dh*=q*y)n7a2$lr-An`JfQM`FMXx!S`{2|6qEg
z>aDkivVt>p0sp>5{rYtCMw;tzOjtVdf9+APo-PRp3TC4<YG=eG>>eIlSXj_mS&cS$
zB=;KN%)<)&d%PNr=T&#cEb0&}oI%U1EEk$_lbV3OKA?|+MY@ct(+LQu<dU*lwXy%V
zZ!872!zM4!gMken@Tg4;_wNWvOrf$8)-fde$`gVGVZMJTt8f?nzfI(vv4e*;1oZ!Z
zydhK9`~Lj@M$X6o=U0bjguAmfy+*s8`6|Qov@{V?g&#li-S*Qs?L{<udU}wv)hcz<
z`8=E2+uPIA(*pzhuMegwbz4ikTqPw3?=QA=baV*t@pE!=Zcmm9;UuM`v}#Ng^!2k^
zTU#?T*J3E7PS@Jko}^{d&DhKncIzA-@2})?1^wtOEX#R$n(9?b*znlxbaaSdzsea~
zE(o23T`bQx*yfg&(q8cM@_G&>&>v=-&sE$U-AooO8Vr!gDeHXuXBKd`2)N5cNzJvi
z+$_r<U2hxhXGx=LC3>1129P<+t{trQ=E`o93*%T}Db43J`R00S2P~=VLL;&&Dn|SI
zC|Ow0K!kiA4K5c3a&mHNYI8U&M$4`4YP^)e?~K8-VzuC|V?@HjV&C-(c64+!BO~J@
z7DL&IM<s$>;&NL)$kR&L)%9T_SA1l67zzP5kD$rrV)Mkz<Mm+=giJsn^Gj7#H6=OO
z^Sl!}mEBsm&O$>}w0C<T*51x8Xnc5hSfkn~o4Uz#s^Da)o|~JSQLE14Y_(Nnzb_mw
zG$h1mB&F7Ns}J~36qJ+^c<dGB<>hBr<$;TukKV7{M7){_N%JoEHhQD<r>#p-si_~&
zX*=qkpP$<%4>SGz{rv+2p)cB-Z(DtND5~D;pc1N~ikXT;@CBZVkI=gXqKf3Y!*ahg
zPw)HRe`aMJSXQBICJqkuZ26XpK0GW&UF~Y4kph|2!^1;L*)(-MJvk9F_6=5%=)xs>
z_ekyOa6I+`>ExeV_j3F%HC8K4TJ=^kDXhi7x<mgEwOUj3Y5Sn==jUf{Zx5!wRA-5U
zgM*umTYs`--7bp!eQ~Rnl1eUv$My2N%Kk4{G;jzAG*r}}fEhCJ2vA1`uRA0-7$^+)
z3k@sl^?IkDb=w0a==r=G>E-c8NoT3u`_1)gmw?~Pqc04nb+lM8E^&$(-e@@L@!?=K
z_@R+FT7vI!pC5~185{<>qd)R(tw_P|?XI1X6MytdwS4LCjvZ#`&GA$^ulw!sLUpER
z(?7ieIXS1dhtD(rx)InzGCA2LD;Xo3r0=laL7R5X;<M~TTE7n?o5{!Pc5Q+io)8rk
zm6+(fKc4-qI{;-4k&x$pFVkDM)$NPJk1o?7Qn`AqTiwJQNbpWQ@0TAI7VsblD0pmU
zgB~L9=PIC5P7^R1J*B`N-SA9Uh4*;$v7OG>JENkI#l^+bQGN-L_;q$Lg>eAL$%-33
zv{Qn*dG+AHmCm8uo(MulMFj_ur^`HYc%`9XQaU));PPoFB^8-!?d`Fwx=F2XeB0Un
zj)7&Ik^JyC<Yk}i^%txWh{-IjQQ~{6Sv)KV9i3^_RU8>v-_+Xr<jB17J8XN^#n%mw
zbKisgiQU64Dp}T47IAxl=@J#nR5n{JP2}jmn&f{7ImZ8JEj;Y!dQ(v>)Yln7JcIwP
zt^IP>16wV}ud_r?5+DqpF)%QI!)}!p8>?huVq#!G3Ob&z@@tsb>W^fkrB!Mt=jVSb
zuV1}9Kew^73keM+<Kmjh*J*LF9Zq7Fm6h!&g$6|saARU(?(Xkn6B2q|ZVwbI6^^ES
z8AA3w{BCR<DnhEVf7brSfEwKPa;vrZJ1<X!95tQW8F9MrxlFUxY^p$po}ON0Z>z%>
zLS+(A3QFmu_3iELv$J;BD<jVxB~?{6<57H|=Ygiv(_2esF|MnvJwVrzmp>onK7)jW
zoL^dcdVFNi_>-q#?z&u7R>o}D$HBz~1qB6Exr$y66ei5OIDZUvSY#DbKw;rd<=DpO
zkFe+XqmVnj#RLZjdDdcxgRF09ZGCVwr1$67?R~B3A2ST+DayQje{AjVoHkkS!gQSr
z^YHMq(Vo7wrR?N{UP!o+|2d0=KKJFR{N$uDl?{iqT8_9ry{TqjQ%h@VYN|gB2Lkl<
z>sK~5wqIi)5b&cr5Q*RM5ZzY7>VFkS*jNOd@bBMDUB)1gv$Hc67FL(lflQOmV*Q)6
zTl0#Rn3$NO<4ybP4P*F~Vllet#N*>5y;j}t1&eqpF7w&4`}_Mb{x^?-7z#Q}T0XwE
z-@niA*1YFFJrBmyg4Rz?R_NnnVi!JQCPm;;>9n`iX8YdGsI^2Oip;o2CH4n}vfN!M
zS*$J(?`$?Z<H;nGa@gh!tm#!5$!LAgdv3jxzB|QmccGS%wgDBD=Re(38;{1FKd6g-
z@VqiQP2>D&*xz(F&#1Q=k%LTR9Tx*oaM)>_o0Zk6|Ht~BOI}b3RV+#Di_Kx2oPt8M
z*}BZy<ix~#Hvw`$uhVoL$^Ytd)_S))lA0JB3&<C4vUHu($s%wCdN+gvLqnmVp;uQ|
zOD(P}i9;)`?ssvYlw{L5HqOrEL`<x#bZgCKnjDXoS5|&}#sQ^qJ6mmZ`70GjKfFGj
z;o;%6zuYeE?i$SqyfJ(zIlsC2^5u(+oE%lg^Yyg@Vqk1WhU~9`!a^48u<>#E8>s|F
zy@(tW4-XGXNjMM_;aXTkM1=oGtWls;4<_@eWYg{+k17H4G&D4<{kV5hzh?9~ng8`Z
zH$Gm))6-K^GeszS{8L?B-E4oq@$PW42VZ+mj=|OLi2d#`r_*tgq_VsF6Eu;>Z-)a#
zz`Ujk<tjC*p#-CVk1)$Kaq<1<k+I)dFOQ#~5Vw2!X`f%fe9(v(@%RbnEp9lj7d7)E
zBfsxThm94gDci7HV-6=zxg2AIY8dqpsm;)d)}ms-K^^+*Vq&<)8H$sjj^R-@JbvAS
zotY*tUL#8x#!uhS(M_m&R$7wly*!5=Z(@>Jn&Teg_A5@}($a<vs>H&u!9aiy0k(OV
zt*fj1>C>mr$zdZ#&Zb?(p>8EyrMbKzzP$z*n3$+<w6wH<Q2>r39mesQN5}K_gg<Sy
z2>}`rpNWkvA~bZ0gWqzI)qt`_o*Ia-m5GU1wyR4^?r*Ozz+@~m+EamSIMOn`9uI2g
zbf*&NFhhd_4gp_wmdYpcT7P_`skgEeLk5Acuzony$bZo~7-EzuE3dkDVNMN)5KvFz
zq3rY65<4aG4jLI@rlo}km6a<%L&pUX;d}}Wi$i&XMpC_h_|)C)|KS6?wRQdm4J;&f
zX5^Gf7OFW%z14~$P4|ok6gXvwn0C9D&JJ5#eH@y%JbpeIZgjH@ut@A{9xM*~@*o&E
zxXX(RPTNfpF)^r%?{)R{jCyS?O-+lVqllok=SwMb^P~HF7q(Oc(6?{jn3<XJ*sY$o
zBKcuV?HWA*-}3{`V_@y~H(>y-%qV>l6V=q!lW1zBd}&NrH36*^6YIO&8DfTSb~u;>
z=&jCrZFO~ZbjOb6^XKQ67uR(0N;pVxzD&8?34DBf)<4fPYI+DneE1+zQc?z;CWqsB
zX3Kg((&*(z`@Mc5Z{?9_#Ti}8s_1`4&s(P-^wYxwfE8Hi=tZmY1Ox=7s^z%cPIM?6
z8{L7xse0_CJ10pOxa9<3{UeW|VGf7NrvV7%=CkAGX6kB{Y!%vH&8<`;iGfMw^|GXa
zLQ;KvfbH(a`S3x~+FF{p<G~|qLcaDNXp3eAozGVEmX)PM;CBXZbdr#yz^*q8l&FZg
z-v)WV>D=Bo3ou-njzcUROcyHw%s}48XizmjH>bv{OpLtF!GIYG@KQ7D#<VD}O8Shg
zy?wLm6=lR0%unP=z;rO+{FP~TY&c+kjvqMOFrYw8%^0t}b|1`umswg`zW*%^Zl|)6
ze#u_vHBaa3{RzOqXI54`fi|40)T0_THZ~qh<D6Ps^9Fzo8i_EC%keOf$jjw=Um<)b
zU-1B#LT)auI?JVkE2AS}8UTijA_!<HJfJ}5H!8PBcYoE@sH4K*RkhRN-nYaA^{-7d
zj3|`~SvO-4@ETB1gxJ|>#l=e%a)-gP8XD?PRqN$<{2{qB2rl;iu8_6LMGx(u@<D)-
zQc^TEG{Ui&g?2`oo0}m(RrfwZ*?<534GIlaYNbSm#Nl<Td8EcABg<W1*PqE&rfKzj
zVw(v5I$o*AAOB_;B;eT9)m5R_&Ja6rd3mX+smXW04uKgeDl+=_ul!97Zp;tIx!$EE
zt-TUNz%~d83Hbp81Kb%fRU3S&=wf+lHj8;=6qJqKUBIn5%%-V9)C>%&qWYhc53Nh*
z=hds!%go3WU=LLPlOqW#>8#qC-%5%cu&_n3u|nmX!5{_d20S(xGSaf;<uZJN5%F+v
zP{5-3RU>)$-<>jAwLCPc&Bp@toT7uLGkZir3oaXh0wXd0*5mzA!#hhVe<9n~XIBWU
zkEHAyO%x^UT;}g4j*fxhdC`kyP}NXSu-lEqPY%_GCY*YFa#C7a`u1|>?M$nK`gBVq
zTRFT2aETOo4Ew5!Ft@}^#v`D~NO)`(D@~5xZ!hd1kB6Paf`S5W=TmYqTX-VAmbyBp
zoxylpTicQ<bD%9xmm7QX@UgHGt%|27f9hi+r$f<{l@T@~7%=C^cZ~7d*IRv2^*6x&
zd3XkKf6Nk_E6z!)S_6cI^$VLS?BGzAM9JoS<w_WM_`IolFlz2KI-GDPuk&@z5<{r)
zi><#ziFtGjNwu~)Pd&O$97TOFsP6^K(gRVTOamqWI5c`lruVCcr#4@}w<68tOBWuI
zksDJ}(@v)0<(8>5<e6*|@EII7izID^cBd0f0I&ej1n@{$NN93u>g4zsNI*rWunx&T
z94QVQxS|CuffQHo_40^-$HvOas;;3yul{@84~b8};lU}>^L7D{Rkbp8W|MJZ!bmF2
z(5=nQJhR&Vo*t1_LqTeEREjKyyyg!=?_sy=XL9NgDH-R*#c&JHLENWB6luPvF#Bth
zr4Wn|K|dQpB$UvRt<5Y(zNXf%xTaQ6=)Gmv3_}q$_0?l((SZRpKYwP(IMo~^pEz7>
ziUx~(KD=N>@)a1LoXjB<q{AeGF)%ZO(@D0$&B@3Z#Rcdw7g!s>AKRZVKY~PnsMXh}
z+hF7S{Ux4ZilWN;ZR2{-a=zWWy|tCs)eorn>&r{hf)0odfC9k5!LiLCkRiaq0e7C8
zoD`BCR-;BgYkNAKDOE$l=NR|PzYeYvpr=o_XqZ*SO$<fNcHp8@A7{2N=n?P@M6|`E
zKTP6p_v4_W-d8qoXfm>|mJR?#)e1Oc5fNoh<O-vqB@TSY1HqsvjT$lF@be9hjL7ir
ze!m+?wX&eGV&Jp8`-_f5aMn`@#!O(=`SSyd@hIyvDsFfIGiO6_aq#&;Gwt}&($exW
z4=*n-6;+@OD$uwQguG_P#{J(vLz~x9-4MFFyBl;}uQWT~0V`;=!Uebq0M2IpJP!Ng
zIijJvW0`XJm?j9n0D)7XMyDCe&dvq{1wjjnB1tB_KYi{m`q{BWzZ1NJDVSj?-F{!b
zKSz`xQZJQj4~gd~&sIrEpUDJ?a6dNe>S3h)h0^6prqlf_xZX--<c~|qf<j?`-PFNU
zVIVw?kjn?q`oRG}WHL7}00F#H{b2a}!=*)qh1G08pntzZU}{<{K>WL^DmW+zW`a<3
zHr)XMSfu1@k0?bTRRi;0D4Sj~F<LSKv$(vR79XFV(qv_9oS2$gD$k>_dJTkR9>TGn
z9!OA}<j&6z9~pF88jQyXV?G3YUAH;+0f}lZqG456M5wCY7ll+W+>d8pUON<2S5J<V
zPstUs!bA9jZ(L+t>!fi^6#Gr~L6ue%@as~-X=)-Pv<rO*^`~`fDmV&2&<n$x8{Be*
zpv&v@V7taMakxvZR5cYb9LJV|NCfZbD+{N74NJ*cu(%!176uSKJw1JeEB6c)F%S(I
zIV(j00o2>u>wLO=kSqWx7=TES0*vJ3VmmxLdwU@L;$UN&eE**32^-q0czthFv~hac
z=5}L-7$^)+JBb|nElDU_K2yVXvj-Ld7S5ma)2FYFE`U$_3S_0gh>ZK87Gz~*xqOR`
zB&7FzxruPSk~cOUVS*P%hm$_39XNPi?9rgxf4-gNyJC&$)1Y%Tq24?HCX!P>qCkkd
zSYu5@OCkE(W`iugX;4;g!f*+;{~|As{D!%^vh`Ne((+_yC^5Kuad9yei?O7SAUerr
zF()Ht^l{yW0{{ykee?sSMn{*%Vk{f^?w>&5UxmW&hee}eWJChR#KzLo(E(XxddX^Q
zYs(gY?zGeOsJuRChcY}o93VcROo3MWW3lj=)M2&76`=Oj;bfNJ9TQYEG$lpF1O^?+
zF!zV+DLJ`xt}j4L4+wyo+0+;v9mPd+`1`OOd#h0m+5T$A<6MykWRMAQ56q*lS8pj_
z%D4KG<uWW@Z<h$z*wpP=?5-%$y7hM?2~xwxO_&URd7SBPC1EG~L8K)8U8pUM#lgj+
z1t|8Z8>z+r;}Q{Hp7(2GaGO6q4{tmw?B!mj7z7lx2HkRhAs$N!C;n&x{n~1)yYv0I
z5dOL$_ea?;g>+TJh9SG3CCBo+zm24P+3E{V<#D}SvTnCDG@M#q_5k_-zFW0IyZ9^y
zn9;Ee-lyD1z7$S-BSXV2fG>=JPQcBd)$s+O4^UW~bXh7*EDujlR~|xUIZa~^AgBh5
z0O#S2h|T2FYw&P?kDaklQc{vHmDtzY+t}Pp8$Sr>Z?Upu8E!VcQ%?|z``u}HaIme7
zjfAxHa;<q{04wlGjP1{gbeMNXb7$8FQ?RhG=5rM@Nk}Vx;MxDwP^U)O?#Ys4;DpH~
z3R&3QX?$-_79wI=k4WxlrA&Sy6=^i~%R`}E2Pmyq@$udy(^c|oeYvhBn^oGvFIa-J
z)<6xdsi8q^SJ!eq&wN606x7KY@Aic-9H2FOmg>M_zcR!sXw%^{=Xf4W*7XnFz~ttD
zvPd|SIkv6lJD%3wa3?3@(i0J8-tV$h?OQE3D5$9wS{=!yu$mstmIHbJ)i~4B$ikw<
zbc&KM^9=}OXxZeH+N!Dv0n~O<fBp%+%gf6;%}yU6A(@hgfy+BtYxllAUMRVd0A@=_
zNC*?i7t+>D<Uqcl|FCb5Cy$=aZk=&>UOmPK;j_QL&+C4RY;1!c85xNL3u`-Tw~(8Y
zgGj&y$R|m#h=G+ApUe5W<x(92unaKiOy9tN5^L34>9n{ohvYCYFaRH@62AF&a1h)F
z&|rWIwJ2-=I#~0#3g6HO35j`mG{16Qvz;s7T3GmY*1l$1*zx)j|MhG5n)jGa?Vt!<
z0W9Ra4_Juv+RT#IZ&Rf!s?2lo2=qVd$oO<?Z8|(w%dvtFUS5Ml-WIPL(5ngb+Q!B^
ze}0@i2GI5O{52X&@VFz8qbmp&nIB2L3D^tjSXm(;hKI(!GSwW6i7N}&I7M4Qaida8
z+PB#+#X*FcZ1;Z4%gY01)@!Cj#h^-^7#SX$X??|cjiQm9i^~m|^`p5;e!K0U>guZy
z3|fF@`}VHfDWmqq;9+2hAItU~9-~NvV`5^i9U1$2dWM0zZa!;63+*M1mdF)Oz~{@f
zHaBl}Jen;jp?Uva&YfCd^3Km~(hb-x7q17XGQ;pWV|oofKto%vwRtW#*d9(cXrBUQ
z`p0f(u%(43TfPC1!jl;_cX{G}-pTqjlFD|${~*F)NB&#=a$W!8_GH(rQbt2M?E9_7
zs`J`JkAXCKNxQ4k)3B1H=EmNf%QJ`di`#1mhJ-lu;X3g|?Z+fij)sE{u<C=U4_ABa
zZ?|}j(jB$}3i3p`6RxrZLL$UE?hs9X(k1AclnP}Zo}QNG=Zl1rrHwp1o(};_s??=V
z90Jg(&T7TX(o*JE%)2E1r5~_baNo|6mX;0)2|*;{qe~oGSzZPL-BA6Smlg(2zb(3`
z3dFZ2>BOG4d=Ll{<a8z#M1UqrS0r~qN`|TdAt0l2;=2KzB9%(!9Ws4tBX2Oc0UeOY
zmiUVPFvW6Yvrl1A#lgg6(;I@p6>bC<l8A-hAN&KXc+?6GE(9z5TX%p=^5-2ODSBo9
zvqxcllo_o6HKNC#>EW~x;~!iY1H_fd(husNGCs0G(c733gT7l1cPWgB1?_$A&Tg)$
zudmc?eFRbqyVWv>)A2kIsQ`^Gep&jY%PWumvYTqn#l^)0f5gT19_(1ifk06S|HAj*
z`*n;Ir?D$CI?}13sb_?Zr373Ho_|7%KQec3EF2lZz(eIWG`I}JP*hb_y*<vg1KIN(
zT#SrvTW)f)_6^bDdI2Dqt<a&x4E;3r&(_3det;dGuB7fQA~aiStMOPyOG^vjn*f9#
z&sXIV9e6MTbAaBZ!U4F#-J18>^0KrmBKp7Y?a390loqtex2z*O586fVloMHh!C;@!
zE4oW9ZahCH9TMeVeXMFIz88A&PxhL2dqYPb3%tE`0yVf?Yy#!{OK4*-o;KK1Dx+Ta
z-~E%7fJe91vT^Jhl*~ww&orZ=t+aSx_Z}G^v=5_VdxuSlZ|u)a*UiI2;0&7#`y;~f
z*z4-*6g~etA+orobJQ*VrM2OivJF|`(^u`2@rBoFoe}Lb*5!rF=C_3-F+ss>a8U(o
z>$9u9G3(WqheSOuQ*-lN9_W8}dk_aLU4pZjO~_PvPi@A(bbp%(QURTd9%3=>!b8J_
zc*98MqxN6;`1k<rY~A)?1laP)$%%`ad6m+?FAmD@JK>p`nejdD=aL8qVB_GBz$mJ!
z77$7v-(~xnK^%mIh0W=@kM#8gbn3%E{sjI_PevyEatRy{i1t@5JZ!1F`W-%N-ft@%
z4(`$ptUZ0WxWHL<Ea2=rAj7z&o;EpVEh+;!?EZFX6>hrEdv*&k5Q2*f-{@hClnWnm
zn{fZBMvr8+T&v&RqjWTr|IKnw>jsd3Adwuxpu<0Wu{<BqD^W{E0-%rxJvMuSfnGaX
zX->Svr+yWDzD9fh9vFF*nS<wGG#_FgVw;Vhf_63h`8r<OPc){ed=HTDuVOq10K4D)
zTdJRvrK2TS0qjai!Br_DNl>x0qz@O9l9Pk>0n$34Q~*h*^>6j|^Z-j#)PH<gosTM-
z!O%F0>yYdZ&`v;LARZoGYI3qnCSPk)Q<L$(`x$)o*?D=}9lj7k**1TpNEWkcRm(Vv
zpuQQlzCIp_m}qDu%TqrCzyf^m!`j<xeN7GP=g*3@DAsOnkMmWA3g|0UhW+pNQErad
zfptEKWOt{MyTg%J`4EaFtc|bTG!1Qy>gaaHw%p|Sab3;Fa$#YiB-VK=kL`cY0w@Ox
zXX^j>v9q-${5<D`=SCOO!WYZ`K6jG&inZdV>gw~^!hxz~>d{eA;}a8tKwG>KH)zjS
z7fvPXG<Wpm;i0;%vt6r9GBN@BJ~TF#$?yFN1bQGGWJX0HV`9!OE=vBwHP9g7b(@}?
zwA&xghVwVL-k%s482B&yo0*%Fk&+%B9tN2Nc+@H9{GFnh(}1v3NKQ^xP*C8A0G!Vq
zNMUmoI-x;9CO`-g)QDcHM~|FuWy~%vhE;<QRoEN@=p8JprUrd(4Cpo#$WNa>P2gzi
z=*Z+w@V(v}ZrV)bh&ph!W@ih=M}>wC1)-3+MOAEwh;A76<D#>C!GP|l{_{w#@jS$6
z%WyaG7Ef!dG(|XQYHgj#<;akE260Z<A;h<4zB~NztJ8OjqeQ^__-+eVJ+_rf>q+xN
z$^M-ozdD5bpSx?O2jd`R8qZalby~Fw))SA?1V%k8OUo4qh3%W<XN@eEFT{L02nYy3
zW`gq<a^z!Xo|v9?0PL!VCvdNb<U?<@{tzZU$ot81xqolqYZdmM%{iyN4Ty)LmzZ-g
zbCQ9-!ZV%~b|`U+_fhN`0|-NhfdG4f-o{pw`<3F`z@8hQT5l;xazqDkV+K)0LxoTk
z{Ax@Il38cSDOfFQ<dj(~H79avl3>I0^TK#7yBHN@>?;4P4Dq(}%cjfDIckf3VcC0X
z^j>!69D8ax<J{vtb6?%_M0~zovNn;AiJtidi?%zO9!mT-noJx-{N)QqxcB4rr`Q2_
zI5;7{7@j&Ng`OSMBRcS^qF^*CfRoxhpD+<to1G(tvMp9yG|Gw?;-z@nUJB7rn>gvo
z)ME4`_IH7fn2&`WpD^>=eg*sI36QezaGAH)mtG@z1%+=+*z>RaxZz^C6W`b5E{c^)
z05cC4J2GqR>FM{&ApE_MRS5uAPO-oL`X)FWT*rn_JjVC$EunW;5L#LwpKskhLcSdW
zAfFsk8+$)KPoGYZib@hM9^g>KgG+eBBmAgV#?TcNITTP(U47vlTdi6sGt<YKj?d2t
z+AT$jdU_ya1Y{*WJ%`h@=`MdklSAl4$&F1ce0ku9cYyQIPYAQB*u+F*OUscB8wUr6
z(G1>?Ab^<(IBbYhN9wAoKGD*46Dg{z?{9AAWMy@1*Z?W!^KVRVMtTa09{^wDBT`ZC
z>*Q~4ZeCws&s)@GXKy@Q?GfPPr`b3eL4sdw@9rv6qdUxCfB^gy&XxzvEfk7~*G(i_
zo<Xk-o?|GdqoV`xiAxtA2UA5f=MsP$EG#WK@gtg=9t&hrxy*=KqERnyq&*n3=wqX!
zneDbE*ivP*sR!5*n-+cOIY1rT1F=YiJnyCjs4_u1y|?I%ghU&1Tbs=p;r4FZ$G(1u
zKr%C7>GN^RH|qH3jmKosTy)H?>Ef(1czCG&{f+>H%^@xiY;5@X1_jdO72k>q20jx@
zO9W6-wrn9;>Eq)gpk8WfYVXFF6A;js#B4ZDE+g}PKl>vVLzduXe?k!Trd_ZjrmwoP
zlhZArZ~6K86ImG<glwN5((Jei)?V2kmcO}aYA(LL-thw?`o5r`px$~dAwHg7w<W39
zU?i0tDI8EBzSI#!7#Nqw>w}?0Mlv$8(9lqb2^2SW+Z{L;x32MQn-g4%c@X~#<lU*K
z1U)rKN^0G1V_!i+5?n^c#>QnXRz$3;SP2A5WE6JgEYpGp0gBq!XLC-x+yJJa5EV;i
zq&oiTXtr}QpP2UJ&W^k;;=+Os2ODrooScREJI2f6Z2Kc4OAOi#UT2=YVXfiu4sm8g
z(?(~gWQ$AlTH;^#1W){Q7Mh#NnmBNAaXo<H=?O?@Wntmo&JG4Tx&r|EMMXtq;t_F)
ziDPLG8&W6$C?zB$XfxdHPvn06`W1i!L`1|!^)-Z!9XkjJh<60u9zb(gw0XGv!N^z%
z_$(C_RiM9rxlZ#f;VHTk4RZJNw6dTe3DB|#z`WUU;Cn>L7Df{C;(GsWay$a!F%2!P
zmhSt=czIR+!piF6>I(Q3FQ8Gqy+42;3VX7btCKh7?mM&t_2I+Ga$|K<liSPV&59!R
zfLeBWdHD^mdR|~)|LIEe-biX<O3LEoq|hk7#On(@Av`9g&GCHmdX*uQC)aOvq8$>K
z{W|YB$yb|~;T$kxb}X^*pND2a5dqW6>eWyU+RPs;7a?C?k<lPJJJW}baVDpxz&id)
zT>Hrq*zUalU5JDAbr6Vx0_a(&du3taZYsG9R(5tj$VmE@BElIQq|7m6PY)UmI#t_?
zW`s-(3=DL*A2)|HI`s9q7xcl{WE5et;r=bHtw52jwYZX@TL1Xr52vP}FfcsaL$w0<
z<x>rQU^l1Z;WSm8l#l-h1G5nQp;uQ|m=0*N{EICV0)o8a108v4k>L>(wK?a`8dgZq
zz|fJri!C#_4|-cY)Z;1l_xazEpXV1zl?qy(*676~p%L+;Vl*Lrf}Zp8_ud|lD%I=C
z$~Cf)aYx~;x9V%L{(Lc~{RPgFHekKw9fHa+9__jKq_Wb~#DyC^TdBuC+_t~o=?9Y6
z&<KX=k0h$h&7Hb#>-87PZftBkdcqXX57s8Z#KZ)urspTn%vti(v1^$^2EL>X4Gr@P
z3nVa;v$F+7MGYPgc3kNZx)m828DwH%0@eP3fl}@KDhA<kp!LU_BlWO~ic=ud_a+2k
z`A<yTNZT-G`D3D^>of1}?h;@~UXJ|4{gfT4P8c}{1mxLSBNG$q8$vk$oV>ia_;`Qz
zZ=@s-^}d>Lyq+P)3w}jK#Nc3;+pt2}#L3Bj^QA-*gh-KA<k%D+pL6=d1fk#sR#Tz9
zA<gp0(MiF;U;_QfDV>VKf`$pR>grUrw3eo)(H++V3UjHVf##?&of?0mp`iiJ{C+yq
z`xOUNQd&Aee1VL}STbctF`<E~U}R(jXiZWrpvLsE1CXHUgyx)_pJKV?8r21*J5H=^
zFLUGRVv?wryCbRgd!xYAeN)B3o|u?8I5;Sj%bcB>vUhN3aXiAr%}h-_+TZ7}nEwr^
zh+exFfv2hGu5|swgQ?liX6J8<tXcA_y-7(O>z!w>R}WDMP=tgXM(v^5@&LxJrd9>{
zjs^Z^V)_iu$*EucZJr4PpkkAhUU0{ukWcR&CM#5V_?naPTKaAAnwG~{7W2L3v#0Z|
zXB*$=&!3%~oc6tej(2o)gocK;r~rfk8dPKs&X<{)kg&V4(do6e3FMrG1x~cNO+`gT
zKpE737Z)D@ombIt$Lt4<)W?P+MT$HIsHpWy(+ohTnVDldc4`&c0|r&{xdnh0TM($m
z&_oh&V}1lA2$jPuDoXb3{TVSsLqocGAj^+2#%-7SRIn(ksS)ve;R{B&UhSHinpy(A
z0XQ?2Y#N8nIw-KalTjop>e>9_5}X06LdS2b|62#h<t^X>g7<FxB`rrwlbDylXc&Yj
z-f~{Ymc)r>V7PI&*4euwr7VsQ$iJ196@Wvwwze)yB;fZRuK=j)P-sDrcv(1po!;B0
z>w16QYo+-P2%~LYFOLUPh1EtQLi9okQ<RpLC$qD&;YA}!0C9v_zio|kk4-XPTwDNA
z(?HGUHwF<qJG+j~3UJ7`hrLYDZ?hR1QBi==MYz%tLASTJV}MV?z?`3-?<a&K@DRfI
z=VXje&#b)^mqPf0>MZ?EmiY7PY6Z3W+1{iQI+9tC2@!L}e9P#jXME!^SlPYX3SvGR
z^uXZK!)4uU#m)%j7ienG_jft4t$eE%wv)e1-{;1ZqNlEjEWowka<A^*&Dze|=bn(F
zPne|6v@<r)$NWXjii<$xx9YWzT~tvaON?x>RA<Ru(JLC(^5e&kPYuB+k^N|J{;h5|
zU0A*!C{Tiohm)A;>FEL5A08UQ<8mkh2&=Z%QByM|Az>CM(+d_~+0rnz7}-MaSK`Vk
zcfs#7@sjy5WJBK60CEBsoXTd2n>dvI`N!b%!&P@z*S-UnS)^39JT^Skqg&XoZ9Uma
z-SvH#{s=)YJ{R}UfpL4Jm9bALL;iJaq>QE3YhC$LOm3`U_z(UiQxQPf6)P3)?(G#8
z6ddmFOSmWlsnF1ntj-<4w&<s-3l$w50)HU|d3m2vLM_r9H(6tp-Qnb`<ArLOR5npj
zQLv7@ud&N3E8cG}&e6suiGvi_Yp?weWzmlSUDnjr2J0<+#)b#f{qoX|^?tn*0w~Vw
zpTan77W2TxHX2w$Hb=DZ$QO5Pd7=k@*xB(F^Xm}!JN9-?OY>-Q<p)D0E1*wIrv-(H
znN>)2SP?D@jpDa$b%qcY9-f|Vxo}Jj>U`qhi@owI+}j3{?7F=sq<R)NeuykaZ6caJ
ziqEMHhl)c<s>(68L$$KLzCK?>PEL+HL45;2pz)HPHx~s}i;IhLXeQskPnW7yPQMRj
zhZrWOV|CWQ-#?cxwp%{_yuNM~xIB?pQTg&?5Z%yl3;3X8AdB`Ie1L>Z<8eh5MAp#I
z;N;{)44l$IBmt<)(Zh4&Si|KS#>1m050&4cU3CHuPN1+GKtjoc#6Vg#Vls%97SNkl
zp?ImE-`HMrbF=Y}A3CjWGsDBumk^BF4f^KhrRT3wDu6ix7I_cf+uI8P1;1{?F}`3Z
zC89ibu$&PU6$PAnS63HMLBL!l#>Hj1r}H;zf9<P(li_<2ya9+1I2;iX(O^FtE9sf%
z(c$5r>T2lrdbGo(dTTGQHUXb-pN-p-r9baqQ*fDC21|$tJv_4Uc!R|J<;%I3A^h(J
zePd`-)2v(w;Q)_ov`~2%55B(xo<S%JDV5n^Z%;%m&S)Qa2+@OasvtnW)qP4G<~Uqz
z3In0_R8@)e!N#$C%J_^aJ?|KoME)ooD5vV<fg~a&u#OZz%~N87NGHkK=GpN9Tux8d
z0U978Vl*o9U>_MV(9p^%;=vN+6Np4)(5kNX0bplt?q>eidjJI?QrWh5cGCI1SG&4|
zBqd8;Na!%7&IbxhX#ZWN^_`tBX46GJK0fQ~>nqL9S1v6-h7xx6_TFyh^nlLO)8a;r
zVGNB$YiJY{0Kwx^r%WFR*T3Y}NFmM1F{JeVoXFkS{%T@zEPua0VRJ)6P6gB!cRW|Q
zEc?Xb;^DzTa!gE2T-<d2m@Wy7-NmM8i$-*4sFaEdh8ZC^kV{m6=&Dp8EeL>2`E8Dy
z#9jojYGPtyfJOr%39Mr%CjH~K9XIY;jDWb9B+SpOwo*7aIMDjxOetWDK#abxuNIFa
z6h+Q^fr|jZ_q|7pi)(5e0O_-Cf9c!05E2p^p9U@vhsB74iwl6%sDba4<mBX3RDjpy
zCeX*kEqywg^NU40o(BuX>R$8q%Uly5Ma{|SSj6oM^A!yh5Qb>b{yPAcjoiakpQqT_
z35H1c>yuKJ9>0Wy&&w14;QA?IDx07QHJu(Jqi)Ba9|C6`$3q<;Ts#sk+~E=5UhuR5
zw>=w<G{gQJDJiL&n`!}xiNS{rZ{dKn4<_w@&5kY8s+b{kY?y8_>ARQa-3|N196CFf
z)R$2$k&rPkepp)a8Vx6jhGLqUnAkKfr={U%%S)`wIsn!*Iywp%L<+Yvkh(1;B!Wsx
zXl@zmO2PZXaH_u#pyGxb85%->0R9E47I3p8c{Pm_CMG5m3yZLb2sU<h<0|z&9WE6j
zVGmxkwU6X)xYXz&etz9)oc4fbBuf_r2M?^ay8HS0$w*6oW??BWE1S1qd$1vWK<YFQ
z^k})ylO<|8A<EZrYw(htSgP|4N0?viy4=aCK>YDTULMr!>>by?h#M38ZBrzPk6?4t
zr*mIq*AH4>AJo}N<k6Ut1OojZ#@;%rs;+JO-Y6m=DS|Z8(%s$NDGkyo-Q6kO-7V5B
zA*Fz%ba!{hJGrj=e!lO0{(9GNI0m@)+H22sp2zV!)|zv<zSV&c6eytnK0f|OpS6&P
zdZX=1AOhz7!^6|#oz3r+%&4fS&`>xO-cakMc5Njke}X;ls|9D!lvy11#=^n@wYAT8
zGdDIi)XLR;3(>giLEnl9qw+!h8?L;(yriWgnwmKLI~#$ggQW2A@PLPhH)=>lMFkMG
z5%{EoyFbY@ERnj3xywl!EY-{QdNRsTpkMC&9hseNewf<laleef<xo^rO%%;5DJ^Yo
zYT8&|UuH_@^#r2g*S$iYBJJt<a4^?kNN~Dcs|Ckl4>LL`k}UmsnV*F7)49D(K|x3n
zIY6^NrXgYQjAm$d8-p$RmznXUWvJxj0Yjqe>nLJkBusCi_zevCKC`=_?<^7M)1&b4
ztgjCs@qDbSCwhDg`OXNq5*u5);t!WRfn+c$G>R~$K#v=4KUX>?e2%-r6|Ck@520P#
zMSa*;3p~vgU9$J@9E9&|vdk<j=rrr!Amq+1F)=cJOCB3jl#`PKF#$WWFgKUcY%HJZ
zNV7GMt|Wuk^OKrd(!giXyFdH-G&M9_-QA^#zVQ@4plve437}wNV*cRp7vy#Fo&XJg
zbW~OTyyTRbnYo8D^s0;Gg^qI3U#8BsKLvsk?HbrPIBb^FU*qDGG&RGU^<^X^V&dXz
z8XDA8RTt|l{_g#)8W?Gdxxee2$Ep+S$v{2%M_a~&Eu7y)5{m2KukJ_m{~~ta%+2!;
z2<`~SyqTY?&<sh(Wi)~x8ygG#J*Ef^fkS$<E%${o&^!Ln=*9EGCq6Mu0Y5n8mvTI*
zRAP1sv|O%AnJVJjFRw!hLFNQCQ|RaC2PEnGWKBv^^0)+#r+zk^$m_+wS8+g}jOK~`
z8XU~Exdmb$e59;Ed;@kMp-$U*eW}}9<f@np;ol#CCKq!b7#bCC$JoY^fO_EuiH0)x
zNy84S8Q8J?aC&>PS5mDsN5@_ZuX*7$>VALwWq)Ftu73GArPb@<lav${H}`!of!FnH
z^VhEqk@fZUK|wIskwFJKrq<Ta;CHe27xB%TKge*X`*Xw}K782W2zrCHdT<cw`RW1(
zRpiu2y+Qw%`rVh<b!nL!!<+A~B-E5VjGMg^$w_0YUf>bF*JI^}{_zHa8jj%*EVR1c
za~|T5hb2lxoA3t@sphSTSiabA`qYyY+61?d2Aicy&4%H{#dftSorHu0&3en2#Kg;s
zi-%dan6D04lnIo?#Qt6mxRLtR>TA7`HMO<*@)ThF-@vTxnTrbwo@Q-4KHM#3Q^eX}
zjXC%6q1iz2d|pEgGKlmEA~E(9;qFY&lN?GWNVgqsyMvKUMl!9;%$jUh1Od{XpF0>C
zZB$iY!bv3M$Wtg&zUy%G70mgjP7RzKAQM@f#GyGM7=aHrMf|cjk1^Q@NDvgLKZ_s7
z*tQi*q`uAU=jZ2xz*1jV*9Hb|zRA8hprup%znfbsvZy4TPV04;+gI@*%2qz5HAt=d
zg&Th!-tx)(tS612V|r<Nz1D&MZ23zK|9P0u{3s>7BATLy?8{Ey@|V{B^X(D4B>&x>
zwE8E5yeS=g2(Ymsgp!{=P17bw79ri~zlY36HiyIhq-MXT-+v7WX~rQHo+XeG{O@*(
zx?a0N5aF&A=cK8LmEq+(WSzy?@A);o9=9su>blF2p%2OKZ{j%ZT7tHVM~){Y-2ZI&
zcC*LGK}g^3AN>5M@sPR`J9KSP8oKpwzHLBI9NBi~=2!Ut=VJ~Cy=IRA>jFC;h$FWE
zU{q4V<9UmowF|IyDk}6Xd2R`SFC877-rio|vLHKMo}La440IA?CML2P4aP&gggHN$
z`@6XK2$1M{;`yeXb~8vt&Odyhn2dkBoNteAsf~3Djm~L~RVm_fbTP0UO%_G(E_b%^
z)y(5@<-dO8LQcXI*JKiXZUS#PQhSAf6l#EpTiB*+D~?{XOmFpv*`f2p$(P)9(nAo~
zz;3s_SNEVfx&A)k0n*j`{Q3N6Sa(+5VOMu|_uO3#@44?^N+u?Ifb-WAhgP}q@#yDW
zdrKWp0dQ}v7h6L~@i^>y=I2}GvUtI_5j6~{8k1`e3cZu4PMvS}oSU4i18KIoxfub2
zy11mIld-6%C_H3re7svRRI^G+1`z0b0fB~z34^~CEmUY7hGL^WP)mvSe8|y!t!+vj
z^%!UZ_tb|D$}kX6NAhZF9iDfr4y<qXYNdLFQ7sZOGuvHG449ahK)fR+&I9<w<NbI)
zP8niyINt;U0u&S!^pJ>_fS*?~^s#2{iL$CH85vn>a&mH78sON_d|K`1iG>9`1XX2a
zVPRo*cJ}N}kjw$yJkOv9!w=HJRkdMXp-h_7#^Ag25~sUMD;padC8hBUF6Zy+<&BMv
z8^4l>VNVyFm!N$336IauJuY@tOihb{GY)5P70G6RxCCT=jJVE5Oa{?v2%CeiL)7`o
zm`v#$@nP$0$^f^6`0m{iPO}18tFEm&8F|Cb$=dCNGIk)N<utvgrzi6}ZCi28L?^c0
z%3<`3%OzWNUdx;BwMGigd4=23F~>Ma&zVh>qvtQ&NfX%)$MM$o98{HxvGHb(P;fi&
z@l1+saH^@)D%07&7^thi&yc12__3s-LL?51&{Vm`+Sb<A;o<OS#+;h6bNfpDRj==D
zWZn-KNdWd!Qf2^yq@|`35fd-W&p*$%q<L6z><&W20k-q!X<H$dzZ?#305h+t>0tGz
zBx{<}q1H{aqp<_0+0h>!6u$6KF(Zn<mD)<Gs`$Jf>?icnv9zdf9k+(@UQ{^kPoHcK
z;n>(5wR_(2x}HAYo@%gOkd%>0h>6)Tf5i|B4D0*%5WXNGEdhz!l_&PqB19l!bhNZE
zJ}+M*)$$2#Zf;&LZw{q>L?1lg86RD)H5&)#DyRUITxv=RDG5n7=Jw6m7Su9uoNcj^
zzDOK4yY>F-YnSs>F7HPV35kK38WTWP@+{QU)c=`2XkBVUuB<v1AehXMH`6cvJLz|a
z3|X63oAKfIqK>U{i@Kbbf_V>|*6BYl4^}K$aUd`<IPopSm<ucPrm4kJ1!n$*2mK4a
zhqlSArm5^Fx!3<}*-xQWZ&&RfQjTvt27+atsChfgukFtdj*V*FZqLoc#rtzb!h4*s
zfe8ra*!D(XO`m-q#}6e;c>mA&h>3{-><!8ZF#QY2+qZGRDG7KzTz19^l2J4@=RneP
zsFMj{0a|UK)pmP6gd-r_b6jU}lwY6{jZ<_}$Fhrh?eQV*M#Mz8XT)Gt0c#LIKyNgG
zT!G?SG&I;C{aA<4WD0`{aH0X2g}ee52*&k!x<7z-hdMtBL_|cshjXQWlpR(;6E&KN
zbSL;}Eu`aniLykM3&`~Z1bhZPupqfqW5p*V>^L;bUk_^|M~dbtmQ1%sN)`a68#O&z
zv?nJgFDom{+d_j(Oio%^T2|_`QRXndPok}^s7R=*b(@=}ASVs|bTr>0c6Fihp1ZN3
z-pR(qq+qUL332qri*+sScTjrs?4&F#lV4FZAQUtOBPn_G4#i=Gg{3(;gWrwps&u_g
z(@CY)`=Zsl5VAN`Mn~i(2q{T~owj6mZr#FCQ%k|05;JGoOlsuo(5wlZU4-jMhRDdf
zrPhz_9vWXZ1`+?c^)mPK$d+H5(yF6Hy9*D=Md|J8Ucj|hp7A^2+nLN}u^{nOSDzd%
zw7})(+yJ=4#lx$ss~hEdUV^gL7u{!)#_3p^m6b*EuB5p5`0Q+aa&q#|A9`kH0QsAM
zqN}u9Kt51aR}UH4Sy}N-94i^VI$THt!29)s5HkylSQIW67FMVn7*j__$H}QF3=VnA
zNysu_ZdqAb5UTxQ5Km7|T(6IF`aj^A`DNs#rlwv_eN-><I9lY<)m`fJe+_(yi;FAo
z*Ekqp?eF#VQ)6S_tE(j>C3lOl5D*Y1Cnmlbdfy$ev9Qz)rLpC8lFMZRsn+iB!mCmN
zRS86FZ*Nb*Q(8ub%PRNMVPXOlAsT$3udgq}$B~NyNNi<gC4}C3o}Gn-<$P4oBLS_*
zX*TFR(L=tvjGeuGMMcG^$vem!Z02I`r^f@$_UdX>fgZX5(7K$QoaSa`DJdyGdwRrk
zfs7=P&{j%|iCGWhYO}DEFqsU(+AX%IZSAG8x*TI!9mEX}|FvH73hiZMt^cG!Dx2;i
zLg?b`yws>rQHk$<ef$#C!p3mQ+18&NxYShgH;8LVG%Yu`jtFG--9cK!dDn9dy0WPb
zDpGp^)nB>}7k*v~(rK60*2_+eaq1h|Gko0fMk@`F818pD+;&mXyj#D$$R$(fiCi~i
zHD#lG>BDBT_}SPP9JQcH_cz%V;a1Qu$M!Ig_Y4Nm5QopGBoeQ{OUiR{80<HtS1o(q
z#eXAsq&sVRyINje4$#Zh)itz-4Q$NJ%F4>+I&G;x4fL55fT6IawK*Nkf=CTK2dK~y
zV7kZ0N7LPhyDJgieU{JtUk3*V6B9AMCdZ>Ec67A*3heES&nHmfuv*81v)`R7DFL@I
zAQ9S^x4$^V<&|Dmxwv^)DX-oS@%i(ofq{V=!v4k2eQUTZI~xX4T#~c1*B~k~nZ<R*
z$$T!OgP-?Mo~`8PhrRjREIvlyaNZRNbQzVJj<brO7&;~<7+^xvN2~^0VH>m1RyUTH
zI7UdRtm5q*+<>39TazP+#$jak=$1Mn)SMniZw|-c1FyASLZbULJG?wyTwL_^_2uP7
z^XPE?I~U;32;Y;mhyAHb>({Se0WPJdr-O*?So&kUNDdSv5fM>O;czNTS!t;`@D5P7
zVPRprOC25jgzwp`wX%3Uqwu(bjHu}7Mt=WJXR%N%;>5(jkj>=20a~xwVEw!@^1IQm
z-Mu{qj>yPJ03XSWMuR{x$)%GC6=yD0?#@Q|I_?g+L_~h(iA5jI)`8J10(o9VMMc}3
z=iR#mY1|g4gIsxvpr9a#yrSaj`g+gWiPO=d=l%5;(235@&X(=*v9YU1M>cwTwzuay
z2~=v<^Npx{W}SwnrWAB^St%)@FaS(uELnNQi^f4Chw_n7P?!#<b1*V8Iv+l-R2c?u
zA~7T4hL-UJSOFp|_*Dw%-<|Qk`FU<KG8jCQ;Gm#f|DCtwvf%aP6cn(WEs~*1p>rtF
z;(Q-f<1WjjrOD1ftz5q+Coh6}UZY8`2R;F0%j<k_=pcmsPGzC`@S$^Zl7*Ss;py=q
z!yJI>PnXA52A;Ow$vVCS$uD0<A0MtL@uTTjO(Y~T;>KC<qdVLiHcr+ICnpQ$7oI4n
zJrE&^is#Ai(_&+rX*5rvmXA8pI-Ynf?p=mvY8;`m3kwx=br~qlCz|Zn1cib(Hrh_l
zT6~j!ubup@>cGM0ZT<F#n4<rBE9>mrj)3GKllPOu%a;Y?MR=-}xXoYIbdd>8NfhAX
zaMA3@*{7MwO?GodZWrdA76iod7$M>k68elO;4}pd2kB?<PMzd73p+WnLY5mW9YaB!
z1pi_^^F2^7Cxj$40y>0>LW1v}K&&+;b{&YUsHEiJ%!~$!7dS=RnK&TsfU(p=*mHAp
z1DtnxcE;s)P5}Wyrp^6IHklquX2Y&&I~hhuKmbYrg*FKkAZ3nZOw3qNPz7kB^VOZD
zj>%2|EX{BP<Rlf9cfCKqXi!5#$}4W(l2aZ`fAGAfSCf#KZfQV)D67ofUV2{bdhSmr
zRvRwKe4?g?78R|iuOBQZaNucE9nh2z5TGCrmM`%MJ)k{3JJZy(f)cJLrJtSMKU{1J
zPmNXDQLf>ysWmbyky3iygqSNY;>-@6`ifRcv!2<pWR8%HvS2PzHFSgpa(r_SL?e%j
z!FVXu@pOG49FvZdgTs;J>&VvgEt#$^LBUrP=<t!E-5s!<rsn2u$IG3S+AZHAbCL~s
zd3oKh4uQFg&`=v18XA56Tqv6{TQZEpYPr48as?Vn;f(%#0Zvp%s2kW0uxrSV;o(ET
z2G@i2RkMjSnlMPXF4xEU&v!bEjg5)LqUKwi=`M+MW2f@QcYs)KKRwU52?+uHSM{k5
z9s;5T=(DxeRds3%h`Oex9N^NvD7;`~0vMnEesS<Q$;t0)5e`AW`}_M(%QPrcI<EJ}
zXlQ5%2nYz~9D|Sc^786<ytNP#@~^FRP*nvcTpdzT3W^~;9XCM|j78PDOh9mU$@3JU
z)t}*bTu$ZMEviaNObiSR%*^p4Td$#^DL#I@I9$L1CrYI{H?&G|Re6=Qhj>gbY*JWE
z?0Fiv07~spla{rHMhZWnskOCn&5WI$T{s2}Hm^q`_*eyn(M%q9pj?WIir=EZ5ipRD
zd<KIL(bLyI*_|u{ANo6mNv!90LmqxwKz<R2dwpvK;upt**O1D}2P9mIHrpJ7DQbq6
zZ(ZF_iYgmDKRLdsGef@BtERD^3`XGv1|!cw`GDG+tuw}9U5~=Az{m597R@`H)(^#J
zce2c?HoVJzqM>%f!TLBet3ye%vAfgeKGU~_&|pJQP*nvBsWC<bRDJR@{GF`qCkP6b
z28bo-Zw=49)(Q8PZL!$w2o>QHS{?Ub5yD3<^2h8Qn1RQYsZ~W`F~J=4g#`cGZ6v|J
zHgcu5i8f!NjZIC}8~h9d$ZUwibrSO2ZQ}FD-hS3kyu20>*MOgYCDF-cayLB~$Ixij
zlaP^tlj!{?TY$-AxYhk?Ayr#ne+3K*&}4AZQ3(i+R#r|Pu9nEjoI2x>8HR@9{a*C0
z4-8EQjQ{!OxctM}-_h46HsPm(leOs98wh{SkLwef1{>!_Us1wrVG)VBnU8zh=Tl?5
zJl5%GkoW}8Lx(aPGqyU6m-S^iIikNaEiKiAWQ3gE-fW+1{rdH5&BhLp)I^M+rX~*Z
z>qOt~l{W;uT6V7hX=MS=7?<O#lUucA2T3+6B7)mtTi(p<<Kk}j++5no7I*;$1o}m1
z3X{om!l2P`%4f<N85thV<a9I_;|Z^=t*xtL!I%Kq);$uX<dc+?l$Td~O$`&L2?PSj
z2>jeCmL0{6DrIPxS5;M&o<8sU^7XbuGe2Sf;Gmt8Q!l48d?2IOy~{*zVN+96cD5cU
zrfCZtAt9ldS4P}ZQ&Y}Ii&o%>KzOUF(*6D!E^a_r#K_1<-=Z@^a9;R*k4z+CKY&VL
zE*ze>4pLITz&VJ(<GTE3PUc%aL-KY>I7MI{$O3$!Ccq|;33%TiAgtLn0V-Yce&R6~
z@u?h6OHM8anSCr@qQ1UfDv6c{?8?gO0Dxq5H`W`N$Iw0Cg&TGvI<XSPaBvcGwwux^
z?d`cyQMi!gl#8*k*wFB|hD9VOur=Q^xwtIyUOKp3B~SI>yt=vDo0%zbcQ0CORA@7a
zPKZTA;9{jL{WE+R8#Qc3Q}K4KR~yFX`*-BB_R~{ohhd-G0@Aa4*S8R6wuX1;6SA4*
zfjAr#h`1EwO_I1sp4Z1V&chJA=t1Zg0_NtW0hN;>T)$~UyFjOcwsbNyTm!?~)4sVE
z4;ZS$?P9l&z#BbHk{-<z`3s-)i>#(uTaaxE3(4f<MlL0$CCBq6;sB*RFDTV&gg{nS
zR!&b(pYLw;39+)Wf)m);*$D_inNkIKgUw$kh!$;<U{3$9UsA=2o;)HH&<>-JJm;hO
zt1*ffQ2TS_cyEaV3*ZCekwnoUkTSJjWMtpfD%>orX}`t@G-`#_)F|551ni!(1Ic8b
zh4Pt-mNP;~NHy1A2@Whd!c*-x4LMQZFKXvf6%x(EaU|yb`)Bywn*>QKE2~#N_xB#>
z1s~yAo#JC+%sL*g2hzD+?e?ZB6ciLd`~X&Vd3E(%Ac2D5Hz~|!ik6o9<r+00I+|Np
zFd&e=$Z+M>0X=XFuR#se%Vooi8QU#;y7a__J4b%HOpUHJK&Q<u$Gt0r#SGbx5Y)!Q
z^BQffCci~VEm}1~l>NB|WE&_tbokL~M^Dc-c?$Fr1c6B~eAgb28C=eQ*515%0}xj<
z;(bg?N=Z%*5JakbX`lD2WL<>T<{}~@5dI`;dC_S6jMUUmDk=pP6$`w4Cn}O(CFg@&
zU~eV3nT&sf6f)E1?(E>e44Iyr<Kp00X#66y|LCHmG!9T_eQV2*;rsXR*MYA<4?vdf
znzFJ%JvJ!G%ikS;prii-%OssjFL1Wpd1qvFF};l&_-g|Jy36zK@Mq6_H&LLVsm0x~
zdXfB(ZbLnD^SYdz*vLq13{WTsJw1aeWzxTg+z0yU8@1YN&gwQdkrzVxWsN8k#%3v@
zeQw>_<wMR7hdPT41SFJWV{)9A#!JMuO_dX4Vn!z>m_Za`PH=fII<FrV5(~|n#pix$
z=@4xP=!-8$hfb$;`guJ<B+e*ilxaRc;qr;g*x1-~8QYsxc&8GAN1IcP@gOkV7Ut$?
z9WtNk-wOr3=?vnECg8*8bf9<?M#AGfzrEPIxVV6ahi`6f2BG4*`)H}7s-lACW){U9
zL0R`{^x$q2@!bP{YC5i9o^OZu+V2z@G<a_J#5R{NYxg&irr&DM^Dy#8g`LUkYvm!$
z<Mvbxx3{+-vPw&SS{y@r<%5KMZRxZe|M4=}aqzF-wbonQ;<7TTl^5t03vgdOa3VnC
zH1AwKBeh&+L`aCdips_DF$BWL*HNNW^my@C7dSc-8(UJ(tfG!irfgA%$IbWg^jJbV
zI=KQx-8Q$tXpf8CcVAi@d!{NhK@4^}U6-)@30dgbJUXItx_WOeKr&X{?s`_3r#1m#
zO;S=4#6(ax+a#T{vz!bJ3c&k2^~9}}$v*VRRFsvarKN>;P=+kML)9&SF6prf5sURg
zGrBq504zjHN2ew)FR!N7P*d}k!LfUMb~Y@_sLl0Eln_Oa>Gi}`dH*ZoCNdI|1%zfO
zx2@sa46g9wlamuU)hgD`zWxCQQ|7Raj>X?8c)VRY?UtWfE~8>%6u+G8`M*9I$$A=I
z+}xiz{TYt<P0#FO12G&Cct?q{r00W}JI!J%s<_lRsqzj%K!5T6Y@J1(Xk?epFdA}q
z2$wXfLIx2E?B;MrT3np{=I<1_M{7AiMxee=H=gGKMTukre!0In17nN}5Jvn_wl76{
zH~7il<Mz80sCrr1sNmq>egwUkBr9%wIyN>;oGMdOQ;^sYpb6&Fo=*b^8=y%b^!i-^
zsi~<T8|6p<EyKdX(*AU8P!p3Q^lE2^U^9?TNB(HZ+c~sGJ*0q?k11}nO1CU(Sd6cF
zEI<$imV%LyV39(r{eBc$R9pLc9}Cf5TwYfWHAPL2J|!gE#G_eMB(SNm6_o$WomYfy
z{Gy^GLlur^n~pq+>S~0%f1&&P`y+k`d{xrcegO24EEWQ)4OD&QE{Ex#?2Em>H8YmK
za}6ho6+l6QwAf(1aC&i(APgHffXiXG4zf~eDoI8R+7E+jX&D(h?dE_58PG_Lpgsx;
zjMPN58*TML!GU)I({i~<OiTpT@^E`Ge)ArpS2H6Nj3gr`*LT|Ca^j~a_dZaty0-Qn
zL_nLR_DC6=u<&poZ3f21y(_k}1YMsQUuC)Rp|D*5Lx2#nTy%@2Dk>?tU+e~Y9`Zx4
zmc<h$G$Jx^?viu)4H@t4?39$1>9)F@fE1RjNgorK6cG^tvbuhEkUql;UqTKJECiia
z7lmijXrEV+5f^Vp@a1=T^axDRsIuScUGokKk_4qDtkYJl&MYN0`TKXO*TZKAhxKDV
z=9hl_{6A#K;!?lT4=?G`adTfSwsAsG;8A_~DTvQjP(e=>v*kzW)tCtdQx+9@(~o<e
z<nBCrRt8XduAxK>qCiW?%8KF<<e(sT!#4L^=7yMASzTORjr8}kd)+sN#BI|uxEwFr
z6LcF?_eNmZ18`tss=2%&#WHc4K#t=VD?^0!(`xs?f`I;m5R#G>s8#6zd+F_9j|dMJ
zLdkz{YXB%ySXh{olM^350aOdnpN6h(^w5i~p|l3ul`eowAjpSz>XCqV7ZkjLfysrj
zvbMGcAP!LaQ=3~Ic;9da*Jz}VcIjByJH*9B_`55qq09wkO({g!uif5_G|cCb;o)Po
zW|B3=ETv@#uH2G3_(Bu`%gYT1A_^t+Zp=?Ta3!H{HE%Diq$CXpxGqQE_Yah~URm$-
zi>JIoz}9KYt<a{LvliILYi_QPk%=c3V<#i4kS5EmS_;IQ>;dtQ$DNhW?Yw{U(KB1V
z67l50VDHU8*V7L%0N{h%kB5cTq}S;OzJ7&v3&s;herc(BPY5dDBP*K;b&v$#zu(^9
z=LW?LI4wUve{<8g_3SlJ!z`~`2^}4;!T678lr>%tZkU*uYHEK25im<jOI4MX<KyEk
z=NnJPOY7}62C<louWxUMQ<z>qY`+Qrxm&uo4FCiTSri@@*zM)XnzJr^QevX2ni?`9
zqT`n@DXdnrz}F`xCxM>>nU$w_gM<X*^Nvc@#ohhr-z9_q2%w;#dZcQ>9st`Hj+$;W
zkNo)~FDeSNKu*KjQCVpX1Sf`AOj=qxS-NoA(-Inmxvs6PEg@kNneYDi{>I)x%E8!p
z6C^#(PgaEO|6YJ7$n*Nn^YiCV&~-S#mi#*#?YD+^#)~{XJie(JfqVusUvF=(C2LD#
z<MsAvp6Bg(3ZFNxQ)7I*vWp9Q(l0!A+vPfozi4P^td`S0Y?`rJZ_#28H=_AUcXvOr
zTGBVv-uKsqMvr8xlvyve-pmh5A`%c_n;)*)S<Tk+84qEXSJM7mJ2^YmfeS>zwS<Q-
zFkFp|TMTF7k<*Q6wM^}A4q+l-8s9(OeP&H#b*sG%eH%?K3&5pHT5;?t3h(XFlMFSL
z>U#jBhfBJg?)BDIR`&e-7>l`~>ZB4BRAmG_w+4FIqtSdwB8K}1Knh4VGX4e^7k3@Z
zA&ie}3zyfE_+D#B(^KB<Rds+C_a)eS`%jzA&ugJ7^n9w&YB~im5aerc3X;cLy&i5u
z_tg%S;{hi1Be48)^WRS->^~t2G~0L(5HHuWP5sWvGPRdJ{{G!3Yki~dp#@e~R{=-?
zN#=_&JUBQQ$^7TZU%-J$Nl6h9!e72dN=|Oo40LdGERd%FjrClW78cKU>4Fe(z6BHb
zcZP(AYj*r|Yx~CIF$9&^z`%gyD(76sH}T=lRkL1POt|0F6c&@_*7WT+UjYld(><%X
zd?CTlO<EvS|LGB?ceW0;32{DLuTcNMW*os72iF~Z=KYYcw|crFgeWRn(c*MML~L}q
zA9MJ(%JJqjD5{=EI(>R|ZM@bf{7sUSiqhN7jfaH-Nyou#0skMf*boPu)@_{uXcS%Y
zo~>q0dPYXzjcT7iuY>Ofj<Uhy=G1r|jvpnzqC#e0N1cPCiP!VCr>6&mb%m0N4?;n>
z?6#06-o=@jo1!eQ)ARHAdEx+IKLt`r_0|i`=98tM_}V@1yoNFBEUm1bm#br8g>rUd
zv6xSQT)@oIa_N}g7yUeKv#79eb*ViXi)nMBL<t54W?*1ouHFg(4sOM+>G=s<WMrVS
zMa}?%K6liwL>g37RBUYQ4A}*RmZTh^;9R;LGv?W1g}m6fIIi!(DePZzqoYSaw=`;1
z0?X}>{ZfR&%n~RFe5`+j?+N$ayTGU%5ancSi9-Ip>HysZdI`8R$Yb2jhqzfIe@92*
zkdgarN}mt+=4@-^pC>zvwK&@#BS#Z>-=i-4@FAk1!2=sEu9l)=Zh850dA&lw@JM~e
z7%8p!w^&#~H8tBsf`zgN4PFlmOeTZEg@`aPVFLqk4OUdJa8189>M1C`NlV8+-;0BY
zh*Wt$a?la}u$`b#f#}f}Gcd3sAtn8->S!_g6_UY4qgLLJ&qNkFkdH)AdAe7Xr>zw$
zz_@?Fa(P71W+de$+@p()Jw_y}45u860_|JRnvZyOkw2xH?-_)|J2(c{Gh*PUFaru3
zWPcDhs|`bg^`W&5+(DykY;L~bw|w5H6HP#2r?Fb?n!gG~#ezdo``SoA1_gnK^khog
z+SMM7HK2;O!-Kd7IlgbY4)skfrG#)F>CK|#VZ4MOWYM8}TSj0*xOJy<s4}0PXR!h4
z10<m984ml;?R*Kj=M`v&hmYOJd>%@<;_YubdT_BU=tdteCgS-L=`_DOu>3SByklDz
zj}KVaTn2pm?%lgIHXD3CFK!N#f9FCp#3m$MAchg$Bz`DDBq1TFHXcgd-?s$L3G%jw
zmG*z9KeWH=H+u;;AlB2@=WX@we}2osD~;3Ke3ra!A>dKyMw<}upKYBF;ikzF?SHmd
zS;FVt|Ie1eFN-7o|81NC_q93A&76dUdH|bnk%9$tK;T+d8a?t1@$uy6q@uFu3V;JD
z?7*olAOP?W&ZR-Cr|$(|v!IHK3Sd0Bxw%P6e``!en#)Q{u9Vnx7pPqy-<?oR_)Tz1
zMmFMps8KHDIw!g@FITS?l&R=enr~wV8wZEu&exC-Sge%8)?PqHY&M63H2l-N3zhhA
za04BQZSKB;P}qp2rMzJs9#|CU+49T1h@tEGg?{4XQ@n-2VPtwg;ja~=(W<q8B()s1
zkB^NR(7!h~HwTAOSy|bu7%JvK0U%YGlI8h1mpbhpJ8Nrs`S~Qo#7tjSd&b5TJ%-oU
zKjYxwfS$$(H!?7IeqezkNm!$nL59e7Eqp989_h!c!33&2v1ky<ViFVac|EQpM>+%_
zMMAPzxm{1!f2S}3NCPl#p7ksiF1XwLpU3hgOhGga{QmtEyf+%3rx_^8>FH^;VV{An
zFDdWk<-y$L<t40NPjBzxV%r^{7AGesz>o)trB05s$2LTKd{4CVLxJ;MU0qcb2%-7s
zhYOmzx*ca8XycQh6hQqs6VV_NWnJ(%z4>g^Lb&p_5OG1}oK0F-xCda>=17+J_MaTk
z@Z=;U>YADzu4gbZr1+ybBxGcz#l`BMKEXr#0Z%B(&leUI1!=Iju&{S{`0(f5NWZbM
zv1}%HQ$@wWpBy2OU4SX1v)L?Gbv#n4qJL@X;SA@eE|n7Mll`^O;r+Be5SI`i@3cQ%
z?R=y|MOD`E^w^T;bcal|2vt^4K<bvTKi|YeLnA|?vR(^-Cs8m*Z)xfAu;ux&GF;S?
zzkZd0uU%bT4ahG89|s$|G(X?rVpqk?%nU*gB$b~2dLv0!wc^tSN5Vbb`1JHP+Y%iI
zO_Q1YTf*b50KSY~t_SQhs^IRM*;2=p#6%2?@Qb>-YrE^a=gr%S=DEO|;n>(hA_FJO
zmR`AXH@cv<wl4R_c-xQii~!VjbabrF4h;=$X>s@PxKHP>&#pnm8w6ODo{>?aY!0+U
zKtRCUeD`_jm*Mk7L#w&^{(f-?yW=i81fb~0j~}6Y;^N|>qGT;C_gh`hX2XeSlhjR6
zLqr_Sw#BuqLDbaK)03A+`J@|r8KP^Itw_3XMu-k?XlQ6<X?c5fM91nM76$L%i2@%O
zi<_2_!Q-^Ae%|xaCo?lMDry*n98zVNg8d`Lzq(rQl0J@M{!vLPlbvPRkvU8IG46{)
zXS2?7LUHyn{sw)BfCVahTO($Uw}F@HmL7v%IjL-zm-}vVPK{{nd)DXZYgcG@R85P7
zsY||kXJu1;m7HHXn1PU2!v;~4#$^#=SlVMvTgPcf&L@vQ-TK^oEBN)ui?fuyE05>9
z3J~0j*(b_L>F7pgXH&aZ^oneb7TZ8|e6E>cWn~2+@>&QU0YO_!3mqMu9XBc=K?Mjz
zNG;F@RANzE_Vny*LS|lCT3I={=pkcpszD^x>3Iz1&sP6mEB{C)DvFEyhlVQTvUuOX
z2&t$z0xhr7@pL!=0+=VcySE3bdN~fXotCyXP}LoW=F-w#5VCsO4LUWUa%5uuyIOET
zXHs_KH4KdPd}B=CT27)bu+i9w7m)8YHDVF(JB@4VYHRClj;=Ab4Qk@Pe!bs1z6f-`
zB4oSLrsu_H$3>}Lq^5kq#<o5F`u!VumB5)AsJ-|XFZI_%mroY4FwM-vLU(d<72px{
zca`N;VPIZ5IOui5oEYKpzIg*<IZqMu`w+s11Ou_Kuz>t{<H(6OI{Ei+Q9(gdbMuQI
zKf^Iun3?}@yo8vVo6pY8={DLzA&!|cV@HzRc_jo%77YISHEzmWog4CtbV>u-KtUUu
z6D`So`_G3Q`9`OMPY@I?Thg0(no-azPj^dC_xJb0t7)mJi|wA8s;c!aCk7bdfmxww
zxWBf}M0Ch&)XM?=(Uve99mNmM4ieWyf36tjWZ%n{wZZeE^3FJGE-*|Q{BHD%Eh)){
zc0?x*5u)O#(wo}*+7o&4`b2c%yf{4!7u4WM?qYrG#p9%V&OujvHhR^Hj=&cIuE*)o
z_8z~YSBYsfO_B3?_EBV>S@|W!JKq*QG%z-J4%0~klDGS07jE_|_)I#`xMmX}iSGF^
zhQaVwrl!x=NG>jTydPUZ(I+LT$;<x%Ngdcq6fTFNjt;N=rZly^fPgPhl%!wJ51v(2
zj0K9}?=NJ17+kn!*W~N#3(Vf_bRCY<su6@)U`NL*-JmVIySknio>oZ}y_mDu+t^?M
z@u8<j7!xyz#bQcN$iqNEMMVV=-fLw1)-P+K!1!ckk!BTgwVLdHj*r^|5&c`KJ@-w&
zTaND`K+O)MuY`mIu_)Yu!9h-!<Lsy?q^yynTKy(1YjDg!$IHsf{#NNmtEoU&pZ=}T
zY;f37)X<nY{b$?X-<P$3f&jt0xV+S9wAGiCgm<HK-bZmpaHyV<5Ep+8|6gkkL&`s>
zsrXhi;Bv#VS@SESudhR<K2~VHmP+y~r;bk&a^?7J68>C+|IdpN`^CHN)hf008B>su
zke+Wy8|dlz$bmxiI9->pw`YR<&f?1&GJXvW%?(Cs<5v>sB@oWQ_!@{@6c4+E1V{b5
zERm)DkFdJ6v2kH_^-1Vk^4rS;sl3r=;P$+8f)?NvDD!5jCVva40p&}!P{8S_U3Cep
z9|)6DQc}Q;L`fD02jSmU=H|wxq<mbd{&xYKU=9i*2$zg0(hyT1rs7bj*q^ZV@NtJZ
z=XpO~dwjdUI)(1T;G+t1l~-2@f$?AU(}QM}68-O70Q~eJo^Ye%haoky6ts?nXhLxp
z#l~|qGiI;*s1r^Lhtz8sQ+W#XRI%ii$5qOl;n<fx5Qp?ILZZ;;HICSnug>__$*rg#
zKngRM8PrJ<px~#dh1cX$5_0&Qm6#X=v$wnZ2dAp32`iGr<(Lqntg4#Z30!n<dz+bM
zC3Sdyesc01oy_`e^|x>DIqXO<JdT&40tHjJUB8pO_-XF`aO+4ds;1_Ad%lxJ2!D_R
z)RKWzMn<NZ3Tt7`pK|8U9|$BEnE-?8wVaDfV{I+7&ZM8;3+l=Fd0eG;$iDZ>%X+S^
zU7E{lpRxlpdBR&>d3XZvz4mAianm-Z0-X1R>wZZH=^roZ&*TXSgC{~El*<H86PpsM
z)f@mJJj%k(MaLwD^xw(C!6AtXb5>t6@F<@rGxYmFg-nl%%cJC$hQS7k^Fz8;2tz~h
zD2a(`UKdwXOioR)vancLz4Od=X3jl3KTl`1!oJlN5dj_YHtY6mgzqK4qazFU^8&<6
zBXy);``w9>C}GD>l_Z=}L}4!5>Iw=1d81S18pIMn`kFyN0gNUVjV~i5rP*lv0djwT
zHq!IyK?n|RAw4mMYJiT!!CqTidw&4>`uAiIfRA)8=V9OnZ9)m#+uP^o=i^0kdpkQE
zoScizj#9CPNz@v4z>7ehIl0*T3tS_E#X?n66UX7Fsbtv4f+aEU?w^S6N>>;>RD!Tu
zA@{0Y(*^W-^2AL?8`I&_-Ce;@Km50lzrA^b-R)Y;gyBH2`PjVTcv544`oZjKoclM=
z^cz-ep&a@2$P6X|Bgta>Xu%wL&Y?Wgs=!AM6^Gq3srZ<f>Y5s%Cn^ex;<7R>c6L3R
z7vMM{5J#;aTW5evxw*NgEw#ouxblW^<@59NscC4c^^}yx7h0T8Y<htDL>%BG3hTLB
z^+n-@zd}Sr9Q`>cD{^vk|Lq$+F)=X*2M22!kL5Hy#0At;;d-sv__tm*1_mr{7kX7<
zPtONL9M=7XmWJZuI4SgKKR>_fY6gt`rH+p2i+S1s^5R#3FKnH97hW75R_S(NXh7}*
zjLAU)iC*1!rA4dN0@D}W?E`iEh`9Fp+5;BhB{A{WxR<OrL5MFQKO7}>i?$On#N~pq
zn6mS%e66hL?a6w2yN){i!+#|eN3jD_ou8ivNfsE)alH`q@y&giT2-@TJxuKXUX5Bu
z&2GQ>n>^$eH$#LFpVQpJqM^RtTG*<WlS+*Oz1{U}6F_Hsdpp44(b3W8*(%MBRFq$#
zdF^LW2nd#@r>7SM;UEza5rE6Md3eBgSp*+-`Af(kI)lkXR$YA>MD_TD1mNodf;lZM
zExEY{NvvHuaE%6K7C4FM#<=G5TYbEml~y~Z>$U6avHeTLTQk2~+V9;Kn_DN|l|cSb
zoAxsH+pl9W!(b@Ks6hGrMXWjz+{NC5w(_(3TVIV?U9Ib)=wc;QvCesgLM$4Q%~RwX
z;;MrqpQTh`%R`nS$;Z7x4-w86tNoDWZliY@_@CvH=^!gX<ki&3QDC3%+VrC0<LhYN
z<?MVmGCE-*z>g+Jhkw2_O!opolIUAoy~_=VTY?LT)Ea15SR6Kst$Tl~wl+2j3JYIA
znj^v~Kdv?_Yir}(d2bB9)6|>;WnyT!#_M@&IWx9G8YZ?*o2^(<TzU|r#VbG~zrL}7
z^=6(XJNE^oO4r*1!J+LRyU9D>eH9gDyZ^qY*RP==`HfT}|7VilX|MlQ3F+YHgAZEf
zET~dqPC~G<64p^&Y7dl3(pwjQ&vA;NQiMlCL!(qAJ2WyPCo4NOIvR6aJTWoR+be46
zot>LYbY-|!1~MglU~YCc1X8A2p{T4ZEiIkSY!=(r_5irMFPeY=1;xkuB?{`KJ!kka
zoKRoXpo*$048+~to!WT5@rxF10|-##4tG}{7UN<Aa5?ORK~K+d5@W#l>zkS;XJyf?
zRD&2zrCRQCe_b6L8ygf96cdBmtS@3$n@|`1oA(8zfTf_r=&}BGf0y^v(?j&8cEpwF
zt|ttRDshHR$X{e6OqlUF)#YB5H*Q$i-@D@m2NIv3aO}Fyamq|dW2?2Swb!IQc7~t_
z+=#pLW?$DNZ76kV2qo}G`>%6{GhD{cu)IYL)mOa{k;vu*>6DxsR@9Yz2T*@1l!0T~
zZ%NKN0N+=pRQWt-ZDmE%Y<vOtf={CX)HO)L1~cEUFy$0bAJr)n2G>rGZ(O<Y>%SFN
zRCuoUqe3WXXdVt4mQ<^B7K-Eu2nZOGwu?SAdH8+OGe5iWaOlK@$n!ZABO^vwTRH*h
z_vUMF2fzRuNLWA4_2q?XxzAMwTJ2tZyX^n946~6vnHvk_pL4V94g#$UQ%Bq58xLpa
ztMc;l=LZ}8|CVBg55q%#{P?j9nC8DrG5Oo*cwLV5roZVs+y>_mH=q94umc7pEPRnZ
ze6Tb2Cnj6#<xBtleariBRtHg%rlDUQnQ}HE<Z_vxfxTZ}ha`7~P;X33P8yk*7-C@e
z^yS*J;{tI*M2u`~Yy{#V5{}`S8sxU?7K0yy3scnC{2rq2keDswQvi?pp(B#6FR|NT
zcr)y<1+x~87DKDY?~C&qIA3pA-ki8jzp2lt)Si7{&RFCWnh09<&MI`evZKGv4lW6{
zjHNz<iA#|+%y^~rYIrfDMdbTv$+=#d-ge=u*KqnZGeB+tMRRg;3h@@^34!p^)Woql
z3HAIxW2h@Co({a=lVQt|@83GxShvMQ9yWVfx(<w{Iyp5JyPE6n;{2QlNHngj+SP+p
zNQehUI4R1qHB{H9Y*=W&aLg|a{95UtI&)U~8u+hRxSp?V5RjAG+WY%J-m}XyOHe@b
z64+*-g*Zr3V=QwroG|bxFo(a&6YCy``!hYAb3B^2va2F43nMq;OzHS3!#cOFZgPB_
ziS#*qhAywYIS@cuU;P>GQbPo=wzRaA@9F+6qN<8YL4Lk;3gaup%Y!*KK0bmc+$PVv
z`tow>W(!$iW#pZCR5T>K&|evxj+79s7AM5;CbtW7V52}gd3C$JU$3g+pg;?}MtSw>
z6~q=~a=?8cEVml{8qE_!g*LOvSzlevEhsQDH>aeb(N<76nX~CQd7g)f;sJsy5QgZ`
zPzE+O6Z-eS!MQ!IzjbtU<mKh9UzC(rq}zXv3U2B{sryjTH5D))Kqe69pZOB<{+z*d
zolSHpg!RZ|IJYK(B@*u(7s(hm-GH+o%dP{w@L}gpBwwN?UoAsh<*z!Mx}&Xu*Xqgs
z+FX%MUm8u0u&c0!O*MXv)o-E}5$rJRc~NUw*C-TJYrDNaBAb~0-7C0U4&}AA4t0;_
z*@U7N@b4p@cwB6!8W&=_)HG~E!ot4S*W)u8|IQT&XJ%$@)UuY9jgqGzIi_v4Uf?t_
z+0v*n9?IYXro~D^BCMkF&i(B%XlVg9%7oqJW!vNB&W}ok=X-zYK77!BdW@#c1ZBd-
z!ErEMZFsW!)BEY6AuEfZ{?jK74GxoGTx8_v4?;n;_4Q;VB+M)<o_<TAQG{P@^z^`K
ze~*V}Wo<odP#qB&846Ov*w`3Q(bBRq9Bvm|1A|q-oeefiQEZyKwH3`}I?t<`(A23z
zqA|0C3;g_Fg2bRy$lu}h^(%xZBi0v+nN`q%IXUfR_^aMt0|U3>ZL7H-y)c$m`Zsp+
zYQf(bDJXmv2s-?0>VwulC$pm#$^og+qvwpdS%!N5p5ONPwQeOD83dB-E2{oJAW%R8
z&SRfdIUo=L6XclArKP8%j;CJk{hjUY<m6<?O2{FoITjX{>*`16B~K6uE>oCHM1_UL
zrKD`;8x?ePyncqgGd1Vu{}F-3go}rVNvqZWnei>qvA8&Ye}6OPPfkwtArz}IB-O)2
zDB(o-oT{p-NVx2_lcg%#moTe#<T9zu#=nz6NaS_Dl-AU|`<=p6Qc?n#Vcoo2toACO
z1clAHFMW~_mIxjG?qbix%4)&O;xd!RT{H^!BNY|MD#|J<3-j}Kc6P^Duu(KrR5(0t
zwV*jT3uhW^2<lmM1REo@mX<smr?%-a=m92fqHdZTrVGS<n)~z+eM9w{QfX6(S=E#f
zR&l7pY4)H;rzi1FXZTBz;bxw6^6TmbgVB2sj7xv1)MS0uw5-*m`E2%BjFo~L`Yzxq
zKY&o&Or~VZOD=&x+4PYa{7rU{>QJyPnZ%qFQ0b=F^%g!S2PHMhnVlK^a)0z)n0=}P
z`w@MB-y!~joKp!pI(mL-X;}2=)Ra!WB^HJ-Tc642&w3061qC2LQ&LhgW6Ow$7>(si
zfULJ8jy<?DUIcnKMY=FEQ^&)j6=c|kh6a)sT$9g_4(SO&jSVTStaP%oGx%p}VpLSr
z_9cKV_5Eokli_ShF!J=AoU@CI_-+1;T9s8*RUr5Jck0#5Y;JCv45y=(WrmQG8mKV9
zu7l3Fy}P5LqEezj2f8k6;fs-)kzu8;-)T?{N}QPZO9Mo<jrJcE^hWxfq2Mk&kENnU
zEGr9}7TG`WAu3ATnCyj*p0<Sr)#_0+1r;$md~VK%=c~P<C?s^qUz|kOH&8hrp7t|b
zwIb$leq?E+rd+DXgb5aCBfJw){$41K2`3U;M_bv<H}Bv`N7OuJtvx3qe)(OSGM<!_
zWQIr>jio|q=<;rD=>7Ql@I*fK*4@sy$)f%6UHX>mX6q667SFF=O!UhYIt%Gh2l+i)
zw~m>yXd~lsf2S!#jrBhu`!smm6xk2`b}=^2LLw$|fwXoBq7EVu)*4av-rt;6Yo&+K
zQd9q)no<>?oolf1^z>9wR$gCUpI=x&fQN^+N5<p)Y+^zViZDlBT1JM=dcJ?fRyeFH
zn&iY0<ApA|*Y@@OjXeYw0U_?&B9QZ&vn>lVGX)BCdwctRhAU@@J10dVy@jCaJT20!
zsGx1iZy&WQDl&g=y4Tg$vc{soL8v%>HCQo~6uWSG-M1&cM6#rv`<yl~9#(YMd$d;z
z_4;E;aq;#{&DQQ@nfK$(R^`+yUw%TA5E~dnLqk43zWoDZ-DnEotz*q~PRze6vGLL^
z=S!<!IX;@u$(&_`1ZjIwhX|i8cm9G}9!#Ln31@ku{k<!vVq$8FR;QJnh2>&%C{02_
zqB|HlDJdz7*V9dHFA(e>wx^*7{EmzA&k?^uNEOzE)%D7^+H)l(rt9Msh4$hG=4*{x
ztYR!ZDqK!oHVMMGfoK9gBv{z@%%<|Tw%;-{7Za$|zR8TEz(T)xK3-ke=RI6cy~Z_V
z{v;_m*y4P|jw=gNX|-YB?P}#aA;N!ODLzt^5kELM*es76@Yxh<n5`f%4dKVg<QR5k
ze*V=;cV2n9i%>V5piz(o;$NjP_wyA657qksjHds5P6z=C^XxIPAW5v1l{bt}dir~O
zxoy%hezI8a`UfnCft^7kjUDQLUd%^WJa_DGV9Kr_AyHLYy1g_0md2hOTXsTejH;B9
z^8+R3^Q*v%Px5@55&0;DiDssp7?_dSL)2HkO*=6_de(b9GN^F>`z13%x2?ND6@mD~
zYyA5?4-XG##^dfJRi~D>x3?PtP_xhtV-pj(OzxSnF-0-4zW#pG)AfOwnHjW91jx?L
z4$y-(_p8Ivyx_7j3j+fKv6R#sYWrUaG_gt1+?Zz7Q@M5XGFWMDPm3+Y=evw=5Zm~W
z*wZaj_N=xe5!utx6Yhqp&BhBC+tNC!e*gYWqdEHrt=$e<=I#Bw!v0K6k@wRh$gpgT
zjJpB5?KFUcXsAE6NqLNOE{8nSw_iEcPS-Eeaz0_hAtP@caX!d+;Muh}nT_szT4;%r
zlzKH@f=Oo%esbX4m}QYzmuF<!;CtfyROpdY`b9n>Vt=aO3d+oYHRAhsMk}j>G&Y+T
zKklxMFsar50QXyLbC*kD+!%->_aprYW9Ff7{YksY&S<gKm6esXxw#nw0|Vp(o27QE
zA^!WW>vwP;j3UAa!=*ie7lSudl$YOL9c3jXkjA&@b^3+AB|k+D4-e1F%>{AxTen)3
zPDyF$a2B7gkWgN0>pcMEi_1%1`^`6(2m#)QLuqUe_xI%$6`*NKl+6_t#{h%5axYGl
zC>5}=oM~)U;<R8OX;8Ek+eCpw-r`4sf<?yXre|UKiB=62e185FRMN|raxZ*IT;N%k
zQDX7Y;@+;AElb>TU!@5N3B9}%dF=y6T)V}IM(Y}{9$J8jD*#Zy^Z(rN`1lAiM7}(Q
zZZ3QeTVKN*49P^ROhfo^hiF(>81UZbWg&^PUK_{j>!t$(jxUDuNl8!8(P8WA&?K`z
z8xJ1Ll2YUt4PutwT8O45Bd*Oi+3)V|0>;;?R*xf-aeI1vC{-x~u@QVZkkqn3^HpfF
zeWey(3vYJZ!-!H%W3?(RDLFYi+Z)a6t1%f_U0VZTJToz|FgyFt*z;&_B7BgE2=ke0
zMg+TU^nT)n^z`*L+#@~T@o;&*fc?VvcwCN8KX~z<?OuzHjt&PWZGHXoK2;~*)%D35
z<eT@C*M7nz5DjNrTXws3@n8oWFX?3I&0NxO#!4gR_pA_P#=_5UoblTk+=wGZUqXb0
zj^^iOrr}=;3EAY>w;{H%ZCH1yvb!|&Kh!6)TFus)jW>TnFf}*tdJ#@19GrHu`V)aR
ziOXmZ{n3A`swXalc74w3C7Ssn*-Ne`?3sG2w7R;B1{Vp|2z(hXy8wcgx20tzTO({P
zt^@eI_jqaxaN=)k^q((JEi7b+laP^<W1^$u^0-Zmj-tj{nwUJJPe=&tKLgkG*StFj
z(ew6vg&;L0<rNG}CXmL#_>VM*J#-PeF(_j_#jvJUv1l<AJE^Z}liWcHba%f4$Pz}K
zU0Eqh7T2VOigQ}aog_?z8Y=AS>e`MiDJe;!IG1UUsfK<>aC~$prkk<k@cVD_-Qh)r
zRk?ObGb1Z;eRED~yPvGCKtohLj8E71u9Q%wyNbP{yR^z1?6a?VAKqQO6CAVC-G~aq
znPkc>8gff(EN`5m^gO=oJbxIE%#Ao#-Er-4pZEAuBg5&<fkC6;@OX2RI?6(Af?+{X
zW-KkUn>S(fq#3jUZ&^~Sunzy)QmP=51BX<11@N%Hj}HVCk+!z>>({}EIIPDtjEs!E
zQFvuVMJA@E?BJAu`Z}xmhJ|`_bF<bPISzot)>d3X0?G$ezCKOQ_;?LShYK4wYu8k2
zm4JpTDl2<o2r4Qnetrs=bUfP}0(s<We`b7a%ntnE_o`>s@nUyUAx{*jpT6^AJ*BR?
z`twz%=O=OP?xv=t1qTEuE5ouWe_)c5lG2Q-J+<irjhW2r*&GuS1N1UD_%$p2LM%w5
zV347H9ItfmINS~<P(eA1LPx245Uk=%t2(b(C~9f#9~~_<*y!Tn;Q?>f)m@s!h{icu
zXb~$KzcD$OZ;F#Gs?u)3;PSZK$I6iHa5>4%e$>&?adUH{nG<dCBpPe0(AGGZ5-3;a
z4MxHno1Bb{j0_x^^HHag&EVWvU!SNkkpr0nFxd0D-<zA2X$r;3+gmpv^D)F?-_@z9
zNr{PtG&O;~FL>b5YB#U%?#_bufHrDmAH6cqnVL&Ih+U%PJjRa6H+lhy8{q!3+SB-D
zO&EJJ_3PBw)=1XT;UO)B_x<$=kQAbXq|Bf!FCsoKYWpL6Cvh&%RIxl3Bm!FXAT9M`
zMtkE1uZLO($Ci{ds=xpgzC}cIwaWPDNK$1r!?^Hf4b2AW8$lH|OqXMRQo`)C>gvSG
z${>G#4=T*?{T!iB&CRFP)v^8iDESdH=H}*%OiW^t*smbq82(O8_1?aLWLH%1xEwD7
zF);`>@MjhPY7Xc067mCJCq$AjOPow!e_+T)BF#V<x|Vg8kV8X514z!}Mv`v87!Ecz
z@P1d<n?xGTV&&5Q6~Dx-+nXB@kt@`ziAYES1anA8NqIc3ZMTLqtQ5_9AF&uoQaZ@)
z3rdPLbTqv-cHUtG*Yy~|1@}n|N=fP_BSAhBVL>Fzq-1sq+w0pUnG2E<=-6~;_Pu{R
zP3$XqC^*VEo<;vg#>1Y~Y`bdevM(F1B!cKit>NZiBS<1}qj6K$(y+SQBo_4_wba?H
zR)&_?E7G)R)=QirZ9P8RVf|%H?fpM|y#-WNUDq~z=#Ws520^+TBt=@fJEglrq)P;(
zySqWUkw!{D8tHDN8{uE)zMtoPzi*6h{ChYUc=loMwbz<+Ue~qO+H-QktQljyAhabK
zD@^x(xMAb|W^1wQeeY(YrZyf&(;xAb8dd6q`y%o?iH@q8%fsMlD3g<p)A6#Pf`Wpv
z@y7111rt++`B)|nF0PRlU<jFfuBGAO!vGc!4i13S78DQwMv-4u7LHR~S!qyZC~RnG
zXkoGYXQ>saEI2s0^Ye3!3him2HVFuL-T&x5j+BvXu_ZEUb+0+Z#>PUIjQnJ&;X2DS
zDiP7}s{lyiFsOg2gTBm0PQD%`^td}&GzO5gr@Q;p^&jZMwbUVCtl9vCRaN72ay|gh
z=Z|M$Vgg$5^72wmS^3lL*%qLOfB*hf$l#+=R{LtV)M9F8c7_QY2!P(m$Oue!c6Mh^
z54a?>&fD49+5Oc~8jquql~rj$frGPNy;VYZxQv6ti9a0D*RNk+;@~)1y=1`c4>3Zw
ziEBOKN?|kp{PpWk1K+;|B_&!wYHkhT_)re@FD~i=)y=_yeeXE*^Jo6Jg_p0HnOW?h
z2@(=gyB&xRD9Fgj=;(5Ca(~aqgl^rWHn3kid}Fk9>BJj0henxyj`sF;CTGWTXwKPm
zUT13g^d=Bi0Or<P&#J4b)i;>HN~-blHiL)-eMwEH(GCdRt*xzRc+4*D?wH8Pouj6#
z_)1Dj;0zZl>w7slbQF}=&yk(Ckypy7-040KECiF0e2jQM!49)JUvI5RBW;3HffA#5
zlk|DA2y=KoH8H-orVbvWt*o3^M59;|VEVqGz(z%-u#!bXD)i#4;9+}&{_zo~NFL_h
zQY=;H+5k0`_j?5-2w9v*O^pbhL9rDiy4hV}dNR(|Mi-l8WO{-eh+<sV>H+)Z^5-Oa
zBqSpjmpBZy=Pw9q^;%p)MRL#x*x{iwVYC;BYQX9)E-rrjkf2YX=YEg<a+=z1u?Yr3
zO-)Urueo{bc@LcP{faG**G*M=dU{Amh~gb|;k1HXNkc=(Vb!m?x|(t)H947>&t>4>
z!eNkidE*UsOMFJX$b*+3YLcUt1@DIMD`TifWHcr4-(-CgQz6ItBB=W5<XJ0zOA~&J
zVb;;bA!CaUkG&f+BLnBSm0kFy+$Do#Ik7P}BEw1hpTC7)<v2*phN4a28T7nA)F<Yu
zE5E}^kVSwLEz47ENZ1X{)h)O;Zl?O80G8A<W8%BdVffrXuWxX0u&V_fF!CSNoPvUs
zOt$_xYw)mZwfg)i?=k98(4{c7q8khY*5Jv7WwYM0vn#8poCBINM@h@L->unbrw6o-
z+wpS5-;4RVIUXJ!o28b7r{|5|zS)hWas?uy!$Nd)bW~I(r>3UL%NcFd74-DL5XtCw
z_*CTOO}3xm1K|!3U5vb1GD?97u>a`yl<AHYg@uI?L~o3SMa+IC$0R3z+@GRjWW}=9
zP*G8FajDD5$jI*GraN8-$60mG{BJFQcKrN!xVY<!oP#Dc{{Apmw}7hxn-l$vhVtwg
zoZobr1`w1WHY$~<LL8i&2zi}03+2+PkQxJuOG+%QtYG~T6BDyr#mLneBQg63=cwJ+
zEV@nDNd-S$%o_NfCN+h&eSaP*1^~UhyqroV(V=<KdiLAx{rwa099LIY;Itq(gKIpX
zG=cy6KAiRgA^>Cf?`rzS0#$@UP-k;Z{y2;QBjn^`8_;#o*ZV+du2>3lEdLT33hZQ!
zg$}TIHzy}7I<fLnK;;?K%fEd6O3ZFD5J|%So^k>-`DUj^vs~!uVe;osGzhh9vI77@
zxis#PbY2w+iNgB*-g%6QMP~TDVr#MPL==eo@iNtOWO6)?I%+YewTyRxQBhv9vLmHx
z`ETrLfB(iAPQorLg@4A`(!}Z0MpSipIERb7KRUYEEz%H*q9Gn!ln*aPF4;NFq|z=n
z4at5^FgQI`F5r_cnFj-@vtbp;TpvoPxxeOc`(yL4`@t(EBWfV|2#6#=`+8ET0=qh2
zv7Ul)SUdfQhA0ZShfOp!t+W$98X~tDE$0=L_Xmru>+jxd^sxDd+(1o(fd@~TC}h-U
zzSQD6Jv|MS%+hzy#>&d$9MO;<v#+7hZTy}fB>la=&H~XWSOl8-w>$V53Vc9OQBe^6
z;Lre}C82FoUCy^^JHtx<AE`g!VRP!c88NKSw?>Md$tST&r_RY~8jatR`!ouFrrfZ5
zDA9}LB1(%-x~MwL5qEzk{90?QW}9!M4<Izqql@<~$8F;c!m%vyk+)tzEly5~LI6Eg
z6&9AHon83FPbmlwkv@=i)!sy%n3{3{j4t>Yo{>;b04F#1a<lW!PL}Vs(6_wFJ>U>6
z)K$U3ZEXU$c(8soH8q8W+tIH@Zx~?E(9vO5j}{sq?B3}NZ)BI1-QQhWr^5mb|4^_A
z`2`q`4H1&mVQfMI39F%BG%)`$qiSyZ*tb70|GO7p+3W6N4?tL9VHA3O@%vbFCV)Sa
zMG6|q%3)DaG;xEBxC{&o)*t{pEb#fib8vUJKS<7e9{a_1BqSD}wiy6POhN(|JNtaq
z2T|aso&InU5jx+6czAg$^uM=MSD&74^n)Qe-x+(lUh%bGZrfX52Mwa)xmO1ikM$)t
z8(Y_5>;z4~s;<_=E}1%GNKXpCyWOWxcWXT%;u6z0>YSXMi$I$DKHZZFl__MstzcSC
z=+zSz76wRub$)JKttllX1(?zUBWf^taZYXRIrQ~8z(!{zxO?Z9*IZPGz3#6nz(WrF
zQM4AJ#9Kz;{OCa^A*MJvIe2?ZEGU?mL2}vg1pn;0CS&tRnq`qfoV4`n#*&||Dy4Ti
zliYMrA@xuMk?S+OGi_^D;>feb=J<<?p`H*eSh>^Tlt~P+A9|phn3!xq{EB_wi8(P(
z8KwYG`rW&C-rj!!1?`oWwpaOp7SnNj6t2`EG{O9rrv2B>`)OMq?>o-8!E{bb<zdFh
z<G;J(d4MAWVJ)A|^ZIHL1R&7)fGFcV>qf+UrK_#o;&tnUiHSM5^NmVg;cNR#lDJpr
zueSmVbIpEbXWz=7i!W34D1>DF6e8Hho#~MDMJR<096b4QZDGiD@{Cp)2LTCpYHJ$C
zuge4(^#dybu<!fnBgd31vq>k9#mY5TBoIpSFDX}j+CK-w^)`xig{+7fIdfS2HusCd
zZh=5L#vsr<mc$rHo>w#M;lo>278c0V;D_OGGVA8%CcLv0Wvn5pTcBa>?;~awbdiJP
zP%(09Ev(j;FJEeNcW~2@zIqio@^^Qoqaz>yHn8jD<ix_l0^$gw8?gWOPnY}uZWM)d
z8nS9K&H#yyK;!G&tcxL8x=kNCH{(Sc>L1%GQ%)Tk8VYCz8yg$xTd!YJQ)sBDsX_+5
zf4j!Vt4m7uW-4@mOai<G1cchg#<8D2fztGNdi-wqm6?Wy<|ALISgazpR~B-Bv#C^G
zpk_4)zj(~L4h{}g_4T$DXpuO;W_6i0SeuX_Iihc4o5J6b0cnw6P>_<AW-Q9!1+D+>
zOHp;1iuS|&+DiC8c4kuhn`c}Z*x1Wu6o=_4LOopzDJgaY1axe1SuZs-%%ThdEh5|>
z`zu*R+3yTlrvwDv1uQJ#RirAaArNCUULuMXm*wd<{n}jZyn8UZb=t0ji*cL<W{@Jg
zeG)Y+psK1`T2_Yej1?aZ*5B`Mz$%iZNG@egNeLYp8AK;&3Gh!0#;*$ZMpMU8E9yZ~
z%7@p*t`B3%u0&PhP8D)Bz0ol-Y~0+qUvnKsfxx!x@c9eB6Lobkd%WHk4xV^!%#U)n
zbl2``84aQ^ltsBsEs+s5q5SKt`pQ!4Y&RqC9C0j7(1F`cQ<GXip}Mg8bKi$kPYlxi
zw-CRuL-SPH@%Z;*%F)Krl@(vKI`qOzN=oh(uj3cvB^G{cXTsrG@N$lgXFd=xl6<MD
zVNa3ux&D(ez(^i*^Z3`ZtM~eNMdq>IC&MLDPcrIN#vA+P!{4MtrNt=q<e`y~ZvpQ%
zG9vdCBxvwrqNRPmNqOl;Q84F5G>0MQ;_6z>)vAywASEmNH7smmV&d%dMY~XPaxwsF
zK%2LBc8oLNX=sY#XcYE$cLxRrkmY!-v#4VO|1<o6PN1Nms1(VgV_-yvhg<X38rU3(
zkt<o;`k0y)3>3M?HXSUrx&vsfs;X-8eew|zf$ivmK)3U7Ula28e&%;z?s03aTLMO)
zs-aO?QUbt>Jn(TQs4h{SJm#Z7W;XoeT^S3~WWOX8Epn4?Vewps+l9s7Hjhiv4&9go
zB)$%-%o_IS!QL4nGzF;=`q#py`>F}6h7!8Oz6pJJTtyXMzP65L@V{|beOImlfq36v
zjSLTCGoGBRi3$n|+UQ~ky~oC)!o>~evYshFJUr|P!3_7ll}$sHkxv8mfQ1|0XXea0
zM~o3NV)xj&<}gRh9YWy}Zt-+>j>n>JVs3tabA!Cp7W7I75cI9>ZPbbY`y*Wvl8pQ7
z<7dp%E#CJHz+)fzYG+sv&G6aS10)Isy{?}_Xem*{&!yOt`b{0RP~#Q&;frwdQKbwW
zHFroe!M_$?X>s*F&4XHA2UT`g#Y*86@svBOJ48an0N<lu%{`%7cpRfH>D`tH(ul#a
z!b&_9tX-eF=ZotNa+y(s*H>2^4(HgY<LKhW3zRD=pj%x>>|dFhnnDTEn82Pa?MrD%
zCZt37)+Sx%@II`?AwDj(rkt?N-cal`Zri)R*DHYeA>h2?v`{oND+C;%Yv+AlKBv)w
zZFYPrJ|UrmnAk6ix)4m#hImo3=ZNTpE<kyuy|F)QMF;jM<h=bgA|j%^+y=>t95<ao
zhLD8v#lh-oG%&5q%(v#F=?(f^oP-qy9X<gISU_U|>Q_us3JcA|Q)lraSVT%*9s?Cs
z`}-$oLFSvH+TVv9=A$Q=3h6vKxw+&{?d+d7nU9JW#3k#0wtL?LmKGa}^{}svO&<TP
zqT(-r^G9xW;FuFG^HlkROW!|S?A~?0i)?Rqc$Fk$SltBc4mZE!4)-b;Hp`dfAG#%g
zS}@q<?{<ivbBQ>)xvH3w{9Z~yBZZ?#i^_4^g_?YW`Bjwr<AaCI2F2GG6cX`?iGWv=
z@G~+ofi}|ns-ek8&nUlqYs1Y?OS`*2T?U;+P9>u>{os`!s`TR5yailTe~(Y|GiX}k
zi2@lyLc-M4)PS)$0Iwef^oL)h?@bmNx6%#`4nnWT##Y_Z^67NFFThlr{|zfED-X}y
z>@42G)oVbjf!T6$s-6jI%HUJw^ot1o6hvz!sA)co4~R!}>xq5~2ven*0d;uu&h{$?
zJqFZJBk4CJ6XpZ{i*OWjl2?j*G0M?r#}&T8`GZQE>RAROhU|A17rYuDnQ!HtHjCfq
zT>gSoS#6d&qHMIee;TVw%c&^W>nk5(7~D8(8eU40DZWYyl*qIFT?d^SKR~KP@-s~t
zZtvxR%lh)=i{r)*4-XFnBqX2#aPaW(UcLnMoD@=J^ScI`#2ILq?Vl;K&^%Y@s`Rd1
z0SE^2DKonZjVy74i?!xa2?;pCB5Yh-OmuYBjg1CXhFz5%kMru52J_71F+3&%(Qrr@
zUx|5ZK%}FiqkDQ}SX9(G+Z>Gh^-B@l%-npZNFmE86exuG`FUvV>^FAljg8k|2{`KN
z>&r?@!HFi_KWAIYT(fTBwpsp1lll4il$@MXJv}|YenpR%73Jpx;#AkL7ZMkz^6?{2
zs8~1kNLpGN11+uLL4Lt(euc!^Ka49>)6?@F`o3-oI~6T0?c2An%wrs75*fAFZRhL6
z!*Or#?$lLP%XJ#R0WDrJ!qcb0#mxL?D1iaATuohFzuKq|i28uQKo;F5KSB6}xHz3!
zGdVfAh@6}cR#y8ZDn;ZJ6sKwlzY3V_@nX|hn*C!NWdR1m`bWpbO*$dCS&KLXMUn7B
ztML+X+av@305+#luKD_gthu<@Vj%i;PEO9lh>5PA9t_mv=03>E{`?U^RH@rc{?c`=
zCr`2T@mA91Rm>cx$(KdIKPe=gK3!xN<PZ4xyfM5!k}+gAy*~V)qjgIAvZ2IsIG#n-
z)mAKMzsa#wU;nbJOP7gB*^#X|JA3;av8Sf7Qo!ZC>(I-DY%&Qifq{Y5VM;ul5=;VR
zJVNdJ@t*x}-ykPzc_CZIMlZST9vrq%iDr9_B7Z}(HLI&r;~yv_v%Y3#wgZHDZEelT
z$q6Vl04~luqkT?}0d<Ruy04XPw3&1o4uRg8ER?%HS%YgR;)d)V96Vzh_|XZS;r?~p
z$_d1c_5rs8PkLwPyT=b;{2)!u%||O8q%r_l0N=g3y1HX(IsEqR8yE%<bZFxSRaI1K
zYiq-!q8e*z*6})dXNQLYYw7LlW74eh>sh<lpJo7B+<{V?QJS;h&(P9F&AK!`l^E=}
z<}i<sQ(LV+2jnX!0k3UmoomtzTQXV;xuCt4{$bEu0Zk&t0{d5yLbP4B)vUp%uQK>F
zv~ro`9UDa?!zzh*@wmmqWs+aNS~TC&Ly|4iGP2x#{uW#^jFp?P642MstMjSXB96xD
z9<czM$U&cjbmARxK>UJ(`#`M7%ggKO?%qE*@VwaV@>K|{t#vjsT8F+yc_fF3L5xpI
zI<`_!$3XzJcb(-Vv?!b*>#oZuef?J;4oPgzzplVO42y`+YjN4D`p`rBa>x$`?(ueq
zv`cS6{On?H^7H4<b<l&;XC0i!cqL$AX6E+zaC><$3k)c>%doh(SW`=DB$dk6IYGjP
zAI&C<8Vnc!`>61620FUeSfM|D{5U;54aj2)FzlHGF}X*AUy5=9D4nq^A(q=JSELrg
zouOC>B$Pf3eAZRyetH@OXhswfk$_FB*5>BEzCLkDNm3ynT>}FlMn=ZBZ}p|5N-9bL
zD}mOofF?NNaUg>LRssgAxw%<fOboai24r(<Yh!&qk;On?Q4vVTS1(@pcifk5HZ->B
zy|-)MM3i1;-*ain%i92Q@kbOXOZ;?d^#1<-OpuPI=ELQz0q~}|8q@Ihc4$T>gxQz%
zZEUC&-@8zeM?OTymd<Gw6v#}6pu?dSSaw2w2t5^}ETR)iMw-Z{6;|1i#B{Ar>}`2?
z08mk!W_%VNHd%y|o0rhtjeL2T{z@=8mk`am(+`LsH5vu=6v0;d*DwauCm%c4{8kml
zc3x2%BJ_GREwL^9t~F<3VydsNzolbmX9t%1;-3Qq2w=jFj*i;e+M3M&U{1R_cy>q?
zw7%#4)#)%iJp313r3eH34)Po`M!BzH5C|;fP)7C@|4==)87Fyuko+vHU!(o7*p8JY
zOy>goc(daL4+PnVh>`D2BnG6bi`>l-2J(rR1hU)^3q0X@EYK7-Ha6Ye-Mv39Y{@}$
zczJn+ggW3%eMWR!TmXlLCd<&%`(EZM?6ttd#|Ko{DbV4MrDCu7LTnv9eRN)YuCP^9
ze#v%zwU%c-H~%@Gq8~TprxdTJW$Lk*<;sE|bkREKJs5@DygVe#SLKC;>dMMBro*`4
zRw(^a&nwpU_pOYLYmNIOXY>_9-@SjYu0Eqdi#mR*%5J5m_7Ywt^X2!|DskDacT0%S
zrERYl113&NN=hJ<04AE73$AOdtD9b0YNc^-IRdVO@t8^lz8IZ(O<Kx1mFC{{NnLkh
zzRq^a_Mg23c>dA_XXYBdyj31^1}%w|sJ6DYT~eFK@UX81?N`)(aZT&D)0;N7Po1kY
z`gd$1oF)W5$+@aA!~VPezP_+^ndW}8&{OyH9sNIR?ch@+7+0eIF1;fM;s2UP{NGdE
zUCUQMb_m_dcCsY8Y$gYOXL?e+u;>A#stWI5U}y*nIcR;|s7v?In^fe)Kq5IIfy<~D
z8MKQ%r93wmT6Lw%w)teNZ_M_MogJ%Nd490_A;jC8EasiK_>k3Wdej@11O=JEdg}t5
zo6ESw#D)fn!*~gKov|a@j1DZW{CI2}oPz9Zvi5YBBIIh9J!QTO=7=CShm%!dSbqoT
zG`F;t7J>h}=h{8BwhP?gv!_Sz=uzc2ZyKv(S3W=gavWX(35xPng<$(xK%|x{QxM4p
zj~G$k#WFb4`31cpl>LD9Zg6L>gtTHHT2_9?kF*x1^Y(lPI^NmY?*LCNFL(R1NT-@z
zR~P@D5~xtv&Q|y1Lb<d;aAaq*I&BUBBfJXjp4|tY2~@|?@7kiTU(qt;F_Do!o^Q*w
zqQm<E97H2v7ZVm1*4Ovx^n)QFARrfC>n{dm{Uxd}7bmCo<i3u1w5TtV=K?UplPBUs
zTO{6#ovh0}S9`r8-v5jTtpAPl?V+nZojHqZ1^54sU|BE(l8}&~SAqC{d{IeFO`M<Z
zH830Z_cNEeI5-KTPb<@I6wp7A@o)KG0}w$g{@2$3`JmVD|2kzM#rZ$i>=ac~OF*-@
zR{Qrf1oG=lP@eWZ_!WQT*!Eqer|7>%Q&j&778UFH7gFNG?RVRxc@gLTHtE9$R(zgj
zoUbkNlkmV9)QU?6j7fjRTKxBJu&)vSHS~W!F#3<zKrKJ2d!ez?^Weax9(M&%q+R5H
z&iw!U(f@VoCP1w6zE*){Dbbf9F~k@Fmnl7@pzWj5;@R_4If|R3Yp$urYIY*7ZZ4bO
zv5V<C0e#v&dvrw#k+1g5Y^I*c_}(|v)%VH=GPWcCPk%&XaHr|1L66Iu)4WZJ5cAR0
z?_T0T1F=+8mAFrBUwYP_hl&XbdSiu(QOAi>yA?hfNe~SULkkHL6BAo-68>`~&#S{1
zjM+Ik!q0>K{bAI}7#OUlij@El$X29%iCO?SK^(PQi}Oxoc653=F$)U|IyyRif|Z5E
z&4PW$^z5w6H&GcrF$TJr{IH>+p}ugugM$N=5>;E<BR@YsjY@qfyN}Y+VedJPS2|Yg
z>Y?vipa7N{BPIpmaoLS7D4<G^#^F09GCi27@KR7NQN_lN+ugOm2npPh5ErMTrF984
z0ugR{YRU^b=dupK79b|6@549>D)J`@eSK*1eQavk_ww@FrynPt^}Cm+r7b|K0#<HW
z7s_$}nX48xFvt=kmwHN-7al7rD5%hDRhRZRV47$of8FT2@<+t$^$&&QCeJaS$E=Pg
zSw=ygkNVxCf++mg7FJfS6`#Mb^xvRhyB{s%efQZIP|B;0*W<@_d&G|N#<hYI2h_T{
zzg$b$k|5<tucbU^T+YPEJe904>g?|FU?lBLqbPH*NY`6vF&TdM$Si$j<=FUmm;I>{
z(3u<@9FQC6HqNgEJx0}E#Bu`yx}g)MmHHW(nVE@+)D#pH5f~E|RDwoj#U&*K0v{cO
zg<;g8^R!^pczquqKyO@LTx5%)+rKeNU}R>#IzR8>Yez&xq{KqGpJ{h>JDkfYD;qXp
z$9yG#kBh6Wq~za+1XLCX9(uVGE51**W@ZfzYu!Lm8qooDT5C44KU-;_si|31;_m@{
z(QIot37Ty4^wiPaUC85%GD0Fw!Um7;DlIQR-vme%K()`$&-0W^NN9PPm~6o)0<ua%
zd)}H;un^Pw{3shdjc9sEgKSjzLT0KHDrAD49W+@7_v1-6nce-&;UN)-9rX02fy5-D
zB1yXk*LU4_<b1LE-#_tUk|08sv3=)jJ$Lq3C?JNz+j1&if1z`O3!PcM<?S~s9*5;Y
zK}|tHJWPB`-MI$Cz1FkNe3S5OdFb@?^nf9PIEsdX@<Iy|PImh<g#$_E`t-ExEj|H3
zUw=OyE^fQ$H8TeXb~qZev>7&bHS9B7M#E}NRr<^2@1DT17&N}YLpKD04wotJN%|%I
zsaO344o-0J26U6ta@+4ZOKb?xz0id76`zX=3sL76KyO9Xh?K_$2M25Ry92$dkSPGo
z@tinweUfjo`zr@n^X2I&FHrXt6-N!W3#=T00Rc6&wF|GSs;iZ{duM))kN*Y)Ge<N;
zK7%i~pj`j^9T1hRZb$n+*`$AREH5t$Jv}&UYtLUDEdZrN=G{@S6!{m%<LZzgX&4<D
zxvH@d@b-Nx*LEbzW~`Wn7bM;1J7bl)qpMFqWxaQr+4_2cqHnCCqM)IwT3lA9p{}0J
z=g~cBe32)K*-_X1g{Aj`0A_xE37Q;sTm5R}o4TZOuM5$|<>edOc}|Zr6M%v>eiaoJ
zJ(7oqhmZHiLXd3b5?~2Es7<Y{W0`^rb8}5V;zdSA!oa|2eo|2Zy%ZlW;PZeV7bqBb
zeSO`Jdbrf8AwmMENL47dzrR08F3u0&Ak=cH(5xXjin}g%Qza@{0v_FCa?;XHE-v|#
zdw^xB(yJL5_|BAT1)Mwgs{4=d#Ky$jo{tFuQYb1a3Y-E30tj<?d3k)V!&`1{?(OYu
zzzvfJYieq+=usg2?teJh*>lG&0QHsu{4w@xWqwl9?C$sooGqZZAR4x`wA_^XID-HS
zq%6?On51vtg*S6v|5+jevN<d)3|t$~<mobvTP>L+=7PyRXkzZh#-xOVK0a-7?9(k|
zEPVXk?QL9Q;-7}Bf0kPDNJvOty^0iPm5d|?a0sr1%_#KgVi%fHrXshv7@CC;0Glke
zwWVdmE5Vk+LJ5(lpBenKBO^>eL8oaZXJrX}=nevx8Xg$1u(U*ghd(h_TeGI!oTHG8
zOioVzWx=VUGP${Ff|79C(AijBe>}Xhvhw>k0mR1E76o3!!h&|Sg#_~O@BrNiM(YJ^
zP+wnPgbV1I$J2gNVCQp37yM0$jslEl(!GwxGL62ze?(j``lG0jZthQ?&V)Ls!h(7}
zJl!3zFyhLD%PR~Iw7F5dx%}x1`nA5E%eOr85I*CD0W5h8kVKK*%yb@9@%Qczqd^&-
zRb$~IxOjpr&2EB{CPp+R_c4)+QhS?&allOA{OD8)>%2C9ZaG2I;qU%>4IzsgoC|#V
z{27rkNyt6@X$|-xBW{^Y9jsri`Plrz0u2>aLQ<0Z!OYR$`|HrqQ1EkXY^)#E#N6DV
z)h%Ms1n}hvi#ot;4(IEK2M47b)DY!ySPa^|uK$ogfN+(Om&afTbxohMaRZ%@X2Z$K
zs;H_OpOE0{>WYJg)JLBZ9sL|1{|2-Wh&9jaKOP<)Tie@b3dfpM9eQEm;e#eMv9Ym=
zcR<!5p%eBRvR?gJN{fxnEh{_N-lpDthZy*Rkg&yUB-MN@^VAcW3A=CT1?B74IfaGP
zl$0jhKT{+mB<6OBAs;_}q-9_LsF-C?Q(k`99sCT0emtGvqN1H}JeI4&-*F%=Mn@YO
z8j{WV;)aKWNCFE7jfZ-YrnWZpVkRcNy}jVc&wEt7&=Gi@w}0kK#R1rXZbbwV(7^Za
zWmh0l?7_L5pFPFsb^V7PM4LoyE317F4xm}%J6&5hp#_^k)B}Cs1<h8sGiJZoH14?V
z24ke7G|cd#KZ0rLF{Am}DHpV+`_&Z_<fLiQpvO05`_1k3iZ7sZ5QmK)t{5Rp)2QV0
zQX%DNhbDYZcA_>mj8`z85b7^rD6gt;AwXvv8RceVkU*y=%1TP0`?I&V%}h*qczB=!
zQ<DuNq{oo8#Wl{YM3TSGs1}I5F*_@(iShBlpFgK&XIW@zt7>b@zJ1eg`^d)a#%8zJ
zq*ZH{lAH{IfS`woY0%;G7xWvnrufbdO+#2s4LhTfmR5>E@)N<c8LFah-!LGAL`0Jl
z6W?^3ogN=N@bK`erE7j4;xMQ~ApY;5r7V-#jIY3e7<R$7YgS8V@;H)HQT6roz(L5#
z$<-^gr>W~Z%=QlstgWq6WX+6>)<GKu1qF3Rmkb(gQW_erf}i14F@o#z^S2fk7jN`O
z86$vO0^v<eLV_@6l|ri?Np^R4XAR<4lf&y!u@<)@Lf>YL2#NF4Qz=<l-BvfInD_7y
z#-Y>8%f8Co_V)JdY(o$*02xRwcHH<;Kd3QBpENO{48eyMpHs@Ka*>pj1kG`FK7V-d
zdiLxYFoV#qU+ZdW_&%PHUA0<(!`60*I-%X?#J2agos*NZY7JU<7jQJ=EyqRXW@#%c
zD?r=C$YWTp(j;sctURdJo0RewI%wQq^F{Q@_@s2an;@9QCw&|F37Te`R$$d(j%%8W
zzO<C2kTkb;)u|Z)VT5SzVt2gOIw2+<gUGfCXzm0C4M=BSU$78MKol4WUqnEl?RS2r
zsOajVK}^_h$Aq5XA^*N!tEKhZcA?>PEY`shAPQ65pb2{l5c4FtYWn)i2eXwhe#2Wv
zlh7JHRV$f5*>I<!L*(V<6|&w!Cu#sl(8#5_{JnFP9nF)BqAUrBGBl{I_$#lcx75_s
zl$%SA8?L6SEAXKk9-2(>f#%nZ^m2zUX)6p+(YJSZ^b8DRSwbrSuS~@!Xm2BotgXwy
z*a5OdNXQ5JI4B4{2Ubo_Zf|ez?c28xe}Hm0IXM~l`ExTVCN7SM(<1s;s7UCIQ`IO3
zX?Z7bAV5?XmzJuTX|whwi-1k?F)^X@FE-j|m6eq>G;sUi0LTOED<&oe0OZKnn0^2C
z@Rk!>N-{4rj|(6Tv9VYY61Da92>#)@T<8b|Y$-nhRkXLamnDN}0<lRzP_I^2N#I39
zWvMN)+WHqsELMH$>`cr~%qyeV+QN|ZhsP%zL6#SHqTZkF<9)CH{LpXCE-vQj9BnU~
zj)?~Yv???Ooh;JX#>K&bf$r_@>F#zrnuk_$tg5Q&3BiQxOy_lOaXn}NHrL%P;^A@2
zX8a>v$oCP%2Vg7#n9Ys=Dl3lGC*D@ve7^+-c}PG{x;XUy?SJ<I*!1Xean*xAFDNW*
zhzCPTRT3biS6W&c2K-S=MMb6UH$+`s{UO2Q)2B}Wl?B`m@gatj;vWTGwZ}eKw$4o&
zp?Q1%4Z%!H(scb2yF!bELA?9BmL^zaZ@MgL;C1EDkTh<1J-|?CIdg1YVhrCz5(q6l
z{aIe(4A$w^VvDQwYN!8$3u7V8b7Vjq9vl(h0;>VucYk%{?Ci|I$k^t6&&^HozP!|Y
zG(Ggomz%%WE5pOXdoG_WEOu*5hqbMi2?1^Zcf5mUB46tX0ZdlVVfCH3cptbsaJ)y|
z-Wkq+-U=GtLao?&v9IlQu)07iHHihgawJ3+TbG-dMB_xUe$e~#r>u-j8Hn-^&9z!u
z8YCo0aGfET$0{oF9bUIaeM4$`6=WjHnL@rkycFMa*Lw=WpE3j&h%=c`wSF4J-d#?z
zEqw;PT#jjIVgh{$YbMOn!XhXr2w>bZ$W1sf?d~9yxi}}t$IE@3E0fv2KJo6(;Qoyd
z_lD7fCS6RX^A$KkWLKA$(Do0j*e$gH3JZsb21L`J-?cj>Dn&QW0+c1W0J4BMI9~qF
zz|8!uva(+t!|+%KKr)v6AaI_5tFxql==YS6fx*Ep4dsmuxUXSh3jDk$MXIjxV2l9Y
zB1h7{0jL)DKL6LRUm!k9sk~?hGN*PXQL-`U9ofz8ZQqX{(Bf4q?cS)Us31fpiK#)?
z9FIIdd{`UJ;P2__X>~t-3uq?FfuQ#t=hOJ1KO9mbv)<6kz03)F|G46FoAnSw1sn)4
zrj~tI0s~ktqJ{CglO=iTxM0MX_It%9?+WCV2xKu0Ve*)#8xFpYqvZg}_k2{Qrlw%B
zbJyV@Cyh^%Uf9G!iCzzL<_jD@)44pi%YW+?DDXe$kP02%YWID51jOP&ybkb6%`n4i
zXn8_w+S@pfo1f{t=O=4D;^N|fu`~hs;QJ^G`l}lA_wV1pj!M3L+jeRO2Y9j_2OfCX
z4|@{@So_gwX$=1yM8w34ueG&wbli`ZNgx2M+)mfU8KLXJIt?~m5==La4S-KI)IOgP
zvW#1s%T!{-J@9?HUjfn6*vP0#Fj7EJ5b!lBw#DILV8Vz0)^7w5u~Auq&u;RCQaUv)
z&6p(r;=;uyXl;8WO@zU*kN&ntByapP21#mWrXAoD54<F_l1fVBQjlusjxKc_9nZtL
zYB(ee*<@CjgFUHlrJ<pNpV5g-OiihLjaNY{ne|#;5)(7h(DZLPrKP6A&qk68ep1Ck
zM~F#CI9lltdTN351NLdTY<PncU~jCGmZ;fyu)Evlb&HiIg9zQ`QGw8_N?$L^oxAHa
zKORPD`CY{84N%^H(VQIxeaKDALy8g;)z#E+;<W4yEjTSF;!`*}3cg^&Kq#@K0748D
zAB$y4NyaMFU4`vd;sSjKT=Q`Hpf)L#QMU;Q*kDMf343*kFgiN=TrRAd+B5-&8L||Q
z>;4o#yI?HPNw*&^0Dzf|;o4nW&wkq)<4X_=NqnD&lOh`#6-6rK<0UHE14g!*mmYi>
zvU+rc4#B{{09FQQ7>H0_0Af5mc%OnTVu{*~`oe%Q1q1|iJl=(OJWrP|>hJA+Z^0AT
z^(7K|;4<d@lhyB&R6J$eppuf3u&}T!_2ke{DHwO42XmB50?x~O>2E2pv9UKcH#u$Q
zs+yg5_IGz#@xLA(+At@z0s_e#0|x<Q5eOI{si8R}7ITn`!T_}eMmX8u-#<5(JYq&e
zL&K3G`{qsKOevszAMY+Kjg2?TG%Dq@-ex2wZvXicSt3n|wY0d1g@px-=koG0E-nsQ
zAQXk`B_%nz5g7S2Zrjv1_WB+k%^e-S{q0kS){vDS+*~Ntc3C`*>#1DUfcw;cJY5H5
zKRP;kM*rf2nVGtQK?e}Bz)e(2RApp_BkNl@EUg)0^Dj|P1p!?w(89gyF#Yh<Ls#W7
zd^Mue(CCH?DKy*mwOyWB7wCQCH)l^Ox+~-E=*aL%pIlYK#K?RCMke?AcqK~k2?G^1
zHYo{jDC3QNW=2LvX(@fo`}nxHgN4Rp08Dl(?Y8zSZI3-bnE(E*rKgu6MqW}<0<_cJ
zdSCc(BGZ9(1vDWp(4#;$gAV@=8vgCu=+qS8`p=1M71h<>y8lTJ41@y=%;#@QXsFci
z^qf%{pulaPF0CvqiUHsHX9^Vv)v?i0TwO~)1u?OptgI}5f0zX6gqWD|*;!09v^M7*
zj0W#8O6k!|L4LsS0VUC8PU_$I3y@?ESJo?E<BY!$@X|)RB|u|Q(9wa!$Po0r0y?)U
zCzClQkj-|!Znn|@cnTU3w`?rEs;a7st1EDHz#s$#1e~0mp;;xpZcb)4p;;t*dW`4m
zEUT-l0R{sx$?N`yxZ}Fr^V*Jrf<i_{1|2;DFt1Rrt$_FF2n2$kE^<Ue9>G9UQ58U^
z64H6bySj3`mv5}P8mlYh07T8q%s_LIcKCJxnSXP-Vg56Dd>&0yL18RAI~y=KAh*s9
z2G1fUBGoCS4sbR-o$#RV_QAqHuBfP^NVZCIb0?;U{+*26CB#RQ82T+^EZK}&U>thP
zK<WLA681FV{Eyxq8B%M}Sdc-@XA6{VhQn>v5qBfW_C}b0r&irjLVAv@aGrmOgy-6G
z`=8n0-p;jL{AZ_n{;4kf|1+m*^e)Qm#R__u^!_boSc`VJJ={+X!Im=PkpIpgi=YwP
zr5U`AdPmmIq4=LW1mWB14j+O$AdAgrKgHo){m**Cm)AT49c60o$oSxL@Zg`wPCkC@
z2}MJMyZ=Atpv5@K)GPL_aQJWrkB<CizrX(POz)RtqW|~A?+S;KQg-&Q(b$55ca$Q9
z#RzNAl?R)&GSDc!UKgV7o*ooffTDm@vanR9y|H(T^toAV_x7AFRRi}L8XVliLRfBF
zW7bv`axjc2XAFE-%*gy`qhrldsSTT>ygN4f4RLs6$S4Y5sjNazoLZx_m{sCyG5F+J
zrq3n)!tZ7Y`N*8op=5#PKbHq%K^>m`Y1|d^auGS%o%p;p4OP*BmHR0i<*!ApUcSUX
zJNpU)SIWUY7n@A>rO}<qUvcl)fF>u_2tEFJ%q8mDwmOHK4b#=_x_Dyr7#Al#iKe}E
zX8dPB3t|0FR(zkNSV{}#pnL7LBglCHi}Qc?@#;{kl?u9bNxQzZs!Fl@jOVjES;k%u
z_v_|cTi3%ka*_o1(>}+@#GG7RQ*{|TnF1(FEnV5d234r=>pD5MdFZ;#jcsiYfR6&o
zwlkLXB*G^(3NV=BpQE*O;pC9u`ecpT)wR3RKR>bg!-qNw$<13|>)9dL&fW2m;a}n5
z&HMX7ro+Xa*F#TNL`S#Ik>N6O`uffnzUR~n)AgVG1HJDzx$P5MUBd-kEaYr$&-vVO
zpDiv~GwT`I&ylrSC+S+!x$pi;t*KF`c<gwxBjzYnmy4*fj60mEaEgrFJahU+NqxfW
z8kP{#RjBw@rdI=N<sHfktx8IpMcU!(hd)bawu0a5KRF7}p+grVe|7l!?ukp$UOk(p
zjRn-dq_p%3K+_Ty&;#TY6k3dlL0kO&Eu$A7(m<#UPDx3Lh=`br{XhC^1wA5ygoTL~
zxu$l3Zmk#P<OGu2<RFzw&leGS$+V6nHeuHT1jzZ>88g7fKYuVFHr)5n@*(aOvedOp
zJ3eY?gksDLDpFEP_;2LJ4EY_%Jl4ffpDGJKOOkbdB~WE_-&d73%6%9Unk<wrVAPi#
z9#Ax?{jkzb&FDT|ipa$U1TX6Ha=hgvEgc=IxcH*&LTcqrZ*O6%J1-K(z*xG}-#r>>
zt5Vp&E}ahji@(`T$wY)hx-~&=>p|Uzzo+~l(l+JkQJCUb*sNC89?x*6Ds^ZWD9(R>
zGr5soC!$5Em}Wrf2^l^SJYIV}S?H`&hPM(o0l3pbtGhkm5PRY%p+|uJr>1Hb{o9Fv
zNXbyVW?_kvE=ZMrpvCMz!N}+Eo}-qCB=&fE^af<0nrdNx&OSAg{i^KmGJjlwjK6$H
zn}CB8td<rlt6!cZ45Yy>_^r2}L||87&hB~A$#N^w#t;86)PbRZJPO_K^o&OnR8@^g
zT3VVlo0D`K{edlf0|S2kFk%wiMfbP<ij}sziYI5?anwA4v_hoRvVMP-ge4H`>d43-
z%N_R96Z=;06`m*`241kT!4RU$%Dv{jt&I&(dx_(pgjZY&n}VjT&H9ORYU&FcDuh|r
zPdM<MI&OSIR}b7Pfg4pif5`P8Z}p|!@n4k&o?f13l+Tf))9zC^-@N&dWJHt63#YFB
zE>CzYv&zxfIWY+9`3hC68_}*yOG3hQ^lMQ7`Bm``4_=IS3jeP;R4OW}2WMyrh!MvY
zr>&vhP;5YTZlk*XEH-mkPEgv~+M))F6ipV%XWRi-Or$9+D3D9#lmgsWU*G59=JX$)
zw7Sabd1X_+x!CMn9lJA{0p|zQ>LDvDtD-jM8u`^J94Ry2)sZ!!K=NW)(k@Vy6hi}$
z>kVrj`$fanrs%D$v>tVA>{x%8)7|my9g`w?uD#voA?Vhxntn}FwX_VS^StIGU#TyP
z8Q!YU6z-X_2ti>`XZ5@w8%-6*k?x0j9i+)Uio;H~A`DejJ#lSU)A_RW#3pNIAHk18
zGF4W#)Ur-mWpaPhWc>5&bm;QurlreuPh~6spzDW+<@xzy|Lz8aPPGG7(h9hL2nI<_
zeSN{Wh4<Y>mo__MRR2P=a}i)7>FMdf_!Jct0qNK@sveu3o`${@Jh_*|Vvtz#1BAh^
z_-rC7DslhJ=8j|ub>!suXAPUx`ab=2_xASI($WG<ZGC-xaZy)CM~Crxf4c0?pFi~U
z^d{_D8XB{+vl``-cUMQPE_)L{en<eV59`0Wu|c7ZMBLNIr}Es>^Ij^B`sjCUe|L9)
zbO9j&0npc|(-Wzfr(8B8m^b@UyMhc1Wqy8;!`kL%4@JdaGZi{aOiU%JrP;CMB*SYC
z+;)o=mX^?T97U5!Ogb}DQ&t+JD-sspP1jA<Xn##jiRCC785!M(NJ~otJU#0_si^pY
ziiM9)%k$RQ+FFL}`HhfC$HSRSrT%vwVvP6hN2?Y$BT5=blZ9Oudkzmg$;q9YgH<Ld
z#QcbCY*pr%0=^glBY*|qb0XuT&9&kwE5FmgTU>k_&QE}bj2_Hoz52U$`<>7mJVcD3
zH};1881H2QpZ;RvV~ug!(#b`~VpY`z1;GQCOU54<eVk&j7);@Km*bbFbG{=Lmu(=#
z<Bma2u{LWUBz`6G@l$s=9=NB8sjvtvK0ah7%<=2pu@Jr>;neinrqo<5QdoG`_zV3u
z2m}OAQ`5PQr?`h2_9h3ILIwLM`~Jw_SAwg@9YQ!C?_N$!knw2Fg$+p~V}^Y9^zZVk
zw+46lFi8!u2!!vwmP}h&=)^%zs(NGe@6@xLl$4Z)Mq_R+;GlS|ZbvO(2m_HYp^H^x
zfA@;Apc~QO>F5wa09icP+L{JEO&(KMR|h`F!p2rnR%YkmU}9v1S0H|4N1Qf-=m#__
zu&tAiZQy6!@G>)nV8-7wD)(u6tsEEXxc;?wS_Jk-^N92b&++GoOS!pVF3*b-q^TA=
zRs?#Avi+>hu70PJJ3CJ_JC}b(d=()<%gp>|x=ce;b8f!g8itG`&el?j&mr6LX#R67
z*0;=8j^pI}Ao5dsWl70n&@g{v<JT!M_3)xPMQ`&=+St`JHWr<4)zBCAe@?oxyRGhg
zlp0&XBxUp6e6)&MuJnG7W+;-xX=`iIz}IwU+CO5%9D{(fxUldu4UHr|TR@x7cipVF
zVtWS(6LB($jK6D4hr5HHX_RZiK!BhrudGCZyoyRnN-E09QBqN<^}2P!2suBf?6|wX
zPfAQQO40<n71-s+k2iOh2SBa0x$G%Z$2Hrpyp`%T3cbC(U0z<^-`@vF%g4v3JOf=b
zaoQXxkV#Uejc;p%zV1|7Qc|J+ov_ShD4q^D77%5C|C*0w0#a_uim%zY23+Oaw{INg
zqq;RFp|P<OaWo2lRyv{v)A?Mj07%=~R($<>^6M9H<(=(qGiz%g(Fh?xOyHJ@T7M4b
zl6%gb<_*Ng8~bIz<HaN;v5|vLP8>){v%pQp_gt#q_KrXA$K=^xOQ(9TqB04L!)!Di
z1p+_{uzaukD_fuwl$Divh)2H?aNI~YxG;wF5CC0jX0~nL@z>1OHX|$RX_%#hlateC
zxlPL??nm{DBB<LkKsTM>hEwr4B_t&wLFd(uSk(t`fe22G!VH?6n0O`RBTM$2o`C^8
z>%qYRbn<V-=RQJ=T*~=q)tYvq$AF{0zRHyWjRX}0bO<4#!y&$a*W5#%qRz8g^Pb_P
zU$r!l&KlF~3UoYXNCYBebsg5t?KuuYf7BZpYnz}Z9tW2P%BLg)KlzZaXweA>5PX3q
z^p^T~>VaY<Rx8zWb4kgn21IA)fw7RWjYu>3biWrAsnd~P;TafsK0dFi9RBrO3?px5
zR#X_~a2Y)_bA)c=N9Y@?E$Q6_yhu_cb^=J}@+&kn!zI4Cb`lHDlT-g*G0oP7Td9?<
zK*+B}HtP`kzyNUeODK%EIK=PfqoQgMok|e8rBwivPHI1=m-lNLq}*J?F4*Xp7**Ky
zd(nx1QhXdQHbbl0^ppA;(j_J)auT9Lenb$xv7TWBx*S@TYVPO^xO0Cb$@%#?_Dhi*
z#fizuk)J>H+dg)g)q-(dnwrYb%Zp1%fmU@>R5Ua<*U;1Z{_)f(XW9%75sk<D&P7yI
zw8Q7`a+^n7Y;3m)yZvI*>6p-yAshz3+adB}%YC!w73a_}wwG6sXzp518Xl_qfdr4U
zMAu>)??*0fYBO`^k8RrvD&h#or^fOs*sLi6T3RCF2(v@`wX|Al37s3lrc??#tsbX*
zp;Nl6BSgz-Zx)M-Kf4~7cwSMydb?O>f>K-k!sl-SwYn_^Qb54|_DG(Vc9`a^UnOO`
z|8OE(eLV^uGwm-6c!-1J>xJKrxw*;xQ4C)y-muqn4TZU!WIyzKz8RcvA<S;huVMc%
zh?Sa0p(PAsx3XQXGs|kBc$vX3JwGo-caZQS4j|`zlcTYdQ%z&zwd5FD|62i{ho-_p
zvy0tvaIRZ<`MYPMVOPN2-6s!^TPP~de$xX4;|yAV%G}%>xHMqDO-(!=9v;<3_t(eJ
zELWpIFatpkgzrmK@gYJO!_dwReslAkGL6c!>-Tfb&O4#lG&Qxg)pMhxqkqn}hQ~4m
zdonkmH7J23cXV{rT=R!RI@?<O?m64tooku}0|9|IQ^>d7Vw@bHvJZJA1`pJOqmeLQ
z0q;sqPEHr}#BEJgRZ}A&CI&-ZB%2a&Eb4`>a}L-3iDwyGjJ08OY;4DY=kf9J;l81=
z5*U&*8<h?pH#PM(;NU>i_qVfvCiX{>9?#b^aC0ZpTIpi-OQa`;#^DeVh3EMh(!fx#
zuqY@gRf9GHe?{)H6P1;fefO?2Q_vH*YV~pO@RpJB?1V1=4Pn^SzO{sKPV*Q9LQfC8
z(9SOF6=g~?1k&aKC+I1nf}LN~Gf^<&$OL(gyt)RX)8G|LO>_M_b>oLblM_OBPg>7G
z139JKmqKdIR@_Kpe>@gHp~S1*m@jssD%k0Q&lVbBAgn3Tac~_^7!S;u2{`x!q2HFK
zUXoMfG~lLZ09(9$Nt{PWxH`k6S)B`Q#!_p~uN;S4r}MRoy^}Ga=)@U;Kh^f6O)UWp
zZk}GxARufUcl7wfJtsz!lLL@^b1OW|{l36wrrOaxL@sUh(YvZ4@n27r;$CR5t!-#<
zb94LQwnG;4{$Qq}rv^~1%(vc96fIFHl27H_194yTE>AKlD5zYk)@=7z&Qgo(!Aghk
ze^!Ygtt73@&A~xIh6=iX<W^N9yoILde);kxbkS=C3nL^jLc8wse^;0uvgW=O6n=I;
z#JBE-CqO`0la%In8_;Xc{kR+57K&myRXl$%n}(hxly$cXvy)_yjDyprQQ5>{Hs#0z
zfr#bageZUd^vQ-h?P<7o>&(jPW2@VsT$VfmUwoT!$l^c@`}jCIF$yk?{ruF)9}*UJ
zWfx7x&{%SG8>@f|m&7Pcgz%-DTY1UBpC;iINrRhPn^oVx)4^Wb#m0;m(fW2m&OW2p
zZ1fMKkuqcBO7OeO=d`6?&l*H1&oC6wP>_=g2ngIb#*#JKuORvfJw3!_DJv=E<mU&8
zV*y+PD5m)`;DeRb(3(S4$tR<}$G_JrU0q!u;LNpq^KWfn*;`s|IyLjV|8a41`!iFK
zR$k5+A;Iss9uyXas_t|&Umr&;hvoHZu}p&nhy*w|IEbQ>lE=lal7$5=?h^{M8r}>y
z_rTbgdF}52_EXnRHsTe|7>uuxk=xgu)oM#~>DXSR>(+Crq$kror<r8Ho8e(|3_5&H
zPCq;Vf^^$lY0$CFK)0#+DhiK?h#!Q>u4caPp4Z>X%B)}3M`Eo2Px-B#sEKfPc6M=b
z0iRU9xwWOGt!*SkY|Gw2Ra#mKs5b<f>jZG_pwFM_>F7QzeP+^WfJa0GY&yVY7Nh<1
z3bBZG-21EoLp<~=8GS7jM%;1(OwReDj_I<so)CpC92{YX-rz0>2GZ_@+deh$kK6MP
zJ&4F?LE(6>SuiIiAdt6N`m?gygj2I`?5nla5Olv)fl&8ke%#iR+tmK{F@wp)4W<MZ
zH8=Z<vMOV-W|cdYm6!39X6_Gtw$L!ak<5o&wyR=IW64lGW3gcIs(>%F?~fT77q<Uy
zbXPI5mS=~WzQx2G`?JWuv*>B&cAf4y_Fbhutk!((IBIKnyoPFjw*Pu1u<$ouLfW%>
z!kHNy3~e0>{?-fE{z#x<Q*ga6kYi#B2&C()m>@(%Xe8RHrY;w>?ChnZEbLqr(LZDp
z&!egLX#F>OHZEi1KMG_92aDfd9R&si@VV?l{0jF#V6@u4XIIs~F26O7&dik8&;RGJ
zP*<T(0K;~<KW!Yzx*>XJDoUX37>xT;oB)4H0P;}jcvIC@{N)vYLm2U2TqbG3*c{Qz
z#l^FLfUrt^E`*alyt~1{i&U<fdTUe2-4zZZ;(l;2-4~djBOcAoI1^XSP8MMSDOxxy
z@t6Cj>+4fXtw~WESG%uy+~s4Ei|wYqFxkmUDY59$FVqbx7Qp7oGfUbr+Zu_Wz;kiN
z76kJ0S_Q)jJ<{qletRg>E`UAl_<gy(HEzXaW6N+cHTrEn3)#RxIF9;(-#s3(pQ}Mu
z{GAF~1eS<M=8TOV`^Ag#st=+g5ud+sz(ec80BZcZ);#r^L+WK+RaLQ4c}mLf@jS^Q
zg{(*3+u)K~3CPBe2!4;VO(<ur)VH;>(^poWC{<&KRZEVJeojg{wpslA-&!Z4#I54t
zxO53a(6Zo*P1VAIh_z-Tse+!|;Y-O4Y(A|11?Y?<mDSb>=oa?&mAnmq&$eWsD-DO-
z<<-Gz^Ep4Z_bdcM#ehg8#|njriHq~{^8-BT7?Q9e;06aBT?uGH>I66#85z;a2+vIS
zD26izl~s-5$SEl5AACZ^COT{u9%lD#On;7ygolR@4uyeca9K^gXT;sv+=MQe493v_
z`a(6mfA;%>{Tk9&O|-Y9wPqh4KI$p3aRk2eo0=+>L4dWW&?%ePtBmx%XSIK2Hp=Kt
zgsoybveCbGjEVIuyl?e1I!Pl(L|=b;%*tZ!d8->tXPzWrXu`t92BbY98VhtB948-X
zox`Q26p+qG#FTChIc(<q41D{Rzq7J+MZYen_@uXhRVXW*#EgvDKT~0`(!LL0v8X#>
zvUQGMsSiVIAIprz^H#tm!&bA}2tjVrWNLGBFpgx%tnJV8cNwG4+_v+S)YKE4-s`=g
z`#~0FWSU9A(|HmRxePf39N9K6#7#^2<tOW8sX@>`9PjJ+@l6jz)?p1+jZj5oOiUjU
zk=u!wzHs!Kn%?p8+<eN@6b@?4SH*m8j0wNmc#pdRQAHQ8kIM+T*4avgQ=`?MryA6l
zcuPlw=U`(`i;G_bp@?s9H*YG?7hn=cr={)aH)R)B$1sw-45x$kCxMuFXmUp~{&-JF
zF5zWZ-^-|wwl-8DLT&qcMS4r8qA78EJw_?&nJ=wcDPO)ISA1uu!b0H{Q8#(T<3J`I
zxVyVcqmcPUESIqFYJb{#vQRFK+m;VRaiVd25|Zy=0Bsi<5D*Z6{Aq4&Eh;RW;FL?}
zb^4a^<3>kbeiSfSd_6=&#4`1YPmd3`Kyb|0Spt2Np7zFm#*qIVc?_rB;#~e=f68}Y
zlIF+Srr%>?Vze6sUH9W-Vw3<ao3qt4epXf|8Zk0C{s}8INU4`I^ff(w7;moW+|-mR
zRBEJNLibNp=rj&#&)p9=nb*9me&bhYBn-#>-@O2PySo-6w9IsLbZl%fyl2`O6==T+
z=zz;b2|bbxYM3;901qY_f?+#X^}0m;U`#%O>A{bU^<5HklNUh*QJ&=_s_%48Wz=X!
zwXe`nVvj1&0xbIR$1*WV{o8leIqIU!A=@;WhcIdcsXqqew#o|7(Z^f3n009@qhkX~
z6Y<otwKyIwu+h*RpWf;ep`ooFgi}a%{?seVUmZ#~<79>8N#<2O?~nYj@)jtd8kaiU
z2CAF;JP&6^O}{dYvJ6^9`eD5H5M&hpU<3gHeNou{5J|l(tPDNw;O(QMrEFn12q2DA
zTVnS1_UyY(hjZ1>Oi6nIZ2f<1y>(nw-M99=0l`~Zq+98hZV;62mhJ}WZV?cXZjhGl
z?v(EC?nb)do%{ZsbDnsg`Qe`}d$X5oj&Y6ayJig~a~`ljB=q961U+x$S%trU|Nfp0
z+B|Wv`S?6?TI@b@yH};E{>+M<i;DiZ(va=wRBS7PjFOMdaC3Fl^f71?1YeFc4N*4<
zmpl`Vgx95od3<!#Bn}fT0!o29)#%%g-yp*&bStaWY|8r9GVEsZf2Leqc63{;3T{pH
zK3wioG<nWV&eZa8<duN1WP6|9;P_grrO0eCVWrAEpcVfTA78Op6A9d`)<qf`iy^03
zjSNtr`%OnCkLF+P=hZUCktY&_lL(e*eNz2w(SXX$%?&!7>KMn)nEHo>#%nb-HSJDd
z=4DcNoIrR1gVy4(BfG>d;B|-To19F*t&pu4sm1j!)X2`vgo;t8sjjXrVNNu-eQC)H
zKvACge8k_~F|r{U*13hYal5M$^9<F(lcmP%^)4inH{YRZ3;rzl>F(}6<S??)cXA$W
zcB7vr8=@SNFPvg#W={HZo|u@}*Vi}rn&D5BE0d1l%pf2JN%AN>RuknKG!GK>W9hhe
zR|vpDNMtJxrC;Qxc?-`e2F)B<8GnDADN^46vOOL8y=xtG5Xg`B<|0nFhm*4%Xvx)<
zr<<=DoPmR?bH}2RT}`$rGkd*2Blz^aitXlpqYXx@{_D{~`(m)4UvIy#?R$F%@P5&s
z)Vdh*WPHT1uw~W+>+9+At8IRWys+jN#9=Wph{^N}+CLn2%Dnj{B_m?Kjb&AH!oMY_
z%=B=vn)^zpX1fMUDJN=Yx0m!HPL@G8tS6k=mUK9^E0Sz??#<oZ=dyIIqC&d)8WDMP
zohIMy2RjBUsRS1InUeNJ!aqT9A3o#0fIVE%)oGu_UGelU*0j5%H5u;A_;_=rX~y_r
zBC73_`R_b0jrmxKHm`%jIq=y>3$;{KRHjBoe6D{#P<6q!+q6D%81<qjN>68rp|Ny)
z!uU`q9aM~=tE>AX(<}+}+WGcSG7PZRWk0E!?ac7S!uw$s8*^Wv;}?`wWF8*6dV6mL
zE;ToP%TeI|XujIkfq>$=yzFUcxPR+#d38kL=612(mE8wXP$*!~l+>u*Mhci5O72hL
zm7<gxKbgqAIKT6G&aM5DVl_#<*B=|$-Tk>*k`i0#d^@&4Tw2=E&JH?%?)L4;g4%3#
zq27b5xqXHHpTH*nms|0SG(L}0-+x9{Itr0zHaO<n2K~J)t7Z`FT^7GWEz!1|EH@OI
zDS=nY*<DyTw|CfEsExH?pDto9QaBmUMtHo(DbZz0=9wZT`^fKHq^#S@M@hg}H@ciU
zQ-HNH8WAO~tXUJo#dBsd%$C=v<1AINy0*4<bR=`7efsyWxSSjs3W|1>StPKro}QjM
zI;lBi!Wij&k>Gya-`&Zk@UT-*WCMR-U(d(EaW$STB^E}wcIwLhgMxSp;LQ5Q#!FN}
zTw>zobRqu+Gaw<Gr>;QrHEO?TtEx_ag-0S5@HDfwmI;JtRGF<E9yS^EVMK}>85>vI
zth9vSFu{`Q|GC(kh?O+{@WHpb+DS`m(PhPJ=iuOAXXj;GS68<8<J}B9C&5hH<Rlv{
z?LP1`CMG7K`0NHYa8f;UjXBvDryD(r`I8+T1`ju<hCN|kpmG4D*4EOBW6<n2%O4Ir
zWGEU&<s%Ny23a^k&d4ZB8;c>w#=)UV8*9PALQ9K?KNb?FudS{9`0x-%ubx?2YGY{V
zaJ*O#>Jg)MLzR+>=4{z@<kqkeje(7?IC(`?6`$j-JYWj*B<R+1SI0|q=>Gu1u^5}{
zH#hIxTdB1nVLhY32o@F=p0BZ90D)`&n=vf~U-L$PV=tK31)cDxdSyfk3KCM4xxe|u
ztnBG&`-+cYABJ=yY(A!}EG}zKRqp~pqw`xX+!e2&?$C1A(*p{cqs3r}=+O#_i;LBr
zATqJhazm`CFcPss)zM$L2MaiF-+r!mAtYq$*xBT!GQi2|?+-U!B4Y6F#?#exbyX<B
z_?bRse+(`o;~&)SGJSMJ;Mx6ODsT*_^zV)(aG+dW?ao&}=z;9K*?c3N9LQ`aIT0~w
zk*ADxh0V#_?gy8^40nCp-j68w_@Y=yo8c8937iuOL8rlKy~B>l@Gm?(Jm@q@WZd_9
zcNcp=SEsiYLGJ|w1wH@$gEmv5EhQ&6Gcn=d;&L*Y@n^Q&&}s5`ef{j9wAK51$tB7E
z>oX-SmcZ?APr2iKr4Y!)0TrKD1Dj)p`QaSd$*e+~6{LSOH{5nb;I_r<Ec4y`c+}2L
zkD%*lolNpL-8&40aN_){llXzHs$>G64biN==m9vi40NAIV-{1{(_h>o_S`(qn1oz<
z($0vmAIAHXjk6vx12%eOTAmtQZ|&7(!{(=ATRmz|chU~_X5q1C3Hp|W<m8@Gcyrp@
zE7U80R8*QHAr;6Fv{#v{pe!k8+UV+we?N_)s7OyY5EBC;gYe;Y`YeSP36(J7WQ8fd
z&y1IMd3VfxAP(=dx`NZpz!!<>H~B!Wf!K3$adB~S&dkp@Sk9CT4-Zp&tQW<Rb@0Xf
z$jqC_m3s*fU#wA0%gPGf2MpAm&hM`~hl&;GPg8F_y~V}Fd%}qBFAuJ-SA1qfvO+=z
zhEsTP7&NL}PIO#cuGK3|urM*-%k`|D-$M6geXrk<z-&lJNJuG@w7I)m=l$r;GQYpR
zZVzbm@%|bI3u|s+0gZseYHvK-Q$Uc8?f{?#6m5sy=~Rnu)<c+}-Kk6qJxHb8P%Mt4
z%u$ORqufyjsp9PNaIR8FNXYB%f|;G2NWk-Ef2vSoo~IFIu2?yR2vVlm(oo4ZwrKg?
zH9N_F4xoP02yda)EC`Naa83O&G#1tKAS6~=y#5s8i5Q*y%LOldvtjs%Z9v2TpXK1}
z{AK)iA288D$awY#(+u_^7Gvtg#F1qg01-Zl54+BVRVC3S9GuPNmj|5S2tIyG^DeO6
zygf&>S*V`S@gA+B>32>mP{(f{K*A5d%WK<7Q^U2JS-h*1G+*&XG7$<*A(BlgkS~~1
z&e=ZQ$g9I6hai*a=o@LXX83U{(03m%sc;e$rR>kW;rCGWc;{Q%(xIlSV%LOS1CNf6
z2+{RczpHVvIg&z1x7Lg~3RA6o5f%=E*tYyAc6YrueCXQ_+G!-z#{LOHi)J4sBqVuN
zUtgd5k?HDWLi>P=yO;YF3352`TLEIF+={OE=i6)Hf(6>KB_ZFg<F8M-X`OQScQ)dL
zS_nnM5sMD2;9kCb*%K7B9bL=~qDX)|N3N&Z(rgCx`F_QRa!osM$?vImtpfoNS{ULe
z8xa;3duhX<G4$m%-q2%ufj>o~gcwL(a;;f;4{F+-)-S?XqgD0W3oezBB*YpfJFcY}
z)U<Mz9?qy?;i-KGvU8Z7zY}X#pB$bAe?Ctw?eEl-=9TQi<y_x%(PyuCDKu~*)Yka<
z|J$+xt5FU(pTfH))>mCy^@0h9t#z3#Ci8si`JWl?uTM&utw=2i_U{&<*9W~OG-5`R
z)tiXb<DL2T02IRiG<H3u^z*C)Zmwmwy8C)(Tm3&`Lf+oqwzhvk<Rp-V6Z2<M)6&x)
z3R+DO_&IKtwm#kAI1=$X|IEw-jPZ!n06jW%nPy*rhmM2e#%b8M`wIID3cbfYM~O$Y
zV<hX~%41Mpk=(~T1{=Av#?q94+L^Kz>tw56%e7~g4315Wb#sBx%OQbxIa$`Ou}T!q
z&<g|H#$mJk0O$IF#tou$FkSo%ukCWY$jr%UGnqHmnjQlF`x_~l$61xBj2r<X6sM*3
zNjw@?7Uu{Zft(aU8y|&x8owr6=Mibm{#8i7rB)I?S#CaAX|*voza^>J4@C!%pQk`}
z_HCwi2-rb3lCyqj<ebW1kExe-JCBWw*U6k7eD@u3`(gw6Qj_6qOHkGVgGwR*JzQRj
zJSr**17yGPKpYAo7rL)x_I#b)Mu~PK;Bp|*J83>G_FIzt{QUND@&C4<pdL_~Fy6e;
ztTHPHD&&5-?{z-J3HXhkmKGndHz=Pso&xzRHP)I`RJp(&7il*FoUZ}K<zS}tWTun^
zQm^&Jz@WlpC<#=6sD23viLkJ+AT$zGWMoGNhmg=vcv4J6m=_2Lzy!<=3=AwRc<c<P
zKtQGBaoioPFdkU(zCQwB58?niLJMw3Fm=5axX%8iMwi^&-22;G>!pTj;NA+=N>f=)
zWsQ}}LNd+Wf&6LKerfi3Zt?RI($ibLyF3UD4TX_Tc>k6K+M*_{rV3Pyj5Y`2nTQAp
zq36{-_ePS*r3n}pwWH(V%>m~U5fK4B3#{G$<<->{kHrggZ0s86BaPrsQ7I|fr8>=R
zZEe+-Gx)f;5sKN0_2A}!@cNyd4aoKJ>Hg&P>(|f&dLBbNpk1`w(PC;Gio5$ti|D|b
z-^s-_etXFiA7+-t6ym!mtUhYv15;LufpTU!-?=Q@w$my;@_2rimD@MBsYS=S@xkYs
z67>@K;>Eaun}NpiiRn88XWK$W*;uZH#PHqyH9ZPiYTA0-+e6_`ZYB919}Ay|772?x
zX{&h{X%1#D#c0&wdEzX_GwL@?`T67?&&k>Nz9h7IESR7shX;foZjZIi)7O^WfOkgK
z#W3m&!xZBuCgSqR4J~;I(2}W14p-M=qU^42TbY_z<T1teolyNIX}&5e`z$LNTt#F`
z_R_`5#D?bX{wX9vYMyK>X}*vxUb>`c(d3=m$ZcLbQSzKdf*IaUh=4#1Hf7<pw&DH=
z-f~9Wr_+OA-YIQN(U9hBGb2tkD$VnCj4ld^j`{^Vr<pvYsU_{${Ef$lv5o)~Cu88Y
z0OY5FD60jcyb5fdh=>S8nHD-L<jZ1RIk1g3HYW)Q3Ag7v14b1x$s8~d16$B>$kX+J
z=;(>9fp{fFMd${zUlzH3WMVUDTs&T{knp+M0utkQzrYpn<bq@?;t>%&f)aIjcu3-X
z<CmG2o}MlzaJvZ#UQJES^~s7FHD(gr8b<I7-}rbOUmz=Vq@?L8g{qd*MKGk;A;DKn
zEjO^f(v%(#H+B{l1+lSHdlR`Tv{Rs%b%zlpM@0!MV9HFSd7kwNK0j1i&9TVIjZ~VB
zAiQ`H6BDDHxYWsr*!Jz!o2!!*5=_jCjc`E#iNnd9rFC_#(0xt^hlY?4C0j$7v>Px9
z2&5F0Wo5(s{XZ%wjGeSTw;1(B^)tiCOkf0ej*kP^0pPAhAzwKJn_*mm%op67<z|nO
zWKKEI-bK>uG|d7}-1P(N(;2`=_pSceSUNR#509Y0K<ATXeooGK5Bv9^lJrOrdC{Yp
z62xje-iUNps?G5cPYo~Gb)^<UCads${bS9Zdc&9|&Ye?2Xcee=tF5@`${x|)a_aov
zf=OV>3zd{P5x|MnRW`8ry;9^yk=DcOKvz@oi*^hLv1NCI2%k7Uj_lIPiePu;7XqUw
zAKYkB##B{?H3|9eXZQ7*)Cj?{j}y0KkE+MbNh!KohWV7uUdhOZt2HOW7c1AgF*IA@
z2OD1MQMOmAS~yI(!H*i+QRG}2Az@lxq^sv}k4rt*m$zS@ofPL5CrN3@o=@(Xei$K2
zl`Gh+bSoiL-!gC7h_*zw*t+6``>P%2nqVQq&sU;ofFM?L>Si9tLEW3QGR-4r$Q^Ag
zU)pJI!rdtQlPRLxn>ISKv){avv1Yd{bBN$#m6WQ9i<hh@7TS=0uif5-T<woUu>VP1
zyccLm7$G-{)$Duw-(um!n_Yn@1j9gZfE7kZTUc2U<lt}yf(885>ZxnzSQ?j|fvxR(
zU!YkpU%Vg$1Up@<+0xPi$pNtCab?9K1zBDD6U34T9W=_w$msOo00m~IWC=vL;NykT
z5UC$&q`0(<3;-O+?CdN#Ir(4$^Pj%H;22R+Q5JnsY3ZMm+4#K9hXpEy;(K`tSvk^)
zipt7HR#r{c3pF4Z1A~I1b%6e^0ZIxE4ps?7In2BQJ`S)`G?g4G?t5R{-yj}`e{pNp
zSTS>OOd}Ia1A+lrsNLwiwYdqItuzhSC{BH^FKirIUS19l5ASt<1>K`q3_9{ClbjPG
z3K`r)rfCLF)76#Btr7fsqbD4gyyVY)Gc(XRL?fyE_YhToThJ!I@`Me$v)6dt@O{is
zri<BM$DojzP`?$C-Wwf0zEzy-&U&Vfv4F_w7$H3B=C)XC*ZykCqFS9PHEp=}oNT^P
zR^)Ct6fx#j$z<A$Zuf?qmR5*}-gzxF=tT0V<xj!!)@2*xJh`8RX~@8diw|kviqz^@
z<CE0k!udAGe1J)Fyxg74Y>!iNNeqM;#X%Hi?CNY8gpG)ZI-i)-S(dSiKW-{g&WFL>
zJrz7yGuO9B(3VGD^%lN+{N`wH@KAUdzvm{^?O0xmNnyGj?GGzpvl6g-qc*3ZU09UT
zrKR$2^&C~FAuT2nZS`tnGmyjNr`_jagPBYwOu{D5=hF~r2-+J~P&lgXi$}hpR8QoQ
zDJK3eryx%i$EeMt*9M_9(MvaX{}YIk=JQma6F&!>LcX$wqN0JBnK<Di5HQy4#Kc7C
ziezRu-=-$M0AYP&W0B>k!xX5};n`6kIb<u+K!QJwm+5~*LP8Qv`t;6xu7U#3E<89`
zfi_md;Weg+o4b3am5wm$1~oUgIyuJcp1U9tZy=p@CQQFlQYI!QMBXVFTb6}DH}Aea
zUJ8CGXY1mkmah!ZkKC$vWaQ=FziWTW%F2L=AOvpg8wym@-|K(P&o?&??W6})+$7A%
z)bt=vp;#3<0u90dNH{$`{cm%P4Egu*XN@N<1k48Ca>l^dk-d9|&$%79VrOgX`E#<X
z2jj0B@$huga*b+!vSD-Uad&hA3<Tv<Pp;FYGXkkvfno*XU9HO$4&r)Lg^uyIS}n&{
zF$DzoEgcyJi9JSAP%n7|Lb-|Y?h8^HKYB?`Odi5gX;xOQ*^$#iBGjlo&R7PfGKe7=
zzCDWlW`rvvJ<S=H-C4B>F|@+L!V(4u<55i=QDVV~<R*}aD3yOcSQ&iiK!8b`DU{hz
zExBa)6gW5zPk>}dX%#`IGD6#htYT3*tTlxvmao`jUiF}FAbPDDy04kkB0W;rJ!qwo
z&?4v-+1KP1tFC8a(AHF((#?sA!#at|XqCqg?h9~F6!j7so!#A(6cm^HQ&Q)88X8Ff
z0Rb5qZz2DVwisAi4#bFxh(M<}o-?pfqQ86h?(pb{edmo%i{~rf-%nzqq81EOvEt-_
z@=SGDg<u^zySf7Eo&bgc<h(qXnW47^5wNG{>G=S(fSm$ZF17f)KksP&XM}069|mGk
zjSmTS{?EV+D0M*Z5K!<ZLHw0}{uLeVu+|X(y89QuM~!4Cutg{Y9FvRl;x3{8?*XVn
zP?;kfHa0dSYNB%5y*xd|$-AKzs$3y{Or29qiXTRBTU{eITl7v?Abh6MX~S2QaZrd@
zM4@T?WMRlB5N&sLy0p14KSQUbYSUn|vW!=b?j;(E^$@oAe54z%+Y-%LX5FWJ?kH_}
z`j>iEq->KoikK?$%9%93)9ZfwRpUZDXoPgB&Bl5;fO}Gx3{y3f#H1anWs@1e+A2hv
zWJB@Qoo<g@(x`GS^f}v(HZ83%w$Cp2TYiZ277lIFO4L%XZ=EtP9f$TTrJ4n!BGuZr
za=)@D4(rd1lEK2+a~iQp+vX3B(;6Ge0soc59#PTJ3fpy-kx5C2zKL|CzXW|+fPvkt
z{`79l@gh1ZiiMSxJ?m>;9<@N49G@NpI;imjlmlZUBj|F`q@1j*teugxQW^$k=Ez9O
zNO645FIENy9m=DVjFIA17&e)inZ4<}d+8>)q_L7VOARW<zdIReX=q-x`N6&Xt~=be
zaVmZxTqFD=B;+2L4o2M;<PYQ+K+8dvTJ4TzfKDq?H2n1GTbyX{C*kR=O3R;NVat`K
zXzDDoVZbnqv&jq!4_8-K8V>jO_0`*LbjQ#r6<8raN%W;05o?S=bVb7JFAP7n5ZPsP
ze|mP)Bago0ZFRk_r-lGi=*@tSyf;a&MvLT=@LPp}qHs0W-$zYgNnRI}@PtTjrH}kE
zCY97?NgV9sGey$a6mWV>#u_b0j-6F+Ti)DP&pT6oO^kQdp694UYb5ZYsbFheS+4kT
z`_QkP+brp@<dLM2ZTIscKo}-GapyI`0bE2sCPcXkAM0iRH&5cqf{#5RX9(;q>U9YK
znigEAh@tzK{AY-OZ}{fMb-Q;sg_i=O?<XEBByVcp<NDY<5XI<=(1G|wj!fU=i~Q&H
zE+nTp*FGR%9M<z};K$H#1Bh(Ca>3rl)5V0`XhOd0#ct&GbYar`l!X(h!8yx=gM*u!
zM)uz};mrk>tZvV?K%rC_<|qq!rvM|OAVaslzb{D}jR>se>FKHYN((=v{4?R}*LK^3
ziL|v=!gKCsLuGHNsCIzkZ7}n^yP$z^a&p>dN@l-1VE)cFehRYgeH0Fpj+U0zU~$m)
z>gtVI{-wY*=ID4A<-WPwaie1Pw&mfw0{H?%U6Xoljhr1xrAj3B=c-THCOE{+ck&s^
zb2F^P^dO7{WQI+i5;i=EOS3~z&TC>dz4E0`X)8ZuC=1FBU78#8{0s;QMOh>~=%O@^
zR4tET>7+2W7Qj9}HexT=rHhO0vAW6tv71{z5$W=VH}0;%at3Oz)=sHQySMh|*{Z3!
zVInk1E8nvlZO@`y23)DCbh2vTWQ*>XL=qJ@X7beSa7>~CroD0n&BG%a#S=gxa1$Rt
ze#BwW*xdiO?d;S74Dj;uA|Ob1*crB7th3u2&racSf<?!{p^BBP{`$fMp4H)--FFf}
zZ~9nC273B#(96z;vmkkxbXyj?x{T*4j3J-iMP_GjWqb^}yFQVdxL|61sBk&a@%ym4
zwk9OY$<7}7<41$-+SkNH^(@g)fRngKz~w0BD^HwL!XR^xXNrV~hT=1*SA3$!)>Kyy
z`1TFBxQNU=+IaZN5R2ue`qI)9khTCvG^)(r#t#@88UjD>xY_%fI6R1j$p`qLmuSS~
zxgno20fYhuuL1NedEe91v$M5jZb2SG=Qy^zx7W9E3O$VI%Thy8Q4u^6HlOFs==^+=
zba9p0SjXI)TVE8#yU5=DehcvTKoq=a`-TD#Ra#04$n?Y(!@sHNyS-Z!THiNbt}Xm$
zLw1RtNaxnMO3*jfqcp1aalZb_@}$9PCbsIAFcq&ud3k&D4d(WRnmW8YY)fmdl7U8v
zaJKAlub};9J5WCdfj!%!<?}`1#Eh2FzUiNtc^jO>>fe!jE-rq2_liwY>dkc(C~+2s
zc^(THq}@`UJHrUDFr#uI^U`+@o1EyXv1SeWqec=@l^xBQHi$d#ysx)Hr|`;M*!$V}
z3u5fuLrU)Erz^!kfW^sSfpR4C&IZq_3$kKO$KyIlIV4mj&Q@c8bv!Lpb;`pFwRhrF
z<jT~7<DAQby`8oThPnJ7lJIw5jaMKwC(S~w6fPADW46lz<>Nx5&QDhpi{FBog)dn%
z+U*rAemmo<+uE41TbnItXGAT8M`xUCw-0grr}Scqq;NZ!02~EXslL8`dU_hTUMFW~
zO6bN?DFE|;@=aP)=jQITc-{A^7EqsmsqR1kao1mC3hqC>n-um_D!&H@HFcg`nm|rY
z&YvJO-DY?8zWJR~*GA`~Bo6DO%1Vc5N*PMIR6e8L2v7)^xgY=UC#|w9w!K=PVk-#;
z{nu_hpMdG(wp;I%6MUQ;9{zH%J7(DZv)=R8K6XUa5JyB|5>TlB*RQI@8nKCq<`x$F
z$HxK&o&V^}?fw%vmoDW0_G4fKnL+vIY(*8$Dc_2nkCp)_JQj|2c60R(J0PB~j+YL=
zM}QQ4{R&ID5H+#`U0>Sq?G^YMV80UB%%ifhHUP5pNe5^Y$BB~<X1$$Vu?Ozm6W46}
zs}iOwW_DuP@P>*wV+QpPvDl{^H(=-^<KmS_4JA+bWtxdoxJE~YdOt9g%41(F=t|(-
zT3%_NtSlczmk@U&2<J;jCM0=K(87GM3ueicpU$cd3FwtC?k+5Pu+AkTrZ7>a$?cDe
zr;b?|5sl-o74p8=|7g-UA{LC793F6evU;`U%dy#qyfFOf{e59YyamQHt;fcgCTmc2
zGF$po&BW_c%Y~(#EP;bD`_o-U+Uh%V`>Sasm!0s7iAP77BcE?eg~M7Z9R|OEmv0=Q
z(T+6x@3{aHz)~I@EpU<5?hY1z7Mfcwr3bQQksBFMkz9O%I(b^MIt?P{zaRI?Dt_Tw
z76J<HaPwEc0^v@OoPwfjVuF>6%XNP;|JhoK>)$7nT>r=OU)-t<_oGfmf*JM){qZ^5
zFR)iB{(PR+?QvyjpA8wfYQ4Gu#XTLU0@he*ZG}E{#cH|FoY)%;$r6LNuS7Y40lw>5
zLe<OF^(I>?e!kk$R8J2;V$1WB2O1jM&{68Y-ztD%!Ozp^xU<E%jEfq^)8Q?6veNpz
zVm0XT0*9mN;6IOwZI+vSbe+7tpFniSF=&cTRE2~LbOyh{q5n*ZZhMUkl@+m<@nh|$
zZ`<t!E5jRoHf?!nnh)eLW8>p%T~B>%-(2sGZ9F~R1A_hidlR7SiuZkSYU*<93i7`X
zd|h5tJR@H}|GDwmxM+vh>=3XDoqF8KBU+sQ??=M;(;T+4usvcOJ-1qFL#BUK0zJ8H
zEeW{(r?LIxP4I5z>nP_ZTidcQ_Ih#()c<K=_^TZV|Ie3UwY}L=H^+@G!oy8&Wz}AA
z3}Z%Hk_idB%I7k38IsGQGqYVS6rm~@=)O;nx+gKU7DwT6_#J`i>7<fy0%<nZ*3hG;
z{{H>zlk0WDg@<=Bm?&~IkA;i7DX)wwvUNC5F;k>xo+uS&`N;m|ml*BCV{L_8ny^?8
zAAd6;_z~-AdQJ9QL4j80t-k(`<z^%X1_$`BgshcXKF?o22K86}5-847?0US%`c^j4
z>hqSHjz&TzY;$weVH=Z|du#7tXLfEYlz__XR`F4zyWT^M-PJZD+qk5~TQ-`~O)3r(
z2P>ATj@v_(*&=3gh+(CdT8(<pe3aCt<J&t?UdJ-)(40aAk<iJ<{U-hrpfCcltfs>c
z*8#06M^kpYqi-{zyMNng&iGjBgmFq~X)TuN|Dk7KaN`5+8+wFAspiGl>G3y|XND7x
z`xPcG%T^Q}8;L57;^E$2E+9^ctfsPQ0?>W<YbT4Y12&B=b7Uy0xfJ9|9aCC9W%9Vl
zwiC)pDw6P!3%V)VU6+`jZ+k*AGJZTgB28I9-m_<)o$XrA#LSe?I5_M{L|?3YASuX9
z_dTA>Uv2kSeCA?TX|{}icyQYid`{r7%9}u*()FRayQEX5Zrf<@{N{eA+-wkVcxJqn
zEtMnu7V>c7Lt#1`<MOa21s%dS9i}G7P}0;S{+}Dsl&ltn{`$3$PL=t@_R%X~n=e~S
zn|Yw~v~(Vj<OCmVh6YX%Xc!q$|M|!DbR8Z-MMdT1^$2|V<4oxK>guX1(-^zNUSVlV
zlsGwHoTIr)DoD0sAB&!nmezxb#x+k9MfRb=&|sc=<pmny`&8~q3zE|Zw+Wvon&<no
zfpLp8&v)cZTH0={k0!u8Qu8kzcB3e{xClTJe=fJSI(FXGu1J1YyE`Zqy}dQr8Htw-
z_%fGyq?pESn3+G&m3@V0MyJ*<KKR}t=c!O_{qi6b^80t*&hXS!??et39p>nam}3<+
z(}>ln0UU($3-$AL>$nNh3tWDUlW~fPDz?f(H5nozH;AIrlym^TwPx0yg|Y&f&ENed
zyLV({eId1L?kpXJ4oNEoSNnP$2qYwFwZ#Xm>`Y>@m{?d->qQ_aq7(Fi*u8r73ivEy
zF5A`CoD{gWBK6PJh;DA_)bf~wgp%Q6Vuq_95)#`-(Y?Lvyqh0lZd{RxksTcVc~Mp_
zw9*0!rK+rPN5^Oe95TvVY{NDPpJ$%-+B8FzH4+>go0+fEfyHQHmUQ6$oeC1KGL=s+
z`efnD4D?U}!?_B?Y-Z-a*FhO?4-d;sLS<1VMCktvr=TO2Tc~KWcX#UT%1@S}WuS9#
z;BulSCSncqd*TiywYNczkGbrB3%?#PHW+>UvgXR*cu8+<ZQb0|#N%?@WWB&)Pfkf0
zST{)~7DoQ&c&0=f2^kqPq-!wTU0HeZ`)jhp!^4Y<3oC2u=ac6rCPqeCr9;5jz#ts$
z?&js@Qegzo*V_0T&9g&*@q5d1ekK|1mOuvJonA7H&kX|?*UZq64E>*<p`p<Eah^AS
zV`4BxH&S?A0#OJ|z^^b7i;IhcP>I}khKX{jc*>!N67^6?C#27LQ&BD7U5b*4?W=IQ
zFBM?5YV*R}o?l`;T*kxtwg}|NGB^czTw%)o%3G<TS?T|AcK+rkf!ZA(yPJBdl)nC6
zi1*_+i2DWl+3jZC6>6h^fF~N7_d-qfJ~E0F6<dMT14xyU5;p_{?$p%VTsgX`Pe=1A
zupg*9_oo7#otr=;6R@qqaM=l`Mt_Xg)|&eMT9LOADsY+$P0#m&=2}|jPjZS;JRGX<
z=_+(Ec(EkBHC3&RF7bC0ye{}BbB2r6g>Cam`-|%DeOh3+pDyw>#1^K_8t_#JdC0HN
z>B_2y-XJ<$Tsr*vb=DnT8qswjS~C22Uoe)HO+Fz(-fz9qvO3Rh9Lrx2H4xAA5&>a;
zVc}qJFEKIk_WoYb>kiYnBv+hVv2f~7Aj+HIPuttum8K)pi|)|P6yXq%%W7(%r&-(E
zYt-3h#2x%$T%4So92!DtgB}#+DIlT%`T)q8E7?4BL$-|#Lw)_X=>H%iBPX$2)&Rei
zU9rfbnD03Ji@T<#CNMB?slh2EJe*4M=n&c<gglOUQt^!7TRjDI>9K3A=FWgT7(lnS
zC9U;RRh{-QUG6V)RLxh$$H!O1oXQm0`zW_%U!R%^G<JD;nVloB`FnHtVZ3j1OwJyl
z17BYV5)u+no$gQqpYtKkqz)oNLh2tC<>dgvMQgt-NlQzE1XRlU%mAV>2pLaU$7ZoE
zGBXc2#VW>mx<8XmZs#T^%gr*<(mDsKi2`0c5)c!MsQW8Wm?5bGUXmDvl(N4*Ym=;a
z#nHD{nZIWj5r)OUusy(rEH;7&j7SbyYP7p!BP2ve_pNZ_LdO5r`RQ;zp!K=C#@cKV
z*WPW)p7wl3cXt8ja(}J!75LT8$l6X&XXhDWK)}r*t90tm5FBQE^6lZSyGtu~r^vpx
z@luW143^ig%~ps@b=GEd?e;KQp787Ix3U#!M8i7&u5sDH!o6HSC><dB;w*A#fHz&#
z{##<U0)E9)Ni9@D!fXy>p=PZgt4KR!p_bXzwm!4cl-b|~AHUr(VI0GsOcAX0s(r?2
zN}go~!qNdt!CIkWMwf!B)bGq7)2gc2Ae&<RY;2BySKICDe~s)c%+CJK&OQQO=wfez
z^UETsppCx1KHN)GdK#KbGAzWdV$IsjtSnxaW37}Q{bsZ(w6QQSFcK0Hki(-R71}B2
zj^})CXO}a&(Ud8CZuYZf`adnBA|s(=uBkju`?KYS&_i?g1_;3Y>8doffTVdBm>Oms
zAr?-34^;{H)(i8`i>-;*k9V(_wB#YPm0|*>VNa1{h_Q$e1msa~J%^3%TSc1UQZzw9
zA=@(jT-hm|Me7AgN*UV6u^(ZoD8yQ3#wyFHI82j!du$L>)0Rku{KsU@omSTjRob_a
zc@0i)z6H`EpfSb_wD0`s4vde>S#H(!zN=dAMw!57xM5Mxr;e4p7jdkT%<z@}$Kf1N
zjYF{Yf@*s1wwg+!fK@w`_REUuQd2%=F!jrqI?fy^33<!qS)1!3U4Me!<!l_%S~T$h
zOXCNJG;nN3jd@Y5*}rS1vNO!%bzw4++N}QvVcS|qXSv#P1}I+0j~~Q>-pC(F(QoeV
zB(oJ2^+Bov#v<afO_$70Vly8PBjSZ5Bqj!b%IxgyB=Np^OG&wXI9JJoczt@BVeWo)
zI7h(w<;8pR@!tT8)TuE6p=lH^m+600P>2M&85yZyZ+`~esfke=Q4e4;1Q7|T(Q&VX
z{9LQWvmWH95xSodHFOxaGm?dw+0M}sO3lH+uY*5HyO3kNf{2OrxL@u!>uwh>%3ci%
zxL=4<M#JcR{RXg|8WRzsqoZ>es!vl;9)4JCz@$QrnI#&^lga!ImxQDhd=3DecAc$X
zX5P=AKQ}jxAQsgP;Gcf;Li1b4MJ6gbx^JeAQb0hUdRj*vUP*~I)_H$2xMw4B1!u_y
z%fZ1RGcPZ%x3|~qe0%5<3m)nHR=loRQVz8R_>Zexoi?|1z#1^S@^Nv;l4zAdoSpwc
z^7n&*I36JA>K17Q3qF5RcumaLHk^XXmRH5XDyXb3YmChlm`w2W@CFtJQe_>|9eVnB
zeY5f`Nhh9tv-T3Yh|=3zT<TAMYyt-gqDZy7WlX+QtIiCn3X6|`m9^a#A~Fih2fDSA
zGW2AQ3=bE`?%W%-()GXkFA%1SzH8G%lDdo3XKPTz!i60gN~ZDeFND$rvV|WWR*z87
z&^kMPe|pnvA}}!#azWPNILu+U&wK1W%oMY$x%b0L7&R;`EI?HS!O`+?CT0KIcpwe|
z0U^l=6j(;xmS3r<Pdy|))Uo}+Z>ajW>^(g0bLG+~si;;OT}FC)sRaeoe$M477o2YN
zL?^rjY{1K_NgE3Qe0piAS@_<Sy-HrmTv!-37|;9ZcIWr+-!U;UMMXss5$KkdmJrEo
z`?JkH$!sX_^1D|7UfCVX+SE)XER`(^qb!I-A&_j|Q?Ep>`a#d&aQpDfWay0SopMc0
zQ`vhZ-4(@J`)%pRSUMCL={%cO1`d|~#|MXe`R{X;D5|9#lNj$}$03rEwtG<(nzdi0
z;tPn!RcTL;YP%rRi1$}`JKIUti)JxN8pJ3$*|9CyAp_c`+fMEc8u^`_!6NqDhevL5
zX+NT)yRMIefBwvS@N^&kWdM<t<wHV3{P5}9SwB{`w5ZME=XsY{#QOUAbMoL|3j@OP
zgd~=&%eWV12_>Rfa4!)_1TeR@5-G^PJJ=8QI({<9yqjeX2&0`X4U-Hw-3SpML?^UL
zNU^4jO-kXn6pl)<Fxu!2?MypAJ-xj@X_b<c1h=xrVv3fRx6$MJIA56-a(jEb;&rX9
zrKQ#C{n)E+By4lJKh>#p3!=25qGEh}{O<Y$jg*ZoMtM}k6@+jQ3PBC1Rem4-o{tCu
zlO4-d?KGn!FaH;G>*mf5Fx6BP6e1!bkrPZhP2xKAT6Gbf$RML6Wo4lc8g}UuA&d16
zRK6V6^G2qof<8}8>FKMW96Ia_Q#k1~xkjd>gj#4dyDT=v>YvcRib#J={$5P{S{?t7
zqOu{$oMx9!gX^imdUZH1^E-C-%dQX{nPd)l+r9B@Kq|0$UxGp5Rw-1CY_nf&^E))C
zE~~B0HJ|V9M(_;{MUk0clNm`9Y@ME`E7Y^V80g(Pv)kxyo-P*dK!Cu*!<UzrgIckv
zR+^svfi^bk>1uyU>LC8qON_B+Yv5+{&3oAwBKmC*==rCjqP8wQ6~;HWrXVA>=BjD2
z>>UQ4A-zU*4ln)uvY+^U?=Hu(kxFzJ1f{6IZFA}CkycdNJ$qM!n)#n}jP+1c{AxM#
zcP}@4*vnX2dbC*cRuc`4oNA^hPqdsCOEk1&x%nTYiK{Wo+(_lmErbjjAIQJ@!SsHu
zrjmoC*WtRH7|gzZztOFuW9!7=ReXQce#$ZGRI?VZ>kaL`gj!F5XVB|21<(aRjM@#5
zvWkiZhaFT_jX#^+5&8afY9*jh1b-6NdT>6Pk5mwacqPm#nX<)hZ*9E_5DpM72cHAV
z1<aJYyE`f#%O^QGv=2r`<bA69^VJ8V86RPgiFm4j8sac&xnAz8C@aU9U{vOOh7@a5
zzr$096=Fy$B*M#omrt|Q@QRPWx>>Y5ftH45$Vx&+#pgDgjec;lFZd-Xvx3+0udkTu
zpXKZ8tAzcKa4-$KcVBa(qBb#T{siWh!>mn8R&^v%$?-5jIKOkft81wtQT5Bi<2@})
z;%Ir6-Xt|YMAs|(`Fw;ToW$~^={I*@$!%YZcuZfP1;m1#Qkt6RI|a!Jof@Vj#S7RX
z9cwN(`$)y$676aw)M~A)AT*U`4;&MdaRh|Pu`Ehd)KbocHUr>c9S^Cw97M~#8u=(h
z7~=hdQ&Ra9_VT_y?tc=cmFQP$bpDzxCDqD%e~~}WJ_%(0yC>t|(9oZbj^2p+%1U6P
zd{9C+Z=fKZ%z^UZ{_1Gt7dKqn^0ELEQ@AJJ<>e*xtf0eL<``~f2n!1f@E=aETMT<p
z6Qxy4b(#UKM1;d-gv}?jnZLsh85$gHd49SFH8eBxoeAp1<Rs<?U_nn>pHb66%>{mD
za$=%Tx7B-RI0fKaSj8NIJ?l!dN3CH`7!i--?sBt7nt)e=G@6*0*cIAgqZP2OE^((?
ziMSH15qf(xQjv@}k<BXf+3M=*Mqj(y+x4%Hm+tQFAa|DsVwC#p>+21m=sN087pW&5
z?9RrjQnIthN^`wuR?)6f3(T*#T@$YOTMDjZ^LtntJg~WEHR<VkKrz^4(1>_0fD(fQ
z^SC;E%W5^XCDz=!x%nZZEnHCbvs$`h?1)qve@M1exhFRZi=JhOdS#g&3@sJOV!i*>
z(ZI?$o4rGZ>Yw=rVRlQ)7;S0@dI;SEvbs9V2WRJh^U1JPr_ejLSt)<^ijSS6M32G`
zV)Q9STOrf{3CV6BlgCB0(b-0n3_91d-T!kr?9sxXNlb3;zvplgD!l{#8pTV*LxX5U
zHfUkB?FZcLe8eLi9hqMDS3*KU;MR@OPHE*P{MXt<Ge!nTx-#wg*;xW2d1I|8TXa@|
z5-oNJbZ2s(rw8B=SlZy)hKCv1*g$_oOW-??e#SSnu_>Ke?Kgmt$INE0K5KZdgi>j$
z_LfRO2bq*LTBokewI?j9j_a}`pz9?XKHSZN!(J$Xq#s1BB;oG%m4Ts(^#XQhXI>yO
z&ChTgCCsL#8y%hO)+7{yvl<&t0cU!gwxz~?T7tC1d=pyMmnpworDxm7<+rwCdk_af
zVI&Ubfj&x5Ql!<w$;NPVb8L2>jMv@QR6m_Aj^=m&&BBp$cljn&uvA=JKBOyVo4ot-
zpkK%z(ZSxVJb}lqqjTlCI*SE+qP#HO9GUQQUi}n?|1`^uhAvUJ{Fg7KDQ-@Hjn|nk
zj+YwklTf0Y&*x0jB5|0RnKz-kNypNuiR;KnNW5b89$DSrFUYcuy2C(6Pv4rHR`9U1
zJ6&z}2Ps2)-Qae<4f(QI_cne21{wFgZ|4K`z}yG**)pTPsJ9;jF)=Y0p~vYQEf8>6
z{r&s5&i#_suEXM?tz}@l7}>*=ZiFME_gf}46BAQhcNyl?Y!AL>mm)B5D&yDSa~P#W
zkjkG!<Kr0k<)hHq>YO6RxZFSO_A^sNyh$YnAb<(_khH&GnGJG~Q&9oNYBZn7`F9!w
zbiWE1S65dM!~V^9CqxF!H=ct@pxzdijF!E1K7#cX3orBH{rXkDRX{X+x@5Yk{;EL-
zy7Vyb#v|;)(QKL2%`IX;;c5zY9X|q5W&d$AI>~r{wsfXI*ZAZG?C+d?axE7T_8(Xw
zcDv|zmw$RA|9R!d_$QY=$zVlbF!`kk+I~gp?6`v)UyK*ERNnxd4_9DV?aQ8p4{A0h
zT|cncWD1oFfIS81q8f$=F&i$^jECR;cNwBWsSbY*EZ)Z0S3G_LRe^}&_p`CE2>@%{
z-S0rhK#$?JTmSSUQ&CY7Xio7QIm<xC<$S}s_}944Njb(WiO_8$jmINnFfZHv?I9&4
zo)ykDlJpETCNt>?35rxtC#|s%LLxVBZ`gP33(07tZ-rz;E2=eqQ#<(IdKUC|Yih*l
zTpS*r<&n}AJ~;U!@L5_Sww>=-Y)c?*(xAh_G&SG;#%#+|aA&hFxl}9FG2a`_=pf*f
zuB;f;X+rmTtZom%v4DX3k?__pOKgkZ1ABXO6qE+=7R%SHWyxXMT}zFU7_3$1Wa848
z6IHjtZ>-P`^Sh?>kuPsf5BSeup-0*GB6ZtLf4d0)j6X>Gd7T%ZfS|Fyp80kWphwZe
zUS(C)q)1(G@T<OlF4w=Lm9IMp##+1|-7#1P6PU?ZS)+6IZ2IG7B5nDr4|hUtl>z6R
z72$%+!q|5?S$@1d-+>MVfxG&6cL}rD>ht_}?a%KPEk>&AhkLVsb@nFz>guW!Mn+Z^
z#3BcDtBFYQ&T-thO#J)LhJ~LcSqC_z^{2^ujaZ^~ZS?e3PfkkBZ80SF&3^PNqY~_A
zHnSvg2Ihzo*<hLdI}L}CnmPf{f1(4g_XC$Y)}v0Th2H24)3Y_Ko}MqGw(TtoKBwqJ
z4%SnZ*)+1?<BN|U7h81$2$et${rn_Get);#8+oR16oaW%4?8rgmC@E0y=8+&^cA|o
zuwbe%M4IUSQo}iKk=M)1@%ZQC{b|F3dpX^>h}F*UKPX+d=eW$7!Z;SW3dMn1s6!$W
zV&QSE9BiKsrt54o9>gUj_fXOUrjIfL;;Olq|FJos83VMm$@>WM4yT{d8^qrBP;y^<
zdU!Y*-X$6unr?-Wgo%lXkWhQQ!;ZMI3C8Nf?KuRL#>mfGsqk0|)R-XWffM<AeVqn~
zvOuK}dS3K<_2J(VfC@ozlUGm}Tl*8lq}zg=?)`W-7%mz6>C-1%d}xzR<x@Ye(+C}u
z=3$LCSv=?vP9hvDx@vunjWB*<HQl!y%JMo5xL6f(^K9aw3u$qYt9G^9`{0r#njPOg
zpY(EdOX?D+F+?sk?;V*6<ePBBC7l0DV0k`!9>lSb`G<w6dR?iTPor1vsurFS6K8ur
zZw*MY{6Qx!`T0E$-7_LI923#=(aFxD!2L)A@09`q$~Y@$Zc{V-<-s|GkT-`E=_}0d
z+=*n)_`y`|yJCm?nzKW75pRKFRkC-&>_*}llJGw|n%uGt+gcx0Sv>2MDYJ%#@=*wo
zk&yN@Yh!A^(2xiy@0l&&%k-3d4Nd|XWt2vZG2h%?xUoS-`buGKt)D{b2P^B|SJ=D7
zdi$*M(R3lWvvtrJfV~*$={;}HwgOQIeuRVoK=>{=R$(lKp@)Nw9aU_@$ItJ^m#Q>}
zQ3m%Cb#r?gR-QJN(`NbCd;Jce9*#KBwU%dZQ<x1AHoT{_dC$vwp--xGn%(#I_68S8
zUlAmjtpRgyQLT}!IF!oYn4S(XRzmRs>;_ohTu<-4$zX!6&tq&+rl@+@8($C=1o-$G
z>gr=to6Rki|LS_IB*m>a9W{0D;NW0yFD}138y+bsw-o*VLUtzxDMbOdGb3T)4v^}i
z;lwfq33HXEnx8*oVqtZ4ce5bOjA5!Ma$Dt9U-c`OB&MaMMMOYSY_K4Me0|_LXs|<i
ze&QJ#7{L1e-kh7AeOP&ZB#|O`qD$rT``}ygU;z1h_I0~-_iPLOA4#Pt7&e=*%y$oW
zbjOP@iQ(#v*m9}qmTHG9;e~2;>n~bv5kjzGJ{Y`faOsI-sI!O1VbnV_!o(pXO}F5V
zRc|2-Cox?8@QXi$Ol-80>f*9oPsk14(2!p1yY+(YCGGZLJBiQgg3VjZioIe5O1S@k
z``JdgxRigZASz*7EZuAi5vz%^Pm1H01V#g1=g!;nn*%0fl9FiN;mpXMj~^g4)*rP9
zF%b#5e2X>del<GM45$3LyQHQOQp6Aq7oD3VT`)#O^8eubcrRtSZ(nQM#8^$TQY=*R
z;qQV?D+;jrl+l-<)D@wVnhXC4M1gDDIrn*fycY6Dhy}F$xg0tRd9!mUne*j~7e5KP
z?V(eh1?~?k@mNiajE(W|@uzQ$5Y}}DQ~5Q?F%pxKa&mK{iQf0x186KW9*E2M7(^S}
z|C&tHjKgUlj-gt!>hF5M{9Jv<r}>LLk%?R!7-~ii*7xavrP$`WRu+HZvx<5spKMBW
z4X4a67nC!L5IaKjh6x|xk$%KVI_@izVk_O=W`~V-2H$meWBM*?-35^t2|mc{>#5M^
zct4cycgeuQsFtw(V$08~OSn4gx0(D-f|ENwllvoNfT+l(l^wYJ(^Wr<jqa#W0x2p_
zD{D8)8GMXat&b*bApN98uXh#9j74C2d(&Z%2~_9Xcg?0cgXiIJR=iASGd||0pb<qy
zH&y;3<asaOKY4nMqg8KE5Mph~M%4Jj`RK*=wz4d0vzLd2eFYDhzX`ETkNkDv`TdEg
zKLS=<j9wSw+z+hm8MAW}vNNI{;h7Tcg(`D^!zo|C!kQ#Ay?hy@UTLya?+~;&D^0u9
z>~SrQO~O6i?BSxT3*DD{rNL>SySux;pO%g;1i86XqgqmI4ahAvHunAX$;o_mp)@5D
zGV;&w-_b+5#>U2+CYSRR$n4j@zb5na^7`}VPamhhIJw1Q9kXvLzsLOid`?bIU_byj
z4-e?2hX+r4#8(8Ugj}{afAxvOO$`mRlxh3+N=izM9s~ph1qB3%edFWRoHWauLAov~
zUkxL^fHgJU`S$G__-w`g%x|lAX<YsPTee<aU!RO;4*>ZvFf>d|_FF^)K>&wNL?nY;
zQk|KiZ510)*52FuJs8`fxS1u^a=FnZ+!KD+weW*sjZm>FK%3>+*@Qz|kxl6op4h(M
z?z!paM=@T-ZZ_5Uv?{lmbwd8{%`vc<M4dVIXT%gS`1tL1P`~;!TVhvK>i4ZEumAU4
z0DV6W>-X09kc7ncb{NZ<cg(Ln1^D=E|B{Mlsv2|0?*0FkR@Q93fJjT1`3RZ}wl#Z{
zRdmP+`VH=u?f$PkUElC;eeRB;NMM0ir1|yhy$SL{?0C68&yS-~7=8WSDWo*duOEZ<
zf7|WIN+*4bW5~#TDJV$Dt;mxly!(GH_}mhqj}KmSl9p^_bV2GlIIA%sfLt8RF!Awu
zZuUlA9?XpN^+if%A0HpTp_JCk(ek+5cLKaNB5*(0-tNa|k|C4KK~9%$v(f?_j-#zD
zI${7SDryiK$<^g$u|k$SHFQ_GgX!X1Pj5-dAE~K2g{sBSM`|F{A`#&bkn4aM2Y_E(
zRP+MYFE(}xm~`l--Nj34EA&1OZ>iumqbXw>qLQRj3Qi8_-gD-<^5NnseEIUg)H)gd
zlg)aeX0ka|a7AxLV1rQ`ngRN6tqp{4?+`g`IOdz?zAJxjm|U$KxxnY#-aGh6{Vn>9
zO~;GJJZgmy>?y`Kzqk~97C6Xoa8fl;lDemhMVA^>z9&h`<R8q)m=2BG%tlaQc1*`{
zIu|V;Eo_B<Kc11pC1%9uRxI`Q(vd}Fi0xQP5!C<sbU2sYYCDvC{`d%gxv$_UKu@37
z;uV0yn85g1KKJr%sU?qdr@{UrcQnXSPl2afvAH5Vn*r>s85M<%sl6#F*Xxp9aFK+B
zuCOpaL-RSTU(m+~`i<;7U(V<PvURYtdyN=?fPg?uOuQ*;GCj%S%@DmL8}|41p{xwL
zp*n}f<oBGt!9i(W-p01JwiI5MC~afM*RsEcWm9+}nU`*EZkSqb)<ey78yrD3OfN5I
zo)felN#!>(ecL_2$-yDu^W>Q;n{sh+5hJ<P8%dTM`#6b?b+k}>eSKY9QPB@P(a4C4
zgF`aFe;~-gJ@k>{Y}&Qg1OGlf^VM#2X1AVKrp9cjt1ALkxj%*`iS{%8ADzx+u`AW`
zctuR7yNkW_^mNfs{8s_O4i4wOzP=xWPy@bwi#QzZS9-ydBpi~N`L5!rP9y|-ut})6
zS}n(Z$m9CBdAb-jw9Kz(Bl7;&UYMUBj05`$dlCn{jNw-Q8QJxTnmFbwR0NrLs-3^L
zvkh2@iSmU5&9yl)uQ9$}I8w)o%k?C(X7k$r=$dUNu(Jbjr1g{6<-I3Y@~{4j!{B62
z@cO~?7Z3c9b)NU#tNeVk1?;u8h`zsP6bYeqpD!u~9<CP7OmE6A4xEnUiF9<h+%W3v
z<*Ctef^1rgN7-eBg=zUpeYGRQ3>K<C>JW#K1f}Yvu+7h{P11l`%!Fn-(lLU@7Fsc7
z1OeYlEGR1RDpjCsv#-t;CRYxwC_dli1X0+rNs~(l>AxofeK9e)(&Y^N&%(%!*0-FT
z*N(egPhJg{L{u-isr)v`GP<b(y&{z3C!|PqQM1J0TZ;d;sVrgFNX{?s$bygvEYL)@
z9%f|n@RB%Yc+Pa#?)`JmoYq$V(_G`-LjL#3F<b)3(AA6Qsi?TExkKCk^{&+$v^A6e
z{aqHmNdNcC{eB=5G(R$_Ew%>}pOeNxzrM~Mh-WJ8+LKN;-Mw+`+ozapm<b37X#ckX
zwDzcsa>_Wyb|uLC??1GxURRb;0=#qtj`e)i?M%#avqyXrDcX>ib^^!Dv13!Pj+m$@
zqh^iOT!r!4+M11O1>@urtj$Nvm;Y%!yhyd=4JGfxy{w@#GIC;G5qwVd9}o^F<_9?d
zpAN37+VaDaNAcz65+}7f&i)s_+P6Ra|LZQNK<8Z3bq-+#f3m1{pDojW7umbG=y`QG
zmlTc!J#fkw2Ck^M`10c7*RNmLz>+H~cg8U4G|l$(^mKFxlcM9|;<8yzL#OLXW=G|d
z#!BuCCK>{8Gc%hl)~vm`am}0@hBnkTU`rYt_YA&#8QwYXGOz<hsr7E3E{@}Rf6B7W
z7iOb7w6d%Wy5H~zg_zLLA&_k#4Xh0e6zh?uE_oOjib1jgDL}zz1D6S><oDkLz9G-1
zC(9d2b>l&PX>a|=Ux-5}U{w{=V?usl3Bi;9Gmi~323w=urRii`jn%#|?GCeFK$2gh
zT{}6WQB6&qDIQWM&-RaUv4O&<hSO_vBwE~m`X8g3e10w64sElrz9Q90J<&~E;2v=s
zPSlrWd8Mk#M?5k%W(SO0-ITSpHLwQE%*?JM0Z2F)FZ7L!E-v<z;%=4wH%Q*=wQUW=
zXDjCC=kEb&X$AT|Jv|*RaA)>+wcS&|r~4<~|Hs^0hE=t-ecz~v7^ITYDj+G+QnFBy
zZfQ_J5RmRxB&0<I1Qetjq@+uv1f;vWyZbq(d++Po&votly+6J0@y-t%iv?@0ImbBT
z{~PlhV?eU)2|aUw-eK0w9Z|%63;*Iu3q+c=eP?$n_;Y;vYyTVQXmE_FJ{D_v@#2N-
znPX0FZYv%#k9VP=p|bP|`kai65{dFQHa5&^`Iy;wezou&d)w+}<(?9AD=S>=?Cf{%
z=H}()6&BLr1O)}v^YObJC@#;3SHHP1Nd#8O5Q<d9+P611BbDvWf|S%#%gdRJGXn!^
zWvBUuohg2(*fx+0O~;iuU(Bz*P-7<alaiE7$sreXR)H_Jw)XJ$HV({BRY(RsBN5JG
zXliL`sS_d-IisSgI{r;}W@ZM|QWt(0t9BOWxvh%{qiJS$qaq`_96P}*DpkHdecgj`
zHxL&MZH@p73v18yKGx7pv^C$F-ZSViTw876WTmC0cqo}@{(fNl;Zi$;=8vzrL8uW?
zZ|zo|9!Hr~2xA^^#+-g=ng*-CgpK_O^E0m%#_HPEd}oa}j*!DfLP^O%kkCny?J}w0
z(NcfjUTulZ;#%kCYWc1fG@YU0?R~NHu4S`Tug_t|Uc5@%)!RE->2^BbnOs|2Yhhtg
zqC=Zb%xy|$gD2YE-kxJVjxvIl81Cr_d;eZuTf5R>Q@?B;#Qj4|6VQ1#Zk(g$F!=Qe
z)WFHkpjrH*02C&qrWIgrEiJ8<mX=449%06=Pu5T3IUMeoaP21;N-HRIDr>vg93O1I
zK6hc_$G30a!ajU(-k%P)zo6l%k1==kai!9z-pR6=TTM9$0Riwsym4<<aCz!tI^JJ4
zLh@>rYYTIq>f|SgzYLYvxX9CCxCcDc&dyFiKmecZ(tXTz`?5ctz~jrAx-Bj&oNOfv
z`8=S>Q7O}{4@^r-3kxGml=mr&jEcJ9F=e^mtL+wmOM1_G4lYYlQgUf&DM>QIa-r+?
z*64MqqcB@BF`uBI)~Uvjb7#+vI4&|DMVCLB3cs}WnWebMbhre*eX?YYbirv*P5roC
zl=9)DM>L?z)CnmmgRb8SZ$dV@^k@U|gF}Ar$K*OLie0~X50bydW}>{Isw#<TYH2Co
zp>qc}9Tyj}6+31uTt`oLH?>C~8LxXXqfv`o6PnA}`ND<J=7WQS)7{e(N>oF2_4s0T
zB{KOsCnw_W^PhI3F5cEM*XKkrk#?%eJJab!LGAX?U}dOy@1cVOuPdAFQlGoK`^=2K
zhpdxR>5Nm2w6t_)X6CbJ&m0^aB5#$Jl+btpzw_O@hl`@7rk<L-FC`_lcfO*12wWsX
zH7{Dw#SvLXC7ji5r{BQT)O5BrraoxExMLfGcV9&g?xY|6;7N%0JF^Iho9{PgTMG*c
zs6F5-*FK%0?&|A%tBs7vs->zCZ0#qQ{o-3KdxN_$H&=BvuRUILlJ||irV+^(8LHza
z<?mG$6}v`80&yKTTezW9*B$v$JY<1?x)2)LD}!?s@(XxJD@FII5SZ6`GipY7$@7M2
zp!3!op4R^UY>crWJ=fE!SKvvLeBW_|j@G~wAq+r7+rvFV>j0Noj|&LEa%~?P@^{PW
zs;k4ObfLh-H9tK$esci_a?uqbdN+vIll4K1z7hUwGHwSUYE||ZoL40@;|sbmk(DOK
ziKY_hsi<BZ&E$A`o_B2rR|yGugFCUg@9OG`8N1k<Jt<|h`xEZgFz`N=xs{a&CbI9N
ztu4(@9Jb*0_d@*%VSfZh#t1$AhHR6ro}QDv$skN>0|NsE1%;L#wm@7DS@=aAIieOS
zM@#hcFpw6w&w9t?j)s%dA#3H4J1!}^{uNiFM2NworzhN~7fXFP;C`SN>|68mIXqFX
zaTgXAO3cT<AFftv%gVmOr8#|GUAkIfY+|CRuI^Wf`TE33;qfm*=>1Uf=XQ3xX-es9
ztk~m0q<7hoWB>QIiXkB(+$IAayS>}!5)u+k;Oz~V-Gsk`R%%8@LRNdXk%#QFXVj=U
z<SI@~-xL&V$366eq`KC#T5*__o12@Iq(4&Tz{$yp8LO23WSo26A`BOWF8sBXPRgo5
zq@k6ui}oVA@E8tySEOXj{e#Q{+7M^)1-R<$l$1S)gXDO4uZ1Gow>|JDF@-UuBJMt<
z!o~DNZLm{v86(YtwsjWgHc3`S#+Aw(sgWwpN>_3r$G~26baZ=1N39Cy{f<Nld>_5B
zs@ImqWTUj;yad!7&U@z0W1o1f_yq*q4(92OWGg_<#K+%2y#QVN1_R3xs8vgA#5lVg
zoN{}r@v1XsMZ2Vg1fT0sQE+hZ1Dg4Th40>cyu6-XUJJe?qHkAYy9q6>u3hgaIk|z}
zZ}j^98bnBNE1=Nqyu8jIKW=hzcK`hOv$a)*A(ZgiwISg0msF-VPEO9DFx`wvs5zeh
zyynpcA%x3pr1>LcnRk3CF5kW=GOX*OZang@ig8Whj1YXirM@jS)0L{=jZLnmq+~Pu
zi+rdO-v@m)b<u5*E%4pSis?|5(DA&?p2(HIn&*5B7qN72C+id`ws%N)I1v#MH{5=x
z`1anquDbf*+S=N=3)o|awV+JAy}d7ceusbq$<3_tnD8|49mFZu>ss{J;2n5B^5aKq
z8=LaYUwnIh-}MMWXr(qbH*2)dx^7H0f)<#Zm|)Q;daAFV#HqhA?sTN7SMczGgY)Cw
z&-eO~l@pGpS>008(<jY&6q2Qn*Xt?Q!(Ux=Z}{~~tJ3v&ZM+8jo|&2X+_`g|ot=>K
z#0A@8K7O2=oD^Z1C?Vby>m;+haAf!<I2h0MX#Uq{zP+Y%Q`kmQNk{;32{F{s*~oS~
zHeTpT1u4_hV+*7uEG%sA%{^i-VtkH7v?06l#8>D(731?i9ZDM=MSqL)#$F~`j>^zz
zHQL(UQnyoAD=YRB1}i%|J2kZdu;qJvd<HF%o^H=CqoExHqhcEbt+?P51>5$wkbM60
zJCV1;s%MReI2!*AWJQWf*K!pmLcdzbzk9mx*mUcbhD!@8Mb07L_!JH2_L(*RE2JDR
zhKejSH8qjF6McMqva?rbW87T#H=b`qQT*<;R_49@Gp`KvzzO##JI)|)m6?xq{=RNF
z&VA(i^A&Mb{+T~sRiPze{rM)w9g{y_-Fanr?vGcm&PZPW^UW(y2mXBZ6z%`jQ;H;E
zr7LGsaJ-Ps_C_hZr0h;ndiwOKxw$zd!O4=sg}%qq(zfR2W9B?MIYpJaY;9JqfzBI^
zbo%=G7+u{Vwh(SifiB9GNN>Cu?5oj@i4ZL3I*W#8e^Q-{HKw#%PwAGSl0$RzCNjPB
z{Q2|8<iDC4LAch|PLn97@tVvj2pH;CPF;XYX}c_Wy-Fgby!`X=uicel1%}YeL@Zky
z8<uu<tDPlU$ezgM&ij^bqV0u_9d*joLhu<aYwJ!gh+wLD`l{;c*RNj(f3B;qS11e%
z4?o=BzleSo+{a|_TPis*DJcV?-}$qz3k&V!<nRu4#4ccy-QnUIDX}reF=k?AjS+DA
z_WASYoSd8oG^$1B<B(!f>nVg>hx+>?T4zg(iuCmKWVw|T6+JvXRn^oii#2>6;9t9j
zi0(*#fx=YXm+cTS1o-(=oWv75zJ9&KrPOKG(M_fq+&0C}%4!DgclP!DoA?0WM;lG7
zdWL)BA$bO^jt&kN(cO!Rcn;zoUnXQ)+uRhv44@Q>rh5DFBXP}w{F~j|3=EMx7Bn%f
z2BYoD*;=<S<BE!iSx+V@PpL2`kcBDykfLME36PwToI0(`yeJn;Z#G_}EM#hWx^{Nc
z`wB^}aWBgPt)>9M)vI|ni#>I9kKCy+-HG|_??f@ljq^a_aB+4<Kl?g9e$wYE9WKgg
zXNiPO2R){BcY8ZCC8cfPk&Abs*1njGO#Sfq%uHBBgxKa1u1o9PCl5MTBVS~l^EbG9
zcyqB-C~9Dv)E5nHEluJNXgJP({~jNbri@H0h&%#9!j;iVAzE4tGe~NX!mKPT`tuBA
zOifoH1>m9TgDC6Ovo%X;uU&F+agq6aFEl2Gl7s}phP=G|_aqgc2kzRZ$E$9$mc`m`
z$2P6T&5e!yWe!%hwzeRZ#l_*IeuahH{mq@pGFQ>r41SSCNQOm6uguN8FgE7Xt-Dgz
z4ae~CF@)!E7EK8D2V-w=pp!G?QyCZ;@lcCBnF@xR8i~>YS%k;?t#0rqej6Dfp~?t$
zgS$_p@_Z_IOK92)kSdRwar6rpW@lzV&vvx5NHGzDY>#P13#zxWvf^{vc_}5;Qtq_-
z!Z$80JssLt1oN|?OG$37JWKfXC*h=JtsWPz0?pEgH$ehdwY9dhD^y_$1WI!9^7I6Y
z5DTFlug$JF@NJqFbl7-c9MIa$8%N8=CP#lQS1eG!)B`pC7Vk#I{!G-w!~~~t50!`Q
z@_=Vy$JPf87VR7z&*EZ-=g2XQtaAVHR_1L8b|AY};YQrwyeZZ&efct@veFIwSWPXm
zyu3U)Ik|^xfv>E8mX41vit4Sy<_y8LYoB;5zSq`z4v-toIfYfw9JnfrSdl;FkJ=K?
ztvJl%4OhjkRTdTzIafg`8^29^25oJjs`pHZ;hV}z<T<Ijni>aAomuwG>}-hfqd+ne
z5)vP6nHa%g0GWaU0#=4laU7f=#8qm=Z{jD)?~i*^UP5=z$jH!2m1_yO&W($LJFsu>
z?6iVdES`wZ8Wt8t<FOV~hsfnN(BmAJi``BIy=(U8;)C*^tZO6&`X)Wx>coglGvsRL
z5LLd(fd>v&TvTLjYdcZ9umD*f8IIORqgK?=XilQ%yc=<aT2W2S$XqjWO|Umxo37X1
z-u~;-Tw9xLs$!aaYDsA+q&r<*-C~UuFe)X6ZjdBpWo0jnoLzt6aT*oYax}INWL>3`
zerFsP7YCPq@7_H{NdaU-?BK@<s*zbthM8)#A>*}PUKrTklVf9TJw0B%OM`_t)QU<<
zi9L_bd2t^efew=X#1lMZ4N&GzWj)-IF1M&!=WD%PN*lR|7M17Y@_u_bMrxVKdm{aJ
zz|U+je6!>IVPJ6Z^5x4&mEY_8Uu-V0v*!T}zxM+Q06WKw4GhGNkR-&ztDfClr*)@7
zp-^igME<q5c6OD!BTlz(-v-2pjg1w^##?>&?%f^7tru`M!5AUeBYTgw<-tNc6p+ZR
zTepx^JB4xW4Ityv(a{|Zbai#r*4`2nbZw0mn4X?y2=&cy0fdKasTOnA5nDkt&JYjl
zcOP&=AC&X}a%dJ?-s0!~)HFT83EnE7x&_j;t4AuDzt}r~GlM1bhtB#(Hr<BWXEk0q
zWI3QckgYBtco!J=Ub|E~P+;u9PvM&Mm^Nhp@NhA0z4)H!6^XznkVz0G(t%EMaXAKy
z>D#(?$TUBo$`JaVZE#=!0|R5jp1-WFzn_F!Q9&Wz_CrODdPvsM*vc0{fw`%v2b-Ek
zk<rf;g0udx>`u`G+KA(mmqxwD^k>nk7^M&Mg=1yGIXjQ!V`b@Yo_?b8DAF)hRwhEF
zK*QzbArEt$eSiFTP^|GQsV^xh3Ea(f;s*p#>7`IoJQQG=jJUYt>GAI7<|c%J*3W$2
zxJJgtBAA?9TwwnN_AgCL8hd$pc>zu?UPPvG=H%rK=ICCS3~0CdcrR_l1h0j*&b6Ju
zr)T?;Cn{BOps!Ch{cBE6YIZgq5fFW<4`)VBksL->qEA^+wZFf=N}!6H+bM82q|XMu
z+#KC{a4t$p$_PnBZVe2mEih+C5>1oEiUmHQ32x}?`=~+2V@`!isi=sSk}>QEy`{;g
zK*URiZG+`qBaCS%ppiYE=}?3;8u6W{Xg28sGz3zuxv6iHMpNfl@%&v9%-;8}wkFw@
zd(nUdnkZ81^{v%m2|rvL7jf~s>hpjMn~s)Ne|@4B;~FErPe*5`LG#CT08KIh#}Cea
z4P($uqJd<p<&N7wLmAg~fQq+OZrq56B(-n?a&yY=Dl)-lZA{psEmOS^*+$*<*pZK~
z6hc({kIhfX(#n2C8d(F&mmSQ66*&LZT6lPPfLjFx1zq^i;F%d2*0(&8E=7u%$6rbD
z6R2zUrx0+gdUXamkdc|WHpBxwCn-6(a%aGpmX>y8WTaecl3h@AtGlnSuf6@5j*dIg
z;=%$h>dBKQF2f1}vAt{hF)TymM%pUjP17YOv*-TSCdYlEt(%x<&|VP*@5o%Y=O6iS
zTR~ny0pj5nLtyKyM526z<jmY0&w^VHlkLwBw+()MYHVrw%x)kJREcA($Ph|SPEJTj
zICZjTz<uZUeD~m(7?~`GwXrj<N6G<Uck=S@?^Csvgf2W3`>f`-w7l$gxXg_VpKx(;
zy|*LgQ0jacXNE0xQ>}M%-x;zm7zU6>*>?4t3n0U$@-8`YhH2p}>L>`h=wrIS6Hf#f
z7Xe|!YeLV=+|t~<wY9~;$+<jC8gtAWm;LM4FJQ$$4M`c9!rWX-D=Xcl+Y~|dGo&5K
zeOJtO6316~Y!<E+&w%3RHXG?GVRu0qL#pyd(&GJ?XsNA(LR-*;`*Y5GZqVKp6%}CZ
zptQby`$j-O0AcrZ!jF|$;%KW=26V{L@o{{7{POZL!KK>irtnblTPM%>xM~mf_NHcL
zkc<a-H$Ok$HG6d{v%R5#{>~lq(FzxKgJ0I><_!%EeWiA++kMD0><brGN6HTo;Ly|@
zc0Yf)p*15tEsc;_?HV2)veaQ#Ru(i%Pft%()%`NVA8+v>{dXR0d(Cp$a4=uO!5RH#
zG6=Y*qpOS5oLf$dFU%7BZdk*>tj8~CBp*Mv-)!L)5fKSz)gI~S04HmmT<^)!OlOSX
zc*xdK$l}s&$AM}X9d+B^m?p!n@9ia`<}e-N0fi7D`OUC1Nh>=i=vT1T&1;u>Gu3<B
z+Qz1)K7@wa?5&M!mfDWzNR2AMB|`pbY;2^Upx~znI>2;_x%<>UuMj>A5qp1gmQ|}v
zg(ci<s7Q_`n3%-S;oRFCgZcI?ByZf;j`^$Q8|RKHv5>_VgM>~%3SB2B7cd#fhX|i8
zK%Lgqm!q4lQLJNTMtSw>Ra{)8D$lq#3*q=|9c0Cr@Nm18q2jl1ksXMmyX?oR&d|{%
z12$bDzC(5E*2CrA`Zw<GffNEIcB@*DKvES+DJY~}x$iR(;!yDKb;<~V^l^OrxS=~;
zIf$GOS(n2D3~pg%g?6;sQBGd8GtOeNj-1~fS(6CN7pZ9$ayu!qnC#1ctAAC>%K9Pd
z>Uh3k=dVw^oo#IhwzI0`BSURK7sy1eEWM6vwU0+jwjPeQV^SZL8{pvJ96e$4uBkrN
zaGyDB6G+Wrg=W^%*AI(~JlO8lu3WFX4q6i;vs!@>!N`MA1!Qlo66^W8fa~RDW$y0o
zj@%5S7+~4@%^!oq!gk;ukOlH<ys*^2y#!_K@%Uy3V&on1^LA1ky{{_-qvp2FmO=Qw
zr^ZFyP9>=}JO8$J;shHw>lMYq;v#79_a8q#mQF;w^YMQIRCc#nVgNd;xYShWUa2!@
z&YZ)zl9HA-kfZA@OYiUNyRce>K<3eJkYl~V5{@j=SmTY;G;JCD_-3d$=xoT>hkPu^
zpM?-uth)TBbrxdEuH7|+mLA@##Q%#HiT}T6&Hv?;&7EGiB*JjfbBwyvw6YIFWCYpR
z*%!BU`uV{8c9sXR1f91Ry5C@6E!5h-6XczLw$^%Idn(yY0EgL;Lg&u?-`x83nYxoa
z`;GOVf7JryR=f`hAtxi_Aq!Mtdc^u&wP*F<;O@w(8|`D(pQ*j22Iy#LvTTyq)zsBH
zJ3G&x6*e+5QdaKG^O=uuh+Vy?H8*y~9vc}5VSJK-dGR7r3@t2t#y!vfJm4k~QTR#V
zS!7_h>W&GrC3py(%r~=9Ep>Gy?D)A9LlhIZe5I_)F=zJ~)oX*9k#e9z%kl4?T3T8w
zD=Px5Yo5gA0#_{OI}#y?tYkighTv}{PQrqehb-;sOTf6aw1iE5??E2j3EJ*be;$1B
z>}x6(7VK<RM#jrnSOk8xXJ1zh4wj~*JXXF~vcvCs#3PIgy1DB!cx7E6xgRdWKhkY?
z9K&B^3HogKo5}T&YyXLdUwcwEHa2KwqM2|pAJE8w53^Pt#eJ(uln4hAyytxKj#>n`
z<6%~IN($!X%X#_vQ<lZ}J~!#<=jJ<;nVR&PeX_>-4Xzs`<>z<R*Nal&^4z-@&0}$v
zI^Uo*8t=xVwS8x8?NMLfOO|e24n0dQY3D9r6JNiM%svs6=6blTv!<%5iY}~C?ii}(
z`t<1+Z*T9cuF${We!)C0+tc+*C*1=^&G^6^`nqOg0o8ok*ZTZpw0wMgkolm4{Qa*K
z)XW!laKAoLapZW$s`9m}wH1e&14OPnm5z?i6`rO(f3381<!pR(ISmbeqSN&tH(c~}
z=<>;0ASQfti-RpgF2mUG&!(oPib_k3vGHB9ySL(%m#JwY{RV;hyQLW+=n)cnX?JSe
zVRMmD(rhs_HKpJ*`jDIq-bY807aZI!bh<CIQT3lA6@Hv!TcS+TSzBAy{At5OLwDKP
zyD2ypO4-4xw!+>=wzsu?>5$dbY#BG_G8+L-MYbyB*K%<wpD|U@&>;H{-c)4h2F2`w
zip|bm1wpg1xq0Kp4Jk=UadGiAY9AjTR4i^~Qh#1SfznO<Ow~NEjK%R9ZxCp=Z;K_$
zPfty~94X@kX;oCjbL&<u9D{@E%xM>|(rT31%dv!m_`l&1NGX&hpE_l^54PFd(!%)r
zK=xZ}c?2wA!SiWsY;0&~2t1*rxY(z5;&690#PhP}cj#?rNSAO@<DLv*%;kZC%Vq$j
zHg<MG;5cAWxw*N5dt+}PFtdj>-lbD}lid1E-z_2{qPV1FWw>;=IfA{qx>|#Un~SSw
zbX16)ogI`42(`}6kf9i<=x#?L78Yrm;4$)(lif<I;vvX)k!;eL54SbffK0N>cLv_y
zl4$t6UOrIaa%kPXI5Ck6MhKS*-~GPEr-JZ+EyJw7-T&S}T%VrSVq=_-EB_}!mq@C&
zyjC-yq@jyMMMZ&0NZ9qi_KQ>AJkIfd@jdIm@ZLNuhooF_cz9SRheuG5g7u$(-Xlkg
z)55|6lqRyRh3&GMvGHQ?4N*x+$p+!L)q+UZEqPYeEuum&npW`D<huFUS#GNt$s@Ji
z^C3*y*$Sb8n#jVXK0b{lHjC!!H}S<@yr3UZl$X~rGFq6QcUbDn`TqU;@!@X$k00+G
z*q64H**<IZ_xGa<H%D=2fB7;7jKadg(z@g?3pw@G>V>Yk5-~_FG;21mo(+7}t;hbY
zw!xmDb#PIjKuW}an5hyF5h*B3{{zC8JwA34shmArtu!+;8yy}FAhKH>0i%Uz%25NU
z90Qe-k>O9;y}j7mNY2mCPjlnO`XbhKuD1_phE?Sq{sGdNkKhugkTvi?a)TZQ*1?R0
z@Gz%Nd-&-EhD>E8DOs5$ZH*rm78Z!B>gw3cOswqwLNiJfBu(+fakb5io<sYAFNzF^
zwtap7U1(@6En*LbYv2j``uck_l8N%*1$E!QL(UabF5lnZpNfQT_-zf5Y%lNE8<N}j
zKg?+?%L?&~R?`&_5U3Bho~+2Qu48C;8}+s<G<Nj29URDCR;LZ2_7InlXe8efKmrOU
z@S%LFVxl}4I0%0rRm<X`WSN*W#WXM{dk2S{RAnse_%B~xY2+DoGg!VOHqT5VDesaX
zJgyDUAGmK-oe<V~qWE00H%qe=WUA}lI5JFL^XnIALhS6_-CasSXL|_=zpM;W+k?&+
zjp*oTpw64z!xb)3RBv5*Zy-6i&G!>mn?Qm!&^ZV;e^Sm%)Kk;boG<(C9L#=@l#&8@
zC&^-KZ4KuA_ARDhOi(W_Ivzeg%9W<owKXLrWnp0f5ck+1I^;b*F78ufW4|D&$B&6Y
z4tsi@k7=b8a^*+OL2lL?*U7PO{>U~p@%33vT6(&nnlM0DDQISUd!F#7T4Ts!3G(wG
zSQ}mZ0|G=)sD|3LwY7tTgX`R;A0s16ii&>J*RS^HC6|?HB+BQoDvU0Xd=o-7G&f5!
zgiiG8<n;CQaNW7{u6}Zy6KDi8HZqbl*ZF`yeOs_+c=&k4X*Dq+0dCFH%PZGk!C20P
z=m@-hU~n*qjMse^wB;DYX-`yamSeK?XK@w?O~FVfYwGsB3hd-unDf(7z&i}_Ov?Gk
z5sye$MwfS6^=b1fD^Fzac(r&{#48(LF-nsD><C;77z29w_BCG!y&LxYN7sBMX*YLw
z4OFv9DS~Df7bRH0W5{vvTd4X!$XK1H&8aLh?69d;tl3a}9+LI(<45S%8$3KbtgNep
zW|ias*{GEA^75}=*M{vz2{6&s&fVGD5-pKo;ZJMyF2F@eOG{4`Hao5RgXW5!To{m*
zm)~e&t$f+{_4Sc45h>{bvI}dmm1wV0<IvEjGJ9$dQc}`;e29z^bIJHtiX7_8_v-`z
zw#dlH<mKhho;!!Es<PQC1V%+{rdHv+pQBrkfAuPzRHUA%=?I|7^73#`&!aGr5pf;B
zY9=>)@mN{<P;tm)3&@WnTWnf<AL!b~+SlhU(0G96#Y63}FM4=*l$4YRzrm>e@gqaC
zG)yXj$*QB~7!PISX8Nx&hTvkI<~+4kT`4K4QOG1f%e2y;8U+7{-S|FwJ4^jeyDOUC
zUiSN3r2~^h);m&Q<>X=sZ_53LE({0=5Koj}PG)FSmpsVa67HZ(pZOWe7(y#WL$v;x
ze)3LI^6FeS=^N62jgx!`3kxLYdqNYux3>qbKrQ0c)zdQ(rFag*rx+}y{j{7>&(P54
z#K{nKpq*}*RdsWRh&wZ1>rQvpIVKq;uKDjc=RfmW)eR2|P*J^liL$ffZpqFdbw0Q;
zOh-h~Z9jsdA^NkwI(bd1D4AXkmk_vlhi)wwj=F9%(!KO0{M$H*z)%R)+hVI(*PVU?
z2)ws%--ciXRP;S6kc>CiaeE<@QF)?vW5bdwCx@EQFTmd)d@YsH`1dGBLoI}wz(8z3
zxiS@HWpCW?d{@ZtZH-mG!HiWeG+iF8bUQxSwzajz!^87`uCtV9(06ihm#LK|m|j4@
zrOuyZwQTcOd%S3|hN*UaDuM1=dwaWlDzdTB0EnRkv5-eW6vK-JbEGvGHy`w-#IvT^
zvCDL-1V7f()9dQ%OCe-GnP8fHazNWgmR{H0t+XjoBT%L>7bTL(mO>)nxb^DHxnH08
zl-1OH=`JcHOH0YfxGfj-LgFhcFULwDqE3*d9~c;DC`?(WGmGpc30saUJ{v;J`cZ>L
z*<|8Dd3ujy^(St#Xf@`S($MaXz{=3I+HS|&9UUF5LZ@Un7jsmar!B#bQx@q-F>sjq
z)4E;d?z4pN9*_WZ2qYg<Cj!Uj=X0>Kvi6@^+S$p7iM4NE%q10!VGR|3em5dMelq3s
zc~$i0OpCFR(LINaDM$(Wt<fe%M!vZ6{~DVy-6OJ5nOL`<3Nm~VFxuJ4e&fa)=b(kZ
z23XiIWB+T^BtC3%Y3b944>xf!O^1rAlO)4<<t|6Ne8XxB;g^ZHI}Hj4%*|@1c^<-L
zCr^RS)v}nFnDq3;fdb>!7$KQWIT0M=_IqAfkKbm=iE1md>PJ`PfcmegxgjJJqp>+w
zeQsl&_)n9s17+jw&h|3X(LT(u?u!o<W~$;r4UW(?0)pU9FK8_Ytuit)Z!U-_D=X{k
z(-zxr&B?V$glH{y+;i-{6kA!;KR9>_u#F771C|?=7ba=l;VjJMRU(OsmrtE(jcJ`+
z2ZgDtqtlbA?(IhBTR$lkarYJ{XF+1(L*vGht*J{sqT3)t8#s{x1cy!9sBd#NkI>NW
zw;G=2k8jO)S{5GxS}T=)K5o)J!6zrzl$CuIQ}ldmJ~`$9T=DP_1lQo;AmcUPrf^oq
zQ1KQ@TfL!9@QJ1-W3b}x?rx9=_KCs4a!;R*fvVI0^=W==>|Jnhj@_!(PJo?_jftV5
zn6&iH+S=H<eb)t<9EeBUqt5Ic9LO44%*@Q|>+Ad!W*|nVuu-w*!zDJLCLq27b$H`Y
zjuaS&=j2!@DRsv^^rNAnc@#hjUl|Hweqex<n79Gy!1gQ9f!p0R{D=QBKIKAWAmbhs
z7^sz_<C&QF9NdGlJI?0H4HxOFlD#RqOlgI8Tl@ZToGL};MVnb7&ij)-3a`xh{!h<O
zPEO$dXU%!`1~Dh=0@%5^!yEOYxJ+nv*`B_Gu#fDyh%9a4u%YMZc#rpS{@tZZ8D1w7
zgcKANCWGIY)xZ6ys}pqGdNKVobgGc*1<S|CzE5deE&T<?%C4>_5Nep1nG1niWo6e^
zN>{@^e85C^|IB9x>G@!P9|8(^<P$|jWE}xN)`~VIyq+4ysU)c=6bc1aP-(xeQ>;;8
zF^McmE2!IJhafdEYEu*+x&t_9WN0X3N6N?(MU9II|DL^n%XlH%L>}7O_}3?1WcHCc
z5B$7x>C(@}#_FgPp<v-kx^D)p6dt(S7X%a;lprmbo8JLU{rc5@F|%-usCG@1MlC+>
zga=Hww<A#ka`r{{uZ4xZ2h;0d^&qv^_nob*Hi1N<xXscykpdHtN6^u0W7T^^7cJu8
zAR{M-M6vH&;q6@y$*%81qaZMcL36CyS{J8?H#YLb0@*V9p@*!TT<|l89t{Wh<?>~}
z2zG;Sg@v6zQjMt~Jt14<;G(92m~%72?|tg)f-X+qTII=%50sK~d>%b;kJCRuz;>yx
zAsFGXNB+dYpFWY{;@&^DAp%F0`XUrY;nEjbnUJumTBpBd^!;?`Rix3;;h8Bj&m6JK
z1jkftV`>40<mE=;Op$(3;)%$H9H6lv(*n;cC@3^)%f}TzO$*J|u}kaVm|f^j2dKEt
z^^$7$XuDS%nl7AK-HQl86cp+K4PJPYjkPsI+pbXVon)cOMjLQ?{xmpM5T(${^0I*4
zibmbHrvkh;x~f=jpFzu~aTD{Y>hu~bJo`guojp1WZS9B$t^lmmbhxD3E=c0c+RF^B
z@`JVU8ZUwP(<7&OnQpKe$e=fAX|vP{7D$vcW$ANUKVi8t-Zv4@y2yPItt@w~_SuNj
zI5HYl#W(@MgMfelbl{bX7adg19-!G@EXznXQcys4r96A~EXEaLStX?cK$2M5ltr;S
zXlQeycTCW-OK=4DzI^>^KJmjx+jalBTm4zIw)y7*O2ry0V7u6qf=uB}4{3rG8K4mg
zzI|IkM$hh(OJ1)^4?N(ziB^XG{`Yaf=R2~S8=dAXC<NqN8IOjBrf+?Ei}cT7DcpYz
zYWe?rQ0t4;fH_38<-tOQUZncI?TfGrd0SrUbbnhjbpYfRcdAR5FE?@qQ3%jrqG*C;
z?G9&!PQ`FNDo!tKIW(kc_1g>1N7YSD>4EcOdvA6enLoqfTUQONsj8|P8+%%gJwNOh
zeWp0B?x>M2=3_(z$&>BPFNFssl_&V^b7H+)J)GmWiawo1(|X`2dHq$z*3WSeO}MBo
zLy>3CVpCHMO-z;nf5kPC7YhpmrLltNvIpKCOa=)($xs1-j|@S%yStxYC)<?`eeNsG
zTzqB-F&>DpoS@ln@j0nwxxJKqM8{b)``1+>;;omRoDKotQ>3ng=1u#So08H{U++!z
z_T=sQtzKYozr^8EJDF5P7LB5|rlzLh;c`~@`Qca9R?q(&*;=Jnd2P`kkCS~7pky^)
z=DLoK&NtKHfxf=Sxah*TZ!X}_a)<ukMH_NK4F5U8^)_kZpQ=3;(h|$ckkWBvqwl&p
zP>gVUV9>OM6FAv^zP^Z>oZaNS0r}3()^=ud-_+DJA|k>lh^_61wwxRuA)&sZVdJ#r
zEqpOq*|yGPnfai&##k1GBuNMWI?BpKT1-q#Tie^)>+96XSOB&zYh$k=GoQK0&6Hjr
zL`jDk2XLz<4Il2y(cShHR_6MLVKYYib0x1T4CgA(&HQZ~FOaG2Rkc{b)9SNBQb782
zm^8GsUOD9@?y+$fRg^K-s1p+t1qB761=`!!frv3<1)O&LiP_v+XAch!AS%lmw-Y2}
zNiStuJl4MEqD+Gf&;+)c{xR~kKpR;ta(66F^eTQ+XAG_WLdczx2?O>rD@)6v;o<$i
z2JpHW`}NtM<Vb|G0Ewq|M~8+!#Qo8ouAJ(Gfq~&@Z=XUw((C5)0t4ev;%d`EzSdP@
z(Sjc1;4^L-XlP%06B6_}I5<-1|6xohRGff_$Ut9z=I?_oe_SF?vF&oCEIl-<fX#xU
ztE;P?UV@L0n3$N4c+~$;G!mD6i;m6!bXk9Ye{F3o2xBl<us*#U3kwT~?%zEw60vH1
zXqpCv(50J~mv_<qBe$8Buy8eSgNBC2OA`}==8x61uAq4A>~=wZYL-~vW@KD^gCl5v
zw8wTVr)Kqd^>-<DjO&3|qC6)D2QdkWW|28k)k|?#4|4>0@d$H#V_UqaTGhnFguv&4
zaZd)d9|%!u?;0_2@eW3e%>IU^rb%<2KNcni#J0Awy6RWEyE@uCfd1PC(oV67xw#9G
z74N#bhQM>W-&Bh!DJzGEg?ZuLb2+en{yb5G#o%Rj&r^;=IV;M8D`OuuH8povhMi`b
zBOpMqgoF7nuCB&_8Ha`Go0+Z7&x<_~zM9Y@y;N(_7m~&Aa=;;s3sN$;Q4hojDBi9-
z_1>}AKWrhYGe&Uc$BzfGvX3c+CfB&w*br$B_^PI^4!{h)nF~Z4Z4foBLU76R#v}i|
znJA=Wr#D0O4es{>&{gF-1I7|zOw@K2PP;6^xQ9E-iw?<ioK!Zq!cG(uZLtm!E1BEO
zSX9%iq9h6f09`wNMcNXDj#kBZUi*Tz^mRpsZZE9skdkb$TqSNJ`jy>ss-dCb@sZ=f
z7IMLm)$Qd{6~X*GJUtCFM@C28K<$HOi;S8xmU~l4qVeR(BY~ZR?Zqi<WSUma|1|=F
zxe>%6b@bPu(F=_Gqed-c9e^+ts28)pJ~M<al&)4>#YA6TUIyj!2vh0FlQhM&loWc%
z@L5?bb!pvOH`9^Le9FsR0Oz!Z%AL5qYf@8F+qp4XUfTcnfK{eLMz!YsQI1bx6B9ZM
zg5{h%&+n3;Qu6aZJa;O<i04EraG7I&g#-OzpA#GVx@H`RKfj=0oD<qk1XD>#Dd(bm
z-c=_HvYiCR{}^b(j2Y&5BN|XaByjMKSjH{#qtXW_g`IU{@(~0zu+yJpLR4Iso0HwH
z_KC+>wVL>G(NaoL@tUfWj!s-eM1KgK%vutsagU0M3I`{rVOXafI5WP48=-76mSdva
zX5^Pg%&i=~G%lw_U(q`;&|W>6$``I&<$}Z`_4!_?2H0<UR@Ng-o4*YdapNHaMe-UN
z8LE$+oSdFL8;AB}#Kqi7JFooVKZ{9lD{|`oR^c(OtFEptAuj&?`}YPZWHf^tdw!Ce
zlhek+!Y3$bG|xZ=npZqg$LhlwFcB{MwWmjq<sq?!hll(4_=JRn1O#9ecMJ|j)r=F%
z7F4SS`1+=0WeM7?kZDPZiCx6R{8~`3{A_b@U?5AQ7@vaT*YwG(cIaS#zgS|&=4`9+
z%1d*iJJ`gaFhDqm_z94F5-`hFyQ7x6T$4o9+}xZXf7_Lr&=1`E+_`fO{1jS%ZT`4v
zsj1IMZYr?`)<j$15-c5cJv7<i6IxkWfjiKv%g3e&bF}1*6Q*P*kUH`|vu4k)t*vco
z0k#Z@gWGgyZu_bzqpt4cyLY&jZ2bIWy@9xDxq4!dSOG81H80>$eB!gqlBL%R=Jjx#
zXARE!kt=lB@r3RbZL5DT4H}yL&Q=r`rYCA4+@e^6#TB>mKMPQ@RNtav=T=sd_RkAw
z7EpPFv1&(u_^@?yxH>yK3z22QssGzIE=z+A{W+l)_PgKfxsVc+pJ&ct$QHi$^IxBx
zn%djnzjgDbKM8x?uV1G1f#mipwH4h=0Cndpy}c{@UMWvxb04kOQ$i@K7b?=b-;H6=
zU0+{cT}^%K)_H2{#hy%L{c{F}pI?bnu3hq!PtDKCiOtIYU9HkvQu$1?isvchhg8G)
z#<3*_r*8LlaT7|e@-MdBb>rqK#yn)$D9l3CsPz2r81}=UP%XQEVBmdr0XBsuUhb8T
zf;S)evnkB`#<Z+)-94!ED@#ngg%qw-^vaNBKA;KC$zdzzF(13H!H0TG6Wkmv-~?oa
z84FRNtGgR8$e-8vw42e*=Uw1`HEvP4yzk?i6XrZ@Y;1l+tolQ$OoUd&LqLI~vhC1A
z$hu9I)8b_+T3WvZQ8#YfC@_lx$#9e?Qn&Zd^(o*dJDK{8t*xw_oZCPkLZ?TYbTQ8E
z%Ak*tWxV#vS@=!b7{~qR^2Bj}3>8}m9WLcfO-+6HaE+Zk4@Ay3KSqwqOFcbBa28Ea
zJjRd}Y}{%}?vI}745@BZ$<<nZo@yuRULm}rv+Vz{9kEJC3#o_PTwL$9Z};4@pJ|Ee
zt@(&mL6+kaA+8KoNq@~3Y+$3@{3zmmXsD7*Zi|+#uCA!4w~x<7t&H^anu5vNxw#jq
ziU+{u%b@8x62t&-xV~KCJivaesZ0=NAlzCnBo%$Qq6U<Q(YbGUE~tKSX-QA@QcP>O
zc;elN=Js}ruG0>+jei%t_$s9;+FDyf_<3i%X7>Fn_3ur1r9a<$m<8<l3mAAiV6?xV
z_x5cuD%_zWi#O}^<(6;9RjYTF2bCDQ6U0K+#3?CbAb2MwCr3p_N`Jf~oc)R<r*Wao
zVKWkbkLGunY6$MnGk`ym;=WPi+H<Z*PBwV-=n)dSH^-{qxVxX-uprg!vwMB!T-{i8
zW5d|aUBW^28?U9_MSkv6FW60BT<`z<XOYe89yg!I<ouE9+xMQ4h!VLNF6s6V2t|z#
z1N=ush_O%zIClN~`Lm@Z6S2E{e0-IMD}0u00s`c{fkekgM;e-%y;+)0Cr1vEL8J#O
ztazaVN}kiH12yY1F$M>J>84q0*MTt*=N%pIKYdynAFrNVPthiBTY#1ap}D@h8x$A_
zps7rM4FvQPhEO%PSj+#hdS)*D&fUA0u3Q;{WY!$PPEJO4_wL;_gCQo9f&AMyZz5Id
zVAWww)4*9D9^agz+v8YQR#IYC%crNI(dkN&19?G0LIOGW_3PLEnLW+VK%j!2Erc*P
z;<RdrWeNWS0RtJI-CLh*+$Dzu1;TFUcz5*h@Gyk(U@>%!Lcja(V>5dfZ=KU=Ykq`6
zeUCD$AR#3!ao*nu3k%!Zv!@6uv|Uzf(ZyOkTZ7^M>`e&P&T_YeSpYhhu#v3}YtKkX
z)=-&)mAU!a%5drFL2qRb_^-;>SI%0&`fDlei*fbD__~H1f5rmBOP)Zy_8U`;DRS{(
z3=z@M6~?_R&RFx?SEVJ_{Qs&25Dk%~*C;gA6cKq75~A?rNzZtVcjG|L+}s=i;}aD%
zHL#ZjhJ;mMtSeV`l8t2Qgmj|~vmPEKokv4+4CtX0n_E~=E3r;3DBu*v-Pze;2xa*F
z$WeATg54l6Je;W59zr0m)yx$#o_96l@beBmJv|+rXm5D#e-ZeP#d%|p6Bn_u0Z0f5
z3C+s42~TEJ#l<g0>4MR>$BT*vk{RmgOe`%qAMIIy!~<WsTbC_M{||!~`D*Om2ERVV
zVq_@U+w-7abf+nGg#tf|V4C#jdX~I*`R?>y>1AuQ04DW<48#2OH~L(P3`(Y^E8tt;
zE5*eQ(A40E1r)~SM00#k@6=!<lV(;%qB^xSt7Yd0ylKxxdS4;GXN`;?P1O1k;h`Qr
zeE8D6Yrv<R6MNoIhb$4&MUBDkTf7_ZLy#$XYuWhiI1~&ntd3jMhAp9_nr!LxLcJna
z!HrzzJ8sFy$WR1vBbmLlQJ|IUFh^XWR6NmfYYq?f_UN^4CgL^6RbO~7r&K2VsJIvU
z&G_tON{<b*4tvQJw8{i@v^L+PTer^2Tz4P6gzHz^>R8c{{jWNkBBSoKlR%`?`WL#>
zaVQ0k_=U*a=GtP<UnU$Xv1$5huy8+Hf&N;*!7q$Tf-m1FvYoq4@zKz3I$M0))v{l8
zzIEW)*4347*qQX|)hkGlib_h$eK{iZ*W@XS&!C~LU4gTt$HnPP)&)>gQ{OQ_LwiM3
z%gA9eW?5{vGQ{h=_f><1$mfB4D#)$wfq|0B$+Kv$l$$P4I?Jl4AWQHgTiI0V!l|ly
zkdJNd1JN9l!xi&i7W;i1lY82B#k@NUUl!N4I$Hi`y^NOdKNa4*9`E$}*H}Wc>j#rR
z>SQ_!wnJnDsZWIl*hMJcKRZaI{^S4K?wAj({pZY#a+2WKmoHxeB^~fx`t!?B7$@&L
z%AIyUh)=^mA%pBASPf5s5&@eG-9-PmrYecIE1h0tWo4kHE~B3fetZodA9)-#w*6o8
z8CrDLJNbBdc|kKd3%WJDqb{{wrYZdOnXk8|=1obZA_Lat%Qe}I3=AL)nV6YD(mbHK
zc<B=G!0loKkc5ET_o=@AQLIuNeee<|t2`y;#l#OEXF+Wf84p=U$CA7}_84T@gr?@^
zD{x?A_i*DR{K2(`Tp>x+{?Fe-<VJ~z)avBir&`<DVPRm<QE*jN?axrn%gD?GuOcTW
zpPZcRzt-@PyT<qY?|Wpu_qo#xS>TwSzF}bC9uOm>6c9nXJ3CovX(-HFw{8KZQ+r6q
z2x_XT78`cbX5IoM&d{zrX^R!P<f#K1-|cX4)OK~Gg*FL-#S<kZq~HxY0RnbRd_1J!
z3nN`aLr1^(Rv$cir2qW6r<a%OR=X&~WVOq3^w$7zV_bGrrKDOQr>8n0`>%es8;Q8{
z3}tF+3IP_*Bx%(v9daQfHPvussJJPNna^owiEp*+DiM(=mx8hgannuBN>>*Ml9xOu
z;Htpl-dw=JzH+6^aht(qUpZUrGl!wPl$4aE<px9=!GpOQo~Y`i`v+y)2`ax^VeR{0
zvpQJeAR-F?^-H=;MN^X*7c(wCemzc-Rs=INEG*6Xt)HI=Cc(99?~I>hsy%=Hyt}<U
zRzCIQXjUi)OrfMQCI-n-N(@R?R_v%b;O&y1&8@9;z5ZmpkhSnDr6nanJ$4Bo+v}{%
zkB<wl0K)QGOgymcTplb0sAtpl>hWruJ)>-mpw1~!+mK|WS6jH4NyFBBCv+h2#d@54
z>ekvC=H<)rG9UguA%VLc>DV`Z(6MVr#xGt}?VdBrAGrzEPQG{Vm9@)2TThQIM7gy!
zbCz8pZP%}Pc_HG7v#l`(Lf6OF?IHV4AyaJ@7Z=TjiiF)hKnVBqlW=xE0<rnCsY!`}
zz$P7#t1DHZ@gX2S&|&8E+u8{>-MV*vHC|XXPJc|Weuwjb+T+uwPu4Eskx~@@ek5)_
zB&mt@EN1ZUrTe76OZNf44e`52MzmB^_Et()FQK0;zm(9bj^p>IiE=D=VtArr6&Xxk
zzD!|+9}o`viA=ye^tRll;nrz9`aZl137G^K06x=iCI*d4&S(2>_XjHW9Tldf3`_W6
zcXwg|E=7>2Cdb{o-<|#j2x-jk`=*3%;*(sz9^wZ;eKRVxfO^Slu&u4FAK9BoTJRyT
zrUpy0*oWT`(sPja)&G3QRHk?B+21jWC~`+z9^bF_&zkH|`0?b)lO?|=^w)s1ruf>B
z`KQzxXTzJ64vAyI5uF9B=i0zRX*^7aOA6dhPqr6(0pTD?1-W!{fY=WXZbv3*F-}_+
z_qc^t(c=8!yR@{l_BmNu*vEwtYS;0h1@9Kp1i!5r|MBAolUA9Ev3h<OB?(F6ACCwN
zmbcD#K>l!%WBT2S_S7#<^Ix~lIypM(>*-nB*-didQ1C+%e<z-}<hQc0@Uyx3CQ%TD
zfYI~k(=#((xVeRer^|(-AH;8sboKQC9Av4w|5cv-)H&Zr;CJ=5#X{F@OJuKb(~+`N
z8v`zfxuvBe=){KFtu5<ZxX$l_g%HD_vGwkXiq^}WN|?wP?ekNZ{rqqn42+qX8G|S#
zHR!Ksg#P)o5c1A=3-{<1EG*3mX9rLh&d&Tn_3EXz%!hHFsBz$C5XE<mx>5lCK{c-q
z6kHZ+z4}iNgx;JeDJl68GW))LOU!AcsI06EePnEG{PgKloI$aIe=IeYjY*EvX@2wH
za>|0;kQ8nv#`PdIC@841(#_gBzr4I06<g%IpDUj_1d&^6pU-Xu8BN{X^a}_8JIG8)
zDRMnNAkuag)~3=Oxx&H);f0=lZqTgKWwm_w%KV)_($=W8^z|gEDBGFl2)Ki?<DJ2}
zx;oIp$fmvbtmzNqTAG_XIywZ8)@l}evvELu-M(!IO31#m$YK(kg1_i_Qy9b#zI*pf
zhl+xoAB+8~Kshrl4ag5%1x^*kWuhiSnyO#tPhx0j7{zS{?KB6n1|J_^@NkJe_;G@b
zK^_0ch=|0bBqJoHELkB-{W2<Nz3k7uMN6AhQ8DuKr_pzhi;Pb)zOW(-3Y`KnbDIoY
zBPSmo8d@3~yW@7^Tz8g)L?c5!b!laVR!HOQA010}mioi{NW7ybuT+>;YAqoqyX>t!
z%MAK1WcKeO;$KFHKPd<Ny^i?#>hBOnwKs8RwcPx33|H9?;36*gPF&nOPpe*~rKN$Z
zV|sp1Nl7^gy!?l3nC(jE`G1rw$T7y-t=#FA@cR&CDD&QPcD1#&{a5n8EOOX-;ZJdb
zcJcpr(_5K4y^@k>QQUBNw1F19fJK^+-X<fs|D(A%11ElkuFH1b(Zu|9xqF4S7HzgP
zGC`-%<#1;<&!~l5>$5AH%BUtq$iEASSNt}##k*GQ>t@wfqXm!cW6{vc?&V8fM?YI_
zaVbZI|JiqRON-r=VSmqozP_TOqAlV4<E7^&ME23;DxDZrDM2hZ+>X}keF+#LqO)ie
z$pT_6PFH5647aa#dd((tASGMr#lAJ;9^T#|eqce6f8w*A<y+5pBua$upsZUX!V5HC
zmGA7>QUvvm%DtK;J*JwEZ)*6vOtU!`w_tZnpv7uiZx#Iv4Q;NN!lf{_tZb;YRfY<;
zZ(zW5@LPa}%yC~~TpSG(6FANLrfKn;@4tNck}MNr#GILt@v<jFwWp`&cP&XE(5N1B
zo<Zw3P*+@BVUKTKCSn05VRN`9wGZh%Ha1o#M}-R4-pPrGfWR;l**6+p_!<$>WUbrL
zBqh4AGu*QMI*=T?@FzhRQj#s}GcIe299V#gQTz_M_o;Aw9zZ;+JleRdo2Yi^DM);@
zZ!aw!SX#;#(@J?)uOUmbRK@gRet%s(ApwEZC!XNe+4P4GYb#ji)Cbhp-|@u=IQ29&
zNl@YbsIARms{G%Ijg6Q~N_c2#^#Rr(XYAosSHHQy-jj7(Kw$Wf*}lca&-L{&;J9$%
zx(26@{)L)@hsHC8C1T2Q2Z1z80Kn+NA3{Urlrheq4<P3YW3$YB^Pra`)0QNbx3nLp
z3pitMf1lc;E{IYF_kpCOe^yFgS4wYNqK;c}{KX))Rt{zA$Rsvf@2vIak1R%4b8~Ys
z-H~OFIn%1D?&IL#6wF*VKWIw`Uw?TX?Uh!@pLM{(G{McEcoj^ZYiN9mh=}m>YXZ?>
zX=Sxu%K3Zh?A5DRJyF!I%L@w&D=V%GU8x{^p?_S~sxKhx{bVF2B>d>=>gw#=?90*h
z^z=O3T@CW_sgAO=wB#}y`Skg-CY<>F`w2Lfm!&9D(vOULvo3m~pw$$TrKe|SMISwi
z{P^+1hYv5F3=a=86Z(NrUe{4k`FNk|BZncr*3m+Gc9F&kq@1pS#Ki*AgR%ab4FAJq
zS#4vRtz#6WBz&chPvcyBe70t3&%l7=R0H1Ct09`DwmJRcG0R0oJiv+1zI*r)vHqOi
z0Ln2^^x8h}BH_eHVQKL9XDC5Z`}+F&Sy@?5yDI`#Gm_@!cfy;Xd$)IYTbr9DB_#3+
z3wO7+Zl-^kN6Hm+YA;z?ZT|dyjJlnE&avhE@A6pCYV7*WcQT9^GWoU=wDa|~ltDk%
zx?Ynj`1Z~BK^&)X&pTrZLFa~X^Y`!H_iYu;P_^4UQfPHN$cs9@pZTAq!Hd4WIgiS{
zvPcgY{d-QjcbnsiFST<A<nZMO8gP+6FhMCR_ZnxHf75Hk&yBE;EHN7u{I?-IPmPT|
zGm4WETZz=^ZmrpT5$(kAkacwxEY_cD05uf6$LT-~IqVT8Igj}(HYzu_Q%J~#`T2KN
z9470qJY-c>NnG|jlV$9ztzVj$)cT1hcGT3|U}BOqj`-h-RZ|Q6W;hSWl$P+P;h31{
z=<oL-N>5Kee^wY0e9y)_;<U~$g@w-)*Q6<>|1l4ixUj?EI;GR`fz5^r*tDix&eG+B
zupJ$K`&r}>i8$AEliuC3zP7fiadR><vVnntwMdA))E<zn)@WRa%=*59;>^j`3`kC%
zg$`+~9V|4viY_dDeJfKfU<O-Yo``d6_<{DdCb@)}<K5B1!ot;+l{&vtyVV(U9?+Bi
z-G<osk?fI<#a~)0wazL1S)$vGpTcF`-__tc*P&4QJ%w$rxx<Da&XBZerH!ohWk+I<
z$B!Qm*xA`FwMz6`NH1UZgA~$|wk_b&m6C{b#JRs_;Ev<mj`+VGkvti!|F5~R;>L2z
z%gf+x$Z9M1soI7H+S`NwX|}E5&(*oPca3^@czDi&l-bmn0Ouagrot`25}>{MfJ>GK
zI6YB0w##Z1LEb`S;f;DHCnt{2y`HZrmXLP*om)mxIe&3WuhI>v$~zb}lk3hdE{(PG
zoyonuy^})H9P0gg>P&<|B<x-qWLz&l&b+AZ+x5%}+cD+Gr2gyC$jhJH?CfwJJxy?h
z*RNksS+)LEeVgD$w8;7G-w$#)kq0?M_pyjIUxKT2%`MQ@#a-cxkB>uUz$5csi4^4J
z&z?OCrq}-<i|cWp#zEhdcJ}KuF=hrX&RoipNENLWYtMSx){-pLmXz*(_+zXn>r~D&
z)cJai?{{`~Ziohs5dt+Ml@~xPQUNIjMCOp(jJ;&8d!VR=ai?g)n;`ae3^CKu)wi~?
zQd2)`{>TPu1@u{4nI7Xc-<1_pO(Fh5=lu;(GrOa1LPA22EUul(nHd|$-~R6>Dg~GR
zm#MT5HMF;?*=he>3mXm01k$#|C}Ezc4tdrQ;D2KFSOuZ4h7xO&=OHEqW|v4wNDRrD
zAIDU*b$5&eT;Tqsh8MNby@Jp4S3&GJ>GrZtd7Z7UZoGUd88YkkR`H9fIh}aA<G4r4
z+-!u;`$(1{_KuCcd;i`Yx5Q?#2dRA|AgH}-Ss?7L@?TBcr@fNzRe!ftEgR)8rMvmN
zX$^NuAJ9YyIPHv-JK>?|q(7ykrz6wbTplV46u&x$c3-=5LqfdVc&;t>0uIFkOr&7z
z^yC<%bzxo}=wb>R%72ww7I;AKWSpEX4clp46Q#sho1McHm&;*f@TCc(XQ=ZM)_uUl
zb}9Qjr%p}QQx4M0w%SWr>PugQAL@!^5SI%32>5Es;RPpQlGT^HEj3M_wR5^)`P89;
zQm}D&X{C9od8D{<xSv<3vOQk(vRSrvWft2hg@EJS;v$%D-Qb{llz0y^TOm~*ZsV=5
zFTV6`q!16dMLd*&goK3CY=l4CDf9VsK|h{=Kso5@+u8dI-AKu-rXnpH8yhpTltrpc
zQBn%M#IQVgJb%HrBAit}_spQIO^Be)3PiK1*5I!2VX~may88Odt*>SZ=5Q2WEhn+1
zACW)A_eqe65tImHx_IUH;9zm_KG;{xYNYYe0^`&Us|S9;X^DbZl<kvU<^+r0{QYox
zZ)fgsU?j-mwSGjs8LG%?UeJ@i+1ZIWFSTgmaFp#U@gWZ`gPQml8OeZAPEUOOdZAG_
z0}l@p-RhC$2K@c~@o$OK%X>r!{Mh7XW3#ZZ;C0wYfK;C8rcj*ufChO300!KifR02?
zPR?m($*?0qEJvqyqp)c}SxZkelEV;LA0$GOmdRy(;^Bh_9y-^AtDn%avs*z7^DPAL
z`TFe}q3f88o}rey`jGeT!|EQ<-hJaG9bH}BRK>{34k;<A&!0Z+tPH0=E{60AjJ~OC
zZAz-#kdu7A+mtl#=dRq;^z`=5GBREODietQqOt4KmTs4Ag0W<EiF?d!ZrXOdX~{XC
zA69tg4{@%$`B*ylZ1ieCuVyJE|B?|pw*EiNy>~oU|NlRHUS8QdWEQFHkYq$iijX}j
zJ0p9~te1CDR3t<Qk)4rE#w(JNJ+dQZ@4dMmr}yV`{eHLWcl%z~zt`z@bCcJ3o%0-z
z$9+7{^E{v6p(70_eRj94?SD#7+)#*?t*RMX1}%oc5}})r=;hr7G=}ziaCGQDROaAT
zz)VBaQDpfYLL-7zJm0X=b!%x9-S`Xsw!XeTSmy8%3L<D!1&VlauvDdDC-=fpFgatH
zb!Y0W1Th&I83sNbB~{gG_Zclcy;oJt6hkF87yY)K{r&yT#^&`+{B^6nS3vBjy}5j8
z^rMim&v{l`u#M<?3;-gJso9g_<7bzaob2t<X|6M=A|O!E)78}Sb#wKst*w=mzNTJ(
z3LgHFV5^<o)4k<dp8nnG%YiF`P-!(=TU%4p6mTCOKDg98*jUxs1tyU4nC&Srk#%xf
z+TPyg)y|0K)xL3|<xIi#sjr5=$*SzcpWm5S;>o#FY}K7{3$lTUj_%Aejb@Y9QV7H>
z_3}-3{nSkpFHX_2;;-c|zUJEuoUDwP`WuSv;Bq0Pq@|^M@}e>$BEC$v&OMHN!jrrz
z9;NkK#4=i2r%fU{F0Q}a$wW#@>e{tyAUL_XGe-mVZW&#L*m`r>qo}Y@SXdZLOM;|Z
z#*4%K9dwx{&~p%^?$aGty`>#NbhE70`R|owX5I%=17Ha%bzySSbGqZSM>=`23%~k@
zu1dH2Jh%8b+xt|NIb-^2-_|!YBwVtyx_3{j+S|p;YYUy$IYhn^KwI#vZ~?juV)&lD
zz2S#@*Ue^cI=pJWZeUQYS83DD$g(Dowfo0dl6^-%Tgwu{B&-}bk=S{6-R63j5;`>r
z9T)(DfdrNhCSy@)cW4Sf36PJDQ`z<Xgn|In@2$^7Ev3dx82`Gqd+srHi*iDmQaS^_
z9-@(?b<^CXGM8^Pv~9)Xbl0KJWewf7ckfm^TD3!2sEsVgM};N->_wehJ^#+JuVkJo
zhS)DDUgfly*a_S{7MGaS-4$9V<LAkG4$fTXIJItGh<d3&!a6Kfarf@s6Q0%b>~z3T
z=mJK*^$LEx{(L{HeY7iGC(y@DC#A}==H#QrlRL^gCR-Cg%LndlF8ss7dPm|o9Ub+f
zlU_?>@n?*b{@f(!WK`L9U7qbVnu<`M)1-X>=RqVH85ya>@NGZ>?W|2Dynf9~U3WT_
zz#Tq>YpK5$Nrw<j)@zYdct_hnl-m9}DCpD3N3U{+p%d)vPG)Am#>bDdu^ARwd`rz|
z?3}Uz4GPxwadGh)2*9u^K?McEXAh&FzyUv%E;Vwb*C*g&(EmS?(WGGg`->7bgi--L
z-d#OaA5!KpRQ2)WTs|M+G^jmjcK+GB^h9qKvy+oe28t}n#o8gNUne9m+9#Q?7_F0o
zP>QT*UvtDZ5OKnhO0ez|LP^LE7@d_XcZ`1e?boz;xXG%5fPFvo<HBI+Emc(znjoWM
z%x5CcDApeC+G%TR1KvXh1HGyE%s`)C_FA;Jv9YnW9jx|Q1G&t9Vx%sx4xEslo*r02
z%jReoH#e1=H@_KG2_OHxKGO|~h>MF0v{!<ZSH2hn6Ih1%f#Rr_FV7wiRp89N{UNog
zh5F>>o|LOt$b{w?exbW1JWXA{n<B&=(6v;0`ug;L3qHN?eXzR$fD|KS^0T9(Q1!Kl
z?BVurpxc-^y5q+=MN8AteuLkOZh9DMpX;c8okdoBCE%FzulnGOTM3gtc_RaQ;xgqA
z!=s?6{znH}=Tu&aii(y%hiq;2ab0_^sB>7<dX?uKA79S(rzbKpGC&!DR3<9C*BAzl
zJs~cx#C~A)@L(@&qcMWg<8f-yb5?N{7M8Z8D+UQ8?U6CB*l(cijP$cq^PfI__0S1q
zLA27@q@*Nn^&|>XQjnbd`uT>CKf&pW;cT6KeUSSg{HZA^J-{WDl=!VrM;5LZ)E$ak
zyl6L2Gy%dR;-u8%uU}>s7WB-_yaIU;au10pfk=FzT42lkA*z7xUrmkA&Dq)84_CPS
zUYlxfYHA`TA|ilJ&HO_4xv43F=|Zaa$~ZMBk?rMQ=sG=CjusX=<&GnDhr4qJds|np
zUWI&qdg8p6AgJ#Z2>JG8*}&zopf5%z+Lt@tUIVO@avsB@Q@b5UX2-@ls(sw9TT-z}
za6~FqS64%=J(qqijE$uX_izs73~R4^X}|hg4d_O<z}UYbgz|n{BC~9OG}5S+J*T)L
z4ga;Vvf4b|bkoAZ0;m??X?4h{4t<RrEm7PB^OA2G`%jv^$||YPgAKjxF$?6+B_PlO
zwi=H&g?c&+mJEQm1<K^t$?AA_ldf@hyeXvl8nkLTghoA?+hofHVd2|#0X45aCZFLy
zFZ)bk{hX4L5=|SitA@`@IRz7{U%qkz_SRkRz5!Lm#KfGdejXM^kRlNa*Uo<U@SzSL
z!_P0DKZCZ|-QFgF;%yp8Nqq#4BzGz<DoRXDtnysoi~T-Y<4bJ%`^$5dTpmM8;GrDO
z#&6%gH8fmHAX80}9;mOEH=l%542uSReAmF>zJ&$Pt0YOc8$NU^#~UxUpu2=1`9>eP
zsvWxCg%%eV-<x?O<prscn%!95T9e87JUKy3s?>MOv2hpNAA_gzJNCvk9V*sUuSE0-
z?A=n^?Ck7H#?YmY+q5xD_HH!FsKQwmgAg<^8U67?48)t#opQ&MxTXm9++k_Oqa11a
z;KI}V{B}KAnh@vc5`LQ>3ld{$&Re|y?_7XQ2<F}6!uA}TG4y5+XRj)QG>CZiZ2#9|
zb|~A6u9T|}<1g8f6?AuX9qzBSFOGa<Wnv=Xo%kN>1&YdJmLB)-woIGToef|XZu3Pd
zK`**bwlE`&VGQWZg{>_U==zPhz6saLuMRXSD&IkR@csmua*2!UhB;x01q5`FrAi|j
z8JnP)>Tf1!v_p2>{h*U@{JKcX*RK#LH&9%P<}tf>uPaOQ4C1voeAQFiYhh6LgIR0*
zrIT!I^iJ2yT5naaxOG@%f|3Az@XmXv#@EX%vu7i1(<rL$_t`5~4kBa^rw58Nv$Jhv
zHjPGTH-ZKxO&uK<$H!B7K7cR+in#=wq-EQePdNs35VqgAC*Jgy2ka>H_#ntqfJ*?z
z_m)@OEMhXL&p?O!|I&F(dGqGYJ9q9#a`_18=O-?6f|Tax|NiC64WI1i&!I|A$l0@J
zmD0O#IE3!p#rti~A|e=nNV`vKfC{+Z5~o>UT(dgy9g@*xWG8G~b?(TcxBGibOV4f0
zc?Kb4L-nQPk@BJ<f|RdsA-}_3-24vh!UkFX4<R`b6`S{b|A(xsEIMvAL`g;Enx}Rw
zpRTgx{fTnUp~;L7D={|3+9yt&2nh)ZD^FL6)tirQ4(O@1gSa}&#no&f64M=FTfD@n
z*z?#T;UVPmssRYQ33~W}$X9lx2D-6@{ZsBVx;R=lI)EN`_8v^ODewKK@)SB5cW>XG
zo|!p!?i?>S*ST|~7Z(lg-kqJ9ffiHtnaR~Jc%PRS>;M9%=^69yg@rtkH9p-O`@s@Y
zJh=V9gN?pWI__5h_TRs&>?uFhms1H14F%!}Qz@?RHSv(N)=pIl0ptn@2uM?mIB~+L
zF2LwROh=Do(u?qj2>tzvps!_>Hun3~i#l3bS~qTlL`Fs~iwO#<ebDCH`=A(c>aORl
z!*DvlUo7@vtdL2-SnZUljZOAb`_jnFL*0B`01LqCqqXECXvYRTo+EH$fBE0qoz@w3
z5WaND!`1b&=X@OJ1UQs1j5M&^t$5LaQoC4HE^UG5PoB^aS;fW0Ra8_YO8a!RwdMb)
zo8U<YdL=(00N>XA^Zwil86qqu_DVT@{I!LZ)#5<0;)*BS^v91M;o;#s{F-MQ{+Ee4
zL8?7R@+bpckd<=+5>DLdC%y4grvzX1QYXLjUdntii$mq=D`F5*Ui`dUX<|N;r8&(z
ztpB?y8fBi$NVC7x)nCVnuI&Qdf9llY%nWagvTR|}&Y|#eTG~!V`Hc}G1Rx)@sR=0f
zLbHbP@$ucQr2=WZ`TwlnNmUpH4f{c_i#ZH}_SVVLIDO&5N>{oHB!JsgoB#gy3J!w>
zuceu*m)FwL0@kf2@Cbe0=95?MO*q?=9TgwX!o)QF=MQB5d+9`@Pc1F>tA7AYzm?kd
zl2KApl9Jvjv5s8DB}&KeB$<JSLDvOJS79_T7=o+i-6_5yIhC!Q=?T{|sSEh|^XJOS
zigt!7*nnrkKX0n5tNRTN`|@>d?+j&=(s4mM^}N5c20nDO%psvroAV&+f_m`&Np1`V
za~_=jNYw`LDd-U|u=NnGf(B)(($_pja#GUl8*S!IT+oHxsi}_^KQ4hMke8QVy{jI1
zL&o*blY|6xVI+XFji5axkZ;M<9#LoaH;0`570$i6`qUH@?j9bxNk6%zrK>@<LFhmX
zfgY&yS<6^0gS6UQUl%Z{Dygjv02eSaJWO@+^4Vv%mWIj;-n@D9_U+rhGkv=O8Z%b2
z9VYH@5rWPDSJs<B0I7<u27RaK9jGgfxBpbN2pLwO6lre$JB)!}@OGixJL~7?!tQVX
zANE7p1Ar%t!E?U<w5SINLV(i&P<b-`yVk{d%~y2$w)rNUGC%KWo>iZC9j%bVmlUX@
zqm!xjMnFJ-f`Vdxe%`7rG5f-`n34G3Pnu22B>xDeE64Cbe(F_U2|Sd>f%qVIYTVPG
zcpG<SWq)VwoO1Lugvf&j50X4h-bFUl*SoT%Dy$FuR#jGb_wpXsxlkIh3NPo<k`jUX
zj`SBhJ3A0Bw<d0Ha<-%Mv10i3fl4R)KbXr(i-QVr0OUGFBDMJQ(<Q~K7u(n0oTZ5r
z`Stx%uD)04!|1GzYX3bnIP&xJp;!+fBB2PaEiJp73kE$KsCeVtl?|c1-j2tQL4rYm
zJ&lMcFD!I+aUrFmf)=&V?0bp|^XVg<_IK+828E_qG2t4!cnVO?poYLh@V{2w1iR7E
zq2cShNAR8%(1Ny;cvt>k4bIth>c79>%&_QZv^My{pub{Y)U;pjuh?fnSr<JhnZ#(&
zQzD7}4?lqU|L0}!aw~inE_@)FyZZM7_PnFVl*IMnj1E`+eq%b#62aFzwA0jo_^;71
z_A3jTUUS*pw*>mHKXTGs5{Em?u>H@)dVv5e^UT^pQ97HZ<@#N=sPg^7LZ_d`#Kn1Y
z%vb0aELIQwk0npm>VNSUWVWGuQ}an^Bh|iIh`d(S>nVj(wLYa}@xLJc{_1>!Y~W#^
zNgz<lL2CX}GLYC{27pz(0Pr8ITYs_&7{do)utY%J-=etpc6J!-C)v#^+3!tvyghyT
zv}@%)1ob7`9-jUdbZ8n}Q%Q*^y5BlnyF0+<?VT!jo3tCx@0M7<b)5l_2|sm(g@M7+
zbh#iRFpBFIP=s!!t7VKqo?)d3IJes$?jZoz6F`y&S}yEG3-_;aMV-9zKvY0rez?*N
zTuNIfIbZ?`QlK+9udAy&fg%kn2g(DmeW`R-E4$~@C$suTq+q!|tb<AeSOh?fRZa)Y
zIC;_PnJc;%1RzJfU8sUc!2ULfHJ(>(3E~ByIZgaGbU!T$0q=z!N;-M(tXcv&pacz$
z^n^V#;Y&AV<z}!*08BCFArU!kuU@@^lsB&R^ZE2cp#!915Ecvx(Jbd$MBy-XCw#^z
zWQ<Ofulibj<2j3YQ@B4s?8|d1t5rH_1d>Sr-spmvnrSz(4a_=IuLGR5z4@7XogCa~
zOal6zEws9n*J4Z4-`1Eq%gZ|hpo;DSx^t(vwA84=*$i}HaQW8a2ss&<mhou-Xkp=w
z{(dI>k30jgmFvGFWcgl&vx+<ZtoD)TDS{SHNl5|2#qU(>vu5SNu(rC&0zwM@B5OJY
zk$Z8aog*EX{Li01nd-?WyrI@>gQa%hV!uSNn~X{3Mn@!4Qc&CoXS<W3`kJ7C0tZkV
z&U8VZQ8F-bB7j6+zmI_W3<F4>z}=Zl(CriE**6GXr6IIxy_SA9GbWUlSa+sE*yI|n
z11?7z_>HSH`hP7;rn9q~tM%U-?C;Mq94s`ucD)4|154)U=-A8;2II~XW@LT3^Nfgy
z)(0iQSg@%)jwasT-upXK$%Fdu<%7wfH(~{ix&r6`-3$+8?Wc#zoggZZXRP9Ff1mH=
zfMEhdN((XseTpt-)AjkwmoGnm27G;S8W=#+;&kkHbO5%*Mw^v20YuvVasxH!6R-q*
zT=!QT7@(CvV&p(q`meQ$hkZ`XDZW8UN_ytTvqJE^24(MabLZY(dmJ4LS=ZOwTMGBn
z&DGo3+=Pq#2*@5A`}9yuOiWKt5AOc6)K1^s9i2#<_x?RdYQwkk!O%N9ySsWhI@#d=
z!Bx|XRR$bX#m2^_rI}}IrRV77T?Ti$z3qKH1ifcjSy@pL841blB8!`EE_*<M|12#D
z#eTou+?#Q(_olLPQF%GYX85@TC6D3LZGLrrDBnn`aV-CW`4<x1s(^zBP#AF9kHVjX
zg>}^qLw}Lhbbx`I>nmVXs;pWIQhXy1Km_gTdKM~G4iSq*SIjn*TcmXd>$$SI>G<RQ
zoyFhhB_(|z15{!KM+(gzmZQfOc-ay|J~h7~5TQQ4zJ0m+>U=Tz2IXzt-Q6H|cQO>f
z7DGbR)YR;4Ey=o!D>R-_2T{`2)`pIA!m+aQTFT22E&b;F&hCbtgKheU;nBdOn)~fZ
zkjDTtK(y^&ztVI?ut}~il#iC#^*Mr$K#c1Gu0T@(m{78aPJ_<ATNe6C(4=-4%#(+T
zet~fwo0!Vkm-iaOjA|Y*;8eLl2i*yOfyKW#eXSabv$-%gH5Cg|!`uc~-*tGHgELjA
z`-qr#V}76;<QiyKK|w+2Rs=-rBSzQCYA6x6S|Tv$&SZiUB%9lxuaSj?g}<93$gxe=
z<mI{468p0>(+&^zGT*%e?;-)B5tyBUPlu-c&hIiZXz{?c$<`d*+-SO|Ic>au56Qt!
zFi{t@_Tg*oNmoF{082}_{!xM^L06m1RA)z^!Js2P6c^7yylZK7eF79=m+>3JW6Y)t
zx3z){1!X;EqjmW5w9=bV4G1j&(cSh&ikOh_`t|D`OFz+3azN0NQl6lJCZEur0kKaq
zHq)I6Ns$e01(ns-((+s!ejO8ou4sI^9m12Dg~f5OgqMRujxR>cakw8~7h+jPMkefg
za^?5l4C3BW-Iei1#b-<(Tqm0Q`}?&s)jVc<zIAnpNJ|fQce`!O_MSR*3iK=}W)}s8
zW5|^&HQ+8!U3N!@{lZjBBweZ4W#%U*t<25oSXgF%{c-`NMlGc8^*Q45`76GgEqFY>
zzFuC^1zM)uab&Q>CQ5-b^83WvRC~M2ig(w$n+PbBSg8h3eeVs*1pymnWNM*4K6fD~
z4M0qzb7YpsK0zd*TVFx=AfFo>NmbHPQwgx>5v-{Tr=xqT!-Y21*8u|APo0u+7!(E3
zv+}zsAt3=8@r`U?00hh##qgfn{41`|*ZGE(MGiw^sDng@-o+h<0VEN>y@hg!#<)v%
zKc+j=FwuOvw!i9wYinyki+<NGwqAz-hvUi>hT=QhJ3H4E6e_B!CcPh+Ee=<rLp3_t
zT@dXfBO~Yt%|v?rrSS2_r&tM})jyDEs2;7B2d<rLd97XO3%VpZ^(cA96X*qkT*`BP
zdbqN9HRUz}04N!-?+s@@`fv=Q4^C*<To{^aP1u?%s3V}sSL=n#1sv=G(V#m>0iMyT
zFNOYj?_zNE?%hGK33I)<eYO6+6YHrtYhZ(1BMkKecJ)k50wI;3vx*a;?`psm)nAJ=
zHZ+_O6m&e?N7XDP6_uE%=rQM|pI3k+0BImAg}AtGSY)TBF!1Z0<>oH8?z{&n0H#p>
z9x&R&fBvy*PZ|M_(D0bLFH6%L!W7a8CCvv9sy=-9kdR=|o1?3qD6s-92Qdu_e5Be(
zJ90{V)X)6>{c@XbF0j1UpPnG4ZG+rsZEbD*-rN6@)8UfqpRd68jbFYH5fYM4T>$3=
zQkjlhZU1m@$;i+!H7zZ;+Y5oX2nh*k&RiN~leGKsex@^x7-hS*M9DSid{9d4xAPaD
zuzTEnu)A)vXy%G;T@K(UY=4t8QZ-Ka7adCuxFn@tX~*O)gaB{os=N}=ln&K|3P1~h
zIv_Kl)y>iQP+m@~k)g``tI8KZe)Tdoq1pA}!-v3@=RZ>*=mX4)_uCW{70HwR!Q)mM
z9`0_;X{9TZ@=tj`N|Af?`0<p)lK$;N(@#*xsg~Epc76HK1N>dwx8l+HVi3Cbt*q3N
zWzZLPpqgRn&HCpcS<d)f<Kx%QA1=P%PUg-H)F1WEhwGe~eLK2|kV$Q#)JeGl<C=T-
z?rqKwpaaiQ-zX?4(OGM3zYTgit%jhhzce<UH>}VY^6zqa<GZ!^#y6a0;^{D`K)pog
zxYw_JyuDQu#1;mM?*ouTezQ2(-JnY)K%n9B49aDER?p&~sG$P7N@{9E=)UoOi-H=4
z=4~z?nDH&IFM@P>U;U6TlWBEhgW(<#(tP2eQswyh><@XsgE<n!e443`GBc;<2a1zr
z{O{)7EgkOdt~I=hvKeFjPPz`?!LqBY>+bGuW#*EosHjdr&sEOIo_wQ^&T}z=d{fKc
znwyX3hx7O38EiowRS9l^UXx7XQdd)R94Ja3@9qJ~0sy_YyW2dm3W-O3@^T51dltkw
z&1<hu!^3_M2Q|K1dXFffwM50m0rVvih&RAZI8{f|{_EA1gEWq)Z#qB!vPY||*+b`h
zZ~fX<Kn4I;lW=RH%bk#rXb5OMn<k_=aYFB-=K}iT<i(3?a1qdbi9mj!ZyAmpv%lXl
zF){gFHZwB=(mL1ZW7)@#zKes5H{UGGqld!aI=VZyaWzf8-}i}Cx2ZP3XOL1P#cYcM
z#Z9fPx3=#~aB)q750rO=%x1ik(*Y{_F*W<{-d^2<4O{5sLFt_b&_$3hrB0&(fFqzU
zATvN<YVT|Zjf>bi&NeeR-F)t_u|Crckt1r~Pa_A8*4w)xH1y^`k!9ovVOaKQH;T$1
z{SU`ijU0nse4pTxQu~wDEpi{wHZCrXEmSL8rxKk~;a4!D{Vp>z_T|e|Hc7*ep11au
z_-UTAT)O+wGf&A&LQ?YlouaeQ5O6CX+8u9UBg4CQ<CmWlZ`(F&&skYm@FcxDal+El
zGSog{udD@vSZ2dH{>c-v&$35V(fs;tU%#TWno%YMC;`3YI9gj{+sj8y9Z^tsh}Kh6
zQ&UY19lHmBsrB1Ix2O~DF#|;ID=--?b1;C25)lzmdviHB&?Hwc7JUeQ$?+oq8DvL}
zl&s*(%ei*VEiEn3noVE6)cS7aTYi7FxVUI#Wd&LQ9Uw0#D5$LTX^p=`Ou<xW)(`^u
z`LUt`fDQ!Z(ZSwUeHOBkjt+WOx}L)U@eAH9$%38>3JQYUcL2Nq0|5Pk1rLS=0>Gee
zmshkNXJbQ`bOH6kt)7G~)Cr~l0=ToY6SN!z2dkKUoB}7hjyl`|!zSe^z{^W22e=yC
zd6IKtcYB+Og~itXrVG>@7=OMi{b@{0FG{@9-okE^s%B(?zf`Y#<9<Oi9nU|vG+f!;
z*{NAQ4Elt;A?!ziiL6c6JE$OhmjWL`$;t(Vu(8=WJpm1T0JtMRQD9g(zO)3DKWd<s
zCFxsgj3vuAt{DVX8Gp%c^3+~*M4BKmAeo!n8Z;%@=@%(bX^=3lMQvUxa6($f1KvGl
z6e?+1{tYo!2wGLZq}Fh{2x5*+Hoy<+2-(`i9*9c+`)!H5iBBNpfqr%J4ewM2LY=&U
z)C&uRC+toTp5x@KZ)`lLI1U*#S{GPQ;ae7X6aeJk*acK3>$klOAAmF_C<HP5%Rt_F
zd->PbuU|>&xJbmA_44j+jChSsd_AfUCT~ulq3vW;A>cTD`l`1Z^a<eF=tr;i;o)lI
zng?K0WDmE~A|o|{B;o99*RBC9*_xVae7J|M_c;sYb@%in8e3TK-&vi2nBzKomWh?M
zFI&5*sVUQ-+_AYa>-!x)gKQnt{Ag=;lQRlteN-{t_R#B#c5!h5Q49#fYgFY9r3E(!
z-FF8_92_TKNDkB=Y#ku-&nk~xaM9=QmM}?qzP~5%{A(9Pfv>MGe}HFeQ`3Era)^L{
zfSA)ybY35nB0fI;l!S8%bST^d4C*a4HPFufrMA7Gmf2WXF2ha1iNqx&^yTQz0Yn1t
zg3$tS78Mq@?s^xx`dJyNa-S&zvR!dSgE`+&(&4Vw8}KqUkX0ZkLHz^SI)Fn#7tR9P
z(?|xI6$tgFnp(b2_RHYl>pD8oViOSl))4M@?%d(x;(~ihyG=f;tE*e~1YH4{%C6;D
zY}I;rxaTxc)6w0X0AaEGs{!*wh+(+GB@K)R=qd_w^6w*DK38U44T`Ov>+rQ+aB#G?
zo`$e|{_L5Swzib}wDaPy<ZD$iu>N2UPRa&IOGq%`fsX)@b*jBxK!g&KpCGw50vZ6-
zM37ma@Zm$m8h~)L)<4+3F*b~DR7^r*8~8Nva3?b=D$4nrX-nLN=BO7p{%)13${G39
zqG)yEyLy6HYfB4-oSYo~)p-LV3MOIC`F^-Q8o8+8-&wVUO9E-9t*q;tS3;{A);uUR
z6pZ~o0sV`<X_s>KVYCzvlnVL=8i9}fg8mdb1i*Fc<@X5?mRWa8bKumpwBP+7%-!CL
z`R}4cFcrrwe&xy)VPTE!1DR}{yP0YyWo2b24A5yn|E{*z4kiZLEnKky4zKzCw*>{s
z@$rM;TPDnPJAl_J-KI`#3vqXG|M_?Dss0ip=Ptpyf5#nrbNA}%Ln2y#<QXVFXNk$o
z&08n6>B~2Q*oSngd*Mp1XlrYWE=yit?@F!3-JA>9*PbA*{%31!S_NMiG)<mK!YVUM
zJOZer0i`n&VcSi#u(Tv3B9igl6!>>(Uuo(6HNkRW5Qpf_p!)fSyt82)Q)7R=MFAZP
z&EAE4RQ#1zJ0zE!`|cgUDtDuhb7f^EL)+3#2Hi?fz=A&=ICkrK7safTa4}i<JGXCV
z?PKQKOAXO!0_r1*SCm5k9iJm2LLNzqlP9kV1fk=6<Y4Nj1Qm=cyzls3n#y=y>*>jt
z$Vc0m`Q-0R2ATWvEy5eIq~p1*ahKSUGsK))kI@0V&MDO=%<r^ptTI$z@J4+Txp;IW
z&lP3aEMh4VacV@~GepFmgVV#ELF_XKPa+~fjSXl(pmYE+bb3H|^WR}S&Np4U{mW2G
z$Xwu}I$#cT{-!1`6iuhFE$L{A_sL`{3xnCMC(~)ExrONX5dbL>Pz=%Ek;>$-@RNoN
z1$1<DPYbye)-^kI`%^MwA7>lYjP(+nUw>PNVQu@B_+?$X^YNj(s!-_58^VKOd6~}2
zKG|5ddo)px0$b1ZvL7U*Ri0WGyZ4(pk+wbX{0}RRYu-kby;kO%cM=bzXS2HlPIIPm
z>b$LPjmi|#5xmUgX}A*a#rj0)?KFF6eh^EHh7CywaywWztXsol#^(~jnSiFH$S21N
z*}e<?UNxvD>^QaXF-7H0^qa8k=FHzQ8rfX7RP`K4-FTmyL~O7?<i5W727@83vHGXz
zx|OXdO?9I!a#~u3m?E(s2%kRR)>vopu!>K4&=VcL-DKajM^m=%PZ)Ebxnuso_&SHY
z1S7FC(S5ctj%q5!ZDER`$NrK(ydLja+3UR@rJ-zG(@%Vg<q6hWdD54mH`0-JIVZ4X
zqsOC;hE_9@N4HCUr7AuzY(SYR<fQ&S!@Zg()8_i?UaT!<heS@ZX@?Tev=jNCzMJaR
zHPo$k3_9`HS;_A}Ig9?e^{<Uv!zICa<MzghgaXIkF6h2K&SOT_9Z{K7waCcH$>*o{
zYEn|mR;OTf>kV-;FFJ<H$Kc=3!4&ouD{LxeW%oLXx<PoJCp?4Wy5FTM)4VtKEI1nE
z=D1vg=UnLV!LK87l7c&gAQG&PA0N%xA0e9X*tW;gX0LyEL>ZRpQL5U$Aii%!?b|ry
z-!IOf&EVvl=EWuAM!oUv7FDIpy5$Ru@T0f%TIcyYC|bG9UT$9w5l(zsNhIuyd&qD2
zo0k1y9CFOhenV$_8SP(n@+C2vNM&}F{$>6EqhQ^1%_@QB+RrM_XDWT_wMRIAMUDsG
z&boCgY3$~$p6cgA$h=t~qgUxLp+nn9`itF9)N+CA5ek1Ohqoo>vX_4y$U}6VfUM+<
zfi(C!u?j4WfOjXLp`|r*aBwg;|NSR=O@Gd0-153kb%<U4A8D5EwPs334~_d&lZbGL
z%ZZ}T>hW7<qs|n`k8U1U8cbdAwAXK&<)HGsR(_>F$~>1P>#cX!*jiR*{$4Q1!PZf)
z)ny_2zqP0$W3><&fHa|Z3f!4sL`MDAS`QyK<^Fdr0H_()_mz}G8TV$bpS`-ac#ONz
zt!B1s&6a9Xf#V+OE2J>k0U>xa%5VMH^JJ&yh1=Gb^vK;_e&OI^=?o$f4f^)rJ>v}w
z>EPQDOT#vQL8=tVc=j)53wAL<&)76SHR=5)fa71hc{^Cp@{v;E-OFQmuz_Lk>_L$H
zy6z^r^iXDL<&dK7(Rgx!n8(cZ2_nbsPeSUyu14}?JqX}Kn~yU?HCfzo-rC`ZVTt!l
zMdvkv^XD0OLqkJ}>%%{KIqRyOO%)1TzA^?7t+-;}a3@iB=V{|?*V9LmEhb})P3#xx
zO|Qs?Lf>*aSipg94)(3+(UIkmEPsNbAmfieBSf59GiiX%q)sbkCkGik&WrBp%-&Q`
zVCR-WqxAy%v>`Qc*%5;7^WVo6ho8{89RK?;W0&}EQ~!N*GR^)syl43AB|zS_y^#_!
zs-kCPyl-POGd_+EzKd8kPiINMxA<uOd*<z0KObdfWf0r^dhbDtHBhpO8CH9*z;7U|
zFY`sB_{;X+?wo9U13LXuqX987F*|$mLt<)hBhy)*+e4o}e-5(tjg(hd6{mv2dgCv&
zS~t}dcleqp5EgMqiZQUcm-*DpI#RAuvWRwg@K%YrPj>*1ARySKT*e>0dGjV;Ww^v9
zDlILo`TCbHU!Xv7m+W5U&!x<-O)ElfXf{#hht;L#lhgVukj+F+gJvbj(#?If7}n9(
zhdyfs^^Yzy9nJG=aq)0-Vd$Up^`oPK;JpbG?mL3WIj0;=BmaJFsvU|ySEYcU(sgA#
zxcNG8LO?)3-Ttb|X&vnBo(o7120on%@EC=I=z1zzTF5$x8kgT+z@?xI@;+m}_$VFp
zU(yv{PkVcNKR;<CRN>{zm*^Y#=q8r`zAO1GJRCLJRRIUPz!?jpb)(>tpg8En<L>T{
zVBw1_zdvf>z7;QO*&N-`p+QXi`1G|92`Q<q+1|OsgT2{VS;ygupEbUy<ra)hc>Oxh
z=%bj3$Z<Kau9rRMZ|CaeRa8`LZ*PMb8?N;?u&8_X{Q1$|=n)GO6N!WCpRbW{)sv-?
zw2>lzQGo1>y^^YG;>G*mvpfuqJiJHh2L^VAE8V`w3K4g_z4jQy7lBZ!^Qo5U?#%Ww
zhas}J9G2*|)-PJm9sf4ln+vwv4-}n4*Y&KqrWk(xA33^qsK{-O6_WMebqCXoT)lb~
zoeuu=DZfc=HD{FU(f&mV2?-IARdhzu`o;zbVJg$T&4ta)O=DwYkVk~*g4+vF2oRnK
zgc#KAu9<1S*Qo#0@85JxOic9j=%g}GxC=w&OF-eZwY8u~7(<y60kCj>JFC!n^@{~}
ziYGw>x>oK_qmP14EkF%G(w*y3_NybJK2;6902&axyuL0fD%w+o34J0%ll&JNPl>%t
zPp4!S`Sb6bwcXv_D*kC`bufV!#KhFp)v3wJyDMsgf<C>w8TCFdZ)1JkLgcj$-@!~~
zG6LRtV}3xJGZNf|qJqNwa3vk??b}~aouLw&VvBFb5oTs)bkhJ;uI|QgQR@y<FvHEf
z;O9!p%ZX9l0h*mO6wE(}Oyyg*N{fmfY%jlk_^{y-Dcva<zbp}TA)x{&{7D(V{+~Y&
zM?QLiWIsGSte40NW8jCv4h{{e$BWK@fz-0s0{inViaRqsotcGY@n?-eb(?D?Iz8{&
zW2%ki<v4Mtq<f<ARqnKd>*$m|b8~aBcl;L9zkazak6pcge~Rl?ykV6)Z&Ne0H8nLg
zx~U<$P+ezzeSLp_e|`P<##|p5Uj!uj`fM+MW5Zbp591<>(7$8B2x?fJ$M7JT?cVz>
zTKR0wzed-}6R(Zl%7t75HzWVR+L{Nji%;}l3=*>k|HmZly$q(H%xToo&MvpR=$^Sb
z7K;ts{zdHO=9aBf<?{Q+$_7Lgq~v0PxD!EPQBnLA-?A5{n3;K>@nL9aXgD5GYGwDd
zw>y3Mhp=APVg%&z2!w&#*%Ly>e*J}J2$&(=ng<@gY`37v6~o!k1^n#o_rWJ_@9yS2
zWk%468ADEWtxy_KYZ~0YcESNfI|5lQ21ep&e@a$T?6rtx7?^G6S}Bl`@81io#NW5F
z$_F{AldVO^t@bQ5^bWL{4j;o!eZ}tq)h@q70NH57MD2dq&vd0j1N?4^(5GVMQjMcw
zXNL>1pE{K<K}cL^*O!0l$^$?f^!-S1ngq+e`X+B6?<J3*(vWJ4J8M%2`b_1cmlJsT
zk`mFC8(-hb2a~~PZQZ7ljRBzM)e<Ex$jBTHmfC^EWVj&+{73LF|8FRXBH22#zkj=d
zA8t($&-EQHGi_{Y0xT>5P!SU=yOkg|&JWB;egTVn^ym@z8u9`V3E+~d-DkQ0w94%V
zw8}5Fp)-{0<Crb$NlqZ>Yx?^6Y`FMKcE;7-ni5aJ>rhir^u(dhZo%;f_n|9jtEhB$
zYY*-9=IDL|k2>zB?~-kt23mV>XQ%P==lRh(6Q)?9r2Lm+2RxBVkCZZ$WB3Y;YY3LX
z4MLppEcNW~tTjDjPGb`$5j3vue}AVKdWT#yNDSQ;`oX&OdHu5DVuK=!Z(Zps5RQV+
zB)XFB)g3>699p^1b)q>sI{Nj+`>Plih&tkiaQ;JdqVzg#XYWWzOG^t>G#PMwZL$@}
zuSb)&dH>)5toq^BXdu?v-CY`RHc5;zByD<TrZw(@Ie=<Ca;ou3O1+tr6Z^@Nc`H>i
zMRvIykxHVDFU?OrPvBvUOp~CUoScN7j{Rl<WP;AEi%Uv)buc|WT>-WMNlHorK4c_{
zK%WveHcosFrE9h$bCaWFlhE*)?gJqHS?!bN?K{yNgGOC5wW&^lvC$6m3g8;R3F(D|
z8(WJb-?xl-8v_Og2hn%s0T<A5Fy~+O&^*zPU(nLdQ2oo>RYSr)tAEZYhP%)GI1j<0
zQD#u?IFluTbar++Iy$n7+201I4<0n%u#&U(5a^Bmq7=Xf*_02E=7kFv<XcS5%zpj(
z^R7A+;&<HsBZLD>?z_y)a&&Rg509(XfvcPbOKzH%A>iX7Yi#Z91$uH!>H=8S#KpwG
zbQUh7t5AVm=Un*)vLP`skv;-v=XP8mQfYU6rr7k;KfssZ>Carcq$_P?(I>i@mY3%+
zP-OXgd>rY?)h~dGqm#rgTD71L)hgZY#|%uyecl}V^bpLNeziXU&GYBCp0iwfRK74+
z3Ux3JH?{fp@*I4rvxAKNhELrqArlBum(wGiotjE#Ir)zLi$AlD*K~B~abshq6Fb*{
zmU81bi}9qz)Ei5q=rB}$sjUk-A$V&`2=s`dptz{0VW}+xuBWF5m={vd%F>dVi3#j5
z1p3iba^Q)!!fW#KdIiP@hX=mbuAyrp*!kViGcl>V`jDuyi6C3Gyr}4<a=K(l;n2{K
z?}G=IrKHfA)Bqn?Vk%X2^*WEaAAoTv5kixBE&YTJpNNaswmgKKP*zhju5?Xz{$O(9
zZB9f)L`{u9=qI}4$H&LVfzwOxx1U0wGs#Ful+@M5#l>Yo_Vs@-2Yr{j$ZYBFe^6@I
zw+QF}27mC~Q;oiehR4(e8gKt8E-qH!{MOQvC~EVvkP)a^Mn*<{3lvU1l*WH|9bIb#
zZf|I06ij*>gO2?5-w_ut2mNN2!4()7sIRYYHk*Sk2o2o{q5t5)gRP}elWOk^IH3KH
zRaKC;+jU0=OCZ{kq<vB^7_x~wCN59=85$;z2Ql;9!VjX)xJYm7E;8cwwwBuCFR74d
zkJbgsS~k<4XMOQx8oPoj;Io)zV0TVl14inbzCJ!i70y@VVvf2+EWW;2US8hcXoTos
zXJzG=`8HGSv&N;C7}ws+P^DhZ4s0)`ozc!J?&%Iu2n?q8N<d}XWb>%F=-b39ScKm<
zs3m<5i|!49*FX7pu2*kYR}qO<(33EYd-ukJ3V$2dR55n7*D%BbH9n<&b7Y-&r<iMW
zNX%i-{a1Z3;qBL)TQi$yXgf2*QCptge%^jNwe3>y%JqzljQXWFq3;LEolNxg`_8Gn
zLbv`bpnl32DwKnkjBo$13veT6t>qbP`N-D~x)7kv{qAd_=0r(1p!rv4RzT1XZjsP-
zDn3Ooe=dYl!6(Dp`Sp|OwTAyMKk($)GjyLlbQQVD)`WYFVV6LLtWS4J23&cL3VgBu
zp6Cr}1Uep+pvo(Oo!yPOl#~=;KXfVrMA!e*4pf08L&q0~&^NK{eh7$)Mw>kpVTI=B
z&z168r1!Xvx|N8(#jUC5&9M0Pl8A`NwbHPU5IjH@<OAW$m=7OTpng`Z@wyz9*`oh?
zf{_Vz1%+t+Q04#Nv_t=kSFbjq6ipHAN1(Bx2LVB=_*G0y(6?{Eb|hUezoDS;sIqd0
z*eWh5X>n>wpTk4@+vm^k6he;+nbh_e(f*yhMJQi>k#}RJn;S$luC#O`<5t4_!h(nX
ztK#A{h;hIOsuYk)kaAW0xpM0>-S>ye9IhLY{~ai5b!Qc8iNC}zDY*jz$Dqu9rmtWW
z^e7-`R$37{2_@qeD|qVl^>r}X&*xZ~m{j9MzYPxFRaaN%in^KJl^n23D%TjsfbQ=I
z`or291dZd#-V<^Ui6}uj6?o76`O{N;Up-Xep1nOAE$s(LyAg(4Xvw3wt0-A*dvnfJ
zqw5fXi@50Yv--sgnv*dM(Be!?+YQvRaR~`3>0OYuVFj`-<DY>NMyq}3aL}Xk1I5AX
zyxJL{b!z?hPT(P`ii(QdHHV-JPhNSTBY93lM62Q=mV<-iKa=D9rO9TdexkE47Z!ru
z+($wqBB-gTh{h%-e?X%}ajS>Dw|8*J%Tkw@uSW-lb#nC<fR*K25L2jNLkMN}bzLcs
zSy8JNrU`ljgCP)Ob2Bqwe<4y-8H10b_n3&tuP1t~ngKG%J0Ut6ot*;#H3!rL`gW+?
z>1c1M4kK~-@+m1#0rdoaD<7?-#hZ%SvI9dyii(Q-qfP%AnEo1hCO9+(LOb)R>)#>9
zRYm=ayg;VTtAD<I`t%9i#s);$$B(|CO0qQ5+;!M+)6>=fV8Hl5m*@t8`uT>mCP&a@
zVHb2lLPF}_-2`pp?CL6V@giMUY2wYB>grAaqm}I&z3BjLf!!ImntA^>e*Bc&&4rG0
zMug=riUBpuqx*jUtg*4N0jyC|Qv*AjWl~og9){&;QSPY=JR)ZlB-vv7+?sS{Xmqsh
z_J@0}mBSq!&LEQHccDxK1O#2(-L0*y5$v)upgw_w!eq_!3JOM3u41p$BwmPXcIW5k
z&(?{5`7$*zE<T=xk+B@K4oFfg_TisDe?TrC?XR_8eo*ue+9W*c?hIn<bLa?Xz~yGc
zN2**=-z)~-gA5iktA8{+qn<3I8<1oMW{#y8=t(zMuUBNGp}`z_vQpo;#5(fJ-^)A+
zQ#gI)xREtT^`zIY@AQ<?pc{v#<`ba(srhqyQ$Lk_RPofszcVBK!(__;GsBYX|7G$e
z&$B`^ASAFr;Ov4mPW=6tLE_D0N??6ZH2=JP`!@gI6y!V!V1Uke$OaLbC=vPZwK_9Z
z%FP;pt-;1F&CFzXYyCTuG}C>Xzq2pj2y%D`!v5^>&_(6be=lRy-8%x2x4G6X3p9ex
z6;QnXx5%2mI&}M&=L+h+G&M!AimNH^(Ea`M+s>Q)%V2;(21lHf(&LIc$BiD?7s~11
zzI_9aQ^gbc_onWO+-BEQRa=0>xK-mcgbZwLXW`!PRj<wYJ4Vq;e{rZPElM%ft|#k*
zc@xz{G`PD<z#?E%{CfVj$#hg&RN<%L;o*USJCfHyJAmSnJRbV*M=5J2p<I7oy;FZf
z6<B_C0Gtz9=D%}N`JDe>rm6nV6Kv)5=?ar1-7+8unt35!H8nLa^M(JXKIL^o!j{d^
z5L=`L&!0VWzx!_o%{*~z2sv^7ZvW8GT*(u*S|TKozlAeYMrxl8Z7{0Kfn}#b%?ZZN
zRnZ5N;@fcnZ(|gbi`aw6eQqAP`rS=Fv&jhOo$hex@5nPi_hb2Y_(M8i|8}OO?y-E#
z8;sZ3dEsmB6IdKuzfKB+HMJ5((lpzO(2j%j1=fhXWSIJG{>d8zcktikh4c$)ZYRdB
z?{^XhVDhb%lL;*_uBQ5*81hst4+(w!CbLI$0>Y~>uW@X*F)ajta1`6Lh$-cJ>^P2M
zjLaEpO{qil6SF#BciWVU1A{~ph+#wJI134RD3SiO5?4NFrYs61E-N~Jn{{o8EO$;3
zZS31sEbnxxy;p$ABqb#o`1R&N?0{HZ1X8$tJMQ`O=i$n1<n-TVOh^geU)Mh*<uU1C
zkf2m0w#qj7McHvuLaSpUfW%{=5SvBp&bRJL$k4+UJKMFEDWySpJB#-U%{E<}hV#T^
zipbGFS7g?D9QkAw6@%(<;&=i%vK|auPz{dOnZ6LQLJAOlQyLB0Z7dVXF>DlWNY26Z
z@-jg`#Xg1!ONU4bV<ZSgF#$w5NGM(;<(M#SKdC4o@)`3mC^={gf85kR|9@4fYDnYX
znXu@Cde9-D1cB;&z#c*6JODZA@nqK2x3NY+p{e|%1jZN>>{gIF2SHYR%~!%F$3$>U
z94s%efnin?6p5IwASqmw)`M$fOv|T~5KrtS48n~;usB7z%gz{UQjR^_x$t?9KX}TG
zjY`V1i0jyK8gdI{3b}u4rw5_JF5$}Ygr*7BQlBy67(_QnM~<qR=vnVlpRF9#JIqGV
zu3UV^(}~&U7^EGeKK6KC<$F6OG=6=2cIfJ9G7WLxK6N=BXA|uQ6w6Y}(tWluxCJ?a
z7bN!WwU?<<&K5F1Ar=X0!t<vPA*S@sbV^t)+#6i5^&w|dW|gb%W<k{^y$yRzavJ^E
zrR8JZ$37!lL1#HI%g5L-`lgc0tinwFq=v+Q@HPnE##Bg{QG%j`D1=}FH;HF4J>NmV
zLrsA_Br?XR<7)6HOvyTq31f<I^rk|~1l~mRgj$%_o(Ea>G#pq*0`cMqx{veMEBCHT
zOpappgQnzYmZ>TzbdZ$EZT*46$y6xM@2ev#Y5tXvwU@P&>d-Fo2U3Mtn>2n$&BSvs
z;Va>R6f$lL(NG#9B|bDmRQ=@pB+(cG1fjy4jWLfA&L5k{?cq&3*}^eSL5Ff2%MP9o
zZjDiMoM6JLVwDNFapMCjMnN8OCS!!o$Fi{d6oxIvm&vxz@0B+1t`pP}7vTzUrE;<y
z%o0TXx$VSwf|TQ9*k{L{;fhihI9?#v5N%V+<ts1p1M2iJ-{d5m=_&}>2ww(S`Zxtj
zLa1XCiEH6s)&1n9Ni}uNQ7W=boOVu_BeCeQNxL^m*DgQ=k#A$ng9h=uc(xbF9)>uD
zwS$HPqkKQ2Arw<a(15#uBNtZCrsW$_G^*6-uA3dye&??sqj&>%&h+(3IRa}EL(HSj
z#~HYD!b}zEC83fUWYYu{h^8DlhpNr;5IKi{l<SGra)NjQx}YIBmO|pV)uq{61XMgV
zy+w7N*jU`498(9QFyRSHq2>{xh@f5^DGibIu>gb%!+@(zO`aQGIMQ3+*71?fk_uSW
z5d=sLpZ4TBXDRYpl{4~>nry-qmaEP?qkZ$GTU5(LL<F9A0#m{c)ov~+!~~H$n7?>v
zjCV_6eL=WS6iu9yU1vy{!cIe6fqjkOqUYTvWN^$K<kRUTuB>A;h^a{7F@%O-pO6Ca
zi)l;G#|C1<<7dwhpRh>QSs++M9wM@rb`S~T3QSs%6ux#|>iF#7Ra2}gGRZ$urCDyW
zhhxACr!b`umk{V#Ul=yDtenCz;gSBmr5N1|#VjY{tKlxoWU?4;-1obgQyrvPhz`Lx
zg6sv|mlGcoN@3QZuAoA;nZGvII+;^ZVC;+2I99H@|1-RhmOp%cc2D2Pm&~<1;_K8`
z^5y1$^P-V5FEB_J(Qs?{juYZhtWW+ufcBWc;g)8sfqDuz!olSmm=-i0SP=Eww(8Zv
z2GJA3fOZ*STa2s)+SYgQ=Q&8@NZu3u#Hs|bV=i|7HnH4O%#xMSJw@%&%O+dvBM=L`
z#Rv+<!pe$;X+LUbp!j~Wv`-gk_F=mR7%OEb?KOjOhA|FdcBNy8^%}|b8=K^nU0*3f
zyX>BC-BS&EHy?+=+oh|DV5m8++E_N~-u6%LMd<0y%fFKe9S{-;qQ@(UCf5bM!ky7z
z*v42FxL?jHI{9dQPtJscXHWWuMcoN(T2LhJR7%0f#fsVH)?DdQEG|UOAf@KVOeHf`
zBz^ZjqJ@|E$X^^idy(`7rZwof9O8UjnCO+Q<}sbph$`39gLOWftCE+a{kt28v#1d7
zW8MT@c<h*63X}6O5}iQ{`enxDvwPv6na3DY>^+?gh_<QX5^7u}gsG>g*NJ8i_VR<3
z2e)E5jAlwZl6)2zBY&H`J8)x9o^96k+W%8v2#VmJ^xQ(T<*`qI+aB)jq8Bby`m9-L
zXlPWrP7qNrz3^?F9=^GwMY~P7eQs~Ty)%X%n~uSz2)v-uAy!5%1ufvcO@#_iS`+Q3
z%*b1j2ov>_u@N+5WHHEH%qJYXFeM4#`wcmAQ>G3wM3~W<Oq%#ECLGU$$PsjqEhDzb
z0ftmVQ`<iS`vrdzPv`vglxn(2@)UqDSwF!rCJD*I_^136@9B;0!5qg~0WeXUQaG!&
z22f&*F$F=o_}d8HHl2h|eIbw$c|qbw?v2TiGmxX67L3m?I(dv7bH?;fok}vYpFTU_
z9y2qFoGW72SR^}(<;IN$`QX{{WO7s#?EyFm<_hXZ$oC+L6lr0y+sXc2hAhrl7EDZ#
zp4`Q;>iGR$v_Cd_)(cciMs&&|n%gxQQbcK}rH{SC(VAj<kTOgZ?l=Ah2Xhv78v6}*
z%o>9T6ANG(`#<;M#GQ$@g%DHe<>R*r`>|qjoXb?x)MqgX82>Tx6s8Uq9^z`^;UJQ+
zyo`XBJQ0l(UlBf}AZS+3C52Ptrf!`m@jT|?{1m&gCH2KzqJ90=m7}{Q2boisWpZ;Q
zPjN!D&&qg>Pk=vSs8+lz3^wlQgV&Oarp^I7Ue=dRi=ssIx{?<5965U<y%Vp(&yJUZ
zuR>#+S*>}jvY!NH{mK)#_?}+ndkZ<=@%TwP<}hBJ_|&%yr*l&yah!#P7wcpv%lGUH
zKjQ0g{Zj|C8}~L_Uawv8wGx~9=w|h!yBpmB!M3!@VW`af%QJNG-{8w0dxG*f8$7$*
zt6%N|VP2GOSWeux5N=atFM@51EWzb5=@&%rbQ#3)8g(=h#82?I@XXW1Y(!x}_r@p+
zPdF2=VraKdR1idCxP#=bNu9)rrchKI+b4Yz!aVe9SDR`c8$j%iC&d@!cm`l=i5)TL
zLW*_ye=p~J!`_Z%o>f}V2{74WksrNZ5nIws`a|yvJC1evN(y!rcQ&dZs`Zrt3-LG7
z29M)u;c}H`BC0VHc{tW1zuhUyhMN|O9H)2?GMsmVe=f2}?1}URxsH()l2%Y_V3x4K
za<t3mok?ke$_2`uEd2x;FMSNmi^v>Uxv(dB*KWG~u4%T}4mpCqhL4pK)S$A!E@8GX
z3zS}6DiOB+E6LZYzI7b6hI|?}&)O$O<Ve{FlrchM*X5kLqA&dVP{Q7N*V6hl*)(>V
zqN#Y`U^V^iS~7MH!H{4Bh?;SSuOb3femiY$m$*ycz8s*jR-ur=$!VU?NIzxFUy<l*
z<hxVwbTBv2xO&z1M>=`kl!fv3n&Bin^HhM;8<)e_i?3-TFZA&bR9iM}%=KO8+%123
zD2vRzPibo(%l+2cn%6cIov|rnqL`OQcxb-eI6M?&6WAQ|p?pBc%6ClN)F9ny%Tl-7
z<q2U3@`lg<j9vErXttxQqN}yQ-kjKeVppApf`w}TdyO}0+$8^SOcTyT{3<Zz2pcb3
zSTTFcz&`MzVo3w9A<NCJBCD*R;8n4|zyI0)@jqXrwFAo)`XVGt9j{`xF;sH=rWDJX
zC*5-v_tuzFkm?}WpdO+{4x|EOEGPD0*!9120c2B3f1NJgXb5qcrV_a1m2ZQVXEXUs
z<)yF#kB|OpV0~<VtEsRG{-`3nZ%W-kUqNV}J9{ehfkve)75<bQX$z6@vBaYtrB<Q~
z?SI1mNtg4hIacbx_Mo@$KNlJ~{97@|tKKhfUWxT2Z6>RG+B#e9xqUR^OVX-g=gcw?
zcdB#Y5E);&2{np)uv;nq*B#kb$NlS|G#UQyU;f-;tv%Qrno9C*gPc)`6+ELDF6}uV
z_x{(v7K=*c=kXc<VKCu)dwYrs3R%6g;NT}GCcZKL>#Hm{^#@->MbR-ZT(aqUx4i89
zT0U-yEaif<?8|A-FYV}U4x$XBqQSayk<>q9zKB3SXwzTZ#T@v2C(>;X#Od2=9WHfN
z$S4k*fGk{%nzL;PrQ=2?2l{R;_V@RL87{Z$a~%I1imrPv|5mszh#eWzI4}Q`vYKR=
z7>T21`>^ZVXpVS|-8c0*&#Biz%7o<!VoLdJ82l0U8h5ggK|<fl#jc@CVx1raxsGq%
zea_EJ!Gk;K6)b;#oCz_^${A*yrsly>m>Qf67PBlnsJbF!C+cV=t7wF~k2&Ye#)Bb3
zIA0+9$A$^Fv2QR^V|*zDFL85tcR6$GViG0dT0(^sUSXzX1lcEJL&9)VL2V(;miT16
zaSAd`ENz_qcn{N^@J?U>^(HymuIZGOe-FDK@6k7vK6);oqk`Tm_ui;6va#6*JoL3a
z*+txeEFqUoMV(`Nn~8%aOT%w}N|qBDv#XT9P)JFVGgnb+X2Yh2-NGzxoYL<auHPDd
z)$H(_RDvK|HzpGki>viuEGH;l=v!F1ljd@9PjdHU1pz%)5reU&EFo&c@R_oi68jO;
zW2liUxQ`If$Hr{NXq+jn2`P>_BHTftIF@Z9nxFvuu`%;8Ry-{aCIFeo1>oKAO$d(D
zRH%cU2OEw#!|&1G6>t_P`|>&cL5{F{nwp)1rFO(rY$PdOOFzL*&i%+s5U~tXPJemM
zg4da`gZ3*y8Nm<k8%EeLM4yAcg0+HV9+QtnhH>1uJ)D6YbI0+DV}2Huyo_U{DJM0K
z8H(^ak#A$SuoJ+G;&P{!iIFi`JWYzEGqVKAzRh;ohG-!+4l+?ch+1HMN(hfBBrd_x
znNk}P)DpSAFLR?7rnjbkg4Z2$;`q5LL66bLc%=~1P*~#(@I!Ky!CMT7H(dJxg6GE#
z&c;r>8t20aH!!=MMaGDh#SpiNC2X<4vxl8J2>!C0|1^0b;bDGGH4V?PQ`tJLw9CYo
zF^C{S97KSGICYOeXb`0kjpL+K7{@3}kYi&6FH9@WT9*0qH)W<*SZx)guh5^5h!|+s
z<aH+JIkt*H0<m7$MjT@Y%WZQWS;~HFC5~jD6xpWx3SA_KV@<)tW0$aC8ehwibkIo<
z&|}0Y^?x<vrjSb<Kv`@Zt%brp@78{7rDdOzLzWql2JQ#3W>L+16M`H}8i<daHV64M
z#Xg}QhW@U^VQY9GCymw4f6zLIUHs>)1|Y$Ja{jmPYHDi8?&iU0Y}UcvmXLrzk8LSK
z?jU9pN2UQk-sGK*Aece|$8^US#(vt`cO91?o+n~M0ug{l0S%IQf;QxQP+d@so&gi_
zG;Rb>nv(W*|CA}G#<6)wk41tn3Du=k_z1k<7#Gd45~A7*k^>{eiDCi?3+-yA{2T-h
zLGGsF8f4F~i>1R<IBrCdgSMYI3n9+^&7p~0K`37k`H@B&1ekE+w8q58_?#)XPx253
zWbJG}#fx!34A~Qw5ey-n@;=!UF2c<OMJ>ULBqfC5Iv=YED1{;9*^pYIMM5ruTL|GY
zh`jCN+cXkbQEWVcuwUOHLm|5}_JIyV{rvXrFmm#}zAo>(%<TNhXJ+VZomL&L8H^R3
zzTbgt;*H1Rzj58dWysyfQ&vz6Qz!mkoxKHER^8S%`Tzoo5+b35h@y0;bc+H4N=t{R
zNJxXy@K}H%ph!t~cXui&4bmkb-Q8y_c;9#L{e9;@*Z$ACxO9mt=Nx0)_dVxWWAaR#
z>j=_9^@rrTl8<7pW2IwER`QKj9L*2YUg@0B=h{-miNs#SZow)+;dAuH5|VDp2!F;&
ze7z<r+=k72iW9dq)g_(Tr=n$c#c0zm(`LVm0TE<^6UF_bi;IVyav~poAGOHGQpWf<
zy53+KLMJ@XX~9O#W6J&#j3wyBqJvhaN9(znm#6XKJK>`YpYo2oUM$3LI^$7k6v@|y
zS!h!9-mH@KvFDhKIyDCgYWZ~ADZ7hyy|LMp7MD>L^&EVA=Qv2W377L4ij>)w$=iyP
z4?QXsYNQ_Fa8OSZP-V6epgk+!ikgqIkM_7eC-JYl({XMZHx@N=QJSSJL-+N#sGKMk
z1A4R4GG+Yv^+oYWB6*eKgBlb2fJw{GYQb$I<lEyBs_v<Qs-qa3xWgD9QK$+`JyG&e
zyivUGm_?{_N|v#m(>KsOqtAF>6bOHiRkQ~VBV=TMq(LDkHMx?t%D0MHdakL1h!N}{
z5}TuDnf2WYCOJCG?Y&av&CyFKOFed4q?jQXD0{c1E-%@GHKf^ZT69`4W1}50<Z6-|
z_r&}4uS4)a>scxDh(6ue<`Fnl5Ac!8sk{5)Y@LrB{y5-igJ^m#qB(S3b|#Ueou#8A
zU0r&5`Vs3^p_Z1GqeR<U4laEnRL#S${%rS^n@E5#J}LY)l1dRWjej<Nq=E_cKI(h*
z!N5@rj`V{Y_l9m6-9zPL{kY-pHBzloSR3=2OJ(<I>52x*=F!5>3N&vdR~zQ?DgJMv
z1i{p}N&DuNXSaV?Tz)#~9EVwk)^Q_HHApXtE980<V~J`bn|{oDGfmcBpGlN+rs6UY
zDo;<9V#FIog?Vb!WmIaEVHr0P$4&X#sh?gxafO-1t}nhfPED7NIUa<Io<)JNk;-HB
zyv9f4oW_(5GRY<cD7ct@{}~n*3iqzn9Lff>oJYAF6^j}|OQQD<?YpZ}XP4Ne?Bjfc
z7s;9HD*RV6oSZa1zL?q0Vg>tD2=iq&y~t_!*~h09S=*9~>{q&W$@lNyV<df$${N4B
z-EP%T8O{uJrfR$^rM!qb$5HwqU!(85Ar1out|(#dsd=;`x>Hnl)P9t_l5{zB*7N6W
zQS&QAyo9_L%}h)Q_c7NoE@O3|gxbgoX|@|VXle)zaR*WTSZS}FQE1{wp=BZq!Zv()
zl&xxa#A`HOJ=SGRjY~I_zL`$pa8T4^%3``=n4&k)#D->iR3Bge61|y;aq;YfQ=3>7
zns&M$M9*8C<;7UXLB)Q1CeKB2Bv_+4ecBGgI1($8L-0wxVo{&v=X2bG19i$Gqj<}j
zaXQ~vT~V302QRl>V!%E`xnN($y@6SWao&!k4a4BI;;8wk`Y7%wSsT?f_P!ynkr|%g
zX<jUEQO8QsLc=I$nenHL>DASTq^aH^$E@56GZ>=)?Ida*lx9O{fj3R~3D*Tv`t>g~
zF#|S9<pBzP11)6nqfLWinP&9*-Q9Nb!ZV?$MeJaV>!RQEZnZLqo(aX_L{qj=F<=e8
zW)W5Gc1iu&&f#l|Rd8<Hp2wn~=)g+Ef<5w-2E{MwBBisV9`DDG0=idd)MmDAvMmI)
zvMu)2b_dmcWbWNlPMDCUB*FVpN8?(GOw*4z7eq!PQ->)kX%4$H39M!oF~4Xlu<q4-
zaI|{V8M=!y#Q?q#B1$fbv5h(Kx)sB9lrb`r;ww#VrOIQXWg>ZkK@=4_;Wby~jmp+#
zq2DjBoGrv&$3khH>c@Kc`b8!8-RyPhWtL@5`BSIS*V@kV8s>?pi}H+`T_NB8X`%Wy
z?$s&=DF>B2N)^qHs#@iJhINGT5luWQSBY(h$BRkDxmEtjHYOg^2NQ49@X`2l{e6sB
zRNCt=XoC8iMUvIWU6-3-^QqueF{*^=WrK<R?NRKSW-L@VsIwB$^O*qI;lR@fOn9D2
zM_|5vUHAG%B`ZLR!6=!9$S5`g2CKyd3v5Aj1#9lV)YM78&AynH(~bPToY{4!l3?`0
z=*>#P!n1`KRJbm<RIlkVP%h}x^S2(bbznrG<Sy<WF)wpPV(sHEh@4Hu*#yg_f1M)w
z;<4Wtzoz43fzNs`MS{C2EpC3A!XBj+#a_oG_%^^^hO!mKItR9}caA4j<W#IW@1c0g
zc*LWb?b2ssc7=vx+eJo7$N&j{9O|>bfA^KFp~1n~as{K+b#H!SQ{Fb5UU|v1?r<Yl
zGRzf3Byn+^<yD#)a8~cOp~6JVRyz8(q_g-R33M+^-6!zUcO7zzP}<%4;PL592x)TX
z%&9v>r^>Dz+}tNUcTZt3Ur3n6M*4m8g)M5li?j4XGw(bO-><H%A^)aW`=q5xN%6Bv
zqaYG>85N9bM!UaW=bu&{+NuM;Y!St<$kN-xMOk3>qqeY`&k=r0qcP*6anG;Z`qRS2
ziaf%hHC=&3R>h!MPAenC6xKmYqq}#~Gz|$#QHJPSqYoZ!-S2wacwmGn2;5w_@>*rG
z#)zVp<H5slhFRRuw7|%GubMh8mLuEbgQ@#w1xJU)_#z1)A@VHh;_&lSPqP?J3kTgA
zhzP=&_TX|%J1l<xz@}h?m*~>UHr>@|0Z%QFEs5g^B-?ZGCo@UP*#GPlEt&>#8g*2?
zC5@>4JvoVFq<p)2Jlp%_0k};3!w_!cE{5?Yk)wU<zHI%sIQYJdRL2ua4U*}(Q6OF7
z*;UiElH?gu52QJd|6?e9c6=D;4$<%NamUU1nb}z;C66-~Zcy>tB+3Tk5fB8tyx~8%
za6C`fU9`JB<kr>I1(K{em`kRdD8gw~YN{n{E;fl!czg74Zz<zzJVmVY@%$OTDvc`T
ztNGscT%%6C8n^DdEXRT`**aU-l!1w<zryvXE$VIv*NYprsR}U?JG;9dqZ8#B$XL|m
z<>gV8RaLaNZYjpJGx#@#hK5cy1$sss#tj;-Pq)KH<GkM9=+BIN)U@6yhm2KLRozMH
z?(gf<fBw9DZ?ObbT2`iOH-`OQOwYg|Ff<e?B4o7o1%xDxh|9t5Mw#Q5S$DF(V$!)Y
zXWHjBo)6%TPD~(Q7-whSLb0*2DJUo;$cFhkem|Cz$#*w%$5JxNnb_D|{(Li-Am~bd
zlmgnZCFmv=+S9WsTHI6Y?p=&~l9Cx(MT#linA0N_N9!}4J*nzX<Fq;eh0tg;+!m?N
zAZlV_vbVVaSLfHOepg*xy}i8+T2_jyvjf>;CrO!AE_S-Td-qPWz)W0HQZ7PRNJywm
z%$zxw@bPz#^C8@({IBLOqFh~%s;kAm;e13MFfsm_+;Ll{YYWiO&=g_K*c20r?8|Gk
zG&C@>v8f~}Q+WOP(;T8`h8o>ls-WSsqC+`4I_6CJIxdy*FftlVw?)-jJD}9n)lt&Y
z(%CsV7#G<e78Vt~cXMO%m%c;9RM9*=J>AInwr}&og$viNUd6=3WYaA#bv<%9F|hUp
z(cxTL0fD{mA1-tz$f+`rWaD67`4~OJat+RYz<*06C%4G5C^eOZgJT(4<mb#8Mt1fB
zV&x=d<XgGgPnSC0B?bir;gQ<#Yfq;A%y)%eLcXX-PfuqrTkm*{g{!Efl=kj;ZZ?@`
zb(px!dP-J-WKPeG7=?@LZqyks)dYly!b^haov*JiysUtLfXt-x?)sN>4mGAg5)u-m
zniq)Mn=SXUzYh=Vq;yO3y^V>9DJZagS!|qtAnr+K#7Ti7XV)3bdMf#zru=w{*I4wH
zjwzA2C78L8<EF_-d6|;}-JLskOb7Bw#aC(wMOYXa&!3{bdR0t=6q#8kjZ;igX7X1_
z;nE?>R2J56B$-i9PmqgP{FOG~O)c=`$&>wq19w82a{VSUq+pxl&SW66A`kRltMJ}D
z$kZ1->7=Lbq^XdTk+Es!n+%uQzq#_x-CZW(5Ca2)$9z~T^YLr{O)!^WZqwagn&yoD
z(s>&Aj~54vtOzNNM^LyJ9|z^>9t{o-QqTc0YOj#|{}^vlVloN;d%P(DXGZWm*T0Q7
z(Nz33<LyP!c`}`yjQL;ey!m8QgJga>Z>r15wc^q^S%857g^hE{IvK(dwmKLb_;7*#
zhHU6G#4)EGD*=I$Fag{0m0HSZ2H~UqwOitJ$JhE+?~hc+LwR_5es#H0+uFL6Rd?Cb
z$H$=m_`$lS>$#+);uN6~zzU8CW0bj}h2j(&NLq+#Xd;ddw<^N;UnWl#p2Sq*q7JvI
z2-o43mPIf^AQx6TI>VAQ&VJv%?R3bn!&$x%-&i&CyR7ApqnN-at*?Ikwu?wL5vi{?
zoDX-VQ1c55Blc6&uCA`%s*hvn7bgh5$ojV{<8@op?N0{_EguGR?#!lSJZ}z;lV<>D
znK(^OLc-~?zm0stYG+46N_yrE5h>{-dHE}8)WS}M?(Vqg`T6;vpo>Xu0|R^S$#vuz
zNM5~q)zHu|P+%U|7#12Dz^1LCqJmTT<HvO-rrE9}B@`G7k3kC+Se#0VwY4=;WuRv+
zt&1Lc^5Un^a6o=}`T1S;SL%%OC`3ofogqH0{s}QBpyYm#l)Cp#0W8nu_Xm0#{-Ic@
zuP9ytfr_0!A$odx9sS@yxVX4jb{pNQ0<Y$`2h1xl?#m$CSEf|8tm+`{PZw`K0sF1<
zrp6jwTGCZhWAKL)TEE?vlqM{GwLn2kygKZ-q@E;)G`vmSXJ*swgRPO0R|`y&=X~91
zT#$@Kb3MJNb(1)L+woejyca#vO@VCMOpJ^QO#W}Kpn8j6revvtpZRy-@bDD0waF)W
z`}p`|g~3~a4M9jnGEzn=M3|Y+ib6cS44{An&lLZF0FA$HOaF!0)Nml*R6;_+-oEIj
z_4Z6cL@?KjU#0fe->x!|;4!l^%QN|VlCcKgeCo#erGeM_Oy$O0Ph1npf5aV6Pfs5j
zk;|7a>l88OY|KqipFro02?yT}2zYrK3)?H>UwwTEE(=~HBYU;IJO;MixOGkith(VV
zy$lkWz#_h|aRup{n`d+z$Awk_j13G76dJcji&J<(uX>W(LI5vwv_)y8<vZ_fQVYED
zn@v<sroHQ?_RrhQ8P|B6zji{6smRFUd**;@L2rW}F(~n(R5Nr~Sy;46UYXk4^P#cN
zlA)HDmoExA*enf~K@4(PD%&bwZDfv%i@S8`lIzjI7Bo7DB<9m^G}74M#C#K^bl|Bw
zhW)uSn&xHKhjz~)aYb>DmX;Qt7w^3oi8#Cxw2;hX!0a(87`h3zk2-bgRQ>uOoeX%c
z^^ARnM8)B5%1TlOA0MBb(1xF7H<*uU{+Avd$7U1zJ9nx8OEnI5|DriXHyDqbvz>aJ
zK#H=~i*jmes=#3b`O3UBYESI=%@e*@`YJm2BgJzchENofpPU*mFkyU>@6_OKbh7j4
z_1`;pYIDbss>niHS`fQw>?gj=bSCH)S&5gc9iL4{1F;~&_0axj&`s2^{Zv?eeZ5kG
ztPsQ=adGim@2?$)pPl**x;Wcm`?`jPnXhufM*X>rXvxd=-$#y<)ZphU<JFTVxR;)S
zFLJQ16d~*!8;XG#B*fp%r4e=|-s3Cz`e+&51%Ul}<KY7tq<S)F)JBq%@#=|ds{Kf*
zDkSqSnxX7xYb*54h>SF{J^Of))pYC2+_0PFcx~C??i>&>d;m~3HXXo%E2mL@((1(i
zB}?UdP3#r>lYzQa)YMIljaJsy0B>=RhKGmQOPAk>MP=sX$jHhLmpcofA)E;vtasAO
zh1*zIv>E3?sQLEo8(e`6{c54V8N4`2Ik|flUI7eqZo>g3D=Q0kWo2f@8vXs7n3VJ-
zL?94l5b?kTM`~(f5)<zey-Q3?eDelV#u6j3dv<4S3i+rZNqKf-H#<AKN7uD1-g5Hd
z-Q(7f0jmjjTr6T%O?O(Z!liNDzllcbolx_y13}5)uue)RAtQ5vaJw~R8)1Vd3_#AN
zT^uUpNG7U*Y{AN=KR%Ln%sBoZ_|(fcZ{JS+{B|uY-gcp%i;ixhY-<>c<H>gqq<Egd
zt8?gz3RgWnT6A*=kI2gR3;bbbNRg$`urTCHN+2Ha4nF~qz;p~+LNVHa;$4>s=p_pD
z@TkYB^FC58%Jh_U-(5O$o{Qfq4j-lCywMGwZlJFZHlJtI`Fwe_3iyH_I~5u!f2>hx
zF;?xoHAEkWZ)Ro|6%{2Nr$}@PsM^y>phT$a*RS{W^`T;SlmV<9*4rgjQ`PiRRWvl1
zSm|!u06hTyrB&`^e{^`z@dsr#Scoi`W3<x|Cj)0HvdCBhPhgxphf3G2xJ*p^L=zEX
z!FW_Vc9YdP6^A-ULbTBmlC`-Q=&~|rcq0tBC|FU(+MnjHTw40laaIt7Za@F|`3Av{
z@88ujbhWgc_P19cb~L8ICE2tkEMC5Jo{0-2pyK@;9E>L#B_E{nRYyf6-7o#PNfP7P
zv>PrQ>$Jn8BWWd%4<5;MJ*@2zW!9!zM~Yw0wS);wwMK{_6~3R=o}=QGkGBZu9T<3#
zr!g})bP@_3oYPd0OhRBu((I3zx<Aw2jh*~YQiha2vHH)Ldj3?E^k8)KRYrfz$aX^=
z#|5r|-^e^vSJt=)wVc4W&2e^-FhT3pz?_QE20`mhvAeb(Jt%OC(z$tgd9?~H^jgD(
z^!4?r`E5KteR5j)L9YK1JMw9rH~egDZ4nX>urV_`PWr0?L;|BRA1X#_tU}ntdlRXW
za`x=mKvqp)9HkJL@M(mRdLAf<P@Ahw?8w)A^SxOJ2fBa%zKu<;SQL?XdrONM5L-nL
zIH-K%mu3fR6Y^Cav%hYcLtbX41zdY_auNk12vw=5b%!W`MIC&tJJ(1_frN{q8JN_S
zJf%*A%y9jXlD_xsHukxk{ke#c5Y4yW(=>11yea5Ue>HkQ<!`=c5bCe2=j(fq<cI0N
zc#T+sa<8D}NEABC1>70G!~UwV#m>&ohdlypFMEk$$K%BI%_@4v^Iw{SxVst)EysZh
zs$}Sd1qE#bU*fc}g(FhO=&oPQzSQZa(f9B1xV!rJJb*;v6Lh@!zi0ML<R~F1UAuNo
z(u-npY;5e$pMbAlm7>Iegr%zIl$MqX3JKMDQQD4Sy2`s93mb)OA=CPnmf;dxb3o~z
zhh~=c_B*{<PkpHPh%a9*ciLG^QO)qaEVK(=mMpG%oW+@_*Lz48cUj0GHX#8Ec%#h2
zhiRFwpq~v|!w-IYvO76B#WrH$oZDWmA*`vXdC{qT!dhMP6Y!<u@|a0+2``&;#(VkQ
zMj_k*XcHk7?_+M$(_-=>>q>V>-3w!QHT3Ph5+gs}n-D5YI1_AA`)6r6Y^MKkTIBo%
zPkEbjb;5O1iesl9Ona6~Gw?ilil>-baCBa{;|@Kmt*HBTHLFvSi=SK?i*=8m_xzVR
zTgqFvZ__v}-{~YKB=kYn)ymE70t?UGzauz}*TWcuIf~`<SP(x?Sx2e!rZeGYEG>Q|
zMXHqK?!!Spm7S_3bwPnkUz-%nQkU>lZ42e9=}?rJV+`JSnVS#hUaD<fbMXtfMr27a
zh1|C6pW8}FL;rhwd&gggKcX4PNJx|u`6yy~^ultrJgS+RUNBv1=qTbvlf>FpcNQ{T
zth&unv#v!Yioz8Bkx;ukr1z%<U#ZsG61DYvSa9M|g6iwj^B&#>)*_R`?8o%ngL5BC
zje2yM=Wz2)Pr`N=q06Iyo-V0SPPVPP6*;`jthQj3u>n!3V$Q0C;dS;#JLg&otI~pB
zQ;h}r>>I0;Q`(NaFEN|?w})mnwXm^aVcD-!ZO6vO#(V#Jv1Ex`)0HW{{9Pcym^@dL
zDbc6Vx4d>(Jh6c-7A^PwX#Ldo>ef4bTSZCCD0Cs_t*rKfy_U;z$=a?uA@X6phliP~
z)zHA`@dAU4oxVt|lEb~Ff`S4b%@Ml-Gp;7)Jz`yl%9`z47-!CAwQaA8m#TTMo}#-b
zgQrkPB9riB)+lt-{fOC4U+5PW5p8m0$6Z2EtcQ~sJFF|OTb+Iu=tyEUYud@+=g|uu
zj0U<3vgR^p{(d!=ps;{^MGwA$0dNSq5Lrn9m~j;FIOJ<Yr-}M60I-_L6&RGlmAGkb
z$@u+RRsKv(%#>d30V+Zt=m#R3nNn}D3c6d5jD~db;*VY-NdGRKBuLq}Xc745w0-5Z
z3*Wj|&umx!oeSVl(=A}jez)(19e(Ah2lwv=lN@l*|J!qzM8wj4e4==~Nl4(JCnhFh
zV`Fo3k1CS3k`lsa2aDE#ycGjK1r`n@7h<2&>O_P8K+zj!HVeM@N=h8piC))Q%gao1
zah<EVTz$8rsE~S|v+e%mbp}T9r1ez{!OxyrNrD(>?wrPqME|xF4EMI_jKAj*!;x&|
zhr1HFBKuY#Cc<io{8)Y8GpXp0?3sJ}_N^B?IT96ndU)8_2+$g7hx0kD(J{ydRHwA8
z45@YsK-0M3<km{|M2|sC++%o|TlitUqWweGA05x=GHQ)cW)_;SNoz-#d(rsj<E9vI
zaDw}SSV@hegnZVrJo4NR98v?HV@U0fMR>1k_dep2)?FX+Ip|*UCn(0#-5D`E@N=v{
zLYcy~=zooL#=b9~79e}-sSx_c&+a=Vvl^2*LxSZlSE)+OdgPt1M<SF>NQnaGt5=^^
zKYu@K!w)cdhyA|mIah2f1(E_&AHuU?ih66HxG~*!fjw~DpZbtkH90j!zbHV$`R7v6
zqG{rnYrIc3$vs*9c~0Z<YSm5-h!`Z+xNv_wIHt!Nkz=j}QCWo_LJpVBr*)Lmvev&M
zW=(Pae-9!4@122&Sig`EN=iyc=*Ul>K6P|-`1z5LlLs27Uq9Bs65lsd@PVH=ZY`Pu
zQ2-ErQ5@iLa)W^kZlsc}kPx+~mX?;Wv9Z^$<M6L=?TKT5q_RedqMkGBc`0S4N6(&3
z2yG2^g3biW<qE9sk=ZR^YykL7{*7LgJn^xy%4#nR43Mg{fI1*vl>5pP5)xEWSQ!`+
z+wKGRp_dI+Q&zSCRBaVG8dMvGYk?JleRij)hWsKtcaG}j6M(^jb%%rbz8o-%<avXQ
z?&$+!WPH@jQ};u8+Ji9uJn*iL4}O7xJxFm#V3=-;Btu#8auMZ#4@k{tq@0tS98%TY
ze-~un;^HE3c1)z|8B*u)&0~$I+}!oN9-Z6acQuV&f#}Hz?>r0PHYH=zQlm9pUR!hA
z>@xsnt)-)*L%RzaWW;4}0SJ&P!`8+|7_a3MuU++rT+S7U2)Uqhf#Yd|FS3wCsEF%f
zk@Zy2?a!&cU%$p#JD?aD8N<WFf6d{ZI_0!G1M&9Ju)wpV1AsbyATPAEQL8tqs;Ypv
zC5GNk>^7E@Yek0MhGVUgl{#HC6jc|9kP++^<GbQ;^&RAUpPwN3`?B@%hp3Bd!UXL*
z3I{WED`I2m#$~)DzJB{=52T(x!l^@TdUn>~a37-a&u_PZuqvt`q#xw3qGEKr;j6_#
z^{~xmWC+68IGM94@eOb~lcC}~u`x6T7A6)J@Nwpcn*D{AF(mDZBHhLt`#WpEP?MCI
zHXNMQ)%!sC5JYO1yaF}|Qr|d_pNGeG<@XPVvSGI^8AR&n^~<+!jkpp<%0&okq;WGd
zr$m+9JtBjb1!zV-`_8(T(Sv+|1DYki+fO>qGQe9lK`G_v=o;1e^EVwgO=dKYko7Ub
z&np)>=K!m}efu^L-vQ*4wE6jh5to6B1z-lyY01lUlQr&0Z9Qc9ToAk6GgE^_*0zg-
z_Q=8~tQxs$+0Q;?Il{Ak>F`h2E^&MJu5@eIG0z_9KjnfT?jSvLbEK36a3L-m$?1{b
zKge}i*x55U^g$3Q#7I0!Wc(N{9p_vAp~sN3!~T^!0rdm(k9MH&AgZO9jHH5SfoBB)
zgA^k?JUq-OU2WXmn8Og<o6lKUS?P9_e7<)k5=4z+3u+Yp1H?Fr|K;rZbc|2BT2^(T
zy^)cT=`cGoLeCeE|GadimXcW|l}LOgy<{=?mcI0R_gbQE)|p=uk5W_~C0M<Bm0wb_
z*Oy~}VP|J|F+<!V+A#HLu~z41YnZ?mu)O;`98`jK7L$$sibW+QB`1rhQBhIBEpuPa
z{Q||-+t!K~n@&bfP9x$XC@5GedwlbTs!h#kafJuRs<pAc9`!jiG}O=US?Ny4ZvQ}E
zjE`_|VBi)qkR+d^Oh7<@KXk45D?TOne3biT-<Fw$`FTzXFH3*Lq`|xwst+D~GCFwo
z?p<W$6%;`HN*zt03-u(}#MW_@=5NYV;D9Nzd(Zv-{QLp}q`NQMjlLcn1YqIkclZNV
zYtRCrY_QC+U?a3jQ3Qj8l=KqK_t<vB*mUE({>_B}+xcDvCe<Y6yKd*Q7EU6>3Di8K
z$GJ}^y1udD<>{GXwXk3Uy70%3A04DPUJ}UX{celrhZ+Ldw1Y!KS*XpyIiRh1ttLEj
zLDC^hF;vS%8s_yQOFGro_74nzf9V95VLb->h65Q`SzlUM@Y+nbLG1CS;>$K45tdol
z+uH*J9PI4uY;9#{XGcT^80**Ieuz2HUaY6zNW^>-a?Cffp`nQg)OG1wH@^G$@hCW3
zEYjkj42#ykWOcQILcJ$0&Sl!KOd{?ju?DjG{^Wm*+z1#w_rqT*khLX1GT?kLMeh!6
z&;9xH>xv~1=R=|YzX)|`_CE(-{+peu%@Nc3=4LN1FCqKYXA%+;V8+tYA3Z%iElt6I
zppSgOzCgUw(<i*f!fp9>d#ZeIF~w8(<fE~&f0RK+V4y01l9G}VbE<aE^JV}O9lJ4X
zKroTR?Q3joi|#Zoy%nw%EAHAS`XDP)$P}q#;^4rKE-Wl;G^)`wFYAuFi#sj@F%<k5
z#Jp;&&{k;k`I8gw^oDaY`2Sk;<Y>NxTA%N`Q0dRCYC@pe3c*hD(?!d<U#w+1B95E$
z+1c4(9|x574h~>uZ{EC_RSxIS69Wn1FFjf7MX98ysHPJY3fDBQ+02cSaM>QiMTH62
zrbk%hP0h^-SpNR*wupV;h<{mdyMaCeR7i96`?D!uxeJSni%Ux6f;rD1g(^YtFrCJ1
z@|r|Kkj%ykT^t}L#1P^2w!1DaE*nJYvV*1eIZ-8|N5)8DXbTGqF)=Z&zk#H~3Op2A
zOx;XF7MYr)bL^K_RJ^6%==b~gZ_u{M%1lKy-NRsCp#2t3M&kft9qsL<Cc$x$F&n^d
zfX}sBN^=Ghyt&DHx7rOkk%GG6LXHp4YHMqQ)@Nsp;IpoU4xWrZdCpZ?#f}-9uk>;)
z_4V7J!zh|6Mvf!zw#9=7KOyKoYyvii%ujY3W2`TYxbCjc02XH{%F<mZ(>Ype6)|}J
zJeZ8hUwYhxDohrb!9OoBUXcVM9>geg;7F;xbx*qX<XL6H`Gp0f(Bvczs{H71@5?nw
z4MzIpc=n3@4$ytuw`ggR8mYf{&Y#ljN>m`l6IW19Qg$f2jFyPGIsCoVYVNHRB5dh;
z=;BsaS3iILd`;5(`;Q+(UphU-6;c)WzNiBsSbQGc7+U2!KW}1dYirb3Q#1bihbIdU
zD?KnL4X{xn@tY?F(63#?61B3j0%EP95uD2{D7atw8te7z*Y?n?IEu}+i9lrR*ZzR$
z>u3^o-o3ASk;VT)gJhEOVt*d<jT^PO9N^0g45!gzQFhSMaU;rlMOnwD)UYWf?NBDn
z%iFtcRrLlN<>c&)ly=x(@03I3n*iQ7kv$Ew9Ipj1tKV$-<yl!-i7YS*K@j>ingNu?
z{_12C3gLRu(aO-iaUI5awO_eqChz5qEiH*a2g%9FiHKByLWd9s_A09pr<eq6TV>2$
zDOY1*XKm`~)29my3q2XS?9Cm2KbI876@czLPj~`CV!@FpGCb;oGS#E_!(<`8w4Lps
zsnM+x{V#?l;)PubPCjR);QDVE?Z2pPr`zD*V10c(z_7iYU13qt<itc!`a>C+vv_#3
z0D*Ph)S$P<0A<G6tB%8x!Z;Au&tYL@woAigtQyG3`D#A^8SDdheA%7+C@LxnVjz3z
zay6igar>i_Jm!n}N76PvmxVeyJ2AjU;^N~~)b_fR<b*c5lxhR7NqkyfS^41O<2oJX
zZsL71qKjV*yjofxKfi1$+_B3zkKrS?dx`;A1SOA|R>`Xc$EC7_c0=Rhop)z0AWI2J
z)=hg)%*@P8PpdUI*0|yCLH|OtBSl&KmF-K_jVq+S-oPcG3gWYlHyVSJgb%mJ0br32
zlY<v}7|bR&uLD8!@$wo1V1XZFr3hs3`SD)2+bjbkWBc3&C|^|*6BFRO5<Zt%Ulj6B
z90#R)Av{MDU*(Xc9o!G11iDA7-bOgBHgKEvvuG7&Mn*<9?!J2U3ZN8OF%S*0F+M*2
z@L+31#hYht0iyWfLcs|4(68?9?x7)PWSo`Tq}O77THy|n32!*-53T`W^kpFjk7!=g
z{$u*h=d_J16=a$ycRcXDB_)llHv&y}*>OG#3zq=yO@I0F<!rZ<yMowJyDJ+#y12Nw
z^mKH}IfvJL1bqRTS;6u9?5e8VHoJ}U5)!6nIujnA#lplCK3G>W;=6wR$9$Mfw;p49
z+$LfG<`oAj8nQAn*4EZJX~M_D`NJvrp5*LoEG(rE{eU;t`p|$RcplO!HrxCU%`I`*
zFh)Ul3EHpHA=A+H_4mCbVw9Pzt*iprb=jJWvXu!QLu@H8FOOzmBKZia=Ke^LgQH``
za`jof_th;eY<zt7a3RIX|6_6j{%t%P$~Hqz;JOL2VGi)>Uhm`L;x;!oYw?bDT3tbc
zvy^c<ma5-;{xb;Fj|zj$%a=l~ho!krz+icJc*bwH{mdT$>dI&RhXI)^4hsoE^1A16
z)8aM(kpPzpEXKsVBszhtu$OOF=kFd%6Z=k_@$YW5(5)1l3_y+t@=dcPQp^5>Eyqs+
zy8u7{^F{4$Er~equ5-QkrN(FujsnLU{0zdV{P9B{WFxo@3Z&(yDLvpp9P#*P&YUSQ
z8~W(&9WLx#Y?Hxv&@{8Ldr~sIGj|!7Fr0v_a&E|}lpx#O)bzEHmD)Uj!M{<b%)zuj
zw*h=itcdgMX*5FoyMGN35)g#nHjq_Uzl8o5OaC<<Y>HHxq40VRjtq^XlV|KNoA6H`
z=Z?ARbr};9`qb{BR2&`mKpsgKVW5{Pj$9_{zo;}~O#jbB3J@vH&8(c9%KVpBS5}gU
z82I^v`LLu;-MPqRtUOr_EIm!DD7&;&kcr6{^t578+<3F%c&qT9iIbDlq?H1R7o{;L
z1tU#n*C7_6;PSt5_@oUU{iK88GDqEVC;Q=2d+9hU;NXaM1V}dd%N3YS+vYYvFmGo^
zMvm6exFR*LAB@dL#3hJbY7$rAOuKga4a3KO8_~A|g{<5gsvE56f9v*bWLY4TkI-hX
zkH{edX|T|6D(7#|x8vitpL{<J_6s7!bf|cv(VrQWos%;(G}Ia{bhZ+}(k`vWWDjU?
zoevEmAz_Bg6l<Qyv--~k!wxdW_R!JL?+{LX@HZgN-@lPRLd^QVMv>^o*F#iw?5_(7
zBE#e*wo5J`fxsg{I?;yBaY|gjejR+?_SLHZoz0m}$>QqANmOW%Nb5o5sJ}8hPB}U{
zrl~Mbp7Zwh9v&XvIFL<Tk!SLUSeYEEDZN;6bcjsu+ohXq+U0cE+1RWf3xUu}mo627
zPca&x0K<t$NKT1H$qPbktbL*Te4xiT4=H`un-!y+u9yTN?8(7Hb>kxtx8SrLtANp7
zsyAL}Ad&Lflf7=7G94N!Dif!o$5ogpIKtA>5`{xRg%nR4DzOdp^UF1CuO1lKgXp)l
zx|;0lGf8&wBJbl$)J%Y(0tvEa;m)c)3IQ4g1q5jojq)_c8$$b#qSyJR10SQe$J}WG
z{QOS80r8G8`YTNnxQu4WtF$Ypjq{2#Gc5ql*ZwqLI7KTcs8y^hc;(9IpXQJbyAJBs
zkrCJJ<+1SaaG-!dDnN@Mb@%_#C4{lLW<#LrcTlTqYX+_1tdlqaNPNZuWU}9x41Acu
z{lA0@^|QDGXtU{Q!}nseAEU#<hCqL&)gb|UdwY9%c{%E?d$MvevT{_R#T}*$BP93B
z_XDOVvKG(xKesP{IZTk9zjT3{SvjHe%$qBx9q#Nt-DbY%5nX8N=%hC7hZll~2#&7S
zhK8g&{Brm3*+fJ{fCxn1Y^~obIRSDT+{Y)`9`_#oH#@-Y5nb`=6BU=SpS!zzNQkDa
ztan^6vTBR9bqENl=94s(M2x<0?q>!DOG70E;+|w3K7Q&}%cE6*HAb8iAty3Lp(gup
zvEZPk6<SeI5yvksE`FArEmXjk?IhtPy0&RE_fAr(!vH93J^=xs0sVg%jvuCLv}={i
zdA2JFA^;05?VTw3dh+)tbG|ovzWS{@9F*FxfldHuWl=hPG7mvx6$hwoQs2~c_UzfO
zNzNy~<;jl4SIy9Io(i)?vPyd9&K_?Ve*XTXWMl!Lff7?OyKWpMO-vupww&*N!(#MS
zC54rZ&1Kw+=km=$plf1c)qsyk?Mgg<AC&%$qk}7w?k8<Q_N?goE=b0~;+H8#4cjZ@
zjvKS2R8(3!D(+Vzzcn;zTG<>Q=wVz1FH7>nd2bV={zT;uo~%d@&MCmlyS_Lykee+X
zhb$8EUaY}B#POtCHmc#Yj2^&gN?kU!OcXjJ!(2;Ci+cTdbv_R>%KQX;<2-&KjKThK
z%)}?Hcd=murE>KopM}HpI3X*V>A%_OJw*Ki>et)b3wq=EvuAz*0r9c1Aoecyz~7&!
z1%Bnac#^TY?9R{+I7*+;vG1Em2Ad-Qg^rF6IJ4Zthg_NnjW-?0@2~<+Wa2G;a%4Sd
zH%Xt%z{OCYm{{WQ0kzkbmoxcJolJcZm{b&iJ^acCgd-Mj|Hl?4%C7TsaI|$In{}ff
zBT{lbFWChhk?MR>I)$=NSgN5I92%5f!@xiZXwd|@2%Q2mZP5GW&U+dKW~MH09iPpf
zKI!5BEu*)A$6M}Th3gT>20`GPKuDaR%m0-*z-*dW+0@k3+`KT+@b&qxJ`6ljY*Z%h
zy~tb_{*zbgR+KZsLY3)c$TKhnyuu2<WzR>B$~?;vsCzPX_x3ZhDFZvZYRXa1HZT<c
z2T5-#^{nAbqx_L591K)B_B~N%rG(?ItS5u6jAmFIC?FL5EBXhpYUY~_K~$lvgeMrt
zHR{ZJp$d2l(b?&6X9^k^nO<hfSH!tbsK$hede%2ceUdfdxnT5GCj-EpyId>tF$PLk
zccie87v&?oYY4^+a#LDHMl;Wt6oM=eN4SrM$)Z~`^+|KugMTM>&!(ob$h<%@1YXW|
zQE(Qt{_#F3+EO}k@YiRE#aRD$))me@@#l|(goHN*S0kV!Famn|1gkJ))#IY6@U``I
zz~!d;FV~QAHlFDxBjPog|2~yjY`bKZUk%TTq`*y2Up#+4%dq{bx%m=Mhme|+&~rEI
zU~1T5efmpyIKdS*Ha0G<ylO;?Bqk;T(|_;o-jn?H#Io9uu`6YbfmZ;<Z?61A@=~vy
z=9WxKg5!|jFB=R!<_LI;l;x*SJH9-Zj@1yc^Y8B;*tCo1hsy@)>Jsj{6M$Q5SGbfh
ze7yA@D^fA39E3XbH=9N-10P>sRaH~~en3D#`DXu%mmNGOvjfebK7URALAG@D9E21u
z^ydu#zJm^a$**l;k@?^}priBpbURQ()I}t-IN>YfaTl~#c!32oe1wSlq9>i2*WwBq
z2+-8TL@Kh1gdZayq_+n-n-=m}M_8D)k<kn|L2_z_O3GAg#7MTj49L))xu(WO9oK`G
zNaF6;*ck8#pnFp-VOBQ&$C1qvnKHDp!fY!r*L^B=ba+s)w<wUNf;30d`I|tHxw$uI
z5+Yt%STHa%4-{I)Z0uT3wG0(mPXT*C0iHi;@V%~RfA8M+`Mw;G6=xpLbi{4gKgBso
ze3eRfq#PU?!U!7vc_qwMv*Jr}!0PHM=<d~aNg8Mu0t(K0he_yZX+A78NHO<!?@-fi
zQFk32iv4b*ka6J2Io9L;eoEUTwGY|~0~uba^##9iTr8^V>r;>S0JZ?KJ0Jk5-zzUK
zAJgo0$=fLT+MLkfNqXk{1*93JjyIq?DBrJNzxw(j3B`GDaqxku+8=E6@R$$pj~pHH
zu&~SnqUq`Bt!kU{x*qPItQIW1zgz>bw!b~@^J|Wrl=M>PIWLK8LYy=IHtMR=OwY*Z
z->6;k>IcxuoY0f@%{mwcT4cVf7JHm>c06>76)Dev=+DWfKxpm~Y;0_5ejBws<L*v5
z5$(OpnyY;V5g0)ndevD^>yWt-{e%Cv(MwQZI$2M|fgHbmTLWAJkniP0{rR~qwG`!K
zv!UWgEgmfX$K!!qY=7fNlQcFkS-^8-xZ@8IHxOorvT}Yd8ENTZyK%3^No2u~hwc!M
zH1w79_4R>;i*7U>5A;!x7lp@m$s<M&UFf!meUg_pDH|eE6M8%Xk=Qb1^w$6;GT8oq
zJ*h@M-VZKGEohfneFIR&adSS4?<9eY>-0dU+x+}Is6PjL`<F|@LdWh72;c=lW_z_&
z<Os>ni@fvJgh28HhJO493^66(18DI$7g<e816!NRxOd^?%YYLwTFifQ<$GP-)_h+l
z=<q)lCxJtLc06GEB&A<yZ$4*(=md>twVY$|L46^KfM6Z7v}Aw1a$l!gbaeE=-WK7d
zTe0BnR&^((!}#jMxt%t;RY4-O3a)(`JQ=P5B_JY|6#Va*>BtjZSIzjtZ9@*0^OXk)
ziNcn@zk}c-#e1KMoLBE#Fk)X2RU&%NEBx53K_6p%{_+Lm3Ljq)BCs?IK>Tw5>MOEN
zVE7msg}eva>0m!aX`#ZMpmFHJRpU|<Im&ehXNWy3lW(xkqPBN;Yk&NZx(=u`Sd;_g
z7bt&*KKqA%Sl|gtFq4wtiAzg=Y(Dwmq1`n4e~vsI^$eFuiYt^`qFinD`X1gPTk+L$
ziH?+c{!0BEUGw;RYfd4G=TfJyKDQ@gm;8B399!Y;+-d69r9W04+tbM?oq1UE)c7is
zzEy{xCtm95Smra?nFS*>N&~emKU-Mdo?ShlI<j-N-E@u!v$uUt^L+Rc3YCco$c$`i
zuX8bucTz?BkN-xgTroY_VTSiLet|4)Dt7lSw4;xY+{>3QL$Hzc-8Kiz2@yK^nHH!J
zh9%w~6zaSIk_*t%+-$0wczph28t@)}e}AwhpvXwR6N_${&5WXrO|DJ`5@%IZet{BF
zP1h=NJvw~#4)6G^O})MGVLxeoOUs+IbOHh;nVFf*DZmS&bbOm8-+exF;RX;bq>L<t
zngtKC<8$UKH*@fx+#GPErlR`(Br7K;$4C#{0%&1KNltU3LJYw4<kVDMZY5y58zIdh
z-Q8#|+r_~*Z!qr!BWZMFHSX9($>aS6#oC2yo14QRnm$~h56X{GW@@gl@6FV^ySMkd
zd+94(*Di@gNpIW%n`GqyVW1`3sEZp}K0B(iGc6|mp8NavQgIysjon>cz?@tGE+9IF
z@|a)VA_HIg=;?`Yw2qEfi-VVlh#ud)`2PKSFvF+nj{!fpxVX4;SyF`@H?@jwq&~-I
zXJ;d6a`%;}d&;{Ps<j_I>IUqywz3K$Gc+>VS*{_(p7B(zkn=U2yUoX^{`pnm-1KG%
z6~>l`R&5b_@6y%5?JN^q6pEjIfL-y))Y4Lg?b0wr-J_I@@~iLapJnIf=7MltWHlKo
z?yjkM%TM(2UNp79D~KnQUJ`oaf-d`onfRDCr0_(!wx@@*1BZ`JbGdL3V4#XWdP`GE
zOG|^(`bkfQ@>v6YK*qwsjXvCqPEtzfZwqcWOifQ;?8`|Ii@Gl*r4BI~8NquPLPkv;
z_U+rwxQ__2*o4&%{3cg}mG*m66H=sewmYS3AmPEcXnBUyv|u?&NlD6afq^}%lTD;}
z*xeM5`chOgfPwq^6054Jrm1LZYKDMymQ9S0=YTY*^PwpzDjF(&`2u>3Sv9@%<s6yP
zPYetUB=zY&ov(Bp@LpkyQFOP@B?=0DWR=Hu2I3FI7cNjzP@JZ1X=wqVBmQuYg$%B4
z-k1HpF)V2IA;5#buWvS>x17iUCoSz*TEXz{LcvIASlA;be`TgJ`?Ws?5ze*5Q@}u>
zNnR}tQ<IQ%0WZi>qoSlt>6tScFxZiIDmc3^rO4#}U?A)Ryb`=B7lqfot2^LHY3WY=
zF6y;dtXXPE-pfFNIjCi0&fvZrgABE-t2b`cTCEaZzjf;t6VohcD7^R4Nl6WlIq2x=
zc{n*Uopj3Qz6QXR0AuUCC<DX8WltNKnm)XLpTktE|COMSkZP(LEtw}ZHT8=ZFL+FP
z9}8b(;p68|*T_o-lX#M)meKPfuOG;-N1SuNrD4t17e?8D4GB-9{o8p<3kzXEL5b~#
z$RhS@ts<=vA|enl)6>0;1UeR7O{N2vc<F8SE|rh}a$C7u;@mfYfkL-TzuHUHE(svA
zS{&qCYeX`%L3X63{#3pVZEkD3_3<N~l2>=-g9=F@At88%hyFFy)jAF{*OLW}I%2`|
z6emFiMn+yqrXnW(JwATdADCH0P|$t<Ko<4ib8|0--`l@HRvJPUutw53g|-H*mF;`d
zwQqg<M0C|(+VkT_37^Z&mK(%k!aEZeQksw?OyD80jew6`<_==_H8g?~66haYzWw|s
zxK-cW8Co#5@bGXTl?y!?G>@(YHWiqU$e#WtV7vI~((Ti<Aw1^!6jR?nTmXISFRdT)
zgJr;=%C>~VnJs<+sdi#$?X~SqE$~3;1-EJcvzKOAN)->rUnl8`h*W@IDCom$$Hvla
zx*$V3&l-r6=f}pfKs+b2%=0FQhb-O9%ds4n_;63m-<^=g?Bh47Cr^Gud&~I`4Guym
zD6BIQCfISI`S$ynhB=F2oruz2UteGR3h?IV{fqPCzpRdG3UtfILybggYzK+M$Lq90
z4$ke3P>T}1@Kr22Qqt@#S)$C-Fg=A{{Mb+U*;`;hUP0le)3$|Vo$G+>*n4s$RiH=L
zRbflzcXewkyO5AJ9WlhDZ!Y{C4NXm&InSHBl9XN;8++4;n1u%fneA)9`Hw5ntE*O<
z@yL{8vOL6d(2KxEk)<FL6Ys~g6NzbPXdwCfDOG#h+br6}$}D7*=iC%xB-FLb^YUKS
zc~dJF6&Dv56@d)6bM*@+H+Ql!Q}Q8j;?DSo*C0&Y>UWTi5O!W&TSJmxR8<X<V^usP
zVv<r*>E2yD;^V5iY#=R-_p*Y;I(OmrSe|yT2)XTBTtZ;&W+o=Fhaq3S=<O!m^DNVC
zTB+<%R#!*3PU6NTh(cju&6j6mBz<n(zMZrRB!`Ove?upJ5}Ru30n5P3+L|LUk7n0}
zyxiPOo(@nR5IVz{Qo3h*d(}31)oW?DmafT!vdnpjhpe=A9l~Wn@;sw3M;1y3O&Pd3
z(8oSvDSL7AwnJI?QlWm8?OyfQEN;u|fj@qkNA7qMqfl`%9c~y{ILPXb37y|=x$C+f
z<N=L<XCI_wWM&>0{`M$MrS8X%^J1lCWmC-|w!gohiN8J1&2hN3OY`Oa_wrIT7M%*0
z12EvEvtGR!7jM4Q8}_Vv%+c|1A~MZHDWlui;Ac=4P+EBAFxj4PUI>`1BR|TVI~EtJ
z*X`}g+TA2f76XZ_wwK3dIumI4tiA&hNO!2^UXoF9S8?~YzR}#={MV{$&8(Rja^)lB
z@yL7UrxkFIN5na=;TycXhSv*k+L9eH#${%orRRE@`VKUcjl)OTjGj3gSMqg-GTDsI
zxq+M!Ec9aKrU2t5uiE|N4dmH*G1&;=u!sm`skhng>1jiMX;M;BfA|GN!otGBlcik?
zjxMKqd3h}^F1{oBa({hyE+b^NCqq{*?0ZIX^6sAyb3+<2gB;+)m6f7N%F?I5NXLP=
znQv-(cFSK{ocfx!wsz4VPGesm-;En?OpbPT_vwh=Rz<cOYH4W+3JNCfj*dQ_W&izP
z!_Upl4OqJAKz_T<hprZ0`#d>2GxC7eAGt$DkCc^9ojMg1uc7f!xUYv^7v#rytyhS!
zGk>5!w{%<wq3|{uxi&8!pF#pfcqMP3bX+`5A&6gnb;USEd@9~Ho2n0>Ibx;0_EMS~
z8?SC{B{UL$c;|d!ncDrqh-3gSwz~O)g^}WyGD*t8Y-G18-gx#DP7eHKM_sP=UYgYg
z`<dptiwh_e+WAAhNMOctT;~kSQmYU|*3Q0#($Z4UQA356cQbmx<KDf0FD@w=BC_!M
zVD&e&CQ^h?$T7dX+y$OI-eGog!iPrWm8GSTiOKv(g{z%ip-x5u+vm9WbHrj0cWFdi
zQso%{co2eX*d8tHy!-6gGawG%zke6BTfTDRhD4P7Ick38G?kv7o}=|nId=l;)s2nj
zpFdO6(zFXLqEu3b00;qh?%jJ=_4uNoorRN=ladk$$xbgy9^~^jz}2j}C5Y)97pbVJ
z_qLXFAvAyfTxqi+_3YUMkP8B8{`KFU?8clFZ>ut&H&e{^W08{wPE0&IE<lUxFYO;3
zEPZgtBgv)e4K}b*m$hb|Gqlh-Alx8;(a}8v%?}d3s;Y{XmUgLZOXvCX=X!c$fx0dY
zBvXLHNf9cK9z6o{il6g08sLfZ4A?d!k4L&3nFu|1>G#r-?#b%Soe6SClHofdbMvKl
z@7@IjkQo?Ey?OHn0{r#s*MU5JVw62ba-|ACU<G9>wUl7L&o0sWfg1Al^+l|#^dUrc
z2s>)R>?0cu9UDP6pMum04hgwV4D6#}b74Te-}2?lhf-4KKirduQDE|494-qvPzk^F
zjRlYw$Ta-&>X&Ew`u=`?nYnTT1i1JV-?#SaN$3|Go_>fxP+RWd2QxFXfQDyqG&P?U
z9hVUL1g_@-_jnEZTICCUG^?%mGv^6e2gW)Cma}g#zBK(U&1OJZE^NVJW;7r(zv@l;
zAWZP}9(FBi+0TA^S#LP&P5tsWVDt-h`YKPRNGK>YG&LO$_w5~VF~j^6lbn#z{<UrO
z*!cL`x;l~9pTnPoE$lITZ2&te`pL9t0{5KO_{@zGbqwlo^L7{<=w#*K$jr^{8deaU
z;<EnpVD`iH<x``33?!ch7Aqev4%Q8A^tqG?3GE)VI#xcW$)GLATA(ID+2B)iU5A*i
zt-Ad4c55jA%jEL%;o&jSglohfxXp*>Cnh*S8+LRkrWC{=Gd1tdT<GZRTw7i3rMZg{
zz(2KR`70I4vAE1<^-MwGe3Q6k7~Y8GS?%Cmy_k@}zS8*IeQzE2I(-!S<$X%KQLB+h
z(=DGQVrHVAYfT()Hd=ym1uZ+yKbw&)&z59=nYy5@`@p^;%BO_+QF@`am*hMKO0w|&
z85Angu}F0bO{A#)=;@LuDw6pQqO#f+5*IaGb?8xOzF7Pdt@M7u=&q@$siLByp<$v}
z)bh$oQhK^s4)O`#$#<bg=dVeyXyhWx94(wBJ&`>~x=(iY>U4Vyba!s6W*Mk-h(EM+
ztgNhzj5A={Ad((Fe3&nZXsdl}Y^EObUM(HVJz4!nd9!BCW&OLmA~cCK-1{4eNi$gz
zozdMhiSFE|u$dO9Sx`1Q`6E(NNy=p8<QK%Ub8>+A43q{31l$O0LIi(|B%xTn$N6hw
zVq#WSR!^Qh>A%1RcUdN;A`v~kvs-y*^T!)Z|1Mt?D)-(yqC5@f!|KVi;y*SCaNwv@
z*Y4jyC)~rbv5rr;CqOKg7^(*bm}0J3p=Ujq9Y;+Q{y0D0ncGFoqbvpvC+bLg^Oee{
ze<C6W+G}Cr{^=+yoHUiDazpzcrpayn{r&BFXQI>7e+|>Z(KaM0xQn*K;VT=j-`=N0
zi4q;Pn6_EE<d;@Go(_5p2cVf3am`TZ&AlyIX$Sr?t?--v4`nFMIovr6tFYMVbFu1w
zbLD70OBj@KI8pp~-sEdaROG>-(7@v&*O~D}X-)R|J{+YN0oX{-b^Jjs+^{`db9r0#
z1_PZC-X|`7G_)r;kilarbkf^r)GkNv6_yOAI6e-1j2cZcc$I%A;kG|mcKfd*?HKY^
zgR&&9CQLY#BTG>9f>`)MkLJsQ#Rgm~l$_A6ryo;_@!^zEWp?-*<n2+fBn2F!vXgOg
zC{U5tICNr_ElV6SeFF7`Xz%s*)yDr~ISU6>eqTjtTbA@^6T|zPC`HROEuCAT_Bg&k
zn0yG9jnNKur~wM?{ZzQ%^>f{|IxoB?hbWg{A_*6r4kWNmkwJmpZ#0ocK0PQD=9AL<
zAFx}Hj_ajPm&8QVH+&%?CP~z)&|4EQZynvf9Mj(Wg%-|1le!Kv<Q4zy!6m@KX2PCX
z1ZDju7Yn5w=s^^%lG3VM=oFRMJ6wfy!ecOxsyi49CUi?`udh_0L<7k#39l{XRt<kS
zHg8e-$v=N?<lCM*{#RQc?cd`P5JZp-O$wchY?XL_dl7aA&hgGa!y6pFO_Qho-v81x
zxg!#K<FB*OWd65L;g;X~`)b$MLSO$i^nvF7X^r#qul@Y~iE}{%C$~P*`*!=W*~#Vh
zJsAzI{CzEsseg`nm-*+PeHE*}FEhPZIC1W;ClM|9aowPD@c2>Di=Izg&_yTDKSZ(>
wieY_n$>M9}d{}o*#$?*kdOzPjxuV*ZE8dE133k0s2l7uTaoKz6VvpbaKdt#(CjbBd
deleted file mode 100644
--- a/docs/figures/simple-3-merge.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="27 1677 497 345" width="497pt" height="345pt"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2012-03-21 08:32Z</dc:date><!-- Produced by OmniGraffle Professional 5.3.6 --></metadata><defs><filter id="Shadow" filterUnits="userSpaceOnUse"><feGaussianBlur in="SourceAlpha" result="blur" stdDeviation="3.488"/><feOffset in="blur" result="offset" dx="0" dy="4"/><feFlood flood-color="black" flood-opacity=".75" result="flood"/><feComposite in="flood" in2="offset" operator="in"/></filter><font-face font-family="Helvetica" font-size="26" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.31641" slope="0" x-height="522.94922" cap-height="717.2852" ascent="770.0196" descent="-229.98048" font-weight="500"><font-face-src><font-face-name name="Helvetica"/></font-face-src></font-face><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledDiamond_Marker" viewBox="-1 -3 6 6" markerWidth="6" markerHeight="6" color="red"><g><path d="M 3.7333333 0 L 1.8666667 -1.4 L 0 0 L 1.8666667 1.4 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/></g></marker></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><g><use xl:href="#id500_Graphic" filter="url(#Shadow)"/><use xl:href="#id501_Graphic" filter="url(#Shadow)"/><use xl:href="#id503_Graphic" filter="url(#Shadow)"/><use xl:href="#id504_Graphic" filter="url(#Shadow)"/><use xl:href="#id507_Graphic" filter="url(#Shadow)"/><use xl:href="#id509_Graphic" filter="url(#Shadow)"/><use xl:href="#id510_Graphic" filter="url(#Shadow)"/><use xl:href="#id516_Graphic" filter="url(#Shadow)"/><use xl:href="#id284_Graphic" filter="url(#Shadow)"/><use xl:href="#id520_Graphic" filter="url(#Shadow)"/><use xl:href="#id523_Graphic" filter="url(#Shadow)"/></g><g id="id500_Graphic"><rect x="47" y="1726.5562" width="143" height="260.96387" fill="white" fill-opacity=".5"/><rect x="47" y="1726.5562" width="143" height="260.96387" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id501_Graphic"><circle cx="118.50044" cy="1853.0206" r="28.346527" fill="red"/><circle cx="118.50044" cy="1853.0206" r="28.346527" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(100.82328 1837.5206)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="118.50028" y1="1913.1742" x2="118.500366" y2="1881.8672" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id503_Graphic"><path d="M 128.52223 1917.8254 C 134.05725 1923.3605 134.05725 1932.3344 128.52223 1937.8694 C 122.98724 1943.4044 114.013245 1943.4044 108.478256 1937.8694 C 102.94323 1932.3344 102.94323 1923.3605 108.478256 1917.8254 C 114.013245 1912.2904 122.98724 1912.2904 128.52223 1917.8254" fill="black"/><path d="M 128.52223 1917.8254 C 134.05725 1923.3605 134.05725 1932.3344 128.52223 1937.8694 C 122.98724 1943.4044 114.013245 1943.4044 108.478256 1937.8694 C 102.94323 1932.3344 102.94323 1923.3605 108.478256 1917.8254 C 114.013245 1912.2904 122.98724 1912.2904 128.52223 1917.8254" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id504_Graphic"><path d="M 128.52223 1963.3254 C 134.05725 1968.8605 134.05725 1977.8344 128.52223 1983.3694 C 122.98724 1988.9044 114.013245 1988.9044 108.478256 1983.3694 C 102.94323 1977.8344 102.94323 1968.8605 108.478256 1963.3254 C 114.013245 1957.7904 122.98724 1957.7904 128.52223 1963.3254" fill="black"/><path d="M 128.52223 1963.3254 C 134.05725 1968.8605 134.05725 1977.8344 128.52223 1983.3694 C 122.98724 1988.9044 114.013245 1988.9044 108.478256 1983.3694 C 102.94323 1977.8344 102.94323 1968.8605 108.478256 1963.3254 C 114.013245 1957.7904 122.98724 1957.7904 128.52223 1963.3254" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="118.500244" y1="1942.5206" x2="118.500244" y2="1958.6742" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id507_Graphic"><rect x="285.5" y="1693.958" width="218" height="303.08691" fill="white" fill-opacity=".5"/><rect x="285.5" y="1693.958" width="218" height="303.08691" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="393.10345" y1="1925.458" x2="364.69406" y2="1885.965" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id509_Graphic"><path d="M 411.69525 1927.3492 C 417.23026 1932.8843 417.23026 1941.8582 411.69525 1947.3932 C 406.16025 1952.9282 397.18625 1952.9282 391.65125 1947.3932 C 386.11624 1941.8582 386.11624 1932.8843 391.65125 1927.3492 C 397.18625 1921.8142 406.16025 1921.8142 411.69525 1927.3492" fill="black"/><path d="M 411.69525 1927.3492 C 417.23026 1932.8843 417.23026 1941.8582 411.69525 1947.3932 C 406.16025 1952.9282 397.18625 1952.9282 391.65125 1947.3932 C 386.11624 1941.8582 386.11624 1932.8843 391.65125 1927.3492 C 397.18625 1921.8142 406.16025 1921.8142 411.69525 1927.3492" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id510_Graphic"><path d="M 411.69525 1972.8492 C 417.23026 1978.3843 417.23026 1987.3582 411.69525 1992.8932 C 406.16025 1998.4282 397.18625 1998.4282 391.65125 1992.8932 C 386.11624 1987.3582 386.11624 1978.3843 391.65125 1972.8492 C 397.18625 1967.3142 406.16025 1967.3142 411.69525 1972.8492" fill="black"/><path d="M 411.69525 1972.8492 C 417.23026 1978.3843 417.23026 1987.3582 411.69525 1992.8932 C 406.16025 1998.4282 397.18625 1998.4282 391.65125 1992.8932 C 386.11624 1987.3582 386.11624 1978.3843 391.65125 1972.8492 C 397.18625 1967.3142 406.16025 1967.3142 411.69525 1972.8492" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="401.67789" y1="1952.0444" x2="401.68301" y2="1968.198" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id516_Graphic"><circle cx="347.84644" cy="1862.5444" r="28.346533" fill="red" fill-opacity=".5"/><path d="M 367.89038 1842.5005 C 378.96042 1853.5704 378.96042 1871.5184 367.89038 1882.5884 C 356.8204 1893.6584 338.87247 1893.6584 327.8025 1882.5884 C 316.73245 1871.5184 316.73245 1853.5704 327.8025 1842.5005 C 338.87247 1831.4304 356.8204 1831.4304 367.89038 1842.5005" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(330.16928 1847.0444)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="427.0911" y1="1818.7612" x2="385.31204" y2="1841.8445" marker-end="url(#FilledDiamond_Marker)" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke-dasharray="1,4"/><line x1="118.50028" y1="1824.1741" x2="118.50015" y2="1800.5271" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id284_Graphic"><circle cx="118.5" cy="1771.6807" r="28.346527" fill="yellow"/><circle cx="118.5" cy="1771.6807" r="28.346527" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(100.82284 1756.1807)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">B</tspan></text></g><g id="id520_Graphic"><circle cx="347.84644" cy="1754.9026" r="28.346533" fill="yellow" fill-opacity=".5"/><path d="M 367.89038 1734.8586 C 378.96042 1745.9286 378.96042 1763.8766 367.89038 1774.9465 C 356.8204 1786.0166 338.87247 1786.0166 327.8025 1774.9465 C 316.73245 1763.8766 316.73245 1745.9286 327.8025 1734.8586 C 338.87247 1723.7886 356.8204 1723.7886 367.89038 1734.8586" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(330.16928 1739.4026)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">B</tspan></text></g><line x1="347.84897" y1="1833.698" x2="347.85342" y2="1783.749" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><line x1="406.91367" y1="1923.662" x2="442.04407" y2="1831.7589" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id523_Graphic"><circle cx="452.34644" cy="1804.8074" r="28.346533" fill="#ff8000"/><circle cx="452.34644" cy="1804.8074" r="28.346533" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(434.66928 1789.3074)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="8.2889767" y="25" textLength="18.776367">C</tspan></text></g><line x1="426.309" y1="1792.373" x2="386.4721" y2="1773.3486" marker-end="url(#FilledDiamond_Marker)" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke-dasharray="1,4"/></g></g></svg>
deleted file mode 100644
--- a/docs/figures/simple-4-reorder.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="27 2166 497 345" width="497pt" height="345pt"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2012-03-21 08:32Z</dc:date><!-- Produced by OmniGraffle Professional 5.3.6 --></metadata><defs><filter id="Shadow" filterUnits="userSpaceOnUse"><feGaussianBlur in="SourceAlpha" result="blur" stdDeviation="3.488"/><feOffset in="blur" result="offset" dx="0" dy="4"/><feFlood flood-color="black" flood-opacity=".75" result="flood"/><feComposite in="flood" in2="offset" operator="in"/></filter><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledDiamond_Marker" viewBox="-1 -3 6 6" markerWidth="6" markerHeight="6" color="red"><g><path d="M 3.7333333 0 L 1.8666667 -1.4 L 0 0 L 1.8666667 1.4 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/></g></marker><font-face font-family="Helvetica" font-size="26" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.31641" slope="0" x-height="522.94922" cap-height="717.2852" ascent="770.0196" descent="-229.98048" font-weight="500"><font-face-src><font-face-name name="Helvetica"/></font-face-src></font-face></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><g><use xl:href="#id532_Graphic" filter="url(#Shadow)"/><use xl:href="#id525_Graphic" filter="url(#Shadow)"/><use xl:href="#id526_Graphic" filter="url(#Shadow)"/><use xl:href="#id528_Graphic" filter="url(#Shadow)"/><use xl:href="#id529_Graphic" filter="url(#Shadow)"/><use xl:href="#id534_Graphic" filter="url(#Shadow)"/><use xl:href="#id535_Graphic" filter="url(#Shadow)"/><use xl:href="#id537_Graphic" filter="url(#Shadow)"/><use xl:href="#id540_Graphic" filter="url(#Shadow)"/><use xl:href="#id541_Graphic" filter="url(#Shadow)"/><use xl:href="#id546_Graphic" filter="url(#Shadow)"/><use xl:href="#id549_Graphic" filter="url(#Shadow)"/></g><g id="id532_Graphic"><rect x="285.5" y="2182.9602" width="218" height="303.08691" fill="white" fill-opacity=".5"/><rect x="285.5" y="2182.9602" width="218" height="303.08691" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="427.7653" y1="2330.3635" x2="376.8968" y2="2275.3335" marker-end="url(#FilledDiamond_Marker)" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke-dasharray="1,4"/><g id="id525_Graphic"><rect x="47" y="2215.56" width="143" height="260.96387" fill="white" fill-opacity=".5"/><rect x="47" y="2215.56" width="143" height="260.96387" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id526_Graphic"><path d="M 138.5444 2321.9729 C 149.61443 2333.043 149.61443 2350.9907 138.5444 2362.0608 C 127.47443 2373.1309 109.526474 2373.1309 98.456505 2362.0608 C 87.386475 2350.9907 87.386475 2333.043 98.456505 2321.9729 C 109.526474 2310.9028 127.47443 2310.9028 138.5444 2321.9729" fill="red"/><path d="M 138.5444 2321.9729 C 149.61443 2333.043 149.61443 2350.9907 138.5444 2362.0608 C 127.47443 2373.1309 109.526474 2373.1309 98.456505 2362.0608 C 87.386475 2350.9907 87.386475 2333.043 98.456505 2321.9729 C 109.526474 2310.9028 127.47443 2310.9028 138.5444 2321.9729" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(100.82329 2326.5168)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="118.50029" y1="2402.1704" x2="118.500374" y2="2370.8633" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id528_Graphic"><path d="M 128.52225 2406.8218 C 134.05727 2412.3567 134.05727 2421.3308 128.52225 2426.8657 C 122.98724 2432.4009 114.01326 2432.4009 108.478264 2426.8657 C 102.94324 2421.3308 102.94324 2412.3567 108.478264 2406.8218 C 114.01326 2401.2866 122.98724 2401.2866 128.52225 2406.8218" fill="black"/><path d="M 128.52225 2406.8218 C 134.05727 2412.3567 134.05727 2421.3308 128.52225 2426.8657 C 122.98724 2432.4009 114.01326 2432.4009 108.478264 2426.8657 C 102.94324 2421.3308 102.94324 2412.3567 108.478264 2406.8218 C 114.01326 2401.2866 122.98724 2401.2866 128.52225 2406.8218" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id529_Graphic"><path d="M 128.52225 2452.3218 C 134.05727 2457.8567 134.05727 2466.8308 128.52225 2472.3657 C 122.98724 2477.9009 114.01326 2477.9009 108.478264 2472.3657 C 102.94324 2466.8308 102.94324 2457.8567 108.478264 2452.3218 C 114.01326 2446.7866 122.98724 2446.7866 128.52225 2452.3218" fill="black"/><path d="M 128.52225 2452.3218 C 134.05727 2457.8567 134.05727 2466.8308 128.52225 2472.3657 C 122.98724 2477.9009 114.01326 2477.9009 108.478264 2472.3657 C 102.94324 2466.8308 102.94324 2457.8567 108.478264 2452.3218 C 114.01326 2446.7866 122.98724 2446.7866 128.52225 2452.3218" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="118.50025" y1="2431.5171" x2="118.50025" y2="2447.6704" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="393.10349" y1="2414.4607" x2="364.69394" y2="2374.9673" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id534_Graphic"><path d="M 411.69525 2416.352 C 417.23026 2421.887 417.23026 2430.8611 411.69525 2436.396 C 406.16025 2441.9312 397.18625 2441.9312 391.65125 2436.396 C 386.11624 2430.8611 386.11624 2421.887 391.65125 2416.352 C 397.18625 2410.8169 406.16025 2410.8169 411.69525 2416.352" fill="black"/><path d="M 411.69525 2416.352 C 417.23026 2421.887 417.23026 2430.8611 411.69525 2436.396 C 406.16025 2441.9312 397.18625 2441.9312 391.65125 2436.396 C 386.11624 2430.8611 386.11624 2421.887 391.65125 2416.352 C 397.18625 2410.8169 406.16025 2410.8169 411.69525 2416.352" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id535_Graphic"><path d="M 411.69525 2461.852 C 417.23026 2467.387 417.23026 2476.3611 411.69525 2481.896 C 406.16025 2487.4312 397.18625 2487.4312 391.65125 2481.896 C 386.11624 2476.3611 386.11624 2467.387 391.65125 2461.852 C 397.18625 2456.3169 406.16025 2456.3169 411.69525 2461.852" fill="black"/><path d="M 411.69525 2461.852 C 417.23026 2467.387 417.23026 2476.3611 411.69525 2481.896 C 406.16025 2487.4312 397.18625 2487.4312 391.65125 2481.896 C 386.11624 2476.3611 386.11624 2467.387 391.65125 2461.852 C 397.18625 2456.3169 406.16025 2456.3169 411.69525 2461.852" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="401.67325" y1="2441.0474" x2="401.67325" y2="2457.2007" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id537_Graphic"><path d="M 367.89038 2331.5027 C 378.96042 2342.5728 378.96042 2360.5205 367.89038 2371.5906 C 356.8204 2382.6606 338.87247 2382.6606 327.8025 2371.5906 C 316.73245 2360.5205 316.73245 2342.5728 327.8025 2331.5027 C 338.87247 2320.4326 356.8204 2320.4326 367.89038 2331.5027" fill="red" fill-opacity=".5"/><path d="M 367.89038 2331.5027 C 378.96042 2342.5728 378.96042 2360.5205 367.89038 2371.5906 C 356.8204 2382.6606 338.87247 2382.6606 327.8025 2371.5906 C 316.73245 2360.5205 316.73245 2342.5728 327.8025 2331.5027 C 338.87247 2320.4326 356.8204 2320.4326 367.89038 2331.5027" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(330.16928 2336.0466)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="118.500275" y1="2313.1704" x2="118.50013" y2="2289.523" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id540_Graphic"><path d="M 138.5439 2240.6326 C 149.61392 2251.7026 149.61392 2269.6504 138.5439 2280.7205 C 127.47393 2291.7905 109.52598 2291.7905 98.45601 2280.7205 C 87.38598 2269.6504 87.38598 2251.7026 98.45601 2240.6326 C 109.52598 2229.5625 127.47393 2229.5625 138.5439 2240.6326" fill="yellow"/><path d="M 138.5439 2240.6326 C 149.61392 2251.7026 149.61392 2269.6504 138.5439 2280.7205 C 127.47393 2291.7905 109.52598 2291.7905 98.45601 2280.7205 C 87.38598 2269.6504 87.38598 2251.7026 98.45601 2240.6326 C 109.52598 2229.5625 127.47393 2229.5625 138.5439 2240.6326" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(100.82279 2245.1765)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">B</tspan></text></g><g id="id541_Graphic"><path d="M 367.89038 2223.8625 C 378.96042 2234.9326 378.96042 2252.8804 367.89038 2263.9504 C 356.8204 2275.0205 338.87247 2275.0205 327.8025 2263.9504 C 316.73245 2252.8804 316.73245 2234.9326 327.8025 2223.8625 C 338.87247 2212.7925 356.8204 2212.7925 367.89038 2223.8625" fill="yellow" fill-opacity=".5"/><path d="M 367.89038 2223.8625 C 378.96042 2234.9326 378.96042 2252.8804 367.89038 2263.9504 C 356.8204 2275.0205 338.87247 2275.0205 327.8025 2263.9504 C 316.73245 2252.8804 316.73245 2234.9326 327.8025 2223.8625 C 338.87247 2212.7925 356.8204 2212.7925 367.89038 2223.8625" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(330.16928 2228.4065)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">B</tspan></text></g><line x1="347.84644" y1="2322.7002" x2="347.84644" y2="2272.7529" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id546_Graphic"><path d="M 467.39038 2218.6619 C 478.46042 2229.732 478.46042 2247.6797 467.39038 2258.7498 C 456.3204 2269.8198 438.37247 2269.8198 427.3025 2258.7498 C 416.23245 2247.6797 416.23245 2229.732 427.3025 2218.6619 C 438.37247 2207.5918 456.3204 2207.5918 467.39038 2218.6619" fill="red"/><path d="M 467.39038 2218.6619 C 478.46042 2229.732 478.46042 2247.6797 467.39038 2258.7498 C 456.3204 2269.8198 438.37247 2269.8198 427.3025 2258.7498 C 416.23245 2247.6797 416.23245 2229.732 427.3025 2218.6619 C 438.37247 2207.5918 456.3204 2207.5918 467.39038 2218.6619" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(429.66928 2223.2058)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="6.5243282" y="25" textLength="22.305664">A'</tspan></text></g><line x1="409.35617" y1="2413.8691" x2="432.46094" y2="2376.2634" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><line x1="447.3466" y1="2267.5522" x2="447.34692" y2="2322.7002" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id549_Graphic"><path d="M 467.39038 2331.5027 C 478.46042 2342.5728 478.46042 2360.5205 467.39038 2371.5906 C 456.3204 2382.6606 438.37247 2382.6606 427.3025 2371.5906 C 416.23245 2360.5205 416.23245 2342.5728 427.3025 2331.5027 C 438.37247 2320.4326 456.3204 2320.4326 467.39038 2331.5027" fill="yellow"/><path d="M 467.39038 2331.5027 C 478.46042 2342.5728 478.46042 2360.5205 467.39038 2371.5906 C 456.3204 2382.6606 438.37247 2382.6606 427.3025 2371.5906 C 416.23245 2360.5205 416.23245 2342.5728 427.3025 2331.5027 C 438.37247 2320.4326 456.3204 2320.4326 467.39038 2331.5027" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(429.66928 2336.0466)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="6.5243282" y="25" textLength="22.305664">B'</tspan></text></g><line x1="428.2673" y1="2260.343" x2="376.15155" y2="2319.4465" marker-end="url(#FilledDiamond_Marker)" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke-dasharray="1,4"/></g></g></svg>
deleted file mode 100644
--- a/docs/figures/simple-5-delete.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="66 2640 420 262" width="35pc" height="262pt"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2012-03-21 08:32Z</dc:date><!-- Produced by OmniGraffle Professional 5.3.6 --></metadata><defs><filter id="Shadow" filterUnits="userSpaceOnUse"><feGaussianBlur in="SourceAlpha" result="blur" stdDeviation="3.488"/><feOffset in="blur" result="offset" dx="0" dy="4"/><feFlood flood-color="black" flood-opacity=".75" result="flood"/><feComposite in="flood" in2="offset" operator="in"/></filter><font-face font-family="Helvetica" font-size="26" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.31641" slope="0" x-height="522.94922" cap-height="717.2852" ascent="770.0196" descent="-229.98048" font-weight="500"><font-face-src><font-face-name name="Helvetica"/></font-face-src></font-face><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledDiamond_Marker" viewBox="-1 -3 6 6" markerWidth="6" markerHeight="6" color="red"><g><path d="M 3.7333333 0 L 1.8666667 -1.4 L 0 0 L 1.8666667 1.4 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/></g></marker><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="Ball_Marker" viewBox="-4 -3 5 6" markerWidth="5" markerHeight="6" color="red"><g><circle cx="-1.3999994" cy="0" r="1.3999988" fill="none" stroke="currentColor" stroke-width="1"/></g></marker></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><g><use xl:href="#id575_Graphic" filter="url(#Shadow)"/><use xl:href="#id554_Graphic" filter="url(#Shadow)"/><use xl:href="#id555_Graphic" filter="url(#Shadow)"/><use xl:href="#id557_Graphic" filter="url(#Shadow)"/><use xl:href="#id558_Graphic" filter="url(#Shadow)"/><use xl:href="#id562_Graphic" filter="url(#Shadow)"/><use xl:href="#id563_Graphic" filter="url(#Shadow)"/><use xl:href="#id565_Graphic" filter="url(#Shadow)"/></g><g id="id575_Graphic"><rect x="322.92328" y="2656" width="143" height="221.08398" fill="white" fill-opacity=".5"/><rect x="322.92328" y="2656" width="143" height="221.08398" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id554_Graphic"><rect x="86" y="2670.28" width="143" height="192.52393" fill="white" fill-opacity=".5"/><rect x="86" y="2670.28" width="143" height="192.52393" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id555_Graphic"><path d="M 177.54439 2708.2524 C 188.61441 2719.3225 188.61441 2737.2703 177.54439 2748.3403 C 166.47443 2759.4104 148.52646 2759.4104 137.4565 2748.3403 C 126.38647 2737.2703 126.38647 2719.3225 137.4565 2708.2524 C 148.52646 2697.1824 166.47443 2697.1824 177.54439 2708.2524" fill="red"/><path d="M 177.54439 2708.2524 C 188.61441 2719.3225 188.61441 2737.2703 177.54439 2748.3403 C 166.47443 2759.4104 148.52646 2759.4104 137.4565 2748.3403 C 126.38647 2737.2703 126.38647 2719.3225 137.4565 2708.2524 C 148.52646 2697.1824 166.47443 2697.1824 177.54439 2708.2524" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(139.82329 2712.7964)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="157.50027" y1="2788.45" x2="157.50037" y2="2757.1428" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id557_Graphic"><path d="M 167.52223 2793.1013 C 173.05725 2798.6362 173.05725 2807.6104 167.52223 2813.1453 C 161.98724 2818.6804 153.013245 2818.6804 147.47826 2813.1453 C 141.94324 2807.6104 141.94324 2798.6362 147.47826 2793.1013 C 153.013245 2787.5662 161.98724 2787.5662 167.52223 2793.1013" fill="black"/><path d="M 167.52223 2793.1013 C 173.05725 2798.6362 173.05725 2807.6104 167.52223 2813.1453 C 161.98724 2818.6804 153.013245 2818.6804 147.47826 2813.1453 C 141.94324 2807.6104 141.94324 2798.6362 147.47826 2793.1013 C 153.013245 2787.5662 161.98724 2787.5662 167.52223 2793.1013" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id558_Graphic"><path d="M 167.52223 2838.6013 C 173.05725 2844.1362 173.05725 2853.1104 167.52223 2858.6453 C 161.98724 2864.1804 153.013245 2864.1804 147.47826 2858.6453 C 141.94324 2853.1104 141.94324 2844.1362 147.47826 2838.6013 C 153.013245 2833.0662 161.98724 2833.0662 167.52223 2838.6013" fill="black"/><path d="M 167.52223 2838.6013 C 173.05725 2844.1362 173.05725 2853.1104 167.52223 2858.6453 C 161.98724 2864.1804 153.013245 2864.1804 147.47826 2858.6453 C 141.94324 2853.1104 141.94324 2844.1362 147.47826 2838.6013 C 153.013245 2833.0662 161.98724 2833.0662 167.52223 2838.6013" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="157.50024" y1="2817.7966" x2="157.50024" y2="2833.95" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="394.42325" y1="2798.7" x2="394.42328" y2="2764.2998" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id562_Graphic"><path d="M 404.44525 2803.3513 C 409.98026 2808.8862 409.98026 2817.8604 404.44525 2823.3953 C 398.91025 2828.9304 389.93625 2828.9304 384.40125 2823.3953 C 378.86624 2817.8604 378.86624 2808.8862 384.40125 2803.3513 C 389.93625 2797.8162 398.91025 2797.8162 404.44525 2803.3513" fill="black"/><path d="M 404.44525 2803.3513 C 409.98026 2808.8862 409.98026 2817.8604 404.44525 2823.3953 C 398.91025 2828.9304 389.93625 2828.9304 384.40125 2823.3953 C 378.86624 2817.8604 378.86624 2808.8862 384.40125 2803.3513 C 389.93625 2797.8162 398.91025 2797.8162 404.44525 2803.3513" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id563_Graphic"><path d="M 404.44525 2848.8513 C 409.98026 2854.3862 409.98026 2863.3604 404.44525 2868.8953 C 398.91025 2874.4304 389.93625 2874.4304 384.40125 2868.8953 C 378.86624 2863.3604 378.86624 2854.3862 384.40125 2848.8513 C 389.93625 2843.3162 398.91025 2843.3162 404.44525 2848.8513" fill="black"/><path d="M 404.44525 2848.8513 C 409.98026 2854.3862 409.98026 2863.3604 404.44525 2868.8953 C 398.91025 2874.4304 389.93625 2874.4304 384.40125 2868.8953 C 378.86624 2863.3604 378.86624 2854.3862 384.40125 2848.8513 C 389.93625 2843.3162 398.91025 2843.3162 404.44525 2848.8513" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="394.42325" y1="2828.0466" x2="394.42325" y2="2844.2" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id565_Graphic"><path d="M 414.46722 2715.4094 C 425.53726 2726.4795 425.53726 2744.4272 414.46722 2755.4973 C 403.39725 2766.5674 385.4493 2766.5674 374.37933 2755.4973 C 363.3093 2744.4272 363.3093 2726.4795 374.37933 2715.4094 C 385.4493 2704.3394 403.39725 2704.3394 414.46722 2715.4094" fill="red" fill-opacity=".5"/><path d="M 414.46722 2715.4094 C 425.53726 2726.4795 425.53726 2744.4272 414.46722 2755.4973 C 403.39725 2766.5674 385.4493 2766.5674 374.37933 2755.4973 C 363.3093 2744.4272 363.3093 2726.4795 374.37933 2715.4094 C 385.4493 2704.3394 403.39725 2704.3394 414.46722 2715.4094" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(376.7461 2719.9534)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="442.8926" y1="2681.3723" x2="422.98685" y2="2703.5828" marker-end="url(#FilledDiamond_Marker)" marker-start="url(#Ball_Marker)" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke-dasharray="1,4"/></g></g></svg>
--- a/docs/from-mq.rst
+++ b/docs/from-mq.rst
@@ -1,9 +1,12 @@
--------------------------------------------
+.. Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
+..                Logilab SA        <contact@logilab.fr>
+
+-----------------------------------
 From MQ To Evolve, The Refugee Book
--------------------------------------------
+-----------------------------------
 
 Cheat sheet
--------------
+-----------
 
 ==============================  ============================================
 mq command                       new equivalent
@@ -11,11 +14,13 @@
 qseries                         ``log``
 qnew                            ``commit``
 qrefresh                        ``amend``
-qpop                            ``update`` or ``qdown``
-qpush                           ``update`` or ``gup`` sometimes ``stabilize``
+qrefresh --exclude              ``uncommit``
+qpop                            ``update`` or ``gdown``
+qpush                           ``update`` or ``gup`` sometimes ``evolve``
 qrm                             ``prune``
-qfold                           ``amend -c`` (for now, ``collapse`` soon)
+qfold                           ``fold``
 qdiff                           ``odiff``
+qrecord                         ``record``
 
 qfinish                         --
 qimport                         --
@@ -23,10 +28,10 @@
 
 
 Replacement details
----------------------
+-------------------
 
 hg qseries
-```````````
+``````````
 
 All your work in progress is now in real changesets all the time.
 
@@ -34,17 +39,17 @@
 phase revset to display unfinished work only, and use templates to have
 the same kind of compact that the output of qseries has.
 
-This will result in something like that::
+This will result in something like::
 
   [alias]
   wip = log -r 'not public()' --template='{rev}:{node|short} {desc|firstline}\n'
 
 hg qnew
-````````
+```````
 
 With evolve you handle standard changesets without an additional overlay.
 
-Standard changeset are created using hg commit as usual.::
+Standard changeset are created using hg commit as usual::
 
   $ hg commit
 
@@ -52,7 +57,7 @@
 set your changeset in the secret phase using the phase command.
 
 Note that you only need it for the first commit you want to be secret. Later
-commits will inherit their parents phase.
+commits will inherit their parent's phase.
 
 If you always want your new commit to be in the secret phase, your should
 consider updating your configuration:
@@ -61,7 +66,7 @@
   new-commit=secret
 
 hg qref
-````````
+```````
 
 A new command from evolution will allow you to rewrite the changeset you are
 currently on. Just call:
@@ -71,28 +76,31 @@
 This command takes the same options as commit, plus the switch '-e' (--edit)
 to edit the commit message in an editor.
 
-The amend command also has a -c switch which allow you to make an
-explicit amending commit before rewriting a changeset.::
 
-  $ hg record -m 'feature A'
-  # oups, I forget some stuff
-  $ hg record babar.py
-  $ hg amend -c .^ # .^ refer to "working directoy parent, here 'feature A'
+.. -c is very confusig
+..
+.. The amend command also has a -c switch which allows you to make an
+.. explicit amending commit before rewriting a changeset.::
+..
+..   $ hg record -m 'feature A'
+..   # oups, I forgot some stuff
+..   $ hg record babar.py
+..   $ hg amend -c .^ # .^ refer to "working directoy parent, here 'feature A'
 
-note: refresh is an alias for amend
+.. note: refresh is an alias for amend
 
-hg qref -X
-````````````
+hg qref --exclude
+`````````````````
 
-To remove change from you current commit use::
+To remove changes from your current commit use::
 
   $ hg uncommit not-ready.txt
 
 
 hg qpop
-`````````
+```````
 
-The following command emulate the behavior of hg qpop:
+The following command emulates the behavior of hg qpop:
 
   $ hg gdown
 
@@ -100,20 +108,20 @@
 
   $ hg update
 
-.. note:: gdown and update allow movement with working directory changes applied
-          and gracefully merge them.
+.. note:: gdown and update allow movement with working directory
+          changes applied, and gracefully merge them.
 
 hg qpush
 ````````
 
 When you rewrite changesets, descendants of rewritten changesets are marked as
-"out of sync". You need to rewrite them on top of the new version of their
+"unstable". You need to rewrite them on top of the new version of their
 ancestor.
 
-The evolution extension adds a command to rewrite the "out of sync"
+The evolution extension adds a command to rewrite "unstable"
 changesets:::
 
-  $ hg stabilize
+  $ hg evolve
 
 You can also decide to do it manually using::
 
@@ -128,45 +136,37 @@
 
 
 hg qrm
-```````
+``````
 
 evolution introduce a new command to mark a changeset as "not wanted anymore".::
 
   $ hg prune <revset>
 
 hg qfold
-`````````
+````````
 
 
 ::
 
-  $ hg up <top changeset>
-  $ amend --edit -c <bottom changeset>
-
-
-or later::
-
-  $ hg collapse # XXX not implemented
-  $ hg rebase --collapse # XXX not tested
-
+  $ hg fold first::last
 
 hg qdiff
-`````````
+````````
 
-``odiff`` is an alias for `hg diff -r .^` it works as qdiff, but outside mq.
+``pdiff`` is an alias for `hg diff -r .^` It works like qdiff, but outside MQ.
 
 
 
 hg qfinish and hg qimport
-````````````````````````````
+`````````````````````````
 
-These are not necessary anymore. If you want to control exchange and
-mutability of changesets, see the phase feature
+These are not necessary anymore. If you want to control the
+mutability of changesets, see the phase feature.
 
 
 
 hg qcommit
-```````````````
+``````````
 
 If you really need to send patches through versioned mq patches, you should
 look at the qsync extension.
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -1,166 +1,147 @@
-========================================
-Safe Mutable History
-========================================
-
+.. Copyright © 2014 Greg Ward <greg@gerg.ca>
 
-Here are various materials on planned improvement to Mercurial regarding
-rewriting history.
-
-First read about what challenge arise while rewriting history and how we plan to
-solve them once and for all.
+==================================
+Changeset Evolution with Mercurial
+==================================
 
 .. toctree::
    :maxdepth: 2
 
-   instability
+   user-guide
+   sharing
+   concepts
+   from-mq
+
+`evolve`_ is an experimental Mercurial extension for safe mutable history.
+
+.. _`evolve`: http://mercurial.selenic.com/wiki/EvolveExtension
 
-The effort is split in two parts:
+With core Mercurial, changesets are permanent and immutable. You can
+commit new changesets to modify your source code, but you cannot
+modify or remove old changesets—they are carved in stone for all
+eternity.
 
- * The **obsolete marker** concept aims to provide an alternative to ``strip``
-   to get rid of changesets.
+For years, Mercurial has included various extensions that allow
+history modification: ``rebase``, ``mq``, ``histedit``, and so forth.
+These are useful and popular extensions, and in fact history
+modification is one of the big reasons DVCSes (distributed version
+control systems) like Mercurial took off.
+
+But there's a catch: until now, Mercurial's various mechanisms for
+modifying history have been *unsafe*, in that changesets were
+destroyed (“stripped”) rather than simply made invisible.
+
+``evolve`` makes things better in a couple of ways:
 
- * The **evolve** mercurial extension rewrites history using obsolete
-   *marker* under the hood.
+  * It changes the behaviour of most existing history modification
+    extensions (``rebase``, ``histedit``, etc.) so they use a safer
+    mechanism (*changeset obsolescence*, covered below) rather than
+    the older, less safe *strip* operation.
+
+  * It provides a new way of modifying history that is roughly
+    equivalent to ``mq`` (but much nicer and safer).
+
+It helps to understand that ``evolve`` builds on infrastructure
+already in core Mercurial:
+
+  * *Phases* (starting in Mercurial 2.1) allow you to distinguish
+    mutable and immutable changesets. We'll cover phases early in the
+    user guide, since understanding phases is essential to
+    understanding ``evolve``.
 
-The first and most important step is by far the **obsolete marker**. However
-most users will never be directly exposed to the concept. For this reason
-this manual starts with changeset evolution.
+  * *Changeset obsolescence* (starting in Mercurial 2.3) is how
+    Mercurial knows how history has been modified, specifically when
+    one changeset replaces another. In the obsolescence model, a
+    changeset is neither removed nor modified, but is instead marked
+    *obsolete* and typically replaced by a *successor*. Obsolete
+    changesets usually become *hidden* as well. Obsolescence is an
+    invisible feature until you start using ``evolve``, so we'll cover
+    it in the user guide too.
 
-Evolve: A robust alternative to MQ
-====================================
+Some of the things you can do with ``evolve`` are:
+
+  * Fix a mistake immediately: “Oops! I just committed a changeset
+    with a syntax error—I'll fix that and amend the changeset so no
+    one sees my mistake.” (While this is possible using existing
+    features of core Mercurial, ``evolve`` makes it safer.)
 
-Evolve is an experimental history rewriting extension that uses obsolete
-markers. It is inspired from MQ and pbranch but have multiple advantages over
-them:
+  * Fix a mistake a little bit later: “Oops! I broke the tests three
+    commits back, but only noticed it now—I'll just update back to the
+    bad changeset, fix my mistake, amend the changeset, and evolve
+    history to update the affected changesets.”
+
+  * Remove unwanted changes: “I hacked in some debug output two
+    commits back; everything is working now, so I'll just prune that
+    unwanted changeset and evolve history before pushing.”
+
+  * Share mutable history with yourself: say you do most of your
+    programming work locally, but need to test on a big remote server
+    somewhere before you know everything is good. You can use
+    ``evolve`` to share mutable history between two computers, pushing
+    finely polished changesets to a public repository only after
+    testing on the test server.
 
-* Focus on your current work.
+  * Share mutable history for code review: you don't want to publish
+    unreviewed changesets, but you can't block every commit waiting
+    for code review. The solution is to share mutable history with
+    your reviewer, amending each changeset until it passes review.
+
+``evolve`` is experimental!
+---------------------------
 
-    You can focus your work on a single changeset and take care of adapting
-    descendent changeset later.
+The long-term plan for ``evolve`` is to add it to core Mercurial.
+However, it is not yet stable enough for that. In particular:
+
+  * The UI is unstable: ``evolve``'s command names and command options
+    are not completely nailed down yet. They are subject to occasional
+    backwards-incompatible changes. If you write scripts that use
+    evolve commands, a future release could break your scripts.
 
-* Handle **non-linear history with branches and merges**
+  * There are still some corner cases that aren't handled yet. If you
+    think you have found such a case, please check if it's already
+    described in the Mercurial bug tracker (http://bz.selenic.com).
+    Bugs in ``evolve`` are files under component "evolution": use
+    `this query`_ to view open bugs in ``evolve``.
 
-* Rely internally on **robust merge** mechanism of mercurial.
+.. _`this query`: http://bz.selenic.com/buglist.cgi?component=evolution&bug_status=UNCONFIRMED&bug_status=CONFIRMED&bug_status=NEED_EXAMPLE
+
+Installation and setup
+----------------------
+
+To use ``evolve``, you must:
+
+  #. Clone the ``evolve`` repository::
 
-  Simple conflict are handled by real merge tools using appropriate ancestor.
-  Conflict are much rarer and much more user friendly.
+       cd ~/src
+       hg clone https://bitbucket.org/marmoute/mutable-history
+
+  #. Configure the extension, either locally ::
+
+       hg config --local
+
+     or for all your repositories ::
 
-*  Mutable history **fully available all the time**.
+       hg config --edit
+
+     Then add ::
 
-  always use 'hg update' and forget about (un)applying patches to access the
-  mutable part of your history.
+       evolve=~/src/mutable-history/hgext/evolve.py
+
+     in the ``[extensions]`` section (adding the section if necessary). Use
+     the directory that you actually cloned to, of course.
 
 
-* Use only **plain changeset** and forget about patches. Evole will create and
-  exchange real changesets. Mutable history can be used in all usual operations:
-  pull, push, log, diff, etc.
-
-* Allow **sharing and collaboration** mutable history without fear of duplicate
-  (thanks to obsolete marker).
-
-* Cover all mq usage but guard.
-
-.. warning:: The evolve extention and the obsolete marker are at an experimental
-            stage. While using obsolete you'll likely be exposed to complex
-            implication of the **obsolete marker** concept. I do not recommend
-            non-power user to test this at this stage.
-
-            XXX make sure to read the XXX section before using it.
-
-            Production ready version should hide such details to normal user.
-
-To enable the evolve extension use::
-
-    $ hg clone https://bitbucket.org/marmoute/mutable-history -u stable
-    $ mutable-history/enable.sh >> ~/.hgrc
-
-You will probably want to use the associated version of hgview (qt viewer
-recommended). ::
-
-    $ hg clone http://hg-lab.logilab.org/wip/hgview/ -u obsolete
-    $ cd hgview
-    $ python setup.py install --user
-
-Works with mercurial 2.2
-
- ---
-
-For more information see documents below:
-
-.. toctree::
-   :maxdepth: 1
-
-   tutorials/tutorial
-   evolve-good-practice
-   evolve-faq
-   from-mq
-   evolve-collaboration
-   qsync
-
-Smart changeset deletion: Obsolete Marker
-==========================================
-
-Obsolete marker is a powerful concept that allow mercurial to safely handle
-history rewriting operations. It is a new type of relation between Mercurial
-changesets that track the result of history rewriting operations.
-
-This concept is simple to define and provides a very solid base to:
-
-- Very fast history rewriting operations,
+Next steps:
+-----------
 
-- auditable and reversible history rewriting process,
-
-- clean final history,
-
-- share and collaborate on mutable parts of the history,
-
-- gracefully handle history rewriting conflicts,
-
-- allow various history rewriting UI to collaborate with a underlying common API.
-
- ---
-
-For more information see documents below
-
-.. toctree::
-   :maxdepth: 1
-
-   obs-concept
-   obs-terms
-   obs-implementation
-   obs-road-map
-
-
-Known limitation and bug
-=================================
-
-Here is a list of know issue that will be fixed later:
+  * For a practical guide to using ``evolve`` in a single repository,
+    see the `user guide`_.
+  * For more advanced tricks, see `sharing mutable history`_.
+  * To learn about the concepts underlying ``evolve``, see `concepts`_
+    (incomplete).
+  * If you're coming from MQ, see the `MQ migration guide`_ (incomplete).
 
-
-* ``hg stabilize`` does not handle merge conflict.
-
-    You must fallback to graft or rebase when that happen.
-
-* rewriting conflict are not detected yet``hg stabilize`` does not
-  handle them.
-
-* ``hg update`` can move an obsolete parent
-
-* you need to provide to `graft --continue -O` if you started you
-  graft using `-O`.
-
-* ``hg merge`` considers an extinct head to be a valid target, hence requiring
-  you to manually specify target all the time.
-
-* trying to exchange obsolete marker with a static http repo will crash.
-
-* trying to exchange a lot of obsolete markers through http crash.
-
-* Extinct changesets are turned secret by various commands.
-
-* Extinct changesets are hidden using the *hidden* feature of mercurial only
-  supported by a few commands.
-
-  Only ``hg log``, ``hgview`` and `hg glog` support it. ``hg head`` or other visual viewer don't.
-
-* hg heads show extinct changeset
+.. _`user guide`: user-guide.html
+.. _`sharing mutable history`: sharing.html
+.. _`concepts`: concepts.html
+.. _`MQ migration guide`: from-mq.html
deleted file mode 100644
--- a/docs/instability.rst
+++ /dev/null
@@ -1,221 +0,0 @@
-
------------------------------------
-The instability Principle
------------------------------------
-
-
-
-An intrinsic contradiction
------------------------------------
-
-XXX starts by talking about getting ride of changeset.
-
-DVCSes bring two new major concepts to the Version Control Scene:
-
-    * History is organized as a robust DAG,
-    * History can be rewritten.
-
-However, the two concepts are in contradiction:
-
-To achieve a robust history, three key elements are gathered in *changesets*:
-
-    * Full snapshot of the versioned content,
-    * Reference to the previous full snapshot used to build the new one,
-    * A description of the change who lead from the old content to the new old.
-
-All three elements are to compute a *unique* hash that identify the changeset
-(with various other metadata). This identification is a key part of DVCS design.
-
-This is a very useful property because Changing B parent means
-changing B content too. This requires the creation of **another**
-changeset, which is semantically good.
-
-::
-
-  Schema base,  A, B and B'
-
-To avoid duplication, the older changeset is usually discarded from accessible
-history. I'm calling them *obsolete* changesets.
-
-
-But rewriting a changeset with children does not change these
-children's parent! And because children of the rewritten changeset
-still **depend** on the older "dead" version of the changeset with
-can not get rid of this dead version.
-
-::
-
-  Schema base,  A and A' and B.
-
-I'm calling these children **unstable** because they are based on a
-dead changeset and prevent people to get rid of it.
-
-This instability is an **unavoidable consequence** of the strict dependency of
-changeset.  History Rewriting history alway  need to take it in account and
-provide a way to rewrite the descendant on the new changeset to avoid
-coexistence of the old and new version of a rewritten changeset.
-
-
-Everybody is working around the issue
-------------------------------------------------
-
-I'm not claiming that rewriting history is impossible. People are successfully
-doing for years. However they all need to work around *instability*. Several
-work around strategy exists.
-
-
-Rewriting all at once
-``````````````````````````
-
-The simplest way to avoid instability is to ensure rewriting
-operations always end in a stable situation. This is achieved by
-rewriting all affected changesets at the same time.
-
-Rewriting all descendants at the same time when rewriting a changeset.
-
-::
-
-  Schema!
-
-Several Mercurial commands apply it: rebase, collapse, histedit.
-Mercurial also refuses to amend changeset with descendant. The git
-branch design enforces such approach in git too.
-
-
-However, DVCS are **Distributed**. This means that you do not control what
-happen outside your repository. Once a changeset have been exchanged *outside*,
-there is no way to be sure it does not have descendants somewhere else.
-Therefore **if you rewrite changeset that exists elsewhere, you can't eradicate
-the risk of instability.**
-
-Do not rewrite exchanged changeset
-```````````````````````````````````
-
-To work around the issue above, Mercurial introduced phases, which
-prevent you from rewriting shared changesets and ensure others can't
-pull certain changesets from you. But this is a very frustrating
-limitation that prevents you to efficiently sharing, reviewing and
-collaborating on mutable changesets.
-
-In the Git world, they use another approach to prevent instability. By
-convention only a single developper works on a changeset contained in
-a named branch. But once again this is a huge blocker for
-collaborating. Moreover clueless people **will** mess up social
-convention soon or later.
-
-
-Loose the DAG robustness
-````````````````````````````
-
-The other approach in Mercurial is to keep the mutable part of the
-history outside the DVCS constraint. This is the MQ approach of
-sticking a quilt queue over Mercurial.
-
-This allow much more flexible workflow but two major feature are lost in the
-process:
-
-:Graceful merge: MQ use plain-patch to store changeset content and patch have
-                 trouble to apply in changing context. Applying your queue
-                 becomes very painful when context changes.
-
-:easy branching: A quilt queue is by definition a linear queue. Increasing risk
-                 of conflict
-
-It is possible to collaborate over versioned mq! But you are going to
-have a lot of troubles.
-
-Ignore conflicts
-```````````````````````````````````
- 
-Another ignored issue is a conflicting rewrite of the same changeset.
-If a changeset is rewritten two times we have two newer versions,
-and duplicated history is complicated to merge.
-
-Mercurial work around by
-
-The "One set of mutable changset == One developer" mantra is also a way to work
-around conflicting rewriting of changeset. If two different people are able to
-
-The git branch model allow to overwrite changeset version by another
-one, but it does not care about divergent version. It is the equivalent
-of "common ftp" source management for changesets.
-
-Facing The Danger Once And For All
-------------------------------------------------
-
-Above we saw that, the more effort you put to avoid instability, the more option
-you deny. And even most restrictive work flow can't guarantee that instability
-will never show up!
-
-Obsolete marker can handle the job
-```````````````````````````````````
-
-It is time to provide a full featured solution to deal with
-instability and to stop working around the issue! This is why I
-developing a new feature for mercurial called "Obsolete markers".
-Obsolete markers have two key properties:
-
-
-* Any "old" changeset we want to get ride of is **explicitly** marked
-  as "obsolete" by history rewriting operation.
-
-  By explicitly marking the obsolete part of the history, we will be able to
-  easily detect instability situation.
-
-* Relations between old and new version of changesets are tracked by obsolete
-  markers.
-
-  By Storing a meta-history of changeset evolution we are able to easily resolve
-  instability and edition conflict [#]_ .
-
-.. [#] edition conflict is another major obstable to collaboration. See the
-       section dedicated to obsolete marker for details.
-
-Improves robustness == improves simplicity
-````````````````````````````````````````````````
-
-This proposal should **first** be seen as a safety measure.
-
-It allow to detect instability as soon as possible
-
-::
-
-    $ hg pull
-    added 3 changeset
-    +2 unstable changeset
-    (do you want "hg stabilize" ?)
-    working directory parent is obsolete!
-    $ hg push
-    outgoing unstable changesets
-    (use "hg stabilize" or force the push)
-
-And should not not encourage people to create instability
-
-::
-
-    $ hg up 42
-    $ hg commit --amend
-    changeset have descendant.
-    $ hg commit --amend -f
-    +5 unstable changeset
-
-    $ hg rebase -D --rev 40::44
-    rebasing already obsolete changeset 42:AAA will conflict with newer version 48:BBB
-
-While allowing powerful feature
-````````````````````````````````````````````````
-
-
-* Help to automatically solve instability.
-
-* "prune" changeset remotely.
-
-* track resulting changeset when submitting patch//pull request.
-
-* Focus on what you do:
-
-  I do not like the "all at once" model of history rewriting. I'm comfortable
-  with instability and obsolete marker offer all the tool to safely create and
-  handle instability locally.
-
-
--- a/docs/makefile
+++ b/docs/makefile
@@ -1,6 +1,11 @@
 
-all: tutorial
+all: tutorials/tutorial.rst static/logo-evolve.ico
 	sphinx-build . ../html/
 
-tutorial:
+tutorials/tutorial.rst: tutorials/tutorial.t
 	python test2rst.py tutorials/
+
+static/logo-evolve.ico: static/logo-evolve.svg
+	convert -resize 36x36 static/logo-evolve.svg static/logo-evolve.ico
+
+
deleted file mode 100644
--- a/docs/obs-concept.rst
+++ /dev/null
@@ -1,393 +0,0 @@
------------------------------------------------------------
-Why Do We Need a New Concept
------------------------------------------------------------
-
-Current DVCSes are great tools for forging a series of flawless
-changesets on your own. But they perform poorly when it comes to
-**sharing** some work in progress and **collaborating** on such work
-in progress.
-
-When people forge a new version of a changeset they actually create a
-new changeset and get rid of the original changeset. Difficulties to
-collaborate mostly came from the way old content is *removed* from
-a repository.
-
-Mercurial Approach: Strip
------------------------------------------------------
-
-With the current version of mercurial, every changeset that exists in
-your repository is *visible* and *meaningful*. To delete old
-(rewritten) changesets, mercurial removes them from the repository
-storage with an operation called *strip*. After the *stripping*, the
-repository looks as if the changeset never existed.
-
-This approach is simple and effective except for one big
-drawback: you can remove changesets from **your repository only**. If
-a stripped changeset exists in another repository it touches, it will
-show up again. This is because a shared changeset becomes
-part of a shared global history. Stripping a changeset from all
-repositories is at best impractical and in most case impossible.
-
-As consequence, **you can not rewrite something once you exchange it with
-others**. The old version will still exist along side the new one [#]_.
-
-Moreover stripping changesets creates backup bundles. This allows
-restoration of the deleted changesets, but the process is painful.
-
-Finally, as the repository format is not optimized for deletion. stripping a
-changeset may be slow in some situations.
-
-To sum up, the strip approach is very simple but does not handle
-interaction with the outer world, which is very unfortunate for a
-*Distributed* VCS.
-
-.. [#] various work around exists but they require their own workflows
-   which are distinct from the very elegant basic workflow of
-   Mercurial.
-
-Git Approach: Overwrite Reference
------------------------------------------------------
-
-The Git approach to repository structure is a bit more complex: there
-can be any amount of unrelated changesets in a repository, and **only
-changesets referenced by a git branch** are *visible* and
-*meaningful*.
-
-
-.. warning:: add a schema::
-
-        C
-        | B---<foo>
-        |/
-        |
-        A
-
-    Only B and A are visible.
-
-This simplifies the process of getting rid of old changesets. You can
-just leave them in place and move the reference on the new one. You
-can then propagate this change by moving the git-branch on remote host
-with the newer version of the marker overwriting the older one.
-
-This approach goes a bit further but still has a major drawback:
-
-Because you **overwrite** the git-branch, you have no conflict
-resolution. The last to act wins. This makes collaboration on multiple
-changesets difficult because you can't merge concurrent updates on a
-changeset.
-
-Every overwrite is a forced operation where the operator says, "yes I
-want this to replace that". In highly distributed environments, a user
-may end up with conflicting references and no proper way to choose.
-
-Because of this way to visualize a repository, git-branches are a core
-part of git, which makes the user interface more complicated and
-constrains moving through history.
-
-Finally, even if all older changesets still exist in the repository,
-accesing them is still painful.
-
-
------------------------------------------------------
-The Obsolete Marker Concept
------------------------------------------------------
-
-
-As none of the concepts was powerful enough to fulfill the need of
-safely rewriting history, including easy sharing and collaboration on
-mutable history, we needed another one.
-
-Basic concept
------------------------------------------------------
-
-
-Every history rewriting operation stores the information that old rewritten
-changeset is replaced by newer version in a given set of changesets.
-
-All basic history rewriting operation can create an appropriate obsolete marker.
-
-
-.. figure:: ./figures/example-1-update.*
-
-    *Updating* a changeset
-
-    Create one obsolete marker: ``([A'] obsolete A)``
-
-
-
-.. figure:: ./figures/example-2-split.*
-
-    *Splitting* a changeset in multiple one
-
-    Create one obsolete marker ``([B1, B2] obsolete B)]``
-
-
-.. figure:: ./figures/simple-3-merge.*
-
-    *Merging* multiple changeset in a single one
-
-    Create two obsolete markers ``([C] obsolete A), ([C] obsolete B)``
-
-.. figure:: ./figures/simple-4-reorder.*
-
-    *Moving* changeset around
-
-    Reordering those two changesets need two obsolete markers:
-    ``([A'] obsolete A), ([B'] obsolete B)``
-
-
-
-.. figure:: ./figures/simple-5-delete.*
-
-    *Removing* a changeset:
-
-    One obselete marker ``([] obsolete B)``
-
-
-To conclude, a single obsolete marker express a relation from **0..n** new
-changesets to **1** old changeset.
-
-Basic Usage
------------------------------------------------------
-
-Obsolete markers create a perpendicular history: **a versioned
-changeset graph**. This means that offers the same features we have
-for versioned files but applied to changeset:
-
-First: we can display a **coherent view** of the history graph in which only a
-single version of your changesets is displayed by the UI.
-
-Second, because obsolete changeset content is still **available**. You can 
-you can
-
-    * **browse** the content of your obsolete commits,
-
-    * **compare** newer and older versions of a changeset,
-
-    * **restore** content of previously obsolete changesets.
-
-Finally, the obsolete marker can be **exchanged between
-repositories**. You are able to share the result on your history
-rewriting operations with other prople and **collaborate on the
-mutable part of the history**.
-
-Conflicting history rewriting operation can be detected and
-**resolved** as easily as conflicting changes on a file.
-
-
-Detecting and solving tricky situations
------------------------------------------------------
-
-History rewriting can lead to complex situations. The obsolete marker
-introduces a simple representation for this complex reality. But
-people using complex workflows will one day or another have to face
-the intrinsic complexity of some real-world situation.
-
-This section describes possible situations, defines precise sets of
-changesets involved in such situations and explains how the error
-cases can be resolved automatically using the available information.
-
-
-Obsolete changesets
-````````````````````
-
-Old changesets left behind by obsolete operation are called **obsolete**.
-
-With the current version of mercurial, this *obsolete* part is stripped from the
-repository before the end of every rewriting operation.
-
-.. figure:: ./figures/error-obsolete.*
-
-    Rebasing `B` and `C` on `A` (as `B'`, `C'`)
-
-    This rebase operation added two obsolete markers from new
-    changesets to old changesets. These two old changesets are now
-    part of the *obsolete* part of the history.
-
-In most cases, the obsolete set will be fully hidden to both the UI and
-discovery, hence users do not have to care about them unless they want to
-audit history rewriting operations.
-
-Unstable changesets
-```````````````````
-
-While exploring the possibilities of the obsolete marker a bit
-further, you may end up with *obsolete* changesets which have
-*non-obsolete* children. There is two common ways to achieve this:
-
-* Pull a changeset based of an old version of a changeset [#]_.
-
-* Use a partial rewriting operation. For example amend on a changeset with
-  children.
-
-*Non-obsolete* changeset based on *obsolete* one are called **unstable**
-
-.. figure:: ./figures/error-unstable.*
-
-    Amend `A` into `A'` leaving `B` behind.
-
-    In this situation we cannot consider `B` as *obsolete*. But we
-    have all the necessary data to detect `B` as an *unstable* branch
-    of the history because its parent `A` is *obsolete*. In addition,
-    we have enough data to automatically resolve this instability: we
-    know that the new version of `B` parent (`A`) is `A'`. We can
-    deduce that we should rebase `B` on `A'` to get a stable history
-    again.
-
-Proper warnings should be issued when part of the history becomes
-unstable. The UI will be able to use the obsolete marker to
-automatically suggest a resolution to the user of even carry them out
-for them.
-
-
-XXX details on automatic resolution for
-
-* movement
-
-* handling deletion
-
-* handling split on multiple head
-
-
-.. [#] For this to happen one needs to explicitly enable exchange of draft
-       changesets. See phase help for details.
-
-The two parts of the obsolete set
-``````````````````````````````````````
-
-The previous section shows that there could be two kinds of *obsolete*
-changesets:
-
-* an *obsolete* changeset with no or *obsolete* only descendants is called **extinct**.
-
-* an *obsolete* changeset with *unstable* descendants is called **suspended**.
-
-
-.. figure:: ./figures/error-extinct.*
-
-    Amend `A` and `C` leaving `B` behind.
-
-    In this example we have two *obsolete* changesets: `C` with no *unstable*
-    children is *extinct*. `A` with *unstable* descendant (`B`) is *suspended*.
-    `B` is *unstable* as before.
-
-
-Because nothing outside the obsolete set default on *extinct*
-changesets, they can be safely hidden in the UI and even garbage
-collected. *Suspended* changesets have to stay visible and available
-until their unstable descendant are rewritten into stable version.
-
-
-Conflicting rewrites
-````````````````````
-
-If people start to concurrently edit the same part of the history they will
-likely meet conflicting situations when a changeset has been rewritten in two
-different ways.
-
-
-.. figure:: ./figures/error-conflicting.*
-
-    Conflicting rewrite of `A` into `A'` and `A''`
-
-This kind of conflict is easy to detect with an obsolete marker
-because an obsolete changeset can have more than one new version. It
-may be seen as the multiple heads case. Mercurial warns you about this
-on pull. It is resolved the same way by a merge of A' and A'' that
-will keep the same parent than `A'` and `A''` with two obsolete
-markers pointing to both `A` and `A'`
-
-.. warning::  TODO: Add a schema of the resolution. (merge A' and A'' with A as
-              ancestor and graft the result of A^)
-
-Allowing multiple new changesets to obsolete a single one allows to
-distinguish a split changeset from a history rewriting conflict.
-
-Reliable history
-``````````````````````
-
-Obsolete markers help to smooth rewriting operation process. However
-they do not change the fact that **you should only rewrite the mutable
-part of the history**. The phase concept enforces this rule by
-explicitly defining a public immutable set of changesets. Rewriting
-operations refuse to work on public changesets, but there are still
-some corner cases where previously rewritten changesets are made
-public.
-
-Special rules apply for obsolete markers pointing to public changesets:
-
-* Public changesets are excluded from the obsolete set (public
-  changesets are never hidden or candidate to garbage collection)
-
-* *newer* version of a public changeset are called **latecomer** and
-  highlighted as an error case.
-
-Solving such an error is easy. Because we know what changeset a
-*latecomer* tries to rewrite, we can easily compute a smaller
-changeset containing only the change from the old *public* to the new
-*latecomer*.
-
-.. warning:: add a schema
-
-
-Conclusion
-----------------
-
-The obsolete marker is a powerful concept that allows mercurial to safely handle
-history rewriting operations. It is a new type of relation between Mercurial
-changesets which tracks the result of history rewriting operations.
-
-This concept is simple to define and provides a very solid base for:
-
-
-- Very fast history rewriting operations,
-
-- auditable and reversible history rewriting process,
-
-- clean final history,
-
-- sharing and collaborating on the mutable part of the history,
-
-- gracefully handling history rewriting conflicts,
-
-- various history rewriting UI's collaborating with an underlying common API.
-
-.. list-table:: Comparison on solution [#]_
-   :header-rows: 1
-
-   * - Solution
-     - Remove changeset locally
-     - Works on any point of your history
-     - Propagation
-     - Collaboration
-     - Speed
-     - Access to older version
-
-   * - Strip
-     - `+`
-     - `+`
-     - \
-     - \ 
-     - \ 
-     - `- -`
-
-   * - Reference
-     - `+`
-     - \ 
-     - `+`
-     - \ 
-     - `+`
-     - `-`
-
-   * - Obsolete
-     - `+`
-     - `+`
-     - `++`
-     - `++`
-     - `+`
-     - `+`
-
-
-
-.. [#] To preserve good tradition in comparison table, an overwhelming advantage
-       goes to the defended solution.
deleted file mode 100644
--- a/docs/obs-implementation.rst
+++ /dev/null
@@ -1,213 +0,0 @@
-
------------------------------------------------------
-Implementation of Obsolete Marker
------------------------------------------------------
-.. warning:: This document is still in heavy work in progress
-
-Main questions about Obsolete Marker Implementation
------------------------------------------------------
-
-
-What data should be contained in a Marker ?
-````````````````````````````````````````````````````
-
-There are two critical pieces of information that **must** be stored
-in an obsolete Marker.
-
-:object:
-    the old obsoleted changeset
-
-:replacements:
-    list of new changeset. list size can be anything, including 0 (0..N)
-
-Everybody agreed on this point.
-
- ---
-
-This is probably a good idea to have an unique Identifier, for UI, transfer and
-access.
-
-    :id: same as changeset but for marker.
-
-The field below will depend on the way we exchange obsolete marker between
-changesets.
-
- ---
-
-Having audit data will be very useful. When it gets messy you need all the
-information available to understand the situation.
-
-I have the feeling that we are versioning history. Therefor we will probably
-need the same kind of information than when versioning Files.
-
-:date: date of the marker creation
-
-:user: ui.username
-
-To go further:
-
-:description: "Optional reason for the rewrite (generated by the user)"
-
-:tool: the automated tool that made this
-
-:operation: Kind of rewritting operation that created the marker (delete,
-            update, split, fold, reordering), to help conflict resolution.
-
-Matt said this is "too complicated". I'll wait for him to meet a very hairy
-situation to agree that they are needed.
-
-Leaving the door open to any addition data is an option too.
-
-How shall we store Marker on disk
-`````````````````````````````````````````````````````````
-
-Requirement
-.............
-
-We need to quickly load the 'object' to know the "obsolete" set.
-We need quick access by object and replacements to travels along the graph.
-
-Common Part
-.............
-
-The file is store in `.hg/store/obsmarkers`. It is a binary files:
-
-The files starts with a Format Version string
-
-
-Minimalistic proposal
-.........................
-
-The core of a Marker will we stored as:
-
-* number of replacement (8-Bytes integer)
-* node id of the obsolete changeset (20-Bytes hash)
-* node id of replacement changeset (20-Bytes hash x number of remplacement)
-
-Version with ID
-.........................
-
-This version add a node id computed from the marker content. It will be present
-*before* other data:
-
-* node id of the maker (20-Bytes hash)
-
-
-Version with Metadata proposal
-...............................
-
-An extra files is used to old metadata (date, user, etc) `.hg/store/obs-extra`:.
-
-The format of this field is undefined yet. This will add the following
-field at the end of a marker
-
-* offset of the metadata in obs-extra (8-Bytes integer)
-
-
-How shall we exchange Marker over the Wire ?
-`````````````````````````````````````````````````````````
-
-We can have a lot of markers. We do not want to exchange data for the one we
-already know. Listkey() is not very appropriate there as you get everything.
-
-Moreover, we might want to only hear about Marker that impact changeset we are
-pulling.
-
-pushkey is not batchable yet (could be fixed)
-
-A dedicated discovery and exchange protocol seems mandatory here.
-
-
-Various technical details
------------------------------------------------------
-
-Some stuff that worse to note. some may deserve their own section later.
-
-storing old changeset
-``````````````````````
-
-The new general delta format allows a very efficient storage of two very similar
-changesets. Storing obsolete children using general delta takes no more place
-than storing the obsolete diff. Reverted file will even we reused. The whole
-operation will take much less space the strip backup.
-
-
-Abstraction from history rewriting UI
-```````````````````````````````````````````
-
-How Mercurial handles obsolete marker is independent from what decides
-to create them and what actual operation solves the error case. Any of
-the existing history rewriting UI (rebase, mq, histedit) can lay
-obsolete markers and resolve situation created by others. To go
-further, a hook system of obsolete marker creation would allow each
-mechanism to collaborate with other though a standard and central
-mechanism.
-
-
-Obsolete marker storage
-```````````````````````````
-
-The Obsolete marker will most likely be stored outside standard
-history. They are multiple reasons for this:
-
-First, obsolete markers are really perpendicular to standard history
-there is no strong reason to include it here other than convenience.
-
-Second, storing obsolete marker inside standard history means:
-
-* A changeset must be created every time an obsolete relation is added. Very
-  inconvenient for delete operation.
-
-* Obsolete marker must be forged at the creation of the new changeset. This
-  is very inconvenient for split operation. And in general it becomes
-  complicated to fix history afterward in particular when working with older
-  clients.
-
-Storing obsolete marker outside history have several pros:
-
-* It eases Exchange of obsolete markers without unnecessary obsolete
-  changeset contents.
-
-* It allows tuning the actual storage and protocol exchange while maintaining
-  compatibility with older clients through the wire (as we do the repository
-  format).
-
-* It eases the exchange of obsolete related information during
-  discovery to exchange obsolete changeset relevant to conflict
-  resolution. Exchanging such information deserves a dedicated
-  protocol.
-
-Persistent
-```````````````````````
-
-*Extinct* changeset and obsolete marker will most likely be garbage collected as
-some point. However, archive server may decide to keep them forever in order to
-keep a fully auditable history in its finest conception.
-
-
-Current status
------------------------------------------------------
-
-An experimental implementatione exists. What have been done so far.
-
-
-* 1-1 obsolete marker stored outside history,
-
-* compute obsolete-tip
-
-* obsolete marker exchange through pushkey,
-
-* compute obsolete, unstable, extinct and suspended set.
-
-* hidden extinct changesets for UI.
-
-* Use secret phase to remove from discovery obsolete and unstable changesets (to
-  be improved soon)
-
-* alter rebase to use obsolete markers instead of stripping.
-
-* Have an experimental mq-like extension to rewrite history (more on that later)
-
-* Have an extension to update and mq repository according evolution of
-  standard (more on that later)
-
--- a/docs/obs-terms.rst
+++ b/docs/obs-terms.rst
@@ -1,9 +1,12 @@
------------------------------------------------------------
+.. Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
+..                Logilab SA        <contact@logilab.fr>
+
+-----------------------------------
 Terminology of the obsolete concept
------------------------------------------------------------
+-----------------------------------
 
 Obsolete markers
----------------------------------
+----------------
 
 The mutable concept is based on **obsolete markers**. Creating an obsolete
 marker registers a relation between an old obsoleted changeset and its newer
@@ -48,10 +51,10 @@
 **newest successors**..
 
 .. note:: I'm not very happy with this naming scheme and I'm looking for a
-          better distinction between *direct successors* and **any successors*.
+          better distinction between *direct successors* and **any successors**.
 
 Possible changesets "type"
----------------------------------
+--------------------------
 
 The following table describes names and behaviors of changesets affected by
 obsolete markers. The left column describes generic categories and the right
@@ -89,30 +92,30 @@
 |                     |                          |                             |
 |                     +--------------------------+-----------------------------+
 |                     |                          |                             |
-|                     | **troublesome**          | **unstable**                |
+|                     | **troubled**             | **unstable**                |
 |                     |                          |                             |
-|                     | *troublesome* has        | *unstable* is a changeset   |
+|                     | *troubled*    has        | *unstable* is a changeset   |
 |                     | unresolved issue caused  | with obsolete ancestors.    |
 |                     | by *obsolete* relations. |                             |
 |                     |                          |                             |
 |                     | Possible issues are      | It must be rebased on a     |
-|                     | listed in the next       | non *troublesome* base to   |
+|                     | listed in the next       | non *troubled*    base to   |
 |                     | column. It is possible   | solve the problem.          |
-|                     | for *troublesome*        |                             |
+|                     | for *troubled*           |                             |
 |                     | changeset to combine     | (possible alternative name: |
 |                     | multiple issue at once.  | precarious)                 |
-|                     | (a.k.a. conflicting and  |                             |
+|                     | (a.k.a. divergent   and  |                             |
 |                     | unstable)                +-----------------------------+
 |                     |                          |                             |
-|                     | (possible alternative    | **latecomer**               |
+|                     | (possible alternative    | **bumped**                  |
 |                     | names: unsettled,        |                             |
-|                     | troubled)                | *latecomer* is a changeset  |
+|                     | troublesome              | *bumped* is a changeset     |
 |                     |                          | that tries to be successor  |
 |                     |                          | of  public changesets.      |
 |                     |                          |                             |
 |                     |                          | Public changeset can't      |
 |                     |                          | be deleted and replace      |
-|                     |                          | *latecomer*                 |
+|                     |                          | *bumped*                    |
 |                     |                          | need to be converted into   |
 |                     |                          | an overlay to this public   |
 |                     |                          | changeset.                  |
@@ -122,17 +125,17 @@
 |                     |                          | mindless, disenchanting)    |
 |                     |                          |                             |
 |                     |                          +-----------------------------+
-|                     |                          | **conflicting**             |
+|                     |                          | **divergent**               |
 |                     |                          |                             |
-|                     |                          | *conflicting* is changeset  |
+|                     |                          | *divergent*   is changeset  |
 |                     |                          | that appears when multiple  |
 |                     |                          | changesets are successors   |
 |                     |                          | of the same precursor.      |
 |                     |                          |                             |
-|                     |                          | *conflicting* are solved    |
+|                     |                          | *divergent*   are solved    |
 |                     |                          | through a three ways merge  |
 |                     |                          | between the two             |
-|                     |                          | *conflictings*,             |
+|                     |                          | *divergent*   ,             |
 |                     |                          | using the last "obsolete-   |
 |                     |                          | -common-ancestor" as the    |
 |                     |                          | base.                       |
@@ -141,10 +144,14 @@
 |                     |                          | properly not detected as a  |
 |                     |                          | conflict)                   |
 |                     |                          |                             |
+|                     |                          | (possible alternative names:|
+|                     |                          | clashing, rival, concurent, |
+|                     |                          | conflicting)                |
+|                     |                          |                             |
 |                     +--------------------------+-----------------------------+
 |                     |                                                        |
 |                     | Mutable changesets which are neither *obsolete* or     |
-|                     | *troublesome* are *"ok"*.                              |
+|                     | *troubled*    are *"ok"*.                              |
 |                     |                                                        |
 |                     | Do we really need a name for it ? *"ok"* is a pretty   |
 |                     | crappy name :-/ other possibilities are:               |
@@ -172,17 +179,10 @@
 |                                                                              |
 +------------------------------------------------------------------------------+
 
-.. note:: I'm not very happy with the naming of:
-
-          - "ok" changeset
-          - latecomer
-          - troublesome
-
-          Any better idea are welcome.
 
 
 Command and operation name
----------------------------------
+--------------------------
 
 
 Existing terms
@@ -196,7 +196,7 @@
 
 
 Uncommit
-`````````````
+````````
 
 Remove files from a commit (and leave them as dirty in the working directory)
 
@@ -204,14 +204,14 @@
 `rollback` usage.
 
 Fold
-``````````
+````
 
 Collapse multiple changesets into a unique one.
 
 The *evolve* extension will have a `fold` command.
 
 Prune
-``````````
+`````
 
 Make a changeset obsolete without successors.
 
@@ -222,18 +222,16 @@
 - kill: shall has funny effects when you forget "hg" in front of ``hg kill``.
 - obsolete: too vague, too long and too generic.
 
-Stabilize
-```````````````
+evolve
+``````
 
 Automatically resolve *troublesome* changesets
-(*unstable*, *latecomer* and *conflicting*)
+(*unstable*, *bumped* and *divergent*)
 
 This is an important name as hg pull/push will suggest it the same way it
 suggest merging when you add heads.
 
-I do not like stabilize much.
-
 alternative names:
 
 - solve (too generic ?)
-- evolve (too vague)
+- stabilize
deleted file mode 100644
--- a/docs/qsync.rst
+++ /dev/null
@@ -1,16 +0,0 @@
----------------------------------------------------------------------
-Qsync: Mercurial to MQ exporter
----------------------------------------------------------------------
-
-
-People may have tools or co-workers that export to receive mutable history using
-a versioned mq repository.
-
-For this purpose you can use the ``qsync`` extension:
-
-
-To enable the evolve extension use::
-
-    $ hg clone http://hg-dev.octopoid.net/hgwebdir.cgi/mutable-history/
-    $ mutable-history/iqsync-enable.sh >> ~/.hgrc
-    $ hg help qsync
new file mode 100644
--- /dev/null
+++ b/docs/sharing.rst
@@ -0,0 +1,735 @@
+.. Copyright © 2014 Greg Ward <greg@gerg.ca>
+
+------------------------------
+Evolve: Shared Mutable History
+------------------------------
+
+.. contents::
+
+Once you have mastered the art of mutable history in a single
+repository (see the `user guide`_), you can move up to the next level:
+*shared* mutable history. ``evolve`` lets you push and pull draft
+changesets between repositories along with their obsolescence markers.
+This opens up a number of interesting possibilities.
+
+.. _`user guide`: user-guide.html
+
+The simplest scenario is a single developer working across two
+computers. Say you're working on code that must be tested on a remote
+test server, probably in a rack somewhere, only accessible by SSH, and
+running an “enterprise-grade” (out-of-date) OS. But you probably
+prefer to write code locally: everything is setup the way you like it,
+and you can use your preferred editor, IDE, merge/diff tools, etc.
+
+Traditionally, your options are limited: either
+
+  * (ab)use your source control system by committing half-working code
+    in order to get it onto the remote test server, or
+  * go behind source control's back by using ``rsync`` (or similar) to
+    transfer your code back-and-forth until it is ready to commit
+
+The former is less bad with distributed version control systems like
+Mercurial, but it's still far from ideal. (One important version
+control “best practice” is that every commit should make things just a
+little bit better, i.e. you should never commit code that is worse
+than what came before.) The latter, avoiding version control entirely,
+means that you're walking a tightrope without a safety net. One
+accidental ``rsync`` in the wrong direction could destroy hours of
+work.
+
+Using Mercurial with ``evolve`` to share mutable history solves these
+problems. As with single-repository ``evolve``, you can commit
+whenever the code is demonstrably better, even if all the tests aren't
+passing yet—just ``hg amend`` when they are. And you can transfer
+those half-baked changesets between repositories to try things out on
+your test server before anything is carved in stone.
+
+A less common scenario is multiple developers sharing mutable history,
+typically for code review. We'll cover this scenario later. But first,
+single-user sharing.
+
+Sharing with a single developer
+-------------------------------
+
+Publishing and non-publishing repositories
+==========================================
+
+The key to shared mutable history is to keep your changesets in
+*draft* phase as you pass them around. Recall that by default, ``hg
+push`` promotes changesets from *draft* to *public*, and public
+changesets are immutable. You can change this behaviour by
+reconfiguring the *target* repository so that it is non-publishing.
+(Short version: set ``phases.publish`` to ``false``. Long version
+follows.)
+
+Setting up
+==========
+
+We'll work through an example with three local repositories, although
+in the real world they'd most likely be on three different computers.
+First, the ``public`` repository is where tested, polished changesets
+live, and it is where you synchronize with the rest of your team. ::
+
+  $ hg init public
+
+We'll need two clones where work gets done, ``test-repo`` and
+``dev-repo``::
+
+  $ hg clone public test-repo
+  updating to branch default
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg clone test-repo dev-repo
+  updating to branch default
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+``dev-repo`` is your local machine, with GUI merge tools and IDEs and
+everything configured just the way you like it. ``test-repo`` is the
+test server in a rack somewhere behind SSH. So for the most part,
+we'll develop in ``dev-repo``, push to ``test-repo``, test and polish
+there, and push to ``public``.
+
+The key to shared mutable history is to make the target repository, in
+this case ``test-repo``, non-publishing. And, of course, we have to
+enable ``evolve`` in both ``test-repo`` and ``dev-repo``.
+
+First, edit the configuration for ``test-repo``::
+
+  $ hg -R test-repo config --edit --local
+
+and add ::
+
+  [phases]
+  publish = false
+
+  [extensions]
+  evolve = /path/to/mutable-history/hgext/evolve.py
+
+Then edit the configuration for ``dev-repo``::
+
+  $ hg -R dev-repo config --edit --local
+
+and add ::
+
+  [extensions]
+  evolve = /path/to/mutable-history/hgext/evolve.py
+
+Keep in mind that in real life, these repositories would probably be
+on separate computers, so you'd have to login to each one to configure
+each repository.
+
+To start things off, let's make one public, immutable changeset::
+
+  $ cd test-repo
+  $ echo 'my new project' > file1
+  $ hg add file1
+  $ hg commit -m 'create new project'
+  $ hg push
+  [...]
+  added 1 changesets with 1 changes to 1 files
+
+and pull that into the development repository::
+
+  $ cd ../dev-repo
+  $ hg pull -u
+  [...]
+  added 1 changesets with 1 changes to 1 files
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Example 1: Amend a shared changeset
+===================================
+
+Everything you learned in the `user guide`_ applies to work done in
+``dev-repo``. You can commit, amend, uncommit, evolve, and so forth
+just as before.
+
+.. _`user guide`: user-guide.html
+
+Things get different when you push changesets to ``test-repo``. Or
+rather, things stay the same, which *is* different: because we
+configured ``test-repo`` to be non-publishing, draft changesets stay
+draft when we push them to ``test-repo``. Importantly, they're also
+draft (mutable) in ``test-repo``.
+
+Let's commit a preliminary change and push it to ``test-repo`` for
+testing. ::
+
+  $ echo 'fix fix fix' > file1
+  $ hg commit -m 'prelim change'
+  $ hg push ../test-repo
+
+At this point, ``dev-repo`` and ``test-repo`` have the same changesets
+in the same phases:
+
+  [figure SG01: rev 0:0dc9 public, rev 1:f649 draft, same on both repos]
+
+(You may notice a change in notation from the user guide: now
+changesets are labelled with their revision number and the first four
+digits of the 40-digit hexadecimal changeset ID. Mercurial revision
+numbers are never stable when working across repositories, especially
+when obsolescence is involved. We'll see why shortly.)
+
+Now let's switch to ``test-repo`` to test our change::
+
+  $ cd ../test-repo
+  $ hg update
+
+Don't forget to ``hg update``! Pushing only adds changesets to a
+remote repository; it does not update the working directory (unless
+you have a hook that updates for you).
+
+Now let's imagine the tests failed because we didn't use proper
+punctuation and capitalization (oops). Let's amend our preliminary fix
+(and fix the lame commit message while we're at it)::
+
+  $ echo 'Fix fix fix.' > file1
+  $ hg amend -m 'fix bug 37'
+
+Now we're in a funny intermediate state (figure 2): revision 1:f649 is
+obsolete in ``test-repo``, having been replaced by revision 3:60ff
+(revision 2:2a03 is another one of those temporary amend commits that
+we saw in the user guide)—but ``dev-repo`` knows nothing of these
+recent developments.
+
+  [figure SG02: test-repo has rev 0:0dc9 public, rev 1:f649, 2:2a03 obsolete, rev 3:60ff draft; dev-repo same as in SG01]
+
+Let's resynchronize::
+
+  $ cd ../dev-repo
+  $ hg pull -u
+  [...]
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+As seen in figure 3, this transfers the new changeset *and* the
+obsolescence marker for revision 1. However, it does *not* transfer
+the temporary amend commit, because it is hidden. Push and pull
+transfer obsolesence markers between repositories, but they do not
+transfer hidden changesets.
+
+  [figure SG03: dev-repo grows new rev 2:60ff, marks 1:f649 obsolete]
+
+Because of this deliberately incomplete synchronization, revision
+numbers in ``test-repo`` and ``dev-repo`` are no longer consistent. We
+*must* use changeset IDs.
+
+Example 2: Amend again, locally
+===============================
+
+This process can repeat. Perhaps you figure out a more elegant fix to
+the bug, and want to mutate history so nobody ever knows you had a
+less-than-perfect idea. We'll implement it locally in ``dev-repo`` and
+push to ``test-repo``::
+
+  $ echo 'Fix, fix, and fix.' > file1
+  $ hg amend
+  $ hg push
+
+This time around, the temporary amend commit is in ``dev-repo``, and
+it is not transferred to ``test-repo``—the same as before, just in the
+opposite direction. Figure 4 shows the two repositories after amending
+in ``dev-repo`` and pushing to ``test-repo``.
+
+  [figure SG04: each repo has one temporary amend commit, but they're different in each one]
+
+Let's hop over to ``test-repo`` to test the more elegant fix::
+
+  $ cd ../test-repo
+  $ hg update
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+This time, all the tests pass, so no further amending is required.
+This bug fix is finished, so we push it to the public repository::
+
+  $ hg push
+  [...]
+  added 1 changesets with 1 changes to 1 files
+
+Note that only one changeset—the final version, after two
+amendments—was actually pushed. Again, Mercurial doesn't transfer
+hidden changesets on push and pull.
+
+.. _`concept guide`: concepts.html
+
+So the picture in ``public`` is much simpler than in either
+``dev-repo`` or ``test-repo``. Neither our missteps nor our amendments
+are publicly visible, just the final, beautifully polished changeset:
+
+  [figure SG05: public repo with rev 0:0dc9, 1:de61, both public]
+
+There is one important step left to do. Because we pushed from
+``test-repo`` to ``public``, the pushed changeset is in *public* phase
+in those two repositories. But ``dev-repo`` has been out-of-the-loop;
+changeset de61 is still *draft* there. If we're not careful, we might
+mutate history in ``dev-repo``, obsoleting a changeset that is already
+public. Let's avoid that situation for now by pushing up to
+``dev-repo``::
+
+  $ hg push ../dev-repo
+  pushing to ../dev-repo
+  searching for changes
+  no changes found
+
+Even though no *changesets* were pushed, Mercurial still pushed
+obsolescence markers and phase changes to ``dev-repo``.
+
+A final note: since this fix is now *public*, it is immutable. It's no
+longer possible to amend it::
+
+  $ hg amend -m 'fix bug 37'
+  abort: cannot amend public changesets
+
+This is, after all, the whole point of Mercurial's phases: to prevent
+rewriting history that has already been published.
+
+Sharing with multiple developers: code review
+---------------------------------------------
+
+Now that you know how to share your own mutable history across
+multiple computers, you might be wondering if it makes sense to share
+mutable history with others. It does, but you have to be careful, stay
+alert, and *communicate* with your peers.
+
+Code review is a good use case for sharing mutable history across
+multiple developers: Alice commits a draft changeset, submits it for
+review, and amends her changeset until her reviewer is satisfied.
+Meanwhile, Bob is also committing draft changesets for review,
+amending until his reviewer is satisfied. Once a particular changeset
+passes review, the respective author (Alice or Bob) pushes it to the
+public (publishing) repository.
+
+Incidentally, the reviewers here can be anyone: maybe Bob and Alice
+review each other's work; maybe the same third party reviews both; or
+maybe they pick different experts to review their work on different
+parts of a large codebase. Similarly, it doesn't matter if reviews are
+conducted in person, by email, or by carrier pigeon. Code review is
+outside of the scope of Mercurial, so all we're looking at here
+is the mechanics of committing, amending, pushing, and pulling.
+
+Setting up
+==========
+
+To demonstrate, let's start with the ``public`` repository as we left
+it in the last example, with two immutable changesets (figure 5
+above). We'll clone a ``review`` repository from it, and then Alice
+and Bob will both clone from ``review``. ::
+
+  $ hg clone public review
+  updating to branch default
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg clone review alice
+  updating to branch default
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg clone review bob
+  updating to branch default
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+We need to configure Alice's and Bob's working repositories to enable
+``evolve``. First, edit Alice's configuration with ::
+
+  $ hg -R alice config --edit --local
+
+and add ::
+
+  [extensions]
+  evolve = /path/to/mutable-history/hgext/evolve.py
+
+Then edit Bob's repository configuration::
+
+  $ hg -R bob config --edit --local
+
+and add the same text.
+
+Example 3: Alice commits and amends a draft fix
+===============================================
+
+We'll follow Alice working on a bug fix. We're going to use bookmarks to
+make it easier to understand multiple branch heads in the ``review``
+repository, so Alice starts off by creating a bookmark and committing
+her first attempt at a fix::
+
+  $ hg bookmark bug15
+  $ echo 'fix' > file2
+  $ hg commit -A -u alice -m 'fix bug 15 (v1)'
+  adding file2
+
+Note the unorthodox "(v1)" in the commit message. We're just using
+that to make this tutorial easier to follow; it's not something we'd
+recommend in real life.
+
+Of course Alice wouldn't commit unless her fix worked to her
+satisfaction, so it must be time to solicit a code review. She does
+this by pushing to the ``review`` repository::
+
+  $ hg push -B bug15
+  [...]
+  added 1 changesets with 1 changes to 1 files
+  exporting bookmark bug15
+
+(The use of ``-B`` is important to ensure that we only push the
+bookmarked head, and that the bookmark itself is pushed. See this
+`guide to bookmarks`_, especially the `Sharing Bookmarks`_ section, if
+you're not familiar with bookmarks.)
+
+.. _`guide to bookmarks`: http://mercurial.aragost.com/kick-start/en/bookmarks/
+.. _`Sharing Bookmarks`: http://mercurial.aragost.com/kick-start/en/bookmarks/#sharing-bookmarks
+
+Some time passes, and Alice receives her code review. As a result,
+Alice revises her fix and submits it for a second review::
+
+  $ echo 'Fix.' > file2
+  $ hg amend -m 'fix bug 15 (v2)'
+  $ hg push
+  [...]
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  updating bookmark bug15
+
+Figure 6 shows the state of the ``review`` repository at this point.
+
+  [figure SG06: rev 2:fn1e is Alice's obsolete v1, rev 3:cbdf is her v2; both children of rev 1:de61]
+
+After a busy morning of bug fixing, Alice stops for lunch. Let's see
+what Bob has been up to.
+
+Example 4: Bob implements and publishes a new feature
+=====================================================
+
+Meanwhile, Bob has been working on a new feature. Like Alice, he'll
+use a bookmark to track his work, and he'll push that bookmark to the
+``review`` repository, so that reviewers know which changesets to
+review. ::
+
+  $ cd ../bob
+  $ echo 'stuff' > file1
+  $ hg bookmark featureX
+  $ hg commit -u bob -m 'implement feature X (v1)'          # rev 4:1636
+  $ hg push -B featureX
+  [...]
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  exporting bookmark featureX
+
+When Bob receives his code review, he improves his implementation a
+bit, amends, and submits the resulting changeset for review::
+
+  $ echo 'do stuff' > file1
+  $ hg amend -m 'implement feature X (v2)'                  # rev 5:0eb7
+  $ hg push
+  [...]
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  updating bookmark featureX
+
+Unfortunately, that still doesn't pass muster. Bob's reviewer insists
+on proper capitalization and punctuation. ::
+
+  $ echo 'Do stuff.' > file1
+  $ hg amend -m 'implement feature X (v3)'                  # rev 6:540b
+
+On the bright side, the second review said, "Go ahead and publish once
+you fix that." So Bob immediately publishes his third attempt::
+
+  $ hg push ../public
+  [...]
+  added 1 changesets with 1 changes to 1 files
+
+It's not enough just to update ``public``, though! Other people also
+use the ``review`` repository, and right now it doesn't have Bob's
+latest amendment ("v3", revision 6:540b), nor does it know that the
+precursor of that changeset ("v2", revision 5:0eb7) is obsolete. Thus,
+Bob pushes to ``review`` as well::
+
+  $ hg push ../review
+  [...]
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  updating bookmark featureX
+
+Figure 7 shows the result of Bob's work in both ``review`` and
+``public``.
+
+  [figure SG07: review includes Alice's draft work on bug 15, as well as Bob's v1, v2, and v3 changes for feature X: v1 and v2 obsolete, v3 public. public contains only the final, public implementation of feature X]
+
+Incidentally, it's important that Bob push to ``public`` *before*
+``review``. If he pushed to ``review`` first, then revision 6:540b
+would still be in *draft* phase in ``review``, but it would be
+*public* in both Bob's local repository and the ``public`` repository.
+That could lead to confusion at some point, which is easily avoided by
+pushing first to ``public``.
+
+Example 5: Alice integrates and publishes
+=========================================
+
+Finally, Alice gets back from lunch and sees that the carrier pigeon
+with her second review has arrived (or maybe it's in her email inbox).
+Alice's reviewer approved her amended changeset, so she pushes it to
+``public``::
+
+  $ hg push ../public
+  [...]
+  remote has heads on branch 'default' that are not known locally: 540ba8f317e6
+  abort: push creates new remote head cbdfbd5a5db2!
+  (pull and merge or see "hg help push" for details about pushing new heads)
+
+Oops! Bob has won the race to push first to ``public``. So Alice needs
+to integrate with Bob: let's pull his changeset(s) and see what the
+branch heads are. ::
+
+  $ hg pull ../public
+  [...]
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  (run 'hg heads' to see heads, 'hg merge' to merge)
+  $ hg log -G -q -r 'head()' --template '{rev}:{node|short}  ({author})\n'
+  o  5:540ba8f317e6  (bob)
+  |
+  | @  4:cbdfbd5a5db2  (alice)
+  |/
+
+We'll assume Alice and Bob are perfectly comfortable with rebasing
+changesets. (After all, they're already using mutable history in the
+form of ``amend``.) So Alice rebases her changeset on top of Bob's and
+publishes the result::
+
+  $ hg rebase -d 5
+  $ hg push ../public
+  [...]
+  added 1 changesets with 1 changes to 1 files
+  $ hg push ../review
+  [...]
+  added 1 changesets with 0 changes to 0 files
+  updating bookmark bug15
+
+The result, in both ``review`` and ``public`` repositories, is shown
+in figure 8.
+
+  [figure SG08: review shows v1 and v2 of Alice's fix, then v1, v2, v3 of Bob's feature, finally Alice's fix rebased onto Bob's. public just shows the final public version of each changeset]
+
+Getting into trouble with shared mutable history
+------------------------------------------------
+
+Mercurial with ``evolve`` is a powerful tool, and using powerful tools
+can have consequences. (You can cut yourself badly with a sharp knife,
+but every competent chef keeps several around. Ever try to chop onions
+with a spoon?)
+
+In the user guide, we saw examples of *unstable* changesets, which are
+the most common type of troubled changeset. (Recall that a
+non-obsolete changeset with obsolete ancestors is unstable.)
+
+Two other types of trouble can happen: *divergent* and *bumped*
+changesets. Both are more likely with shared mutable history,
+especially mutable history shared by multiple developers.
+
+Setting up
+==========
+
+For these examples, we're going to use a slightly different workflow:
+as before, Alice and Bob share a ``public`` repository. But this time
+there is no ``review`` repository. Instead, Alice and Bob put on their
+cowboy hats, throw good practice to the wind, and pull directly from
+each other's working repositories.
+
+So we throw away everything except ``public`` and reclone::
+
+  $ rm -rf review alice bob
+  $ hg clone public alice
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg clone public bob
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Once again we have to configure their repositories: enable ``evolve``
+and (since Alice and Bob will be pulling directly from each other)
+make their repositories non-publishing. Edit Alice's configuration::
+
+  $ hg -R alice config --edit --local
+
+and add ::
+
+  [extensions]
+  rebase =
+  evolve = /path/to/mutable-history/hgext/evolve.py
+
+  [phases]
+  publish = false
+
+Then edit Bob's repository configuration::
+
+  $ hg -R bob config --edit --local
+
+and add the same text.
+
+Example 6: Divergent changesets
+===============================
+
+When an obsolete changeset has two successors, those successors are
+*divergent*. One way to get into such a situation is by failing to
+communicate with your teammates. Let's see how that might happen.
+
+First, we'll have Bob commit a bug fix that could still be improved::
+
+  $ cd bob
+  $ echo 'pretty good fix' >> file1
+  $ hg commit -u bob -m 'fix bug 24 (v1)'                   # rev 4:2fe6
+
+Since Alice and Bob are now in cowboy mode, Alice pulls Bob's draft
+changeset and amends it herself. ::
+
+  $ cd ../alice
+  $ hg pull -u ../bob
+  [...]
+  added 1 changesets with 1 changes to 1 files
+  $ echo 'better fix (alice)' >> file1
+  $ hg amend -u alice -m 'fix bug 24 (v2 by alice)'
+
+But Bob has no idea that Alice just did this. (See how important good
+communication is?) So he implements a better fix of his own::
+
+  $ cd ../bob
+  $ echo 'better fix (bob)' >> file1
+  $ hg amend -u bob -m 'fix bug 24 (v2 by bob)'             # rev 6:a360
+
+At this point, the divergence exists, but only in theory: Bob's
+original changeset, 4:2fe6, is obsolete and has two successors. But
+those successors are in different repositories, so the trouble is not
+visible to anyone yet. It will be as soon as Bob pulls from Alice's
+repository (or vice-versa). ::
+
+  $ hg pull ../alice
+  [...]
+  added 1 changesets with 1 changes to 2 files (+1 heads)
+  (run 'hg heads' to see heads, 'hg merge' to merge)
+  2 new divergent changesets
+
+Figure 9 shows the situation in Bob's repository.
+
+  [figure SG09: Bob's repo with 2 heads for the 2 divergent changesets, 6:a360 and 7:e3f9; wc is at 6:a360; both are successors of obsolete 4:2fe6, hence divergence]
+
+Now we need to get out of trouble. As usual, the answer is to evolve
+history. ::
+
+  $ HGMERGE=internal:other hg evolve
+  merge:[6] fix bug 24 (v2 by bob)
+  with: [7] fix bug 24 (v2 by alice)
+  base: [4] fix bug 24 (v1)
+  0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+
+Figure 10 shows how Bob's repository looks now.
+
+  [figure SG10: only one visible head, 9:5ad6, successor to hidden 6:a360 and 7:e3f9]
+
+We carefully dodged a merge conflict by specifying a merge tool
+(``internal:other``) that will take Alice's changes over Bob's. (You
+might wonder why Bob wouldn't prefer his own changes by using
+``internal:local``. He's avoiding a `bug`_ in ``evolve`` that occurs
+when evolving divergent changesets using ``internal:local``.)
+
+.. _`bug`: https://bitbucket.org/marmoute/mutable-history/issue/48/
+
+** STOP HERE: WORK IN PROGRESS **
+
+Bumped changesets: only one gets on the plane
+=============================================
+
+If two people show up at the airport with tickets for the same seat on
+the same plane, only one of them gets on the plane. The would-be
+traveller left behind in the airport terminal is said to have been
+*bumped*.
+
+Similarly, if Alice and Bob are collaborating on some mutable
+changesets, it's possible to get into a situation where an otherwise
+worthwhile changeset cannot be pushed to the public repository; it is
+bumped by an alternative changeset that happened to get there first.
+Let's demonstrate one way this could happen.
+
+It starts with Alice committing a bug fix. Right now, we don't yet
+know if this bug fix is good enough to push to the public repository,
+but it's good enough for Alice to commit. ::
+
+  $ cd alice
+  $ echo 'fix' > file2
+  $ hg commit -A -m 'fix bug 15'
+  adding file2
+
+Now Bob has a bad idea: he decides to pull whatever Alice is working
+on and tweak her bug fix to his taste::
+
+  $ cd ../bob
+  $ hg pull -u ../alice
+  [...]
+  added 1 changesets with 1 changes to 1 files
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ echo 'Fix.' > file2
+  $ hg amend -A -m 'fix bug 15 (amended)'
+
+(Note the lack of communication between Alice and Bob. Failing to
+communicate with your colleagues is a good way to get into trouble.
+Nevertheless, ``evolve`` can usually sort things out, as we will see.)
+
+  [figure SG06: Bob's repo with one amendment]
+
+After some testing, Alice realizes her bug fix is just fine as it is:
+no need for further polishing and amending, this changeset is ready to
+publish. ::
+
+  $ cd ../alice
+  $ hg push
+  [...]
+  added 1 changesets with 1 changes to 1 files
+
+This introduces a contradiction: in Bob's repository, changeset 2:e011
+(his copy of Alice's fix) is obsolete, since Bob amended it. But in
+Alice's repository (and ``public``), that changeset is public: it is
+immutable, carved in stone for all eternity. No changeset can be both
+obsolete and public, so Bob is in for a surprise the next time he
+pulls from ``public``::
+
+  $ cd ../bob
+  $ hg pull -q -u
+  1 new bumped changesets
+
+Figure 7 shows what just happened to Bob's repository: changeset
+2:e011 is now public, so it can't be obsolete. When that changeset was
+obsolete, it made perfect sense for it to have a successor, namely
+Bob's amendment of Alice's fix (changeset 4:fe88). But it's illogical
+for a public changeset to have a successor, so 4:fe88 is in trouble:
+it has been *bumped*.
+
+  [figure SG07: 2:e011 now public not obsolete, 4:fe88 now bumped]
+
+As usual when there's trouble in your repository, the solution is to
+evolve it::
+
+  $ hg evolve --all
+
+Figure 8 illustrate's Bob's repository after evolving away the bumped
+changeset. Ignoring the obsolete changesets, Bob now has a nice,
+clean, simple history. His amendment of Alice's bug fix lives on, as
+changeset 5:227d—albeit with a software-generated commit message. (Bob
+should probably amend that changeset to improve the commit message.)
+But the important thing is that his repository no longer has any
+troubled changesets, thanks to ``evolve``.
+
+  [figure SG08: 5:227d is new, formerly bumped changeset 4:fe88 now hidden]
+
+Conclusion
+----------
+
+Mutable history is a powerful tool. Like a sharp knife, an experienced
+user can do wonderful things with it, much more wonderful than with a
+dull knife (never mind a rusty spoon). At the same time, an
+inattentive or careless user can do harm to himself or others.
+Mercurial with ``evolve`` goes to great lengths to limit the harm you
+can do by trying to handle all possible types of “troubled”
+changesets. But having a first-aid kit nearby does not excuse you from
+being careful with sharp knives.
+
+Mutable history shared across multiple repositories by a single
+developer is a natural extension of this model. Once you are used to
+using a single sharp knife on its own, it's pretty straightforward to
+chop onions and mushrooms using the same knife, or to alternate
+between two chopping boards with different knives.
+
+Mutable history shared by multiple developers is a scary place to go.
+Imagine a professional kitchen full of expert chefs tossing their
+favourite knives back and forth, with the occasional axe or chainsaw
+thrown in to spice things up. If you're confident that you *and your
+colleagues* can do it without losing a limb, go for it. But be sure to
+practice a lot first before you rely on it!
new file mode 100644
--- /dev/null
+++ b/docs/static/logo-evolve.svg
@@ -0,0 +1,622 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.0"
+   width="100"
+   height="100"
+   viewBox="0 0 124.766 126.74917"
+   id="Layer_1"
+   xml:space="preserve"
+   sodipodi:version="0.32"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="logo-evolve.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   style="display:inline"><metadata
+   id="metadata6845"><rdf:RDF><cc:Work
+       rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+         rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title><dc:creator><cc:Agent><dc:title>Cali Mastny and Matt Mackall</dc:title></cc:Agent></dc:creator><cc:license
+         rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" /><dc:date>Feb 12 2008</dc:date></cc:Work><cc:License
+       rdf:about="http://creativecommons.org/licenses/GPL/2.0/"><cc:permits
+         rdf:resource="http://web.resource.org/cc/Reproduction" /><cc:permits
+         rdf:resource="http://web.resource.org/cc/Distribution" /><cc:requires
+         rdf:resource="http://web.resource.org/cc/Notice" /><cc:permits
+         rdf:resource="http://web.resource.org/cc/DerivativeWorks" /><cc:requires
+         rdf:resource="http://web.resource.org/cc/ShareAlike" /><cc:requires
+         rdf:resource="http://web.resource.org/cc/SourceCode" /></cc:License></rdf:RDF></metadata><sodipodi:namedview
+   inkscape:window-height="1165"
+   inkscape:window-width="1918"
+   inkscape:pageshadow="2"
+   inkscape:pageopacity="0.0"
+   guidetolerance="10.0"
+   gridtolerance="10.0"
+   objecttolerance="10.0"
+   borderopacity="1.0"
+   bordercolor="#666666"
+   pagecolor="#ffffff"
+   id="base"
+   inkscape:zoom="5.4093668"
+   inkscape:cx="86.89449"
+   inkscape:cy="46.517129"
+   inkscape:window-x="0"
+   inkscape:window-y="0"
+   inkscape:current-layer="Layer_1"
+   width="100px"
+   height="120px"
+   units="px"
+   showgrid="false"
+   inkscape:window-maximized="0"><sodipodi:guide
+     position="0,0"
+     orientation="0,100"
+     id="guide3006" /><sodipodi:guide
+     position="100,0"
+     orientation="-120,0"
+     id="guide3008" /><sodipodi:guide
+     position="-14.419433,100.19657"
+     orientation="0,-100"
+     id="guide3010" /><sodipodi:guide
+     position="0,142.90028"
+     orientation="120,0"
+     id="guide3012" /></sodipodi:namedview><defs
+   id="defs261"><inkscape:perspective
+     sodipodi:type="inkscape:persp3d"
+     inkscape:vp_x="0 : 60 : 1"
+     inkscape:vp_y="0 : 1000 : 0"
+     inkscape:vp_z="100 : 60 : 1"
+     inkscape:persp3d-origin="50 : 40 : 1"
+     id="perspective146" /></defs>
+<pattern
+   overflow="visible"
+   viewBox="2.125 -70.896 69 69"
+   id="Polka_Dot_Pattern"
+   patternUnits="userSpaceOnUse"
+   height="69"
+   width="69"
+   y="736.415"
+   x="-316">
+	<g
+   id="g4">
+		<polygon
+   id="polygon6"
+   points="71.125,-1.896 2.125,-1.896 2.125,-70.896 71.125,-70.896   "
+   fill="none" />
+		<polygon
+   id="polygon8"
+   points="71.125,-1.896 2.125,-1.896 2.125,-70.896 71.125,-70.896   "
+   fill="#F7BC60" />
+		<g
+   id="g10">
+			<path
+   id="path12"
+   d="M61.772-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128     c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161     c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631     c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45     c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221     c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337     c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207     c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169     c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+			<path
+   id="path14"
+   d="M54.105-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128     c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161     c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631     c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45     c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221     c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337     c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207     c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169     c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+			<path
+   id="path16"
+   d="M46.439-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128     c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161     c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631     c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45     c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221     c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337     c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207     c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169     c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+			<path
+   id="path18"
+   d="M38.772-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128     c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161     c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631     c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45     c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221     c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337     c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207     c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169     c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+			<path
+   id="path20"
+   d="M31.105-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128     c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161     c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631     c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45     c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221     c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337     c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207     c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169     c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+			<path
+   id="path22"
+   d="M23.439-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128     c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161     c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631     c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45     c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221     c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337     c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207     c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169     c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+			<path
+   id="path24"
+   d="M15.772-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128     c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161     c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631     c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45     c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221     c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337     c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207     c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169     c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+			<path
+   id="path26"
+   d="M8.105-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128     c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161     c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631     c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45     c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221     c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337     c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207     c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169     c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+			<path
+   id="path28"
+   d="M0.439-71.653c0.018,0.072,0.008,0.127-0.026,0.19C0.361-71.362,0.3-71.4,0.248-71.335     c-0.051,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161     c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631     c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45     c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.07,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221     c0.038-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.051-0.12-0.064-0.187c-0.021-0.114,0.002-0.224,0-0.337     c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207     c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.215,0.124-0.215,0.224c0.002,0.115,0.005,0.051,0.012,0.169     c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+		</g>
+		<g
+   id="g30">
+			<path
+   id="path32"
+   d="M69.439-71.653c0.018,0.072,0.008,0.127-0.026,0.19c-0.052,0.101-0.113,0.062-0.165,0.128     c-0.051,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161     c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631     c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45     c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.07,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221     c0.038-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.051-0.12-0.064-0.187c-0.021-0.114,0.002-0.224,0-0.337     c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207     c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.215,0.124-0.215,0.224c0.002,0.115,0.005,0.051,0.012,0.169     c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+		</g>
+		<path
+   id="path34"
+   d="M0.495-71.653c0.018,0.072,0.008,0.127-0.026,0.19c-0.052,0.101-0.113,0.062-0.165,0.128    c-0.051,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161    c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631    c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45    c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.07,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221    c0.038-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.051-0.12-0.064-0.187c-0.021-0.114,0.002-0.224,0-0.337    c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207    c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.215,0.124-0.215,0.224C0.5-71.68,0.503-71.744,0.51-71.626    c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+		<g
+   id="g36">
+			<g
+   id="g38">
+				<path
+   id="path40"
+   d="M69.439-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path42"
+   d="M61.778-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path44"
+   d="M54.118-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path46"
+   d="M46.458-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path48"
+   d="M38.797-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path50"
+   d="M31.137-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path52"
+   d="M23.477-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path54"
+   d="M15.816-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path56"
+   d="M8.156-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path58"
+   d="M0.495-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143C2-61.45,2.217-61.397,2.391-61.46c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+			</g>
+			<g
+   id="g60">
+				<path
+   id="path62"
+   d="M69.439-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path64"
+   d="M61.778-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path66"
+   d="M54.118-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path68"
+   d="M46.458-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path70"
+   d="M38.797-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path72"
+   d="M31.137-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path74"
+   d="M23.477-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path76"
+   d="M15.816-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path78"
+   d="M8.156-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path80"
+   d="M0.495-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224C0.5-56.374,0.503-56.438,0.51-56.32      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+			</g>
+			<g
+   id="g82">
+				<path
+   id="path84"
+   d="M69.439-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path86"
+   d="M61.778-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path88"
+   d="M54.118-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path90"
+   d="M46.458-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path92"
+   d="M38.797-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path94"
+   d="M31.137-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path96"
+   d="M23.477-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path98"
+   d="M15.816-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path100"
+   d="M8.156-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path102"
+   d="M0.495-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+			</g>
+			<g
+   id="g104">
+				<path
+   id="path106"
+   d="M69.439-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path108"
+   d="M61.778-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path110"
+   d="M54.118-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path112"
+   d="M46.458-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path114"
+   d="M38.797-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path116"
+   d="M31.137-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path118"
+   d="M23.477-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path120"
+   d="M15.816-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path122"
+   d="M8.156-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      C8.15-41.004,8.149-41.02,8.14-41.04"
+   fill="#FFFFFF" />
+				<path
+   id="path124"
+   d="M0.495-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+			</g>
+			<g
+   id="g126">
+				<path
+   id="path128"
+   d="M69.439-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path130"
+   d="M61.778-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path132"
+   d="M54.118-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path134"
+   d="M46.458-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path136"
+   d="M38.797-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path138"
+   d="M31.137-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path140"
+   d="M23.477-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path142"
+   d="M15.816-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path144"
+   d="M8.156-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path146"
+   d="M0.495-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224C0.5-33.416,0.503-33.48,0.51-33.362      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+			</g>
+			<g
+   id="g148">
+				<path
+   id="path150"
+   d="M69.439-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path152"
+   d="M61.778-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path154"
+   d="M54.118-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path156"
+   d="M46.458-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path158"
+   d="M38.797-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path160"
+   d="M31.137-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path162"
+   d="M23.477-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path164"
+   d="M15.816-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path166"
+   d="M8.156-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path168"
+   d="M0.495-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+			</g>
+			<g
+   id="g170">
+				<path
+   id="path172"
+   d="M69.439-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path174"
+   d="M61.778-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path176"
+   d="M54.118-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path178"
+   d="M46.458-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path180"
+   d="M38.797-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path182"
+   d="M31.137-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path184"
+   d="M23.477-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path186"
+   d="M15.816-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path188"
+   d="M8.156-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path190"
+   d="M0.495-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224C0.5-18.11,0.503-18.175,0.51-18.057      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+			</g>
+			<g
+   id="g192">
+				<path
+   id="path194"
+   d="M69.439-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362C69-9.692,69.159-9.523,69.154-9.4c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path196"
+   d="M61.778-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path198"
+   d="M54.118-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path200"
+   d="M46.458-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path202"
+   d="M38.797-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path204"
+   d="M31.137-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path206"
+   d="M23.477-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path208"
+   d="M15.816-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053C17.933-7.969,17.839-8.227,18-8.34      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path210"
+   d="M8.156-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      C7.915-10.05,7.866-9.836,7.886-9.75C7.717-9.692,7.876-9.523,7.871-9.4C7.868-9.351,7.83-9.295,7.826-9.239      c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631      C9.114-7.652,9.321-7.799,9.48-7.837c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+				<path
+   id="path212"
+   d="M0.495-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128      C0.254-10.05,0.205-9.836,0.225-9.75C0.056-9.692,0.215-9.523,0.21-9.4c-0.002,0.05-0.041,0.105-0.045,0.161      c-0.01,0.119,0.017,0.266,0.068,0.37C0.33-8.671,0.501-8.456,0.668-8.325c0.19,0.148,0.365,0.572,0.608,0.631      C1.454-7.652,1.66-7.799,1.819-7.837C2-7.88,2.217-7.827,2.391-7.89c0.222-0.079,0.127-0.337,0.288-0.45      c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46C3.477-8.933,3.471-8.995,3.5-9.071      c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337      c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207      c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169      c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+			</g>
+		</g>
+		<g
+   id="g214">
+			<path
+   id="path216"
+   d="M69.439-2.778c0.018,0.072,0.008,0.127-0.026,0.19C69.361-2.487,69.3-2.525,69.248-2.46     c-0.051,0.062-0.099,0.276-0.079,0.362C69-2.04,69.159-1.871,69.154-1.748c-0.002,0.05-0.041,0.105-0.045,0.161     c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631     C70.397,0,70.604-0.146,70.763-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45     c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.07,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221     c0.038-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.051-0.12-0.064-0.187c-0.021-0.114,0.002-0.224,0-0.337     c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207     c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.215,0.124-0.215,0.224c0.002,0.115,0.005,0.051,0.012,0.169     c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+			<path
+   id="path218"
+   d="M61.778-2.778c0.018,0.072,0.007,0.127-0.026,0.19C61.7-2.487,61.64-2.525,61.587-2.46     c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161     c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631     C62.737,0,62.943-0.146,63.103-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45     c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221     c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337     c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207     c-0.17,0.088-0.139,0.166-0.318,0.224C61.915-3.117,61.78-3.02,61.781-2.92c0.001,0.115,0.005,0.051,0.012,0.169     c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+			<path
+   id="path220"
+   d="M54.118-2.778c0.018,0.072,0.007,0.127-0.026,0.19C54.04-2.487,53.98-2.525,53.927-2.46     c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161     c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631     C55.077,0,55.283-0.146,55.442-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45     c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221     c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337     c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207     c-0.17,0.088-0.139,0.166-0.318,0.224C54.255-3.117,54.12-3.02,54.121-2.92c0.001,0.115,0.005,0.051,0.012,0.169     c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+			<path
+   id="path222"
+   d="M46.458-2.778c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128     c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161     c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631     C47.416,0,47.623-0.146,47.782-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45     c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221     c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337     c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207     c-0.17,0.088-0.139,0.166-0.318,0.224C46.594-3.117,46.459-3.02,46.46-2.92c0.001,0.115,0.005,0.051,0.012,0.169     c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+			<path
+   id="path224"
+   d="M38.797-2.778c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128     c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161     c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631     C39.756,0,39.962-0.146,40.122-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45     c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221     c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337     c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207     c-0.17,0.088-0.139,0.166-0.318,0.224C38.934-3.117,38.799-3.02,38.8-2.92c0.001,0.115,0.005,0.051,0.012,0.169     c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+			<path
+   id="path226"
+   d="M31.137-2.778c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128     c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161     c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631     C32.095,0,32.302-0.146,32.461-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45     c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221     c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337     c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207     c-0.17,0.088-0.139,0.166-0.318,0.224C31.273-3.117,31.139-3.02,31.14-2.92c0.001,0.115,0.005,0.051,0.012,0.169     c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+			<path
+   id="path228"
+   d="M23.477-2.778c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128     c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161     c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631     C24.435,0,24.642-0.146,24.801-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45     c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221     c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337     c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207     c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169     c-0.021,0.011-0.021-0.005-0.03-0.025"
+   fill="#FFFFFF" />
+			<path
+   id="path230"
+   d="M15.816-2.778c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128     c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161     c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631     C16.774,0,16.981-0.146,17.14-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45     c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221     c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337     c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207     c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169     C15.81-2.74,15.809-2.756,15.8-2.776"
+   fill="#FFFFFF" />
+			<path
+   id="path232"
+   d="M8.156-2.778c0.018,0.072,0.007,0.127-0.026,0.19C8.077-2.487,8.018-2.525,7.965-2.46     c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35C7.868-1.698,7.83-1.643,7.826-1.587     c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631     C9.114,0,9.321-0.146,9.48-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45     c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221     c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337     c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789C8.954-3.54,8.847-3.448,8.692-3.367     c-0.17,0.088-0.139,0.166-0.318,0.224C8.292-3.117,8.158-3.02,8.159-2.92C8.16-2.805,8.164-2.869,8.17-2.751     C8.15-2.74,8.149-2.756,8.14-2.776"
+   fill="#FFFFFF" />
+			<path
+   id="path234"
+   d="M0.495-2.778c0.018,0.072,0.008,0.127-0.026,0.19C0.417-2.487,0.356-2.525,0.304-2.46     C0.253-2.397,0.205-2.184,0.225-2.098C0.056-2.04,0.215-1.871,0.21-1.748c-0.002,0.05-0.041,0.105-0.045,0.161     c-0.01,0.119,0.017,0.266,0.068,0.37C0.33-1.019,0.501-0.804,0.668-0.673c0.19,0.148,0.365,0.572,0.608,0.631     C1.454,0,1.66-0.146,1.819-0.185C2-0.228,2.217-0.175,2.391-0.237c0.222-0.079,0.127-0.337,0.288-0.45     c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.07,0.339-0.263,0.376-0.46C3.477-1.28,3.471-1.343,3.5-1.419     c0.038-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.051-0.12-0.064-0.187c-0.021-0.114,0.002-0.224,0-0.337     c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789C1.293-3.54,1.187-3.448,1.031-3.367     c-0.17,0.088-0.139,0.166-0.318,0.224C0.632-3.117,0.498-3.02,0.498-2.92C0.5-2.805,0.503-2.869,0.51-2.751     C0.489-2.74,0.488-2.756,0.479-2.776"
+   fill="#FFFFFF" />
+		</g>
+	</g>
+</pattern>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<rect
+   style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.83134139;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+   id="rect6847"
+   width="126.74917"
+   height="126.99831"
+   x="-0.99158502"
+   y="-0.24915084" /><g
+   id="g2996"
+   transform="matrix(0.46679402,-0.88436607,0.88436607,0.46679402,-20.509268,97.149298)"><path
+     d="M 107.61309,85.427163 C 126.35316,54.267748 103.65523,3.7316784 62.152514,8.8657974 24.653999,13.501508 24.049791,52.97069 57.097677,62.347028 c 28.598853,8.121324 5.908299,26.261404 6.571301,38.341302 0.665797,12.07808 24.862369,16.46007 43.944112,-15.261167 z"
+     style="fill:#1b1a1b"
+     id="path2339" /><path
+     d="M 108.32072,84.162974 C 127.06181,53.003291 104.36388,2.4672218 62.861165,7.6013402 25.362652,12.23705 24.757687,51.707522 57.805574,61.083859 c 28.598853,8.121324 5.908299,26.261404 6.571569,38.342322 0.666551,12.076789 24.861834,16.458029 43.943577,-15.263207 z"
+     style="fill:#bfbfbf"
+     id="path2561" /><path
+     d="m 69.186033,104.19365 c -1.135692,-1.84204 0.601038,-3.88837 2.386188,-3.73277 2.841598,0.24886 9.028642,-0.0333 13.910588,-2.800482 C 97.6794,90.746293 116.44888,57.478025 107.00882,36.495137 102.78257,27.102283 100.72467,24.412915 96.372318,19.81831 c -0.887874,-0.937057 -0.378162,-0.886124 0.223066,-0.568957 2.353599,1.235189 6.489446,6.019569 10.731716,13.806724 7.16765,13.156791 6.79595,28.797842 4.13015,38.609442 -1.85691,6.825577 -8.25281,22.266533 -17.619587,28.942751 -9.387853,6.69156 -20.372606,10.52943 -24.65163,3.58538 z"
+     style="fill:#000000"
+     id="path2563" /><path
+     d="M 60.687485,61.019981 C 54.297665,59.123186 46.06011,56.4817 41.295423,50.249529 c -3.51248,-4.595193 -5.295582,-9.610385 -5.750944,-12.454176 -0.162003,-1.014713 -0.299617,-1.861261 -0.0075,-2.094878 0.135238,-0.108497 2.622869,5.514283 6.341685,10.226737 3.718069,4.713742 8.914807,7.470526 13.24405,8.472162 3.850608,0.890203 11.826899,2.846243 14.525556,5.145317 2.77437,2.363257 3.005946,7.469336 2.072352,8.045384 C 70.779125,68.169283 68.87,63.447817 60.687289,61.019981 z"
+     style="fill:#000000"
+     id="path2565" /><path
+     d="m 73.863069,105.09442 c -0.123332,1.46251 1.556525,1.74932 3.817708,1.41046 2.898288,-0.43471 5.349293,-0.76107 8.685191,-2.43293 4.521182,-2.2658 9.09685,-5.506989 12.447924,-9.879632 9.998228,-13.044622 13.538728,-28.478823 12.993498,-30.69907 -0.1822,1.833569 -2.59588,11.458073 -8.11589,20.134991 -7.089521,11.145311 -12.230531,17.081841 -24.087282,19.959951 -3.299704,0.80164 -5.579675,-0.41901 -5.741149,1.50623 z"
+     style="fill:#ffffff"
+     id="path2567" /><path
+     d="m 47.56572,54.369317 c 1.350435,1.145429 4.117343,2.671707 9.561614,4.457113 6.575462,2.155844 9.776981,4.025449 11.117744,4.921402 1.420732,0.951385 2.321212,3.074269 2.41017,1.188742 0.09277,-1.887616 -1.070702,-3.510729 -3.66667,-4.37155 -1.756347,-0.583153 -4.7109,-1.97194 -7.543128,-2.530905 -1.819913,-0.359233 -4.780811,-1.072155 -7.320051,-1.849642 -1.391646,-0.427711 -2.809634,-1.1769 -4.559679,-1.81516 z"
+     style="fill:#ffffff"
+     id="path2569" /><path
+     d="M 105.72614,63.921199 C 113.7054,40.922252 97.007933,6.1896881 63.228641,10.367773 32.706856,14.141463 32.214677,46.266552 59.113519,53.899069 89.582156,58.51118 71.235202,81.495802 68.632602,93.086552 66.299323,103.47658 93.255777,105.18656 105.72614,63.921199 z"
+     style="fill:#999999"
+     id="path2561_1_" /><path
+     d="m 84.848561,81.885586 c -8.254188,-1.021445 -20.13245,17.614405 -8.932534,15.431899 11.198141,-2.180945 -11.199916,2.182506 0,0 5.383182,-0.798314 9.842872,-2.698914 13.835192,-7.255788 5.205477,-5.940314 12.981581,-18.771954 15.230561,-27.062759 1.89451,-6.990334 0.94225,-17.820653 -1.01071,-7.64474 -2.00298,10.4432 -10.868321,27.552835 -19.122509,26.531388 z"
+     style="fill:#f3f3f3"
+     id="path2571" /></g>
+<text
+   xml:space="preserve"
+   style="font-size:35.48976898px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Balker;-inkscape-font-specification:Balker"
+   x="16.816299"
+   y="109.87854"
+   id="text3014"
+   sodipodi:linespacing="125%"><tspan
+     sodipodi:role="line"
+     id="tspan3018"
+     x="16.816299"
+     y="109.87854">evolve</tspan></text>
+<g
+   id="g2988"
+   transform="matrix(0.74328759,-0.66897202,0.66897202,0.74328759,8.9028358,75.473986)"><path
+     d="M 19.418398,44.509742 C 13.566506,45.076202 9.2828039,50.274467 9.8492604,56.126357 10.416792,61.982332 15.614839,66.269362 21.46775,65.702634 27.31879,65.12876 31.606084,59.931735 31.037317,54.079359 30.468598,48.231333 25.271308,43.943014 19.418398,44.509742 z"
+     style="fill:#1b1a1b"
+     id="path2343" /><path
+     d="M 20.127041,43.245285 C 14.275159,43.811746 9.9914567,49.01001 10.557913,54.8619 c 0.567261,5.854953 5.765579,10.143005 11.61747,9.576545 5.85206,-0.574142 10.139092,-5.772187 9.569297,-11.624297 -0.567701,-5.848293 -5.764728,-10.13559 -11.617639,-9.568863 z"
+     style="fill:#bfbfbf"
+     id="path2589" /><path
+     d="m 15.297614,61.936273 c 0.0649,0.752128 1.095012,1.718382 2.713381,2.162016 1.390355,0.381136 4.974531,1.355379 9.578993,-1.550784 4.604462,-2.906163 5.135393,-10.679565 3.042277,-12.965884 -0.647907,-1.158064 -1.490462,-2.001165 -0.820074,-0.152965 1.692982,4.666774 -1.596739,9.032083 -4.434212,11.053479 -2.836454,2.021128 -6.433853,1.064641 -7.902778,0.616794 -1.468915,-0.447847 -2.243523,0.0604 -2.177587,0.837344 z"
+     style="fill:#000000"
+     id="path2591" /><path
+     d="m 21.239503,62.980483 c 0.422006,-0.379939 2.558364,-0.22464 4.487234,-1.261971 1.92785,-1.037065 4.219346,-3.310451 4.628251,-6.540865 0.240881,-1.896934 0.313223,-1.420583 0.409121,-0.387475 -0.299215,5.370492 -5.238089,8.336927 -8.06262,8.72834 -0.76217,0.105705 -2.103468,0.04118 -1.461986,-0.538029 z"
+     style="fill:#ffffff"
+     id="path2597" /><path
+     d="m 12.336171,56.430605 c 0.380898,1.199486 1.354175,2.949646 3.409446,3.241412 2.744512,0.389611 3.30561,1.629622 6.546396,0.986326 3.240786,-0.643297 5.697258,-3.299154 6.680242,-6.23693 1.125385,-4.064906 -0.559668,-6.163496 -3.095682,-8.037135 -2.536005,-1.873639 -8.114707,-1.672161 -11.443975,1.362735 -2.366007,2.155435 -3.02378,5.763265 -2.096427,8.683592 z"
+     style="fill:#999999"
+     id="path2593_2_" /><path
+     d="m 23.114098,59.11873 c 2.490146,-0.651887 5.783458,-4.045016 4.14851,-6.635646 -2.017128,-3.192057 -7.636948,-0.459737 -7.826995,3.094121 -0.190795,3.555146 1.039269,4.232436 3.678485,3.541525 z"
+     style="fill:#f3f3f3"
+     id="path256" /></g></svg>
\ No newline at end of file
--- a/docs/test2rst.py
+++ b/docs/test2rst.py
@@ -27,7 +27,7 @@
     if os.path.isdir(base):
         one_dir(base)
     else:
-        print one_file(base)
+        one_file(base)
 
 
 def one_dir(base):
@@ -37,14 +37,12 @@
     for fn in sorted(os.listdir(base)):
         if not fn.endswith('.t'):
             continue
-        print fn
         name = os.path.splitext(fn)[0]
         content = one_file(op.join(base, fn))
         target = op.join(base, name + '.rst')
         #with file(doc(name + '.rst'), 'w') as f:
         with file(target, 'w') as f:
             f.write(content)
-        print f
 
         index += '\n   ' + name
 
old mode 100644
new mode 120000
--- a/docs/tutorials/tutorial.t
+++ b/docs/tutorials/tutorial.t
@@ -1,775 +1,1 @@
-
-Initial setup
--------------
-
-This Mercurial configuration example is used for testing.
-.. Various setup
-
-  $ cat >> $HGRCPATH << EOF
-  > [ui]
-  > logtemplate ="{node|short} ({phase}): {desc}\n"
-  > [diff]
-  > git = 1
-  > [alias]
-  > # "-d '0 0'" means that the new commit will be at January 1st 1970.
-  > # This is used for stable hash during test
-  > amend = amend -d '0 0'
-  > [extensions]
-  > hgext.graphlog=
-  > EOF
-
-  $ hg init local
-  $ cat >> local/.hg/hgrc << EOF
-  > [paths]
-  > remote = ../remote
-  > other = ../other
-  > [ui]
-  > user = Babar the King
-  > EOF
-
-  $ hg init remote
-  $ cat >> remote/.hg/hgrc << EOF
-  > [paths]
-  > local = ../local
-  > [ui]
-  > user = Celestine the Queen
-  > EOF
-
-  $ hg init other
-  $ cat >> other/.hg/hgrc << EOF
-  > [ui]
-  > user = Princess Flore
-  > EOF
-
-
-This tutorial use the following configuration for Mercurial:
-
-A compact log template with phase data:
-
-  $ hg showconfig ui
-  ui.slash=True
-  ui.logtemplate="{node|short} ({phase}): {desc}\n"
-
-Improved git format diff:
-
-  $ hg showconfig diff
-  diff.git=1
-
-And the graphlog extension
-  $ hg showconfig extensions
-  extensions.hgext.graphlog=
-
-And of course, we anabled the experimental extensions for mutable history:
-
-  $ $(dirname $TESTDIR)/enable.sh >> $HGRCPATH 2> /dev/null
-
-
------------------------
-Single Developer Usage
------------------------
-
-This tutorial shows how to use evolution to rewrite history locally.
-
-
-Fixing mistake with `hg amend`
---------------------------------
-
-We are versionning a shopping list
-
-  $ cd local
-  $ cat  >> shopping << EOF
-  > Spam
-  > Whizzo butter
-  > Albatross
-  > Rat (rather a lot)
-  > Jugged fish
-  > Blancmange
-  > Salmon mousse
-  > EOF
-  $ hg commit -A -m "Monthy Python Shopping list"
-  adding shopping
-
-Its first version is shared with the outside.
-
-  $ hg push remote
-  pushing to $TESTTMP/remote
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files
-
-Later I add additional item to my list
-
-  $ cat >> shopping << EOF
-  > Egg
-  > Suggar
-  > Vinegar
-  > Oil
-  > EOF
-  $ hg commit -m "adding condiment"
-  $ cat >> shopping << EOF
-  > Bananos
-  > Pear
-  > Apple
-  > EOF
-  $ hg commit -m "adding fruit"
-
-This history is very linear
-
-  $ hg glog
-  @  d85de4546133 (draft): adding fruit
-  |
-  o  4d5dc8187023 (draft): adding condiment
-  |
-  o  7e82d3f3c2cb (public): Monthy Python Shopping list
-  
-
-But a typo was made in Babanas!
-
-  $ hg export tip
-  # HG changeset patch
-  # User test
-  # Date 0 0
-  # Node ID d85de4546133030c82d257bbcdd9b1b416d0c31c
-  # Parent  4d5dc81870237d492284826e21840b2ca00e26d1
-  adding fruit
-  
-  diff --git a/shopping b/shopping
-  --- a/shopping
-  +++ b/shopping
-  @@ -9,3 +9,6 @@
-   Suggar
-   Vinegar
-   Oil
-  +Bananos
-  +Pear
-  +Apple
-
-The faulty changeset is in the "draft" phase because he was not exchanged with
-the outside. The first one have been exchanged and is an immutable public
-changeset.
-
-  $ hg glog
-  @  d85de4546133 (draft): adding fruit
-  |
-  o  4d5dc8187023 (draft): adding condiment
-  |
-  o  7e82d3f3c2cb (public): Monthy Python Shopping list
-  
-
-hopefully. I can use hg amend to rewrite my faulty changeset!
-
-  $ sed -i'' -e s/Bananos/Banana/ shopping
-  $ hg diff
-  diff --git a/shopping b/shopping
-  --- a/shopping
-  +++ b/shopping
-  @@ -9,6 +9,6 @@
-   Suggar
-   Vinegar
-   Oil
-  -Bananos
-  +Banana
-   Pear
-   Apple
-  $ hg amend
-
-A new changeset with the right diff replace the wrong one.
-
-  $ hg glog
-  @  0cacb48f4482 (draft): adding fruit
-  |
-  o  4d5dc8187023 (draft): adding condiment
-  |
-  o  7e82d3f3c2cb (public): Monthy Python Shopping list
-  
-  $ hg export tip
-  # HG changeset patch
-  # User test
-  # Date 0 0
-  # Node ID 0cacb48f44828d2fd31c4e45e18fde32a5b2f07b
-  # Parent  4d5dc81870237d492284826e21840b2ca00e26d1
-  adding fruit
-  
-  diff --git a/shopping b/shopping
-  --- a/shopping
-  +++ b/shopping
-  @@ -9,3 +9,6 @@
-   Suggar
-   Vinegar
-   Oil
-  +Banana
-  +Pear
-  +Apple
-
-Getting Ride of branchy history
-----------------------------------
-
-While I was working on my list. someone help made a change remotly.
-
-  $ cd ../remote
-  $ hg up -q
-  $ sed -i'' -e 's/Spam/Spam Spam Spam/' shopping
-  $ hg ci -m 'SPAM'
-  $ cd ../local
-
-I'll get this remote changeset when pulling
-
-  $ hg pull remote
-  pulling from $TESTTMP/remote
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files (+1 heads)
-  (run 'hg update' to get a working copy)
-
-I now have a new heads. Note that this remote head is immutable
-
-  $ hg log -G
-  o  9ca060c80d74 (public): SPAM
-  |
-  | @  0cacb48f4482 (draft): adding fruit
-  | |
-  | o  4d5dc8187023 (draft): adding condiment
-  |/
-  o  7e82d3f3c2cb (public): Monthy Python Shopping list
-  
-
-instead of merging my head with the new one. I'm going to rebase my work
-
-  $ hg diff
-  $ hg rebase -d 9ca060c80d74 -s 4d5dc8187023
-  merging shopping
-  merging shopping
-
-
-My local work is now rebased on the remote one.
-
-  $ hg log -G
-  @  387187ad9bd9 (draft): adding fruit
-  |
-  o  dfd3a2d7691e (draft): adding condiment
-  |
-  o  9ca060c80d74 (public): SPAM
-  |
-  o  7e82d3f3c2cb (public): Monthy Python Shopping list
-  
-
-Removing changeset
-------------------------
-
-I add new item to my list
-
-  $ cat >> shopping << EOF
-  > car
-  > bus
-  > plane
-  > boat
-  > EOF
-  $ hg ci -m 'transport'
-  $ hg log -G
-  @  d58c77aa15d7 (draft): transport
-  |
-  o  387187ad9bd9 (draft): adding fruit
-  |
-  o  dfd3a2d7691e (draft): adding condiment
-  |
-  o  9ca060c80d74 (public): SPAM
-  |
-  o  7e82d3f3c2cb (public): Monthy Python Shopping list
-  
-
-I have a new commit but I realize that don't want it. (transport shop list does
-not fit well in my standard shopping list)
-
-  $ hg prune . # . is for working directory parent
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  working directory now at 387187ad9bd9
-
-The silly changeset is gone.
-
-  $ hg log -G
-  @  387187ad9bd9 (draft): adding fruit
-  |
-  o  dfd3a2d7691e (draft): adding condiment
-  |
-  o  9ca060c80d74 (public): SPAM
-  |
-  o  7e82d3f3c2cb (public): Monthy Python Shopping list
-  
-
-Reordering changeset
-------------------------
-
-
-We create two changesets.
-
-
-  $ cat >> shopping << EOF
-  > Shampoo
-  > Toothbrush
-  > ... More bathroom stuff to come
-  > Towel
-  > Soap
-  > EOF
-  $ hg ci -m 'bathroom stuff' -q # XXX remove the -q
-
-  $ sed -i'' -e 's/Spam/Spam Spam Spam/g' shopping
-  $ hg ci -m 'SPAM SPAM'
-  $ hg log -G
-  @  c48f32fb1787 (draft): SPAM SPAM
-  |
-  o  8d39a843582d (draft): bathroom stuff
-  |
-  o  387187ad9bd9 (draft): adding fruit
-  |
-  o  dfd3a2d7691e (draft): adding condiment
-  |
-  o  9ca060c80d74 (public): SPAM
-  |
-  o  7e82d3f3c2cb (public): Monthy Python Shopping list
-  
-
-.. note: don't amend changeset 7e82d3f3c2cb or 9ca060c80d74 as they are immutable.
-
-I now want to push to remote all my change but the bathroom one that i'm not
-totally happy with yet. To be able to push "SPAM SPAM" I need a version of "SPAM SPAM" not children of
-"bathroom stuff"
-
-You can use 'rebase -r' or 'graft -O' for that:
-
-  $ hg up 'p1(8d39a843582d)' # going on "bathroom stuff" parent
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ hg graft -O c48f32fb1787 # moving "SPAM SPAM" to the working directory parent
-  grafting revision 10
-  merging shopping
-  $ hg log -G
-  @  a2fccc2e7b08 (draft): SPAM SPAM
-  |
-  | o  8d39a843582d (draft): bathroom stuff
-  |/
-  o  387187ad9bd9 (draft): adding fruit
-  |
-  o  dfd3a2d7691e (draft): adding condiment
-  |
-  o  9ca060c80d74 (public): SPAM
-  |
-  o  7e82d3f3c2cb (public): Monthy Python Shopping list
-  
-
-We have a new SPAM SPAM version without the bathroom stuff
-
-  $ grep Spam shopping  # enouth spam
-  Spam Spam Spam Spam Spam Spam Spam Spam Spam
-  $ grep Toothbrush shopping # no Toothbrush
-  [1]
-  $ hg export .
-  # HG changeset patch
-  # User test
-  # Date 0 0
-  # Node ID a2fccc2e7b08bbce6af7255b989453f7089e4cf0
-  # Parent  387187ad9bd9d8f9a00a9fa804a26231db547429
-  SPAM SPAM
-  
-  diff --git a/shopping b/shopping
-  --- a/shopping
-  +++ b/shopping
-  @@ -1,4 +1,4 @@
-  -Spam Spam Spam
-  +Spam Spam Spam Spam Spam Spam Spam Spam Spam
-   Whizzo butter
-   Albatross
-   Rat (rather a lot)
-
-To make sure I do not push unready changeset by mistake I set the "bathroom
-stuff" changeset in the secret phase.
-
-  $ hg phase --force --secret 8d39a843582d
-
-we can now push our change:
-
-  $ hg push remote
-  pushing to $TESTTMP/remote
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 3 changesets with 3 changes to 1 files
-
-for simplicity shake we get the bathroom change in line again
-
-  $ hg rebase -Dr 8d39a843582d -d a2fccc2e7b08
-  merging shopping
-  $ hg phase --draft .
-  $ hg log -G
-  @  8a79ae8b029e (draft): bathroom stuff
-  |
-  o  a2fccc2e7b08 (public): SPAM SPAM
-  |
-  o  387187ad9bd9 (public): adding fruit
-  |
-  o  dfd3a2d7691e (public): adding condiment
-  |
-  o  9ca060c80d74 (public): SPAM
-  |
-  o  7e82d3f3c2cb (public): Monthy Python Shopping list
-  
-
-
-
-Splitting change
-------------------
-
-To be done (currently achieve with "two commit + debugobsolete")
-
-Collapsing change
-------------------
-
-To be done (currently achieve with "revert + debugobsolete" or "rebase --collapse")
-
-
-
-
-
-
------------------------
-Collaboration
------------------------
-
-
-sharing mutable changeset
-----------------------------
-
-To share mutable changeset with other just check that the repo you interact
-with is "not publishing". Otherwise you will get the previously observe
-behavior where exchanged changeset are automatically published.
-
-  $ cd ../remote
-  $ hg -R ../local/ showconfig phases
-
-the localrepo does not have any specific configuration for `phases.publish`. It
-is ``true`` by default.
-
-  $ hg pull local
-  pulling from $TESTTMP/local
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files
-  (run 'hg update' to get a working copy)
-  $ hg log -G
-  o  8a79ae8b029e (public): bathroom stuff
-  |
-  o  a2fccc2e7b08 (public): SPAM SPAM
-  |
-  o  387187ad9bd9 (public): adding fruit
-  |
-  o  dfd3a2d7691e (public): adding condiment
-  |
-  @  9ca060c80d74 (public): SPAM
-  |
-  o  7e82d3f3c2cb (public): Monthy Python Shopping list
-  
-
-
-
-We do not want to publish the "bathroom changeset". Let's rollback the last transaction
-
-  $ hg rollback
-  repository tip rolled back to revision 4 (undo pull)
-  $ hg log -G
-  o  a2fccc2e7b08 (public): SPAM SPAM
-  |
-  o  387187ad9bd9 (public): adding fruit
-  |
-  o  dfd3a2d7691e (public): adding condiment
-  |
-  @  9ca060c80d74 (public): SPAM
-  |
-  o  7e82d3f3c2cb (public): Monthy Python Shopping list
-  
-
-Let's make the local repo "non publishing"
-
-  $ echo '[phases]' >> ../local/.hg/hgrc
-  $ echo 'publish=false' >> ../local/.hg/hgrc
-  $ echo '[phases]' >> .hg/hgrc
-  $ echo 'publish=false' >> .hg/hgrc
-  $ hg showconfig phases
-  phases.publish=false
-  $ hg -R ../local/ showconfig phases
-  phases.publish=false
-
-
-I can now exchange mutable changeset between "remote" and "local" repository.
-
-  $ hg pull local
-  pulling from $TESTTMP/local
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files
-  (run 'hg update' to get a working copy)
-  $ hg log -G
-  o  8a79ae8b029e (draft): bathroom stuff
-  |
-  o  a2fccc2e7b08 (public): SPAM SPAM
-  |
-  o  387187ad9bd9 (public): adding fruit
-  |
-  o  dfd3a2d7691e (public): adding condiment
-  |
-  @  9ca060c80d74 (public): SPAM
-  |
-  o  7e82d3f3c2cb (public): Monthy Python Shopping list
-  
-
-Rebasing unstable change after pull
-----------------------------------------------
-
-Remotely someone add a new changeset on top of the mutable "bathroom" on.
-
-  $ hg up 8a79ae8b029e -q
-  $ cat >> shopping << EOF
-  > Giraffe
-  > Rhino
-  > Lion
-  > Bear
-  > EOF
-  $ hg ci -m 'animals'
-
-But at the same time, locally, this same "bathroom changeset" was updated.
-
-  $ cd ../local
-  $ hg up 8a79ae8b029e -q
-  $ sed -i'' -e 's/... More bathroom stuff to come/Bath Robe/' shopping
-  $ hg amend
-  $ hg log -G
-  @  ffa278c50818 (draft): bathroom stuff
-  |
-  o  a2fccc2e7b08 (public): SPAM SPAM
-  |
-  o  387187ad9bd9 (public): adding fruit
-  |
-  o  dfd3a2d7691e (public): adding condiment
-  |
-  o  9ca060c80d74 (public): SPAM
-  |
-  o  7e82d3f3c2cb (public): Monthy Python Shopping list
-  
-
-
-When we pull from remote again we get an unstable state!
-
-
-  $ hg pull remote
-  pulling from $TESTTMP/remote
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files (+1 heads)
-  (run 'hg heads .' to see heads, 'hg merge' to merge)
-  1 new unstables changesets
-
-
-The new changeset "animal" is based one an old changeset of "bathroom". You can
-see both version showing up in the log.
-
-  $ hg log -G
-  o  9ac5d0e790a2 (draft): animals
-  |
-  | @  ffa278c50818 (draft): bathroom stuff
-  | |
-  o |  8a79ae8b029e (draft): bathroom stuff
-  |/
-  o  a2fccc2e7b08 (public): SPAM SPAM
-  |
-  o  387187ad9bd9 (public): adding fruit
-  |
-  o  dfd3a2d7691e (public): adding condiment
-  |
-  o  9ca060c80d74 (public): SPAM
-  |
-  o  7e82d3f3c2cb (public): Monthy Python Shopping list
-  
-
-The older version 8a79ae8b029e never ceased to exist in the local repo. It was
-jsut hidden and excluded from pull and push.
-
-.. note:: In hgview there is a nice doted relation highlighting ffa278c50818 as a new version of 8a79ae8b029e. this is not yet ported to graphlog.
-
-Their is **unstable** changeset in this history now. Mercurial will refuse to
-share it with the outside:
-
-  $ hg push other
-  pushing to $TESTTMP/other
-  searching for changes
-  abort: push includes an unstable changeset: 9ac5d0e790a2!
-  (use 'hg stabilize' to get a stable history (or --force to proceed))
-  [255]
- 
-
-
-
-To resolve this unstable state, you need to rebase 9ac5d0e790a2 onto
-ffa278c50818 the "hg stabilize" command will make this for you.
-
-It has a --dry-run option to only suggest the next move.
-
-  $ hg stabilize --dry-run
-  move:[15] animals
-  atop:[14] bathroom stuff
-  hg rebase -Dr 9ac5d0e790a2 -d ffa278c50818
-
-Let's do it
-
-  $ hg rebase -Dr 9ac5d0e790a2 -d ffa278c50818
-  merging shopping
-
-The old version of bathroom is hidden again.
-
-  $ hg log -G
-  @  437efbcaf700 (draft): animals
-  |
-  o  ffa278c50818 (draft): bathroom stuff
-  |
-  o  a2fccc2e7b08 (public): SPAM SPAM
-  |
-  o  387187ad9bd9 (public): adding fruit
-  |
-  o  dfd3a2d7691e (public): adding condiment
-  |
-  o  9ca060c80d74 (public): SPAM
-  |
-  o  7e82d3f3c2cb (public): Monthy Python Shopping list
-  
-
-
-We can push this evolution to remote
-
-  $ hg push remote
-  pushing to $TESTTMP/remote
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 2 changesets with 2 changes to 1 files (+1 heads)
-
-remote get a warning that current working directory is based on an obsolete changeset
-
-  $ cd ../remote
-  $ hg pull local # we up again to trigger the warning. it was displayed during the push
-  pulling from $TESTTMP/local
-  searching for changes
-  no changes found
-  Working directory parent is obsolete
-
-  $ hg up 437efbcaf700
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-
-Relocating unstable change after prune
-----------------------------------------------
-
-The remote guy keep working
-
-  $ sed -i'' -e 's/Spam/Spam Spam Spam Spam/g' shopping
-  $ hg commit -m "SPAM SPAM SPAM"
-
-I'm pulling its work locally.
-
-  $ cd ../local
-  $ hg pull remote
-  pulling from $TESTTMP/remote
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files
-  (run 'hg update' to get a working copy)
-  $ hg log -G
-  o  ae45c0c3092a (draft): SPAM SPAM SPAM
-  |
-  @  437efbcaf700 (draft): animals
-  |
-  o  ffa278c50818 (draft): bathroom stuff
-  |
-  o  a2fccc2e7b08 (public): SPAM SPAM
-  |
-  o  387187ad9bd9 (public): adding fruit
-  |
-  o  dfd3a2d7691e (public): adding condiment
-  |
-  o  9ca060c80d74 (public): SPAM
-  |
-  o  7e82d3f3c2cb (public): Monthy Python Shopping list
-  
-
-In the mean time I noticed you can't buy animals in a super market and I prune the animal changeset:
-
-  $ hg prune 437efbcaf700
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  working directory now at ffa278c50818
-  1 new unstables changesets
-
-
-The animals changeset is still displayed because the "SPAM SPAM SPAM" changeset
-is neither dead or obsolete.  My repository is in an unstable state again.
-
-  $ hg log -G
-  o  ae45c0c3092a (draft): SPAM SPAM SPAM
-  |
-  o  437efbcaf700 (draft): animals
-  |
-  @  ffa278c50818 (draft): bathroom stuff
-  |
-  o  a2fccc2e7b08 (public): SPAM SPAM
-  |
-  o  387187ad9bd9 (public): adding fruit
-  |
-  o  dfd3a2d7691e (public): adding condiment
-  |
-  o  9ca060c80d74 (public): SPAM
-  |
-  o  7e82d3f3c2cb (public): Monthy Python Shopping list
-  
-
-  $ hg log -r 'unstable()'
-  ae45c0c3092a (draft): SPAM SPAM SPAM
-
-# XXX make prune stabilization works
-#  $ hg stabilize --any
-#  merging shopping
-
-  $ hg graft -O ae45c0c3092a
-  grafting revision 17
-  merging shopping
-
-  $ hg log -G
-  @  20de1fb1cec5 (draft): SPAM SPAM SPAM
-  |
-  o  ffa278c50818 (draft): bathroom stuff
-  |
-  o  a2fccc2e7b08 (public): SPAM SPAM
-  |
-  o  387187ad9bd9 (public): adding fruit
-  |
-  o  dfd3a2d7691e (public): adding condiment
-  |
-  o  9ca060c80d74 (public): SPAM
-  |
-  o  7e82d3f3c2cb (public): Monthy Python Shopping list
-  
-
-
-Handling Conflicting amend
-----------------------------------------------
-
-We can detect that multiple diverging//conflicting amend have been made. There
-will be a "evol-merge" command to merge conflicting amend
-
-This command is not ready yet.
+../../tests/test-tutorial.t
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/docs/user-guide.rst
@@ -0,0 +1,601 @@
+.. Copyright © 2014 Greg Ward <greg@gerg.ca>
+
+------------------
+Evolve: User Guide
+------------------
+
+.. contents::
+
+Life without ``evolve``
+-----------------------
+
+Before we dive into learning about ``evolve``, let's look into some
+features of core Mercurial that interact with ``evolve``. ``commit``
+affects ``evolve``, and ``evolve`` modifies how ``commit --amend``
+works.
+
+Example 1: Commit a new changeset
+=================================
+
+To create a new changeset, simply run ``hg commit`` as usual.
+``evolve`` does not change the behaviour of ``commit`` at all.
+
+However, it's important to understand that new changesets are in the
+*draft* phase by default: they are mutable. This means that they can
+be modified by Mercurial's existing history-editing commands
+(``rebase``, ``histedit``, etc.), and also by the ``evolve``
+extension. Specifically, ``evolve`` adds a number of commands that can
+be used to modify history: ``amend``, ``uncommit``, ``prune``,
+``fold``, and ``evolve``. Generally speaking, changesets remain in
+*draft* phase until they are pushed to another repository, at which
+point they enter *public* phase. ::
+
+  $ hg commit -m 'implement feature X'
+  $ hg phase -r .
+  1: draft
+
+(Strictly speaking, changesets only become public when they are pushed
+to a *publishing* repository. But all repositories are publishing by
+default; you have to explicitly configure repositories to be
+*non-publishing*. Non-publishing repositories are an advanced topic
+which we'll see when we get to `sharing mutable history`_.)
+
+.. _`sharing mutable history`: sharing.html
+
+Example 2: Amend a changeset (traditional)
+==========================================
+
+Imagine you've just committed a new changeset, and then you discover a
+mistake. Maybe you forgot to run the tests and a failure slipped in.
+You want to modify history so that you push one perfect changeset,
+rather than one flawed changeset followed by an "oops" commit. (Or
+perhaps you made a typo in the commit message—this is really feature
+*Y*, not feature X. You can't fix that with a followup commit.)
+
+This is actually trivial with plain vanilla Mercurial since 2.2: fix
+your mistake and run ::
+
+  $ hg commit --amend -m 'implement feature Y'
+
+to create a new, amended changeset. The drawback of doing this with
+vanilla Mercurial is that your original, flawed, changeset is removed
+from the repository. This is *unsafe* history editing. It's probably
+not too serious if all you did was fix a syntax error, but still.
+
+.. figure:: figures/figure-ug01.svg
+
+   Figure 1: unsafe history modification with core Mercurial (not
+   using ``evolve``): the original revision 1 is destroyed.
+
+(Incidentally, Mercurial's traditional history modification mechanism
+isn't *really* unsafe: any changeset(s) removed from the repository
+are kept in a backup directory, so you can manually restore them later
+if you change your mind. But it's awkward and inconvenient compared to
+the features provided by ``evolve`` and changeset obsolescence.)
+
+Life with ``evolve`` (basic usage)
+----------------------------------
+
+Once you enable the ``evolve`` extension, a number of features are
+available to you. First, we're going to explore several examples of
+painless, trouble-free history modification.
+
+Example 3: Amend a changeset (with ``evolve``)
+==============================================
+
+Outwardly, amending a changeset with ``evolve`` can look exactly the
+same as it does with core Mercurial (example 2)::
+
+  $ hg commit --amend -m 'implement feature Y'
+
+Alternately, you can use the new ``amend`` command added by
+``evolve``::
+
+  $ hg amend -m 'implement feature Y'
+
+(``hg amend`` is nearly synonymous with ``hg commit --amend``. The
+difference is that ``hg amend`` reuses the existing commit message by
+default, whereas ``hg commit --amend`` runs your editor if you don't
+pass ``-m`` or ``-l``.)
+
+Under the hood, though, things are quite different. Mercurial has
+simply marked the old changeset *obsolete*, replacing it with a new
+one. We'll explore what this means in detail later, after working
+through a few more examples.
+
+Example 4: Prune an unwanted changeset
+======================================
+
+Sometimes you make a change, and then decide it was such a bad idea
+that you don't want anyone to know about it. Or maybe it was a
+debugging hack that you needed to keep around for a while, but do not
+intend to ever push publicly. ::
+
+  $ echo 'debug hack' >> file1.c
+  $ hg commit -m 'debug hack'
+
+In either case, ``hg prune`` is the answer. ``prune`` simply marks
+changesets obsolete without creating any new changesets to replace
+them::
+
+  $ hg prune .
+  1 changesets pruned
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  working directory now at 934359450037
+
+Outwardly, it appears that your “debug hack” commit never happened;
+we're right back where we started::
+
+  $ hg parents --template '{rev}:{node|short}  {desc|firstline}\n'
+  3:934359450037  implement feature Y
+
+In reality, though, the “debug hack” is still there, obsolete and hidden.
+
+Example 5: Uncommit changes to certain files
+============================================
+
+Occasionally you commit more than you intended: perhaps you made
+unrelated changes to different files, and thus intend to commit
+different files separately. ::
+
+  $ echo 'relevant' >> file1.c
+  $ echo 'irrelevant' >> file2.c
+
+If you forget to specify filenames on the ``commit`` command line,
+Mercurial commits all those changes together::
+
+  $ hg commit -m 'fix bug 234'          # oops: too many files
+
+Luckily, this mistake is easy to fix with ``uncommit``::
+
+  $ hg uncommit file2.c
+  $ hg status
+  M file2.c
+
+Let's verify that the replacement changeset looks right (i.e.,
+modifies only ``file1.c``)::
+
+  $ hg parents --template '{rev}:{node|short}  {desc|firstline}\n{files}\n'
+  6:c8defeecf7a4  fix bug 234
+  file1.c
+
+As before, the original flawed changeset is still there, but obsolete
+and hidden. It won't be exchanged with other repositories by ``push``,
+``pull``, or ``clone``.
+
+Example 6: Fold multiple changesets together into one
+=====================================================
+
+If you're making extensive changes to fragile source code, you might
+commit more frequently than normal so that you can fallback on a
+known good state if one step goes badly. ::
+
+  $ echo step1 >> file1.c
+  $ hg commit -m 'step 1'               # revision 7
+  $ echo step2 >> file1.c
+  $ hg commit -m 'step 2'               # revision 8
+  $ echo step3 >> file2.c
+  $ hg commit -m 'step 3'               # revision 9
+
+At the end of such a sequence, you often end up with a series of small
+changesets that are tedious to review individually. It might make more
+sense to combine them into a single changeset using the ``fold``
+command.
+
+To make sure we pass the right revisions to ``fold``, let's review the
+changesets we just created, from revision 7::
+
+  $ hg log --template '{rev}:{node|short}  {desc|firstline}\n' -r 7::
+  7:05e61aab8294  step 1
+  8:be6d5bc8e4cc  step 2
+  9:35f432d9f7c1  step 3
+
+and fold them::
+
+  $ hg fold -m 'fix bug 64' -r 7::
+  3 changesets folded
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+This time, Mercurial marks three changesets obsolete, replacing them
+all with a single *successor*.
+
+(You might be familiar with this operation under other names, like
+*squash* or *collapse*.)
+
+Changeset obsolescence under the hood
+-------------------------------------
+
+So far, everything has gone just fine: we haven't run into merge
+conflicts or other trouble. Before we start exploring advanced usage
+that can run into trouble, let's step back and see what happens when
+Mercurial marks changesets obsolete. That will make it much easier to
+understand the more advanced use cases we'll see later.
+
+When you have the ``evolve`` extension enabled, all history
+modification uses the same underlying mechanism: the original
+changesets are marked *obsolete* and replaced by zero or more
+*successors*. The obsolete changesets are the *precursors* of their
+successors. This applies equally to built-in commands (``commit
+--amend``), commands added by ``evolve`` (``amend``, ``prune``,
+``uncommit``, ``fold``), and commands provided by other extensions
+(``rebase``, ``histedit``).
+
+Another way of looking at it is that obsolescence is second-order
+version control, i.e. the history of your history. We'll cover this in
+more detail (and mathematical precision) in the `concepts`_ guide.
+
+.. _`concepts`: concepts.html
+
+Under the hood: Amend a changeset
+=================================
+
+Consider Example 2, amending a changeset with ``evolve``. We saw above
+that you can do this using the exact same command-line syntax as core
+Mercurial, namely ``hg commit --amend``. But the implementation is
+quite different, and Figure 2 shows how.
+
+.. figure:: figures/figure-ug02.svg
+
+   Figure 2: safe history modification using ``evolve``: the original
+   revision 1 is preserved as an obsolete changeset. (The "temporary
+   amend commit", marked with T, is an implementation detail stemming
+   from limitations in Mercurial's current merge machinery. Future
+   versions of Mercurial will not create them.)
+
+In this case, the obsolete changesets are also *hidden*. That is the
+usual end state for obsolete changesets. But many scenarios result in
+obsolete changesets that are still visible, which indicates your
+history modification work is not yet done. We'll see examples of that
+later, when we cover advanced usage.
+
+
+Understanding revision numbers and hidden changesets
+====================================================
+
+As the name implies, hidden changesets are normally not visible. If
+you run ``hg log`` on the repository from Figure 2, Mercurial will
+show revisions 0 and 3, but not 1 and 2. That's something you don't
+see with plain vanilla Mercurial—normally, revision *N* is always
+followed by revision *N* + 1.
+
+This is just the visible manifestation of hidden changesets. If
+revision 0 is followed by revision 3, that means there are two hidden
+changesets, 1 and 2, in between.
+
+To see those hidden changesets, use the ``--hidden`` option::
+
+  $ hg --hidden log --graph --template '{rev}:{node|short}  {desc|firstline}\n'
+  @  3:934359450037  implement feature Y
+  |
+  | x  2:6c5f78d5d467  temporary amend commit for fe0ecd3bd2a4
+  | |
+  | x  1:fe0ecd3bd2a4  implement feature Y
+  |/
+  o  0:08c4b6f4efc8  init
+
+Note that changeset IDs are still the permanent, immutable identifier
+for changesets. Revision numbers are, as ever, a handy shorthand that
+work in your local repository, but cannot be used across repositories.
+They also have the useful property of showing when there are hidden
+changesets lurking under the covers, which is why this document uses
+revision numbers.
+
+
+Under the hood: Prune an unwanted changeset
+===========================================
+
+``prune`` (example 4 above) is the simplest history modification
+command provided by ``evolve``. All it does is mark the specified
+changeset(s) obsolete, with no successor/precursor relationships
+involved. (If the working directory parent was one of the obsolete
+changesets, ``prune`` updates back to a suitable ancestor.)
+
+.. figure:: figures/figure-ug03.svg
+
+   Figure 3: pruning a changeset marks it obsolete with no successors.
+
+Under the hood: Uncommit changes to certain files
+=================================================
+
+In one sense, ``uncommit`` is a simplified version of ``amend``. Like
+``amend``, it obsoletes one changeset and leaves it with a single
+successor. Unlike ``amend``, there is no ugly "temporary amend commit"
+cluttering up the repository.
+
+In another sense, ``uncommit`` is the inverse of ``amend``: ``amend``
+takes any uncommitted changes in the working dir and “adds”
+them to the working directory's parent changeset. (In reality, of
+course, it creates a successor changeset, marking the original
+obsolete.) In contrast, ``uncommit`` takes some changes in the working
+directory's parent and moves them to the working dir, creating a new
+successor changeset in the process. Figure 4 illustrates.
+
+.. figure:: figures/figure-ug04.svg
+
+   Figure 4: uncommit moves some of the changes from the working
+   directory parent into the working dir, preserving the remaining
+   changes as a new successor changeset. (N.B. revision 4 is not shown
+   here because it was marked obsolete in the previous example.)
+
+
+Under the hood: Fold multiple changesets together into one
+==========================================================
+
+The last basic example is folding multiple changesets into one, which
+marks multiple changesets obsolete, replacing them all with a single
+successor.
+
+.. figure:: figures/figure-ug05.svg
+
+   Figure 5: fold combines multiple changesets into a single
+   successor, marking the original (folded) changesets obsolete.
+
+
+Obsolete is not hidden
+======================
+
+So far, every obsolete changeset we have seen is also hidden. However,
+these are *not* the same thing—that's why they have different names.
+It's entirely possible to have obsolete changesets that are not
+hidden. We'll see examples of that soon, when we create *unstable*
+changesets.
+
+Note that all hidden changesets are obsolete: hidden is a subset of
+obsolete.
+
+
+Life with ``evolve`` (advanced usage)
+-------------------------------------
+
+Now that you've got a solid understanding of how ``evolve`` works in
+concert with changeset obsolescence, let's explore some more advanced
+scenarios. All of these scenarios will involve *unstable* changesets,
+which is an unavoidable consequence of obsolescence. What really sets
+``evolve`` apart from other history modification mechanisms is the
+fact that it recognizes troubles like unstable changesets and provides
+a consistent way for you to get out of trouble.
+
+(Incidentally, there are two other types of trouble that changesets
+can get into with ``evolve``: they may be *divergent* or *bumped*.
+Both of those states are more likely to occur when `sharing mutable
+history`_, so we won't see them in this user guide.)
+
+.. _`sharing mutable history`: sharing.html
+
+
+Example 7: Amend an older changeset
+===================================
+
+Sometimes you don't notice your mistakes until after you have
+committed new changesets on top of them. ::
+
+  $ hg commit -m 'fix bug 17'         # rev 11 (mistake here)
+  $ hg commit -m 'cleanup'            # rev 12
+  $ hg commit -m 'feature 23'         # rev 13
+
+Traditionally, your only option is to commit an "oops" changeset that
+fixes your mistake. That works, of course, but it makes you look bad:
+you made a mistake, and the record of that mistake is recorded in
+history for all eternity. (If the mistake was in the commit message,
+too bad: you cannot fix it.)
+
+More subtly, there now exist changesets that are *worse* than what
+came before—the code no longer builds, the tests don't pass, or
+similar. Anyone reviewing these patches will waste time on the error
+in the earlier patch, and then the correction later on.
+
+You can avoid all this by amending the bad changeset and *evolving*
+subsequent history. Here's how it works, assuming you have just
+committed revision 13 and noticed the mistake in revision 11::
+
+  $ hg update 11
+  [...fix mistake...]
+  $ hg amend
+
+At this point, revision 11 is *obsolete* and revisions 12 and 13—the
+descendants of 11—are in a funny state: they are *unstable*.
+
+.. figure:: figures/figure-ug06.svg
+
+   Figure 6: amending a changeset with descendants means the amended
+   changeset is obsolete but remains visible; its non-obsolete
+   descendants are *unstable*. The temporary amend commit, revision
+   14, is hidden because it has no non-obsolete descendants.
+
+All non-obsolete descendants of an obsolete changeset are unstable. An
+interesting consequence of this is that revision 11 is still visible,
+even though it is obsolete. Obsolete changesets with non-obsolete
+descendants are not hidden.
+
+The fix is to *evolve* history::
+
+  $ hg evolve --all
+
+This is a separate step, not automatically part of ``hg amend``,
+because there might be conflicts. If your amended changeset modifies a
+file that one of its descendants also modified, Mercurial has to fire
+up your merge tool to resolve the conflict. More importantly, you have
+to switch contexts from "writing code" to "resolving conflicts". That
+can be an expensive context switch, so Mercurial lets you decide when
+to do it.
+
+The end state, after ``evolve`` finishes, is that the original
+revisions (11-13) are obsolete and hidden. Their successor revisions
+(15-17) replace them.
+
+.. figure:: figures/figure-ug07.svg
+
+   Figure 7: evolve your repository (``hg evolve --all``) to take care
+   of instability. Unstable changesets become obsolete, and are
+   replaced by successors just like the amended changeset was.
+
+Example 8: Prune an older changeset
+===================================
+
+Let's say you've just committed the following changesets::
+
+  $ hg commit -m 'useful work'       # rev 18
+  $ hg commit -m 'debug hack'        # rev 19
+  $ hg commit -m 'more work'         # rev 20
+
+You want to drop revision 19, but keep 18 and 20. No problem::
+
+  $ hg prune 19
+  1 changesets pruned
+  1 new unstable changesets
+
+As above, this leaves your repository in a funny intermediate state:
+revision 20 is the non-obsolete descendant of obsolete revision 19.
+That is, revision 20 is unstable.
+
+.. figure:: figures/figure-ug08.svg
+
+   Figure 8: ``hg prune`` marks a changeset obsolete without creating
+   a successor. Just like with ``hg amend``, non-obsolete descendants
+   of the pruned changeset are now unstable.
+
+As before, the solution to unstable changesets is to evolve your
+repository::
+
+  $ hg evolve --all
+
+This rebases revision 20 on top of 18 as the new revision 21, leaving
+19 and 20 obsolete and hidden:
+
+.. figure:: figures/figure-ug09.svg
+
+   Figure 9: once again, ``hg evolve --all`` takes care of instability.
+
+Example 9: Uncommit files from an older changeset (discard changes)
+=======================================================================
+
+As in example 5, let's say you accidentally commit some unrelated
+changes together. Unlike example 5, you don't notice your mistake
+immediately, but commit a new changeset on top of the bad one. ::
+
+  $ echo 'this fixes bug 53' >> file1.c
+  $ echo 'debug hack' >> file2.c
+  $ hg commit -m 'fix bug 53'                     # rev 22 (oops)
+  $ echo 'and this handles bug 67' >> file1.c
+  $ hg commit -m 'fix bug 67'                     # rev 23 (fine)
+
+As with ``amend``, you need to travel back in time and repair revision
+22, leaving your changes to ``file2.c`` back in the working
+directory::
+
+  $ hg update 22
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg uncommit file2.c
+  1 new unstable changesets
+  $ hg status
+  M file2.c
+
+Now your repository has unstable changesets, so you need to evolve it.
+But ``hg evolve`` requires a clean working directory to resolve merge
+conflicts, so you need to decide what to do with ``file2.c``.
+
+In this case, the change to ``file2.c`` was a temporary debugging
+hack, so we can discard it and immediately evolve the instability away::
+
+  $ hg revert file2.c
+  $ hg evolve --all
+  move:[23] fix bug 67
+  atop:[24] fix bug 53
+
+Figure 10 illustrates the whole process.
+
+.. figure:: figures/figure-ug10.svg
+
+   Figure 10: ``hg uncommit`` of a changeset with descendants results
+   in instability *and* a dirty working directory, both of which must
+   be dealt with.
+
+
+Example 10: Uncommit files to an older changeset (keep changes)
+===================================================================
+
+This is very similar to example 9. The difference that this time, our
+change to ``file2.c`` is valuable enough to commit, making things a
+bit more complicated. The setup is nearly identical::
+
+  $ echo 'fix a bug' >> file1.c
+  $ echo 'useful but unrelated' >> file2.c
+  $ hg commit -u dan -d '11 0' -m 'fix a bug'     # rev 26 (oops)
+  $ echo 'new feature' >> file1.c
+  $ hg commit -u dan -d '12 0' -m 'new feature'   # rev 27 (fine)
+
+As before, we update back to the flawed changeset (this time,
+revision 26) and ``uncommit``, leaving uncommitted changes to
+``file2.c`` in the working dir::
+
+  $ hg update -q 26
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg uncommit -q file2.c                        # obsoletes rev 26, creates rev 28
+  1 new unstable changesets
+  $ hg status
+  M file2.c
+
+This time, let's save that useful change before evolving::
+
+  $ hg commit -m 'useful tweak'                   # rev 29
+
+Figure 11 shows the story so far: ``uncommit`` obsoleted revision 26
+and created revision 28, the successor of 26. Then we committed
+revision 29, a child of 28. We still have to deal with the unstable
+revision 27.
+
+.. figure:: figures/figure-ug11.svg
+
+   Figure 11: Uncommitting a file and then committing that change
+   separately will soon result in a two-headed repository.
+
+This is where things get tricky. As usual when a repository has
+unstable changesets, we want to evolve it::
+
+  $ hg evolve --all
+
+The problem is that ``hg evolve`` rebases revision 27 onto revision
+28, creating 30 (the successor of 27). This is entirely logical: 27
+was the child of 26, and 26's successor is 28. So of course 27's
+successor (30) should be the child of 26's successor (28).
+Unfortunately, that leaves us with a two-headed repository:
+
+.. figure:: figures/figure-ug12.svg
+
+   Figure 12: ``evolve`` takes care of unstable changesets; it does
+   not solve all the world's problems.
+
+As usual when faced with a two-headed repository, you can either merge
+or rebase. It's up to you.
+
+
+Example 11: Recover an obsolete changeset
+=========================================
+
+Sometimes you might obsolete a changeset, and then change your mind. You'll
+probably start looking for an “unobsolete” command to restore a changeset
+to normal state. For complicated implementation reasons, that command
+doesn't exist. (If you have already pushed an obsolescence marker to
+another repo, then Mercurial would need a way to revoke that remote
+obsolesence marker. That's a hard problem.)
+
+Instead, ``evolve`` provides a ``touch`` command to resurrect an
+obsolete changeset. An unexpected quirk: you almost certainly need to
+use ``--hidden``, since obsolete changesets tend to be hidden, and you
+can't reference a hidden changeset otherwise. Typical usage thus looks
+like ::
+
+  $ hg --hidden touch REV
+
+This creates a new, normal changeset which is the same as ``REV``—except
+with a different changeset ID. The new changeset will have the same parent
+as ``REV``, and will be a successor of ``REV``.
+
+The current implementation of ``hg touch`` is not ideal, and is likely to
+change in the future. Consider the history in Figure 12, where revision 27
+is obsolete and the child of 26, also obsolete. If we ``hg touch 27``, that
+creates a new revision which is a non-obsolete child of 26—i.e., it is
+unstable. It's also *divergent*, another type of trouble that we'll learn
+about in the `next section`_.
+
+.. _`next section`: sharing.html
deleted file mode 100755
--- a/enable.sh
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/bin/sh
-
-here=`python -c "import os; print os.path.realpath('$0')"`
-repo_root=`dirname "$here"`
-
-if !( hg --version -q | grep -qe 'version 2\.[2-9]' ); then
-    echo 'You need mercurial 2.2 or later' >&2
-    exit 2
-fi
-
-
-
-cat << EOF >&2
-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-XXX Add lines below to the [extensions] section of you hgrc XXX
-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-
-
-EOF
-
-cat << EOF | sed -e "s#XXXREPOPATHXXX#${repo_root}#"
-[extensions]
-### experimental extensions for history rewriting
-
-# obsolete relation support (will move in core)
-obsolete=XXXREPOPATHXXX/hgext/obsolete.py
-
-# history rewriting UI
-# needed by evolve
-hgext.rebase=
-evolve=XXXREPOPATHXXX/hgext/evolve.py
-
-
-[alias]
-### useful alias to check future amend result
-# equivalent to the qdiff command for mq
-
-# diff
-pdiff=diff --rev .^
-
-# status
-pstatus=status --rev .^
-
-# diff with the previous amend
-odiff=diff --rev 'limit(precursors(.),1)' --rev .
-EOF
-
-cat << EOF >&2
-
-
-### check qsync-enable.sh if your need mq export too.
-EOF
new file mode 100644
--- /dev/null
+++ b/hgext/__init__.py
@@ -0,0 +1,1 @@
+# Copyright 2011 Logilab SA <contact@logilab.fr>
new file mode 100644
--- /dev/null
+++ b/hgext/drophack.py
@@ -0,0 +1,162 @@
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+'''This extension add a hacky command to drop changeset during review
+
+This extension is intended as a temporary hack to allow Matt Mackall to use
+evolve in the Mercurial review it self. You should probably not use it if your
+name is not Matt Mackall.
+'''
+
+import os
+import time
+import contextlib
+
+from mercurial.i18n import _
+from mercurial import cmdutil
+from mercurial import repair
+from mercurial import scmutil
+from mercurial import lock as lockmod
+from mercurial import util
+from mercurial import commands
+
+cmdtable = {}
+command = cmdutil.command(cmdtable)
+
+
+@contextlib.contextmanager
+def timed(ui, caption):
+    ostart = os.times()
+    cstart = time.time()
+    yield
+    cstop = time.time()
+    ostop = os.times()
+    wall = cstop - cstart
+    user = ostop[0] - ostart[0]
+    sys  = ostop[1] - ostart[1]
+    comb = user + sys
+    ui.write("%s: wall %f comb %f user %f sys %f\n"
+             % (caption, wall, comb, user, sys))
+
+def obsmarkerchainfrom(obsstore, nodes):
+    """return all marker chain starting from node
+
+    Starting from mean "use as successors"."""
+    # XXX need something smarter for descendant of bumped changeset
+    seennodes = set(nodes)
+    seenmarkers = set()
+    pendingnodes = set(nodes)
+    precursorsmarkers = obsstore.precursors
+    while pendingnodes:
+        current = pendingnodes.pop()
+        new = set()
+        for precmark in precursorsmarkers.get(current, ()):
+            if precmark in seenmarkers:
+                continue
+            seenmarkers.add(precmark)
+            new.add(precmark[0])
+            yield precmark
+        new -= seennodes
+        pendingnodes |= new
+
+def stripmarker(ui, repo, markers):
+    """remove <markers> from the repo obsstore
+
+    The old obsstore content is saved in a `obsstore.prestrip` file
+    """
+    repo = repo.unfiltered()
+    repo.destroying()
+    oldmarkers = list(repo.obsstore._all)
+    util.rename(repo.sjoin('obsstore'),
+                repo.join('obsstore.prestrip'))
+    del repo.obsstore # drop the cache
+    newstore = repo.obsstore
+    assert not newstore # should be empty after rename
+    newmarkers = [m for m in oldmarkers if m not in markers]
+    tr = repo.transaction('drophack')
+    try:
+        newstore.add(tr, newmarkers)
+        tr.close()
+    finally:
+        tr.release()
+    repo.destroyed()
+
+
+@command('drop', [('r', 'rev', [], 'revision to update')], _('[-r] revs'))
+def cmddrop(ui, repo, *revs, **opts):
+    """I'm hacky do not use me!
+
+    This command strip a changeset, its precursors and all obsolescence marker
+    associated to its chain.
+
+    There is no way to limit the extend of the purge yet. You may have to
+    repull from other source to get some changeset and obsolescence marker
+    back.
+
+    This intended for Matt Mackall usage only. do not use me.
+    """
+    revs = list(revs)
+    revs.extend(opts['rev'])
+    if not revs:
+        revs = ['.']
+    # get the changeset
+    revs = scmutil.revrange(repo, revs)
+    if not revs:
+        ui.write_err('no revision to drop\n')
+        return 1
+    # lock from the beginning to prevent race
+    wlock = lock = None
+    try:
+        wlock = repo.wlock()
+        lock = repo.lock()
+        # check they have no children
+        if repo.revs('%ld and public()', revs):
+            ui.write_err('cannot drop public revision')
+            return 1
+        if repo.revs('children(%ld) - %ld', revs, revs):
+            ui.write_err('cannot drop revision with children')
+            return 1
+        if repo.revs('. and %ld', revs):
+            newrevs = repo.revs('max(::. - %ld)', revs)
+            if newrevs:
+                assert len(newrevs) == 1
+                newrev = newrevs.first()
+            else:
+                newrev = -1
+            commands.update(ui, repo, newrev)
+            ui.status(_('working directory now at %s\n') % repo[newrev])
+        # get all markers and successors up to root
+        nodes = [repo[r].node() for r in revs]
+        with timed(ui, 'search obsmarker'):
+            markers = set(obsmarkerchainfrom(repo.obsstore, nodes))
+        ui.write('%i obsmarkers found\n' % len(markers))
+        cl = repo.unfiltered().changelog
+        with timed(ui, 'search nodes'):
+            allnodes = set(nodes)
+            allnodes.update(m[0] for m in markers if cl.hasnode(m[0]))
+        ui.write('%i nodes found\n' % len(allnodes))
+        cl = repo.changelog
+        visiblenodes = set(n for n in allnodes if cl.hasnode(n))
+        # check constraint again
+        if repo.revs('%ln and public()', visiblenodes):
+            ui.write_err('cannot drop public revision')
+            return 1
+        if repo.revs('children(%ln) - %ln', visiblenodes, visiblenodes):
+            ui.write_err('cannot drop revision with children')
+            return 1
+
+        if markers:
+            # strip them
+            with timed(ui, 'strip obsmarker'):
+                stripmarker(ui, repo, markers)
+        # strip the changeset
+        with timed(ui, 'strip nodes'):
+            repair.strip(ui, repo, list(allnodes), backup="all", topic='drophack')
+
+    finally:
+        lockmod.release(lock, wlock)
+
+    # rewrite the whole file.
+    # print data.
+    # - time to compute the chain
+    # - time to strip the changeset
+    # - time to strip the obs marker.
--- a/hgext/evolve.py
+++ b/hgext/evolve.py
@@ -1,38 +1,700 @@
-# states.py - introduce the state concept for mercurial changeset
-#
 # Copyright 2011 Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
 #                Logilab SA        <contact@logilab.fr>
 #                Pierre-Yves David <pierre-yves.david@ens-lyon.org>
+#                Patrick Mezard <patrick@mezard.eu>
 #
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2 or any later version.
 
-'''a set of commands to handle changeset mutation'''
-
+'''extends Mercurial feature related to Changeset Evolution
+
+This extension provides several commands to mutate history and deal with
+issues it may raise.
+
+It also:
+
+    - enables the "Changeset Obsolescence" feature of mercurial,
+    - alters core commands and extensions that rewrite history to use
+      this feature,
+    - improves some aspect of the early implementation in Mercurial core
+'''
+
+__version__ = '5.1.5'
+testedwith = '3.3.3 3.4.1'
+buglink = 'http://bz.selenic.com/'
+
+import sys, os
+import random
+from StringIO import StringIO
+import struct
+import re
+import socket
+import errno
+sha1re = re.compile(r'\b[0-9a-f]{6,40}\b')
+
+import mercurial
+from mercurial import util
+
+try:
+    from mercurial import obsolete
+    if not obsolete._enabled:
+        obsolete._enabled = True
+    from mercurial import wireproto
+    gboptslist = getattr(wireproto, 'gboptslist', None)
+    gboptsmap = getattr(wireproto, 'gboptsmap', None)
+except (ImportError, AttributeError):
+    gboptslist = gboptsmap = None
+
+
+from mercurial import bookmarks
 from mercurial import cmdutil
-from mercurial import scmutil
-from mercurial import node
-from mercurial import error
-from mercurial import extensions
-from mercurial import commands
-from mercurial import bookmarks
-from mercurial import phases
 from mercurial import commands
 from mercurial import context
 from mercurial import copies
-from mercurial import util
+from mercurial import error
+from mercurial import exchange
+from mercurial import extensions
+from mercurial import httppeer
+from mercurial import hg
+from mercurial import lock as lockmod
+from mercurial import merge
+from mercurial import node
+from mercurial import phases
+from mercurial import patch
+from mercurial import revset
+from mercurial import scmutil
+from mercurial import templatekw
 from mercurial.i18n import _
-from mercurial.commands import walkopts, commitopts, commitopts2, logopts
-from mercurial import hg
+from mercurial.commands import walkopts, commitopts, commitopts2, mergetoolopts
+from mercurial.node import nullid
+from mercurial import wireproto
+from mercurial import localrepo
+from mercurial.hgweb import hgweb_mod
+
+cmdtable = {}
+command = cmdutil.command(cmdtable)
+
+_pack = struct.pack
+
+if gboptsmap is not None:
+    memfilectx = context.memfilectx
+elif gboptslist is not None:
+    oldmemfilectx = context.memfilectx
+    def memfilectx(repo, *args, **kwargs):
+        return oldmemfilectx(*args, **kwargs)
+else:
+    raise ImportError('evolve needs version %s or above' % min(testedwith.split()))
+
+aliases, entry = cmdutil.findcmd('commit', commands.table)
+hasinteractivemode = any(['interactive' in e for e in entry[1]])
+if hasinteractivemode:
+    interactiveopt = [['i', 'interactive', None, _('use interactive mode')]]
+else:
+    interactiveopt = []
+# This extension contains the following code
+#
+# - Extension Helper code
+# - Obsolescence cache
+# - ...
+# - Older format compat
+
+
+#####################################################################
+### Extension helper                                              ###
+#####################################################################
+
+class exthelper(object):
+    """Helper for modular extension setup
+
+    A single helper should be instanciated for each extension. Helper
+    methods are then used as decorator for various purpose.
+
+    All decorators return the original function and may be chained.
+    """
+
+    def __init__(self):
+        self._uicallables = []
+        self._extcallables = []
+        self._repocallables = []
+        self._revsetsymbols = []
+        self._templatekws = []
+        self._commandwrappers = []
+        self._extcommandwrappers = []
+        self._functionwrappers = []
+        self._duckpunchers = []
+
+    def final_uisetup(self, ui):
+        """Method to be used as the extension uisetup
+
+        The following operations belong here:
+
+        - Changes to ui.__class__ . The ui object that will be used to run the
+          command has not yet been created. Changes made here will affect ui
+          objects created after this, and in particular the ui that will be
+          passed to runcommand
+        - Command wraps (extensions.wrapcommand)
+        - Changes that need to be visible to other extensions: because
+          initialization occurs in phases (all extensions run uisetup, then all
+          run extsetup), a change made here will be visible to other extensions
+          during extsetup
+        - Monkeypatch or wrap function (extensions.wrapfunction) of dispatch
+          module members
+        - Setup of pre-* and post-* hooks
+        - pushkey setup
+        """
+        for cont, funcname, func in self._duckpunchers:
+            setattr(cont, funcname, func)
+        for command, wrapper in self._commandwrappers:
+            extensions.wrapcommand(commands.table, command, wrapper)
+        for cont, funcname, wrapper in self._functionwrappers:
+            extensions.wrapfunction(cont, funcname, wrapper)
+        for c in self._uicallables:
+            c(ui)
+
+    def final_extsetup(self, ui):
+        """Method to be used as a the extension extsetup
+
+        The following operations belong here:
+
+        - Changes depending on the status of other extensions. (if
+          extensions.find('mq'))
+        - Add a global option to all commands
+        - Register revset functions
+        """
+        knownexts = {}
+        for name, symbol in self._revsetsymbols:
+            revset.symbols[name] = symbol
+        for name, kw in self._templatekws:
+            templatekw.keywords[name] = kw
+        for ext, command, wrapper in self._extcommandwrappers:
+            if ext not in knownexts:
+                e = extensions.find(ext)
+                if e is None:
+                    raise util.Abort('extension %s not found' % ext)
+                knownexts[ext] = e.cmdtable
+            extensions.wrapcommand(knownexts[ext], commands, wrapper)
+        for c in self._extcallables:
+            c(ui)
+
+    def final_reposetup(self, ui, repo):
+        """Method to be used as a the extension reposetup
+
+        The following operations belong here:
+
+        - All hooks but pre-* and post-*
+        - Modify configuration variables
+        - Changes to repo.__class__, repo.dirstate.__class__
+        """
+        for c in self._repocallables:
+            c(ui, repo)
+
+    def uisetup(self, call):
+        """Decorated function will be executed during uisetup
+
+        example::
+
+            @eh.uisetup
+            def setupbabar(ui):
+                print 'this is uisetup!'
+        """
+        self._uicallables.append(call)
+        return call
+
+    def extsetup(self, call):
+        """Decorated function will be executed during extsetup
+
+        example::
+
+            @eh.extsetup
+            def setupcelestine(ui):
+                print 'this is extsetup!'
+        """
+        self._extcallables.append(call)
+        return call
+
+    def reposetup(self, call):
+        """Decorated function will be executed during reposetup
+
+        example::
+
+            @eh.reposetup
+            def setupzephir(ui, repo):
+                print 'this is reposetup!'
+        """
+        self._repocallables.append(call)
+        return call
+
+    def revset(self, symbolname):
+        """Decorated function is a revset symbol
+
+        The name of the symbol must be given as the decorator argument.
+        The symbol is added during `extsetup`.
+
+        example::
+
+            @eh.revset('hidden')
+            def revsetbabar(repo, subset, x):
+                args = revset.getargs(x, 0, 0, 'babar accept no argument')
+                return [r for r in subset if 'babar' in repo[r].description()]
+        """
+        def dec(symbol):
+            self._revsetsymbols.append((symbolname, symbol))
+            return symbol
+        return dec
+
+
+    def templatekw(self, keywordname):
+        """Decorated function is a template keyword
+
+        The name of the keyword must be given as the decorator argument.
+        The symbol is added during `extsetup`.
+
+        example::
+
+            @eh.templatekw('babar')
+            def kwbabar(ctx):
+                return 'babar'
+        """
+        def dec(keyword):
+            self._templatekws.append((keywordname, keyword))
+            return keyword
+        return dec
+
+    def wrapcommand(self, command, extension=None):
+        """Decorated function is a command wrapper
+
+        The name of the command must be given as the decorator argument.
+        The wrapping is installed during `uisetup`.
+
+        If the second option `extension` argument is provided, the wrapping
+        will be applied in the extension commandtable. This argument must be a
+        string that will be searched using `extension.find` if not found and
+        Abort error is raised. If the wrapping applies to an extension, it is
+        installed during `extsetup`
+
+        example::
+
+            @eh.wrapcommand('summary')
+            def wrapsummary(orig, ui, repo, *args, **kwargs):
+                ui.note('Barry!')
+                return orig(ui, repo, *args, **kwargs)
+
+        """
+        def dec(wrapper):
+            if extension is None:
+                self._commandwrappers.append((command, wrapper))
+            else:
+                self._extcommandwrappers.append((extension, command, wrapper))
+            return wrapper
+        return dec
+
+    def wrapfunction(self, container, funcname):
+        """Decorated function is a function wrapper
+
+        This function takes two arguments, the container and the name of the
+        function to wrap. The wrapping is performed during `uisetup`.
+        (there is no extension support)
+
+        example::
+
+            @eh.function(discovery, 'checkheads')
+            def wrapfunction(orig, *args, **kwargs):
+                ui.note('His head smashed in and his heart cut out')
+                return orig(*args, **kwargs)
+        """
+        def dec(wrapper):
+            self._functionwrappers.append((container, funcname, wrapper))
+            return wrapper
+        return dec
+
+    def addattr(self, container, funcname):
+        """Decorated function is to be added to the container
+
+        This function takes two arguments, the container and the name of the
+        function to wrap. The wrapping is performed during `uisetup`.
+
+        example::
+
+            @eh.function(context.changectx, 'babar')
+            def babar(ctx):
+                return 'babar' in ctx.description
+        """
+        def dec(func):
+            self._duckpunchers.append((container, funcname, func))
+            return func
+        return dec
+
+eh = exthelper()
+uisetup = eh.final_uisetup
+extsetup = eh.final_extsetup
+reposetup = eh.final_reposetup
+
+#####################################################################
+### experimental behavior                                         ###
+#####################################################################
+
+commitopts3 = [
+    ('D', 'current-date', None,
+     _('record the current date as commit date')),
+    ('U', 'current-user', None,
+     _('record the current user as committer')),
+]
+
+def _resolveoptions(ui, opts):
+    """modify commit options dict to handle related options
+
+    For now, all it does is figure out the commit date: respect -D unless
+    -d was supplied.
+    """
+    # N.B. this is extremely similar to setupheaderopts() in mq.py
+    if not opts.get('date') and opts.get('current_date'):
+        opts['date'] = '%d %d' % util.makedate()
+    if not opts.get('user') and opts.get('current_user'):
+        opts['user'] = ui.username()
+
+getrevs = obsolete.getrevs
+
+#####################################################################
+### Additional Utilities                                          ###
+#####################################################################
+
+# This section contains a lot of small utility function and method
+
+# - Function to create markers
+# - useful alias pstatus and pdiff (should probably go in evolve)
+# - "troubles" method on changectx
+# - function to travel throught the obsolescence graph
+# - function to find useful changeset to stabilize
+
+
+### Useful alias
+
+@eh.uisetup
+def _installalias(ui):
+    if ui.config('alias', 'pstatus', None) is None:
+        ui.setconfig('alias', 'pstatus', 'status --rev .^')
+    if ui.config('alias', 'pdiff', None) is None:
+        ui.setconfig('alias', 'pdiff', 'diff --rev .^')
+    if ui.config('alias', 'olog', None) is None:
+        ui.setconfig('alias', 'olog', "log -r 'precursors(.)' --hidden")
+    if ui.config('alias', 'odiff', None) is None:
+        ui.setconfig('alias', 'odiff',
+            "diff --hidden --rev 'limit(precursors(.),1)' --rev .")
+    if ui.config('alias', 'grab', None) is None:
+        if os.name == 'nt':
+            ui.setconfig('alias', 'grab',
+                "! " + util.hgexecutable() + " rebase --dest . --rev $@ && "
+                 + util.hgexecutable() + " up tip")
+        else:
+            ui.setconfig('alias', 'grab',
+                "! $HG rebase --dest . --rev $@ && $HG up tip")
+
+
+### Troubled revset symbol
+
+@eh.revset('troubled')
+def revsettroubled(repo, subset, x):
+    """``troubled()``
+    Changesets with troubles.
+    """
+    revset.getargs(x, 0, 0, 'troubled takes no arguments')
+    troubled = set()
+    troubled.update(getrevs(repo, 'unstable'))
+    troubled.update(getrevs(repo, 'bumped'))
+    troubled.update(getrevs(repo, 'divergent'))
+    troubled = revset.baseset(troubled)
+    troubled.sort() # set is non-ordered, enforce order
+    return subset & troubled
+
+### Obsolescence graph
+
+# XXX SOME MAJOR CLEAN UP TO DO HERE XXX
+
+def _precursors(repo, s):
+    """Precursor of a changeset"""
+    cs = set()
+    nm = repo.changelog.nodemap
+    markerbysubj = repo.obsstore.precursors
+    node = repo.changelog.node
+    for r in s:
+        for p in markerbysubj.get(node(r), ()):
+            pr = nm.get(p[0])
+            if pr is not None:
+                cs.add(pr)
+    cs -= repo.changelog.filteredrevs # nodemap has no filtering
+    return cs
+
+def _allprecursors(repo, s):  # XXX we need a better naming
+    """transitive precursors of a subset"""
+    node = repo.changelog.node
+    toproceed = [node(r) for r in s]
+    seen = set()
+    allsubjects = repo.obsstore.precursors
+    while toproceed:
+        nc = toproceed.pop()
+        for mark in allsubjects.get(nc, ()):
+            np = mark[0]
+            if np not in seen:
+                seen.add(np)
+                toproceed.append(np)
+    nm = repo.changelog.nodemap
+    cs = set()
+    for p in seen:
+        pr = nm.get(p)
+        if pr is not None:
+            cs.add(pr)
+    cs -= repo.changelog.filteredrevs # nodemap has no filtering
+    return cs
+
+def _successors(repo, s):
+    """Successors of a changeset"""
+    cs = set()
+    node = repo.changelog.node
+    nm = repo.changelog.nodemap
+    markerbyobj = repo.obsstore.successors
+    for r in s:
+        for p in markerbyobj.get(node(r), ()):
+            for sub in p[1]:
+                sr = nm.get(sub)
+                if sr is not None:
+                    cs.add(sr)
+    cs -= repo.changelog.filteredrevs # nodemap has no filtering
+    return cs
+
+def _allsuccessors(repo, s, haltonflags=0):  # XXX we need a better naming
+    """transitive successors of a subset
+
+    haltonflags allows to provide flags which prevent the evaluation of a
+    marker.  """
+    node = repo.changelog.node
+    toproceed = [node(r) for r in s]
+    seen = set()
+    allobjects = repo.obsstore.successors
+    while toproceed:
+        nc = toproceed.pop()
+        for mark in allobjects.get(nc, ()):
+            if mark[2] & haltonflags:
+                continue
+            for sub in mark[1]:
+                if sub == nullid:
+                    continue # should not be here!
+                if sub not in seen:
+                    seen.add(sub)
+                    toproceed.append(sub)
+    nm = repo.changelog.nodemap
+    cs = set()
+    for s in seen:
+        sr = nm.get(s)
+        if sr is not None:
+            cs.add(sr)
+    cs -= repo.changelog.filteredrevs # nodemap has no filtering
+    return cs
+
+
+
+
+#####################################################################
+### Extending revset and template                                 ###
+#####################################################################
+
+# this section add several useful revset symbol not yet in core.
+# they are subject to changes
+
+
+### XXX I'm not sure this revset is useful
+@eh.revset('suspended')
+def revsetsuspended(repo, subset, x):
+    """``suspended()``
+    Obsolete changesets with non-obsolete descendants.
+    """
+    revset.getargs(x, 0, 0, 'suspended takes no arguments')
+    suspended = revset.baseset(getrevs(repo, 'suspended'))
+    suspended.sort()
+    return subset & suspended
+
+
+@eh.revset('precursors')
+def revsetprecursors(repo, subset, x):
+    """``precursors(set)``
+    Immediate precursors of changesets in set.
+    """
+    s = revset.getset(repo, revset.fullreposet(repo), x)
+    s = revset.baseset(_precursors(repo, s))
+    s.sort()
+    return subset & s
+
+
+@eh.revset('allprecursors')
+def revsetallprecursors(repo, subset, x):
+    """``allprecursors(set)``
+    Transitive precursors of changesets in set.
+    """
+    s = revset.getset(repo, revset.fullreposet(repo), x)
+    s = revset.baseset(_allprecursors(repo, s))
+    s.sort()
+    return subset & s
+
+
+@eh.revset('successors')
+def revsetsuccessors(repo, subset, x):
+    """``successors(set)``
+    Immediate successors of changesets in set.
+    """
+    s = revset.getset(repo, revset.fullreposet(repo), x)
+    s = revset.baseset(_successors(repo, s))
+    s.sort()
+    return subset & s
+
+@eh.revset('allsuccessors')
+def revsetallsuccessors(repo, subset, x):
+    """``allsuccessors(set)``
+    Transitive successors of changesets in set.
+    """
+    s = revset.getset(repo, revset.fullreposet(repo), x)
+    s = revset.baseset(_allsuccessors(repo, s))
+    s.sort()
+    return subset & s
+
+### template keywords
+# XXX it does not handle troubles well :-/
+
+@eh.templatekw('obsolete')
+def obsoletekw(repo, ctx, templ, **args):
+    """:obsolete: String. The obsolescence level of the node, could be
+    ``stable``, ``unstable``, ``suspended`` or ``extinct``.
+    """
+    if ctx.obsolete():
+        if ctx.extinct():
+            return 'extinct'
+        else:
+            return 'suspended'
+    elif ctx.unstable():
+        return 'unstable'
+    return 'stable'
+
+@eh.templatekw('troubles')
+def showtroubles(repo, ctx, **args):
+    """:troubles: List of strings. Evolution troubles affecting the changeset
+    (zero or more of "unstable", "divergent" or "bumped")."""
+    return templatekw.showlist('trouble', ctx.troubles(), plural='troubles',
+                               **args)
+
+#####################################################################
+### Various trouble warning                                       ###
+#####################################################################
+
+# This section take care of issue warning to the user when troubles appear
+
+@eh.wrapcommand("update")
+@eh.wrapcommand("parents")
+@eh.wrapcommand("pull")
+def wrapmayobsoletewc(origfn, ui, repo, *args, **opts):
+    """Warn that the working directory parent is an obsolete changeset"""
+    res = origfn(ui, repo, *args, **opts)
+    if repo['.'].obsolete():
+        ui.warn(_('working directory parent is obsolete!\n'))
+    return res
+
+# XXX this could wrap transaction code
+# XXX (but this is a bit a layer violation)
+@eh.wrapcommand("commit")
+@eh.wrapcommand("import")
+@eh.wrapcommand("push")
+@eh.wrapcommand("pull")
+@eh.wrapcommand("graft")
+@eh.wrapcommand("phase")
+@eh.wrapcommand("unbundle")
+def warnobserrors(orig, ui, repo, *args, **kwargs):
+    """display warning is the command resulted in more instable changeset"""
+    # part of the troubled stuff may be filtered (stash ?)
+    # This needs a better implementation but will probably wait for core.
+    filtered = repo.changelog.filteredrevs
+    priorunstables = len(set(getrevs(repo, 'unstable')) - filtered)
+    priorbumpeds = len(set(getrevs(repo, 'bumped')) - filtered)
+    priordivergents = len(set(getrevs(repo, 'divergent')) - filtered)
+    ret = orig(ui, repo, *args, **kwargs)
+    # workaround phase stupidity
+    #phases._filterunknown(ui, repo.changelog, repo._phasecache.phaseroots)
+    filtered = repo.changelog.filteredrevs
+    newunstables = \
+        len(set(getrevs(repo, 'unstable')) - filtered) - priorunstables
+    newbumpeds = \
+        len(set(getrevs(repo, 'bumped')) - filtered) - priorbumpeds
+    newdivergents = \
+        len(set(getrevs(repo, 'divergent')) - filtered) - priordivergents
+    if newunstables > 0:
+        ui.warn(_('%i new unstable changesets\n') % newunstables)
+    if newbumpeds > 0:
+        ui.warn(_('%i new bumped changesets\n') % newbumpeds)
+    if newdivergents > 0:
+        ui.warn(_('%i new divergent changesets\n') % newdivergents)
+    return ret
+
+@eh.wrapfunction(mercurial.exchange, 'push')
+def push(orig, repo, *args, **opts):
+    """Add a hint for "hg evolve" when troubles make push fails
+    """
+    try:
+        return orig(repo, *args, **opts)
+    except util.Abort, ex:
+        hint = _("use 'hg evolve' to get a stable history "
+                 "or --force to ignore warnings")
+        if (len(ex.args) >= 1
+            and ex.args[0].startswith('push includes ')
+            and ex.hint is None):
+            ex.hint = hint
+        raise
+
+def summaryhook(ui, repo):
+    def write(fmt, count):
+        s = fmt % count
+        if count:
+            ui.write(s)
+        else:
+            ui.note(s)
+
+    nbunstable = len(getrevs(repo, 'unstable'))
+    nbbumped = len(getrevs(repo, 'bumped'))
+    nbdivergent = len(getrevs(repo, 'divergent'))
+    write('unstable: %i changesets\n', nbunstable)
+    write('bumped: %i changesets\n', nbbumped)
+    write('divergent: %i changesets\n', nbdivergent)
+
+@eh.extsetup
+def obssummarysetup(ui):
+    cmdutil.summaryhooks.add('evolve', summaryhook)
+
+
+#####################################################################
+### Core Other extension compat                                   ###
+#####################################################################
+
+
+@eh.extsetup
+def _rebasewrapping(ui):
+    # warning about more obsolete
+    try:
+        rebase = extensions.find('rebase')
+        if rebase:
+            extensions.wrapcommand(rebase.cmdtable, 'rebase', warnobserrors)
+    except KeyError:
+        pass  # rebase not found
+    try:
+        histedit = extensions.find('histedit')
+        if histedit:
+            extensions.wrapcommand(histedit.cmdtable, 'histedit', warnobserrors)
+    except KeyError:
+        pass  # rebase not found
+
+#####################################################################
+### Old Evolve extension content                                  ###
+#####################################################################
+
+# XXX need clean up and proper sorting in other section
 
 ### util function
 #############################
 
-def noderange(repo, revsets):
-    """The same as revrange but return node"""
-    return map(repo.changelog.node,
-               scmutil.revrange(repo, revsets))
-
 ### changeset rewriting logic
 #############################
 
@@ -47,253 +709,926 @@
     base = old.p1()
     updatebookmarks = _bookmarksupdater(repo, old.node())
 
-    wlock = repo.wlock()
-    try:
-
-        # commit a new version of the old changeset, including the update
-        # collect all files which might be affected
-        files = set(old.files())
-        for u in updates:
-            files.update(u.files())
-
-        # Recompute copies (avoid recording a -> b -> a)
-        copied = copies.pathcopies(base, head)
-
-
-        # prune files which were reverted by the updates
-        def samefile(f):
-            if f in head.manifest():
-                a = head.filectx(f)
-                if f in base.manifest():
-                    b = base.filectx(f)
-                    return (a.data() == b.data()
-                            and a.flags() == b.flags())
-                else:
-                    return False
+    # commit a new version of the old changeset, including the update
+    # collect all files which might be affected
+    files = set(old.files())
+    for u in updates:
+        files.update(u.files())
+
+    # Recompute copies (avoid recording a -> b -> a)
+    copied = copies.pathcopies(base, head)
+
+
+    # prune files which were reverted by the updates
+    def samefile(f):
+        if f in head.manifest():
+            a = head.filectx(f)
+            if f in base.manifest():
+                b = base.filectx(f)
+                return (a.data() == b.data()
+                        and a.flags() == b.flags())
             else:
-                return f not in base.manifest()
-        files = [f for f in files if not samefile(f)]
-        # commit version of these files as defined by head
-        headmf = head.manifest()
-        def filectxfn(repo, ctx, path):
-            if path in headmf:
-                fctx = head[path]
-                flags = fctx.flags()
-                mctx = context.memfilectx(fctx.path(), fctx.data(),
-                                          islink='l' in flags,
-                                          isexec='x' in flags,
-                                          copied=copied.get(path))
-                return mctx
-            raise IOError()
-        if commitopts.get('message') and commitopts.get('logfile'):
-            raise util.Abort(_('options --message and --logfile are mutually'
-                               ' exclusive'))
-        if commitopts.get('logfile'):
-            message= open(commitopts['logfile']).read()
-        elif commitopts.get('message'):
-            message = commitopts['message']
+                return False
         else:
-            message = old.description()
-
-        user = commitopts.get('user') or old.user()
-        date = commitopts.get('date') or None # old.date()
-        extra = dict(commitopts.get('extra', {}))
-        extra['branch'] = head.branch()
-
-        new = context.memctx(repo,
-                             parents=newbases,
-                             text=message,
-                             files=files,
-                             filectxfn=filectxfn,
-                             user=user,
-                             date=date,
-                             extra=extra)
-
-        if commitopts.get('edit'):
-            new._text = cmdutil.commitforceeditor(repo, new, [])
-        revcount = len(repo)
-        newid = repo.commitctx(new)
-        new = repo[newid]
-        created = len(repo) != revcount
-        if created:
-            updatebookmarks(newid)
-            # add evolution metadata
-            collapsed = set([u.node() for u in updates] + [old.node()])
-            repo.addcollapsedobsolete(collapsed, new.node())
-        else:
-            # newid is an existing revision. It could make sense to
-            # replace revisions with existing ones but probably not by
-            # default.
-            pass
-    finally:
-        wlock.release()
+            return f not in base.manifest()
+    files = [f for f in files if not samefile(f)]
+    # commit version of these files as defined by head
+    headmf = head.manifest()
+    def filectxfn(repo, ctx, path):
+        if path in headmf:
+            fctx = head[path]
+            flags = fctx.flags()
+            mctx = memfilectx(repo, fctx.path(), fctx.data(),
+                              islink='l' in flags,
+                              isexec='x' in flags,
+                              copied=copied.get(path))
+            return mctx
+        return None
+
+    message = cmdutil.logmessage(repo.ui, commitopts)
+    if not message:
+        message = old.description()
+
+    user = commitopts.get('user') or old.user()
+    date = commitopts.get('date') or None # old.date()
+    extra = dict(commitopts.get('extra', {}))
+    extra['branch'] = head.branch()
+
+    new = context.memctx(repo,
+                         parents=newbases,
+                         text=message,
+                         files=files,
+                         filectxfn=filectxfn,
+                         user=user,
+                         date=date,
+                         extra=extra)
+
+    if commitopts.get('edit'):
+        new._text = cmdutil.commitforceeditor(repo, new, [])
+    revcount = len(repo)
+    newid = repo.commitctx(new)
+    new = repo[newid]
+    created = len(repo) != revcount
+    updatebookmarks(newid)
 
     return newid, created
 
-def relocate(repo, orig, dest):
+class MergeFailure(util.Abort):
+    pass
+
+def relocate(repo, orig, dest, keepbranch=False):
     """rewrite <rev> on dest"""
+    if orig.rev() == dest.rev():
+        raise util.Abort(_('tried to relocate a node on top of itself'),
+                         hint=_("This shouldn't happen. If you still "
+                                "need to move changesets, please do so "
+                                "manually with nothing to rebase - working "
+                                "directory parent is also destination"))
+
+    if not orig.p2().rev() == node.nullrev:
+        raise util.Abort(
+            'no support for evolving merge changesets yet',
+            hint="Redo the merge and use `hg prune <old> --succ <new>` to obsolete the old one")
+    destbookmarks = repo.nodebookmarks(dest.node())
+    nodesrc = orig.node()
+    destphase = repo[nodesrc].phase()
+    commitmsg = orig.description()
+
+    cache = {}
+    sha1s = re.findall(sha1re, commitmsg)
+    unfi = repo.unfiltered()
+    for sha1 in sha1s:
+        ctx = None
+        try:
+            ctx = unfi[sha1]
+        except error.RepoLookupError:
+            continue
+
+        if not ctx.obsolete():
+            continue
+
+        successors = obsolete.successorssets(repo, ctx.node(), cache)
+
+        # We can't make any assumptions about how to update the hash if the
+        # cset in question was split or diverged.
+        if len(successors) == 1 and len(successors[0]) == 1:
+            newsha1 = node.hex(successors[0][0])
+            commitmsg = commitmsg.replace(sha1, newsha1[:len(sha1)])
+        else:
+            repo.ui.note(_('The stale commit message reference to %s could '
+                           'not be updated\n') % sha1)
+
+    tr = repo.transaction('relocate')
     try:
-        rebase = extensions.find('rebase')
-        # dummy state to trick rebase node
-        assert orig.p2().rev() == node.nullrev, 'no support yet'
-        destbookmarks = repo.nodebookmarks(dest.node())
-        cmdutil.duplicatecopies(repo, orig.node(), dest.node())
-        nodesrc = orig.node()
-        destphase = repo[nodesrc].phase()
-        if rebase.rebasenode.func_code.co_argcount == 5:
-            # rebasenode collapse argument was introduced by
-            # d1afbf03e69a (2.3)
-            rebase.rebasenode(repo, orig.node(), dest.node(),
-                              {node.nullrev: node.nullrev}, False)
-        else:
-            rebase.rebasenode(repo, orig.node(), dest.node(),
-                              {node.nullrev: node.nullrev})
         try:
-            nodenew = rebase.concludenode(repo, orig.node(), dest.node(),
-                                          node.nullid)
-        except util.Abort:
-            repo.ui.write_err(_('/!\\ stabilize failed                          /!\\\n'))
-            repo.ui.write_err(_('/!\\ Their is no "hg stabilize --continue"     /!\\\n'))
-            repo.ui.write_err(_('/!\\ use "hg up -C . ; hg stabilize --dry-run" /!\\\n'))
+            if repo['.'].rev() != dest.rev():
+                merge.update(repo, dest, False, True, False)
+            if bmactive(repo):
+                repo.ui.status(_("(leaving bookmark %s)\n") % bmactive(repo))
+            bmdeactivate(repo)
+            if keepbranch:
+                repo.dirstate.setbranch(orig.branch())
+            r = merge.graft(repo, orig, orig.p1(), ['local', 'graft'])
+            if r[-1]:  #some conflict
+                raise util.Abort(
+                        'unresolved merge conflicts (see hg help resolve)')
+            if commitmsg is None:
+                commitmsg = orig.description()
+            extra = {'rebase_source': orig.hex()}
+
+            backup = repo.ui.backupconfig('phases', 'new-commit')
+            try:
+                targetphase = max(orig.phase(), phases.draft)
+                repo.ui.setconfig('phases', 'new-commit', targetphase, 'rebase')
+                # Commit might fail if unresolved files exist
+                nodenew = repo.commit(text=commitmsg, user=orig.user(),
+                                      date=orig.date(), extra=extra)
+            finally:
+                repo.ui.restoreconfig(backup)
+        except util.Abort, exc:
+            repo.dirstate.beginparentchange()
+            repo.setparents(repo['.'].node(), nullid)
+            repo.dirstate.write()
+            # fix up dirstate for copies and renames
+            copies.duplicatecopies(repo, dest.rev(), orig.p1().rev())
+            repo.dirstate.endparentchange()
+            class LocalMergeFailure(MergeFailure, exc.__class__):
+                pass
+            exc.__class__ = LocalMergeFailure
             raise
         oldbookmarks = repo.nodebookmarks(nodesrc)
         if nodenew is not None:
-            phases.retractboundary(repo, destphase, [nodenew])
-            repo.addobsolete(nodenew, nodesrc)
+            phases.retractboundary(repo, tr, destphase, [nodenew])
+            obsolete.createmarkers(repo, [(repo[nodesrc], (repo[nodenew],))])
             for book in oldbookmarks:
                 repo._bookmarks[book] = nodenew
         else:
-            repo.addobsolete(node.nullid, nodesrc)
+            obsolete.createmarkers(repo, [(repo[nodesrc], ())])
             # Behave like rebase, move bookmarks to dest
             for book in oldbookmarks:
                 repo._bookmarks[book] = dest.node()
         for book in destbookmarks: # restore bookmark that rebase move
             repo._bookmarks[book] = dest.node()
         if oldbookmarks or destbookmarks:
-            bookmarks.write(repo)
-    except util.Abort:
-        # Invalidate the previous setparents
-        repo.dirstate.invalidate()
-        raise
-
-def stabilizableunstable(repo, pctx):
-    """Return a changectx for an unstable changeset which can be
-    stabilized on top of pctx or one of its descendants. None if none
-    can be found.
-    """
-    def selfanddescendants(repo, pctx):
-        yield pctx
-        for ctx in pctx.descendants():
-            yield ctx
-
-    # Look for an unstable which can be stabilized as a child of
-    # node. The unstable must be a child of one of node predecessors.
-    for ctx in selfanddescendants(repo, pctx):
-        unstables = list(repo.set('unstable() and children(obsancestors(%d))',
-                                  ctx.rev()))
-        if unstables:
-            return unstables[0]
-    return None
+            repo._bookmarks.write()
+        tr.close()
+    finally:
+        tr.release()
+    return nodenew
 
 def _bookmarksupdater(repo, oldid):
     """Return a callable update(newid) updating the current bookmark
     and bookmarks bound to oldid to newid.
     """
-    bm = bookmarks.readcurrent(repo)
     def updatebookmarks(newid):
         dirty = False
-        if bm:
-            repo._bookmarks[bm] = newid
-            dirty = True
         oldbookmarks = repo.nodebookmarks(oldid)
         if oldbookmarks:
             for b in oldbookmarks:
                 repo._bookmarks[b] = newid
             dirty = True
         if dirty:
-            bookmarks.write(repo)
+            repo._bookmarks.write()
     return updatebookmarks
 
+### bookmarks api compatibility layer ###
+def bmdeactivate(repo):
+    try:
+        return bookmarks.deactivate(repo)
+    except AttributeError:
+        return bookmarks.unsetcurrent(repo)
+def bmactivate(repo, book):
+    try:
+        return bookmarks.activate(repo, book)
+    except AttributeError:
+        return bookmarks.setcurrent(repo, book)
+
+def bmactive(repo):
+    try:
+        return repo._activebookmark
+    except AttributeError:
+        return repo._bookmarkcurrent
+
 ### new command
 #############################
-cmdtable = {}
-command = cmdutil.command(cmdtable)
-
-@command('^stabilize|evolve|solve',
-    [('n', 'dry-run', False, 'do not perform actions, print what to be done'),
-    ('A', 'any', False, 'stabilize any unstable changeset'),],
+metadataopts = [
+    ('d', 'date', '',
+     _('record the specified date in metadata'), _('DATE')),
+    ('u', 'user', '',
+     _('record the specified user in metadata'), _('USER')),
+]
+
+@eh.uisetup
+def _installimportobsolete(ui):
+    entry = cmdutil.findcmd('import', commands.table)[1]
+    entry[1].append(('', 'obsolete', False,
+                    _('mark the old node as obsoleted by '
+                      'the created commit')))
+
+@eh.wrapfunction(mercurial.cmdutil, 'tryimportone')
+def tryimportone(orig, ui, repo, hunk, parents, opts, *args, **kwargs):
+    extracted = patch.extract(ui, hunk)
+    expected = extracted[5]
+    if expected is not None:
+        expected = node.bin(expected)
+    oldextract = patch.extract
+    try:
+        patch.extract = lambda ui, hunk: extracted
+        ret = orig(ui, repo, hunk, parents, opts, *args, **kwargs)
+    finally:
+        patch.extract = oldextract
+    created = ret[1]
+    if (opts['obsolete'] and None not in (created, expected)
+        and created != expected):
+            tr = repo.transaction('import-obs')
+            try:
+                metadata = {'user': ui.username()}
+                repo.obsstore.create(tr, expected, (created,),
+                                     metadata=metadata)
+                tr.close()
+            finally:
+                tr.release()
+    return ret
+
+
+def _deprecatealias(oldalias, newalias):
+    '''Deprecates an alias for a command in favour of another
+
+    Creates a new entry in the command table for the old alias. It creates a
+    wrapper that has its synopsis set to show that is has been deprecated.
+    The documentation will be replace with a pointer to the new alias.
+    If a user invokes the command a deprecation warning will be printed and
+    the command of the *new* alias will be invoked.
+
+    This function is loosely based on the extensions.wrapcommand function.
+    '''
+    aliases, entry = cmdutil.findcmd(newalias, cmdtable)
+    for alias, e in cmdtable.iteritems():
+        if e is entry:
+            break
+
+    synopsis = '(DEPRECATED)'
+    if len(entry) > 2:
+        fn, opts, _syn = entry
+    else:
+        fn, opts, = entry
+    deprecationwarning = _('%s have been deprecated in favor of %s\n' % (
+        oldalias, newalias))
+    def newfn(*args, **kwargs):
+        ui = args[0]
+        ui.warn(deprecationwarning)
+        util.checksignature(fn)(*args, **kwargs)
+    newfn.__doc__  = deprecationwarning
+    cmdwrapper = command(oldalias, opts, synopsis)
+    cmdwrapper(newfn)
+
+@eh.extsetup
+def deprecatealiases(ui):
+    _deprecatealias('gup', 'next')
+    _deprecatealias('gdown', 'previous')
+
+@command('debugrecordpruneparents', [], '')
+def cmddebugrecordpruneparents(ui, repo):
+    """add parents data to prune markers when possible
+
+    This commands search the repo for prune markers without parent information.
+    If the pruned node is locally known, a new markers with parent data is
+    created."""
+    pgop = 'reading markers'
+
+    # lock from the beginning to prevent race
+    wlock = lock = tr = None
+    try:
+        wlock = repo.wlock()
+        lock = repo.lock()
+        tr = repo.transaction('recordpruneparents')
+        unfi = repo.unfiltered()
+        nm = unfi.changelog.nodemap
+        store = repo.obsstore
+        pgtotal = len(store._all)
+        for idx, mark in enumerate(list(store._all)):
+            if not mark[1]:
+                rev = nm.get(mark[0])
+                if rev is not None:
+                    ctx = unfi[rev]
+                    parents = tuple(p.node() for p in ctx.parents())
+                    before = len(store._all)
+                    store.create(tr, mark[0], mark[1], mark[2], marks[3],
+                                 parents=parents)
+                    if len(store._all) - before:
+                        ui.write('created new markers for %i\n' % rev)
+            ui.progress(pgop, idx, total=pgtotal)
+        tr.close()
+        ui.progress(pgop, None)
+    finally:
+        lockmod.release(tr, lock, wlock)
+
+@command('debugobsstorestat', [], '')
+def cmddebugobsstorestat(ui, repo):
+    """print statistic about obsolescence markers in the repo"""
+    store = repo.obsstore
+    unfi = repo.unfiltered()
+    nm = unfi.changelog.nodemap
+    ui.write('markers total:              %9i\n' % len(store._all))
+    sucscount = [0, 0 , 0, 0]
+    known = 0
+    parentsdata = 0
+    metakeys = {}
+    # node -> cluster mapping
+    #   a cluster is a (set(nodes), set(markers)) tuple
+    clustersmap = {}
+    # same data using parent information
+    pclustersmap= {}
+    for mark in store:
+        if mark[0] in nm:
+            known += 1
+        nbsucs = len(mark[1])
+        sucscount[min(nbsucs, 3)] += 1
+        meta = mark[3]
+        for key, value in meta:
+            metakeys.setdefault(key, 0)
+            metakeys[key] += 1
+        meta = dict(meta)
+        parents = [meta.get('p1'), meta.get('p2')]
+        parents = [node.bin(p) for p in parents if p is not None]
+        if parents:
+            parentsdata += 1
+        # cluster handling
+        nodes = set()
+        nodes.add(mark[0])
+        nodes.update(mark[1])
+        c = (set(nodes), set([mark]))
+
+        toproceed = set(nodes)
+        while toproceed:
+            n = toproceed.pop()
+            other = clustersmap.get(n)
+            if (other is not None
+                and other is not c):
+                other[0].update(c[0])
+                other[1].update(c[1])
+                for on in c[0]:
+                    if on in toproceed:
+                        continue
+                    clustersmap[on] = other
+                c = other
+            clustersmap[n] = c
+        # same with parent data
+        nodes.update(parents)
+        c = (set(nodes), set([mark]))
+        toproceed = set(nodes)
+        while toproceed:
+            n = toproceed.pop()
+            other = pclustersmap.get(n)
+            if (other is not None
+                and other is not c):
+                other[0].update(c[0])
+                other[1].update(c[1])
+                for on in c[0]:
+                    if on in toproceed:
+                        continue
+                    pclustersmap[on] = other
+                c = other
+            pclustersmap[n] = c
+
+    # freezing the result
+    for c in clustersmap.values():
+        fc = (frozenset(c[0]), frozenset(c[1]))
+        for n in fc[0]:
+            clustersmap[n] = fc
+    # same with parent data
+    for c in pclustersmap.values():
+        fc = (frozenset(c[0]), frozenset(c[1]))
+        for n in fc[0]:
+            pclustersmap[n] = fc
+    ui.write('    for known precursors:   %9i\n' % known)
+    ui.write('    with parents data:      %9i\n' % parentsdata)
+    # successors data
+    ui.write('markers with no successors: %9i\n' % sucscount[0])
+    ui.write('              1 successors: %9i\n' % sucscount[1])
+    ui.write('              2 successors: %9i\n' % sucscount[2])
+    ui.write('    more than 2 successors: %9i\n' % sucscount[3])
+    # meta data info
+    ui.write('    available  keys:\n')
+    for key in sorted(metakeys):
+        ui.write('    %15s:        %9i\n' % (key, metakeys[key]))
+
+    allclusters = list(set(clustersmap.values()))
+    allclusters.sort(key=lambda x: len(x[1]))
+    ui.write('disconnected clusters:      %9i\n' % len(allclusters))
+
+    ui.write('        any known node:     %9i\n'
+             % len([c for c in allclusters
+                    if [n for n in c[0] if nm.get(n) is not None]]))
+    if allclusters:
+        nbcluster = len(allclusters)
+        ui.write('        smallest length:    %9i\n' % len(allclusters[0][1]))
+        ui.write('        longer length:      %9i\n' % len(allclusters[-1][1]))
+        median = len(allclusters[nbcluster//2][1])
+        ui.write('        median length:      %9i\n' % median)
+        mean = sum(len(x[1]) for x in allclusters) // nbcluster
+        ui.write('        mean length:        %9i\n' % mean)
+    allpclusters = list(set(pclustersmap.values()))
+    allpclusters.sort(key=lambda x: len(x[1]))
+    ui.write('    using parents data:     %9i\n' % len(allpclusters))
+    ui.write('        any known node:     %9i\n'
+             % len([c for c in allclusters
+                    if [n for n in c[0] if nm.get(n) is not None]]))
+    if allpclusters:
+        nbcluster = len(allpclusters)
+        ui.write('        smallest length:    %9i\n' % len(allpclusters[0][1]))
+        ui.write('        longer length:      %9i\n' % len(allpclusters[-1][1]))
+        median = len(allpclusters[nbcluster//2][1])
+        ui.write('        median length:      %9i\n' % median)
+        mean = sum(len(x[1]) for x in allpclusters) // nbcluster
+        ui.write('        mean length:        %9i\n' % mean)
+
+@command('^evolve|stabilize|solve',
+    [('n', 'dry-run', False,
+        'do not perform actions, just print what would be done'),
+     ('', 'confirm', False,
+        'ask for confirmation before performing the action'),
+    ('A', 'any', False, 'also consider troubled changesets unrelated to current working directory'),
+    ('a', 'all', False, 'evolve all troubled changesets in the repo '
+                        '(implies any)'),
+    ('c', 'continue', False, 'continue an interrupted evolution'),
+    ] + mergetoolopts,
     _('[OPTIONS]...'))
-def stabilize(ui, repo, **opts):
-    """rebase an unstable changeset to make it stable again
-
-    By default, take the first unstable changeset which could be
-    rebased as child of the working directory parent revision or one
-    of its descendants and rebase it.
-
-    With --any, stabilize any unstable changeset.
-
-    The working directory is updated to the rebased revision.
+def evolve(ui, repo, **opts):
+    """solve trouble in your repository
+
+    - rebase unstable changesets to make them stable again,
+    - create proper diffs from bumped changesets,
+    - merge divergent changesets,
+    - update to a successor if the working directory parent is
+      obsolete
+
+    By default a single changeset is evolved for each invocation and only
+    troubled changesets that would evolve as a descendant of the current
+    working directory will be considered. See --all and --any options to change
+    this behavior.
+
+    - For unstable, this means taking the first which could be rebased as a
+      child of the working directory parent revision or one of its descendants
+      and rebasing it.
+
+    - For divergent, this means taking "." if applicable.
+
+    With --any, evolve picks any troubled changeset to repair.
+
+    The working directory is updated to the newly created revision.
     """
 
-    obsolete = extensions.find('obsolete')
-
-    node = None
-    if not opts['any']:
-        node = stabilizableunstable(repo, repo['.'])
-    if node is None:
-        unstables = list(repo.set('unstable()'))
-        if unstables and not opts['any']:
-            ui.write_err(_('nothing to stabilize here\n'))
-            ui.status(_('(%i unstable changesets, do you want --any ?)\n')
-                      % len(unstables))
+    contopt = opts['continue']
+    anyopt = opts['any']
+    allopt = opts['all']
+    dryrunopt = opts['dry_run']
+    confirmopt = opts['confirm']
+    ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), 'evolve')
+
+    startnode = repo['.']
+
+    if contopt:
+        if anyopt:
+            raise util.Abort('cannot specify both "--any" and "--continue"')
+        if allopt:
+            raise util.Abort('cannot specify both "--all" and "--continue"')
+        graftcmd = commands.table['graft'][0]
+        return graftcmd(ui, repo, old_obsolete=True, **{'continue': True})
+
+    tro = _picknexttroubled(ui, repo, anyopt or allopt)
+    if tro is None:
+        if repo['.'].obsolete():
+            displayer = cmdutil.show_changeset(
+                ui, repo, {'template': shorttemplate})
+            successors = set()
+
+            for successorsset in obsolete.successorssets(repo, repo['.'].node()):
+                for nodeid in successorsset:
+                    successors.add(repo[nodeid])
+
+            if not successors:
+                ui.warn(_('parent is obsolete without successors; ' +
+                          'likely killed\n'))
+                return 2
+
+            elif len(successors) > 1:
+                ui.warn(_('parent is obsolete with multiple successors:\n'))
+
+                for ctx in sorted(successors, key=lambda ctx: ctx.rev()):
+                    displayer.show(ctx)
+
+                return 2
+
+            else:
+                ctx = successors.pop()
+
+                ui.status(_('update:'))
+                if not ui.quiet:
+                    displayer.show(ctx)
+
+                if dryrunopt:
+                    return 0
+                else:
+                    res = hg.update(repo, ctx.rev())
+                    if ctx != startnode:
+                        ui.status(_('working directory is now at %s\n') % ctx)
+                    return res
+
+        troubled = repo.revs('troubled()')
+        if troubled:
+            ui.write_err(_('nothing to evolve here\n'))
+            ui.status(_('(%i troubled changesets, do you want --any ?)\n')
+                      % len(troubled))
             return 2
-        elif not unstables:
-            ui.write_err(_('no unstable changeset\n'))
+        else:
+            ui.write_err(_('no troubled changesets\n'))
             return 1
-        node = unstables[0]
-
-    obs = node.parents()[0]
+
+    def progresscb():
+        if allopt:
+            ui.progress('evolve', seen, unit='changesets', total=count)
+    seen = 1
+    count = allopt and _counttroubled(ui, repo) or 1
+
+    while tro is not None:
+        progresscb()
+        wlock = lock = tr = None
+        try:
+            wlock = repo.wlock()
+            lock = repo.lock()
+            tr = repo.transaction("evolve")
+            result = _evolveany(ui, repo, tro, dryrunopt, confirmopt,
+                                progresscb=progresscb)
+            tr.close()
+        finally:
+            lockmod.release(tr, lock, wlock)
+        progresscb()
+        seen += 1
+        if not allopt:
+            if repo['.'] != startnode:
+                ui.status(_('working directory is now at %s\n') % repo['.'])
+            return result
+        progresscb()
+        tro = _picknexttroubled(ui, repo, anyopt or allopt)
+
+    if allopt:
+        ui.progress('evolve', None)
+
+    if repo['.'] != startnode:
+        ui.status(_('working directory is now at %s\n') % repo['.'])
+
+
+def _evolveany(ui, repo, tro, dryrunopt, confirmopt, progresscb):
+    repo = repo.unfiltered()
+    tro = repo[tro.rev()]
+    cmdutil.bailifchanged(repo)
+    troubles = tro.troubles()
+    if 'unstable' in troubles:
+        return _solveunstable(ui, repo, tro, dryrunopt, confirmopt, progresscb)
+    elif 'bumped' in troubles:
+        return _solvebumped(ui, repo, tro, dryrunopt, confirmopt, progresscb)
+    elif 'divergent' in troubles:
+        return _solvedivergent(ui, repo, tro, dryrunopt, confirmopt,
+                               progresscb)
+    else:
+        assert False  # WHAT? unknown troubles
+
+def _counttroubled(ui, repo):
+    """Count the amount of troubled changesets"""
+    troubled = set()
+    troubled.update(getrevs(repo, 'unstable'))
+    troubled.update(getrevs(repo, 'bumped'))
+    troubled.update(getrevs(repo, 'divergent'))
+    return len(troubled)
+
+def _picknexttroubled(ui, repo, pickany=False, progresscb=None):
+    """Pick a the next trouble changeset to solve"""
+    if progresscb: progresscb()
+    tro = _stabilizableunstable(repo, repo['.'])
+    if tro is None:
+        wdp = repo['.']
+        if 'divergent' in wdp.troubles():
+            tro = wdp
+    if tro is None and pickany:
+        troubled = list(repo.set('unstable()'))
+        if not troubled:
+            troubled = list(repo.set('bumped()'))
+        if not troubled:
+            troubled = list(repo.set('divergent()'))
+        if troubled:
+            tro = troubled[0]
+
+    return tro
+
+def _stabilizableunstable(repo, pctx):
+    """Return a changectx for an unstable changeset which can be
+    stabilized on top of pctx or one of its descendants. None if none
+    can be found.
+    """
+    def selfanddescendants(repo, pctx):
+        yield pctx
+        for prec in repo.set('allprecursors(%d)', pctx):
+            yield prec
+        for ctx in pctx.descendants():
+            yield ctx
+            for prec in repo.set('allprecursors(%d)', ctx):
+                yield prec
+
+    # Look for an unstable which can be stabilized as a child of
+    # node. The unstable must be a child of one of node predecessors.
+    directdesc = set([pctx.rev()])
+    for ctx in selfanddescendants(repo, pctx):
+        for child in ctx.children():
+            if ctx.rev() in directdesc and not child.obsolete():
+                directdesc.add(child.rev())
+            elif child.unstable():
+                return child
+    return None
+
+def _solveunstable(ui, repo, orig, dryrun=False, confirm=False,
+                   progresscb=None):
+    """Stabilize a unstable changeset"""
+    obs = orig.parents()[0]
     if not obs.obsolete():
-        obs = node.parents()[1]
+        obs = orig.parents()[1] # second parent is obsolete ?
     assert obs.obsolete()
-    newer = obsolete.newerversion(repo, obs.node())
+    newer = obsolete.successorssets(repo, obs.node())
+    # search of a parent which is not killed
+    while not newer or newer == [()]:
+        ui.debug("stabilize target %s is plain dead,"
+                 " trying to stabilize on its parent\n" %
+                 obs)
+        obs = obs.parents()[0]
+        newer = obsolete.successorssets(repo, obs.node())
     if len(newer) > 1:
-        ui.write_err(_("conflict rewriting. can't choose destination\n"))
-        return 2
+        raise util.Abort(_("conflict rewriting. can't choose destination\n"))
     targets = newer[0]
-    if not targets:
-        ui.write_err(_("does not handle kill parent yet\n"))
-        return 2
+    assert targets
     if len(targets) > 1:
-        ui.write_err(_("does not handle splitted parent yet\n"))
+        raise util.Abort(_("does not handle split parents yet\n"))
         return 2
     target = targets[0]
     displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
     target = repo[target]
-    repo.ui.status(_('move:'))
-    if not ui.quiet:
-        displayer.show(node)
-    repo.ui.status(_('atop:'))
-    if not ui.quiet:
+    if not ui.quiet or confirm:
+        repo.ui.write(_('move:'))
+        displayer.show(orig)
+        repo.ui.write(_('atop:'))
         displayer.show(target)
-    todo= 'hg rebase -Dr %s -d %s\n' % (node, target)
-    if opts['dry_run']:
+    if confirm and ui.prompt('perform evolve? [Ny]', 'n') != 'y':
+            raise util.Abort(_('evolve aborted by user'))
+    if progresscb: progresscb()
+    todo = 'hg rebase -r %s -d %s\n' % (orig, target)
+    if dryrun:
         repo.ui.write(todo)
     else:
         repo.ui.note(todo)
-        lock = repo.lock()
+        if progresscb: progresscb()
+        keepbranch = orig.p1().branch() != orig.branch()
         try:
-            relocate(repo, node, target)
-        finally:
-            lock.release()
+            relocate(repo, orig, target, keepbranch)
+        except MergeFailure:
+            repo.opener.write('graftstate', orig.hex() + '\n')
+            repo.ui.write_err(_('evolve failed!\n'))
+            repo.ui.write_err(
+                _('fix conflict and run "hg evolve --continue"'
+                  ' or use "hg update -C" to abort\n'))
+            raise
+
+def _solvebumped(ui, repo, bumped, dryrun=False, confirm=False,
+                 progresscb=None):
+    """Stabilize a bumped changeset"""
+    # For now we deny bumped merge
+    if len(bumped.parents()) > 1:
+        raise util.Abort('late comer stabilization is confused by bumped'
+                         ' %s being a merge' % bumped)
+    prec = repo.set('last(allprecursors(%d) and public())', bumped).next()
+    # For now we deny target merge
+    if len(prec.parents()) > 1:
+        raise util.Abort('late comer evolution is confused by precursors'
+                         ' %s being a merge' % prec)
+
+    displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
+    if not ui.quiet or confirm:
+        repo.ui.write(_('recreate:'))
+        displayer.show(bumped)
+        repo.ui.write(_('atop:'))
+        displayer.show(prec)
+    if confirm and ui.prompt('perform evolve? [Ny]', 'n') != 'y':
+        raise util.Abort(_('evolve aborted by user'))
+    if dryrun:
+        todo = 'hg rebase --rev %s --dest %s;\n' % (bumped, prec.p1())
+        repo.ui.write(todo)
+        repo.ui.write('hg update %s;\n' % prec)
+        repo.ui.write('hg revert --all --rev %s;\n' % bumped)
+        repo.ui.write('hg commit --msg "bumped update to %s"')
+        return 0
+    if progresscb: progresscb()
+    newid = tmpctx = None
+    tmpctx = bumped
+    bmupdate = _bookmarksupdater(repo, bumped.node())
+    # Basic check for common parent. Far too complicated and fragile
+    tr = repo.transaction('bumped-stabilize')
+    try:
+        if not list(repo.set('parents(%d) and parents(%d)', bumped, prec)):
+            # Need to rebase the changeset at the right place
+            repo.ui.status(
+                _('rebasing to destination parent: %s\n') % prec.p1())
+            try:
+                tmpid = relocate(repo, bumped, prec.p1())
+                if tmpid is not None:
+                    tmpctx = repo[tmpid]
+                    obsolete.createmarkers(repo, [(bumped, (tmpctx,))])
+            except MergeFailure:
+                repo.opener.write('graftstate', bumped.hex() + '\n')
+                repo.ui.write_err(_('evolution failed!\n'))
+                repo.ui.write_err(
+                    _('fix conflict and run "hg evolve --continue"\n'))
+                raise
+        # Create the new commit context
+        repo.ui.status(_('computing new diff\n'))
+        files = set()
+        copied = copies.pathcopies(prec, bumped)
+        precmanifest = prec.manifest()
+        for key, val in list(bumped.manifest().iteritems()):
+            precvalue = precmanifest.get(key, None)
+            if precvalue is not None:
+                del precmanifest[key]
+            if precvalue != val:
+                files.add(key)
+        files.update(precmanifest)  # add missing files
+        # commit it
+        if files: # something to commit!
+            def filectxfn(repo, ctx, path):
+                if path in bumped:
+                    fctx = bumped[path]
+                    flags = fctx.flags()
+                    mctx = memfilectx(repo, fctx.path(), fctx.data(),
+                                      islink='l' in flags,
+                                      isexec='x' in flags,
+                                      copied=copied.get(path))
+                    return mctx
+                return None
+            text = 'bumped update to %s:\n\n' % prec
+            text += bumped.description()
+
+            new = context.memctx(repo,
+                                 parents=[prec.node(), node.nullid],
+                                 text=text,
+                                 files=files,
+                                 filectxfn=filectxfn,
+                                 user=bumped.user(),
+                                 date=bumped.date(),
+                                 extra=bumped.extra())
+
+            newid = repo.commitctx(new)
+        if newid is None:
+            obsolete.createmarkers(repo, [(tmpctx, ())])
+            newid = prec.node()
+        else:
+            phases.retractboundary(repo, tr, bumped.phase(), [newid])
+            obsolete.createmarkers(repo, [(tmpctx, (repo[newid],))],
+                                   flag=obsolete.bumpedfix)
+        bmupdate(newid)
+        tr.close()
+        repo.ui.status(_('committed as %s\n') % node.short(newid))
+    finally:
+        tr.release()
+    # reroute the working copy parent to the new changeset
+    repo.dirstate.beginparentchange()
+    repo.dirstate.setparents(newid, node.nullid)
+    repo.dirstate.endparentchange()
+
+def _solvedivergent(ui, repo, divergent, dryrun=False, confirm=False,
+                    progresscb=None):
+    base, others = divergentdata(divergent)
+    if len(others) > 1:
+        othersstr = "[%s]" % (','.join([str(i) for i in others]))
+        hint = ("changeset %d is divergent with a changeset that got splitted "
+                "| into multiple ones:\n[%s]\n"
+                "| This is not handled by automatic evolution yet\n"
+                "| You have to fallback to manual handling with commands "
+                "such as:\n"
+                "| - hg touch -D\n"
+                "| - hg prune\n"
+                "| \n"
+                "| You should contact your local evolution Guru for help.\n"
+                % (divergent, othersstr))
+        raise util.Abort("we do not handle divergence with split yet",
+                         hint=hint)
+    other = others[0]
+    if divergent.phase() <= phases.public:
+        raise util.Abort("we can't resolve this conflict from the public side",
+                    hint="%s is public, try from %s" % (divergent, other))
+    if len(other.parents()) > 1:
+        raise util.Abort("divergent changeset can't be a merge (yet)",
+                    hint="You have to fallback to solving this by hand...\n"
+                         "| This probably means redoing the merge and using "
+                         "| `hg prune` to kill older version.")
+    if other.p1() not in divergent.parents():
+        raise util.Abort("parents are not common (not handled yet)",
+                    hint="| %(d)s, %(o)s are not based on the same changeset.\n"
+                         "| With the current state of its implementation, \n"
+                         "| evolve does not work in that case.\n"
+                         "| rebase one of them next to the other and run \n"
+                         "| this command again.\n"
+                         "| - either: hg rebase --dest 'p1(%(d)s)' -r %(o)s\n"
+                         "| - or:     hg rebase --dest 'p1(%(o)s)' -r %(d)s"
+                              % {'d': divergent, 'o': other})
+
+    displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
+    if not ui.quiet or confirm:
+        ui.write(_('merge:'))
+        displayer.show(divergent)
+        ui.write(_('with: '))
+        displayer.show(other)
+        ui.write(_('base: '))
+        displayer.show(base)
+    if confirm and ui.prompt('perform evolve? [Ny]', 'n') != 'y':
+        raise util.Abort(_('evolve aborted by user'))
+    if dryrun:
+        ui.write('hg update -c %s &&\n' % divergent)
+        ui.write('hg merge %s &&\n' % other)
+        ui.write('hg commit -m "auto merge resolving conflict between '
+                 '%s and %s"&&\n' % (divergent, other))
+        ui.write('hg up -C %s &&\n' % base)
+        ui.write('hg revert --all --rev tip &&\n')
+        ui.write('hg commit -m "`hg log -r %s --template={desc}`";\n'
+                 % divergent)
+        return
+    if divergent not in repo[None].parents():
+        repo.ui.status(_('updating to "local" conflict\n'))
+        hg.update(repo, divergent.rev())
+    repo.ui.note(_('merging divergent changeset\n'))
+    if progresscb: progresscb()
+    stats = merge.update(repo,
+                         other.node(),
+                         branchmerge=True,
+                         force=False,
+                         partial=None,
+                         ancestor=base.node(),
+                         mergeancestor=True)
+    hg._showstats(repo, stats)
+    if stats[3]:
+        repo.ui.status(_("use 'hg resolve' to retry unresolved file merges "
+                         "or 'hg update -C .' to abandon\n"))
+    if stats[3] > 0:
+        raise util.Abort('merge conflict between several amendments '
+            '(this is not automated yet)',
+            hint="""/!\ You can try:
+/!\ * manual merge + resolve => new cset X
+/!\ * hg up to the parent of the amended changeset (which are named W and Z)
+/!\ * hg revert --all -r X
+/!\ * hg ci -m "same message as the amended changeset" => new cset Y
+/!\ * hg kill -n Y W Z
+""")
+    if progresscb: progresscb()
+    tr = repo.transaction('stabilize-divergent')
+    try:
+        repo.dirstate.beginparentchange()
+        repo.dirstate.setparents(divergent.node(), node.nullid)
+        repo.dirstate.endparentchange()
+        oldlen = len(repo)
+        amend(ui, repo, message='', logfile='')
+        if oldlen == len(repo):
+            new = divergent
+            # no changes
+        else:
+            new = repo['.']
+        obsolete.createmarkers(repo, [(other, (new,))])
+        phases.retractboundary(repo, tr, other.phase(), [new.node()])
+        tr.close()
+    finally:
+        tr.release()
+
+def divergentdata(ctx):
+    """return base, other part of a conflict
+
+    This only return the first one.
+
+    XXX this woobly function won't survive XXX
+    """
+    repo = ctx._repo.unfiltered()
+    for base in repo.set('reverse(allprecursors(%d))', ctx):
+        newer = obsolete.successorssets(ctx._repo, base.node())
+        # drop filter and solution including the original ctx
+        newer = [n for n in newer if n and ctx.node() not in n]
+        if newer:
+            return base, tuple(ctx._repo[o] for o in newer[0])
+    raise util.Abort("base of divergent changeset %s not found" % ctx,
+                     hint='this case is not yet handled')
+
+
 
 shorttemplate = '[{rev}] {desc|firstline}\n'
 
-@command('^gdown',
-         [],
-         '')
-def cmdgdown(ui, repo):
-    """update to parent an display summary lines"""
+@command('^previous',
+         [('B', 'move-bookmark', False,
+             _('Move active bookmark after update'))],
+         '[-B]')
+def cmdprevious(ui, repo, **opts):
+    """update to parent and display summary lines"""
     wkctx = repo[None]
     wparents = wkctx.parents()
     if len(wparents) != 1:
@@ -303,7 +1638,15 @@
     displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
     if len(parents) == 1:
         p = parents[0]
-        hg.update(repo, p.rev())
+        bm = bmactive(repo)
+        shouldmove = opts.get('move_bookmark') and bm is not None
+        ret = hg.update(repo, p.rev())
+        if not ret:
+            if shouldmove:
+                repo._bookmarks[bm] = p.node()
+                repo._bookmarks.write()
+            else:
+                bmdeactivate(repo)
         displayer.show(p)
         return 0
     else:
@@ -312,11 +1655,12 @@
         ui.warn(_('multiple parents, explicitly update to one\n'))
         return 1
 
-@command('^gup',
-         [],
-         '')
-def cmdup(ui, repo):
-    """update to child an display summary lines"""
+@command('^next',
+         [('B', 'move-bookmark', False,
+             _('Move active bookmark after update'))],
+         '[-B]')
+def cmdnext(ui, repo, **opts):
+    """update to child and display summary lines"""
     wkctx = repo[None]
     wparents = wkctx.parents()
     if len(wparents) != 1:
@@ -325,63 +1669,211 @@
     children = [ctx for ctx in wparents[0].children() if not ctx.obsolete()]
     displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
     if not children:
-        ui.warn(_('No non-obsolete children\n'))
+        ui.warn(_('no non-obsolete children\n'))
         return 1
     if len(children) == 1:
         c = children[0]
-        hg.update(repo, c.rev())
+        bm = bmactive(repo)
+        shouldmove = opts.get('move_bookmark') and bm is not None
+        ret = hg.update(repo, c.rev())
+        if not ret:
+            if shouldmove:
+                repo._bookmarks[bm] = c.node()
+                repo._bookmarks.write()
+            else:
+                bmdeactivate(repo)
         displayer.show(c)
         return 0
     else:
         for c in children:
             displayer.show(c)
-        ui.warn(_('Multiple non-obsolete children, explicitly update to one\n'))
+        ui.warn(_('multiple non-obsolete children, '
+            'explicitly update to one of them\n'))
         return 1
 
+def _reachablefrombookmark(repo, revs, mark):
+    """filter revisions and bookmarks reachable from the given bookmark
+    yoinked from mq.py
+    """
+    marks = repo._bookmarks
+    if mark not in marks:
+        raise util.Abort(_("bookmark '%s' not found") % mark)
+
+    # If the requested bookmark is not the only one pointing to a
+    # a revision we have to only delete the bookmark and not strip
+    # anything. revsets cannot detect that case.
+    uniquebm = True
+    for m, n in marks.iteritems():
+        if m != mark and n == repo[mark].node():
+            uniquebm = False
+            break
+    if uniquebm:
+        rsrevs = repo.revs("ancestors(bookmark(%s)) - "
+                           "ancestors(head() and not bookmark(%s)) - "
+                           "ancestors(bookmark() and not bookmark(%s)) - "
+                           "obsolete()",
+                           mark, mark, mark)
+        revs = set(revs)
+        revs.update(set(rsrevs))
+        revs = sorted(revs)
+    return marks, revs
+
+def _deletebookmark(ui, marks, mark):
+    del marks[mark]
+    marks.write()
+    ui.write(_("bookmark '%s' deleted\n") % mark)
+
+
+
+def _getmetadata(**opts):
+    metadata = {}
+    date = opts.get('date')
+    user = opts.get('user')
+    if date:
+        metadata['date'] = '%i %i' % util.parsedate(date)
+    if user:
+        metadata['user'] = user
+    return metadata
+
+
 @command('^prune|obsolete|kill',
-    [('n', 'new', [], _("successor changeset"))],
-    _('[OPTION] REV...'))
-def kill(ui, repo, *revs, **opts):
-    """mark a changeset as obsolete
-
-    This update the parent directory to a not-killed parent if the current
-    working directory parent are killed.
-
-    XXX bookmark support
-    XXX handle merge
-    XXX check immutable first
+    [('n', 'new', [], _("successor changeset (DEPRECATED)")),
+     ('s', 'succ', [], _("successor changeset")),
+     ('r', 'rev', [], _("revisions to prune")),
+     ('', 'biject', False, _("do a 1-1 map between rev and successor ranges")),
+     ('B', 'bookmark', '', _("remove revs only reachable from given"
+                             " bookmark"))] + metadataopts,
+    _('[OPTION] [-r] REV...'))
+    # -U  --noupdate option to prevent wc update and or bookmarks update ?
+def cmdprune(ui, repo, *revs, **opts):
+    """hide changesets by marking them obsolete
+
+    Obsolete changesets becomes invisible to all commands.
+
+    Unpruned descendants of pruned changesets becomes "unstable". Use the
+    :hg:`evolve` to handle such situation.
+
+    When the working directory parent is pruned, the repository is updated to a
+    non-obsolete parent.
+
+    You can use the ``--succ`` option to inform mercurial that a newer version
+    of the pruned changeset exists.
+
+    You can use the ``--biject`` option to specify a 1-1 (bijection) between
+    revisions to prune and successor changesets. This option may be removed in
+    a future release (with the functionality absorbed automatically).
+
     """
-    wlock = repo.wlock()
+    revs = scmutil.revrange(repo, list(revs) + opts.get('rev'))
+    succs = opts['new'] + opts['succ']
+    bookmark = opts.get('bookmark')
+    metadata = _getmetadata(**opts)
+    biject = opts.get('biject')
+
+    if bookmark:
+        marks,revs = _reachablefrombookmark(repo, revs, bookmark)
+        if not revs:
+            # no revisions to prune - delete bookmark immediately
+            _deletebookmark(ui, marks, bookmark)
+
+    if not revs:
+        raise util.Abort(_('nothing to prune'))
+
+    wlock = lock = None
     try:
-        new = set(noderange(repo, opts['new']))
-        targetnodes = set(noderange(repo, revs))
-        if not new:
-            new = [node.nullid]
-        for n in targetnodes:
-            if not repo[n].mutable():
-                ui.warn(_("cannot kill immutable changeset %s\n") % repo[n])
-            else:
-                for ne in new:
-                    repo.addobsolete(ne, n)
-        # update to an unkilled parent
+        wlock = repo.wlock()
+        lock = repo.lock()
+        # defines pruned changesets
+        precs = []
+        revs.sort()
+        for p in revs:
+            cp = repo[p]
+            if not cp.mutable():
+                # note: createmarkers() would have raised something anyway
+                raise util.Abort('cannot prune immutable changeset: %s' % cp,
+                                 hint='see "hg help phases" for details')
+            precs.append(cp)
+        if not precs:
+            raise util.Abort('nothing to prune')
+
+        # defines successors changesets
+        sucs = scmutil.revrange(repo, succs)
+        sucs.sort()
+        sucs = tuple(repo[n] for n in sucs)
+        if not biject and len(sucs) > 1 and len(precs) > 1:
+            msg = "Can't use multiple successors for multiple precursors"
+            raise util.Abort(msg)
+
+        if biject and len(sucs) != len(precs):
+            msg = "Can't use %d successors for %d precursors" \
+                % (len(sucs), len(precs))
+            raise util.Abort(msg)
+
+        relations = [(p, sucs) for p in precs]
+        if biject:
+            relations = [(p, (s,)) for p, s in zip(precs, sucs)]
+
+        # create markers
+        obsolete.createmarkers(repo, relations, metadata=metadata)
+
+        # informs that changeset have been pruned
+        ui.status(_('%i changesets pruned\n') % len(precs))
+
         wdp = repo['.']
-        newnode = wdp
-        while newnode.obsolete():
-            newnode = newnode.parents()[0]
+
+        if len(sucs) == 1 and len(precs) == 1 and wdp in precs:
+            # '.' killed, so update to the successor
+            newnode = sucs[0]
+        else:
+            # update to an unkilled parent
+            newnode = wdp
+
+            while newnode.obsolete():
+                newnode = newnode.parents()[0]
+
         if newnode.node() != wdp.node():
+            bookactive = bmactive(repo)
+            # Active bookmark that we don't want to delete (with -B option)
+            # we deactivate and move it before the update and reactivate it
+            # after
+            movebookmark = bookactive and not bookmark
+            if movebookmark:
+                bmdeactivate(repo)
+                repo._bookmarks[bookactive] = newnode.node()
+                repo._bookmarks.write()
             commands.update(ui, repo, newnode.rev())
             ui.status(_('working directory now at %s\n') % newnode)
-
+            if movebookmark:
+                bmactivate(repo, bookactive)
+
+        # update bookmarks
+        if bookmark:
+            _deletebookmark(ui, marks, bookmark)
+        for ctx in repo.unfiltered().set('bookmark() and %ld', precs):
+            # used to be:
+            #
+            #   ldest = list(repo.set('max((::%d) - obsolete())', ctx))
+            #   if ldest:
+            #      c = ldest[0]
+            #
+            # but then revset took a lazy arrow in the knee and became much
+            # slower. The new forms makes as much sense and a much faster.
+            for dest in ctx.ancestors():
+                if not dest.obsolete():
+                    updatebookmarks = _bookmarksupdater(repo, ctx.node())
+                    updatebookmarks(dest.node())
+                    break
     finally:
-        wlock.release()
-
-@command('^amend|refresh',
+        lockmod.release(lock, wlock)
+
+@command('amend|refresh',
     [('A', 'addremove', None,
      _('mark new/missing files as added/removed before committing')),
-    ('n', 'note', '', _('use text as commit message for this update')),
-    ('c', 'change', '', _('specifies the changesets to amend'), _('REV')),
     ('e', 'edit', False, _('invoke editor on commit messages')),
-    ] + walkopts + commitopts + commitopts2,
+    ('', 'close-branch', None,
+     _('mark a branch as closed, hiding it from the branch list')),
+    ('s', 'secret', None, _('use the secret phase for committing')),
+    ] + walkopts + commitopts + commitopts2 + commitopts3 + interactiveopt,
     _('[OPTION]... [FILE]...'))
 def amend(ui, repo, *pats, **opts):
     """combine a changeset with updates and replace it with a new one
@@ -393,10 +1885,6 @@
 
     If you don't specify -m, the parent's message will be reused.
 
-    If you specify --change, amend additionally considers all
-    changesets between the indicated changeset and the working copy
-    parent as updates to be subsumed.
-
     Behind the scenes, Mercurial first commits the update as a regular child
     of the current parent. Then it creates a new commit on the parent's parents
     with the updated contents. Then it changes the working copy parent to this
@@ -405,102 +1893,60 @@
 
     Returns 0 on success, 1 if nothing changed.
     """
-
-    # determine updates to subsume
-    old = scmutil.revsingle(repo, opts.get('change') or '.')
-
-    lock = repo.lock()
-    try:
-        wlock = repo.wlock()
-        try:
-            if old.phase() == phases.public:
-                raise util.Abort(_("can not rewrite immutable changeset %s")
-                                 % old)
-            if not repo.revs('%d and (::.)', old):
-                raise error.Abort(_('cannot amend non ancestor changeset'))
-            tr = repo.transaction('amend')
-            try:
-                oldphase = old.phase()
-                # commit current changes as update
-                # code copied from commands.commit to avoid noisy messages
-                ciopts = dict(opts)
-                ciopts.pop('message', None)
-                ciopts.pop('logfile', None)
-                ciopts['message'] = opts.get('note') or ('amends %s' % old.hex())
-                e = cmdutil.commiteditor
-                def commitfunc(ui, repo, message, match, opts):
-                    return repo.commit(message, opts.get('user'), opts.get('date'),
-                                       match, editor=e)
-                revcount = len(repo)
-                tempid = cmdutil.commit(ui, repo, commitfunc, pats, ciopts)
-                if len(repo) == revcount:
-                    # No revision created
-                    tempid = None
-
-                # find all changesets to be considered updates
-                head = repo['.']
-                updatenodes = set(repo.changelog.nodesbetween(
-                        roots=[old.node()], heads=[head.node()])[0])
-                updatenodes.remove(old.node())
-                okoptions = ['message', 'logfile', 'edit', 'user']
-                if not updatenodes:
-                    for o in okoptions:
-                        if opts.get(o):
-                            break
-                    else:
-                        raise error.Abort(_('no updates found'))
-                updates = [repo[n] for n in updatenodes]
-
-                # perform amend
-                if opts.get('edit'):
-                    opts['force_editor'] = True
-                newid, created = rewrite(repo, old, updates, head,
-                                         [old.p1().node(), old.p2().node()], opts)
-                if created:
-                    # reroute the working copy parent to the new changeset
-                    phases.retractboundary(repo, oldphase, [newid])
-                    repo.dirstate.setparents(newid, node.nullid)
-                else:
-                    # rewrite() recreated an existing revision, discard
-                    # the intermediate revision if any. No need to update
-                    # phases or parents.
-                    if tempid is not None:
-                        repo.addobsolete(node.nullid, tempid)
-                    # XXX: need another message in collapse case.
-                    tr.close()
-                    raise error.Abort(_('no updates found'))
-                tr.close()
-            finally:
-                tr.release()
-        finally:
-            wlock.release()
-    finally:
-        lock.release()
-
-def _commitfiltered(repo, ctx, match):
+    opts = opts.copy()
+    edit = opts.pop('edit', False)
+    log = opts.get('logfile')
+    opts['amend'] = True
+    if not (edit or opts['message'] or log):
+        opts['message'] = repo['.'].description()
+    _resolveoptions(ui, opts)
+    _alias, commitcmd = cmdutil.findcmd('commit', commands.table)
+    return commitcmd[0](ui, repo, *pats, **opts)
+
+
+def _touchedbetween(repo, source, dest, match=None):
+    touched = set()
+    for files in repo.status(source, dest, match=match)[:3]:
+        touched.update(files)
+    return touched
+
+def _commitfiltered(repo, ctx, match, target=None):
     """Recommit ctx with changed files not in match. Return the new
     node identifier, or None if nothing changed.
     """
     base = ctx.p1()
-    m, a, r = repo.status(base, ctx)[:3]
-    allfiles = set(m + a + r)
-    files = set(f for f in allfiles if not match(f))
-    if files == allfiles:
+    if target is None:
+        target = base
+    # ctx
+    initialfiles = _touchedbetween(repo, base, ctx)
+    if base == target:
+        affected = set(f for f in initialfiles if match(f))
+        newcontent = set()
+    else:
+        affected = _touchedbetween(repo, target, ctx, match=match)
+        newcontent = _touchedbetween(repo, target, base, match=match)
+    # The commit touchs all existing files
+    # + all file that needs a new content
+    # - the file affected bny uncommit with the same content than base.
+    files = (initialfiles - affected) | newcontent
+    if not newcontent and files == initialfiles:
         return None
 
     # Filter copies
-    copied = copies.pathcopies(base, ctx)
+    copied = copies.pathcopies(target, ctx)
     copied = dict((src, dst) for src, dst in copied.iteritems()
                   if dst in files)
-    def filectxfn(repo, memctx, path):
-        if path not in ctx:
-            raise IOError()
-        fctx = ctx[path]
+    def filectxfn(repo, memctx, path, contentctx=ctx, redirect=newcontent):
+        if path in redirect:
+            return filectxfn(repo, memctx, path, contentctx=target, redirect=())
+        if path not in contentctx:
+            return None
+        fctx = contentctx[path]
         flags = fctx.flags()
-        mctx = context.memfilectx(fctx.path(), fctx.data(),
-                                  islink='l' in flags,
-                                  isexec='x' in flags,
-                                  copied=copied.get(path))
+        mctx = memfilectx(repo, fctx.path(), fctx.data(),
+                          islink='l' in flags,
+                          isexec='x' in flags,
+                          copied=copied.get(path))
         return mctx
 
     new = context.memctx(repo,
@@ -561,61 +2007,84 @@
 
 @command('^uncommit',
     [('a', 'all', None, _('uncommit all changes when no arguments given')),
+     ('r', 'rev', '', _('revert commit content to REV instead')),
      ] + commands.walkopts,
     _('[OPTION]... [NAME]'))
 def uncommit(ui, repo, *pats, **opts):
     """move changes from parent revision to working directory
 
-    Changes to selected files in parent revision appear again as
+    Changes to selected files in the checked out revision appear again as
     uncommitted changed in the working directory. A new revision
-    without selected changes is created, becomes the new parent and
-    obsoletes the previous one.
-
-    The --include option specify pattern to uncommit
-    The --exclude option specify pattern to keep in the commit
+    without the selected changes is created, becomes the checked out
+    revision, and obsoletes the previous one.
+
+    The --include option specifies patterns to uncommit.
+    The --exclude option specifies patterns to keep in the commit.
+
+    The --rev argument let you change the commit file to a content of another
+    revision. It still does not change the content of your file in the working
+    directory.
 
     Return 0 if changed files are uncommitted.
     """
-    lock = repo.lock()
+
+    wlock = lock = tr = None
     try:
         wlock = repo.wlock()
-        try:
-            wctx = repo[None]
-            if len(wctx.parents()) <= 0:
-                raise util.Abort(_("cannot uncommit null changeset"))
-            if len(wctx.parents()) > 1:
-                raise util.Abort(_("cannot uncommit while merging"))
-            old = repo['.']
-            if old.phase() == phases.public:
-                raise util.Abort(_("cannot rewrite immutable changeset"))
-            if len(old.parents()) > 1:
-                raise util.Abort(_("cannot uncommit merge changeset"))
-            oldphase = old.phase()
-            updatebookmarks = _bookmarksupdater(repo, old.node())
-            # Recommit the filtered changeset
-            newid = None
-            if (pats or opts.get('include') or opts.get('exclude')
-                or opts.get('all')):
-                match = scmutil.match(old, pats, opts)
-                newid = _commitfiltered(repo, old, match)
-            if newid is None:
-                raise util.Abort(_('nothing to uncommit'))
-            # Move local changes on filtered changeset
-            repo.addobsolete(newid, old.node())
-            phases.retractboundary(repo, oldphase, [newid])
-            repo.dirstate.setparents(newid, node.nullid)
-            _uncommitdirstate(repo, old, match)
-            updatebookmarks(newid)
-            if not repo[newid].files():
-                ui.warn(_("new changeset is empty\n"))
-                ui.status(_('(use "hg kill ." to remove it)\n'))
-        finally:
-            wlock.release()
+        lock = repo.lock()
+        wctx = repo[None]
+        if len(wctx.parents()) <= 0:
+            raise util.Abort(_("cannot uncommit null changeset"))
+        if len(wctx.parents()) > 1:
+            raise util.Abort(_("cannot uncommit while merging"))
+        old = repo['.']
+        if old.phase() == phases.public:
+            raise util.Abort(_("cannot rewrite immutable changeset"))
+        if len(old.parents()) > 1:
+            raise util.Abort(_("cannot uncommit merge changeset"))
+        oldphase = old.phase()
+        updatebookmarks = _bookmarksupdater(repo, old.node())
+
+
+        rev = None
+        if opts.get('rev'):
+            rev = scmutil.revsingle(repo, opts.get('rev'))
+            ctx = repo[None]
+            if ctx.p1() == rev or ctx.p2() == rev:
+                raise util.Abort(_("cannot uncommit to parent changeset"))
+
+        # Recommit the filtered changeset
+        tr = repo.transaction('uncommit')
+        newid = None
+        if (pats or opts.get('include') or opts.get('exclude')
+            or opts.get('all')):
+            match = scmutil.match(old, pats, opts)
+            newid = _commitfiltered(repo, old, match, target=rev)
+        if newid is None:
+            raise util.Abort(_('nothing to uncommit'),
+                             hint=_("use --all to uncommit all files"))
+        # Move local changes on filtered changeset
+        obsolete.createmarkers(repo, [(old, (repo[newid],))])
+        phases.retractboundary(repo, tr, oldphase, [newid])
+        repo.dirstate.beginparentchange()
+        repo.dirstate.setparents(newid, node.nullid)
+        _uncommitdirstate(repo, old, match)
+        repo.dirstate.endparentchange()
+        updatebookmarks(newid)
+        if not repo[newid].files():
+            ui.warn(_("new changeset is empty\n"))
+            ui.status(_('(use "hg prune ." to remove it)\n'))
+        tr.close()
     finally:
-        lock.release()
-
+        lockmod.release(tr, lock, wlock)
+
+@eh.wrapcommand('commit')
 def commitwrapper(orig, ui, repo, *arg, **kwargs):
-    lock = repo.lock()
+    if kwargs.get('amend', False):
+        wlock = lock = None
+    else:
+        wlock = repo.wlock()
+        lock = repo.lock()
     try:
         obsoleted = kwargs.get('obsolete', [])
         if obsoleted:
@@ -624,21 +2093,193 @@
         if not result: # commit successed
             new = repo['-1']
             oldbookmarks = []
+            markers = []
             for old in obsoleted:
                 oldbookmarks.extend(repo.nodebookmarks(old.node()))
-                repo.addobsolete(new.node(), old.node())
+                markers.append((old, (new,)))
+            if markers:
+                obsolete.createmarkers(repo, markers)
             for book in oldbookmarks:
                 repo._bookmarks[book] = new.node()
             if oldbookmarks:
-                bookmarks.write(repo)
+                repo._bookmarks.write()
         return result
     finally:
-        lock.release()
-
+        lockmod.release(lock, wlock)
+
+@command('^touch',
+    [('r', 'rev', [], 'revision to update'),
+     ('D', 'duplicate', False,
+      'do not mark the new revision as successor of the old one')],
+    # allow to choose the seed ?
+    _('[-r] revs'))
+def touch(ui, repo, *revs, **opts):
+    """create successors that are identical to their predecessors except for the changeset ID
+
+    This is used to "resurrect" changesets
+    """
+    duplicate = opts['duplicate']
+    revs = list(revs)
+    revs.extend(opts['rev'])
+    if not revs:
+        revs = ['.']
+    revs = scmutil.revrange(repo, revs)
+    if not revs:
+        ui.write_err('no revision to touch\n')
+        return 1
+    if not duplicate and repo.revs('public() and %ld', revs):
+        raise util.Abort("can't touch public revision")
+    wlock = lock = tr = None
+    try:
+        wlock = repo.wlock()
+        lock = repo.lock()
+        tr = repo.transaction('touch')
+        revs.sort() # ensure parent are run first
+        newmapping = {}
+        for r in revs:
+            ctx = repo[r]
+            extra = ctx.extra().copy()
+            extra['__touch-noise__'] = random.randint(0, 0xffffffff)
+            # search for touched parent
+            p1 = ctx.p1().node()
+            p2 = ctx.p2().node()
+            p1 = newmapping.get(p1, p1)
+            p2 = newmapping.get(p2, p2)
+            new, unusedvariable = rewrite(repo, ctx, [], ctx,
+                                          [p1, p2],
+                                          commitopts={'extra': extra})
+            # store touched version to help potential children
+            newmapping[ctx.node()] = new
+            if not duplicate:
+                obsolete.createmarkers(repo, [(ctx, (repo[new],))])
+            phases.retractboundary(repo, tr, ctx.phase(), [new])
+            if ctx in repo[None].parents():
+                repo.dirstate.beginparentchange()
+                repo.dirstate.setparents(new, node.nullid)
+                repo.dirstate.endparentchange()
+        tr.close()
+    finally:
+        lockmod.release(tr, lock, wlock)
+
+@command('^fold|squash',
+    [('r', 'rev', [], _("revision to fold")),
+     ('', 'exact', None, _("only fold specified revisions"))
+    ] + commitopts + commitopts2,
+    _('hg fold [OPTION]... [-r] REV'))
+def fold(ui, repo, *revs, **opts):
+    """fold multiple revisions into a single one
+
+    Folds a set of revisions with the parent of the working directory.
+    All revisions linearly between the given revisions and the parent
+    of the working directory will also be folded.
+
+    Use --exact for folding only the specified revisions while ignoring the
+    parent of the working directory. In this case, the given revisions must
+    form a linear unbroken chain.
+
+    .. container:: verbose
+
+     Some examples:
+
+     - Fold the current revision with its parent::
+
+         hg fold .^
+
+     - Fold all draft revisions with working directory parent::
+
+         hg fold 'draft()'
+
+       See :hg:`help phases` for more about draft revisions and
+       :hg:`help revsets` for more about the `draft()` keyword
+
+     - Fold revisions 3, 4, 5, and 6 with the working directory parent::
+
+         hg fold 3:6
+
+     - Only fold revisions linearly between foo and @::
+
+         hg fold foo::@ --exact
+    """
+    revs = list(revs)
+    revs.extend(opts['rev'])
+    if not revs:
+        raise util.Abort(_('no revisions specified'))
+
+    revs = scmutil.revrange(repo, revs)
+
+    if not opts['exact']:
+        # Try to extend given revision starting from the working directory
+        extrevs = repo.revs('(%ld::.) or (.::%ld)', revs, revs)
+        discardedrevs = [r for r in revs if r not in extrevs]
+        if discardedrevs:
+            raise util.Abort(_("cannot fold non-linear revisions"),
+                               hint=_("given revisions are unrelated to parent "
+                                      "of working directory"))
+        revs = extrevs
+
+    if len(revs) == 1:
+        ui.write_err(_('single revision specified, nothing to fold\n'))
+        return 1
+
+    roots = repo.revs('roots(%ld)', revs)
+    if len(roots) > 1:
+        raise util.Abort(_("cannot fold non-linear revisions "
+                           "(multiple roots given)"))
+    root = repo[roots.first()]
+    if root.phase() <= phases.public:
+        raise util.Abort(_("cannot fold public revisions"))
+    heads = repo.revs('heads(%ld)', revs)
+    if len(heads) > 1:
+        raise util.Abort(_("cannot fold non-linear revisions "
+                           "(multiple heads given)"))
+    head = repo[heads.first()]
+    wlock = lock = None
+    try:
+        wlock = repo.wlock()
+        lock = repo.lock()
+        tr = repo.transaction('touch')
+        try:
+            commitopts = opts.copy()
+            allctx = [repo[r] for r in revs]
+            targetphase = max(c.phase() for c in allctx)
+
+            if commitopts.get('message') or commitopts.get('logfile'):
+                commitopts['edit'] = False
+            else:
+                msgs = ["HG: This is a fold of %d changesets." % len(allctx)]
+                msgs += ["HG: Commit message of changeset %s.\n\n%s\n" %
+                         (c.rev(), c.description()) for c in allctx]
+                commitopts['message'] =  "\n".join(msgs)
+                commitopts['edit'] = True
+
+            newid, unusedvariable = rewrite(repo, root, allctx, head,
+                                            [root.p1().node(), root.p2().node()],
+                                            commitopts=commitopts)
+            phases.retractboundary(repo, tr, targetphase, [newid])
+            obsolete.createmarkers(repo, [(ctx, (repo[newid],))
+                                 for ctx in allctx])
+            tr.close()
+        finally:
+            tr.release()
+        ui.status('%i changesets folded\n' % len(revs))
+        if repo['.'].rev() in revs:
+            hg.update(repo, newid)
+    finally:
+        lockmod.release(lock, wlock)
+
+
+
+@eh.wrapcommand('graft')
 def graftwrapper(orig, ui, repo, *revs, **kwargs):
+    kwargs = dict(kwargs)
+    revs = list(revs) + kwargs.get('rev', [])
+    kwargs['rev'] = []
     obsoleted = kwargs.setdefault('obsolete', [])
-    lock = repo.lock()
+
+    wlock = lock = None
     try:
+        wlock = repo.wlock()
+        lock = repo.lock()
         if kwargs.get('old_obsolete'):
             if kwargs.get('continue'):
                 obsoleted.extend(repo.opener.read('graftstate').splitlines())
@@ -648,34 +2289,655 @@
         obsoleted[:] = [str(i) for i in repo.revs('%lr', obsoleted)]
         if obsoleted and len(revs) > 1:
 
-            raise error.Abort(_('Can not graft multiple revision while '
+            raise error.Abort(_('cannot graft multiple revisions while '
                                 'obsoleting (for now).'))
 
         return commitwrapper(orig, ui, repo,*revs, **kwargs)
     finally:
-        lock.release()
-
-def extsetup(ui):
+        lockmod.release(lock, wlock)
+
+@eh.extsetup
+def oldevolveextsetup(ui):
+    for cmd in ['kill', 'uncommit', 'touch', 'fold']:
+        entry = extensions.wrapcommand(cmdtable, cmd,
+                                       warnobserrors)
+
+    entry = cmdutil.findcmd('commit', commands.table)[1]
+    entry[1].append(('o', 'obsolete', [],
+                     _("make commit obsolete this revision (DEPRECATED)")))
+    entry = cmdutil.findcmd('graft', commands.table)[1]
+    entry[1].append(('o', 'obsolete', [],
+                     _("make graft obsoletes this revision (DEPRECATED)")))
+    entry[1].append(('O', 'old-obsolete', False,
+                     _("make graft obsoletes its source (DEPRECATED)")))
+
+#####################################################################
+### Obsolescence marker exchange experimenation                   ###
+#####################################################################
+
+def obsexcmsg(ui, message, important=False):
+    verbose = ui.configbool('experimental', 'verbose-obsolescence-exchange',
+                             False)
+    if verbose:
+        message = 'OBSEXC: ' + message
+    if important or verbose:
+        ui.status(message)
+
+def obsexcprg(ui, *args, **kwargs):
+    topic = 'obsmarkers exchange'
+    if ui.configbool('experimental', 'verbose-obsolescence-exchange', False):
+        topic = 'OBSEXC'
+    ui.progress(topic, *args, **kwargs)
+
+if getattr(exchange, '_pushdiscoveryobsmarkers', None) is not None:
+    @eh.wrapfunction(exchange, '_pushdiscoveryobsmarkers')
+    def _pushdiscoveryobsmarkers(orig, pushop):
+        if (obsolete._enabled
+            and pushop.repo.obsstore
+            and 'obsolete' in pushop.remote.listkeys('namespaces')):
+            repo = pushop.repo
+            obsexcmsg(repo.ui, "computing relevant nodes\n")
+            revs = list(repo.revs('::%ln', pushop.futureheads))
+            unfi = repo.unfiltered()
+            cl = unfi.changelog
+            if not pushop.remote.capable('_evoext_obshash_0'):
+                # do not trust core yet
+                # return orig(pushop)
+                nodes = [cl.node(r) for r in revs]
+                if nodes:
+                    obsexcmsg(repo.ui, "computing markers relevant to %i nodes\n"
+                                       % len(nodes))
+                    pushop.outobsmarkers = repo.obsstore.relevantmarkers(nodes)
+                else:
+                    obsexcmsg(repo.ui, "markers already in sync\n")
+                    pushop.outobsmarkers = []
+                    pushop.outobsmarkers = repo.obsstore.relevantmarkers(nodes)
+                return
+
+            common = []
+            obsexcmsg(repo.ui, "looking for common markers in %i nodes\n"
+                               % len(revs))
+            commonrevs = list(unfi.revs('::%ln', pushop.outgoing.commonheads))
+            common = findcommonobsmarkers(pushop.ui, unfi, pushop.remote, commonrevs)
+
+            revs = list(unfi.revs('%ld - (::%ln)', revs, common))
+            nodes = [cl.node(r) for r in revs]
+            if nodes:
+                obsexcmsg(repo.ui, "computing markers relevant to %i nodes\n"
+                                   % len(nodes))
+                pushop.outobsmarkers = repo.obsstore.relevantmarkers(nodes)
+            else:
+                obsexcmsg(repo.ui, "markers already in sync\n")
+                pushop.outobsmarkers = []
+
+@eh.wrapfunction(wireproto, 'capabilities')
+def discocapabilities(orig, repo, proto):
+    """wrapper to advertise new capability"""
+    caps = orig(repo, proto)
+    if obsolete._enabled:
+        caps += ' _evoext_obshash_0'
+    return caps
+
+@eh.extsetup
+def _installobsmarkersdiscovery(ui):
+    hgweb_mod.perms['evoext_obshash'] = 'pull'
+    hgweb_mod.perms['evoext_obshash1'] = 'pull'
+    # wrap command content
+    oldcap, args = wireproto.commands['capabilities']
+    def newcap(repo, proto):
+        return discocapabilities(oldcap, repo, proto)
+    wireproto.commands['capabilities'] = (newcap, args)
+    wireproto.commands['evoext_obshash'] = (srv_obshash, 'nodes')
+    wireproto.commands['evoext_obshash1'] = (srv_obshash1, 'nodes')
+    if getattr(exchange, '_pushdiscoveryobsmarkers', None) is None:
+        ui.warn('evolve: your mercurial version is too old\n'
+                'evolve: (running in degraded mode, push will includes all markers)\n')
+    else:
+        olddisco = exchange.pushdiscoverymapping['obsmarker']
+        def newdisco(pushop):
+            _pushdiscoveryobsmarkers(olddisco, pushop)
+        exchange.pushdiscoverymapping['obsmarker'] = newdisco
+
+### Set discovery START
+
+from mercurial import dagutil
+from mercurial import setdiscovery
+
+def _obshash(repo, nodes, version=0):
+    if version == 0:
+        hashs = _obsrelsethashtreefm0(repo)
+    elif version ==1:
+        hashs = _obsrelsethashtreefm1(repo)
+    else:
+        assert False
+    nm = repo.changelog.nodemap
+    revs = [nm.get(n) for n in nodes]
+    return [r is None and nullid or hashs[r][1] for r in revs]
+
+def srv_obshash(repo, proto, nodes):
+    return wireproto.encodelist(_obshash(repo, wireproto.decodelist(nodes)))
+
+def srv_obshash1(repo, proto, nodes):
+    return wireproto.encodelist(_obshash(repo, wireproto.decodelist(nodes), version=1))
+
+@eh.addattr(localrepo.localpeer, 'evoext_obshash')
+def local_obshash(peer, nodes):
+    return _obshash(peer._repo, nodes)
+
+@eh.addattr(localrepo.localpeer, 'evoext_obshash1')
+def local_obshash1(peer, nodes):
+    return _obshash(peer._repo, nodes, version=1)
+
+@eh.addattr(wireproto.wirepeer, 'evoext_obshash')
+def peer_obshash(self, nodes):
+    d = self._call("evoext_obshash", nodes=wireproto.encodelist(nodes))
+    try:
+        return wireproto.decodelist(d)
+    except ValueError:
+        self._abort(error.ResponseError(_("unexpected response:"), d))
+
+@eh.addattr(wireproto.wirepeer, 'evoext_obshash1')
+def peer_obshash1(self, nodes):
+    d = self._call("evoext_obshash1", nodes=wireproto.encodelist(nodes))
     try:
-        obsolete = extensions.find('obsolete')
-    except KeyError:
-        raise error.Abort(_('evolution extension requires obsolete extension.'))
+        return wireproto.decodelist(d)
+    except ValueError:
+        self._abort(error.ResponseError(_("unexpected response:"), d))
+
+def findcommonobsmarkers(ui, local, remote, probeset,
+                         initialsamplesize=100,
+                         fullsamplesize=200):
+    # from discovery
+    roundtrips = 0
+    cl = local.changelog
+    dag = dagutil.revlogdag(cl)
+    missing = set()
+    common = set()
+    undecided = set(probeset)
+    _takefullsample = setdiscovery._takefullsample
+    if remote.capable('_evoext_obshash_1'):
+        getremotehash = remote.evoext_obshash1
+        localhash = _obsrelsethashtreefm1(local)
+    else:
+        getremotehash = remote.evoext_obshash
+        localhash = _obsrelsethashtreefm0(local)
+
+    while undecided:
+
+        ui.note(_("sampling from both directions\n"))
+        if len(undecided) < fullsamplesize:
+            sample = set(undecided)
+        else:
+            sample = _takefullsample(dag, undecided, size=fullsamplesize)
+
+        roundtrips += 1
+        ui.debug("query %i; still undecided: %i, sample size is: %i\n"
+                 % (roundtrips, len(undecided), len(sample)))
+        # indices between sample and externalized version must match
+        sample = list(sample)
+        remotehash = getremotehash(dag.externalizeall(sample))
+
+        yesno = [localhash[ix][1] == remotehash[si]
+                 for si, ix in enumerate(sample)]
+
+        commoninsample = set(n for i, n in enumerate(sample) if yesno[i])
+        common.update(dag.ancestorset(commoninsample, common))
+
+        missinginsample = [n for i, n in enumerate(sample) if not yesno[i]]
+        missing.update(dag.descendantset(missinginsample, missing))
+
+        undecided.difference_update(missing)
+        undecided.difference_update(common)
+
+
+    result = dag.headsetofconnecteds(common)
+    ui.debug("%d total queries\n" % roundtrips)
+
+    if not result:
+        return set([nullid])
+    return dag.externalizeall(result)
+
+
+_pushkeyescape = getattr(obsolete, '_pushkeyescape', None)
+
+class pushobsmarkerStringIO(StringIO):
+    """hacky string io for progress"""
+
+    @util.propertycache
+    def length(self):
+        return len(self.getvalue())
+
+    def read(self, size=None):
+        obsexcprg(self.ui, self.tell(), unit="bytes", total=self.length)
+        return StringIO.read(self, size)
+
+    def __iter__(self):
+        d = self.read(4096)
+        while d:
+            yield d
+            d = self.read(4096)
+
+@eh.wrapfunction(exchange, '_pushobsolete')
+def _pushobsolete(orig, pushop):
+    """utility function to push obsolete markers to a remote"""
+    stepsdone = getattr(pushop, 'stepsdone', None)
+    if stepsdone is not None:
+        if 'obsmarkers' in stepsdone:
+            return
+        stepsdone.add('obsmarkers')
+    if util.safehasattr(pushop, 'cgresult'):
+        cgresult = pushop.cgresult
+    else:
+        cgresult = pushop.ret
+    if cgresult == 0:
+        return
+    pushop.ui.debug('try to push obsolete markers to remote\n')
+    repo = pushop.repo
+    remote = pushop.remote
+    if (obsolete._enabled  and repo.obsstore and
+        'obsolete' in remote.listkeys('namespaces')):
+        markers = pushop.outobsmarkers
+        if not markers:
+            obsexcmsg(repo.ui, "no marker to push\n")
+        elif remote.capable('_evoext_pushobsmarkers_0'):
+            obsdata = pushobsmarkerStringIO()
+            for chunk in obsolete.encodemarkers(markers, True):
+                obsdata.write(chunk)
+            obsdata.seek(0)
+            obsdata.ui = repo.ui
+            obsexcmsg(repo.ui, "pushing %i obsolescence markers (%i bytes)\n"
+                               % (len(markers), len(obsdata.getvalue())),
+                      True)
+            remote.evoext_pushobsmarkers_0(obsdata)
+            obsexcprg(repo.ui, None)
+        else:
+            rslts = []
+            remotedata = _pushkeyescape(markers).items()
+            totalbytes = sum(len(d) for k,d in remotedata)
+            sentbytes = 0
+            obsexcmsg(repo.ui, "pushing %i obsolescence markers in %i pushkey payload (%i bytes)\n"
+                                % (len(markers), len(remotedata), totalbytes),
+                      True)
+            for key, data in remotedata:
+                obsexcprg(repo.ui, sentbytes, item=key, unit="bytes",
+                          total=totalbytes)
+                rslts.append(remote.pushkey('obsolete', key, '', data))
+                sentbytes += len(data)
+                obsexcprg(repo.ui, sentbytes, item=key, unit="bytes",
+                          total=totalbytes)
+            obsexcprg(repo.ui, None)
+            if [r for r in rslts if not r]:
+                msg = _('failed to push some obsolete markers!\n')
+                repo.ui.warn(msg)
+        obsexcmsg(repo.ui, "DONE\n")
+
+
+@eh.addattr(wireproto.wirepeer, 'evoext_pushobsmarkers_0')
+def client_pushobsmarkers(self, obsfile):
+    """wireprotocol peer method"""
+    self.requirecap('_evoext_pushobsmarkers_0',
+                    _('push obsolete markers faster'))
+    ret, output = self._callpush('evoext_pushobsmarkers_0', obsfile)
+    for l in output.splitlines(True):
+        self.ui.status(_('remote: '), l)
+    return ret
+
+@eh.addattr(httppeer.httppeer, 'evoext_pushobsmarkers_0')
+def httpclient_pushobsmarkers(self, obsfile):
+    """httpprotocol peer method
+    (Cannot simply use _callpush as http is doing some special handling)"""
+    self.requirecap('_evoext_pushobsmarkers_0',
+                    _('push obsolete markers faster'))
+    try:
+        r = self._call('evoext_pushobsmarkers_0', data=obsfile)
+        vals = r.split('\n', 1)
+        if len(vals) < 2:
+            raise error.ResponseError(_("unexpected response:"), r)
+
+        for l in vals[1].splitlines(True):
+            if l.strip():
+                self.ui.status(_('remote: '), l)
+        return vals[0]
+    except socket.error, err:
+        if err.args[0] in (errno.ECONNRESET, errno.EPIPE):
+            raise util.Abort(_('push failed: %s') % err.args[1])
+        raise util.Abort(err.args[1])
+
+@eh.wrapfunction(localrepo.localrepository, '_restrictcapabilities')
+def local_pushobsmarker_capabilities(orig, repo, caps):
+    caps = orig(repo, caps)
+    caps.add('_evoext_pushobsmarkers_0')
+    return caps
+
+@eh.addattr(localrepo.localpeer, 'evoext_pushobsmarkers_0')
+def local_pushobsmarkers(peer, obsfile):
+    data = obsfile.read()
+    tr = lock = None
     try:
-        rebase = extensions.find('rebase')
-    except KeyError:
-        rebase = None
-        raise error.Abort(_('evolution extension requires rebase extension.'))
-
-    for cmd in ['amend', 'kill', 'uncommit']:
-        entry = extensions.wrapcommand(cmdtable, cmd,
-                                       obsolete.warnobserrors)
-
-    entry = extensions.wrapcommand(commands.table, 'commit', commitwrapper)
-    entry[1].append(('o', 'obsolete', [],
-                     _("make commit obsolete this revision")))
-    entry = extensions.wrapcommand(commands.table, 'graft', graftwrapper)
-    entry[1].append(('o', 'obsolete', [],
-                     _("make graft obsoletes this revision")))
-    entry[1].append(('O', 'old-obsolete', False,
-                     _("make graft obsoletes its source")))
-
+        lock = peer._repo.lock()
+        tr = peer._repo.transaction('pushkey: obsolete markers')
+        new = peer._repo.obsstore.mergemarkers(tr, data)
+        if new is not None:
+            obsexcmsg(peer._repo.ui, "%i obsolescence markers added\n" % new, True)
+        tr.close()
+    finally:
+        lockmod.release(tr, lock)
+    peer._repo.hook('evolve_pushobsmarkers')
+
+def srv_pushobsmarkers(repo, proto):
+    """wireprotocol command"""
+    fp = StringIO()
+    proto.redirect()
+    proto.getfile(fp)
+    data = fp.getvalue()
+    fp.close()
+    tr = lock = None
+    try:
+        lock = repo.lock()
+        tr = repo.transaction('pushkey: obsolete markers')
+        new = repo.obsstore.mergemarkers(tr, data)
+        if new is not None:
+            obsexcmsg(repo.ui, "%i obsolescence markers added\n" % new, True)
+        tr.close()
+    finally:
+        lockmod.release(tr, lock)
+    repo.hook('evolve_pushobsmarkers')
+    return wireproto.pushres(0)
+
+def _buildpullobsmarkersboundaries(pullop):
+    """small funtion returning the argument for pull markers call
+    may to contains 'heads' and 'common'. skip the key for None.
+
+    Its a separed functio to play around with strategy for that."""
+    repo = pullop.repo
+    remote = pullop.remote
+    unfi = repo.unfiltered()
+    revs = unfi.revs('::(%ln - null)', pullop.common)
+    common = [nullid]
+    if remote.capable('_evoext_obshash_0'):
+        obsexcmsg(repo.ui, "looking for common markers in %i nodes\n"
+                           % len(revs))
+        common = findcommonobsmarkers(repo.ui, repo, remote, revs)
+    return {'heads': pullop.pulledsubset, 'common': common}
+
+@eh.uisetup
+def addgetbundleargs(self):
+    gboptsmap['evo_obscommon'] = 'nodes'
+
+@eh.wrapfunction(exchange, '_pullbundle2extraprepare')
+def _addobscommontob2pull(orig, pullop, kwargs):
+    ret = orig(pullop, kwargs)
+    if 'obsmarkers' in kwargs and pullop.remote.capable('_evoext_getbundle_obscommon'):
+        boundaries = _buildpullobsmarkersboundaries(pullop)
+        common = boundaries['common']
+        if common != [nullid]:
+            kwargs['evo_obscommon'] = common
+    return ret
+
+if getattr(exchange, '_getbundleobsmarkerpart', None) is not None:
+    @eh.wrapfunction(exchange, '_getbundleobsmarkerpart')
+    def _getbundleobsmarkerpart(orig, bundler, repo, source, **kwargs):
+        if 'evo_obscommon' not in kwargs:
+            return orig(bundler, repo, source, **kwargs)
+
+        heads = kwargs.get('heads')
+        if kwargs.get('obsmarkers', False):
+            if heads is None:
+                heads = repo.heads()
+            obscommon = kwargs.get('evo_obscommon', ())
+            assert obscommon
+            obsset = repo.unfiltered().set('::%ln - ::%ln', heads, obscommon)
+            subset = [c.node() for c in obsset]
+            markers = repo.obsstore.relevantmarkers(subset)
+            exchange.buildobsmarkerspart(bundler, markers)
+
+    @eh.uisetup
+    def installgetbundlepartgen(ui):
+        origfunc = exchange.getbundle2partsmapping['obsmarkers']
+        def newfunc(*args, **kwargs):
+            return _getbundleobsmarkerpart(origfunc, *args, **kwargs)
+        exchange.getbundle2partsmapping['obsmarkers'] = newfunc
+
+
+@eh.wrapfunction(exchange, '_pullobsolete')
+def _pullobsolete(orig, pullop):
+    if not obsolete._enabled:
+        return None
+    if 'obsmarkers' not in getattr(pullop, 'todosteps', ['obsmarkers']):
+        return None
+    if 'obsmarkers' in getattr(pullop, 'stepsdone', []):
+        return None
+    wirepull = pullop.remote.capable('_evoext_pullobsmarkers_0')
+    if not wirepull:
+        return orig(pullop)
+    if 'obsolete' not in pullop.remote.listkeys('namespaces'):
+        return None # remote opted out of obsolescence marker exchange
+    tr = None
+    ui = pullop.repo.ui
+    boundaries = _buildpullobsmarkersboundaries(pullop)
+    if not set(boundaries['heads']) - set(boundaries['common']):
+        obsexcmsg(ui, "nothing to pull\n")
+        return None
+
+    obsexcmsg(ui, "pull obsolescence markers\n", True)
+    new = 0
+
+    if wirepull:
+        obsdata = pullop.remote.evoext_pullobsmarkers_0(**boundaries)
+        obsdata = obsdata.read()
+        if len(obsdata) > 5:
+            obsexcmsg(ui, "merging obsolescence markers (%i bytes)\n"
+                           % len(obsdata))
+            tr = pullop.gettransaction()
+            old = len(pullop.repo.obsstore._all)
+            pullop.repo.obsstore.mergemarkers(tr, obsdata)
+            new = len(pullop.repo.obsstore._all) - old
+            obsexcmsg(ui, "%i obsolescence markers added\n" % new, True)
+        else:
+            obsexcmsg(ui, "no unknown remote markers\n")
+        obsexcmsg(ui, "DONE\n")
+    if new:
+        pullop.repo.invalidatevolatilesets()
+    return tr
+
+def _getobsmarkersstream(repo, heads=None, common=None):
+    revset = ''
+    args = []
+    repo = repo.unfiltered()
+    if heads is None:
+        revset = 'all()'
+    elif heads:
+        revset += "(::%ln)"
+        args.append(heads)
+    else:
+        assert False, 'pulling no heads?'
+    if common:
+        revset += ' - (::%ln)'
+        args.append(common)
+    nodes = [c.node() for c in repo.set(revset, *args)]
+    markers = repo.obsstore.relevantmarkers(nodes)
+    obsdata = StringIO()
+    for chunk in obsolete.encodemarkers(markers, True):
+        obsdata.write(chunk)
+    obsdata.seek(0)
+    return obsdata
+
+@eh.addattr(wireproto.wirepeer, 'evoext_pullobsmarkers_0')
+def client_pullobsmarkers(self, heads=None, common=None):
+    self.requirecap('_evoext_pullobsmarkers_0', _('look up remote obsmarkers'))
+    opts = {}
+    if heads is not None:
+        opts['heads'] = wireproto.encodelist(heads)
+    if common is not None:
+        opts['common'] = wireproto.encodelist(common)
+    if util.safehasattr(self, '_callcompressable'):
+        f = self._callcompressable("evoext_pullobsmarkers_0", **opts)
+    else:
+        f = self._callstream("evoext_pullobsmarkers_0", **opts)
+        f = self._decompress(f)
+    length = int(f.read(20))
+    chunk = 4096
+    current = 0
+    data = StringIO()
+    ui = self.ui
+    obsexcprg(ui, current, unit="bytes", total=length)
+    while current < length:
+        readsize = min(length-current, chunk)
+        data.write(f.read(readsize))
+        current += readsize
+        obsexcprg(ui, current, unit="bytes", total=length)
+    obsexcprg(ui, None)
+    data.seek(0)
+    return data
+
+@eh.addattr(localrepo.localpeer, 'evoext_pullobsmarkers_0')
+def local_pullobsmarkers(self, heads=None, common=None):
+    return _getobsmarkersstream(self._repo, heads=heads, common=common)
+
+def srv_pullobsmarkers(repo, proto, others):
+    opts = wireproto.options('', ['heads', 'common'], others)
+    for k, v in opts.iteritems():
+        if k in ('heads', 'common'):
+            opts[k] = wireproto.decodelist(v)
+    obsdata = _getobsmarkersstream(repo, **opts)
+    finaldata = StringIO()
+    obsdata = obsdata.getvalue()
+    finaldata.write('%20i' % len(obsdata))
+    finaldata.write(obsdata)
+    finaldata.seek(0)
+    return wireproto.streamres(proto.groupchunks(finaldata))
+
+def _obsrelsethashtreefm0(repo):
+    return _obsrelsethashtree(repo, obsolete._fm0encodeonemarker)
+
+def _obsrelsethashtreefm1(repo):
+    return _obsrelsethashtree(repo, obsolete._fm1encodeonemarker)
+
+def _obsrelsethashtree(repo, encodeonemarker):
+    cache = []
+    unfi = repo.unfiltered()
+    markercache = {}
+    for i in unfi:
+        ctx = unfi[i]
+        entry = 0
+        sha = util.sha1()
+        # add data from p1
+        for p in ctx.parents():
+            p = p.rev()
+            if p < 0:
+                p = nullid
+            else:
+                p = cache[p][1]
+            if p != nullid:
+                entry += 1
+                sha.update(p)
+        tmarkers = repo.obsstore.relevantmarkers([ctx.node()])
+        if tmarkers:
+            bmarkers = []
+            for m in tmarkers:
+                if not m in markercache:
+                    markercache[m] = encodeonemarker(m)
+                bmarkers.append(markercache[m])
+            bmarkers.sort()
+            for m in bmarkers:
+                entry += 1
+                sha.update(m)
+        if entry:
+            cache.append((ctx.node(), sha.digest()))
+        else:
+            cache.append((ctx.node(), nullid))
+    return cache
+
+@command('debugobsrelsethashtree',
+        [('', 'v0', None, 'hash on marker format "0"'),
+         ('', 'v1', None, 'hash on marker format "1" (default)')
+         ,] , _(''))
+def debugobsrelsethashtree(ui, repo, v0=False, v1=False):
+    """display Obsolete markers, Relevant Set, Hash Tree
+    changeset-node obsrelsethashtree-node
+
+    It computed form the "orsht" of its parent and markers
+    relevant to the changeset itself."""
+    if v0 and v1:
+        raise util.Abort('cannot only specify one format')
+    elif v0:
+        treefunc = _obsrelsethashtreefm0
+    else:
+        treefunc = _obsrelsethashtreefm1
+
+    for chg, obs in treefunc(repo):
+        ui.status('%s %s\n' % (node.hex(chg), node.hex(obs)))
+
+_bestformat = max(obsolete.formats.keys())
+
+
+if getattr(obsolete, '_checkinvalidmarkers', None) is not None:
+    @eh.wrapfunction(obsolete, '_checkinvalidmarkers')
+    def _checkinvalidmarkers(orig, markers):
+        """search for marker with invalid data and raise error if needed
+
+        Exist as a separated function to allow the evolve extension for a more
+        subtle handling.
+        """
+        if 'debugobsconvert' in sys.argv:
+            return
+        for mark in markers:
+            if node.nullid in mark[1]:
+                raise util.Abort(_('bad obsolescence marker detected: '
+                                   'invalid successors nullid'),
+                                 hint=_('You should run `hg debugobsconvert`'))
+
+@command(
+    'debugobsconvert',
+    [('', 'new-format', _bestformat, _('Destination format for markers.'))],
+    '')
+def debugobsconvert(ui, repo, new_format):
+    if new_format == repo.obsstore._version:
+        msg = _('New format is the same as the old format, not upgrading!')
+        raise util.Abort(msg)
+    f = repo.sopener('obsstore', 'wb', atomictemp=True)
+    origmarkers = repo.obsstore._all
+    known = set()
+    markers = []
+    for m in origmarkers:
+        # filter out invalid markers
+        if nullid in m[1]:
+            m = list(m)
+            m[1] = tuple(s for s in m[1] if s != nullid)
+            m = tuple(m)
+        if m in known:
+            continue
+        known.add(m)
+        markers.append(m)
+    ui.write(_('Old store is version %d, will rewrite in version %d\n') % (
+        repo.obsstore._version, new_format))
+    map(f.write, obsolete.encodemarkers(markers, True, new_format))
+    f.close()
+    ui.write(_('Done!\n'))
+
+
+@eh.wrapfunction(wireproto, 'capabilities')
+def capabilities(orig, repo, proto):
+    """wrapper to advertise new capability"""
+    caps = orig(repo, proto)
+    if obsolete._enabled:
+        caps += ' _evoext_pushobsmarkers_0'
+        caps += ' _evoext_pullobsmarkers_0'
+        caps += ' _evoext_obshash_0'
+        caps += ' _evoext_obshash_1'
+        caps += ' _evoext_getbundle_obscommon'
+    return caps
+
+
+@eh.extsetup
+def _installwireprotocol(ui):
+    localrepo.moderncaps.add('_evoext_pullobsmarkers_0')
+    hgweb_mod.perms['evoext_pushobsmarkers_0'] = 'push'
+    hgweb_mod.perms['evoext_pullobsmarkers_0'] = 'pull'
+    wireproto.commands['evoext_pushobsmarkers_0'] = (srv_pushobsmarkers, '')
+    wireproto.commands['evoext_pullobsmarkers_0'] = (srv_pullobsmarkers, '*')
+    # wrap command content
+    oldcap, args = wireproto.commands['capabilities']
+    def newcap(repo, proto):
+        return capabilities(oldcap, repo, proto)
+    wireproto.commands['capabilities'] = (newcap, args)
--- a/hgext/obsolete.py
+++ b/hgext/obsolete.py
@@ -1,781 +1,62 @@
-# obsolete.py - introduce the obsolete concept in mercurial.
-#
 # Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
 #                Logilab SA        <contact@logilab.fr>
 #
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2 or any later version.
-"""Introduce the Obsolete concept to mercurial
-
-General concept
-===============
-
-This extension introduces the *obsolete* concept. It adds a new *obsolete*
-relation between two changesets. A relation ``<changeset B> obsolete <changeset
-A>`` is set to denote that ``<changeset B>`` is new version of ``<changeset
-A>``.
-
-The *obsolete* relation act as a **perpendicular history** to the standard
-changeset history. Standard changeset history versions files. The *obsolete*
-relation versions changesets.
-
-:obsolete:     a changeset that has been replaced by another one.
-:unstable:     a changeset that is not obsolete but has an obsolete ancestor.
-:suspended:    an obsolete changeset with unstable descendant.
-:extinct:      an obsolete changeset without unstable descendant.
-               (subject to garbage collection)
-
-Another name for unstable could be out of sync.
-
-
-Usage and Feature
-=================
-
-Display and Exchange
---------------------
-
-obsolete changesets are hidden. (except if they have non obsolete changeset)
+"""Deprecated extension that formely introduces "Changeset Obsolescence".
 
-obsolete changesets are not exchanged. This will probably change later but it
-was the simpler solution for now.
-
-New commands
-------------
-
-Note that rebased changesets are now marked obsolete instead of being stripped.
-
-Context object
---------------
-
-Context gains a ``obsolete`` method that will return True if a changeset is
-obsolete False otherwise.
-
-revset
-------
+This concept is now partially in Mercurial core (starting with mercurial 2.3). The remaining logic have been grouped with the evolve extension.
 
-Add an ``obsolete()`` entry.
-
-repo extension
---------------
-
-To Do
-~~~~~
-
-- refuse to obsolete published changesets
-
-- handle split
-
-- handle conflict
-
-- handle unstable // out of sync
-
+Some code cemains in this extensions to detect and convert prehistoric format of obsolete marker than early user may have create. Keep it enabled if you were such user.
 """
 
-import os
-try:
-    from cStringIO import StringIO
-except ImportError:
-    from StringIO import StringIO
-
-from mercurial.i18n import _
-
-import base64
-import json
-
-import struct
-from mercurial import util, base85
-
-_pack = struct.pack
-_unpack = struct.unpack
-
 from mercurial import util
-from mercurial import context
-from mercurial import revset
-from mercurial import scmutil
-from mercurial import extensions
-from mercurial import pushkey
-from mercurial import discovery
-from mercurial import error
-from mercurial import commands
-from mercurial import changelog
-from mercurial import phases
-from mercurial.node import hex, bin, short, nullid
-from mercurial.lock import release
-from mercurial import localrepo
-from mercurial import cmdutil
-from mercurial import templatekw
 
 try:
-    from mercurial.localrepo import storecache
-    storecache('babar') # to trigger import
-except (TypeError, ImportError):
-    def storecache(*args):
-        return scmutil.filecache(*args, instore=True)
-
-
-### Patch changectx
-#############################
-
-def obsolete(ctx):
-    """is the changeset obsolete by other"""
-    if ctx.node()is None:
-        return False
-    return bool(ctx._repo.obsoletedby(ctx.node())) and ctx.phase()
-
-context.changectx.obsolete = obsolete
-
-def unstable(ctx):
-    """is the changeset unstable (have obsolete ancestor)"""
-    if ctx.node() is None:
-        return False
-    return ctx.rev() in ctx._repo._unstableset
-
-context.changectx.unstable = unstable
-
-def extinct(ctx):
-    """is the changeset extinct by other"""
-    if ctx.node() is None:
-        return False
-    return ctx.rev() in ctx._repo._extinctset
-
-context.changectx.extinct = extinct
-
-def latecomer(ctx):
-    """is the changeset latecomer (Try to succeed to public change)"""
-    if ctx.node() is None:
-        return False
-    return ctx.rev() in ctx._repo._latecomerset
-
-context.changectx.latecomer = latecomer
-
-def conflicting(ctx):
-    """is the changeset conflicting (Try to succeed to public change)"""
-    if ctx.node() is None:
-        return False
-    return ctx.rev() in ctx._repo._conflictingset
-
-context.changectx.conflicting = conflicting
-
-
-### revset
-#############################
-
-def revsethidden(repo, subset, x):
-    """hidden changesets"""
-    args = revset.getargs(x, 0, 0, 'hidden takes no argument')
-    return [r for r in subset if r in repo.changelog.hiddenrevs]
-
-def revsetobsolete(repo, subset, x):
-    """obsolete changesets"""
-    args = revset.getargs(x, 0, 0, 'obsolete takes no argument')
-    return [r for r in subset if r in repo._obsoleteset and repo._phasecache.phase(repo, r) > 0]
-
-# XXX Backward compatibility, to be removed once stabilized
-if '_phasecache' not in vars(localrepo.localrepository): # new api
-    def revsetobsolete(repo, subset, x):
-        """obsolete changesets"""
-        args = revset.getargs(x, 0, 0, 'obsolete takes no argument')
-        return [r for r in subset if r in repo._obsoleteset and repo._phaserev[r] > 0]
-
-def revsetunstable(repo, subset, x):
-    """non obsolete changesets descendant of obsolete one"""
-    args = revset.getargs(x, 0, 0, 'unstable takes no arguments')
-    return [r for r in subset if r in repo._unstableset]
-
-def revsetsuspended(repo, subset, x):
-    """obsolete changesets with non obsolete descendants"""
-    args = revset.getargs(x, 0, 0, 'suspended takes no arguments')
-    return [r for r in subset if r in repo._suspendedset]
-
-def revsetextinct(repo, subset, x):
-    """obsolete changesets without obsolete descendants"""
-    args = revset.getargs(x, 0, 0, 'extinct takes no arguments')
-    return [r for r in subset if r in repo._extinctset]
-
-def revsetlatecomer(repo, subset, x):
-    """latecomer, Try to succeed to public change"""
-    args = revset.getargs(x, 0, 0, 'latecomer takes no arguments')
-    return [r for r in subset if r in repo._latecomerset]
-
-def revsetconflicting(repo, subset, x):
-    """conflicting, Try to succeed to public change"""
-    args = revset.getargs(x, 0, 0, 'conflicting takes no arguments')
-    return [r for r in subset if r in repo._conflictingset]
+    from mercurial import obsolete
+    if not obsolete._enabled:
+        obsolete._enabled = True
+except ImportError:
+    raise util.Abort('Obsolete extension requires Mercurial 2.3 (or later)')
 
-def _precursors(repo, s):
-    """Precursor of a changeset"""
-    cs = set()
-    nm = repo.changelog.nodemap
-    markerbysubj = repo.obsstore.successors
-    for r in s:
-        for p in markerbysubj.get(repo[r].node(), ()):
-            pr = nm.get(p[0])
-            if pr is not None:
-                cs.add(pr)
-    return cs
-
-def revsetprecursors(repo, subset, x):
-    """precursors of a subset"""
-    s = revset.getset(repo, range(len(repo)), x)
-    cs = _precursors(repo, s)
-    return [r for r in subset if r in cs]
-
-def _allprecursors(repo, s):  # XXX we need a better naming
-    """transitive precursors of a subset"""
-    toproceed = [repo[r].node() for r in s]
-    seen = set()
-    allsubjects = repo.obsstore.successors
-    while toproceed:
-        nc = toproceed.pop()
-        for mark in allsubjects.get(nc, ()):
-            np = mark[0]
-            if np not in seen:
-                seen.add(np)
-                toproceed.append(np)
-    nm = repo.changelog.nodemap
-    cs = set()
-    for p in seen:
-        pr = nm.get(p)
-        if pr is not None:
-            cs.add(pr)
-    return cs
-
-def revsetallprecursors(repo, subset, x):
-    """obsolete parents"""
-    s = revset.getset(repo, range(len(repo)), x)
-    cs = _allprecursors(repo, s)
-    return [r for r in subset if r in cs]
+import sys
+import json
 
-def _successors(repo, s):
-    """Successors of a changeset"""
-    cs = set()
-    nm = repo.changelog.nodemap
-    markerbyobj = repo.obsstore.precursors
-    for r in s:
-        for p in markerbyobj.get(repo[r].node(), ()):
-            for sub in p[1]:
-                sr = nm.get(sub)
-                if sr is not None:
-                    cs.add(sr)
-    return cs
-
-def revsetsuccessors(repo, subset, x):
-    """successors of a subset"""
-    s = revset.getset(repo, range(len(repo)), x)
-    cs = _successors(repo, s)
-    return [r for r in subset if r in cs]
-
-def _allsuccessors(repo, s):  # XXX we need a better naming
-    """transitive successors of a subset"""
-    toproceed = [repo[r].node() for r in s]
-    seen = set()
-    allobjects = repo.obsstore.precursors
-    while toproceed:
-        nc = toproceed.pop()
-        for mark in allobjects.get(nc, ()):
-            for sub in mark[1]:
-                if sub == nullid:
-                    continue # should not be here!
-                if sub not in seen:
-                    seen.add(sub)
-                    toproceed.append(sub)
-    nm = repo.changelog.nodemap
-    cs = set()
-    for s in seen:
-        sr = nm.get(s)
-        if sr is not None:
-            cs.add(sr)
-    return cs
-
-def revsetallsuccessors(repo, subset, x):
-    """obsolete parents"""
-    s = revset.getset(repo, range(len(repo)), x)
-    cs = _allsuccessors(repo, s)
-    return [r for r in subset if r in cs]
-
-
-### template keywords
-#####################
-
-def obsoletekw(repo, ctx, templ, **args):
-    """:obsolete: String. The obsolescence level of the node, could be
-    ``stable``, ``unstable``, ``suspended`` or ``extinct``.
-    """
-    rev = ctx.rev()
-    if rev in repo._extinctset:
-        return 'extinct'
-    if rev in repo._suspendedset:
-        return 'suspended'
-    if rev in repo._unstableset:
-        return 'unstable'
-    return 'stable'
-
-### Other Extension compat
-############################
+from mercurial import cmdutil
+from mercurial import error
+from mercurial.node import bin, nullid
 
 
-def buildstate(orig, repo, dest, rebaseset, *ags, **kws):
-    """wrapper for rebase 's buildstate that exclude obsolete changeset"""
-    rebaseset = repo.revs('%ld - extinct()', rebaseset)
-    return orig(repo, dest, rebaseset, *ags, **kws)
-
-def defineparents(orig, repo, rev, target, state, *args, **kwargs):
-    rebasestate = getattr(repo, '_rebasestate', None)
-    if rebasestate is not None:
-        repo._rebasestate = dict(state)
-        repo._rebasetarget = target
-    return orig(repo, rev, target, state, *args, **kwargs)
-
-def concludenode(orig, repo, rev, p1, *args, **kwargs):
-    """wrapper for rebase 's concludenode that set obsolete relation"""
-    newrev = orig(repo, rev, p1, *args, **kwargs)
-    rebasestate = getattr(repo, '_rebasestate', None)
-    if rebasestate is not None:
-        if newrev is not None:
-            nrev = repo[newrev].rev()
-        else:
-            nrev = p1
-        repo._rebasestate[rev] = nrev
-    return newrev
-
-def cmdrebase(orig, ui, repo, *args, **kwargs):
-
-    reallykeep = kwargs.get('keep', False)
-    kwargs = dict(kwargs)
-    kwargs['keep'] = True
+#####################################################################
+### Older format management                                       ###
+#####################################################################
 
-    # We want to mark rebased revision as obsolete and set their
-    # replacements if any. Doing it in concludenode() prevents
-    # aborting the rebase, and is not called with all relevant
-    # revisions in --collapse case. Instead, we try to track the
-    # rebase state structure by sampling/updating it in
-    # defineparents() and concludenode(). The obsolete markers are
-    # added from this state after a successful call.
-    repo._rebasestate = {}
-    repo._rebasetarget = None
-    try:
-        res = orig(ui, repo, *args, **kwargs)
-        if not reallykeep:
-            # Filter nullmerge or unrebased entries
-            repo._rebasestate = dict(p for p in repo._rebasestate.iteritems()
-                                     if p[1] >= 0)
-            if not res and not kwargs.get('abort') and repo._rebasestate:
-                # Rebased revisions are assumed to be descendants of
-                # targetrev. If a source revision is mapped to targetrev
-                # or to another rebased revision, it must have been
-                # removed.
-                targetrev = repo[repo._rebasetarget].rev()
-                newrevs = set([targetrev])
-                replacements = {}
-                for rev, newrev in sorted(repo._rebasestate.items()):
-                    oldnode = repo[rev].node()
-                    if newrev not in newrevs:
-                        newnode = repo[newrev].node()
-                        newrevs.add(newrev)
-                    else:
-                        newnode = nullid
-                    replacements[oldnode] = newnode
-
-                if kwargs.get('collapse'):
-                    newnodes = set(n for n in replacements.values() if n != nullid)
-                    if newnodes:
-                        # Collapsing into more than one revision?
-                        assert len(newnodes) == 1, newnodes
-                        newnode = newnodes.pop()
-                    else:
-                        newnode = nullid
-                    repo.addcollapsedobsolete(replacements, newnode)
-                else:
-                    for oldnode, newnode in replacements.iteritems():
-                        repo.addobsolete(newnode, oldnode)
-        return res
-    finally:
-        delattr(repo, '_rebasestate')
-        delattr(repo, '_rebasetarget')
+# Code related to detection and management of older legacy format never
+# handled by core
 
 
-def extsetup(ui):
-
-    revset.symbols["hidden"] = revsethidden
-    revset.symbols["obsolete"] = revsetobsolete
-    revset.symbols["unstable"] = revsetunstable
-    revset.symbols["suspended"] = revsetsuspended
-    revset.symbols["extinct"] = revsetextinct
-    revset.symbols["latecomer"] = revsetlatecomer
-    revset.symbols["conflicting"] = revsetconflicting
-    revset.symbols["obsparents"] = revsetprecursors  # DEPR
-    revset.symbols["precursors"] = revsetprecursors
-    revset.symbols["obsancestors"] = revsetallprecursors  # DEPR
-    revset.symbols["allprecursors"] = revsetallprecursors  # bad name
-    revset.symbols["successors"] = revsetsuccessors
-    revset.symbols["allsuccessors"] = revsetallsuccessors  # bad name
-
-    templatekw.keywords['obsolete'] = obsoletekw
-
-    # warning about more obsolete
-    for cmd in ['commit', 'push', 'pull', 'graft', 'phase', 'unbundle']:
-        entry = extensions.wrapcommand(commands.table, cmd, warnobserrors)
-    try:
-        rebase = extensions.find('rebase')
-        if rebase:
-            entry = extensions.wrapcommand(rebase.cmdtable, 'rebase', warnobserrors)
-            extensions.wrapfunction(rebase, 'buildstate', buildstate)
-            extensions.wrapfunction(rebase, 'defineparents', defineparents)
-            extensions.wrapfunction(rebase, 'concludenode', concludenode)
-            extensions.wrapcommand(rebase.cmdtable, "rebase", cmdrebase)
-    except KeyError:
-        pass  # rebase not found
-
-# Pushkey mechanism for mutable
-#########################################
-
-def listmarkers(repo):
-    """List markers over pushkey"""
-    if not repo.obsstore:
-        return {}
-    data = repo.obsstore._writemarkers()
-    encdata = base85.b85encode(data)
-    return {'dump0': encdata,
-            'dump': encdata} # legacy compat
-
-def pushmarker(repo, key, old, new):
-    """Push markers over pushkey"""
-    if not key.startswith('dump'):
-        repo.ui.warn(_('unknown key: %r') % key)
-        return 0
-    if old:
-        repo.ui.warn(_('unexpected old value') % key)
-        return 0
-    data = base85.b85decode(new)
-    lock = repo.lock()
-    try:
-        try:
-            repo.obsstore.mergemarkers(data)
-            return 1
-        except util.Abort:
-            return 0
-    finally:
-        lock.release()
-
-pushkey.register('obsolete', pushmarker, listmarkers)
-
-### Discovery wrapping
-#############################
-
-class blist(list, object):
-    """silly class to have non False but empty list"""
-
-    def __nonzero__(self):
-        return bool(len(self.orig))
-
-def wrapfindcommonoutgoing(orig, repo, *args, **kwargs):
-    """wrap mercurial.discovery.findcommonoutgoing to remove extinct changeset
-
-    Such excluded changeset are removed from excluded  and will *not* appear
-    are excluded secret changeset.
-    """
-    outgoing = orig(repo, *args, **kwargs)
-    orig = outgoing.excluded
-    outgoing.excluded = blist(n for n in orig if not repo[n].extinct())
-    # when no revision is specified (push everything) a shortcut is taken when
-    # nothign was exclude. taking this code path when extinct changeset have
-    # been excluded leads to repository corruption.
-    outgoing.excluded.orig = orig
-    return outgoing
-
-def wrapcheckheads(orig, repo, remote, outgoing, *args, **kwargs):
-    """wrap mercurial.discovery.checkheads
-
-    * prevent unstability to be pushed
-    * patch remote to ignore obsolete heads on remote
-    """
-    # do not push instability
-    for h in outgoing.missingheads:
-        # checking heads only is enought because any thing base on obsolete
-        # changeset is either obsolete or unstable.
-        ctx =  repo[h]
-        if ctx.unstable():
-            raise util.Abort(_("push includes an unstable changeset: %s!")
-                             % ctx)
-        if ctx.obsolete():
-            raise util.Abort(_("push includes an  obsolete changeset: %s!")
-                             % ctx)
-        if ctx.latecomer():
-            raise util.Abort(_("push includes an latecomer changeset: %s!")
-                             % ctx)
-        if ctx.conflicting():
-            raise util.Abort(_("push includes conflicting changeset: %s!")
-                             % ctx)
-    ### patch remote branch map
-    # do not read it this burn eyes
-    try:
-        if 'oldbranchmap' not in vars(remote):
-            remote.oldbranchmap = remote.branchmap
-            def branchmap():
-                newbm = {}
-                oldbm = None
-                if (util.safehasattr(phases, 'visiblebranchmap')
-                    and not util.safehasattr(remote, 'ignorevisiblebranchmap')
-                   ):
-                    remote.ignorevisiblebranchmap = False
-                    remote.branchmap = remote.oldbranchmap
-                    oldbm = phases.visiblebranchmap(remote)
-                    remote.branchmap = remote.newbranchmap
-                    remote.ignorevisiblebranchmap = True
-                if oldbm is None:
-                    oldbm = remote.oldbranchmap()
-                for branch, nodes in oldbm.iteritems():
-                    nodes = list(nodes)
-                    new = set()
-                    while nodes:
-                        n = nodes.pop()
-                        if n in repo.obsstore.precursors:
-                            markers = repo.obsstore.precursors[n]
-                            for mark in markers:
-                                for newernode in mark[1]:
-                                    if newernode is not None:
-                                        nodes.append(newernode)
-                        else:
-                            new.add(n)
-                    if new:
-                        newbm[branch] = list(new)
-                return newbm
-            remote.ignorevisiblebranchmap = True
-            remote.branchmap = branchmap
-            remote.newbranchmap = branchmap
-        return orig(repo, remote, outgoing, *args, **kwargs)
-    finally:
-        remote.__dict__.pop('branchmap', None) # restore class one
-        remote.__dict__.pop('oldbranchmap', None)
-        remote.__dict__.pop('newbranchmap', None)
-        remote.__dict__.pop('ignorevisiblebranchmap', None)
-
-# eye are still burning
-def wrapvisiblebranchmap(orig, repo):
-    ignore = getattr(repo, 'ignorevisiblebranchmap', None)
-    if ignore is None:
-        return orig(repo)
-    elif ignore:
-        return repo.branchmap()
-    else:
-        return None # break recursion
-
-def wrapclearcache(orig, repo, *args, **kwargs):
-    try:
-        return orig(repo, *args, **kwargs)
-    finally:
-        repo._clearobsoletecache()
-
-
-### New commands
-#############################
-
-cmdtable = {}
-command = cmdutil.command(cmdtable)
-
-@command('debugobsolete', [], _('SUBJECT OBJECT'))
-def cmddebugobsolete(ui, repo, subject, object):
-    """add an obsolete relation between two nodes
-
-    The subject is expected to be a newer version of the object.
+def reposetup(ui, repo):
+    """Detect that a repo still contains some old obsolete format
     """
-    lock = repo.lock()
-    try:
-        sub = repo[subject]
-        obj = repo[object]
-        repo.addobsolete(sub.node(), obj.node())
-    finally:
-        lock.release()
-    return 0
-
-@command('debugconvertobsolete', [], '')
-def cmddebugconvertobsolete(ui, repo):
-    """import markers from an .hg/obsolete-relations file"""
-    cnt = 0
-    err = 0
-    l = repo.lock()
-    some = False
-    try:
-        repo._importoldobsolete = True
-        store = repo.obsstore
-        ### very first format
-        try:
-            f = repo.opener('obsolete-relations')
-            try:
-                some = True
-                for line in f:
-                    subhex, objhex = line.split()
-                    suc = bin(subhex)
-                    prec = bin(objhex)
-                    sucs = (suc==nullid) and [] or [suc]
-                    meta = {
-                        'date':  '%i %i' % util.makedate(),
-                        'user': ui.username(),
-                        }
-                    try:
-                        store.create(prec, sucs, 0, meta)
-                        cnt += 1
-                    except ValueError:
-                        repo.ui.write_err("invalid old marker line: %s"
-                                          % (line))
-                        err += 1
-            finally:
-                f.close()
-            util.unlink(repo.join('obsolete-relations'))
-        except IOError:
-            pass
-        ### second (json) format
-        data = repo.sopener.tryread('obsoletemarkers')
+    if not repo.local():
+        return
+    for arg in sys.argv:
+        if 'debugc' in arg:
+            break
+    else:
+        data = repo.opener.tryread('obsolete-relations')
+        if not data:
+            data = repo.sopener.tryread('obsoletemarkers')
         if data:
-            some = True
-            for oldmark in json.loads(data):
-                del oldmark['id']  # dropped for now
-                del oldmark['reason']  # unused until then
-                oldobject = str(oldmark.pop('object'))
-                oldsubjects = [str(s) for s in oldmark.pop('subjects', [])]
-                LOOKUP_ERRORS = (error.RepoLookupError, error.LookupError)
-                if len(oldobject) != 40:
-                    try:
-                        oldobject = repo[oldobject].node()
-                    except LOOKUP_ERRORS:
-                        pass
-                if any(len(s) != 40 for s in oldsubjects):
-                    try:
-                        oldsubjects = [repo[s].node() for s in oldsubjects]
-                    except LOOKUP_ERRORS:
-                        pass
-
-                oldmark['date'] = '%i %i' % tuple(oldmark['date'])
-                meta = dict((k.encode('utf-8'), v.encode('utf-8'))
-                             for k, v in oldmark.iteritems())
-                try:
-                    succs = [bin(n) for n in oldsubjects]
-                    succs = [n for n in succs if n != nullid]
-                    store.create(bin(oldobject), succs,
-                                 0, meta)
-                    cnt += 1
-                except ValueError:
-                    repo.ui.write_err("invalid marker %s -> %s\n"
-                                 % (oldobject, oldsubjects))
-                    err += 1
-            util.unlink(repo.sjoin('obsoletemarkers'))
-    finally:
-        del repo._importoldobsolete
-        l.release()
-    if not some:
-            ui.warn('nothing to do\n')
-    ui.status('%i obsolete marker converted\n' % cnt)
-    if err:
-        ui.write_err('%i conversion failed. check you graph!\n' % err)
-
-@command('debugsuccessors', [], '')
-def cmddebugsuccessors(ui, repo):
-    """dump obsolete changesets and their successors
-
-    Each line matches an existing marker, the first identifier is the
-    obsolete changeset identifier, followed by it successors.
-    """
-    lock = repo.lock()
-    try:
-        allsuccessors = repo.obsstore.precursors
-        for old in sorted(allsuccessors):
-            successors = [sorted(m[1]) for m in allsuccessors[old]]
-            for i, group in enumerate(sorted(successors)):
-                ui.write('%s' % short(old))
-                for new in group:
-                    ui.write(' %s' % short(new))
-                ui.write('\n')
-    finally:
-        lock.release()
-
-### Altering existing command
-#############################
-
-def wrapmayobsoletewc(origfn, ui, repo, *args, **opts):
-    res = origfn(ui, repo, *args, **opts)
-    if repo['.'].obsolete():
-        ui.warn(_('Working directory parent is obsolete\n'))
-    return res
-
-def warnobserrors(orig, ui, repo, *args, **kwargs):
-    """display warning is the command resulted in more instable changeset"""
-    priorunstables = len(repo.revs('unstable()'))
-    priorlatecomers = len(repo.revs('latecomer()'))
-    priorconflictings = len(repo.revs('conflicting()'))
-    #print orig, priorunstables
-    #print len(repo.revs('secret() - obsolete()'))
-    try:
-        return orig(ui, repo, *args, **kwargs)
-    finally:
-        newunstables = len(repo.revs('unstable()')) - priorunstables
-        newlatecomers = len(repo.revs('latecomer()')) - priorlatecomers
-        newconflictings = len(repo.revs('conflicting()')) - priorconflictings
-        #print orig, newunstables
-        #print len(repo.revs('secret() - obsolete()'))
-        if newunstables > 0:
-            ui.warn(_('%i new unstables changesets\n') % newunstables)
-        if newlatecomers > 0:
-            ui.warn(_('%i new latecomers changesets\n') % newlatecomers)
-        if newconflictings > 0:
-            ui.warn(_('%i new conflictings changesets\n') % newconflictings)
-
-def noextinctsvisibleheads(orig, repo):
-    repo._turn_extinct_secret()
-    return orig(repo)
-
-def wrapcmdutilamend(orig, ui, repo, commitfunc, old, *args, **kwargs):
-    oldnode = old.node()
-    new = orig(ui, repo, commitfunc, old, *args, **kwargs)
-    if new != oldnode:
-        lock = repo.lock()
-        try:
-            meta = {
-                'subjects':  [new],
-                'object': oldnode,
-                'date':  util.makedate(),
-                'user': ui.username(),
-                'reason': 'commit --amend',
-                }
-            repo.obsstore.create(oldnode, [new], 0, meta)
-            repo._clearobsoletecache()
-            repo._turn_extinct_secret()
-        finally:
-            lock.release()
-    return new
-
-def uisetup(ui):
-    extensions.wrapcommand(commands.table, "update", wrapmayobsoletewc)
-    extensions.wrapcommand(commands.table, "pull", wrapmayobsoletewc)
-    if util.safehasattr(cmdutil, 'amend'):
-        extensions.wrapfunction(cmdutil, 'amend', wrapcmdutilamend)
-    extensions.wrapfunction(discovery, 'findcommonoutgoing', wrapfindcommonoutgoing)
-    extensions.wrapfunction(discovery, 'checkheads', wrapcheckheads)
-    extensions.wrapfunction(phases, 'visibleheads', noextinctsvisibleheads)
-    extensions.wrapfunction(phases, 'advanceboundary', wrapclearcache)
-    if util.safehasattr(phases, 'visiblebranchmap'):
-        extensions.wrapfunction(phases, 'visiblebranchmap', wrapvisiblebranchmap)
-
-### serialisation
-#############################
-
-def _obsserialise(obssubrels, flike):
-    """serialise an obsolete relation mapping in a plain text one
-
-    this is for subject -> [objects] mapping
-
-    format is::
-
-        <subject-full-hex> <object-full-hex>\n"""
-    for sub, objs in obssubrels.iteritems():
-        for obj in objs:
-            if sub is None:
-                sub = nullid
-            flike.write('%s %s\n' % (hex(sub), hex(obj)))
+            raise util.Abort('old format of obsolete marker detected!\n'
+                             'run `hg debugconvertobsolete` once.')
 
 def _obsdeserialise(flike):
     """read a file like object serialised with _obsserialise
 
-    this desierialize into a {subject -> objects} mapping"""
+    this desierialize into a {subject -> objects} mapping
+
+    this was the very first format ever."""
     rels = {}
     for line in flike:
         subhex, objhex = line.split()
@@ -785,527 +66,92 @@
         rels.setdefault( subnode, set()).add(bin(objhex))
     return rels
 
-### diagnostique tools
-#############################
-
-def unstables(repo):
-    """Return all unstable changeset"""
-    return scmutil.revrange(repo, ['obsolete():: and (not obsolete())'])
-
-def newerversion(repo, obs):
-    """Return the newer version of an obsolete changeset"""
-    toproceed = set([(obs,)])
-    # XXX known optimization available
-    newer = set()
-    objectrels = repo.obsstore.precursors
-    while toproceed:
-        current = toproceed.pop()
-        assert len(current) <= 1, 'splitting not handled yet. %r' % current
-        current = [n for n in current if n != nullid]
-        if current:
-            n, = current
-            if n in objectrels:
-                markers = objectrels[n]
-                for mark in markers:
-                    toproceed.add(tuple(mark[1]))
-            else:
-                newer.add(tuple(current))
-        else:
-            newer.add(())
-    return sorted(newer)
-
-### obsolete relation storage
-#############################
-def add2set(d, key, mark):
-    """add <mark> to a `set` in <d>[<key>]"""
-    d.setdefault(key, []).append(mark)
-
-def markerid(marker):
-    KEYS = ['subjects', "object", "date", "user", "reason"]
-    for key in KEYS:
-        assert key in marker
-    keys = sorted(marker.keys())
-    a = util.sha1()
-    for key in keys:
-        if key == 'subjects':
-            for sub in sorted(marker[key]):
-                a.update(sub)
-        elif key == 'id':
-            pass
-        else:
-            a.update(str(marker[key]))
-    a.update('\0')
-    return a.digest()
-
-# mercurial backport
-
-def encodemeta(meta):
-    """Return encoded metadata string to string mapping.
-
-    Assume no ':' in key and no '\0' in both key and value."""
-    for key, value in meta.iteritems():
-        if ':' in key or '\0' in key:
-            raise ValueError("':' and '\0' are forbidden in metadata key'")
-        if '\0' in value:
-            raise ValueError("':' are forbidden in metadata value'")
-    return '\0'.join(['%s:%s' % (k, meta[k]) for k in sorted(meta)])
-
-def decodemeta(data):
-    """Return string to string dictionary from encoded version."""
-    d = {}
-    for l in data.split('\0'):
-        if l:
-            key, value = l.split(':')
-            d[key] = value
-    return d
-
-# data used for parsing and writing
-_fmversion = 0
-_fmfixed   = '>BIB20s'
-_fmnode = '20s'
-_fmfsize = struct.calcsize(_fmfixed)
-_fnodesize = struct.calcsize(_fmnode)
-
-def _readmarkers(data):
-    """Read and enumerate markers from raw data"""
-    off = 0
-    diskversion = _unpack('>B', data[off:off + 1])[0]
-    off += 1
-    if diskversion != _fmversion:
-        raise util.Abort(_('parsing obsolete marker: unknown version %r')
-                         % diskversion)
-
-    # Loop on markers
-    l = len(data)
-    while off + _fmfsize <= l:
-        # read fixed part
-        cur = data[off:off + _fmfsize]
-        off += _fmfsize
-        nbsuc, mdsize, flags, pre = _unpack(_fmfixed, cur)
-        # read replacement
-        sucs = ()
-        if nbsuc:
-            s = (_fnodesize * nbsuc)
-            cur = data[off:off + s]
-            sucs = _unpack(_fmnode * nbsuc, cur)
-            off += s
-        # read metadata
-        # (metadata will be decoded on demand)
-        metadata = data[off:off + mdsize]
-        if len(metadata) != mdsize:
-            raise util.Abort(_('parsing obsolete marker: metadata is too '
-                               'short, %d bytes expected, got %d')
-                             % (len(metadata), mdsize))
-        off += mdsize
-        yield (pre, sucs, flags, metadata)
-
-class obsstore(object):
-    """Store obsolete markers
-
-    Markers can be accessed with two mappings:
-    - precursors: old -> set(new)
-    - successors: new -> set(old)
-    """
-
-    def __init__(self):
-        self._all = []
-        # new markers to serialize
-        self._new = []
-        self.precursors = {}
-        self.successors = {}
-
-    def __iter__(self):
-        return iter(self._all)
-
-    def __nonzero__(self):
-        return bool(self._all)
-
-    def create(self, prec, succs=(), flag=0, metadata=None):
-        """obsolete: add a new obsolete marker
-
-        * ensuring it is hashable
-        * check mandatory metadata
-        * encode metadata
-        """
-        if metadata is None:
-            metadata = {}
-        if len(prec) != 20:
-            raise ValueError(repr(prec))
-        for succ in succs:
-            if len(succ) != 20:
-                raise ValueError((succs))
-        marker = (str(prec), tuple(succs), int(flag), encodemeta(metadata))
-        self.add(marker)
-
-    def add(self, marker):
-        """Add a new marker to the store
-
-        This marker still needs to be written to disk"""
-        self._new.append(marker)
-        self._load(marker)
-
-    def loadmarkers(self, data):
-        """Load all markers in data, mark them as known."""
-        for marker in _readmarkers(data):
-            self._load(marker)
-
-    def mergemarkers(self, data):
-        other = set(_readmarkers(data))
-        local = set(self._all)
-        new = other - local
-        for marker in new:
-            self.add(marker)
-
-    def flushmarkers(self, stream):
-        """Write all markers to a stream
-
-        After this operation, "new" markers are considered "known"."""
-        self._writemarkers(stream)
-        self._new[:] = []
-
-    def _load(self, marker):
-        self._all.append(marker)
-        pre, sucs = marker[:2]
-        self.precursors.setdefault(pre, set()).add(marker)
-        for suc in sucs:
-            self.successors.setdefault(suc, set()).add(marker)
-
-    def _writemarkers(self, stream=None):
-        # Kept separate from flushmarkers(), it will be reused for
-        # markers exchange.
-        if stream is None:
-            final = []
-            w = final.append
-        else:
-            w = stream.write
-        w(_pack('>B', _fmversion))
-        for marker in self._all:
-            pre, sucs, flags, metadata = marker
-            nbsuc = len(sucs)
-            format = _fmfixed + (_fmnode * nbsuc)
-            data = [nbsuc, len(metadata), flags, pre]
-            data.extend(sucs)
-            w(_pack(format, *data))
-            w(metadata)
-        if stream is None:
-            return ''.join(final)
-
-
-### repo subclassing
-#############################
-
-def reposetup(ui, repo):
-    if not repo.local():
-        return
-
-    if not util.safehasattr(repo.opener, 'tryread'):
-        raise util.Abort('Obsolete extension requires Mercurial 2.2 (or later)')
-    opull = repo.pull
-    opush = repo.push
-    olock = repo.lock
-    o_rollback = repo._rollback
-    o_updatebranchcache = repo.updatebranchcache
-
-    # /!\ api change in  Hg 2.2 (97efd26eb9576f39590812ea9) /!\
-    if util.safehasattr(repo, '_journalfiles'): # Hg 2.2
-        o_journalfiles = repo._journalfiles
-    o_writejournal = repo._writejournal
-    o_hook = repo.hook
-
-
-    class obsoletingrepo(repo.__class__):
-
-        # workaround
-        def hook(self, name, throw=False, **args):
-            if 'pushkey' in name:
-                args.pop('new')
-                args.pop('old')
-            return o_hook(name, throw=False, **args)
-
-        ### Public method
-        def obsoletedby(self, node):
-            """return the set of node that make <node> obsolete (obj)"""
-            others = set()
-            for marker in self.obsstore.precursors.get(node, []):
-                others.update(marker[1])
-            return others
-
-        def obsolete(self, node):
-            """return the set of node that <node> make obsolete (sub)"""
-            return set(marker[0] for marker in self.obsstore.successors.get(node, []))
-
-        @storecache('obsstore')
-        def obsstore(self):
-            if not getattr(self, '_importoldobsolete', False):
-                data = repo.opener.tryread('obsolete-relations')
-                if not data:
-                    data = repo.sopener.tryread('obsoletemarkers')
-                if data:
-                    raise util.Abort('old format of obsolete marker detected!\n'
-                                     'run `hg debugconvertobsolete` once.')
-            store = obsstore()
-            data = self.sopener.tryread('obsstore')
+cmdtable = {}
+command = cmdutil.command(cmdtable)
+@command('debugconvertobsolete', [], '')
+def cmddebugconvertobsolete(ui, repo):
+    """import markers from an .hg/obsolete-relations file"""
+    cnt = 0
+    err = 0
+    l = repo.lock()
+    some = False
+    try:
+        unlink = []
+        tr = repo.transaction('convert-obsolete')
+        try:
+            repo._importoldobsolete = True
+            store = repo.obsstore
+            ### very first format
+            try:
+                f = repo.opener('obsolete-relations')
+                try:
+                    some = True
+                    for line in f:
+                        subhex, objhex = line.split()
+                        suc = bin(subhex)
+                        prec = bin(objhex)
+                        sucs = (suc==nullid) and [] or [suc]
+                        meta = {
+                            'date':  '%i %i' % util.makedate(),
+                            'user': ui.username(),
+                            }
+                        try:
+                            store.create(tr, prec, sucs, 0, metadata=meta)
+                            cnt += 1
+                        except ValueError:
+                            repo.ui.write_err("invalid old marker line: %s"
+                                              % (line))
+                            err += 1
+                finally:
+                    f.close()
+                unlink.append(repo.join('obsolete-relations'))
+            except IOError:
+                pass
+            ### second (json) format
+            data = repo.sopener.tryread('obsoletemarkers')
             if data:
-                store.loadmarkers(data)
-            return store
-
-        @util.propertycache
-        def _obsoleteset(self):
-            """the set of obsolete revision"""
-            obs = set()
-            nm = self.changelog.nodemap
-            for obj in self.obsstore.precursors:
-                try: # /!\api change in Hg 2.2 (e8d37b78acfb22ae2c1fb126c2)/!\
-                    rev = nm.get(obj)
-                except TypeError:  #XXX to remove while breaking Hg 2.1 support
-                    rev = nm.get(obj, None)
-                if rev is not None:
-                    obs.add(rev)
-            return obs
-
-        @util.propertycache
-        def _unstableset(self):
-            """the set of non obsolete revision with obsolete parent"""
-            return set(self.revs('(obsolete()::) - obsolete()'))
-
-        @util.propertycache
-        def _suspendedset(self):
-            """the set of obsolete parent with non obsolete descendant"""
-            return set(self.revs('obsolete() and obsolete()::unstable()'))
-
-        @util.propertycache
-        def _extinctset(self):
-            """the set of obsolete parent without non obsolete descendant"""
-            return set(self.revs('obsolete() - obsolete()::unstable()'))
-
-        @util.propertycache
-        def _latecomerset(self):
-            """the set of rev trying to obsolete public revision"""
-            query = 'allsuccessors(public()) - obsolete() - public()'
-            return set(self.revs(query))
-
-        @util.propertycache
-        def _conflictingset(self):
-            """the set of rev trying to obsolete public revision"""
-            conflicting = set()
-            obsstore = self.obsstore
-            newermap = {}
-            for ctx in self.set('(not public()) - obsolete()'):
-                prec = obsstore.successors.get(ctx.node(), ())
-                toprocess = set(prec)
-                while toprocess:
-                    prec = toprocess.pop()[0]
-                    if prec not in newermap:
-                        newermap[prec] = newerversion(self, prec)
-                    newer = [n for n in newermap[prec] if n] # filter kill
-                    if len(newer) > 1:
-                        conflicting.add(ctx.rev())
-                        break
-                toprocess.update(obsstore.successors.get(prec, ()))
-            return conflicting
-
-        def _clearobsoletecache(self):
-            if '_obsoleteset' in vars(self):
-                del self._obsoleteset
-            self._clearunstablecache()
-
-        def updatebranchcache(self):
-            o_updatebranchcache()
-            self._clearunstablecache()
-
-        def _clearunstablecache(self):
-            if '_unstableset' in vars(self):
-                del self._unstableset
-            if '_suspendedset' in vars(self):
-                del self._suspendedset
-            if '_extinctset' in vars(self):
-                del self._extinctset
-            if '_latecomerset' in vars(self):
-                del self._latecomerset
-            if '_conflictingset' in vars(self):
-                del self._conflictingset
-
-        def addobsolete(self, sub, obj):
-            """Add a relation marking that node <sub> is a new version of <obj>"""
-            assert sub != obj
-            if not repo[obj].phase():
-                if sub is None:
-                    self.ui.warn(
-                        _("trying to kill immutable changeset %(obj)s\n")
-                        % {'obj': short(obj)})
-                if sub is not None:
-                    self.ui.warn(
-                        _("%(sub)s try to obsolete immutable changeset %(obj)s\n")
-                        % {'sub': short(sub), 'obj': short(obj)})
-            lock = self.lock()
-            try:
-                meta = {
-                    'date':  util.makedate(),
-                    'user': ui.username(),
-                    'reason': 'unknown',
-                    }
-                subs = (sub == nullid) and [] or [sub]
-                mid = self.obsstore.create(obj, subs, 0, meta)
-                self._clearobsoletecache()
-                self._turn_extinct_secret()
-                return mid
-            finally:
-                lock.release()
-
-        def addcollapsedobsolete(self, oldnodes, newnode):
-            """Mark oldnodes as collapsed into newnode."""
-            # Assume oldnodes are all descendants of a single rev
-            rootrevs = self.revs('roots(%ln)', oldnodes)
-            assert len(rootrevs) == 1, rootrevs
-            rootnode = self[rootrevs[0]].node()
-            for n in oldnodes:
-                self.addobsolete(newnode, n)
-
-        def _turn_extinct_secret(self):
-            """ensure all extinct changeset are secret"""
-            self._clearobsoletecache()
-            # this is mainly for safety purpose
-            # both pull and push
-            query = '(obsolete() - obsolete()::(unstable() - secret())) - secret()'
-            expobs = [c.node() for c in repo.set(query)]
-            phases.retractboundary(repo, 2, expobs)
-
-        ### Disk IO
+                some = True
+                for oldmark in json.loads(data):
+                    del oldmark['id']  # dropped for now
+                    del oldmark['reason']  # unused until then
+                    oldobject = str(oldmark.pop('object'))
+                    oldsubjects = [str(s) for s in oldmark.pop('subjects', [])]
+                    LOOKUP_ERRORS = (error.RepoLookupError, error.LookupError)
+                    if len(oldobject) != 40:
+                        try:
+                            oldobject = repo[oldobject].node()
+                        except LOOKUP_ERRORS:
+                            pass
+                    if any(len(s) != 40 for s in oldsubjects):
+                        try:
+                            oldsubjects = [repo[s].node() for s in oldsubjects]
+                        except LOOKUP_ERRORS:
+                            pass
 
-        def lock(self, *args, **kwargs):
-            l = olock(*args, **kwargs)
-            if not getattr(l.releasefn, 'obspatched', False):
-                oreleasefn = l.releasefn
-                def releasefn(*args, **kwargs):
-                    if 'obsstore' in vars(self) and self.obsstore._new:
-                        f = self.sopener('obsstore', 'wb', atomictemp=True)
-                        try:
-                            self.obsstore.flushmarkers(f)
-                            f.close()
-                        except: # re-raises
-                            f.discard()
-                            raise
-                    oreleasefn(*args, **kwargs)
-                releasefn.obspatched = True
-                l.releasefn = releasefn
-            return l
-
-
-        ### pull // push support
-
-        def pull(self, remote, *args, **kwargs):
-            """wrapper around push that push obsolete relation"""
-            l = repo.lock()
-            try:
-                result = opull(remote, *args, **kwargs)
-                remoteobs = remote.listkeys('obsolete')
-                if 'dump' in remoteobs:
-                    remoteobs['dump0'] = remoteobs.pop('dump')
-                if 'dump0' in remoteobs:
-                    for key, values in remoteobs.iteritems():
-                        if key.startswith('dump'):
-                            data = base85.b85decode(remoteobs['dump0'])
-                            self.obsstore.mergemarkers(data)
-                    self._clearobsoletecache()
-                    self._turn_extinct_secret()
-                    return result
-            finally:
-                l.release()
-
-        def push(self, remote, *args, **opts):
-            """wrapper around pull that pull obsolete relation"""
-            self._turn_extinct_secret()
-            try:
-                result = opush(remote, *args, **opts)
-            except util.Abort, ex:
-                hint = _("use 'hg stabilize' to get a stable history (or --force to proceed)")
-                if (len(ex.args) >= 1
-                    and ex.args[0].startswith('push includes ')
-                    and ex.hint is None):
-                    ex.hint = hint
-                raise
-            if 'obsolete' in remote.listkeys('namespaces') and self.obsstore:
-                data = self.obsstore._writemarkers()
-                r = remote.pushkey('obsolete', 'dump0', '',
-                                   base85.b85encode(data))
-                if not r:
-                    self.ui.warn(_('failed to push obsolete markers!\n'))
-            self._turn_extinct_secret()
-
-            return result
-
-
-        ### rollback support
-
-        # /!\ api change in  Hg 2.2 (97efd26eb9576f39590812ea9) /!\
-        if util.safehasattr(repo, '_journalfiles'): # Hg 2.2
-            def _journalfiles(self):
-                return o_journalfiles() + (self.sjoin('journal.obsstore'),) 
-
-            def _writejournal(self, desc):
-                """wrapped version of _writejournal that save obsolete data"""
-                o_writejournal(desc)
-                filename = 'obsstore'
-                filepath = self.sjoin(filename)
-                if os.path.exists(filepath):
-                    journalname = 'journal.' + filename
-                    journalpath = self.sjoin(journalname)
-                    util.copyfile(filepath, journalpath)
-
-        else: # XXX removing this bloc will break Hg 2.1 support
-            def _writejournal(self, desc):
-                """wrapped version of _writejournal that save obsolete data"""
-                entries = list(o_writejournal(desc))
-                filename = 'obsstore'
-                filepath = self.sjoin(filename)
-                if  os.path.exists(filepath):
-                    journalname = 'journal.' + filename
-                    journalpath = self.sjoin(journalname)
-                    util.copyfile(filepath, journalpath)
-                    entries.append(journalpath)
-                return tuple(entries)
-
-        def _rollback(self, dryrun, force):
-            """wrapped version of _rollback that restore obsolete data"""
-            ret = o_rollback(dryrun, force)
-            if not (ret or dryrun): #rollback did not failed
-                src = self.sjoin('undo.obsstore')
-                dst = self.sjoin('obsstore')
-                if os.path.exists(src):
-                    util.rename(src, dst)
-                elif os.path.exists(dst):
-                    # If no state was saved because the file did not existed before.
-                    os.unlink(dst)
-                # invalidate cache
-                self.__dict__.pop('obsstore', None)
-            return ret
-
-        @storecache('00changelog.i')
-        def changelog(self):
-            # << copy pasted from mercurial source
-            c = changelog.changelog(self.sopener)
-            if 'HG_PENDING' in os.environ:
-                p = os.environ['HG_PENDING']
-                if p.startswith(self.root):
-                    c.readpending('00changelog.i.a')
-            # >> end of the copy paste
-            old = c.__dict__.pop('hiddenrevs', ())
-            if old:
-                ui.warn("old wasn't empty ? %r" % old)
-            def _sethidden(c, value):
-                assert not value
-
-
-            class hchangelog(c.__class__):
-                @util.propertycache
-                def hiddenrevs(c):
-                    shown = ['not obsolete()', '.', 'bookmark()', 'tagged()',
-                             'public()']
-                    basicquery = 'obsolete() - (::(%s))' % (' or '.join(shown))
-                    # !!! self is repo not changelog
-                    result = set(scmutil.revrange(self, [basicquery]))
-                    return result
-            c.__class__ = hchangelog
-            return c
-
-    repo.__class__ = obsoletingrepo
+                    oldmark['date'] = '%i %i' % tuple(oldmark['date'])
+                    meta = dict((k.encode('utf-8'), v.encode('utf-8'))
+                                 for k, v in oldmark.iteritems())
+                    try:
+                        succs = [bin(n) for n in oldsubjects]
+                        succs = [n for n in succs if n != nullid]
+                        store.create(tr, bin(oldobject), succs,
+                                     0, metadata=meta)
+                        cnt += 1
+                    except ValueError:
+                        repo.ui.write_err("invalid marker %s -> %s\n"
+                                     % (oldobject, oldsubjects))
+                        err += 1
+                unlink.append(repo.sjoin('obsoletemarkers'))
+            tr.close()
+            for path in unlink:
+                util.unlink(path)
+        finally:
+            tr.release()
+    finally:
+        del repo._importoldobsolete
+        l.release()
+    if not some:
+            ui.warn('nothing to do\n')
+    ui.status('%i obsolete marker converted\n' % cnt)
+    if err:
+        ui.write_err('%i conversion failed. check you graph!\n' % err)
new file mode 100644
--- /dev/null
+++ b/hgext/pushexperiment.py
@@ -0,0 +1,112 @@
+"""Small extension altering some push behavior
+
+- Add a new wire protocol command to exchange obsolescence markers. Sending the
+  raw file as a binary instead of using pushkey hack.
+- Add a "push done" notification
+- Push obsolescence marker before anything else (This works around the lack of global transaction)
+
+"""
+
+import errno
+from StringIO import StringIO
+
+from mercurial.i18n import _
+from mercurial import extensions
+from mercurial import wireproto
+from mercurial import obsolete
+from mercurial import localrepo
+
+
+def client_pushobsmarkers(self, obsfile):
+    """wireprotocol peer method"""
+    self.requirecap('_push_experiment_pushobsmarkers_0',
+                    _('push obsolete markers faster'))
+    ret, output = self._callpush('push_experiment_pushobsmarkers_0', obsfile)
+    for l in output.splitlines(True):
+        self.ui.status(_('remote: '), l)
+    return ret
+
+
+def srv_pushobsmarkers(repo, proto):
+    """wireprotocol command"""
+    fp = StringIO()
+    proto.redirect()
+    proto.getfile(fp)
+    data = fp.getvalue()
+    fp.close()
+    lock = repo.lock()
+    try:
+        tr = repo.transaction('pushkey: obsolete markers')
+        try:
+            repo.obsstore.mergemarkers(tr, data)
+            tr.close()
+        finally:
+            tr.release()
+    finally:
+        lock.release()
+    return wireproto.pushres(0)
+
+
+def syncpush(orig, repo, remote):
+    """wraper for obsolete.syncpush to use the fast way if possible"""
+    if not (obsolete._enabled and repo.obsstore):
+        return
+    if remote.capable('_push_experiment_pushobsmarkers_0'):
+        return # already pushed before changeset
+        remote.push_experiment_pushobsmarkers_0(obsfp)
+        return
+    return orig(repo, remote)
+
+
+def client_notifypushend(self):
+    """wire peer  command to notify a push is done"""
+    self.requirecap('_push_experiment_notifypushend_0', _('hook once push is all done'))
+    return self._call('push_experiment_notifypushend_0')
+
+
+def srv_notifypushend(repo, proto):
+    """wire protocol command to notify a push is done"""
+    proto.redirect()
+    repo.hook('notifypushend')
+    return wireproto.pushres(0)
+
+
+def augmented_push(orig, repo, remote, *args, **kwargs):
+    """push wrapped that call the wire protocol command"""
+    if not remote.canpush():
+        raise util.Abort(_("destination does not support push"))
+    if (obsolete._enabled and repo.obsstore
+        and remote.capable('_push_experiment_pushobsmarkers_0')):
+        # push marker early to limit damage of pushing too early.
+        try:
+            obsfp = repo.sopener('obsstore')
+        except IOError as e:
+            if e.errno != errno.ENOENT:
+                raise
+        else:
+            remote.push_experiment_pushobsmarkers_0(obsfp)
+    ret = orig(repo, remote, *args, **kwargs)
+    if remote.capable('_push_experiment_notifypushend_0'):
+        remote.push_experiment_notifypushend_0()
+    return ret
+
+
+def capabilities(orig, repo, proto):
+    """wrapper to advertise new capability"""
+    caps = orig(repo, proto)
+    if obsolete._enabled:
+        caps += ' _push_experiment_pushobsmarkers_0'
+    caps += ' _push_experiment_notifypushend_0'
+    return caps
+
+
+def extsetup(ui):
+    wireproto.wirepeer.push_experiment_pushobsmarkers_0 = client_pushobsmarkers
+    wireproto.wirepeer.push_experiment_notifypushend_0 = client_notifypushend
+    wireproto.commands['push_experiment_pushobsmarkers_0'] = (srv_pushobsmarkers, '')
+    wireproto.commands['push_experiment_notifypushend_0'] = (srv_notifypushend, '')
+    extensions.wrapfunction(wireproto, 'capabilities', capabilities)
+    extensions.wrapfunction(obsolete, 'syncpush', syncpush)
+    extensions.wrapfunction(localrepo.localrepository, 'push', augmented_push)
+
+
deleted file mode 100644
--- a/hgext/qsync.py
+++ /dev/null
@@ -1,261 +0,0 @@
-"""synchronize patches queues and evolving changesets"""
-
-import re
-from cStringIO import StringIO
-import json
-
-from mercurial.i18n import _
-from mercurial import commands
-from mercurial import patch
-from mercurial import util
-from mercurial.node import nullid, hex, short, bin
-from mercurial import cmdutil
-from mercurial import hg
-from mercurial import scmutil
-from mercurial import error
-from mercurial import extensions
-from mercurial import phases
-
-### old compat code
-#############################
-
-BRANCHNAME="qsubmit2"
-
-### new command
-#############################
-cmdtable = {}
-command = cmdutil.command(cmdtable)
-
-@command('^qsync|sync',
-    [
-     ('a', 'review-all', False, _('mark all touched patches ready for review (no editor)')),
-    ],
-    '')
-def cmdsync(ui, repo, **opts):
-    '''Export draft changeset as mq patch in a mq patches repository commit.
-
-    This command get all changesets in draft phase and create an mq changeset:
-
-        * on a "qsubmit2" branch (based on the last changeset)
-
-        * one patch per draft changeset
-
-        * a series files listing all generated patch
-
-        * qsubmitdata holding useful information
-
-    It does use obsolete relation to update patches that already existing in the qsubmit2 branch.
-
-    Already existing patch which became public, draft or got killed are remove from the mq repo.
-
-    Patch name are generated using the summary line for changeset description.
-
-    .. warning:: Series files is ordered topologically. So two series with
-                 interleaved changeset will appear interleaved.
-    '''
-
-    review = 'edit'
-    if opts['review_all']:
-        review = 'all'
-    mqrepo = repo.mq.qrepo()
-    if mqrepo is None:
-        raise util.Abort('No patches repository')
-
-    try:
-        parent = mqrepo[BRANCHNAME]
-    except error.RepoLookupError:
-        parent = initqsubmit(mqrepo)
-    store, data, touched = fillstore(repo, parent)
-    if not touched:
-        raise util.Abort('Nothing changed')
-    files = ['qsubmitdata', 'series'] + touched
-    # mark some as ready for review
-    message = 'qsubmit commit\n\n'
-    review_list = []
-    applied_list = []
-    if review:
-        olddata = get_old_data(parent)
-        oldfiles = dict([(name, bin(ctxhex)) for ctxhex, name in olddata])
-
-        for patch_name in touched:
-            try:
-                store.getfile(patch_name)
-                review_list.append(patch_name)
-            except IOError:
-                oldnode = oldfiles[patch_name]
-                obsolete = extensions.find('obsolete')
-                newnodes = obsolete.newerversion(repo, oldnode)
-                if newnodes:
-                    newnodes = [n for n in newnodes if n and n[0] in repo] # remove killing
-                if not newnodes:
-                    # changeset has been killed (eg. reject)
-                    pass
-                else:
-                    assert len(newnodes) == 1 # conflict!!!
-                    newnode = newnodes[0]
-                    assert len(newnode) == 1 # split unsupported for now
-                    newnode = list(newnode)[0]
-                    # XXX unmanaged case where a cs is obsoleted by an unavailable one
-                    #if newnode.node() not in repo.changelog.nodemap:
-                    #    raise util.Abort('%s is obsoleted by an unknown node %s'% (oldnode, newnode))
-                    ctx = repo[newnode]
-                    if ctx.phase() == phases.public:
-                        # applied
-                        applied_list.append(patch_name)
-                    elif ctx.phase() == phases.secret:
-                        # already exported changeset is now secret
-                        repo.ui.warn("An already exported changeset is now secret!!!")
-                    else:
-                        # draft
-                        assert False, "Should be exported"
-
-    if review:
-        if applied_list:
-            message += '\n'.join('* applied %s' % x for x in applied_list) + '\n'
-        if review_list:
-            message += '\n'.join('* %s ready for review' % x for x in review_list) + '\n'
-    memctx = patch.makememctx(mqrepo, (parent.node(), nullid),
-                              message,
-                              None,
-                              None,
-                              parent.branch(), files, store,
-                              editor=None)
-    if review == 'edit':
-        memctx._text = cmdutil.commitforceeditor(mqrepo, memctx, [])
-    mqrepo.savecommitmessage(memctx.description())
-    n = memctx.commit()
-    return 0
-
-
-def makename(ctx):
-    """create a patch name form a changeset"""
-    descsummary = ctx.description().splitlines()[0]
-    descsummary = re.sub(r'\s+', '_', descsummary)
-    descsummary = re.sub(r'\W+', '', descsummary)
-    if len(descsummary) > 45:
-        descsummary = descsummary[:42] + '.'
-    return '%s-%s.diff' % (ctx.branch().upper(), descsummary)
-
-
-def get_old_data(mqctx):
-    """read qsubmit data to fetch previous export data
-
-    get old data from the content of an mq commit"""
-    try:
-        old_data = mqctx['qsubmitdata']
-        return json.loads(old_data.data())
-    except error.LookupError:
-        return []
-
-def get_current_data(repo):
-    """Return what would be exported if no previous data exists"""
-    data = []
-    for ctx in repo.set('draft() - (obsolete() + merge())'):
-        name = makename(ctx)
-        data.append([ctx.hex(), makename(ctx)])
-    merges = repo.revs('draft() and merge()')
-    if merges:
-        repo.ui.warn('ignoring %i merge\n' % len(merges))
-    return data
-
-
-def patchmq(repo, store, olddata, newdata):
-    """export the mq patches and return all useful data to be exported"""
-    finaldata = []
-    touched = set()
-    currentdrafts = set(d[0] for d in newdata)
-    usednew = set()
-    usedold = set()
-    obsolete = extensions.find('obsolete')
-    for oldhex, oldname in olddata:
-        if oldhex in usedold:
-            continue # no duplicate
-        usedold.add(oldhex)
-        oldname = str(oldname)
-        oldnode = bin(oldhex)
-        newnodes = obsolete.newerversion(repo, oldnode)
-        if newnodes:
-            newnodes = [n for n in newnodes if n and n[0] in repo] # remove killing
-            if len(newnodes) > 1:
-                newnodes = [short(nodes[0]) for nodes in newnodes]
-                raise util.Abort('%s have more than one newer version: %s'% (oldname, newnodes))
-            if newnodes:
-                # else, changeset have been killed
-                newnode = list(newnodes)[0][0]
-                ctx = repo[newnode]
-                if ctx.hex() != oldhex and ctx.phase():
-                    fp = StringIO()
-                    cmdutil.export(repo, [ctx.rev()], fp=fp)
-                    data = fp.getvalue()
-                    store.setfile(oldname, data, (None, None))
-                    finaldata.append([ctx.hex(), oldname])
-                    usednew.add(ctx.hex())
-                    touched.add(oldname)
-                    continue
-        if oldhex in currentdrafts:
-            # else changeset is now public or secret
-            finaldata.append([oldhex, oldname])
-            usednew.add(ctx.hex())
-            continue
-        touched.add(oldname)
-
-    for newhex, newname in newdata:
-        if newhex in usednew:
-            continue
-        newnode = bin(newhex)
-        ctx = repo[newnode]
-        fp = StringIO()
-        cmdutil.export(repo, [ctx.rev()], fp=fp)
-        data = fp.getvalue()
-        store.setfile(newname, data, (None, None))
-        finaldata.append([ctx.hex(), newname])
-        touched.add(newname)
-    # sort by branchrev number
-    finaldata.sort(key=lambda x: sort_key(repo[x[0]]))
-    # sort touched too (ease review list)
-    stouched = [f[1] for f in finaldata if f[1] in touched]
-    stouched += [x for x in touched if x not in stouched]
-    return finaldata, stouched
-
-def sort_key(ctx):
-    """ctx sort key: (branch, rev)"""
-    return (ctx.branch(), ctx.rev())
-
-
-def fillstore(repo, basemqctx):
-    """fill store with patch data"""
-    olddata = get_old_data(basemqctx)
-    newdata = get_current_data(repo)
-    store = patch.filestore()
-    try:
-        data, touched = patchmq(repo, store, olddata, newdata)
-        # put all name in the series
-        series ='\n'.join(d[1] for d in data) + '\n'
-        store.setfile('series', series, (False, False))
-
-        # export data to ease futur work
-        store.setfile('qsubmitdata', json.dumps(data, indent=True),
-                      (False, False))
-    finally:
-        store.close()
-    return store, data, touched
-
-
-def initqsubmit(mqrepo):
-    """create initial qsubmit branch"""
-    store = patch.filestore()
-    try:
-        files = set()
-        store.setfile('DO-NOT-EDIT-THIS-WORKING-COPY-BY-HAND', 'WE WARNED YOU!', (False, False))
-        store.setfile('.hgignore', '^status$\n', (False, False))
-        memctx = patch.makememctx(mqrepo, (nullid, nullid),
-                              'qsubmit init',
-                              None,
-                              None,
-                              BRANCHNAME, ('.hgignore',), store,
-                              editor=None)
-        mqrepo.savecommitmessage(memctx.description())
-        n = memctx.commit()
-    finally:
-        store.close()
-    return mqrepo[n]
new file mode 100644
--- /dev/null
+++ b/hgext/simple4server.py
@@ -0,0 +1,304 @@
+'''enable experimental obsolescence feature of Mercurial
+
+OBSOLESCENCE IS AN EXPERIMENTAL FEATURE MAKE SURE YOU UNDERSTOOD THE INVOLVED
+CONCEPT BEFORE USING IT.
+
+/!\ THIS EXTENSION IS INTENDED FOR SERVER SIDE ONLY USAGE /!\
+
+For client side usages it is recommended to use the evolve extension for
+improved user interface.'''
+
+testedwith = '3.3.3 3.4-rc'
+buglink = 'http://bz.selenic.com/'
+
+import mercurial.obsolete
+mercurial.obsolete._enabled = True
+
+import struct
+from mercurial import util
+from mercurial import wireproto
+from mercurial import extensions
+from mercurial import obsolete
+from cStringIO import StringIO
+from mercurial import node
+from mercurial.hgweb import hgweb_mod
+from mercurial import bundle2
+from mercurial import localrepo
+from mercurial import exchange
+from mercurial import node
+_pack = struct.pack
+
+gboptslist = gboptsmap = None
+try:
+    from mercurial import obsolete
+    if not obsolete._enabled:
+        obsolete._enabled = True
+    from mercurial import wireproto
+    gboptslist = getattr(wireproto, 'gboptslist', None)
+    gboptsmap = getattr(wireproto, 'gboptsmap', None)
+except (ImportError, AttributeError):
+    raise util.Abort('Your Mercurial is too old for this version of Evolve\n'
+                     'requires version 3.0.1 or above')
+
+# Start of simple4server specific content
+
+from mercurial import pushkey
+
+# specific content also include the wrapping int extsetup
+def _nslist(orig, repo):
+    rep = orig(repo)
+    if not repo.ui.configbool('__temporary__', 'advertiseobsolete', True):
+        rep.pop('obsolete')
+    return rep
+
+# End of simple4server specific content
+
+
+
+# from evolve extension: 1a23c7c52a43
+def srv_pushobsmarkers(repo, proto):
+    """That receives a stream of markers and apply then to the repo"""
+    fp = StringIO()
+    proto.redirect()
+    proto.getfile(fp)
+    data = fp.getvalue()
+    fp.close()
+    lock = repo.lock()
+    try:
+        tr = repo.transaction('pushkey: obsolete markers')
+        try:
+            repo.obsstore.mergemarkers(tr, data)
+            tr.close()
+        finally:
+            tr.release()
+    finally:
+        lock.release()
+    repo.hook('evolve_pushobsmarkers')
+    return wireproto.pushres(0)
+
+# from evolve extension: 1a23c7c52a43
+def _getobsmarkersstream(repo, heads=None, common=None):
+    """Get a binary stream for all markers relevant to `::<heads> - ::<common>`
+    """
+    revset = ''
+    args = []
+    repo = repo.unfiltered()
+    if heads is None:
+        revset = 'all()'
+    elif heads:
+        revset += "(::%ln)"
+        args.append(heads)
+    else:
+        assert False, 'pulling no heads?'
+    if common:
+        revset += ' - (::%ln)'
+        args.append(common)
+    nodes = [c.node() for c in repo.set(revset, *args)]
+    markers = repo.obsstore.relevantmarkers(nodes)
+    obsdata = StringIO()
+    for chunk in obsolete.encodemarkers(markers, True):
+        obsdata.write(chunk)
+    obsdata.seek(0)
+    return obsdata
+
+if not util.safehasattr(obsolete.obsstore, 'relevantmarkers'):
+    # from evolve extension: 1a23c7c52a43
+    class pruneobsstore(obsolete.obsstore):
+        """And extended obsstore class that read parent information from v1 format
+
+        Evolve extension adds parent information in prune marker. We use it to make
+        markers relevant to pushed changeset."""
+
+        def __init__(self, *args, **kwargs):
+            self.prunedchildren = {}
+            return super(pruneobsstore, self).__init__(*args, **kwargs)
+
+        def _load(self, markers):
+            markers = self._prunedetectingmarkers(markers)
+            return super(pruneobsstore, self)._load(markers)
+
+
+        def _prunedetectingmarkers(self, markers):
+            for m in markers:
+                if not m[1]: # no successors
+                    meta = obsolete.decodemeta(m[3])
+                    if 'p1' in meta:
+                        p1 = node.bin(meta['p1'])
+                        self.prunedchildren.setdefault(p1, set()).add(m)
+                    if 'p2' in meta:
+                        p2 = node.bin(meta['p2'])
+                        self.prunedchildren.setdefault(p2, set()).add(m)
+                yield m
+
+    # from evolve extension: 1a23c7c52a43
+    def relevantmarkers(self, nodes):
+        """return a set of all obsolescence marker relevant to a set of node.
+
+        "relevant" to a set of node mean:
+
+        - marker that use this changeset as successors
+        - prune marker of direct children on this changeset.
+        - recursive application of the two rules on precursors of these markers
+
+        It is a set so you cannot rely on order"""
+        seennodes = set(nodes)
+        seenmarkers = set()
+        pendingnodes = set(nodes)
+        precursorsmarkers = self.precursors
+        prunedchildren = self.prunedchildren
+        while pendingnodes:
+            direct = set()
+            for current in pendingnodes:
+                direct.update(precursorsmarkers.get(current, ()))
+                direct.update(prunedchildren.get(current, ()))
+            direct -= seenmarkers
+            pendingnodes = set([m[0] for m in direct])
+            seenmarkers |= direct
+            pendingnodes -= seennodes
+            seennodes |= pendingnodes
+        return seenmarkers
+
+# from evolve extension: cf35f38d6a10
+def srv_pullobsmarkers(repo, proto, others):
+    """serves a binary stream of markers.
+
+    Serves relevant to changeset between heads and common. The stream is prefix
+    by a -string- representation of an integer. This integer is the size of the
+    stream."""
+    opts = wireproto.options('', ['heads', 'common'], others)
+    for k, v in opts.iteritems():
+        if k in ('heads', 'common'):
+            opts[k] = wireproto.decodelist(v)
+    obsdata = _getobsmarkersstream(repo, **opts)
+    finaldata = StringIO()
+    obsdata = obsdata.getvalue()
+    finaldata.write('%20i' % len(obsdata))
+    finaldata.write(obsdata)
+    finaldata.seek(0)
+    return wireproto.streamres(proto.groupchunks(finaldata))
+
+
+# from evolve extension: 3249814dabd1
+def _obsrelsethashtreefm0(repo):
+    return _obsrelsethashtree(repo, obsolete._fm0encodeonemarker)
+
+# from evolve extension: 3249814dabd1
+def _obsrelsethashtreefm1(repo):
+    return _obsrelsethashtree(repo, obsolete._fm1encodeonemarker)
+
+# from evolve extension: 3249814dabd1
+def _obsrelsethashtree(repo, encodeonemarker):
+    cache = []
+    unfi = repo.unfiltered()
+    markercache = {}
+    for i in unfi:
+        ctx = unfi[i]
+        entry = 0
+        sha = util.sha1()
+        # add data from p1
+        for p in ctx.parents():
+            p = p.rev()
+            if p < 0:
+                p = node.nullid
+            else:
+                p = cache[p][1]
+            if p != node.nullid:
+                entry += 1
+                sha.update(p)
+        tmarkers = repo.obsstore.relevantmarkers([ctx.node()])
+        if tmarkers:
+            bmarkers = []
+            for m in tmarkers:
+                if not m in markercache:
+                    markercache[m] = encodeonemarker(m)
+                bmarkers.append(markercache[m])
+            bmarkers.sort()
+            for m in bmarkers:
+                entry += 1
+                sha.update(m)
+        if entry:
+            cache.append((ctx.node(), sha.digest()))
+        else:
+            cache.append((ctx.node(), node.nullid))
+    return cache
+
+# from evolve extension: 3249814dabd1
+def _obshash(repo, nodes, version=0):
+    if version == 0:
+        hashs = _obsrelsethashtreefm0(repo)
+    elif version ==1:
+        hashs = _obsrelsethashtreefm1(repo)
+    else:
+        assert False
+    nm = repo.changelog.nodemap
+    revs = [nm.get(n) for n in nodes]
+    return [r is None and node.nullid or hashs[r][1] for r in revs]
+
+# from evolve extension: 3249814dabd1
+def srv_obshash(repo, proto, nodes):
+    return wireproto.encodelist(_obshash(repo, wireproto.decodelist(nodes)))
+
+# from evolve extension: 3249814dabd1
+def srv_obshash1(repo, proto, nodes):
+    return wireproto.encodelist(_obshash(repo, wireproto.decodelist(nodes), version=1))
+
+# from evolve extension: 3249814dabd1
+def capabilities(orig, repo, proto):
+    """wrapper to advertise new capability"""
+    caps = orig(repo, proto)
+    advertise = repo.ui.configbool('__temporary__', 'advertiseobsolete', True)
+    if obsolete._enabled and advertise:
+        caps += ' _evoext_pushobsmarkers_0'
+        caps += ' _evoext_pullobsmarkers_0'
+        caps += ' _evoext_obshash_0'
+        caps += ' _evoext_obshash_1'
+        caps += ' _evoext_getbundle_obscommon'
+    return caps
+
+def _getbundleobsmarkerpart(orig, bundler, repo, source, **kwargs):
+    if 'evo_obscommon' not in kwargs:
+        return orig(bundler, repo, source, **kwargs)
+
+    heads = kwargs.get('heads')
+    if 'evo_obscommon' not in kwargs:
+        return orig(bundler, repo, source, **kwargs)
+
+    if kwargs.get('obsmarkers', False):
+        if heads is None:
+            heads = repo.heads()
+        obscommon = kwargs.get('evo_obscommon', ())
+        obsset = repo.set('::%ln - ::%ln', heads, obscommon)
+        subset = [c.node() for c in obsset]
+        markers = repo.obsstore.relevantmarkers(subset)
+        exchange.buildobsmarkerspart(bundler, markers)
+
+# from evolve extension: 10867a8e27c6
+# heavily modified
+def extsetup(ui):
+    localrepo.moderncaps.add('_evoext_b2x_obsmarkers_0')
+    gboptsmap['evo_obscommon'] = 'nodes'
+    if not util.safehasattr(obsolete.obsstore, 'relevantmarkers'):
+        obsolete.obsstore = pruneobsstore
+        obsolete.obsstore.relevantmarkers = relevantmarkers
+    hgweb_mod.perms['evoext_pushobsmarkers_0'] = 'push'
+    hgweb_mod.perms['evoext_pullobsmarkers_0'] = 'pull'
+    hgweb_mod.perms['evoext_obshash'] = 'pull'
+    wireproto.commands['evoext_pushobsmarkers_0'] = (srv_pushobsmarkers, '')
+    wireproto.commands['evoext_pullobsmarkers_0'] = (srv_pullobsmarkers, '*')
+    # wrap module content
+    origfunc = exchange.getbundle2partsmapping['obsmarkers']
+    def newfunc(*args, **kwargs):
+        return _getbundleobsmarkerpart(origfunc, *args, **kwargs)
+    exchange.getbundle2partsmapping['obsmarkers'] = newfunc
+    extensions.wrapfunction(wireproto, 'capabilities', capabilities)
+    # wrap command content
+    oldcap, args = wireproto.commands['capabilities']
+    def newcap(repo, proto):
+        return capabilities(oldcap, repo, proto)
+    wireproto.commands['capabilities'] = (newcap, args)
+    wireproto.commands['evoext_obshash'] = (srv_obshash, 'nodes')
+    wireproto.commands['evoext_obshash1'] = (srv_obshash1, 'nodes')
+    # specific simple4server content
+    extensions.wrapfunction(pushkey, '_nslist', _nslist)
+    pushkey._namespaces['namespaces'] = (lambda *x: False, pushkey._nslist)
+
deleted file mode 100755
--- a/qsync-enable.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/sh
-
-here=`readlink -f "$0"`
-repo_root=`dirname "$here"`
-
-
-
-cat << EOF >&2
-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-XXX Add lines below to the [extensions] section of you hgrc XXX
-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-
-
-EOF
-
-cat << EOF | sed -e "s#XXXREPOPATHXXX#${repo_root}#"
-[extensions]
-# experimental extensions for mq export
-qsync=XXXREPOPATHXXX/hgext/qsync.py
-EOF
new file mode 100644
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,29 @@
+# Copied from histedit setup.py
+# Credit to Augie Fackler <durin42@gmail.com>
+
+from distutils.core import setup
+from os.path import dirname, join
+
+def get_version(relpath):
+    '''Read version info from a file without importing it'''
+    for line in open(join(dirname(__file__), relpath), 'rb'):
+        # Decode to a fail-safe string for PY3
+        # (gives unicode object in PY2)
+        line = line.decode('utf8')
+        if '__version__' in line:
+          if "'" in line:
+            return line.split("'")[1]
+
+setup(
+    name='hg-evolve',
+    version=get_version('hgext/evolve.py'),
+    author='Pierre-Yves David',
+    maintainer='Pierre-Yves David',
+    maintainer_email='pierre-yves.david@ens-lyon.org',
+    url='https://bitbucket.org/marmoute/mutable-history',
+    description='Flexible evolution of Mercurial history.',
+    long_description=open('README').read(),
+    keywords='hg mercurial',
+    license='GPLv2+',
+    py_modules=['hgext.evolve'],
+)
new file mode 100755
--- /dev/null
+++ b/tests/_exc-util.sh
@@ -0,0 +1,110 @@
+#!/bin/sh
+
+cat >> $HGRCPATH <<EOF
+[web]
+push_ssl = false
+allow_push = *
+
+[ui]
+logtemplate ="{node|short} ({phase}): {desc}\n"
+
+[phases]
+publish=False
+
+[experimental]
+verbose-obsolescence-exchange=false
+bundle2-exp=true
+bundle2-output-capture=True
+
+[alias]
+debugobsolete=debugobsolete -d '0 0'
+
+[extensions]
+hgext.strip=
+EOF
+echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+
+mkcommit() {
+   echo "$1" > "$1"
+   hg add "$1"
+   hg ci -m "$1"
+}
+getid() {
+   hg log --hidden --template '{node}\n' --rev "$1"
+}
+
+setuprepos() {
+    echo creating test repo for test case $1
+    mkdir $1
+    cd $1
+    echo - pulldest
+    hg init pushdest
+    cd pushdest
+    mkcommit O
+    hg phase --public .
+    cd ..
+    echo - main
+    hg clone -q pushdest main
+    echo - pushdest
+    hg clone -q main pulldest
+    echo 'cd into `main` and proceed with env setup'
+}
+
+dotest() {
+# dotest TESTNAME [TARGETNODE]
+
+    testcase=$1
+    shift
+    target="$1"
+    if [ $# -gt 0 ]; then
+        shift
+    fi
+    targetnode=""
+    desccall=""
+    cd $testcase
+    echo "## Running testcase $testcase"
+    if [ -n "$target" ]; then
+        desccall="desc("\'"$target"\'")"
+        targetnode="`hg -R main id -qr \"$desccall\"`"
+        echo "# testing echange of \"$target\" ($targetnode)"
+    fi
+    echo "## initial state"
+    echo "# obstore: main"
+    hg -R main     debugobsolete | sort
+    echo "# obstore: pushdest"
+    hg -R pushdest debugobsolete | sort
+    echo "# obstore: pulldest"
+    hg -R pulldest debugobsolete | sort
+
+    if [ -n "$target" ]; then
+        echo "## pushing \"$target\"" from main to pushdest
+        hg -R main push -r "$desccall" $@ pushdest
+    else
+        echo "## pushing from main to pushdest"
+        hg -R main push pushdest $@
+    fi
+    echo "## post push state"
+    echo "# obstore: main"
+    hg -R main     debugobsolete | sort
+    echo "# obstore: pushdest"
+    hg -R pushdest debugobsolete | sort
+    echo "# obstore: pulldest"
+    hg -R pulldest debugobsolete | sort
+    if [ -n "$target" ]; then
+        echo "## pulling \"$targetnode\"" from main into pulldest
+        hg -R pulldest pull -r $targetnode $@ main
+    else
+        echo "## pulling from main into pulldest"
+        hg -R pulldest pull main $@
+    fi
+    echo "## post pull state"
+    echo "# obstore: main"
+    hg -R main     debugobsolete | sort
+    echo "# obstore: pushdest"
+    hg -R pushdest debugobsolete | sort
+    echo "# obstore: pulldest"
+    hg -R pulldest debugobsolete | sort
+
+    cd ..
+
+}
new file mode 100755
--- /dev/null
+++ b/tests/dummyssh
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+
+import sys
+import os
+
+os.chdir(os.getenv('TESTTMP'))
+
+if sys.argv[1] != "user@dummy":
+    sys.exit(-1)
+
+os.environ["SSH_CLIENT"] = "127.0.0.1 1 2"
+
+log = open("dummylog", "ab")
+log.write("Got arguments")
+for i, arg in enumerate(sys.argv[1:]):
+    log.write(" %d:%s" % (i + 1, arg))
+log.write("\n")
+log.close()
+hgcmd = sys.argv[2]
+if os.name == 'nt':
+    # hack to make simple unix single quote quoting work on windows
+    hgcmd = hgcmd.replace("'", '"')
+r = os.system(hgcmd)
+sys.exit(bool(r))
old mode 100644
new mode 100755
--- a/tests/run-tests.py
+++ b/tests/run-tests.py
@@ -74,7 +74,7 @@
 if 'java' in sys.platform:
     IMPL_PATH = 'JYTHONPATH'
 
-requiredtools = ["python", "diff", "grep", "unzip", "gunzip", "bunzip2", "sed"]
+requiredtools = ["python", "diff", "grep", "sed"]
 
 defaults = {
     'jobs': ('HGTEST_JOBS', 1),
--- a/tests/test-amend.t
+++ b/tests/test-amend.t
@@ -1,54 +1,49 @@
   $ cat >> $HGRCPATH <<EOF
-  > [defaults]
-  > amend=-d "0 0"
   > [extensions]
-  > hgext.rebase=
   > hgext.graphlog=
   > EOF
-  $ echo "obsolete=$(echo $(dirname $TESTDIR))/hgext/obsolete.py" >> $HGRCPATH
   $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
 
   $ glog() {
   >   hg glog --template '{rev}@{branch}({phase}) {desc|firstline}\n' "$@"
   > }
 
-  $ hg init repo
+  $ hg init repo --traceback
   $ cd repo
   $ echo a > a
   $ hg ci -Am adda
   adding a
 
-Test amend captures branches
+Test that amend captures branches
 
   $ hg branch foo
   marked working directory as branch foo
   (branches are permanent and global, did you want a bookmark?)
-  $ hg amend
-  $ hg debugsuccessors
-  07f494440405 a34b93d251e4
-  bd19cbe78fbf a34b93d251e4
+  $ hg amend -d '0 0'
+  $ hg debugobsolete
+  07f4944404050f47db2e5c5071e0e84e7a27bba9 6a022cbb61d5ba0f03f98ff2d36319dfea1034ae 0 (*) {'user': 'test'} (glob)
+  b2e32ffb533cbe1d5759638c0cd4e8abc43b2738 0 {07f4944404050f47db2e5c5071e0e84e7a27bba9} (*) {'user': 'test'} (glob)
   $ hg branch
   foo
   $ hg branches
-  foo                            2:a34b93d251e4
-  default                        0:07f494440405 (inactive)
+  foo                            2:6a022cbb61d5
   $ glog
   @  2@foo(draft) adda
   
 Test no-op
 
-  $ hg amend
-  abort: no updates found
-  [255]
+  $ hg amend -d '0 0'
+  nothing changed
+  [1]
   $ glog
   @  2@foo(draft) adda
   
 
 Test forcing the message to the same value, no intermediate revision.
 
-  $ hg amend -m 'adda'
-  abort: no updates found
-  [255]
+  $ hg amend -d '0 0' -m 'adda'
+  nothing changed
+  [1]
   $ glog
   @  2@foo(draft) adda
   
@@ -58,13 +53,21 @@
   $ echo a >> a
   $ hg ci -m changea
   $ echo a > a
+  $ hg status
+  M a
+  $ hg pstatus
+  $ hg diff
+  diff -r f7a50201fe3a a
+  --- a/a	Thu Jan 01 00:00:00 1970 +0000
+  +++ b/a	* +0000 (glob)
+  @@ -1,2 +1,1 @@
+   a
+  -a
+  $ hg pdiff
   $ hg ci -m reseta
-  $ hg amend --change 2
-  abort: no updates found
-  [255]
-  $ hg debugsuccessors
-  07f494440405 a34b93d251e4
-  bd19cbe78fbf a34b93d251e4
+  $ hg debugobsolete
+  07f4944404050f47db2e5c5071e0e84e7a27bba9 6a022cbb61d5ba0f03f98ff2d36319dfea1034ae 0 (*) {'user': 'test'} (glob)
+  b2e32ffb533cbe1d5759638c0cd4e8abc43b2738 0 {07f4944404050f47db2e5c5071e0e84e7a27bba9} (*) {'user': 'test'} (glob)
   $ hg phase 2
   2: draft
   $ glog
@@ -74,32 +77,84 @@
   |
   o  2@foo(draft) adda
   
+Specify precise commit date with -d
+  $ hg amend -d '2001-02-03 04:05:06 +0700'
+  $ hg parents --template '{rev}  {date|date}\n'
+  5  Sat Feb 03 04:05:06 2001 +0700
 
-Test collapsing into an existing rev, with an intermediate revision.
+Specify "now" as commit date with -D
+  $ before=`date +%s`
+  $ hg amend -D
+  $ commit=`hg parents --template '{date|hgdate} rev{rev}\n'`
+  $ after=`date +%s`
+  $ (echo $before ; echo $commit; echo $after) | sort -k1 -n -s
+  \d+ (re)
+  \d+ 0 rev6 (re)
+  \d+ (re)
 
-  $ hg branch --force default
-  marked working directory as branch default
-  (branches are permanent and global, did you want a bookmark?)
-  $ hg ci -m resetbranch
-  created new head
-  $ hg branch --force foo
-  marked working directory as branch foo
-  (branches are permanent and global, did you want a bookmark?)
-  $ hg amend --change 2
-  abort: no updates found
+Specify current user as committer with -U
+  $ HGUSER=newbie hg amend -U
+  $ hg parents --template '{rev}  {author}\n'
+  7  newbie
+
+Check that --logfile works
+  $ echo "logfile message" > logfile.txt
+  $ hg amend -l logfile.txt
+  $ hg log -r . -T "{desc}\n"
+  logfile message
+
+# Make sure we don't get reparented to -1 with no username (issue4211)
+  $ HGUSER=
+  $ hg amend -e --config ui.username= -m "empty user"
+  abort: no username supplied
+  (use "hg config --edit" to set your username)
   [255]
-  $ hg debugsuccessors
-  07f494440405 a34b93d251e4
-  7384bbcba36f 000000000000
-  bd19cbe78fbf a34b93d251e4
-  $ glog
-  @  6@foo(secret) amends a34b93d251e49c93d5685ebacad785c73a7e8605
-  |
-  o  5@default(draft) resetbranch
-  |
-  o  4@foo(draft) reseta
-  |
-  o  3@foo(draft) changea
-  |
-  o  2@foo(draft) adda
+  $ hg sum
+  parent: 8:* tip (glob)
+   logfile message
+  branch: foo
+  commit: 1 unknown (clean)
+  update: (current)
+
+Check the help
+  $ hg amend -h
+  hg amend [OPTION]... [FILE]...
+  
+  aliases: refresh
+  
+  combine a changeset with updates and replace it with a new one
+  
+      Commits a new changeset incorporating both the changes to the given files
+      and all the changes from the current parent changeset into the repository.
+  
+      See "hg commit" for details about committing changes.
+  
+      If you don't specify -m, the parent's message will be reused.
   
+      Behind the scenes, Mercurial first commits the update as a regular child
+      of the current parent. Then it creates a new commit on the parent's
+      parents with the updated contents. Then it changes the working copy parent
+      to this new combined changeset. Finally, the old changeset and its update
+      are hidden from "hg log" (unless you use --hidden with log).
+  
+      Returns 0 on success, 1 if nothing changed.
+  
+  options ([+] can be repeated):
+  
+   -A --addremove           mark new/missing files as added/removed before
+                            committing
+   -e --edit                invoke editor on commit messages
+      --close-branch        mark a branch as closed, hiding it from the branch
+                            list
+   -s --secret              use the secret phase for committing
+   -I --include PATTERN [+] include names matching the given patterns
+   -X --exclude PATTERN [+] exclude names matching the given patterns
+   -m --message TEXT        use text as commit message
+   -l --logfile FILE        read commit message from file
+   -d --date DATE           record the specified date as commit date
+   -u --user USER           record the specified user as committer
+   -D --current-date        record the current date as commit date
+   -U --current-user        record the current user as committer
+   -i --interactive         use interactive mode
+  
+  (some details hidden, use --verbose to show complete help)
--- a/tests/test-corrupt.t
+++ b/tests/test-corrupt.t
@@ -13,10 +13,8 @@
   > git = 1
   > unified = 0
   > [extensions]
-  > hgext.rebase=
   > hgext.graphlog=
   > EOF
-  $ echo "obsolete=$(echo $(dirname $TESTDIR))/hgext/obsolete.py" >> $HGRCPATH
   $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
   $ mkcommit() {
   >    echo "$1" >> "$1"
@@ -104,6 +102,7 @@
   
 
   $ hg kill -n -1 -- -2 -3
+  2 changesets pruned
   $ hg push ../other
   pushing to ../other
   searching for changes
@@ -111,6 +110,8 @@
   adding manifests
   adding file changes
   added 1 changesets with 2 changes to 2 files
+  pushing 2 obsolescence markers (* bytes) (glob)
+  2 obsolescence markers added
   $ hg -R ../other verify
   checking changesets
   checking manifests
new file mode 100644
--- /dev/null
+++ b/tests/test-drop.t
@@ -0,0 +1,266 @@
+
+  $ cat >> $HGRCPATH <<EOF
+  > [extensions]
+  > hgext.graphlog=
+  > EOF
+  $ echo "drophack=$(echo $(dirname $TESTDIR))/hgext/drophack.py" >> $HGRCPATH
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+  $ mkcommit() {
+  >    echo "$1" > "$1"
+  >    hg add "$1"
+  >    hg ci -m "add $1"
+  > }
+  $ summary() {
+  > echo ============ graph ==============
+  > hg log -G
+  > echo ============ hidden =============
+  > hg log --hidden -G
+  > echo ============ obsmark ============
+  > hg debugobsolete
+  > }
+
+
+  $ hg init repo
+  $ cd repo
+  $ mkcommit base
+
+drop a single changeset without any rewrite
+================================================
+
+
+  $ mkcommit simple-single
+  $ summary
+  ============ graph ==============
+  @  changeset:   1:d4e7845543ff
+  |  tag:         tip
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     add simple-single
+  |
+  o  changeset:   0:b4952fcf48cf
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     add base
+  
+  ============ hidden =============
+  @  changeset:   1:d4e7845543ff
+  |  tag:         tip
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     add simple-single
+  |
+  o  changeset:   0:b4952fcf48cf
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     add base
+  
+  ============ obsmark ============
+  $ hg drop .
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  working directory now at b4952fcf48cf
+  search obsmarker: wall * comb * user * sys * (glob)
+  0 obsmarkers found
+  search nodes: wall * comb * user * sys * (glob)
+  1 nodes found
+  saved backup bundle to $TESTTMP/repo/.hg/strip-backup/d4e7845543ff-8ad8efe0-drophack.hg (glob)
+  strip nodes: wall * comb * user * sys * (glob)
+  $ summary
+  ============ graph ==============
+  @  changeset:   0:b4952fcf48cf
+     tag:         tip
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     add base
+  
+  ============ hidden =============
+  @  changeset:   0:b4952fcf48cf
+     tag:         tip
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     add base
+  
+  ============ obsmark ============
+
+Try to drop a changeset with children
+================================================
+
+  $ mkcommit parent
+  $ mkcommit child
+  $ summary
+  ============ graph ==============
+  @  changeset:   2:34b6c051bf1f
+  |  tag:         tip
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     add child
+  |
+  o  changeset:   1:19509a42b0d0
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     add parent
+  |
+  o  changeset:   0:b4952fcf48cf
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     add base
+  
+  ============ hidden =============
+  @  changeset:   2:34b6c051bf1f
+  |  tag:         tip
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     add child
+  |
+  o  changeset:   1:19509a42b0d0
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     add parent
+  |
+  o  changeset:   0:b4952fcf48cf
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     add base
+  
+  ============ obsmark ============
+  $ hg drop 1
+  cannot drop revision with children (no-eol)
+  [1]
+  $ summary
+  ============ graph ==============
+  @  changeset:   2:34b6c051bf1f
+  |  tag:         tip
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     add child
+  |
+  o  changeset:   1:19509a42b0d0
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     add parent
+  |
+  o  changeset:   0:b4952fcf48cf
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     add base
+  
+  ============ hidden =============
+  @  changeset:   2:34b6c051bf1f
+  |  tag:         tip
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     add child
+  |
+  o  changeset:   1:19509a42b0d0
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     add parent
+  |
+  o  changeset:   0:b4952fcf48cf
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     add base
+  
+  ============ obsmark ============
+
+Try to drop a public changeset
+================================================
+
+  $ hg phase --public 2
+  $ hg drop 2
+  cannot drop public revision (no-eol)
+  [1]
+
+
+Try to drop a changeset with rewrite
+================================================
+
+  $ hg phase --force --draft 2
+  $ echo babar >> child
+  $ hg commit --amend
+  $ summary
+  ============ graph ==============
+  @  changeset:   4:a2c06c884bfe
+  |  tag:         tip
+  |  parent:      1:19509a42b0d0
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     add child
+  |
+  o  changeset:   1:19509a42b0d0
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     add parent
+  |
+  o  changeset:   0:b4952fcf48cf
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     add base
+  
+  ============ hidden =============
+  @  changeset:   4:a2c06c884bfe
+  |  tag:         tip
+  |  parent:      1:19509a42b0d0
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     add child
+  |
+  | x  changeset:   3:87ea30a976fd
+  | |  user:        test
+  | |  date:        Thu Jan 01 00:00:00 1970 +0000
+  | |  summary:     temporary amend commit for 34b6c051bf1f
+  | |
+  | x  changeset:   2:34b6c051bf1f
+  |/   user:        test
+  |    date:        Thu Jan 01 00:00:00 1970 +0000
+  |    summary:     add child
+  |
+  o  changeset:   1:19509a42b0d0
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     add parent
+  |
+  o  changeset:   0:b4952fcf48cf
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     add base
+  
+  ============ obsmark ============
+  34b6c051bf1f78db6aef400776de5cb964470207 a2c06c884bfe53d3840026248bd8a7eafa152df8 0 (*) {'user': 'test'} (glob)
+  87ea30a976fdf235bf096f04899cb02a903873e2 0 {34b6c051bf1f78db6aef400776de5cb964470207} (*) {'user': 'test'} (glob)
+  $ hg drop .
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  working directory now at 19509a42b0d0
+  search obsmarker: wall * comb * user * sys * (glob)
+  1 obsmarkers found
+  search nodes: wall * comb * user * sys * (glob)
+  2 nodes found
+  strip obsmarker: wall * comb * user * sys * (glob)
+  saved backup bundle to $TESTTMP/repo/.hg/strip-backup/*-drophack.hg (glob)
+  strip nodes: wall * comb * user * sys * (glob)
+  $ summary
+  ============ graph ==============
+  @  changeset:   1:19509a42b0d0
+  |  tag:         tip
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     add parent
+  |
+  o  changeset:   0:b4952fcf48cf
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     add base
+  
+  ============ hidden =============
+  @  changeset:   1:19509a42b0d0
+  |  tag:         tip
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     add parent
+  |
+  o  changeset:   0:b4952fcf48cf
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     add base
+  
+  ============ obsmark ============
+  87ea30a976fdf235bf096f04899cb02a903873e2 0 {34b6c051bf1f78db6aef400776de5cb964470207} (*) {'user': 'test'} (glob)
new file mode 100644
--- /dev/null
+++ b/tests/test-evolve-bumped.t
@@ -0,0 +1,82 @@
+  $ hg init public
+  $ cd public
+  $ echo a > a
+  $ hg commit -A -m init
+  adding a
+  $ cd ..
+
+  $ evolvepath=$(echo $(dirname $TESTDIR))/hgext/evolve.py
+  $ hg clone -U public private
+  $ cd private
+  $ cat >> .hg/hgrc <<EOF
+  > [extensions]
+  > evolve = $evolvepath
+  > [phases]
+  > publish = false
+  > EOF
+  $ cd ..
+
+  $ cp -a private alice
+  $ cp -a private bob
+
+  $ cd alice
+  $ hg update
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ echo a >> a
+  $ hg commit -u alice -m 'modify a'
+  $ hg push ../private
+  pushing to ../private
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  $ hg log -r 'draft()'
+  changeset:   1:4d1169d82e47
+  tag:         tip
+  user:        alice
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     modify a
+  
+
+  $ cd ../bob
+  $ hg pull ../private
+  pulling from ../private
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  pull obsolescence markers
+  (run 'hg update' to get a working copy)
+  $ hg log -r 'draft()'
+  changeset:   1:4d1169d82e47
+  tag:         tip
+  user:        alice
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     modify a
+  
+  $ hg push ../public
+  pushing to ../public
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  $ hg log -r 'draft()'
+
+  $ cd ../alice
+  $ hg amend -m 'tweak a'
+  $ hg pull ../public
+  pulling from ../public
+  searching for changes
+  no changes found
+  pull obsolescence markers
+  1 new bumped changesets
+
+  $ hg evolve -a
+  recreate:[2] tweak a
+  atop:[1] modify a
+  computing new diff
+  committed as 4d1169d82e47
+  working directory is now at 4d1169d82e47
--- a/tests/test-evolve.t
+++ b/tests/test-evolve.t
@@ -1,6 +1,7 @@
   $ cat >> $HGRCPATH <<EOF
   > [defaults]
   > amend=-d "0 0"
+  > fold=-d "0 0"
   > [web]
   > push_ssl = false
   > allow_push = *
@@ -12,10 +13,8 @@
   > git = 1
   > unified = 0
   > [extensions]
-  > hgext.rebase=
   > hgext.graphlog=
   > EOF
-  $ echo "obsolete=$(echo $(dirname $TESTDIR))/hgext/obsolete.py" >> $HGRCPATH
   $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
   $ mkcommit() {
   >    echo "$1" > "$1"
@@ -59,7 +58,9 @@
   $ hg log -r 1 --template '{rev} {phase} {obsolete}\n'
   1 public stable
   $ hg kill 1
-  cannot kill immutable changeset 7c3bad9141dc
+  abort: cannot prune immutable changeset: 7c3bad9141dc
+  (see "hg help phases" for details)
+  [255]
   $ hg log -r 1 --template '{rev} {phase} {obsolete}\n'
   1 public stable
 
@@ -68,6 +69,7 @@
   $ hg id -n
   5
   $ hg kill .
+  1 changesets pruned
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   working directory now at fbb94e3a0ecf
   $ hg qlog
@@ -79,7 +81,8 @@
 
 test multiple kill
 
-  $ hg kill 4 3
+  $ hg kill 4 -r 3
+  2 changesets pruned
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   working directory now at 7c3bad9141dc
   $ hg qlog
@@ -94,10 +97,22 @@
   $ echo 4 > g
   $ hg add g
   $ hg kill .
+  1 changesets pruned
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   working directory now at 7c3bad9141dc
   $ hg st
   A g
+
+Smoketest debugobsrelsethashtree:
+
+  $ hg debugobsrelsethashtree
+  1f0dee641bb7258c56bd60e93edfa2405381c41e 0000000000000000000000000000000000000000
+  7c3bad9141dcb46ff89abf5f61856facd56e476c * (glob)
+  4538525df7e2b9f09423636c61ef63a4cb872a2d * (glob)
+  47d2a3944de8b013de3be9578e8e344ea2e6c097 * (glob)
+  fbb94e3a0ecf6d20c2cc31152ef162ce45af982f * (glob)
+  e44648563c73f75950076031c6fdf06629de95f1 * (glob)
+
   $ cd ..
 
 ##########################
@@ -188,13 +203,13 @@
 It is therefore advisable to always set the bookmark before committing::
 
   $ hg book feature-B
-  $ hg commit --message "another feature"
+  $ hg commit --message "another feature (child of $(hg log -r . -T '{node|short}'))"
 
 So here we are::
 
   $ hg book
      feature-A                 1:568a468b60fc
-   * feature-B                 2:7b36850622b2
+   * feature-B                 2:73296a82292a
 
 
 Fix The Second Patch
@@ -211,17 +226,13 @@
 
 and **amend**::
 
-  $ hg amend --note "fix spelling of Zwei"
-
-The `--note` is our commit message for the *update* only. So its only purpose
-is to document the evolution of the changeset. If we use `--message` with
-`amend`, it replaces the commit message of the changeset itself.
+  $ hg amend
 
 This results in a new single changeset for our amended changeset, and the old
 changeset plus the updating changeset are hidden from view by default::
 
   $ hg log
-  4	feature-B: another feature - test
+  4	feature-B: another feature (child of 568a468b60fc) - test
   1	feature-A: a nifty feature - test
   0	: base - test
 
@@ -233,51 +244,45 @@
 
   $ hg phase --public 0 -v
   phase changed for 1 changesets
-  $ hg amend -c 2
-  abort: cannot amend non ancestor changeset
-  [255]
 
 
 (amend of on ancestors)
 
-  $ hg amend -c 2
-  abort: cannot amend non ancestor changeset
-  [255]
-
-  $ hg amend --note 'french looks better'
-  1 new unstables changesets
+  $ hg amend
+  1 new unstable changesets
   $ hg log
   6	feature-A: a nifty feature - test
-  4	feature-B: another feature - test
+  4	feature-B: another feature (child of 568a468b60fc) - test
   1	: a nifty feature - test
   0	: base - test
   $ hg up -q 0
   $ glog --hidden
-  o  6:23409eba69a0@default(draft) a nifty feature
+  o  6:ba0ec09b1bab@default(draft) a nifty feature
   |
-  | o  5:e416e48b2742@default(secret) french looks better
+  | x  5:c296b79833d1@default(draft) temporary amend commit for 568a468b60fc
   | |
-  | | o  4:f8111a076f09@default(draft) another feature
+  | | o  4:6992c59c6b06@default(draft) another feature (child of 568a468b60fc)
   | |/
-  | | o  3:524e478d4811@default(secret) fix spelling of Zwei
+  | | x  3:c97947cdc7a2@default(draft) temporary amend commit for 73296a82292a
   | | |
-  | | o  2:7b36850622b2@default(secret) another feature
+  | | x  2:73296a82292a@default(draft) another feature (child of 568a468b60fc)
   | |/
-  | o  1:568a468b60fc@default(draft) a nifty feature
+  | x  1:568a468b60fc@default(draft) a nifty feature
   |/
   @  0:e55e0562ee93@default(public) base
   
-  $ hg debugsuccessors
-  524e478d4811 f8111a076f09
-  568a468b60fc 23409eba69a0
-  7b36850622b2 f8111a076f09
-  e416e48b2742 23409eba69a0
-  $ hg stabilize
-  move:[4] another feature
+  $ hg debugobsolete
+  73296a82292a76fb8a7061969d2489ec0d84cd5e 6992c59c6b06a1b4a92e24ff884829ae026d018b 0 (*) {'user': 'test'} (glob)
+  c97947cdc7a2a11cf78419f5c2c3dd3944ec79e8 0 {73296a82292a76fb8a7061969d2489ec0d84cd5e} (*) {'user': 'test'} (glob)
+  568a468b60fc99a42d5d4ddbe181caff1eef308d ba0ec09b1babf3489b567853807f452edd46704f 0 (*) {'user': 'test'} (glob)
+  c296b79833d1d497f33144786174bf35e04e44a3 0 {568a468b60fc99a42d5d4ddbe181caff1eef308d} (*) {'user': 'test'} (glob)
+  $ hg evolve
+  move:[4] another feature (child of 568a468b60fc)
   atop:[6] a nifty feature
   merging main-file-1
+  working directory is now at 5c9c8d9c2e4e
   $ hg log
-  7	feature-B: another feature - test
+  7	feature-B: another feature (child of ba0ec09b1bab) - test
   6	feature-A: a nifty feature - test
   0	: base - test
 
@@ -296,10 +301,100 @@
   6	feature-A: a nifty feature - test
   0	: base - test
 
-phase change turning obsolete changeset public issue a latecomer warning
+phase change turning obsolete changeset public issue a bumped warning
+
+  $ hg phase --hidden --public 7
+  1 new bumped changesets
+
+all solving bumped troubled
+
+  $ hg glog
+  @  8	feature-B: another feature that rox - test
+  |
+  | o  7	: another feature (child of ba0ec09b1bab) - test
+  |/
+  o  6	feature-A: a nifty feature - test
+  |
+  o  0	: base - test
+  
+  $ hg evolve --any --traceback
+  recreate:[8] another feature that rox
+  atop:[7] another feature (child of ba0ec09b1bab)
+  computing new diff
+  committed as 476d0454d60e
+  working directory is now at 476d0454d60e
+  $ hg glog
+  @  9	feature-B: bumped update to 5c9c8d9c2e4e: - test
+  |
+  o  7	: another feature (child of ba0ec09b1bab) - test
+  |
+  o  6	feature-A: a nifty feature - test
+  |
+  o  0	: base - test
+  
+  $ hg diff --hidden -r 9 -r 8
+  $ hg diff -r 9^ -r 9
+  diff --git a/main-file-1 b/main-file-1
+  --- a/main-file-1
+  +++ b/main-file-1
+  @@ -3,1 +3,1 @@
+  -Zwei
+  +deux
+  $ hg log -r 'bumped()' # no more bumped
 
-  $ hg phase --public 7
-  1 new latecomers changesets
+test evolve --all
+  $ sed -i'' -e s/deux/to/ main-file-1
+  $ hg commit -m 'dansk 2!'
+  $ sed -i'' -e s/Three/tre/ main-file-1
+  $ hg commit -m 'dansk 3!'
+  $ hg update 9
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ sed -i'' -e s/Un/Én/ main-file-1
+  $ hg commit --amend -m 'dansk!'
+  2 new unstable changesets
+
+(ninja test for the {trouble} template:
+
+  $ hg log -G --template '{rev} {troubles}\n'
+  @  13
+  |
+  | o  11 unstable
+  | |
+  | o  10 unstable
+  | |
+  | x  9
+  |/
+  o  7
+  |
+  o  6
+  |
+  o  0
+  
+
+
+(/ninja)
+
+  $ hg evolve --all --traceback
+  move:[10] dansk 2!
+  atop:[13] dansk!
+  merging main-file-1
+  move:[11] dansk 3!
+  atop:[14] dansk 2!
+  merging main-file-1
+  working directory is now at cfb5ebed336d
+  $ hg glog
+  @  15	: dansk 3! - test
+  |
+  o  14	: dansk 2! - test
+  |
+  o  13	feature-B: dansk! - test
+  |
+  o  7	: another feature (child of ba0ec09b1bab) - test
+  |
+  o  6	feature-A: a nifty feature - test
+  |
+  o  0	: base - test
+  
 
   $ cd ..
 
@@ -324,6 +419,7 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
+  pull obsolescence markers
   $ cd alpha
 
   $ cat << EOF > A
@@ -358,7 +454,10 @@
   checking files
   3 files, 4 changesets, 4 total revisions
   $ hg --config extensions.hgext.mq= strip 'extinct()'
-  saved backup bundle to $TESTTMP/alpha/.hg/strip-backup/e87767087a57-backup.hg
+  abort: empty revision set
+  [255]
+  $ hg --config extensions.hgext.mq= strip --hidden 'extinct()'
+  saved backup bundle to $TESTTMP/alpha/.hg/strip-backup/e87767087a57-d7bd82e9-backup.hg (glob)
   $ hg verify
   checking changesets
   checking manifests
@@ -377,6 +476,8 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
+  pull obsolescence markers
+  2 obsolescence markers added
   (run 'hg update' to get a working copy)
   $ hg up
   2 files updated, 0 files merged, 0 files removed, 0 files unresolved
@@ -405,10 +506,10 @@
   |/
   o  0:8685c6d34325@default(draft) add 0
   
-  $ hg graft 3 -O
-  grafting revision 3
-  $ hg graft 1 -o 2
-  grafting revision 1
+  $ hg graft -r3 -O
+  grafting 3:0e84df4912da "add 3"
+  $ hg graft -r1 -o 2
+  grafting 1:73d38bb17fd7 "add 1"
   $ glog --hidden
   @  6:acb28cd497b7@default(draft) add 1
   |
@@ -416,17 +517,17 @@
   |
   o  4:ce341209337f@default(draft) add 4
   |
-  | o  3:0e84df4912da@default(secret) add 3
+  | x  3:0e84df4912da@default(draft) add 3
   | |
-  | o  2:db038628b9e5@default(secret) add 2
+  | x  2:db038628b9e5@default(draft) add 2
   | |
   | o  1:73d38bb17fd7@default(draft) add 1
   |/
   o  0:8685c6d34325@default(draft) add 0
   
-  $ hg debugsuccessors
-  0e84df4912da 0b9e50c35132
-  db038628b9e5 acb28cd497b7
+  $ hg debugobsolete
+  0e84df4912da4c7cad22a3b4fcfd58ddfb7c8ae9 0b9e50c35132ff548ec0065caea6a87e1ebcef32 0 (*) {'user': 'test'} (glob)
+  db038628b9e56f51a454c0da0c508df247b41748 acb28cd497b7f8767e01ef70f68697a959573c2d 0 (*) {'user': 'test'} (glob)
 
 Test graft --continue
 
@@ -436,7 +537,7 @@
   created new head
   $ hg up -qC 6
   $ hg graft -O 7
-  grafting revision 7
+  grafting 7:a5bfd90a2f29 "conflict" (tip)
   merging 1
   warning: conflicts during merge.
   merging 1 incomplete! (edit conflicts, then use 'hg resolve --mark')
@@ -447,12 +548,13 @@
   7:a5bfd90a2f29 stable
   $ echo 3 > 1
   $ hg resolve -m 1
+  (no more unresolved files)
   $ hg graft --continue -O
-  grafting revision 7
+  grafting 7:a5bfd90a2f29 "conflict" (tip)
   $ glog --hidden
   @  8:920e58bb443b@default(draft) conflict
   |
-  | o  7:a5bfd90a2f29@default(secret) conflict
+  | x  7:a5bfd90a2f29@default(draft) conflict
   | |
   o |  6:acb28cd497b7@default(draft) add 1
   | |
@@ -460,18 +562,328 @@
   | |
   o |  4:ce341209337f@default(draft) add 4
   |/
-  | o  3:0e84df4912da@default(secret) add 3
+  | x  3:0e84df4912da@default(draft) add 3
   | |
-  | o  2:db038628b9e5@default(secret) add 2
+  | x  2:db038628b9e5@default(draft) add 2
   | |
   | o  1:73d38bb17fd7@default(draft) add 1
   |/
   o  0:8685c6d34325@default(draft) add 0
   
-  $ hg debugsuccessors
-  0e84df4912da 0b9e50c35132
-  a5bfd90a2f29 920e58bb443b
-  db038628b9e5 acb28cd497b7
+  $ hg debugobsolete
+  0e84df4912da4c7cad22a3b4fcfd58ddfb7c8ae9 0b9e50c35132ff548ec0065caea6a87e1ebcef32 0 (*) {'user': 'test'} (glob)
+  db038628b9e56f51a454c0da0c508df247b41748 acb28cd497b7f8767e01ef70f68697a959573c2d 0 (*) {'user': 'test'} (glob)
+  a5bfd90a2f29c7ccb8f917ff4e5013a9053d0a04 920e58bb443b73eea9d6d65570b4241051ea3229 0 (*) {'user': 'test'} (glob)
+
+Test touch
+
+  $ glog
+  @  8:920e58bb443b@default(draft) conflict
+  |
+  o  6:acb28cd497b7@default(draft) add 1
+  |
+  o  5:0b9e50c35132@default(draft) add 3
+  |
+  o  4:ce341209337f@default(draft) add 4
+  |
+  | o  1:73d38bb17fd7@default(draft) add 1
+  |/
+  o  0:8685c6d34325@default(draft) add 0
+  
+  $ hg touch
+  $ glog
+  @  9:*@default(draft) conflict (glob)
+  |
+  o  6:acb28cd497b7@default(draft) add 1
+  |
+  o  5:0b9e50c35132@default(draft) add 3
+  |
+  o  4:ce341209337f@default(draft) add 4
+  |
+  | o  1:73d38bb17fd7@default(draft) add 1
+  |/
+  o  0:8685c6d34325@default(draft) add 0
+  
+  $ hg touch .
+  $ glog
+  @  10:*@default(draft) conflict (glob)
+  |
+  o  6:acb28cd497b7@default(draft) add 1
+  |
+  o  5:0b9e50c35132@default(draft) add 3
+  |
+  o  4:ce341209337f@default(draft) add 4
+  |
+  | o  1:73d38bb17fd7@default(draft) add 1
+  |/
+  o  0:8685c6d34325@default(draft) add 0
+  
+
+Test fold
+
+  $ rm *.orig
+  $ hg fold
+  abort: no revisions specified
+  [255]
+  $ hg fold .
+  single revision specified, nothing to fold
+  [1]
+  $ hg fold 0::10 --rev 1 --exact
+  abort: cannot fold non-linear revisions (multiple heads given)
+  [255]
+  $ hg fold -r 4 -r 6 --exact
+  abort: cannot fold non-linear revisions (multiple roots given)
+  [255]
+  $ hg fold 10 1
+  abort: cannot fold non-linear revisions
+  (given revisions are unrelated to parent of working directory)
+  [255]
+  $ hg phase --public 0
+  $ hg fold -r 0
+  abort: cannot fold public revisions
+  [255]
+  $ hg fold -r 5
+  3 changesets folded
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg fold 6 # want to run hg fold 6
+  abort: hidden revision '6'!
+  (use --hidden to access hidden revisions)
+  [255]
+  $ hg log -r 11 --template '{desc}\n'
+  add 3
+  
+  
+  add 1
+  
+  
+  conflict
+  $ hg debugrebuildstate
+  $ hg st
+
+Test fold with wc parent is not the head of the folded revision
+
+  $ hg up 4
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ hg fold --rev 4::11 --user victor --exact
+  2 changesets folded
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ glog
+  @  12:d26d339c513f@default(draft) add 4
+  |
+  | o  1:73d38bb17fd7@default(draft) add 1
+  |/
+  o  0:8685c6d34325@default(public) add 0
+  
+  $ hg log --template '{rev}: {author}\n'
+  12: victor
+  1: test
+  0: test
+  $ hg log -r 12 --template '{desc}\n'
+  add 4
+  
+  
+  add 3
+  
+  
+  add 1
+  
+  
+  conflict
+  $ hg debugrebuildstate
+  $ hg st
+
+Test olog
+
+  $ hg olog
+  4	: add 4 - test
+  11	: add 3 - test
+
+Test obsstore stat
+
+  $ hg debugobsstorestat
+  markers total:                     10
+      for known precursors:          10
+      with parents data:              0
+  markers with no successors:         0
+                1 successors:        10
+                2 successors:         0
+      more than 2 successors:         0
+      available  keys:
+                 user:               10
+  disconnected clusters:              1
+          any known node:             1
+          smallest length:           10
+          longer length:             10
+          median length:             10
+          mean length:               10
+      using parents data:             1
+          any known node:             1
+          smallest length:           10
+          longer length:             10
+          median length:             10
+          mean length:               10
+
+
+Test evolving renames
+
+  $ hg up null
+  0 files updated, 0 files merged, 4 files removed, 0 files unresolved
+  $ echo a > a
+  $ hg ci -Am a
+  adding a
+  created new head
+  $ echo b > b
+  $ hg ci -Am b
+  adding b
+  $ hg mv a c
+  $ hg ci -m c
+  $ hg kill .^
+  1 changesets pruned
+  1 new unstable changesets
+  $ hg stab --any
+  move:[15] c
+  atop:[13] a
+  working directory is now at 3742bde73477
+  $ hg st -C --change=tip
+  A c
+    a
+  R a
+
+Test fold with commit messages
+
+  $ cd ../work
+  $ hg fold .^ --message "Folding with custom commit message"
+  2 changesets folded
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ glog
+  @  16:d6239ff09c9f@default(draft) Folding with custom commit message
+  |
+  o  13:56ade053f46d@default(draft) dansk!
+  |
+  o  7:5c9c8d9c2e4e@default(public) another feature (child of ba0ec09b1bab)
+  |
+  o  6:ba0ec09b1bab@default(public) a nifty feature
+  |
+  o  0:e55e0562ee93@default(public) base
+  
+  $ cat > commit-message <<EOF
+  > A longer
+  >                   commit message
+  > EOF
+
+  $ hg fold .^ --logfile commit-message
+  2 changesets folded
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg qlog
+  17 - dba606655966 A longer
+                    commit message (draft)
+  7 - 5c9c8d9c2e4e another feature (child of ba0ec09b1bab) (public)
+  6 - ba0ec09b1bab a nifty feature (public)
+  0 - e55e0562ee93 base (public)
 
   $ cd ..
 
+Test branch preservation:
+===========================
+
+  $ hg init evolving-branch
+  $ cd evolving-branch
+  $ touch a
+  $ hg add a
+  $ hg ci -m 'a0'
+  $ echo 1 > a
+  $ hg ci -m 'a1'
+  $ echo 2 > a
+  $ hg ci -m 'a2'
+  $ echo 3 > a
+  $ hg ci -m 'a3'
+
+  $ hg log -G --template '{rev} [{branch}] {desc|firstline}\n'
+  @  3 [default] a3
+  |
+  o  2 [default] a2
+  |
+  o  1 [default] a1
+  |
+  o  0 [default] a0
+  
+
+branch change propagated
+
+  $ hg up 'desc(a2)'
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg branch mybranch
+  marked working directory as branch mybranch
+  (branches are permanent and global, did you want a bookmark?)
+  $ hg amend
+  1 new unstable changesets
+
+  $ hg evolve
+  move:[3] a3
+  atop:[5] a2
+  working directory is now at 7c5649f73d11
+
+  $ hg log -G --template '{rev} [{branch}] {desc|firstline}\n'
+  @  6 [mybranch] a3
+  |
+  o  5 [mybranch] a2
+  |
+  o  1 [default] a1
+  |
+  o  0 [default] a0
+  
+
+branch change preserved
+
+  $ hg up 'desc(a1)'
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg amend -m 'a1_'
+  2 new unstable changesets
+  $ hg evolve
+  move:[5] a2
+  atop:[7] a1_
+  working directory is now at 5406c5cfee42
+  $ hg evolve
+  move:[6] a3
+  atop:[8] a2
+  working directory is now at c7661e655801
+  $ hg log -G --template '{rev} [{branch}] {desc|firstline}\n'
+  @  9 [mybranch] a3
+  |
+  o  8 [mybranch] a2
+  |
+  o  7 [default] a1_
+  |
+  o  0 [default] a0
+  
+
+Evolve from the middle of a stack pick the right changesets.
+
+  $ hg up 7
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg ci --amend -m 'a1__'
+  2 new unstable changesets
+
+  $ hg up 8
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg evolve
+  nothing to evolve here
+  (2 troubled changesets, do you want --any ?)
+  [2]
+
+
+Evolve disables active bookmarks.
+
+  $ hg up 10
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg bookmark testbookmark
+  $ ls .hg/bookmarks*
+  .hg/bookmarks
+  .hg/bookmarks.* (glob)
+  $ hg evolve
+  move:[8] a2
+  atop:[10] a1__
+  (leaving bookmark testbookmark)
+  working directory is now at f37ed7a60f43
+  $ ls .hg/bookmarks*
+  .hg/bookmarks
new file mode 100644
--- /dev/null
+++ b/tests/test-exchange-A1.t
@@ -0,0 +1,285 @@
+
+Initial setup
+
+  $ . $TESTDIR/_exc-util.sh
+
+==== A.1.1 pushing a single head ====
+..
+.. {{{
+..     ⇠◔ A
+..      |
+..      ● O
+.. }}}
+..
+.. Marker exist from:
+..
+..  * A
+..
+.. Command run:
+..
+..  * hg push -r A
+..  * hg push
+..
+.. Expected exchange:
+..
+..  * chain from A
+
+Setup
+---------------
+
+initial
+
+  $ setuprepos A.1.1
+  creating test repo for test case A.1.1
+  - pulldest
+  - main
+  - pushdest
+  cd into `main` and proceed with env setup
+  $ cd main
+  $ mkcommit A
+  $ hg debugobsolete aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa `getid 'desc(A)'`
+  $ hg log -G
+  @  f5bc6836db60 (draft): A
+  |
+  o  a9bdc8b26820 (public): O
+  
+  $ hg debugobsolete
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  $ cd ..
+  $ cd ..
+
+setup both variants
+
+  $ cp -r A.1.1 A.1.1.a
+  $ cp -r A.1.1 A.1.1.b
+
+
+Variant a: push -r A
+--------------------
+
+  $ dotest A.1.1.a A
+  ## Running testcase A.1.1.a
+  # testing echange of "A" (f5bc6836db60)
+  ## initial state
+  # obstore: main
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing "A" from main to pushdest
+  pushing to pushdest
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
+  remote: 1 new obsolescence markers
+  ## post push state
+  # obstore: main
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling "f5bc6836db60" from main into pulldest
+  pulling from main
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  1 new obsolescence markers
+  (run 'hg update' to get a working copy)
+  ## post pull state
+  # obstore: main
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+
+
+
+
+Variant b: push
+---------------
+
+  $ dotest A.1.1.b
+  ## Running testcase A.1.1.b
+  ## initial state
+  # obstore: main
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing from main to pushdest
+  pushing to pushdest
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
+  remote: 1 new obsolescence markers
+  ## post push state
+  # obstore: main
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling from main into pulldest
+  pulling from main
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  1 new obsolescence markers
+  (run 'hg update' to get a working copy)
+  ## post pull state
+  # obstore: main
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+
+
+
+
+
+
+==== A.1.2 pushing a multiple changeset into a single head  ====
+
+.. {{{
+..      ◔ B
+..      |
+..     ⇠◔ A
+..      |
+..      ● O
+.. }}}
+..
+.. Marker exist from:
+..
+..  * A
+..
+.. Command run:
+..
+..  * hg push -r B
+..  * hg push
+..
+.. Expected exchange:
+..
+..  * chain from A
+
+Setup
+---------------
+
+initial
+
+  $ setuprepos A.1.2
+  creating test repo for test case A.1.2
+  - pulldest
+  - main
+  - pushdest
+  cd into `main` and proceed with env setup
+  $ cd main
+  $ mkcommit A
+  $ mkcommit B
+  $ hg log -G
+  @  f6fbb35d8ac9 (draft): B
+  |
+  o  f5bc6836db60 (draft): A
+  |
+  o  a9bdc8b26820 (public): O
+  
+  $ hg debugobsolete aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa `getid 'desc(A)'`
+  $ hg debugobsolete
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  $ cd ..
+  $ cd ..
+
+setup both variants
+
+  $ cp -r A.1.2 A.1.2.a
+  $ cp -r A.1.2 A.1.2.b
+
+
+Variant a: push -r A
+--------------------
+
+  $ dotest A.1.2.a B
+  ## Running testcase A.1.2.a
+  # testing echange of "B" (f6fbb35d8ac9)
+  ## initial state
+  # obstore: main
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing "B" from main to pushdest
+  pushing to pushdest
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 2 changesets with 2 changes to 2 files
+  remote: 1 new obsolescence markers
+  ## post push state
+  # obstore: main
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling "f6fbb35d8ac9" from main into pulldest
+  pulling from main
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 2 changes to 2 files
+  1 new obsolescence markers
+  (run 'hg update' to get a working copy)
+  ## post pull state
+  # obstore: main
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+
+Variant b: push
+---------------
+
+  $ dotest A.1.2.b
+  ## Running testcase A.1.2.b
+  ## initial state
+  # obstore: main
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing from main to pushdest
+  pushing to pushdest
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 2 changesets with 2 changes to 2 files
+  remote: 1 new obsolescence markers
+  ## post push state
+  # obstore: main
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling from main into pulldest
+  pulling from main
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 2 changes to 2 files
+  1 new obsolescence markers
+  (run 'hg update' to get a working copy)
+  ## post pull state
+  # obstore: main
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
new file mode 100644
--- /dev/null
+++ b/tests/test-exchange-A2.t
@@ -0,0 +1,110 @@
+
+
+Initial setup
+
+  $ . $TESTDIR/_exc-util.sh
+
+=== A.2 Two heads ===
+
+.. {{{
+..     ⇠○ B
+..   ⇠◔ | A
+..    |/
+..    ● O
+.. }}}
+..
+.. Marker exist from:
+..
+..  * A
+..  * B
+..
+..
+.. Command run:
+..
+..  * hg push -r A
+..
+.. Expected exchange:
+..
+..  * chain from A
+..
+.. Expected Exclude:
+..
+..  * chain from B
+
+initial
+
+  $ setuprepos A.2
+  creating test repo for test case A.2
+  - pulldest
+  - main
+  - pushdest
+  cd into `main` and proceed with env setup
+  $ cd main
+  $ mkcommit A
+  $ hg debugobsolete aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa `getid 'desc(A)'`
+  $ hg up .^
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ mkcommit B
+  created new head
+  $ hg debugobsolete bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb `getid 'desc(B)'`
+  $ hg log -G
+  @  35b183996678 (draft): B
+  |
+  | o  f5bc6836db60 (draft): A
+  |/
+  o  a9bdc8b26820 (public): O
+  
+  $ hg debugobsolete
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 35b1839966785d5703a01607229eea932db42f87 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  $ cd ..
+  $ cd ..
+
+
+Actual Test
+---------------
+
+  $ dotest A.2 A
+  ## Running testcase A.2
+  # testing echange of "A" (f5bc6836db60)
+  ## initial state
+  # obstore: main
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 35b1839966785d5703a01607229eea932db42f87 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing "A" from main to pushdest
+  pushing to pushdest
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
+  remote: 1 new obsolescence markers
+  ## post push state
+  # obstore: main
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 35b1839966785d5703a01607229eea932db42f87 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling "f5bc6836db60" from main into pulldest
+  pulling from main
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  1 new obsolescence markers
+  (run 'hg update' to get a working copy)
+  ## post pull state
+  # obstore: main
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 35b1839966785d5703a01607229eea932db42f87 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+
+
+  $ cd ..
new file mode 100644
--- /dev/null
+++ b/tests/test-exchange-A3.t
@@ -0,0 +1,218 @@
+
+Initial setup
+
+  $ . $TESTDIR/_exc-util.sh
+
+=== A.3 new branch created ===
+
+.. {{{
+..   B' ○⇢ø B
+..      | |
+..      \Aø⇠◔ A'
+..       \|/
+..        ● O
+.. }}}
+..
+.. Marker exist from:
+..
+..  * `Aø⇠○ A'`
+..  * `Bø⇠○ B'`
+..
+.. Command run:
+..
+..  * hg push -r A
+..
+.. Expected exchange:
+..
+..  * chain from A
+..
+.. Expected Exclude:
+..
+..  * chain from B
+..
+.. Extra note:
+..
+.. If A and B are remontly known, we should expect:
+..
+..  * `hg push` will complain about the new head
+..  * `hg push` should complain about unstable history creation
+
+initial
+
+  $ setuprepos A.3.a
+  creating test repo for test case A.3.a
+  - pulldest
+  - main
+  - pushdest
+  cd into `main` and proceed with env setup
+  $ cd main
+  $ mkcommit A0
+  $ mkcommit B0
+  $ hg update -q 0
+  $ mkcommit A1
+  created new head
+  $ hg update -q 0
+  $ mkcommit B1
+  created new head
+  $ hg debugobsolete `getid 'desc(A0)'` `getid 'desc(A1)'`
+  $ hg debugobsolete `getid 'desc(B0)'` `getid 'desc(B1)'`
+  $ hg log -G --hidden
+  @  f6298a8ac3a4 (draft): B1
+  |
+  | o  e5ea8f9c7314 (draft): A1
+  |/
+  | x  6e72f0a95b5e (draft): B0
+  | |
+  | x  28b51eb45704 (draft): A0
+  |/
+  o  a9bdc8b26820 (public): O
+  
+  $ hg debugobsolete
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  6e72f0a95b5e01a7504743aa941f69cb1fbef8b0 f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  $ cd ..
+  $ cd ..
+
+Actual Test for first version (changeset unknown in remote)
+-----------------------------------------------------------
+
+  $ dotest A.3.a A1
+  ## Running testcase A.3.a
+  # testing echange of "A1" (e5ea8f9c7314)
+  ## initial state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  6e72f0a95b5e01a7504743aa941f69cb1fbef8b0 f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing "A1" from main to pushdest
+  pushing to pushdest
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
+  remote: 1 new obsolescence markers
+  ## post push state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  6e72f0a95b5e01a7504743aa941f69cb1fbef8b0 f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling "e5ea8f9c7314" from main into pulldest
+  pulling from main
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  1 new obsolescence markers
+  (run 'hg update' to get a working copy)
+  ## post pull state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  6e72f0a95b5e01a7504743aa941f69cb1fbef8b0 f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+
+
+other variant: changeset known in remote
+----------------------------------------
+
+  $ setuprepos A.3.b
+  creating test repo for test case A.3.b
+  - pulldest
+  - main
+  - pushdest
+  cd into `main` and proceed with env setup
+  $ cd main
+  $ mkcommit A0
+  $ mkcommit B0
+  $ hg push -q ../pushdest
+  $ hg push -q ../pulldest
+  $ hg update -q 0
+  $ mkcommit A1
+  created new head
+  $ hg update -q 0
+  $ mkcommit B1
+  created new head
+  $ hg debugobsolete `getid 'desc(A0)'` `getid 'desc(A1)'`
+  $ hg debugobsolete `getid 'desc(B0)'` `getid 'desc(B1)'`
+  $ hg log -G --hidden
+  @  f6298a8ac3a4 (draft): B1
+  |
+  | o  e5ea8f9c7314 (draft): A1
+  |/
+  | x  6e72f0a95b5e (draft): B0
+  | |
+  | x  28b51eb45704 (draft): A0
+  |/
+  o  a9bdc8b26820 (public): O
+  
+  $ hg debugobsolete
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  6e72f0a95b5e01a7504743aa941f69cb1fbef8b0 f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  $ cd ..
+  $ cd ..
+
+Actual Test for first version (changeset unknown in remote)
+-----------------------------------------------------------
+
+check it complains about multiple heads
+
+  $ cd A.3.b
+  $ hg push -R main -r e5ea8f9c7314 pushdest
+  pushing to pushdest
+  searching for changes
+  abort: push creates new remote head e5ea8f9c7314!
+  (merge or see "hg help push" for details about pushing new heads)
+  [255]
+  $ cd ..
+
+test obsmarkers exchange.
+
+  $ dotest A.3.b A1 -f
+  ## Running testcase A.3.b
+  # testing echange of "A1" (e5ea8f9c7314)
+  ## initial state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  6e72f0a95b5e01a7504743aa941f69cb1fbef8b0 f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing "A1" from main to pushdest
+  pushing to pushdest
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files (+1 heads)
+  remote: 1 new obsolescence markers
+  ## post push state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  6e72f0a95b5e01a7504743aa941f69cb1fbef8b0 f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling "e5ea8f9c7314" from main into pulldest
+  pulling from main
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 2 files (+1 heads)
+  1 new obsolescence markers
+  (run 'hg heads' to see heads, 'hg merge' to merge)
+  1 new unstable changesets
+  ## post pull state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  6e72f0a95b5e01a7504743aa941f69cb1fbef8b0 f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
new file mode 100644
--- /dev/null
+++ b/tests/test-exchange-A4.t
@@ -0,0 +1,112 @@
+
+Initial setup
+
+  $ . $TESTDIR/_exc-util.sh
+
+
+=== A.4 Push in the middle of the obsolescence chain ===
+
+.. (Where we show that we should not push the marker without the successors)
+..
+.. {{{
+..   B ◔
+..     |
+..   A⇠ø⇠○ A'
+..     |/
+..     ● O
+.. }}}
+..
+.. Marker exist from:
+..
+..  * `Aø⇠○ A'`
+..  * chain from A
+..
+.. Command run:
+..
+..  * hg push -r B
+..
+.. Expected exchange:
+..
+..  * Chain from A
+..
+.. Expected Exclude:
+..
+..  * `Aø⇠○ A'`
+
+
+initial
+
+  $ setuprepos A.4
+  creating test repo for test case A.4
+  - pulldest
+  - main
+  - pushdest
+  cd into `main` and proceed with env setup
+  $ cd main
+  $ mkcommit A0
+  $ mkcommit B
+  $ hg update 0
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ mkcommit A1
+  created new head
+  $ hg debugobsolete aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa `getid 'desc(A0)'`
+  $ hg debugobsolete `getid 'desc(A0)'` `getid 'desc(A1)'`
+  $ hg log -G --hidden
+  @  e5ea8f9c7314 (draft): A1
+  |
+  | o  06055a7959d4 (draft): B
+  | |
+  | x  28b51eb45704 (draft): A0
+  |/
+  o  a9bdc8b26820 (public): O
+  
+  $ hg debugobsolete
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 28b51eb45704506b5c603decd6bf7ac5e0f6a52f 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  $ cd ..
+  $ cd ..
+
+Actual Test for first version (changeset unknown in remote)
+-----------------------------------------------------------
+
+  $ dotest A.4 B -f
+  ## Running testcase A.4
+  # testing echange of "B" (06055a7959d4)
+  ## initial state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 28b51eb45704506b5c603decd6bf7ac5e0f6a52f 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing "B" from main to pushdest
+  pushing to pushdest
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 2 changesets with 2 changes to 2 files
+  remote: 1 new obsolescence markers
+  ## post push state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 28b51eb45704506b5c603decd6bf7ac5e0f6a52f 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 28b51eb45704506b5c603decd6bf7ac5e0f6a52f 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling "06055a7959d4" from main into pulldest
+  pulling from main
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 2 changes to 2 files
+  1 new obsolescence markers
+  (run 'hg update' to get a working copy)
+  ## post pull state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 28b51eb45704506b5c603decd6bf7ac5e0f6a52f 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 28b51eb45704506b5c603decd6bf7ac5e0f6a52f 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 28b51eb45704506b5c603decd6bf7ac5e0f6a52f 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
new file mode 100644
--- /dev/null
+++ b/tests/test-exchange-A5.t
@@ -0,0 +1,121 @@
+
+
+Initial setup
+
+  $ . $TESTDIR/_exc-util.sh
+
+
+=== A.5 partial reordering ===
+..
+.. {{{
+..   B ø⇠⇠
+..     | ⇡
+..   A ø⇠⇠⇠○ A'
+..     | ⇡/
+..     | ○ B'
+..     |/
+..     ● O
+.. }}}
+..
+.. Marker exist from:
+..
+..  * `Aø⇠○ A'`
+..  * `Bø⇠○ B'`
+..
+.. Command run:
+..
+..  * hg push -r B
+..
+.. Expected exchange:
+..
+..  * `Bø⇠○ B'`
+..
+.. Expected Exclude:
+..
+..  * `Aø⇠○ A'`
+
+
+initial
+
+  $ setuprepos A.5
+  creating test repo for test case A.5
+  - pulldest
+  - main
+  - pushdest
+  cd into `main` and proceed with env setup
+  $ cd main
+  $ mkcommit A0
+  $ mkcommit B0
+  $ hg update 0
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  $ mkcommit B1
+  created new head
+  $ mkcommit A1
+  $ hg debugobsolete aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa `getid 'desc(A0)'`
+  $ hg debugobsolete `getid 'desc(B0)'` `getid 'desc(B1)'`
+  $ hg debugobsolete `getid 'desc(A0)'` `getid 'desc(A1)'`
+  $ hg log -G --hidden
+  @  8c0a98c83722 (draft): A1
+  |
+  o  f6298a8ac3a4 (draft): B1
+  |
+  | x  6e72f0a95b5e (draft): B0
+  | |
+  | x  28b51eb45704 (draft): A0
+  |/
+  o  a9bdc8b26820 (public): O
+  
+  $ hg debugobsolete
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 28b51eb45704506b5c603decd6bf7ac5e0f6a52f 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  6e72f0a95b5e01a7504743aa941f69cb1fbef8b0 f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f 8c0a98c8372212c6efde4bfdcef006f27ff759d3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  $ cd ..
+  $ cd ..
+
+Actual Test
+-----------
+
+  $ dotest A.5 B1
+  ## Running testcase A.5
+  # testing echange of "B1" (f6298a8ac3a4)
+  ## initial state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f 8c0a98c8372212c6efde4bfdcef006f27ff759d3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  6e72f0a95b5e01a7504743aa941f69cb1fbef8b0 f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 28b51eb45704506b5c603decd6bf7ac5e0f6a52f 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing "B1" from main to pushdest
+  pushing to pushdest
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
+  remote: 1 new obsolescence markers
+  ## post push state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f 8c0a98c8372212c6efde4bfdcef006f27ff759d3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  6e72f0a95b5e01a7504743aa941f69cb1fbef8b0 f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 28b51eb45704506b5c603decd6bf7ac5e0f6a52f 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  6e72f0a95b5e01a7504743aa941f69cb1fbef8b0 f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling "f6298a8ac3a4" from main into pulldest
+  pulling from main
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  1 new obsolescence markers
+  (run 'hg update' to get a working copy)
+  ## post pull state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f 8c0a98c8372212c6efde4bfdcef006f27ff759d3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  6e72f0a95b5e01a7504743aa941f69cb1fbef8b0 f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 28b51eb45704506b5c603decd6bf7ac5e0f6a52f 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  6e72f0a95b5e01a7504743aa941f69cb1fbef8b0 f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  6e72f0a95b5e01a7504743aa941f69cb1fbef8b0 f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
new file mode 100644
--- /dev/null
+++ b/tests/test-exchange-A6.t
@@ -0,0 +1,134 @@
+
+
+
+Initial setup
+
+  $ . $TESTDIR/_exc-util.sh
+
+
+=== A.6 between existing changeset ===
+
+.. {{{
+..   A ◕⇠● B
+..     |/
+..     ● O
+.. }}}
+..
+.. Marker exist from:
+..
+..  * `A◕⇠● B`
+..
+.. Command run:
+..
+..  * hg push -r B
+..  * hg push
+..
+.. Expected exchange:
+..
+..  * `A◕⇠● B`
+
+
+initial
+
+  $ setuprepos A.6
+  creating test repo for test case A.6
+  - pulldest
+  - main
+  - pushdest
+  cd into `main` and proceed with env setup
+  $ cd main
+  $ mkcommit A0
+  $ hg update -q 0
+  $ mkcommit A1
+  created new head
+
+make both changeset known in remote
+
+  $ hg push -qf ../pushdest
+  $ hg push -qf ../pulldest
+
+create a marker after this
+
+  $ hg debugobsolete `getid 'desc(A0)'` `getid 'desc(A1)'`
+  $ hg log -G --hidden
+  @  e5ea8f9c7314 (draft): A1
+  |
+  | x  28b51eb45704 (draft): A0
+  |/
+  o  a9bdc8b26820 (public): O
+  
+  $ hg debugobsolete
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  $ cd ..
+  $ cd ..
+
+  $ cp -r A.6 A.6.a
+  $ cp -r A.6 A.6.b
+
+Actual Test (explicit push version)
+-----------------------------------
+
+  $ dotest A.6.a A1
+  ## Running testcase A.6.a
+  # testing echange of "A1" (e5ea8f9c7314)
+  ## initial state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing "A1" from main to pushdest
+  pushing to pushdest
+  searching for changes
+  no changes found
+  remote: 1 new obsolescence markers
+  ## post push state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling "e5ea8f9c7314" from main into pulldest
+  pulling from main
+  no changes found
+  1 new obsolescence markers
+  ## post pull state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+
+Actual Test (bare push version)
+-------------------------------
+
+  $ dotest A.6.b
+  ## Running testcase A.6.b
+  ## initial state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing from main to pushdest
+  pushing to pushdest
+  searching for changes
+  no changes found
+  remote: 1 new obsolescence markers
+  ## post push state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling from main into pulldest
+  pulling from main
+  searching for changes
+  no changes found
+  1 new obsolescence markers
+  ## post pull state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
new file mode 100644
--- /dev/null
+++ b/tests/test-exchange-A7.t
@@ -0,0 +1,75 @@
+
+Initial setup
+
+  $ . $TESTDIR/_exc-util.sh
+
+=== A.7 Non targeted common changeset ===
+
+.. {{{
+..    ⇠◕ A
+..     |
+..     ● O
+.. }}}
+..
+.. Marker exist from:
+..
+..  * Chain from A
+..
+.. Command run:
+..
+..  * hg push -r O
+..
+.. Expected exchange:
+..
+..  * ø
+
+
+  $ setuprepos A.7
+  creating test repo for test case A.7
+  - pulldest
+  - main
+  - pushdest
+  cd into `main` and proceed with env setup
+  $ cd main
+  $ mkcommit A
+  $ hg push -q ../pushdest
+  $ hg push -q ../pulldest
+  $ hg debugobsolete aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa `getid 'desc(A)'`
+  $ hg log -G --hidden
+  @  f5bc6836db60 (draft): A
+  |
+  o  a9bdc8b26820 (public): O
+  
+  $ hg debugobsolete
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  $ cd ..
+  $ cd ..
+
+Actual Test
+-----------------------------------
+
+  $ dotest A.7 O
+  ## Running testcase A.7
+  # testing echange of "O" (a9bdc8b26820)
+  ## initial state
+  # obstore: main
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing "O" from main to pushdest
+  pushing to pushdest
+  searching for changes
+  no changes found
+  ## post push state
+  # obstore: main
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pulling "a9bdc8b26820" from main into pulldest
+  pulling from main
+  no changes found
+  ## post pull state
+  # obstore: main
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
new file mode 100644
--- /dev/null
+++ b/tests/test-exchange-B1.t
@@ -0,0 +1,137 @@
+
+Initial setup
+
+  $ . $TESTDIR/_exc-util.sh
+
+=== B.1 Prune on non-targeted common changeset ===
+
+.. {{{
+..     ⊗ B
+..     |
+..     ◕ A
+..     |
+..     ● O
+.. }}}
+..
+.. Marker exist from:
+..
+..  * B (prune)
+..
+.. Command run:
+..
+..  * hg push -r O
+..  * hg push
+..
+.. Expected exchange:
+..
+..  * B (prune)
+
+
+  $ setuprepos B.1
+  creating test repo for test case B.1
+  - pulldest
+  - main
+  - pushdest
+  cd into `main` and proceed with env setup
+  $ cd main
+  $ mkcommit A
+  $ mkcommit B
+  $ hg prune -qd '0 0' .
+  $ hg log -G --hidden
+  x  f6fbb35d8ac9 (draft): B
+  |
+  @  f5bc6836db60 (draft): A
+  |
+  o  a9bdc8b26820 (public): O
+  
+  $ hg debugobsolete
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  $ cd ..
+  $ cd ..
+
+
+  $ cp -r B.1 B.1.a
+  $ cp -r B.1 B.1.b
+
+Actual Test (explicit push version)
+-----------------------------------
+
+  $ dotest B.1.a A
+  ## Running testcase B.1.a
+  # testing echange of "A" (f5bc6836db60)
+  ## initial state
+  # obstore: main
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing "A" from main to pushdest
+  pushing to pushdest
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
+  remote: 1 new obsolescence markers
+  ## post push state
+  # obstore: main
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling "f5bc6836db60" from main into pulldest
+  pulling from main
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  1 new obsolescence markers
+  (run 'hg update' to get a working copy)
+  ## post pull state
+  # obstore: main
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+
+Actual Test (bare push version)
+-----------------------------------
+
+  $ dotest B.1.b
+  ## Running testcase B.1.b
+  ## initial state
+  # obstore: main
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing from main to pushdest
+  pushing to pushdest
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
+  remote: 1 new obsolescence markers
+  ## post push state
+  # obstore: main
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling from main into pulldest
+  pulling from main
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  1 new obsolescence markers
+  (run 'hg update' to get a working copy)
+  ## post pull state
+  # obstore: main
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
new file mode 100644
--- /dev/null
+++ b/tests/test-exchange-B2.t
@@ -0,0 +1,117 @@
+
+Initial setup
+
+  $ . $TESTDIR/_exc-util.sh
+
+=== B.2 Pruned changeset on head: nothing pushed ===
+
+.. {{{
+..     ⊗ A
+..     |
+..     ● O
+.. }}}
+..
+.. Marker exist from:
+..
+..  * A (prune)
+..
+.. Command run:
+..
+..  * hg push -r O
+..  * hg push
+..
+.. Expected exchange:
+..
+..  * prune marker for A
+
+
+  $ setuprepos B.2
+  creating test repo for test case B.2
+  - pulldest
+  - main
+  - pushdest
+  cd into `main` and proceed with env setup
+  $ cd main
+  $ mkcommit A
+  $ hg prune -qd '0 0' .
+  $ hg log -G --hidden
+  x  f5bc6836db60 (draft): A
+  |
+  @  a9bdc8b26820 (public): O
+  
+  $ hg debugobsolete
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  $ cd ..
+  $ cd ..
+
+
+  $ cp -r B.2 B.2.a
+  $ cp -r B.2 B.2.b
+
+Actual Test (explicit push version)
+-----------------------------------
+
+  $ dotest B.2.a O
+  ## Running testcase B.2.a
+  # testing echange of "O" (a9bdc8b26820)
+  ## initial state
+  # obstore: main
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing "O" from main to pushdest
+  pushing to pushdest
+  searching for changes
+  no changes found
+  remote: 1 new obsolescence markers
+  ## post push state
+  # obstore: main
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling "a9bdc8b26820" from main into pulldest
+  pulling from main
+  no changes found
+  1 new obsolescence markers
+  ## post pull state
+  # obstore: main
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+
+Actual Test (bare push version)
+-----------------------------------
+
+  $ dotest B.2.b
+  ## Running testcase B.2.b
+  ## initial state
+  # obstore: main
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing from main to pushdest
+  pushing to pushdest
+  searching for changes
+  no changes found
+  remote: 1 new obsolescence markers
+  ## post push state
+  # obstore: main
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling from main into pulldest
+  pulling from main
+  searching for changes
+  no changes found
+  1 new obsolescence markers
+  ## post pull state
+  # obstore: main
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
new file mode 100644
--- /dev/null
+++ b/tests/test-exchange-B3.t
@@ -0,0 +1,100 @@
+
+
+Initial setup
+
+  $ . $TESTDIR/_exc-util.sh
+
+=== B.3 Pruned changeset on non-pushed part of the history ===
+
+.. {{{
+..   ⊗ C
+..   |
+..   ○ B
+..   | ◔ A
+..   |/
+..   ● O
+.. }}}
+..
+.. Marker exist from:
+..
+..  * C (prune)
+..
+.. Command run:
+..
+..  * hg push -r A
+..  * hg push
+..
+.. Expected exchange:
+..
+..  * ø
+..
+.. Expected Exclude:
+..
+..  * chain from B
+
+
+  $ setuprepos B.3
+  creating test repo for test case B.3
+  - pulldest
+  - main
+  - pushdest
+  cd into `main` and proceed with env setup
+  $ cd main
+  $ mkcommit A
+  $ hg up --quiet 0
+  $ mkcommit B
+  created new head
+  $ mkcommit C
+  $ hg prune -qd '0 0' .
+  $ hg log -G --hidden
+  x  e56289ab6378 (draft): C
+  |
+  @  35b183996678 (draft): B
+  |
+  | o  f5bc6836db60 (draft): A
+  |/
+  o  a9bdc8b26820 (public): O
+  
+  $ hg debugobsolete
+  e56289ab6378dc752fd7965f8bf66b58bda740bd 0 {35b1839966785d5703a01607229eea932db42f87} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  $ cd ..
+  $ cd ..
+
+
+Actual Test
+-----------------------------------
+
+  $ dotest B.3 A
+  ## Running testcase B.3
+  # testing echange of "A" (f5bc6836db60)
+  ## initial state
+  # obstore: main
+  e56289ab6378dc752fd7965f8bf66b58bda740bd 0 {35b1839966785d5703a01607229eea932db42f87} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing "A" from main to pushdest
+  pushing to pushdest
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
+  ## post push state
+  # obstore: main
+  e56289ab6378dc752fd7965f8bf66b58bda740bd 0 {35b1839966785d5703a01607229eea932db42f87} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pulling "f5bc6836db60" from main into pulldest
+  pulling from main
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  (run 'hg update' to get a working copy)
+  ## post pull state
+  # obstore: main
+  e56289ab6378dc752fd7965f8bf66b58bda740bd 0 {35b1839966785d5703a01607229eea932db42f87} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+
new file mode 100644
--- /dev/null
+++ b/tests/test-exchange-B4.t
@@ -0,0 +1,143 @@
+
+Initial setup
+
+  $ . $TESTDIR/_exc-util.sh
+
+=== B.4 Pruned changeset on common part of history ===
+
+.. {{{
+..   ⊗ C
+..   | ● B
+..   | |
+..   | ● A
+..   |/
+..   ● O
+.. }}}
+..
+.. Marker exist from:
+..
+..  * C (prune)
+..
+.. Command run:
+..
+..  * hg push -r B
+..  * hg push
+..
+.. Expected exchange:
+..
+..  * prune for C
+
+
+  $ setuprepos B.4
+  creating test repo for test case B.4
+  - pulldest
+  - main
+  - pushdest
+  cd into `main` and proceed with env setup
+  $ cd main
+  $ mkcommit A
+  $ mkcommit B
+  $ hg phase --public .
+  $ hg push ../pushdest
+  pushing to ../pushdest
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 2 changesets with 2 changes to 2 files
+  $ hg push ../pulldest
+  pushing to ../pulldest
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 2 changesets with 2 changes to 2 files
+  $ hg update -q 0
+  $ mkcommit C
+  created new head
+  $ hg prune -qd '0 0' .
+  $ hg log -G --hidden
+  x  7f7f229b13a6 (draft): C
+  |
+  | o  f6fbb35d8ac9 (public): B
+  | |
+  | o  f5bc6836db60 (public): A
+  |/
+  @  a9bdc8b26820 (public): O
+  
+  $ hg debugobsolete
+  7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  $ cd ..
+  $ cd ..
+
+
+  $ cp -r B.4 B.4.a
+  $ cp -r B.4 B.4.b
+
+Actual Test (explicit push version)
+-----------------------------------
+
+  $ dotest B.4.a O
+  ## Running testcase B.4.a
+  # testing echange of "O" (a9bdc8b26820)
+  ## initial state
+  # obstore: main
+  7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing "O" from main to pushdest
+  pushing to pushdest
+  searching for changes
+  no changes found
+  remote: 1 new obsolescence markers
+  ## post push state
+  # obstore: main
+  7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling "a9bdc8b26820" from main into pulldest
+  pulling from main
+  no changes found
+  1 new obsolescence markers
+  ## post pull state
+  # obstore: main
+  7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+
+Actual Test (bare push version)
+-----------------------------------
+
+  $ dotest B.4.b
+  ## Running testcase B.4.b
+  ## initial state
+  # obstore: main
+  7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing from main to pushdest
+  pushing to pushdest
+  searching for changes
+  no changes found
+  remote: 1 new obsolescence markers
+  ## post push state
+  # obstore: main
+  7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling from main into pulldest
+  pulling from main
+  searching for changes
+  no changes found
+  1 new obsolescence markers
+  ## post pull state
+  # obstore: main
+  7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
new file mode 100644
--- /dev/null
+++ b/tests/test-exchange-B5.t
@@ -0,0 +1,171 @@
+
+
+
+Initial setup
+
+  $ . $TESTDIR/_exc-util.sh
+
+
+=== B.5 Push of a children of changeset which successors is pruned ===
+
+.. This case Mirror A.4, with pruned changeset successors.
+..
+.. {{{
+..   B ◔
+..     |
+..   A⇠ø⇠⊗ A'
+..     |/
+..     ● O
+.. }}}
+..
+.. Marker exist from:
+..
+..  * `Aø⇠○ A'`
+..  * chain from A
+..  * `A'`
+..
+.. Command run:
+..
+..  * hg push -r B
+..
+.. Expected exchange:
+..
+..  * `Aø⇠○ A'`
+..  * chain from A
+..  * `A'`
+..
+.. Extra Note:
+..
+..   I'm not totally happy about this case and I believe some more complicated
+..   graph can result in behavior wuite confusing for the user (if some tool create
+..   prune maker in a the middle of a valid chain)
+
+  $ setuprepos B.5
+  creating test repo for test case B.5
+  - pulldest
+  - main
+  - pushdest
+  cd into `main` and proceed with env setup
+  $ cd main
+  $ mkcommit A0
+  $ mkcommit B
+  $ hg up --quiet 0
+  $ mkcommit A1
+  created new head
+  $ hg debugobsolete --hidden `getid 'desc(A0)'` `getid 'desc(A1)'`
+  $ hg prune -qd '0 0' .
+  $ hg log -G --hidden
+  x  e5ea8f9c7314 (draft): A1
+  |
+  | o  06055a7959d4 (draft): B
+  | |
+  | x  28b51eb45704 (draft): A0
+  |/
+  @  a9bdc8b26820 (public): O
+  
+  $ hg debugobsolete
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  $ cd ..
+  $ cd ..
+
+  $ cp -r B.5 B.5.a
+  $ cp -r B.5 B.5.b
+
+Actual Test (explicit push version)
+-----------------------------------
+
+  $ dotest B.5.a B -f
+  ## Running testcase B.5.a
+  # testing echange of "B" (06055a7959d4)
+  ## initial state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing "B" from main to pushdest
+  pushing to pushdest
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 2 changesets with 2 changes to 2 files
+  remote: 2 new obsolescence markers
+  ## post push state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling "06055a7959d4" from main into pulldest
+  pulling from main
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 2 changes to 2 files
+  2 new obsolescence markers
+  (run 'hg update' to get a working copy)
+  1 new unstable changesets
+  ## post pull state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+
+Actual Test (bare push version)
+-------------------------------------
+
+  $ dotest B.5.b B -f
+  ## Running testcase B.5.b
+  # testing echange of "B" (06055a7959d4)
+  ## initial state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing "B" from main to pushdest
+  pushing to pushdest
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 2 changesets with 2 changes to 2 files
+  remote: 2 new obsolescence markers
+  ## post push state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling "06055a7959d4" from main into pulldest
+  pulling from main
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 2 changes to 2 files
+  2 new obsolescence markers
+  (run 'hg update' to get a working copy)
+  1 new unstable changesets
+  ## post pull state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
new file mode 100644
--- /dev/null
+++ b/tests/test-exchange-B6.t
@@ -0,0 +1,101 @@
+
+
+
+
+Initial setup
+
+  $ . $TESTDIR/_exc-util.sh
+
+== B.6 Pruned changeset with ancestors not in pushed set ===
+
+.. {{{
+..   B ø⇠⊗ B'
+..     | |
+..   A ○ |
+..     |/
+..     ● O
+.. }}}
+..
+.. Marker exist from:
+..
+..  * `Bø⇠⊗ B'`
+..  * B' prune
+..
+.. Command run:
+..
+..  * hg push -r O
+..
+.. Expected exchange:
+..
+..  * `Bø⇠⊗ B'`
+..  * B' prune
+
+  $ setuprepos B.6
+  creating test repo for test case B.6
+  - pulldest
+  - main
+  - pushdest
+  cd into `main` and proceed with env setup
+  $ cd main
+  $ mkcommit A
+  $ mkcommit B0
+  $ hg up --quiet 0
+  $ mkcommit B1
+  created new head
+  $ hg debugobsolete `getid 'desc(B0)'` `getid 'desc(B1)'`
+  $ hg prune -qd '0 0' .
+  $ hg log -G --hidden
+  x  f6298a8ac3a4 (draft): B1
+  |
+  | x  962ecf6b1afc (draft): B0
+  | |
+  | o  f5bc6836db60 (draft): A
+  |/
+  @  a9bdc8b26820 (public): O
+  
+  $ hg debugobsolete
+  962ecf6b1afc94e15c7e48fdfb76ef8abd11372b f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  $ cd ..
+  $ cd ..
+
+Actual Test
+-------------------------------------
+
+  $ dotest B.6 O
+  ## Running testcase B.6
+  # testing echange of "O" (a9bdc8b26820)
+  ## initial state
+  # obstore: main
+  962ecf6b1afc94e15c7e48fdfb76ef8abd11372b f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing "O" from main to pushdest
+  pushing to pushdest
+  searching for changes
+  no changes found
+  remote: 2 new obsolescence markers
+  ## post push state
+  # obstore: main
+  962ecf6b1afc94e15c7e48fdfb76ef8abd11372b f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  962ecf6b1afc94e15c7e48fdfb76ef8abd11372b f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling "a9bdc8b26820" from main into pulldest
+  pulling from main
+  no changes found
+  2 new obsolescence markers
+  ## post pull state
+  # obstore: main
+  962ecf6b1afc94e15c7e48fdfb76ef8abd11372b f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  962ecf6b1afc94e15c7e48fdfb76ef8abd11372b f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  962ecf6b1afc94e15c7e48fdfb76ef8abd11372b f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+
new file mode 100644
--- /dev/null
+++ b/tests/test-exchange-B7.t
@@ -0,0 +1,83 @@
+
+Initial setup
+
+  $ . $TESTDIR/_exc-util.sh
+
+
+=== B.7 Prune on non-targeted common changeset ===
+..
+.. {{{
+..     ⊗ B
+..     |
+..     ◕ A
+..     |
+..     ● O
+.. }}}
+..
+.. Marker exist from:
+..
+..  * B (prune)
+..
+.. Command run:
+..
+..  * hg push -r O
+........  * hg push
+..
+.. Expected exchange:
+..
+..  * ø
+.......  * B (prune)
+
+  $ setuprepos B.7
+  creating test repo for test case B.7
+  - pulldest
+  - main
+  - pushdest
+  cd into `main` and proceed with env setup
+  $ cd main
+  $ mkcommit A
+  $ hg push -q ../pushdest
+  $ hg push -q ../pulldest
+  $ mkcommit B
+  $ hg prune -qd '0 0' .
+  $ hg log -G --hidden
+  x  f6fbb35d8ac9 (draft): B
+  |
+  @  f5bc6836db60 (draft): A
+  |
+  o  a9bdc8b26820 (public): O
+  
+  $ hg debugobsolete
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  $ cd ..
+  $ cd ..
+
+Actual Test
+-------------------------------------
+
+  $ dotest B.7 O
+  ## Running testcase B.7
+  # testing echange of "O" (a9bdc8b26820)
+  ## initial state
+  # obstore: main
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing "O" from main to pushdest
+  pushing to pushdest
+  searching for changes
+  no changes found
+  ## post push state
+  # obstore: main
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pulling "a9bdc8b26820" from main into pulldest
+  pulling from main
+  no changes found
+  ## post pull state
+  # obstore: main
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+
new file mode 100644
--- /dev/null
+++ b/tests/test-exchange-C1.t
@@ -0,0 +1,135 @@
+
+Initial setup
+
+  $ . $TESTDIR/_exc-util.sh
+
+=== C.1 Multiple pruned changeset atop each other ===
+.. 
+.. {{{
+..   ⊗ B
+..   |
+..   ⊗ A
+..   |
+..   ● O
+.. }}}
+.. 
+.. Marker exist from:
+.. 
+..  * A (prune)
+..  * B (prune)
+.. 
+.. Command run:
+.. 
+..  * hg push -r O
+..  * hg push
+.. 
+.. Expected exchange:
+.. 
+..  * A (prune)
+..  * B (prune)
+
+  $ setuprepos C.1
+  creating test repo for test case C.1
+  - pulldest
+  - main
+  - pushdest
+  cd into `main` and proceed with env setup
+  $ cd main
+  $ mkcommit A
+  $ mkcommit B
+  $ hg prune -qd '0 0' .^::.
+  $ hg log -G --hidden
+  x  f6fbb35d8ac9 (draft): B
+  |
+  x  f5bc6836db60 (draft): A
+  |
+  @  a9bdc8b26820 (public): O
+  
+  $ hg debugobsolete
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  $ cd ..
+  $ cd ..
+
+  $ cp -r C.1 C.1.a
+  $ cp -r C.1 C.1.b
+
+Actual Test (explicit push)
+---------------------------
+
+  $ dotest C.1.a O
+  ## Running testcase C.1.a
+  # testing echange of "O" (a9bdc8b26820)
+  ## initial state
+  # obstore: main
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing "O" from main to pushdest
+  pushing to pushdest
+  searching for changes
+  no changes found
+  remote: 2 new obsolescence markers
+  ## post push state
+  # obstore: main
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling "a9bdc8b26820" from main into pulldest
+  pulling from main
+  no changes found
+  2 new obsolescence markers
+  ## post pull state
+  # obstore: main
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+
+Actual Test (bare push)
+-------------------------------------
+
+  $ dotest C.1.b
+  ## Running testcase C.1.b
+  ## initial state
+  # obstore: main
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing from main to pushdest
+  pushing to pushdest
+  searching for changes
+  no changes found
+  remote: 2 new obsolescence markers
+  ## post push state
+  # obstore: main
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling from main into pulldest
+  pulling from main
+  searching for changes
+  no changes found
+  2 new obsolescence markers
+  ## post pull state
+  # obstore: main
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
new file mode 100644
--- /dev/null
+++ b/tests/test-exchange-C2.t
@@ -0,0 +1,157 @@
+
+
+Initial setup
+
+  $ . $TESTDIR/_exc-util.sh
+
+=== C.2 Pruned changeset on precursors ===
+
+.. {{{
+..   B ⊗
+..     |
+..   A ø⇠◔ A'
+..     |/
+..     ● O
+.. }}}
+..
+.. Marker exist from:
+..
+..  * A' succeed to A
+..  * B (prune)
+..
+.. Command run:
+..
+..  * hg push -r A'
+..  * hg push
+..
+.. Expected exchange:
+..
+..  * `A ø⇠o A'`
+..  * B (prune)
+
+  $ setuprepos C.2
+  creating test repo for test case C.2
+  - pulldest
+  - main
+  - pushdest
+  cd into `main` and proceed with env setup
+  $ cd main
+  $ mkcommit A0
+  $ mkcommit B
+  $ hg prune -qd '0 0' .
+  $ hg update -q 0
+  $ mkcommit A1
+  created new head
+  $ hg debugobsolete `getid 'desc(A0)'` `getid 'desc(A1)'`
+  $ hg log -G --hidden
+  @  e5ea8f9c7314 (draft): A1
+  |
+  | x  06055a7959d4 (draft): B
+  | |
+  | x  28b51eb45704 (draft): A0
+  |/
+  o  a9bdc8b26820 (public): O
+  
+  $ hg debugobsolete
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  $ cd ..
+  $ cd ..
+
+  $ cp -r C.2 C.2.a
+  $ cp -r C.2 C.2.b
+
+Actual Test (explicit push)
+---------------------------
+
+  $ dotest C.2.a A1
+  ## Running testcase C.2.a
+  # testing echange of "A1" (e5ea8f9c7314)
+  ## initial state
+  # obstore: main
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing "A1" from main to pushdest
+  pushing to pushdest
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
+  remote: 2 new obsolescence markers
+  ## post push state
+  # obstore: main
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling "e5ea8f9c7314" from main into pulldest
+  pulling from main
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  2 new obsolescence markers
+  (run 'hg update' to get a working copy)
+  ## post pull state
+  # obstore: main
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+
+Actual Test (bare push)
+-------------------------------------
+
+  $ dotest C.2.b
+  ## Running testcase C.2.b
+  ## initial state
+  # obstore: main
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing from main to pushdest
+  pushing to pushdest
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
+  remote: 2 new obsolescence markers
+  ## post push state
+  # obstore: main
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling from main into pulldest
+  pulling from main
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  2 new obsolescence markers
+  (run 'hg update' to get a working copy)
+  ## post pull state
+  # obstore: main
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
new file mode 100644
--- /dev/null
+++ b/tests/test-exchange-C3.t
@@ -0,0 +1,159 @@
+
+
+Initial setup
+
+  $ . $TESTDIR/_exc-util.sh
+
+
+=== C.3 Pruned changeset on precursors of another pruned one ===
+
+.. {{{
+..   B ⊗
+..     |
+..   A ø⇠⊗ A'
+..     |/
+..     ● O
+.. }}}
+.. 
+.. Marker exist from:
+.. 
+..  * A' succeed to A
+..  * A' (prune
+..  * B (prune)
+.. 
+.. Command run:
+.. 
+..  * hg push -r A'
+..  * hg push
+.. 
+.. Expected exchange:
+.. 
+..  * `A ø⇠⊗ A'`
+..  * A (prune)
+..  * B (prune)
+
+  $ setuprepos C.3
+  creating test repo for test case C.3
+  - pulldest
+  - main
+  - pushdest
+  cd into `main` and proceed with env setup
+  $ cd main
+  $ mkcommit A0
+  $ mkcommit B
+  $ hg prune -qd '0 0' .
+  $ hg update -q 0
+  $ mkcommit A1
+  created new head
+  $ hg debugobsolete `getid 'desc(A0)'` `getid 'desc(A1)'`
+  $ hg prune -qd '0 0' .
+  $ hg log -G --hidden
+  x  e5ea8f9c7314 (draft): A1
+  |
+  | x  06055a7959d4 (draft): B
+  | |
+  | x  28b51eb45704 (draft): A0
+  |/
+  @  a9bdc8b26820 (public): O
+  
+  $ hg debugobsolete
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  $ cd ..
+  $ cd ..
+
+  $ cp -r C.3 C.3.a
+  $ cp -r C.3 C.3.b
+
+Actual Test (explicit push)
+---------------------------
+
+  $ dotest C.3.a O
+  ## Running testcase C.3.a
+  # testing echange of "O" (a9bdc8b26820)
+  ## initial state
+  # obstore: main
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing "O" from main to pushdest
+  pushing to pushdest
+  searching for changes
+  no changes found
+  remote: 3 new obsolescence markers
+  ## post push state
+  # obstore: main
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling "a9bdc8b26820" from main into pulldest
+  pulling from main
+  no changes found
+  3 new obsolescence markers
+  ## post pull state
+  # obstore: main
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+
+Actual Test (bare push)
+-------------------------------------
+
+  $ dotest C.3.b
+  ## Running testcase C.3.b
+  ## initial state
+  # obstore: main
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing from main to pushdest
+  pushing to pushdest
+  searching for changes
+  no changes found
+  remote: 3 new obsolescence markers
+  ## post push state
+  # obstore: main
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling from main into pulldest
+  pulling from main
+  searching for changes
+  no changes found
+  3 new obsolescence markers
+  ## post pull state
+  # obstore: main
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
new file mode 100644
--- /dev/null
+++ b/tests/test-exchange-C4.t
@@ -0,0 +1,118 @@
+
+
+Initial setup
+
+  $ . $TESTDIR/_exc-util.sh
+
+=== C.4 multiple successors, one is pruned ===
+
+.. Another case were prune are confusing? (A is killed without its successors being
+.. pushed)
+..
+.. (could split of divergence, if split see the Z section)
+..
+.. {{{
+..        A
+..    B ○⇢ø⇠⊗ C
+..       \|/
+..        ● O
+.. }}}
+..
+.. Marker exist from:
+..
+..  * `A ø⇠○ B`
+..  * `A ø⇠○ C`
+..  * C (prune)
+..
+..
+.. Command run:
+..
+..  * hg push -r O
+..
+.. Expected exchange:
+..
+..  * `A ø⇠○ C`
+..  * C (prune)
+..
+.. Expected exclude:
+..
+..  * `A ø⇠○ B`
+
+Implemented as the non-split version
+
+  $ setuprepos C.4
+  creating test repo for test case C.4
+  - pulldest
+  - main
+  - pushdest
+  cd into `main` and proceed with env setup
+  $ cd main
+  $ mkcommit A
+  $ hg update -q 0
+  $ mkcommit B
+  created new head
+  $ hg update -q 0
+  $ mkcommit C
+  created new head
+  $ hg debugobsolete --hidden `getid 'desc(A)'` `getid 'desc(B)'`
+  $ hg debugobsolete --hidden `getid 'desc(A)'` `getid 'desc(C)'`
+  $ hg prune -qd '0 0' .
+  $ hg log -G --hidden
+  x  7f7f229b13a6 (draft): C
+  |
+  | o  35b183996678 (draft): B
+  |/
+  | x  f5bc6836db60 (draft): A
+  |/
+  @  a9bdc8b26820 (public): O
+  
+  $ hg debugobsolete
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 35b1839966785d5703a01607229eea932db42f87 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  $ cd ..
+  $ cd ..
+
+Actual Test
+-------------------------------------
+
+  $ dotest C.4 O
+  ## Running testcase C.4
+  # testing echange of "O" (a9bdc8b26820)
+  ## initial state
+  # obstore: main
+  7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 35b1839966785d5703a01607229eea932db42f87 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing "O" from main to pushdest
+  pushing to pushdest
+  searching for changes
+  no changes found
+  remote: 2 new obsolescence markers
+  ## post push state
+  # obstore: main
+  7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 35b1839966785d5703a01607229eea932db42f87 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling "a9bdc8b26820" from main into pulldest
+  pulling from main
+  no changes found
+  2 new obsolescence markers
+  ## post pull state
+  # obstore: main
+  7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 35b1839966785d5703a01607229eea932db42f87 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  f5bc6836db60e308a17ba08bf050154ba9c4fad7 7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+
new file mode 100644
--- /dev/null
+++ b/tests/test-exchange-D1.t
@@ -0,0 +1,105 @@
+
+Initial setup
+
+  $ . $TESTDIR/_exc-util.sh
+
+=== D.1 Pruned changeset based on missing precursor of something not present ===
+
+.. {{{
+..   B ⊗
+..     |
+..   A ◌⇠◔ A'
+..     |/
+..     ● O
+.. }}}
+..
+.. Marker exist from:
+..
+..  * A' succeed to A
+..  * B (prune)
+..
+.. Command run:
+..
+..  * hg push -r A'
+..  * hg push
+..
+.. Expected exchange:
+..
+..  * `A ø⇠o A'`
+..  * B (prune)
+
+  $ setuprepos D.1
+  creating test repo for test case D.1
+  - pulldest
+  - main
+  - pushdest
+  cd into `main` and proceed with env setup
+  $ cd main
+  $ mkcommit A0
+  $ mkcommit B
+  $ hg up -q 0
+  $ mkcommit A1
+  created new head
+  $ hg debugobsolete `getid 'desc(A0)'` `getid 'desc(A1)'`
+  $ hg prune -d '0 0' 'desc(B)'
+  1 changesets pruned
+  $ hg strip --hidden -q 'desc(A0)'
+  $ hg log -G --hidden
+  @  e5ea8f9c7314 (draft): A1
+  |
+  o  a9bdc8b26820 (public): O
+  
+  $ hg debugobsolete
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  $ cd ..
+  $ cd ..
+
+Actual Test
+-------------------------------------
+
+  $ dotest D.1 A1
+  ## Running testcase D.1
+  # testing echange of "A1" (e5ea8f9c7314)
+  ## initial state
+  # obstore: main
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing "A1" from main to pushdest
+  pushing to pushdest
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
+  remote: 2 new obsolescence markers
+  ## post push state
+  # obstore: main
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling "e5ea8f9c7314" from main into pulldest
+  pulling from main
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  2 new obsolescence markers
+  (run 'hg update' to get a working copy)
+  ## post pull state
+  # obstore: main
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+
new file mode 100644
--- /dev/null
+++ b/tests/test-exchange-D2.t
@@ -0,0 +1,94 @@
+
+
+Initial setup
+
+  $ . $TESTDIR/_exc-util.sh
+
+=== D.2 missing prune target (prune in "pushed set") ===
+
+{{{
+}}}
+
+Marker exist from:
+
+ * A' succeed to A
+ * A' (prune)
+
+Command run:
+
+ * hg push
+
+Expected exchange:
+
+ * `A ø⇠o A'`
+ * A' (prune)
+
+
+  $ setuprepos D.2
+  creating test repo for test case D.2
+  - pulldest
+  - main
+  - pushdest
+  cd into `main` and proceed with env setup
+  $ cd main
+  $ mkcommit A0
+  $ hg up -q 0
+  $ mkcommit A1
+  created new head
+  $ hg debugobsolete `getid 'desc(A0)'` `getid 'desc(A1)'`
+  $ hg prune --date '0 0' .
+  1 changesets pruned
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  working directory now at a9bdc8b26820
+  $ hg strip --hidden -q 'desc(A1)'
+  $ hg log -G --hidden
+  x  28b51eb45704 (draft): A0
+  |
+  @  a9bdc8b26820 (public): O
+  
+  $ hg debugobsolete
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  $ cd ..
+  $ cd ..
+
+Actual Test
+-------------------------------------
+
+  $ dotest D.2
+  ## Running testcase D.2
+  ## initial state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing from main to pushdest
+  pushing to pushdest
+  searching for changes
+  no changes found
+  remote: 2 new obsolescence markers
+  ## post push state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling from main into pulldest
+  pulling from main
+  searching for changes
+  no changes found
+  2 new obsolescence markers
+  ## post pull state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+
new file mode 100644
--- /dev/null
+++ b/tests/test-exchange-D3.t
@@ -0,0 +1,90 @@
+
+
+
+Initial setup
+
+  $ . $TESTDIR/_exc-util.sh
+
+=== D.2 missing prune target (prune in "pushed set") ===
+
+{{{
+}}}
+
+Marker exist from:
+
+ * A' succeed to A
+ * A' (prune)
+
+Command run:
+
+ * hg push
+
+Expected exchange:
+
+ * `A ø⇠o A'`
+ * A' (prune)
+
+
+  $ setuprepos D.2
+  creating test repo for test case D.2
+  - pulldest
+  - main
+  - pushdest
+  cd into `main` and proceed with env setup
+  $ cd main
+  $ mkcommit A0
+  $ hg up -q 0
+  $ mkcommit B
+  created new head
+  $ mkcommit A1
+  $ hg debugobsolete `getid 'desc(A0)'` `getid 'desc(A1)'`
+  $ hg prune -d '0 0' .
+  1 changesets pruned
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  working directory now at 35b183996678
+  $ hg strip --hidden -q 'desc(A1)'
+  $ hg log -G --hidden
+  @  35b183996678 (draft): B
+  |
+  | x  28b51eb45704 (draft): A0
+  |/
+  o  a9bdc8b26820 (public): O
+  
+  $ hg debugobsolete
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f 6aa67a7b4baa6fb41b06aed38d5b1201436546e2 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  6aa67a7b4baa6fb41b06aed38d5b1201436546e2 0 {35b1839966785d5703a01607229eea932db42f87} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  $ cd ..
+  $ cd ..
+
+Actual Test
+-------------------------------------
+
+  $ dotest D.2 O
+  ## Running testcase D.2
+  # testing echange of "O" (a9bdc8b26820)
+  ## initial state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f 6aa67a7b4baa6fb41b06aed38d5b1201436546e2 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  6aa67a7b4baa6fb41b06aed38d5b1201436546e2 0 {35b1839966785d5703a01607229eea932db42f87} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing "O" from main to pushdest
+  pushing to pushdest
+  searching for changes
+  no changes found
+  ## post push state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f 6aa67a7b4baa6fb41b06aed38d5b1201436546e2 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  6aa67a7b4baa6fb41b06aed38d5b1201436546e2 0 {35b1839966785d5703a01607229eea932db42f87} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pulling "a9bdc8b26820" from main into pulldest
+  pulling from main
+  no changes found
+  ## post pull state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f 6aa67a7b4baa6fb41b06aed38d5b1201436546e2 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  6aa67a7b4baa6fb41b06aed38d5b1201436546e2 0 {35b1839966785d5703a01607229eea932db42f87} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+
new file mode 100644
--- /dev/null
+++ b/tests/test-exchange-D4.t
@@ -0,0 +1,125 @@
+
+
+Initial setup
+
+  $ . $TESTDIR/_exc-util.sh
+
+=== D.4 Unknown changeset in between known one ===
+
+.. Mostly a clarification case
+..
+.. {{{
+..     ø⇠◌⇠○
+..     | |/
+..     | ◔
+..     |/
+..     ● O
+..
+.. }}}
+..
+.. Should be treated as A.3 case:
+..
+.. {{{
+..
+..     ø⇠○
+..     | |
+..     | ◔
+..     |/
+..     ● O
+..
+.. }}}
+
+
+initial
+
+  $ setuprepos A.3.a
+  creating test repo for test case A.3.a
+  - pulldest
+  - main
+  - pushdest
+  cd into `main` and proceed with env setup
+  $ cd main
+  $ mkcommit A0
+  $ mkcommit B0
+  $ hg update -q 0
+  $ mkcommit A1
+  created new head
+  $ mkcommit B1
+  $ hg debugobsolete `getid 'desc(A0)'` aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+  $ hg debugobsolete aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa `getid 'desc(A1)'`
+  $ hg debugobsolete `getid 'desc(B0)'` bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+  $ hg debugobsolete bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb `getid 'desc(B1)'`
+  $ hg log -G --hidden
+  @  069b05c3876d (draft): B1
+  |
+  o  e5ea8f9c7314 (draft): A1
+  |
+  | x  6e72f0a95b5e (draft): B0
+  | |
+  | x  28b51eb45704 (draft): A0
+  |/
+  o  a9bdc8b26820 (public): O
+  
+  $ hg debugobsolete
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  6e72f0a95b5e01a7504743aa941f69cb1fbef8b0 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 069b05c3876d56f62895e853a501ea58ea85f68d 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  $ cd ..
+  $ cd ..
+
+Actual Test for first version (changeset unknown in remote)
+-----------------------------------------------------------
+
+  $ dotest A.3.a A1
+  ## Running testcase A.3.a
+  # testing echange of "A1" (e5ea8f9c7314)
+  ## initial state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  6e72f0a95b5e01a7504743aa941f69cb1fbef8b0 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 069b05c3876d56f62895e853a501ea58ea85f68d 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  # obstore: pulldest
+  ## pushing "A1" from main to pushdest
+  pushing to pushdest
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
+  remote: 2 new obsolescence markers
+  ## post push state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  6e72f0a95b5e01a7504743aa941f69cb1fbef8b0 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 069b05c3876d56f62895e853a501ea58ea85f68d 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  ## pulling "e5ea8f9c7314" from main into pulldest
+  pulling from main
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  2 new obsolescence markers
+  (run 'hg update' to get a working copy)
+  ## post pull state
+  # obstore: main
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  6e72f0a95b5e01a7504743aa941f69cb1fbef8b0 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 069b05c3876d56f62895e853a501ea58ea85f68d 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pushdest
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  # obstore: pulldest
+  28b51eb45704506b5c603decd6bf7ac5e0f6a52f aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+
+
new file mode 100644
--- /dev/null
+++ b/tests/test-import.t
@@ -0,0 +1,91 @@
+
+This feature requires mercurial 3.0
+(and the `only()` revset is 3.0 specific)
+
+  $ (hg help revset | grep '"only(' > /dev/null) || exit 80
+
+Test creation of obsolescence marker by path import
+
+  $ hg init auto-obsolete
+  $ cd auto-obsolete
+  $ echo '[extensions]' >> $HGRCPATH
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+  $ echo A > a
+  $ hg commit -Am A
+  adding a
+  $ echo B > b
+  $ hg commit -Am B
+  adding b
+  $ hg up '.^'
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ echo C > c
+  $ hg commit -Am C
+  adding c
+  created new head
+  $ hg log -G
+  @  changeset:   2:eb8dd0f31b51
+  |  tag:         tip
+  |  parent:      0:f2bbf19cf96d
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     C
+  |
+  | o  changeset:   1:95b760afef3c
+  |/   user:        test
+  |    date:        Thu Jan 01 00:00:00 1970 +0000
+  |    summary:     B
+  |
+  o  changeset:   0:f2bbf19cf96d
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     A
+  
+
+(actual test)
+
+  $ hg export 'desc(B)' | hg import - --obsolete
+  applying patch from stdin
+  $ hg log -G
+  @  changeset:   3:00c49133f17e
+  |  tag:         tip
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     B
+  |
+  o  changeset:   2:eb8dd0f31b51
+  |  parent:      0:f2bbf19cf96d
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     C
+  |
+  o  changeset:   0:f2bbf19cf96d
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     A
+  
+  $ hg debugobsolete
+  95b760afef3c234ffb3f9fd391edcb36e60921a4 00c49133f17e5e5a52b6ef1b6d516c0e90b56d8a 0 (*) {'user': 'test'} (glob)
+
+  $ hg rollback
+  repository tip rolled back to revision 2 (undo import)
+  working directory now based on revision 2
+  $ hg log -G
+  @  changeset:   2:eb8dd0f31b51
+  |  tag:         tip
+  |  parent:      0:f2bbf19cf96d
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     C
+  |
+  | o  changeset:   1:95b760afef3c
+  |/   user:        test
+  |    date:        Thu Jan 01 00:00:00 1970 +0000
+  |    summary:     B
+  |
+  o  changeset:   0:f2bbf19cf96d
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     A
+  
+  $ hg debugobsolete
+
new file mode 100644
--- /dev/null
+++ b/tests/test-obsconvert.t
@@ -0,0 +1,78 @@
+  $ cat >> $HGRCPATH <<EOF
+  > [extensions]
+  > EOF
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+  $ hg init alpha
+  $ cd alpha
+  $ echo foo > foo
+  $ hg addremove
+  adding foo
+  $ hg ci -m 'foo'
+  $ for x in 1 2 3 4 ; do
+  >   echo foo $x > foo
+  >   hg amend
+  > done
+
+Test conversion between obsolete marker formats
+  $ hg debugobsolete
+  e63c23eaa88ae77967edcf4ea194d31167c478b0 b81ac6b9d2a55f9a7a6b90a006b1aab0568d6d34 0 (*) {'user': 'test'} (glob)
+  a5b276878fa564da042b4b9efef3713ceea20350 0 {e63c23eaa88ae77967edcf4ea194d31167c478b0} (*) {'user': 'test'} (glob)
+  b81ac6b9d2a55f9a7a6b90a006b1aab0568d6d34 384fc811182687231962e486f23ea8c5bab7a2d3 0 (*) {'user': 'test'} (glob)
+  2291082406feb57d0f83b9b0a6777b6074f3fde6 0 {b81ac6b9d2a55f9a7a6b90a006b1aab0568d6d34} (*) {'user': 'test'} (glob)
+  384fc811182687231962e486f23ea8c5bab7a2d3 949d379b3c3bf051906bc3528c049cb536e2ec86 0 (*) {'user': 'test'} (glob)
+  1616bdbe82d3fd1fb7c4e068aee277835672ffdc 0 {384fc811182687231962e486f23ea8c5bab7a2d3} (*) {'user': 'test'} (glob)
+  949d379b3c3bf051906bc3528c049cb536e2ec86 f2e4c45b2a4a58ccf7ef6825b8fa5685873cd2f7 0 (*) {'user': 'test'} (glob)
+  8668d55aac650158bb510be6d47d21e3db9e5c75 0 {949d379b3c3bf051906bc3528c049cb536e2ec86} (*) {'user': 'test'} (glob)
+  $ hg debugobsconvert --new-format 0
+  Old store is version 1, will rewrite in version 0
+  Done!
+  $ hg debugobsolete
+  e63c23eaa88ae77967edcf4ea194d31167c478b0 b81ac6b9d2a55f9a7a6b90a006b1aab0568d6d34 0 (*) {'user': 'test'} (glob)
+  a5b276878fa564da042b4b9efef3713ceea20350 0 {e63c23eaa88ae77967edcf4ea194d31167c478b0} (*) {'user': 'test'} (glob)
+  b81ac6b9d2a55f9a7a6b90a006b1aab0568d6d34 384fc811182687231962e486f23ea8c5bab7a2d3 0 (*) {'user': 'test'} (glob)
+  2291082406feb57d0f83b9b0a6777b6074f3fde6 0 {b81ac6b9d2a55f9a7a6b90a006b1aab0568d6d34} (*) {'user': 'test'} (glob)
+  384fc811182687231962e486f23ea8c5bab7a2d3 949d379b3c3bf051906bc3528c049cb536e2ec86 0 (*) {'user': 'test'} (glob)
+  1616bdbe82d3fd1fb7c4e068aee277835672ffdc 0 {384fc811182687231962e486f23ea8c5bab7a2d3} (*) {'user': 'test'} (glob)
+  949d379b3c3bf051906bc3528c049cb536e2ec86 f2e4c45b2a4a58ccf7ef6825b8fa5685873cd2f7 0 (*) {'user': 'test'} (glob)
+  8668d55aac650158bb510be6d47d21e3db9e5c75 0 {949d379b3c3bf051906bc3528c049cb536e2ec86} (*) {'user': 'test'} (glob)
+  $ hg debugobsconvert --new-format 0
+  abort: New format is the same as the old format, not upgrading!
+  [255]
+  $ hg debugobsolete
+  e63c23eaa88ae77967edcf4ea194d31167c478b0 b81ac6b9d2a55f9a7a6b90a006b1aab0568d6d34 0 (*) {'user': 'test'} (glob)
+  a5b276878fa564da042b4b9efef3713ceea20350 0 {e63c23eaa88ae77967edcf4ea194d31167c478b0} (*) {'user': 'test'} (glob)
+  b81ac6b9d2a55f9a7a6b90a006b1aab0568d6d34 384fc811182687231962e486f23ea8c5bab7a2d3 0 (*) {'user': 'test'} (glob)
+  2291082406feb57d0f83b9b0a6777b6074f3fde6 0 {b81ac6b9d2a55f9a7a6b90a006b1aab0568d6d34} (*) {'user': 'test'} (glob)
+  384fc811182687231962e486f23ea8c5bab7a2d3 949d379b3c3bf051906bc3528c049cb536e2ec86 0 (*) {'user': 'test'} (glob)
+  1616bdbe82d3fd1fb7c4e068aee277835672ffdc 0 {384fc811182687231962e486f23ea8c5bab7a2d3} (*) {'user': 'test'} (glob)
+  949d379b3c3bf051906bc3528c049cb536e2ec86 f2e4c45b2a4a58ccf7ef6825b8fa5685873cd2f7 0 (*) {'user': 'test'} (glob)
+  8668d55aac650158bb510be6d47d21e3db9e5c75 0 {949d379b3c3bf051906bc3528c049cb536e2ec86} (*) {'user': 'test'} (glob)
+  $ hg debugobsconvert --new-format 1
+  Old store is version 0, will rewrite in version 1
+  Done!
+  $ hg debugobsolete
+  e63c23eaa88ae77967edcf4ea194d31167c478b0 b81ac6b9d2a55f9a7a6b90a006b1aab0568d6d34 0 (*) {'user': 'test'} (glob)
+  a5b276878fa564da042b4b9efef3713ceea20350 0 {e63c23eaa88ae77967edcf4ea194d31167c478b0} (*) {'user': 'test'} (glob)
+  b81ac6b9d2a55f9a7a6b90a006b1aab0568d6d34 384fc811182687231962e486f23ea8c5bab7a2d3 0 (*) {'user': 'test'} (glob)
+  2291082406feb57d0f83b9b0a6777b6074f3fde6 0 {b81ac6b9d2a55f9a7a6b90a006b1aab0568d6d34} (*) {'user': 'test'} (glob)
+  384fc811182687231962e486f23ea8c5bab7a2d3 949d379b3c3bf051906bc3528c049cb536e2ec86 0 (*) {'user': 'test'} (glob)
+  1616bdbe82d3fd1fb7c4e068aee277835672ffdc 0 {384fc811182687231962e486f23ea8c5bab7a2d3} (*) {'user': 'test'} (glob)
+  949d379b3c3bf051906bc3528c049cb536e2ec86 f2e4c45b2a4a58ccf7ef6825b8fa5685873cd2f7 0 (*) {'user': 'test'} (glob)
+  8668d55aac650158bb510be6d47d21e3db9e5c75 0 {949d379b3c3bf051906bc3528c049cb536e2ec86} (*) {'user': 'test'} (glob)
+
+Test that the default is some reasonably modern format (first downgrade)
+  $ hg debugobsconvert --new-format 0
+  Old store is version 1, will rewrite in version 0
+  Done!
+  $ hg debugobsconvert
+  Old store is version 0, will rewrite in version 1
+  Done!
+  $ hg debugobsolete
+  e63c23eaa88ae77967edcf4ea194d31167c478b0 b81ac6b9d2a55f9a7a6b90a006b1aab0568d6d34 0 (*) {'user': 'test'} (glob)
+  a5b276878fa564da042b4b9efef3713ceea20350 0 {e63c23eaa88ae77967edcf4ea194d31167c478b0} (*) {'user': 'test'} (glob)
+  b81ac6b9d2a55f9a7a6b90a006b1aab0568d6d34 384fc811182687231962e486f23ea8c5bab7a2d3 0 (*) {'user': 'test'} (glob)
+  2291082406feb57d0f83b9b0a6777b6074f3fde6 0 {b81ac6b9d2a55f9a7a6b90a006b1aab0568d6d34} (*) {'user': 'test'} (glob)
+  384fc811182687231962e486f23ea8c5bab7a2d3 949d379b3c3bf051906bc3528c049cb536e2ec86 0 (*) {'user': 'test'} (glob)
+  1616bdbe82d3fd1fb7c4e068aee277835672ffdc 0 {384fc811182687231962e486f23ea8c5bab7a2d3} (*) {'user': 'test'} (glob)
+  949d379b3c3bf051906bc3528c049cb536e2ec86 f2e4c45b2a4a58ccf7ef6825b8fa5685873cd2f7 0 (*) {'user': 'test'} (glob)
+  8668d55aac650158bb510be6d47d21e3db9e5c75 0 {949d379b3c3bf051906bc3528c049cb536e2ec86} (*) {'user': 'test'} (glob)
--- a/tests/test-obsolete-push.t
+++ b/tests/test-obsolete-push.t
@@ -2,10 +2,8 @@
   > [defaults]
   > amend=-d "0 0"
   > [extensions]
-  > hgext.rebase=
   > hgext.graphlog=
   > EOF
-  $ echo "obsolete=$(echo $(dirname $TESTDIR))/hgext/obsolete.py" >> $HGRCPATH
   $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
 
   $ template='{rev}:{node|short}@{branch}({obsolete}/{phase}) {desc|firstline}\n'
@@ -28,13 +26,14 @@
   $ hg ci -qAm C c
   $ hg phase --secret --force .
   $ hg kill 0 1
-  1 new unstables changesets
+  2 changesets pruned
+  1 new unstable changesets
   $ glog --hidden
   @  2:244232c2222a@default(unstable/secret) C
   |
-  | o  1:6c81ed0049f8@default(extinct/secret) B
+  | x  1:6c81ed0049f8@default(extinct/draft) B
   |/
-  o  0:1994f17a630e@default(suspended/secret) A
+  x  0:1994f17a630e@default(suspended/draft) A
   
   $ hg init ../clone
   $ cat >  ../clone/.hg/hgrc <<EOF
@@ -44,5 +43,4 @@
   $ hg outgoing ../clone --template "$template"
   comparing with ../clone
   searching for changes
-  no changes found (ignored 2 secret changesets)
-  [1]
+  0:1994f17a630e@default(suspended/draft) A
deleted file mode 100644
--- a/tests/test-obsolete-rebase.t
+++ /dev/null
@@ -1,218 +0,0 @@
-  $ cat >> $HGRCPATH <<EOF
-  > [defaults]
-  > amend=-d "0 0"
-  > [extensions]
-  > hgext.rebase=
-  > hgext.graphlog=
-  > EOF
-  $ echo "obsolete=$(echo $(dirname $TESTDIR))/hgext/obsolete.py" >> $HGRCPATH
-
-  $ glog() {
-  >   hg glog --template '{rev}:{node|short}@{branch}({phase}) {desc|firstline}\n'\
-  >     "$@"
-  > }
-
-  $ hg init repo
-  $ cd repo
-  $ echo a > a
-  $ hg ci -Am adda
-  adding a
-  $ echo a >> a
-  $ hg ci -m changea
-
-Test regular rebase
-
-  $ hg up 0
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ echo b > b
-  $ hg ci -Am addb
-  adding b
-  created new head
-  $ echo e > e
-  $ hg ci -Am adde e
-  $ hg rebase -d 1 -r 3 --detach --keep  
-  $ glog
-  @  4:9c5494949763@default(draft) adde
-  |
-  | o  3:98e4a024635e@default(draft) adde
-  | |
-  | o  2:102a90ea7b4a@default(draft) addb
-  | |
-  o |  1:540395c44225@default(draft) changea
-  |/
-  o  0:07f494440405@default(draft) adda
-  
-  $ glog --hidden
-  @  4:9c5494949763@default(draft) adde
-  |
-  | o  3:98e4a024635e@default(draft) adde
-  | |
-  | o  2:102a90ea7b4a@default(draft) addb
-  | |
-  o |  1:540395c44225@default(draft) changea
-  |/
-  o  0:07f494440405@default(draft) adda
-  
-  $ hg debugsuccessors
-  $ hg --config extensions.hgext.mq= strip tip
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  saved backup bundle to $TESTTMP/repo/.hg/strip-backup/9c5494949763-backup.hg
-  $ hg rebase -d 1 -r 3 --detach
-  $ glog
-  @  4:9c5494949763@default(draft) adde
-  |
-  | o  2:102a90ea7b4a@default(draft) addb
-  | |
-  o |  1:540395c44225@default(draft) changea
-  |/
-  o  0:07f494440405@default(draft) adda
-  
-  $ glog --hidden
-  @  4:9c5494949763@default(draft) adde
-  |
-  | o  3:98e4a024635e@default(secret) adde
-  | |
-  | o  2:102a90ea7b4a@default(draft) addb
-  | |
-  o |  1:540395c44225@default(draft) changea
-  |/
-  o  0:07f494440405@default(draft) adda
-  
-  $ hg debugsuccessors
-  98e4a024635e 9c5494949763
-
-Test rebase with deleted empty revision
-
-  $ hg up 0
-  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ hg branch foo
-  marked working directory as branch foo
-  (branches are permanent and global, did you want a bookmark?)
-  $ echo a >> a
-  $ hg ci -m changea
-  $ hg rebase -d 1
-  $ glog --hidden
-  o  5:4e322f7ce8e3@foo(secret) changea
-  |
-  | o  4:9c5494949763@default(draft) adde
-  | |
-  | | o  3:98e4a024635e@default(secret) adde
-  | | |
-  +---o  2:102a90ea7b4a@default(draft) addb
-  | |
-  | @  1:540395c44225@default(draft) changea
-  |/
-  o  0:07f494440405@default(draft) adda
-  
-  $ hg debugsuccessors
-  4e322f7ce8e3 000000000000
-  98e4a024635e 9c5494949763
-
-Test rebase --collapse
-
-  $ hg up 0
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ echo c > c
-  $ hg ci -Am addc
-  adding c
-  created new head
-  $ echo c >> c
-  $ hg ci -m changec
-  $ hg rebase --collapse -d 1
-  merging c
-  $ glog --hidden
-  @  8:a7773ffa7edc@default(draft) Collapsed revision
-  |
-  | o  7:03f31481307a@default(secret) changec
-  | |
-  | o  6:076e9b2ffbe1@default(secret) addc
-  | |
-  | | o  5:4e322f7ce8e3@foo(secret) changea
-  | |/
-  +---o  4:9c5494949763@default(draft) adde
-  | |
-  | | o  3:98e4a024635e@default(secret) adde
-  | | |
-  | | o  2:102a90ea7b4a@default(draft) addb
-  | |/
-  o |  1:540395c44225@default(draft) changea
-  |/
-  o  0:07f494440405@default(draft) adda
-  
-  $ hg debugsuccessors
-  03f31481307a a7773ffa7edc
-  076e9b2ffbe1 a7773ffa7edc
-  4e322f7ce8e3 000000000000
-  98e4a024635e 9c5494949763
-
-Test rebase --abort
-
-  $ hg debugsuccessors > ../successors.old
-  $ hg up 0
-  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ echo d > d
-  $ hg ci -Am addd d
-  created new head
-  $ echo b >> a
-  $ hg ci -m appendab
-  $ hg rebase -d 1
-  merging a
-  warning: conflicts during merge.
-  merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
-  abort: unresolved conflicts (see hg resolve, then hg rebase --continue)
-  [255]
-  $ hg rebase --abort
-  saved backup bundle to $TESTTMP/repo/.hg/strip-backup/03f165c84ea8-backup.hg
-  rebase aborted
-  $ hg debugsuccessors > ../successors.new
-  $ diff -u ../successors.old ../successors.new
-
-Test rebase --continue
-
-  $ hg rebase -d 1
-  merging a
-  warning: conflicts during merge.
-  merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
-  abort: unresolved conflicts (see hg resolve, then hg rebase --continue)
-  [255]
-  $ hg resolve --tool internal:other a
-  $ hg rebase --continue
-  $ glog --hidden
-  @  12:1951ead97108@default(draft) appendab
-  |
-  o  11:03f165c84ea8@default(draft) addd
-  |
-  | o  10:4b9d80f48523@default(secret) appendab
-  | |
-  | o  9:a31943eabc43@default(secret) addd
-  | |
-  +---o  8:a7773ffa7edc@default(draft) Collapsed revision
-  | |
-  | | o  7:03f31481307a@default(secret) changec
-  | | |
-  | | o  6:076e9b2ffbe1@default(secret) addc
-  | |/
-  | | o  5:4e322f7ce8e3@foo(secret) changea
-  | |/
-  +---o  4:9c5494949763@default(draft) adde
-  | |
-  | | o  3:98e4a024635e@default(secret) adde
-  | | |
-  | | o  2:102a90ea7b4a@default(draft) addb
-  | |/
-  o |  1:540395c44225@default(draft) changea
-  |/
-  o  0:07f494440405@default(draft) adda
-  
-  $ hg debugsuccessors > ../successors.new
-  $ diff -u ../successors.old ../successors.new
-  --- ../successors.old* (glob)
-  +++ ../successors.new* (glob)
-  @@ -1,4 +1,6 @@
-   03f31481307a a7773ffa7edc
-   076e9b2ffbe1 a7773ffa7edc
-  +4b9d80f48523 1951ead97108
-   4e322f7ce8e3 000000000000
-   98e4a024635e 9c5494949763
-  +a31943eabc43 03f165c84ea8
-  [1]
--- a/tests/test-obsolete.t
+++ b/tests/test-obsolete.t
@@ -5,16 +5,19 @@
   > [phases]
   > publish=False
   > [alias]
-  > odiff=diff --rev 'limit(precursors(.),1)' --rev .
+  > debugobsolete=debugobsolete -d '0 0'
   > [extensions]
-  > hgext.graphlog=
+  > hgext.rebase=
   > EOF
-  $ echo "obsolete=$(echo $(dirname $TESTDIR))/hgext/obsolete.py" >> $HGRCPATH
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
   $ mkcommit() {
   >    echo "$1" > "$1"
   >    hg add "$1"
   >    hg ci -m "add $1"
   > }
+  $ getid() {
+  >    hg id --hidden --debug -ir "$1"
+  > }
 
   $ alias qlog="hg log --template='{rev}\n- {node|short}\n'"
   $ hg init local
@@ -27,9 +30,21 @@
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   $ mkcommit obsol_c # 3
   created new head
-  $ hg debugobsolete 3 2
+  $ getid 2
+  4538525df7e2b9f09423636c61ef63a4cb872a2d
+  $ getid 3
+  0d3f46688ccc6e756c7e96cf64c391c411309597
+  $ hg debugobsolete 4538525df7e2b9f09423636c61ef63a4cb872a2d 0d3f46688ccc6e756c7e96cf64c391c411309597
+  $ hg debugobsolete
+  4538525df7e2b9f09423636c61ef63a4cb872a2d 0d3f46688ccc6e756c7e96cf64c391c411309597 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
 
 
+Test hidden() revset
+
+  $ qlog -r 'hidden()' --hidden
+  2
+  - 4538525df7e2
+
 Test that obsolete changeset are hidden
 
   $ qlog
@@ -52,7 +67,7 @@
   2
   - 4538525df7e2
 
-Test that obsolete parent a properly computed
+Test that obsolete precursors are properly computed
 
   $ qlog -r 'precursors(.)' --hidden
   2
@@ -72,17 +87,17 @@
   @@ -0,0 +1,1 @@
   +obsol_c
 
-Test that obsolete successors a properly computed
+Test that obsolete successors are properly computed
 
   $ qlog -r 'successors(2)' --hidden
   3
   - 0d3f46688ccc
 
-test obsolete changeset with no-obsolete descendant
+test obsolete changeset with non-obsolete descendant
   $ hg up 1 -q
   $ mkcommit "obsol_c'" # 4 (on 1)
   created new head
-  $ hg debugobsolete 4 3
+  $ hg debugobsolete `getid 3` `getid 4`
   $ qlog
   4
   - 725c380fe99b
@@ -105,10 +120,19 @@
   - 0d3f46688ccc
   4
   - 725c380fe99b
-  $ hg up 3 -q
-  Working directory parent is obsolete
+  $ hg up --hidden 3 -q
+  working directory parent is obsolete!
+(reported by parents too)
+  $ hg parents
+  changeset:   3:0d3f46688ccc
+  parent:      1:7c3bad9141dc
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     add obsol_c
+  
+  working directory parent is obsolete!
   $ mkcommit d # 5 (on 3)
-  1 new unstables changesets
+  1 new unstable changesets
   $ qlog -r 'obsolete()'
   3
   - 0d3f46688ccc
@@ -125,15 +149,15 @@
 
 Test obsolete keyword
 
-  $ hg glog --template '{rev}:{node|short}@{branch}({obsolete}/{phase}) {desc|firstline}\n' \
+  $ hg log -G --template '{rev}:{node|short}@{branch}({obsolete}/{phase}) {desc|firstline}\n' \
   >   --hidden
-  @  5:a7a6f2b5d8a5@default(unstable/secret) add d
+  @  5:a7a6f2b5d8a5@default(unstable/draft) add d
   |
   | o  4:725c380fe99b@default(stable/draft) add obsol_c'
   | |
-  o |  3:0d3f46688ccc@default(suspended/secret) add obsol_c
+  x |  3:0d3f46688ccc@default(suspended/draft) add obsol_c
   |/
-  | o  2:4538525df7e2@default(extinct/secret) add c
+  | x  2:4538525df7e2@default(extinct/draft) add c
   |/
   o  1:7c3bad9141dc@default(stable/draft) add b
   |
@@ -144,11 +168,13 @@
 
   $ hg init ../other-new
   $ hg phase --draft 'secret() - extinct()' # until we fix exclusion
+  abort: empty revision set
+  [255]
   $ hg push ../other-new
   pushing to ../other-new
   searching for changes
-  abort: push includes an unstable changeset: a7a6f2b5d8a5!
-  (use 'hg stabilize' to get a stable history (or --force to proceed))
+  abort: push includes unstable changeset: a7a6f2b5d8a5!
+  (use 'hg evolve' to get a stable history or --force to ignore warnings)
   [255]
   $ hg push -f ../other-new
   pushing to ../other-new
@@ -157,6 +183,8 @@
   adding manifests
   adding file changes
   added 5 changesets with 5 changes to 5 files (+1 heads)
+  pushing 2 obsolescence markers (* bytes) (glob)
+  2 obsolescence markers added
   $ hg -R ../other-new verify
   checking changesets
   checking manifests
@@ -177,12 +205,12 @@
   - 7c3bad9141dc
   0
   - 1f0dee641bb7
-  $ hg up 3 -q
-  Working directory parent is obsolete
+  $ hg up --hidden 3 -q
+  working directory parent is obsolete!
   $ mkcommit obsol_d # 6
   created new head
-  1 new unstables changesets
-  $ hg debugobsolete 6 5
+  1 new unstable changesets
+  $ hg debugobsolete `getid 5` `getid 6`
   $ qlog
   6
   - 95de7fc6918d
@@ -200,8 +228,8 @@
   $ hg push ../other-new
   pushing to ../other-new
   searching for changes
-  abort: push includes an unstable changeset: 95de7fc6918d!
-  (use 'hg stabilize' to get a stable history (or --force to proceed))
+  abort: push includes unstable changeset: 95de7fc6918d!
+  (use 'hg evolve' to get a stable history or --force to ignore warnings)
   [255]
   $ hg push ../other-new -f # use f because there is unstability
   pushing to ../other-new
@@ -210,6 +238,8 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files (+1 heads)
+  pushing 3 obsolescence markers (* bytes) (glob)
+  1 obsolescence markers added
   $ qlog -R ../other-new
   5
   - 95de7fc6918d
@@ -225,28 +255,32 @@
   2
   - 0d3f46688ccc
 
-Pushing again does not advertise extinct changeset
+Pushing again does not advertise extinct changesets
 
   $ hg push ../other-new
   pushing to ../other-new
   searching for changes
-  no changes found (ignored 0 secret changesets)
+  no changes found
+  pushing 3 obsolescence markers (* bytes) (glob)
+  0 obsolescence markers added
   [1]
 
-  $ hg up -q .^ # 3
-  Working directory parent is obsolete
+  $ hg up --hidden -q .^ # 3
+  working directory parent is obsolete!
   $ mkcommit "obsol_d'" # 7
   created new head
-  1 new unstables changesets
-  $ hg debugobsolete 7 6
+  1 new unstable changesets
+  $ hg debugobsolete `getid 6` `getid 7`
   $ hg pull -R ../other-new .
   pulling from .
   searching for changes
   adding changesets
   adding manifests
   adding file changes
-  added 1 changesets with 1 changes to 1 files (+1 heads)
-  (run 'hg heads .' to see heads, 'hg merge' to merge)
+  added 1 changesets with 1 changes to [12] files \(\+1 heads\) (re)
+  pull obsolescence markers
+  1 obsolescence markers added
+  (run 'hg heads' to see heads, 'hg merge' to merge)
   $ qlog -R ../other-new
   6
   - 909a0fb57e5d
@@ -259,57 +293,60 @@
   0
   - 1f0dee641bb7
 
-pushing to stuff that doesn't support obsolete
+pushing to stuff that doesn't support obsolescence
+
+DISABLED. the _enable switch is global :-/
 
-  $ hg init ../other-old
-  > # XXX I don't like this but changeset get published otherwise
-  > # remove it when we will get a --keep-state flag for push
-  $ echo '[extensions]'  > ../other-old/.hg/hgrc
-  $ echo "obsolete=!$(echo $(dirname $TESTDIR))/obsolete.py" >> ../other-old/.hg/hgrc
-  $ hg push ../other-old
-  pushing to ../other-old
-  searching for changes
-  abort: push includes an unstable changeset: 909a0fb57e5d!
-  (use 'hg stabilize' to get a stable history (or --force to proceed))
-  [255]
-  $ hg push -f ../other-old
-  pushing to ../other-old
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 5 changesets with 5 changes to 5 files (+1 heads)
-  $ qlog -R ../other-old
-  4
-  - 909a0fb57e5d
-  3
-  - 725c380fe99b
-  2
-  - 0d3f46688ccc
-  1
-  - 7c3bad9141dc
-  0
-  - 1f0dee641bb7
+..  $ hg init ../other-old
+..  > # XXX I don't like this but changeset get published otherwise
+..  > # remove it when we will get a --keep-state flag for push
+..  $ echo '[extensions]'  > ../other-old/.hg/hgrc
+..  $ echo "obsolete=!$(echo $(dirname $TESTDIR))/obsolete.py" >> ../other-old/.hg/hgrc
+..  $ hg push ../other-old
+..  pushing to ../other-old
+..  searching for changes
+..  abort: push includes an unstable changeset: 909a0fb57e5d!
+..  (use 'hg evolve' to get a stable history or --force to ignore warnings)
+..  [255]
+..  $ hg push -f ../other-old
+..  pushing to ../other-old
+..  searching for changes
+..  adding changesets
+..  adding manifests
+..  adding file changes
+..  added 5 changesets with 5 changes to 5 files (+1 heads)
+..  $ qlog -R ../other-ol
+..  4
+..  - 909a0fb57e5d
+..  3
+..  - 725c380fe99b
+..  2
+..  - 0d3f46688ccc
+..  1
+..  - 7c3bad9141dc
+..  0
+..  - 1f0dee641bb7
 
 clone support
 
   $ hg clone . ../cloned
   > # The warning should go away once we have default value to set ready before we pull
-  requesting all changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 5 changesets with 5 changes to 5 files (+1 heads)
   updating to branch default
   4 files updated, 0 files merged, 0 files removed, 0 files unresolved
 
-  $ qlog -R ../cloned
+  $ qlog -R ../cloned --hidden
+  7
+  - 909a0fb57e5d
+  6
+  - 95de7fc6918d
+  5
+  - a7a6f2b5d8a5
   4
-  - 909a0fb57e5d
+  - 725c380fe99b
   3
-  - 725c380fe99b
+  - 0d3f46688ccc
   2
-  - 0d3f46688ccc
+  - 4538525df7e2
   1
   - 7c3bad9141dc
   0
@@ -317,12 +354,12 @@
 
 Test rollback support
 
-  $ hg up .^ -q # 3
-  Working directory parent is obsolete
+  $ hg up --hidden .^ -q # 3
+  working directory parent is obsolete!
   $ mkcommit "obsol_d''"
   created new head
-  1 new unstables changesets
-  $ hg debugobsolete 8 7
+  1 new unstable changesets
+  $ hg debugobsolete `getid 7` `getid 8`
   $ cd ../other-new
   $ hg up -q 3
   $ hg pull ../local/
@@ -331,8 +368,10 @@
   adding changesets
   adding manifests
   adding file changes
-  added 1 changesets with 1 changes to 1 files (+1 heads)
-  (run 'hg heads .' to see heads, 'hg merge' to merge)
+  added 1 changesets with 1 changes to [12] files \(\+1 heads\) (re)
+  pull obsolescence markers
+  1 obsolescence markers added
+  (run 'hg heads' to see heads, 'hg merge' to merge)
 
   $ hg up -q 7 # to check rollback update behavior
   $ qlog
@@ -354,7 +393,8 @@
    add obsol_c'
   branch: default
   commit: 1 deleted, 2 unknown (clean)
-  update: 4 new changesets, 4 branch heads (merge)
+  update: 2 new changesets, 2 branch heads (merge)
+  unstable: 1 changesets
   $ qlog
   6
   - 909a0fb57e5d
@@ -379,8 +419,10 @@
   created new head
   $ hg id -n
   9
-  $ hg debugobsolete 9 0
-  83b5778897ad try to obsolete immutable changeset 1f0dee641bb7
+  $ hg debugobsolete `getid 0` `getid 9`
+83b5778897ad try to obsolete immutable changeset 1f0dee641bb7
+# at core level the warning is not issued
+# this is now a big issue now that we have bumped warning
   $ qlog -r 'obsolete()'
   3
   - 0d3f46688ccc
@@ -400,7 +442,7 @@
   0
   - 1f0dee641bb7
 
-  $ hg debugobsolete null 9 #kill
+  $ hg debugobsolete `getid 9` #kill
   $ hg up null -q # to be not based on 9 anymore
   $ qlog
   8
@@ -414,58 +456,85 @@
   0
   - 1f0dee641bb7
 
+Check that auto update ignores hidden changeset
+  $ hg up 0
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg up 
+  3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg id -n
+  8
+
+Check that named update does too
+
+  $ hg update default
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg id -n
+  8
+
+  $ hg up null -q # to be not based on 9 anymore
+
 check rebase compat
 
-  $ hg glog -r 'not extinct()'  --template='{rev} - {node|short}\n'
-  o  8 - 159dfc9fa5d3
+  $ hg log -G  --template='{rev} - {node|short} {desc}\n'
+  o  8 - 159dfc9fa5d3 add obsol_d''
   |
-  | o  4 - 725c380fe99b
+  | o  4 - 725c380fe99b add obsol_c'
   | |
-  o |  3 - 0d3f46688ccc
+  x |  3 - 0d3f46688ccc add obsol_c
   |/
-  o  1 - 7c3bad9141dc
+  o  1 - 7c3bad9141dc add b
   |
-  o  0 - 1f0dee641bb7
+  o  0 - 1f0dee641bb7 add a
   
 
-  $ hg glog  --template='{rev} - {node|short}\n' `(hg --version | grep -q 'version 2.1') ||  echo '--hidden'`
-  o  9 - 83b5778897ad
+  $ hg log -G  --template='{rev} - {node|short} {desc}\n' --hidden
+  x  9 - 83b5778897ad add toto
   
-  o  8 - 159dfc9fa5d3
+  o  8 - 159dfc9fa5d3 add obsol_d''
   |
-  | o  7 - 909a0fb57e5d
+  | x  7 - 909a0fb57e5d add obsol_d'
   |/
-  | o  6 - 95de7fc6918d
+  | x  6 - 95de7fc6918d add obsol_d
   |/
-  | o  5 - a7a6f2b5d8a5
+  | x  5 - a7a6f2b5d8a5 add d
   |/
-  | o  4 - 725c380fe99b
+  | o  4 - 725c380fe99b add obsol_c'
   | |
-  o |  3 - 0d3f46688ccc
+  x |  3 - 0d3f46688ccc add obsol_c
   |/
-  | o  2 - 4538525df7e2
+  | x  2 - 4538525df7e2 add c
   |/
-  o  1 - 7c3bad9141dc
+  o  1 - 7c3bad9141dc add b
   |
-  o  0 - 1f0dee641bb7
+  o  0 - 1f0dee641bb7 add a
   
 
-should not rebase extinct changeset
+should not rebase extinct changesets
 
-  $ hg --config extensions.hgext.rebase= rebase -b 3 -d 4 --traceback
-  $ hg --config extensions.graphlog= glog -r 'not extinct()'  --template='{rev} - {node|short}\n'
-  @  11 - 9468a5f5d8b2
+#excluded 'whole rebase set is extinct and ignored.' message not in core
+  $ hg rebase -b '3' -d 4 --traceback
+  rebasing 3:0d3f46688ccc "add obsol_c"
+  rebasing 8:159dfc9fa5d3 "add obsol_d''" (tip)
+  2 new divergent changesets
+  $ hg --hidden log -q -r 'successors(3)'
+  4:725c380fe99b
+  10:2033b4e49474
+  $ hg up tip
+  ? files updated, 0 files merged, 0 files removed, 0 files unresolved (glob)
+  $ hg log -G --template='{rev} - {node|short} {desc}\n'
+  @  11 - 9468a5f5d8b2 add obsol_d''
   |
-  o  10 - 2033b4e49474
+  o  10 - 2033b4e49474 add obsol_c
   |
-  o  4 - 725c380fe99b
+  o  4 - 725c380fe99b add obsol_c'
   |
-  o  1 - 7c3bad9141dc
+  o  1 - 7c3bad9141dc add b
   |
-  o  0 - 1f0dee641bb7
+  o  0 - 1f0dee641bb7 add a
   
 
 Does not complain about new head if you obsolete the old one
+(re necessary when we start running discovery on unfiltered repo in core)
 
   $ hg push ../other-new --traceback
   pushing to ../other-new
@@ -473,11 +542,13 @@
   adding changesets
   adding manifests
   adding file changes
-  added 2 changesets with 1 changes to 1 files
+  added 2 changesets with 1 changes to [12] files (re)
+  pushing 7 obsolescence markers (* bytes) (glob)
+  3 obsolescence markers added
   $ hg up -q 10
   $ mkcommit "obsol_d'''"
   created new head
-  $ hg debugobsolete 12 11
+  $ hg debugobsolete `getid 11` `getid 12`
   $ hg push ../other-new --traceback
   pushing to ../other-new
   searching for changes
@@ -485,15 +556,17 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files (+1 heads)
+  pushing 8 obsolescence markers (* bytes) (glob)
+  1 obsolescence markers added
   $ cd ..
 
-check latecomer detection
+check bumped detection
 (make an obsolete changeset public)
 
   $ cd local
-  $ hg phase --public 11
-  1 new latecomers changesets
-  $ hg --config extensions.graphlog=glog glog --template='{rev} - ({phase}) {node|short} {desc}\n'
+  $ hg phase --hidden --public 11
+  1 new bumped changesets
+  $ hg log -G --template='{rev} - ({phase}) {node|short} {desc}\n'
   @  12 - (draft) 6db5e282cb91 add obsol_d'''
   |
   | o  11 - (public) 9468a5f5d8b2 add obsol_d''
@@ -506,7 +579,7 @@
   |
   o  0 - (public) 1f0dee641bb7 add a
   
-  $ hg log -r 'latecomer()'
+  $ hg log -r 'bumped()'
   changeset:   12:6db5e282cb91
   tag:         tip
   parent:      10:2033b4e49474
@@ -517,8 +590,8 @@
   $ hg push ../other-new/
   pushing to ../other-new/
   searching for changes
-  abort: push includes an latecomer changeset: 6db5e282cb91!
-  (use 'hg stabilize' to get a stable history (or --force to proceed))
+  abort: push includes bumped changeset: 6db5e282cb91!
+  (use 'hg evolve' to get a stable history or --force to ignore warnings)
   [255]
 
 Check hg commit --amend compat
@@ -528,10 +601,9 @@
   $ mkcommit f
   created new head
   $ echo 42 >> f
-  $ hg commit --amend --traceback
-  saved backup bundle to $TESTTMP/local/.hg/strip-backup/0b1b6dd009c0-amend-backup.hg
-  $ hg glog
-  @  changeset:   13:3734a65252e6
+  $ hg commit --amend --traceback --quiet
+  $ hg log -G
+  @  changeset:   15:705ab2a6b72e
   |  tag:         tip
   |  parent:      10:2033b4e49474
   |  user:        test
@@ -571,36 +643,197 @@
      date:        Thu Jan 01 00:00:00 1970 +0000
      summary:     add a
   
-  $ hg debugsuccessors
-  0b1b6dd009c0 3734a65252e6
-  0d3f46688ccc 2033b4e49474
-  0d3f46688ccc 725c380fe99b
-  159dfc9fa5d3 9468a5f5d8b2
-  1f0dee641bb7 83b5778897ad
-  4538525df7e2 0d3f46688ccc
-  83b5778897ad 000000000000
-  909a0fb57e5d 159dfc9fa5d3
-  9468a5f5d8b2 6db5e282cb91
-  95de7fc6918d 909a0fb57e5d
-  a7a6f2b5d8a5 95de7fc6918d
+  $ hg debugobsolete | grep -v 33d458d86621f3186c40bfccd77652f4a122743e
+  4538525df7e2b9f09423636c61ef63a4cb872a2d 0d3f46688ccc6e756c7e96cf64c391c411309597 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  0d3f46688ccc6e756c7e96cf64c391c411309597 725c380fe99b5e76613493f0903e8d11ddc70d54 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  a7a6f2b5d8a54b81bc7aa2fba2934ad6d700a79e 95de7fc6918dea4c9c8d5382f50649794b474c4a 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  95de7fc6918dea4c9c8d5382f50649794b474c4a 909a0fb57e5d909f353d89e394ffd7e0890fec88 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  909a0fb57e5d909f353d89e394ffd7e0890fec88 159dfc9fa5d334d7e03a0aecfc7f7ab4c3431fea 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  1f0dee641bb7258c56bd60e93edfa2405381c41e 83b5778897adafb967ef2f75be3aaa4fce49a4cc 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  83b5778897adafb967ef2f75be3aaa4fce49a4cc 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  0d3f46688ccc6e756c7e96cf64c391c411309597 2033b4e494742365851fac84d276640cbf52833e 0 (*) {'user': 'test'} (glob)
+  159dfc9fa5d334d7e03a0aecfc7f7ab4c3431fea 9468a5f5d8b2c5d91e17474e95ae4791e9718fdf 0 (*) {'user': 'test'} (glob)
+  9468a5f5d8b2c5d91e17474e95ae4791e9718fdf 6db5e282cb91df5c43ff1f1287c119ff83230d42 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  0b1b6dd009c037985363e2290a0b579819f659db 705ab2a6b72e2cd86edb799ebe15f2695f86143e 0 (*) {'user': 'test'} (glob)
+#no produced by 2.3
+33d458d86621f3186c40bfccd77652f4a122743e 3734a65252e69ddcced85901647a4f335d40de1e 0 {'date': '* *', 'user': 'test'} (glob)
 
-Check conflict detection
+Check divergence detection
 
   $ hg up 9468a5f5d8b2 #  add obsol_d''
   1 files updated, 0 files merged, 1 files removed, 0 files unresolved
   $ mkcommit "obsolet_conflicting_d"
   $ hg summary
-  parent: 14:50f11e5e3a63 tip
+  parent: 1[46]:50f11e5e3a63 tip (re)
    add obsolet_conflicting_d
   branch: default
   commit: (clean)
-  update: 9 new changesets, 9 branch heads (merge)
-  $ hg debugobsolete 50f11e5e3a63 a7a6f2b5d8a5
-  $ hg log -r 'conflicting()'
-  changeset:   14:50f11e5e3a63
+  update: (2|9|11) new changesets, (3|9|10) branch heads \(merge\) (re)
+  bumped: 1 changesets
+  $ hg debugobsolete `getid a7a6f2b5d8a5` `getid 50f11e5e3a63`
+  $ hg log -r 'divergent()'
+  changeset:   12:6db5e282cb91
+  parent:      10:2033b4e49474
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     add obsol_d'''
+  
+  changeset:   16:50f11e5e3a63
   tag:         tip
   parent:      11:9468a5f5d8b2
   user:        test
   date:        Thu Jan 01 00:00:00 1970 +0000
   summary:     add obsolet_conflicting_d
   
+
+  $ hg up --hidden 3 -q
+  working directory parent is obsolete!
+  $ hg evolve
+  parent is obsolete with multiple successors:
+  [4] add obsol_c'
+  [10] add obsol_c
+  [2]
+  $ hg olog
+  changeset:   2:4538525df7e2
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     add c
+  
+
+Check import reports new unstable changeset:
+
+  $ hg up --hidden 2
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  working directory parent is obsolete!
+  $ hg export 9468a5f5d8b2 | hg import -
+  applying patch from stdin
+  1 new unstable changesets
+
+
+Relevant marker computation
+==============================
+
+  $ hg log -G --hidden
+  @  changeset:   17:a5f7a21fe7bc
+  |  tag:         tip
+  |  parent:      2:4538525df7e2
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     add obsol_d''
+  |
+  | o  changeset:   16:50f11e5e3a63
+  | |  parent:      11:9468a5f5d8b2
+  | |  user:        test
+  | |  date:        Thu Jan 01 00:00:00 1970 +0000
+  | |  summary:     add obsolet_conflicting_d
+  | |
+  | | o  changeset:   15:705ab2a6b72e
+  | | |  parent:      10:2033b4e49474
+  | | |  user:        test
+  | | |  date:        Thu Jan 01 00:00:00 1970 +0000
+  | | |  summary:     add f
+  | | |
+  | | | x  changeset:   14:33d458d86621
+  | | | |  user:        test
+  | | | |  date:        Thu Jan 01 00:00:00 1970 +0000
+  | | | |  summary:     temporary amend commit for 0b1b6dd009c0
+  | | | |
+  | | | x  changeset:   13:0b1b6dd009c0
+  | | |/   parent:      10:2033b4e49474
+  | | |    user:        test
+  | | |    date:        Thu Jan 01 00:00:00 1970 +0000
+  | | |    summary:     add f
+  | | |
+  | | | o  changeset:   12:6db5e282cb91
+  | | |/   parent:      10:2033b4e49474
+  | | |    user:        test
+  | | |    date:        Thu Jan 01 00:00:00 1970 +0000
+  | | |    summary:     add obsol_d'''
+  | | |
+  | o |  changeset:   11:9468a5f5d8b2
+  | |/   user:        test
+  | |    date:        Thu Jan 01 00:00:00 1970 +0000
+  | |    summary:     add obsol_d''
+  | |
+  | o  changeset:   10:2033b4e49474
+  | |  parent:      4:725c380fe99b
+  | |  user:        test
+  | |  date:        Thu Jan 01 00:00:00 1970 +0000
+  | |  summary:     add obsol_c
+  | |
+  | | x  changeset:   9:83b5778897ad
+  | |    parent:      -1:000000000000
+  | |    user:        test
+  | |    date:        Thu Jan 01 00:00:00 1970 +0000
+  | |    summary:     add toto
+  | |
+  | | x  changeset:   8:159dfc9fa5d3
+  | | |  parent:      3:0d3f46688ccc
+  | | |  user:        test
+  | | |  date:        Thu Jan 01 00:00:00 1970 +0000
+  | | |  summary:     add obsol_d''
+  | | |
+  | | | x  changeset:   7:909a0fb57e5d
+  | | |/   parent:      3:0d3f46688ccc
+  | | |    user:        test
+  | | |    date:        Thu Jan 01 00:00:00 1970 +0000
+  | | |    summary:     add obsol_d'
+  | | |
+  | | | x  changeset:   6:95de7fc6918d
+  | | |/   parent:      3:0d3f46688ccc
+  | | |    user:        test
+  | | |    date:        Thu Jan 01 00:00:00 1970 +0000
+  | | |    summary:     add obsol_d
+  | | |
+  | | | x  changeset:   5:a7a6f2b5d8a5
+  | | |/   parent:      3:0d3f46688ccc
+  | | |    user:        test
+  | | |    date:        Thu Jan 01 00:00:00 1970 +0000
+  | | |    summary:     add d
+  | | |
+  | o |  changeset:   4:725c380fe99b
+  | | |  parent:      1:7c3bad9141dc
+  | | |  user:        test
+  | | |  date:        Thu Jan 01 00:00:00 1970 +0000
+  | | |  summary:     add obsol_c'
+  | | |
+  | | x  changeset:   3:0d3f46688ccc
+  | |/   parent:      1:7c3bad9141dc
+  | |    user:        test
+  | |    date:        Thu Jan 01 00:00:00 1970 +0000
+  | |    summary:     add obsol_c
+  | |
+  x |  changeset:   2:4538525df7e2
+  |/   user:        test
+  |    date:        Thu Jan 01 00:00:00 1970 +0000
+  |    summary:     add c
+  |
+  o  changeset:   1:7c3bad9141dc
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     add b
+  |
+  o  changeset:   0:1f0dee641bb7
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     add a
+  
+
+Simple rewrite
+
+  $ hg  --hidden debugobsolete --rev 3
+  4538525df7e2b9f09423636c61ef63a4cb872a2d 0d3f46688ccc6e756c7e96cf64c391c411309597 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+
+simple rewrite with a prune attached to it
+
+  $ hg debugobsolete --rev 15
+  0b1b6dd009c037985363e2290a0b579819f659db 705ab2a6b72e2cd86edb799ebe15f2695f86143e 0 (*) {'user': 'test'} (glob)
+  33d458d86621f3186c40bfccd77652f4a122743e 0 {0b1b6dd009c037985363e2290a0b579819f659db} (*) {'user': 'test'} (glob)
+
+Transitive rewrite
+
+  $ hg --hidden debugobsolete --rev 8
+  909a0fb57e5d909f353d89e394ffd7e0890fec88 159dfc9fa5d334d7e03a0aecfc7f7ab4c3431fea 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  95de7fc6918dea4c9c8d5382f50649794b474c4a 909a0fb57e5d909f353d89e394ffd7e0890fec88 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+  a7a6f2b5d8a54b81bc7aa2fba2934ad6d700a79e 95de7fc6918dea4c9c8d5382f50649794b474c4a 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
+
--- a/tests/test-oldconvert.t
+++ b/tests/test-oldconvert.t
@@ -53,8 +53,8 @@
      date:        Thu Jan 01 00:00:00 1970 +0000
      summary:     add a
   
-  $ hg debugsuccessors
-  7c3bad9141dc d67cd0334eee
+  $ hg debugobsolete
+  7c3bad9141dcb46ff89abf5f61856facd56e476c d67cd0334eeecfded222fed9009f0db4beb57585 0 (*) {'user': 'test'} (glob)
   $ hg debugconvertobsolete
   nothing to do
   0 obsolete marker converted
@@ -107,8 +107,8 @@
   [255]
   $ hg debugconvertobsolete --traceback
   3 obsolete marker converted
-  $ hg debugsuccessors
-  2c3784e102bb
-  3e03d82708d4 3218406b50ed
-  5c722672795c
-  7c3bad9141dc d67cd0334eee
+  $ hg debugobsolete
+  7c3bad9141dcb46ff89abf5f61856facd56e476c d67cd0334eeecfded222fed9009f0db4beb57585 0 (*) {'user': 'test'} (glob)
+  3e03d82708d4da97a92158558dd13386d8f09ad5 3218406b50ed13480765e7c260669620f37fba6e 0 (Tue May 08 20:55:23 2012 +0200) {'user': 'Pierre-Yves David <pierre-yves.david@ens-lyon.org>'}
+  5c722672795c3a2cb94d0cc9a821c394c1475f87 0 (Wed May 09 11:57:52 2012 +0200) {'user': 'Pierre-Yves David <pierre-yves.david@logilab.fr>'}
+  2c3784e102bb34ccc93862af5bd6d609ee30c577 0 (Wed May 09 11:57:52 2012 +0200) {'user': 'Pierre-Yves David <pierre-yves.david@logilab.fr>'}
new file mode 100644
--- /dev/null
+++ b/tests/test-prev-next.t
@@ -0,0 +1,84 @@
+  $ cat >> $HGRCPATH <<EOF
+  > [extensions]
+  > hgext.graphlog=
+  > EOF
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+
+hg prev -B should move active bookmark
+  $ hg init
+  $ touch a
+  $ hg add a
+  $ hg commit -m 'added a'
+  $ touch b
+  $ hg add b
+  $ hg commit -m 'added b'
+  $ hg bookmark mark
+  $ hg bookmarks
+   * mark                      1:6e742c9127b3
+  $ hg prev -B
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  [0] added a
+  $ hg bookmarks
+   * mark                      0:a154386e50d1
+
+hg next -B should move active bookmark
+  $ hg next -B
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  [1] added b
+  $ hg bookmarks
+   * mark                      1:6e742c9127b3
+
+hg prev should unset active bookmark
+  $ hg prev
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  [0] added a
+  $ hg bookmarks
+     mark                      1:6e742c9127b3
+
+hg next should move active bookmark
+  $ hg bookmark mark2
+  $ hg bookmarks
+     mark                      1:6e742c9127b3
+   * mark2                     0:a154386e50d1
+  $ hg next
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  [1] added b
+  $ hg bookmarks
+     mark                      1:6e742c9127b3
+     mark2                     0:a154386e50d1
+
+  $ hg bookmark -d mark2
+  $ hg bookmark mark
+
+hg next/prev should not interfere with inactive bookmarks
+  $ touch c
+  $ hg add c
+  $ hg commit -m 'added c'
+  $ hg bookmark -r2 no-move
+  $ hg prev -B
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  [1] added b
+  $ hg bookmarks
+   * mark                      1:6e742c9127b3
+     no-move                   2:4e26ef31f919
+  $ hg next -B
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  [2] added c
+  $ hg bookmarks
+   * mark                      2:4e26ef31f919
+     no-move                   2:4e26ef31f919
+  $ hg up 1
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  (leaving bookmark mark)
+  $ hg next -B
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  [2] added c
+  $ hg bookmarks
+     mark                      2:4e26ef31f919
+     no-move                   2:4e26ef31f919
+  $ hg prev -B
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  [1] added b
+  $ hg bookmarks
+     mark                      2:4e26ef31f919
+     no-move                   2:4e26ef31f919
new file mode 100644
--- /dev/null
+++ b/tests/test-prune.t
@@ -0,0 +1,334 @@
+  $ cat >> $HGRCPATH <<EOF
+  > [ui]
+  > logtemplate={rev}:{node|short}[{bookmarks}] ({obsolete}/{phase}) {desc|firstline}\n
+  > [extensions]
+  > EOF
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+
+  $ mkcommit() {
+  >    echo "$1" > "$1"
+  >    hg add "$1"
+  >    hg ci -m "add $1"
+  > }
+
+  $ hg init repo
+  $ cd repo
+  $ mkcommit a
+  $ hg phase --public .
+  $ mkcommit b
+  $ mkcommit c
+  $ mkcommit d
+  $ mkcommit e
+  $ hg bookmarks BABAR
+  $ hg log -G
+  @  4:9d206ffc875e[BABAR] (stable/draft) add e
+  |
+  o  3:47d2a3944de8[] (stable/draft) add d
+  |
+  o  2:4538525df7e2[] (stable/draft) add c
+  |
+  o  1:7c3bad9141dc[] (stable/draft) add b
+  |
+  o  0:1f0dee641bb7[] (stable/public) add a
+  
+
+Check simple case
+----------------------------
+
+prune current and tip changeset
+
+  $ hg prune --user blah --date '1979-12-15' .
+  1 changesets pruned
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  working directory now at 47d2a3944de8
+  $ hg bookmark
+   * BABAR                     3:47d2a3944de8
+  $ hg debugobsolete
+  9d206ffc875e1bc304590549be293be36821e66c 0 {47d2a3944de8b013de3be9578e8e344ea2e6c097} (Sat Dec 15 00:00:00 1979 +0000) {'user': 'blah'}
+
+prune leaving instability behind
+
+  $ hg prune 1
+  1 changesets pruned
+  2 new unstable changesets
+  $ hg book -i BABAR
+  $ hg debugobsolete
+  9d206ffc875e1bc304590549be293be36821e66c 0 {47d2a3944de8b013de3be9578e8e344ea2e6c097} (Sat Dec 15 00:00:00 1979 +0000) {'user': 'blah'}
+  7c3bad9141dcb46ff89abf5f61856facd56e476c 0 {1f0dee641bb7258c56bd60e93edfa2405381c41e} (*) {'user': 'test'} (glob)
+
+pruning multiple changeset at once
+
+  $ hg prune 2:
+  2 changesets pruned
+  0 files updated, 0 files merged, 3 files removed, 0 files unresolved
+  working directory now at 1f0dee641bb7
+  $ hg debugobsolete
+  9d206ffc875e1bc304590549be293be36821e66c 0 {47d2a3944de8b013de3be9578e8e344ea2e6c097} (Sat Dec 15 00:00:00 1979 +0000) {'user': 'blah'}
+  7c3bad9141dcb46ff89abf5f61856facd56e476c 0 {1f0dee641bb7258c56bd60e93edfa2405381c41e} (*) {'user': 'test'} (glob)
+  4538525df7e2b9f09423636c61ef63a4cb872a2d 0 {7c3bad9141dcb46ff89abf5f61856facd56e476c} (*) {'user': 'test'} (glob)
+  47d2a3944de8b013de3be9578e8e344ea2e6c097 0 {4538525df7e2b9f09423636c61ef63a4cb872a2d} (*) {'user': 'test'} (glob)
+
+cannot prune public changesets
+
+  $ hg prune 0
+  abort: cannot prune immutable changeset: 1f0dee641bb7
+  (see "hg help phases" for details)
+  [255]
+  $ hg debugobsolete
+  9d206ffc875e1bc304590549be293be36821e66c 0 {47d2a3944de8b013de3be9578e8e344ea2e6c097} (Sat Dec 15 00:00:00 1979 +0000) {'user': 'blah'}
+  7c3bad9141dcb46ff89abf5f61856facd56e476c 0 {1f0dee641bb7258c56bd60e93edfa2405381c41e} (*) {'user': 'test'} (glob)
+  4538525df7e2b9f09423636c61ef63a4cb872a2d 0 {7c3bad9141dcb46ff89abf5f61856facd56e476c} (*) {'user': 'test'} (glob)
+  47d2a3944de8b013de3be9578e8e344ea2e6c097 0 {4538525df7e2b9f09423636c61ef63a4cb872a2d} (*) {'user': 'test'} (glob)
+
+Check successors addition
+----------------------------
+
+  $ mkcommit bb
+  $ mkcommit cc
+  $ mkcommit dd
+  $ mkcommit ee
+  $ hg up 0
+  0 files updated, 0 files merged, 4 files removed, 0 files unresolved
+  $ mkcommit nB
+  created new head
+  $ mkcommit nC
+  $ mkcommit nD
+  $ mkcommit nE
+
+  $ hg log -G
+  @  12:6e8148413dd5[] (stable/draft) add nE
+  |
+  o  11:8ee176ff1d4b[] (stable/draft) add nD
+  |
+  o  10:aa96dc3f04c2[] (stable/draft) add nC
+  |
+  o  9:6f6f25e4f748[] (stable/draft) add nB
+  |
+  | o  8:bb5e90a7ea1f[] (stable/draft) add ee
+  | |
+  | o  7:00ded550b1e2[] (stable/draft) add dd
+  | |
+  | o  6:354011cd103f[] (stable/draft) add cc
+  | |
+  | o  5:814c38b95e72[] (stable/draft) add bb
+  |/
+  o  0:1f0dee641bb7[BABAR] (stable/public) add a
+  
+
+one old, one new
+
+  $ hg up 'desc("add ee")'
+  4 files updated, 0 files merged, 4 files removed, 0 files unresolved
+  $ hg prune 'desc("add ee")' -s 'desc("add nE")'
+  1 changesets pruned
+  4 files updated, 0 files merged, 4 files removed, 0 files unresolved
+  working directory now at 6e8148413dd5
+  $ hg debugobsolete
+  9d206ffc875e1bc304590549be293be36821e66c 0 {47d2a3944de8b013de3be9578e8e344ea2e6c097} (Sat Dec 15 00:00:00 1979 +0000) {'user': 'blah'}
+  7c3bad9141dcb46ff89abf5f61856facd56e476c 0 {1f0dee641bb7258c56bd60e93edfa2405381c41e} (*) {'user': 'test'} (glob)
+  4538525df7e2b9f09423636c61ef63a4cb872a2d 0 {7c3bad9141dcb46ff89abf5f61856facd56e476c} (*) {'user': 'test'} (glob)
+  47d2a3944de8b013de3be9578e8e344ea2e6c097 0 {4538525df7e2b9f09423636c61ef63a4cb872a2d} (*) {'user': 'test'} (glob)
+  bb5e90a7ea1f3b4b38b23150a4a597b6146d70ef 6e8148413dd541855b72a920a90c06fca127c7e7 0 (*) {'user': 'test'} (glob)
+  $ hg log -G
+  @  12:6e8148413dd5[] (stable/draft) add nE
+  |
+  o  11:8ee176ff1d4b[] (stable/draft) add nD
+  |
+  o  10:aa96dc3f04c2[] (stable/draft) add nC
+  |
+  o  9:6f6f25e4f748[] (stable/draft) add nB
+  |
+  | o  7:00ded550b1e2[] (stable/draft) add dd
+  | |
+  | o  6:354011cd103f[] (stable/draft) add cc
+  | |
+  | o  5:814c38b95e72[] (stable/draft) add bb
+  |/
+  o  0:1f0dee641bb7[BABAR] (stable/public) add a
+  
+
+one old, two new
+
+  $ hg prune 'desc("add dd")' -s 'desc("add nD")' -s 'desc("add nC")'
+  1 changesets pruned
+  $ hg debugobsolete
+  9d206ffc875e1bc304590549be293be36821e66c 0 {47d2a3944de8b013de3be9578e8e344ea2e6c097} (Sat Dec 15 00:00:00 1979 +0000) {'user': 'blah'}
+  7c3bad9141dcb46ff89abf5f61856facd56e476c 0 {1f0dee641bb7258c56bd60e93edfa2405381c41e} (*) {'user': 'test'} (glob)
+  4538525df7e2b9f09423636c61ef63a4cb872a2d 0 {7c3bad9141dcb46ff89abf5f61856facd56e476c} (*) {'user': 'test'} (glob)
+  47d2a3944de8b013de3be9578e8e344ea2e6c097 0 {4538525df7e2b9f09423636c61ef63a4cb872a2d} (*) {'user': 'test'} (glob)
+  bb5e90a7ea1f3b4b38b23150a4a597b6146d70ef 6e8148413dd541855b72a920a90c06fca127c7e7 0 (*) {'user': 'test'} (glob)
+  00ded550b1e28bba454bd34cec1269d22cf3ef25 aa96dc3f04c2c2341fe6880aeb6dc9fbffff9ef9 8ee176ff1d4b2034ce51e3efc579c2de346b631d 0 (*) {'user': 'test'} (glob)
+  $ hg log -G
+  @  12:6e8148413dd5[] (stable/draft) add nE
+  |
+  o  11:8ee176ff1d4b[] (stable/draft) add nD
+  |
+  o  10:aa96dc3f04c2[] (stable/draft) add nC
+  |
+  o  9:6f6f25e4f748[] (stable/draft) add nB
+  |
+  | o  6:354011cd103f[] (stable/draft) add cc
+  | |
+  | o  5:814c38b95e72[] (stable/draft) add bb
+  |/
+  o  0:1f0dee641bb7[BABAR] (stable/public) add a
+  
+
+two old, two new (should be denied)
+
+  $ hg prune 'desc("add cc")' 'desc("add bb")' -s 'desc("add nD")' -s 'desc("add nC")'
+  abort: Can't use multiple successors for multiple precursors
+  [255]
+  $ hg debugobsolete
+  9d206ffc875e1bc304590549be293be36821e66c 0 {47d2a3944de8b013de3be9578e8e344ea2e6c097} (Sat Dec 15 00:00:00 1979 +0000) {'user': 'blah'}
+  7c3bad9141dcb46ff89abf5f61856facd56e476c 0 {1f0dee641bb7258c56bd60e93edfa2405381c41e} (*) {'user': 'test'} (glob)
+  4538525df7e2b9f09423636c61ef63a4cb872a2d 0 {7c3bad9141dcb46ff89abf5f61856facd56e476c} (*) {'user': 'test'} (glob)
+  47d2a3944de8b013de3be9578e8e344ea2e6c097 0 {4538525df7e2b9f09423636c61ef63a4cb872a2d} (*) {'user': 'test'} (glob)
+  bb5e90a7ea1f3b4b38b23150a4a597b6146d70ef 6e8148413dd541855b72a920a90c06fca127c7e7 0 (*) {'user': 'test'} (glob)
+  00ded550b1e28bba454bd34cec1269d22cf3ef25 aa96dc3f04c2c2341fe6880aeb6dc9fbffff9ef9 8ee176ff1d4b2034ce51e3efc579c2de346b631d 0 (*) {'user': 'test'} (glob)
+
+two old, one new:
+
+  $ hg prune 'desc("add cc")' 'desc("add bb")' -s 'desc("add nB")'
+  2 changesets pruned
+  $ hg debugobsolete
+  9d206ffc875e1bc304590549be293be36821e66c 0 {47d2a3944de8b013de3be9578e8e344ea2e6c097} (Sat Dec 15 00:00:00 1979 +0000) {'user': 'blah'}
+  7c3bad9141dcb46ff89abf5f61856facd56e476c 0 {1f0dee641bb7258c56bd60e93edfa2405381c41e} (*) {'user': 'test'} (glob)
+  4538525df7e2b9f09423636c61ef63a4cb872a2d 0 {7c3bad9141dcb46ff89abf5f61856facd56e476c} (*) {'user': 'test'} (glob)
+  47d2a3944de8b013de3be9578e8e344ea2e6c097 0 {4538525df7e2b9f09423636c61ef63a4cb872a2d} (*) {'user': 'test'} (glob)
+  bb5e90a7ea1f3b4b38b23150a4a597b6146d70ef 6e8148413dd541855b72a920a90c06fca127c7e7 0 (*) {'user': 'test'} (glob)
+  00ded550b1e28bba454bd34cec1269d22cf3ef25 aa96dc3f04c2c2341fe6880aeb6dc9fbffff9ef9 8ee176ff1d4b2034ce51e3efc579c2de346b631d 0 (*) {'user': 'test'} (glob)
+  814c38b95e72dfe2cbf675b1649ea9d780c89a80 6f6f25e4f748d8f7571777e6e168aedf50350ce8 0 (*) {'user': 'test'} (glob)
+  354011cd103f58bbbd9091a3cee6d6a6bd0dddf7 6f6f25e4f748d8f7571777e6e168aedf50350ce8 0 (*) {'user': 'test'} (glob)
+
+two old, two new with --biject
+
+  $ hg up 0
+  0 files updated, 0 files merged, 4 files removed, 0 files unresolved
+  $ mkcommit n1
+  created new head
+  $ mkcommit n2
+
+  $ hg prune 'desc("add n1")::desc("add n2")' -s 'desc("add nD")::desc("add nE")' --biject
+  2 changesets pruned
+  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+  working directory now at 1f0dee641bb7
+  $ hg debugobsolete
+  9d206ffc875e1bc304590549be293be36821e66c 0 {47d2a3944de8b013de3be9578e8e344ea2e6c097} (Sat Dec 15 00:00:00 1979 +0000) {'user': 'blah'}
+  7c3bad9141dcb46ff89abf5f61856facd56e476c 0 {1f0dee641bb7258c56bd60e93edfa2405381c41e} (*) {'user': 'test'} (glob)
+  4538525df7e2b9f09423636c61ef63a4cb872a2d 0 {7c3bad9141dcb46ff89abf5f61856facd56e476c} (*) {'user': 'test'} (glob)
+  47d2a3944de8b013de3be9578e8e344ea2e6c097 0 {4538525df7e2b9f09423636c61ef63a4cb872a2d} (*) {'user': 'test'} (glob)
+  bb5e90a7ea1f3b4b38b23150a4a597b6146d70ef 6e8148413dd541855b72a920a90c06fca127c7e7 0 (*) {'user': 'test'} (glob)
+  00ded550b1e28bba454bd34cec1269d22cf3ef25 aa96dc3f04c2c2341fe6880aeb6dc9fbffff9ef9 8ee176ff1d4b2034ce51e3efc579c2de346b631d 0 (*) {'user': 'test'} (glob)
+  814c38b95e72dfe2cbf675b1649ea9d780c89a80 6f6f25e4f748d8f7571777e6e168aedf50350ce8 0 (*) {'user': 'test'} (glob)
+  354011cd103f58bbbd9091a3cee6d6a6bd0dddf7 6f6f25e4f748d8f7571777e6e168aedf50350ce8 0 (*) {'user': 'test'} (glob)
+  cb7f8f706a6532967b98cf8583a81baab79a0fa7 8ee176ff1d4b2034ce51e3efc579c2de346b631d 0 (*) {'user': 'test'} (glob)
+  21b6f2f1cece8c10326e575dd38239189d467190 6e8148413dd541855b72a920a90c06fca127c7e7 0 (*) {'user': 'test'} (glob)
+
+test hg prune -B bookmark
+yoinked from test-mq-strip.t
+
+  $ cd ..
+  $ hg init bookmarks
+  $ cd bookmarks
+  $ hg debugbuilddag '..<2.*1/2:m<2+3:c<m+3:a<2.:b'
+  $ hg bookmark -r 'a' 'todelete'
+  $ hg bookmark -r 'b' 'B'
+  $ hg bookmark -r 'b' 'nostrip'
+  $ hg bookmark -r 'c' 'delete'
+  $ hg up -C todelete
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  (activating bookmark todelete)
+  $ hg prune -B nostrip
+  bookmark 'nostrip' deleted
+  abort: nothing to prune
+  [255]
+  $ hg tag --remove --local a
+  $ hg prune -B todelete
+  1 changesets pruned
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  (leaving bookmark todelete)
+  working directory now at d62d843c9a01
+  bookmark 'todelete' deleted
+  $ hg id -ir dcbb326fdec2
+  abort: hidden revision 'dcbb326fdec2'!
+  (use --hidden to access hidden revisions)
+  [255]
+  $ hg id -ir d62d843c9a01
+  d62d843c9a01
+  $ hg bookmarks
+     B                         10:ff43616e5d0f
+     delete                    6:2702dd0c91e7
+  $ hg prune -B delete
+  3 changesets pruned
+  bookmark 'delete' deleted
+  $ hg tag --remove --local c
+  $ hg id -ir 6:2702dd0c91e7
+  abort: hidden revision '6'!
+  (use --hidden to access hidden revisions)
+  [255]
+
+  $ hg debugobsstorestat
+  markers total:                      4
+      for known precursors:           4
+      with parents data:              [04] (re)
+  markers with no successors:         4
+                1 successors:         0
+                2 successors:         0
+      more than 2 successors:         0
+      available  keys:
+                 user:                4
+  disconnected clusters:              4
+          any known node:             4
+          smallest length:            1
+          longer length:              1
+          median length:              1
+          mean length:                1
+      using parents data:             4
+          any known node:             4
+          smallest length:            1
+          longer length:              1
+          median length:              1
+          mean length:                1
+
+  $ mkcommit rg
+  created new head
+  $ hg bookmark rg
+  $ hg up 10
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  (leaving bookmark rg)
+  $ hg bookmark r10
+  $ hg log -G
+  o  11:cd0038e05e1b[rg] (stable/draft) add rg
+  |
+  | @  10:ff43616e5d0f[B r10] (stable/draft) r10
+  |/
+  o  8:d62d843c9a01[] (stable/draft) r8
+  |
+  o  7:e7d9710d9fc6[] (stable/draft) r7
+  |
+  o    3:2b6d669947cd[] (stable/draft) r3
+  |\
+  | o  2:fa942426a6fd[] (stable/draft) r2
+  | |
+  o |  1:66f7d451a68b[] (stable/draft) r1
+  |/
+  o  0:1ea73414a91b[] (stable/draft) r0
+  
+  $ hg prune 11
+  1 changesets pruned
+  $ hg log -G
+  @  10:ff43616e5d0f[B r10] (stable/draft) r10
+  |
+  o  8:d62d843c9a01[rg] (stable/draft) r8
+  |
+  o  7:e7d9710d9fc6[] (stable/draft) r7
+  |
+  o    3:2b6d669947cd[] (stable/draft) r3
+  |\
+  | o  2:fa942426a6fd[] (stable/draft) r2
+  | |
+  o |  1:66f7d451a68b[] (stable/draft) r1
+  |/
+  o  0:1ea73414a91b[] (stable/draft) r0
+  
deleted file mode 100644
--- a/tests/test-qsync.t
+++ /dev/null
@@ -1,241 +0,0 @@
-  $ cat >> $HGRCPATH <<EOF
-  > [defaults]
-  > amend=-d "0 0"
-  > [web]
-  > push_ssl = false
-  > allow_push = *
-  > [phases]
-  > publish = False
-  > [alias]
-  > qlog = log --template='{rev} - {node|short} {desc} ({phase})\n'
-  > mqlog = log --mq --template='{rev} - {desc}\n'
-  > [diff]
-  > git = 1
-  > unified = 0
-  > [extensions]
-  > hgext.rebase=
-  > hgext.graphlog=
-  > hgext.mq=
-  > EOF
-  $ echo "obsolete=$(echo $(dirname $TESTDIR))/hgext/obsolete.py" >> $HGRCPATH
-  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
-  $ echo "qsync=$(echo $(dirname $TESTDIR))/hgext/qsync.py" >> $HGRCPATH
-  $ mkcommit() {
-  >    echo "$1" > "$1"
-  >    hg add "$1"
-  >    hg ci -m "add $1"
-  > }
-
-basic sync
-
-  $ hg init local
-  $ cd local
-  $ hg qinit -c
-  $ hg qci -m "initial commit"
-  $ mkcommit a
-  $ mkcommit b
-  $ hg qlog
-  1 - 7c3bad9141dc add b (draft)
-  0 - 1f0dee641bb7 add a (draft)
-  $ hg qsync -a
-  $ hg mqlog
-  2 - qsubmit commit
-  
-  * DEFAULT-add_a.diff ready for review
-  * DEFAULT-add_b.diff ready for review
-  1 - qsubmit init
-  0 - initial commit
-
-basic sync II
-
-  $ hg init local
-  $ cd local
-  $ hg qinit -c
-  $ hg qci -m "initial commit"
-  $ mkcommit a
-  $ mkcommit b
-  $ hg qlog
-  1 - 7c3bad9141dc add b (draft)
-  0 - 1f0dee641bb7 add a (draft)
-  $ hg qsync -a
-  $ hg mqlog
-  2 - qsubmit commit
-  
-  * DEFAULT-add_a.diff ready for review
-  * DEFAULT-add_b.diff ready for review
-  1 - qsubmit init
-  0 - initial commit
-
-  $ echo "b" >> b
-  $ hg amend
-  $ hg qsync -a
-  $ hg mqlog
-  3 - qsubmit commit
-  
-  * DEFAULT-add_b.diff ready for review
-  2 - qsubmit commit
-  
-  * DEFAULT-add_a.diff ready for review
-  * DEFAULT-add_b.diff ready for review
-  1 - qsubmit init
-  0 - initial commit
-
-  $ hg up -r 0
-  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ echo "a" >> a
-  $ hg amend
-  1 new unstables changesets
-  $ hg graft -O 3
-  grafting revision 3
-  $ hg qsync -a
-  $ hg mqlog
-  4 - qsubmit commit
-  
-  * DEFAULT-add_a.diff ready for review
-  * DEFAULT-add_b.diff ready for review
-  3 - qsubmit commit
-  
-  * DEFAULT-add_b.diff ready for review
-  2 - qsubmit commit
-  
-  * DEFAULT-add_a.diff ready for review
-  * DEFAULT-add_b.diff ready for review
-  1 - qsubmit init
-  0 - initial commit
-
-sync with published changeset
-
-  $ hg init local
-  $ cd local
-  $ hg qinit -c
-  $ hg qci -m "initial commit"
-  $ mkcommit a
-  $ mkcommit b
-  $ hg qlog
-  1 - 7c3bad9141dc add b (draft)
-  0 - 1f0dee641bb7 add a (draft)
-  $ hg qsync -a
-  $ hg mqlog
-  2 - qsubmit commit
-  
-  * DEFAULT-add_a.diff ready for review
-  * DEFAULT-add_b.diff ready for review
-  1 - qsubmit init
-  0 - initial commit
-
-  $ hg phase -p 0
-  $ hg qsync -a
-  $ hg mqlog
-  3 - qsubmit commit
-  
-  * applied DEFAULT-add_a.diff
-  2 - qsubmit commit
-  
-  * DEFAULT-add_a.diff ready for review
-  * DEFAULT-add_b.diff ready for review
-  1 - qsubmit init
-  0 - initial commit
-
-  $ mkcommit c
-  $ mkcommit d
-  $ hg qsync -a
-  $ hg mqlog
-  4 - qsubmit commit
-  
-  * DEFAULT-add_c.diff ready for review
-  * DEFAULT-add_d.diff ready for review
-  3 - qsubmit commit
-  
-  * applied DEFAULT-add_a.diff
-  2 - qsubmit commit
-  
-  * DEFAULT-add_a.diff ready for review
-  * DEFAULT-add_b.diff ready for review
-  1 - qsubmit init
-  0 - initial commit
-
-  $ cd ..
-  $ hg qclone -U local local2
-  $ cd local2
-  $ hg qlog
-  3 - 47d2a3944de8 add d (draft)
-  2 - 4538525df7e2 add c (draft)
-  1 - 7c3bad9141dc add b (draft)
-  0 - 1f0dee641bb7 add a (public)
-  $ hg strip -n 1 --no-backup
-  $ hg up
-  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ hg up --mq 4
-  6 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ hg qseries
-  DEFAULT-add_b.diff
-  DEFAULT-add_c.diff
-  DEFAULT-add_d.diff
-  $ hg qpush
-  applying DEFAULT-add_b.diff
-  now at: DEFAULT-add_b.diff
-  $ hg qfinish -a
-  $ hg phase -p .
-  $ hg qci -m "applied DEFAULT-add_b.diff"
-  $ cd ../local
-  $ hg pull ../local2
-  pulling from ../local2
-  searching for changes
-  no changes found
-  (run 'hg update' to get a working copy)
-  $ hg pull --mq ../local2/.hg/patches
-  pulling from ../local2/.hg/patches
-  searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files
-  (run 'hg update' to get a working copy)
-  $ hg qlog
-  3 - 47d2a3944de8 add d (draft)
-  2 - 4538525df7e2 add c (draft)
-  1 - 7c3bad9141dc add b (public)
-  0 - 1f0dee641bb7 add a (public)
-  $ hg mqlog -l 1
-  5 - applied DEFAULT-add_b.diff
-  $ hg status --mq --rev tip:-2
-  M series
-  A DEFAULT-add_b.diff
-  $ hg qsync -a
-  $ hg status --mq --rev tip:-2
-  M qsubmitdata
-  $ hg mqlog -l 1
-  6 - qsubmit commit
-  
-  * applied DEFAULT-add_b.diff
-  $ hg qsync -a
-  abort: Nothing changed
-  [255]
-
-mixed sync
-
-  $ hg init local
-  $ cd local
-  $ hg qinit -c
-  $ mkcommit a
-  $ mkcommit b
-  $ hg qlog
-  1 - 7c3bad9141dc add b (draft)
-  0 - 1f0dee641bb7 add a (draft)
-  $ hg qsync -a
-  $ hg mqlog
-  1 - qsubmit commit
-  
-  * DEFAULT-add_a.diff ready for review
-  * DEFAULT-add_b.diff ready for review
-  0 - qsubmit init
-  $ hg phase -p 0
-  $ echo "b" >> b
-  $ hg amend
-  $ hg qsync -a
-  $ hg mqlog -l 1
-  2 - qsubmit commit
-  
-  * applied DEFAULT-add_a.diff
-  * DEFAULT-add_b.diff ready for review
-
new file mode 100644
--- /dev/null
+++ b/tests/test-sharing.t
@@ -0,0 +1,544 @@
+Test script based on sharing.rst: ensure that all scenarios in that
+document work as advertised.
+
+Setting things up
+
+  $ cat >> $HGRCPATH <<EOF
+  > [alias]
+  > shortlog = log --template '{rev}:{node|short}  {phase}  {desc|firstline}\n'
+  > [extensions]
+  > rebase =
+  > EOF
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+  $ hg init public
+  $ hg clone public test-repo
+  updating to branch default
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg clone test-repo dev-repo
+  updating to branch default
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cat >> test-repo/.hg/hgrc <<EOF
+  > [phases]
+  > publish = false
+  > EOF
+
+To start things off, let's make one public, immutable changeset::
+
+  $ cd test-repo
+  $ echo 'my new project' > file1
+  $ hg add file1
+  $ hg commit -m'create new project'
+  $ hg push
+  pushing to $TESTTMP/public
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+
+and pull that into the development repository::
+
+  $ cd ../dev-repo
+  $ hg pull -u
+  pulling from $TESTTMP/test-repo
+  requesting all changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  pull obsolescence markers
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Let's commit a preliminary change and push it to ``test-repo`` for
+testing. ::
+
+  $ echo 'fix fix fix' > file1
+  $ hg commit -m'prelim change'
+  $ hg push -q ../test-repo
+
+Figure SG01 (roughly)
+  $ hg shortlog -G
+  @  1:f6490818a721  draft  prelim change
+  |
+  o  0:0dc9c9f6ab91  public  create new project
+  
+Now let's switch to test-repo to test our change and amend::
+  $ cd ../test-repo
+  $ hg update -q
+  $ echo 'Fix fix fix.' > file1
+  $ hg amend -m'fix bug 37'
+
+Figure SG02
+  $ hg shortlog --hidden -G
+  @  3:60ffde5765c5  draft  fix bug 37
+  |
+  | x  2:2a039763c0f4  draft  temporary amend commit for f6490818a721
+  | |
+  | x  1:f6490818a721  draft  prelim change
+  |/
+  o  0:0dc9c9f6ab91  public  create new project
+  
+Pull into dev-repo: obsolescence markers are transferred, but not
+the new obsolete changeset.
+  $ cd ../dev-repo
+  $ hg pull -u
+  pulling from $TESTTMP/test-repo
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  pull obsolescence markers
+  2 obsolescence markers added
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Figure SG03
+  $ hg shortlog --hidden -G
+  @  2:60ffde5765c5  draft  fix bug 37
+  |
+  | x  1:f6490818a721  draft  prelim change
+  |/
+  o  0:0dc9c9f6ab91  public  create new project
+  
+Amend again in dev-repo
+  $ echo 'Fix, fix, and fix.' > file1
+  $ hg amend
+  $ hg push -q
+
+Figure SG04 (dev-repo)
+  $ hg shortlog --hidden -G
+  @  4:de6151c48e1c  draft  fix bug 37
+  |
+  | x  3:ad19d3570adb  draft  temporary amend commit for 60ffde5765c5
+  | |
+  | x  2:60ffde5765c5  draft  fix bug 37
+  |/
+  | x  1:f6490818a721  draft  prelim change
+  |/
+  o  0:0dc9c9f6ab91  public  create new project
+  
+Figure SG04 (test-repo)
+  $ cd ../test-repo
+  $ hg update
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg shortlog --hidden -G
+  @  4:de6151c48e1c  draft  fix bug 37
+  |
+  | x  3:60ffde5765c5  draft  fix bug 37
+  |/
+  | x  2:2a039763c0f4  draft  temporary amend commit for f6490818a721
+  | |
+  | x  1:f6490818a721  draft  prelim change
+  |/
+  o  0:0dc9c9f6ab91  public  create new project
+  
+This bug fix is finished. We can push it to the public repository.
+  $ hg push
+  pushing to $TESTTMP/public (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  pushing 4 obsolescence markers (* bytes) (glob)
+  4 obsolescence markers added
+
+Now that the fix is public, we cannot amend it any more.
+  $ hg amend -m 'fix bug 37'
+  abort: cannot amend public changesets
+  [255]
+
+Figure SG05
+  $ hg -R ../public shortlog -G
+  o  1:de6151c48e1c  public  fix bug 37
+  |
+  o  0:0dc9c9f6ab91  public  create new project
+  
+Oops, still have draft changesets in dev-repo: push the phase change there.
+  $ hg -R ../dev-repo shortlog -r 'draft()'
+  4:de6151c48e1c  draft  fix bug 37
+  $ hg push ../dev-repo
+  pushing to ../dev-repo
+  searching for changes
+  no changes found
+  pushing 4 obsolescence markers (* bytes) (glob)
+  0 obsolescence markers added
+  [1]
+  $ hg -R ../dev-repo shortlog -r 'draft()'
+
+Sharing with multiple developers: code review
+
+  $ cd ..
+  $ hg clone public review
+  updating to branch default
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg clone review alice
+  updating to branch default
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg clone review bob
+  updating to branch default
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cat >> review/.hg/hgrc <<EOF
+  > [phases]
+  > publish = false
+  > EOF
+
+Alice commits a draft bug fix, pushes to review repo.
+  $ cd alice
+  $ hg bookmark bug15
+  $ echo 'fix' > file2
+  $ hg commit -A -u alice -m 'fix bug 15 (v1)'
+  adding file2
+  $ hg push -B bug15
+  pushing to $TESTTMP/review
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  pushing 4 obsolescence markers (* bytes) (glob)
+  0 obsolescence markers added
+  exporting bookmark bug15
+  $ hg -R ../review bookmarks
+     bug15                     2:f91e97234c2b
+
+Alice receives code review, amends her fix, and goes out to lunch to
+await second review.
+  $ echo 'Fix.' > file2
+  $ hg amend -m 'fix bug 15 (v2)'
+  $ hg push
+  pushing to $TESTTMP/review
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  pushing 6 obsolescence markers (* bytes) (glob)
+  2 obsolescence markers added
+  updating bookmark bug15
+  $ hg -R ../review bookmarks
+     bug15                     3:cbdfbd5a5db2
+
+Figure SG06: review repository after Alice pushes her amended changeset.
+  $ hg --hidden -R ../review shortlog -G -r 1::
+  o  3:cbdfbd5a5db2  draft  fix bug 15 (v2)
+  |
+  | x  2:f91e97234c2b  draft  fix bug 15 (v1)
+  |/
+  @  1:de6151c48e1c  public  fix bug 37
+  |
+
+Bob commits a draft changeset, pushes to review repo.
+  $ cd ../bob
+  $ echo 'stuff' > file1
+  $ hg bookmark featureX
+  $ hg commit -u bob -m 'implement feature X (v1)'
+  $ hg push -B featureX
+  pushing to $TESTTMP/review
+  searching for changes
+  remote has heads on branch 'default' that are not known locally: cbdfbd5a5db2
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  pushing 4 obsolescence markers (* bytes) (glob)
+  0 obsolescence markers added
+  exporting bookmark featureX
+  $ hg -R ../review bookmarks
+     bug15                     3:cbdfbd5a5db2
+     featureX                  4:193657d1e852
+
+Bob receives first review, amends and pushes.
+  $ echo 'do stuff' > file1
+  $ hg amend -m 'implement feature X (v2)'
+  $ hg push
+  pushing to $TESTTMP/review
+  searching for changes
+  remote has heads on branch 'default' that are not known locally: cbdfbd5a5db2
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  pushing 6 obsolescence markers (* bytes) (glob)
+  2 obsolescence markers added
+  updating bookmark featureX
+
+Bob receives second review, amends, and pushes to public:
+this time, he's sure he got it right!
+  $ echo 'Do stuff.' > file1
+  $ hg amend -m 'implement feature X (v3)'
+  $ hg push ../public
+  pushing to ../public
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  pushing 8 obsolescence markers (* bytes) (glob)
+  4 obsolescence markers added
+  $ hg -R ../public bookmarks
+  no bookmarks set
+  $ hg push ../review
+  pushing to ../review
+  searching for changes
+  remote has heads on branch 'default' that are not known locally: cbdfbd5a5db2
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  pushing 8 obsolescence markers (* bytes) (glob)
+  2 obsolescence markers added
+  updating bookmark featureX
+  $ hg -R ../review bookmarks
+     bug15                     3:cbdfbd5a5db2
+     featureX                  6:540ba8f317e6
+
+Figure SG07: review and public repos after Bob implements feature X.
+  $ hg --hidden -R ../review shortlog -G -r 1::
+  o  6:540ba8f317e6  public  implement feature X (v3)
+  |
+  | x  5:0eb74a7b6698  draft  implement feature X (v2)
+  |/
+  | x  4:193657d1e852  draft  implement feature X (v1)
+  |/
+  | o  3:cbdfbd5a5db2  draft  fix bug 15 (v2)
+  |/
+  | x  2:f91e97234c2b  draft  fix bug 15 (v1)
+  |/
+  @  1:de6151c48e1c  public  fix bug 37
+  |
+  $ hg --hidden -R ../public shortlog -G -r 1::
+  o  2:540ba8f317e6  public  implement feature X (v3)
+  |
+  o  1:de6151c48e1c  public  fix bug 37
+  |
+
+How do things look in the review repo?
+  $ cd ../review
+  $ hg --hidden shortlog -G -r 1::
+  o  6:540ba8f317e6  public  implement feature X (v3)
+  |
+  | x  5:0eb74a7b6698  draft  implement feature X (v2)
+  |/
+  | x  4:193657d1e852  draft  implement feature X (v1)
+  |/
+  | o  3:cbdfbd5a5db2  draft  fix bug 15 (v2)
+  |/
+  | x  2:f91e97234c2b  draft  fix bug 15 (v1)
+  |/
+  @  1:de6151c48e1c  public  fix bug 37
+  |
+
+Meantime, Alice is back from lunch. While she was away, Bob approved
+her change, so now she can publish it.
+  $ cd ../alice
+  $ hg --hidden shortlog -G -r 1::
+  @  4:cbdfbd5a5db2  draft  fix bug 15 (v2)
+  |
+  | x  3:55dd95168a35  draft  temporary amend commit for f91e97234c2b
+  | |
+  | x  2:f91e97234c2b  draft  fix bug 15 (v1)
+  |/
+  o  1:de6151c48e1c  public  fix bug 37
+  |
+  $ hg outgoing -q ../public
+  4:cbdfbd5a5db2
+  $ hg push ../public
+  pushing to ../public
+  searching for changes
+  remote has heads on branch 'default' that are not known locally: 540ba8f317e6
+  abort: push creates new remote head cbdfbd5a5db2 with bookmark 'bug15'!
+  (pull and merge or see "hg help push" for details about pushing new heads)
+  [255]
+  $ hg pull ../public
+  pulling from ../public
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  pull obsolescence markers
+  4 obsolescence markers added
+  (run 'hg heads' to see heads, 'hg merge' to merge)
+  $ hg log -G -q -r 'head()'
+  o  5:540ba8f317e6
+  |
+  | @  4:cbdfbd5a5db2
+  |/
+  $ hg --hidden shortlog -G -r 1::
+  o  5:540ba8f317e6  public  implement feature X (v3)
+  |
+  | @  4:cbdfbd5a5db2  draft  fix bug 15 (v2)
+  |/
+  | x  3:55dd95168a35  draft  temporary amend commit for f91e97234c2b
+  | |
+  | x  2:f91e97234c2b  draft  fix bug 15 (v1)
+  |/
+  o  1:de6151c48e1c  public  fix bug 37
+  |
+
+Alice rebases her draft changeset on top of Bob's public changeset and
+publishes the result.
+  $ hg rebase -d 5
+  rebasing 4:cbdfbd5a5db2 "fix bug 15 (v2)" (bug15)
+  $ hg push ../public
+  pushing to ../public
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  pushing 11 obsolescence markers (* bytes) (glob)
+  3 obsolescence markers added
+  $ hg push ../review
+  pushing to ../review
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 0 changes to 1 files
+  pushing 11 obsolescence markers (* bytes) (glob)
+  1 obsolescence markers added
+  updating bookmark bug15
+
+Figure SG08: review and public changesets after Alice pushes.
+  $ hg --hidden -R ../review shortlog -G -r 1::
+  o  7:a06ec1bf97bd  public  fix bug 15 (v2)
+  |
+  o  6:540ba8f317e6  public  implement feature X (v3)
+  |
+  | x  5:0eb74a7b6698  draft  implement feature X (v2)
+  |/
+  | x  4:193657d1e852  draft  implement feature X (v1)
+  |/
+  | x  3:cbdfbd5a5db2  draft  fix bug 15 (v2)
+  |/
+  | x  2:f91e97234c2b  draft  fix bug 15 (v1)
+  |/
+  @  1:de6151c48e1c  public  fix bug 37
+  |
+  $ hg --hidden -R ../public shortlog -G -r 1::
+  o  3:a06ec1bf97bd  public  fix bug 15 (v2)
+  |
+  o  2:540ba8f317e6  public  implement feature X (v3)
+  |
+  o  1:de6151c48e1c  public  fix bug 37
+  |
+  $ cd ..
+
+Setup for "cowboy mode" shared mutable history (to illustrate divergent
+and bumped changesets).
+  $ rm -rf review alice bob
+  $ hg clone public alice
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg clone public bob
+  updating to branch default
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cat >> alice/.hg/hgrc <<EOF
+  > [phases]
+  > publish = false
+  > EOF
+  $ cp alice/.hg/hgrc bob/.hg/hgrc
+
+Now we'll have Bob commit a bug fix that could still be improved::
+
+  $ cd bob
+  $ echo 'pretty good fix' >> file1
+  $ hg commit -u bob -m 'fix bug 24 (v1)'
+  $ hg shortlog -r .
+  4:2fe6c4bd32d0  draft  fix bug 24 (v1)
+
+Since Alice and Bob are now in cowboy mode, Alice pulls Bob's draft
+changeset and amends it herself. ::
+
+  $ cd ../alice
+  $ hg pull -u ../bob
+  pulling from ../bob
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  pull obsolescence markers
+  0 obsolescence markers added
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ echo 'better fix (alice)' >> file1
+  $ hg amend -u alice -m 'fix bug 24 (v2 by alice)'
+
+Bob implements a better fix of his own::
+
+  $ cd ../bob
+  $ echo 'better fix (bob)' >> file1
+  $ hg amend -u bob -m 'fix bug 24 (v2 by bob)'
+  $ hg --hidden shortlog -G -r 3::
+  @  6:a360947f6faf  draft  fix bug 24 (v2 by bob)
+  |
+  | x  5:3466c7f5a149  draft  temporary amend commit for 2fe6c4bd32d0
+  | |
+  | x  4:2fe6c4bd32d0  draft  fix bug 24 (v1)
+  |/
+  o  3:a06ec1bf97bd  public  fix bug 15 (v2)
+  |
+
+Bob discovers the divergence.
+  $ hg pull ../alice
+  pulling from ../alice
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  pull obsolescence markers
+  2 obsolescence markers added
+  (run 'hg heads' to see heads, 'hg merge' to merge)
+  2 new divergent changesets
+
+Figure SG09: multiple heads! divergence! oh my!
+  $ hg --hidden shortlog -G -r 3::
+  o  7:e3f99ce9d9cd  draft  fix bug 24 (v2 by alice)
+  |
+  | @  6:a360947f6faf  draft  fix bug 24 (v2 by bob)
+  |/
+  | x  5:3466c7f5a149  draft  temporary amend commit for 2fe6c4bd32d0
+  | |
+  | x  4:2fe6c4bd32d0  draft  fix bug 24 (v1)
+  |/
+  o  3:a06ec1bf97bd  public  fix bug 15 (v2)
+  |
+  $ hg --hidden shortlog -r 'successors(2fe6)'
+  6:a360947f6faf  draft  fix bug 24 (v2 by bob)
+  7:e3f99ce9d9cd  draft  fix bug 24 (v2 by alice)
+
+Use evolve to fix the divergence.
+  $ HGMERGE=internal:other hg evolve
+  merge:[6] fix bug 24 (v2 by bob)
+  with: [7] fix bug 24 (v2 by alice)
+  base: [4] fix bug 24 (v1)
+  0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+  working directory is now at 5ad6037c046c
+  $ hg log -q -r 'divergent()'
+
+Figure SG10: Bob's repository after fixing divergence.
+  $ hg --hidden shortlog -G -r 3::
+  @  9:5ad6037c046c  draft  fix bug 24 (v2 by bob)
+  |
+  | x  8:bcfc9a755ac3  draft  temporary amend commit for a360947f6faf
+  | |
+  +---x  7:e3f99ce9d9cd  draft  fix bug 24 (v2 by alice)
+  | |
+  | x  6:a360947f6faf  draft  fix bug 24 (v2 by bob)
+  |/
+  | x  5:3466c7f5a149  draft  temporary amend commit for 2fe6c4bd32d0
+  | |
+  | x  4:2fe6c4bd32d0  draft  fix bug 24 (v1)
+  |/
+  o  3:a06ec1bf97bd  public  fix bug 15 (v2)
+  |
+  $ hg --hidden shortlog -r 'precursors(9)'
+  6:a360947f6faf  draft  fix bug 24 (v2 by bob)
+  7:e3f99ce9d9cd  draft  fix bug 24 (v2 by alice)
+  $ cat file1
+  Do stuff.
+  pretty good fix
+  better fix (alice)
new file mode 100644
--- /dev/null
+++ b/tests/test-simple4server-bundle2.t
@@ -0,0 +1,169 @@
+
+  $ cat >> $HGRCPATH <<EOF
+  > [defaults]
+  > amend=-d "0 0"
+  > [web]
+  > push_ssl = false
+  > allow_push = *
+  > [phases]
+  > publish = False
+  > [experimental]
+  > bundle2-exp=True
+  > EOF
+
+  $ mkcommit() {
+  >    echo "$1" > "$1"
+  >    hg add "$1"
+  >    hg ci -m "add $1"
+  > }
+
+setup repo
+
+  $ hg init server
+  $ echo "[extensions]" >> ./server/.hg/hgrc
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/simple4server.py" >> ./server/.hg/hgrc
+  $ hg serve -R server -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
+  $ cat hg.pid >> $DAEMON_PIDS
+
+  $ hg clone http://localhost:$HGPORT/ client
+  no changes found
+  updating to branch default
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cat ./errors.log
+  $ echo "[extensions]" >> ./client/.hg/hgrc
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> ./client/.hg/hgrc
+  $ cp -r client other
+
+Smoke testing
+===============
+
+  $ cd client
+  $ mkcommit 0
+  $ mkcommit a
+  $ hg push
+  pushing to http://localhost:$HGPORT/
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 2 changesets with 2 changes to 2 files
+  $ hg pull
+  pulling from http://localhost:$HGPORT/
+  searching for changes
+  no changes found
+  $ cat ../errors.log
+  $ hg pull -R ../other
+  pulling from http://localhost:$HGPORT/
+  requesting all changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 2 changes to 2 files
+  (run 'hg update' to get a working copy)
+  $ cat ../errors.log
+  $ hg push -R ../other
+  pushing to http://localhost:$HGPORT/
+  searching for changes
+  no changes found
+  [1]
+  $ cat ../errors.log
+
+Capacity testing
+===================
+
+  $ wget -q -O - http://localhost:$HGPORT/?cmd=hello
+  capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream bundle2=HG20%0Achangegroup%3D01%2C02%0Adigests%3Dmd5%2Csha1%2Csha512%0Alistkeys%0Aobsmarkers%3DV0%2CV1%0Apushkey%0Aremote-changegroup%3Dhttp%2Chttps unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 _evoext_pushobsmarkers_0 _evoext_pullobsmarkers_0 _evoext_obshash_0 _evoext_obshash_1 _evoext_getbundle_obscommon
+  $ wget -q -O - http://localhost:$HGPORT/?cmd=capabilities
+  lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream bundle2=HG20%0Achangegroup%3D01%2C02%0Adigests%3Dmd5%2Csha1%2Csha512%0Alistkeys%0Aobsmarkers%3DV0%2CV1%0Apushkey%0Aremote-changegroup%3Dhttp%2Chttps unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 _evoext_pushobsmarkers_0 _evoext_pullobsmarkers_0 _evoext_obshash_0 _evoext_obshash_1 _evoext_getbundle_obscommon (no-eol)
+
+  $ wget -q -O - "http://localhost:$HGPORT/?cmd=listkeys&namespace=namespaces" | sort
+  bookmarks	
+  namespaces	
+  obsolete	
+  phases	
+
+Push
+=============
+
+  $ echo 'A' > a
+  $ hg amend
+  $ hg push
+  pushing to http://localhost:$HGPORT/
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files (+1 heads)
+  remote: 2 new obsolescence markers
+  $ cat ../errors.log
+  $ hg push
+  pushing to http://localhost:$HGPORT/
+  searching for changes
+  no changes found
+  [1]
+  $ cat ../errors.log
+
+Pull
+=============
+
+  $ hg -R ../other pull
+  pulling from http://localhost:$HGPORT/
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to [12] files \(\+1 heads\) (re)
+  2 new obsolescence markers
+  (run 'hg heads' to see heads, 'hg merge' to merge)
+  $ cat ../errors.log
+  $ hg -R ../other pull
+  pulling from http://localhost:$HGPORT/
+  searching for changes
+  no changes found
+  $ cat ../errors.log
+
+  $ cd ..
+
+Test disabling obsolete advertisement
+===========================================
+(used by bitbucket to select which repo use evolve)
+
+  $ wget -q -O - "http://localhost:$HGPORT/?cmd=listkeys&namespace=namespaces" | sort
+  bookmarks	
+  namespaces	
+  obsolete	
+  phases	
+  $ wget -q -O - http://localhost:$HGPORT/?cmd=hello
+  capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream bundle2=HG20%0Achangegroup%3D01%2C02%0Adigests%3Dmd5%2Csha1%2Csha512%0Alistkeys%0Aobsmarkers%3DV0%2CV1%0Apushkey%0Aremote-changegroup%3Dhttp%2Chttps unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 _evoext_pushobsmarkers_0 _evoext_pullobsmarkers_0 _evoext_obshash_0 _evoext_obshash_1 _evoext_getbundle_obscommon
+  $ wget -q -O - http://localhost:$HGPORT/?cmd=capabilities
+  lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream bundle2=HG20%0Achangegroup%3D01%2C02%0Adigests%3Dmd5%2Csha1%2Csha512%0Alistkeys%0Aobsmarkers%3DV0%2CV1%0Apushkey%0Aremote-changegroup%3Dhttp%2Chttps unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 _evoext_pushobsmarkers_0 _evoext_pullobsmarkers_0 _evoext_obshash_0 _evoext_obshash_1 _evoext_getbundle_obscommon (no-eol)
+
+  $ echo '[__temporary__]' >> server/.hg/hgrc
+  $ echo 'advertiseobsolete=False' >> server/.hg/hgrc
+  $ $TESTDIR/killdaemons.py
+  $ hg serve -R server -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
+  $ cat hg.pid >> $DAEMON_PIDS
+
+  $ wget -q -O - "http://localhost:$HGPORT/?cmd=listkeys&namespace=namespaces" | sort
+  bookmarks	
+  namespaces	
+  phases	
+  $ wget -q -O - http://localhost:$HGPORT/?cmd=hello
+  capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream bundle2=HG20%0Achangegroup%3D01%2C02%0Adigests%3Dmd5%2Csha1%2Csha512%0Alistkeys%0Aobsmarkers%3DV0%2CV1%0Apushkey%0Aremote-changegroup%3Dhttp%2Chttps unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024
+  $ wget -q -O - http://localhost:$HGPORT/?cmd=capabilities
+  lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream bundle2=HG20%0Achangegroup%3D01%2C02%0Adigests%3Dmd5%2Csha1%2Csha512%0Alistkeys%0Aobsmarkers%3DV0%2CV1%0Apushkey%0Aremote-changegroup%3Dhttp%2Chttps unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 (no-eol)
+
+  $ echo 'advertiseobsolete=True' >> server/.hg/hgrc
+  $ $TESTDIR/killdaemons.py
+  $ hg serve -R server -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
+  $ cat hg.pid >> $DAEMON_PIDS
+
+  $ wget -q -O - "http://localhost:$HGPORT/?cmd=listkeys&namespace=namespaces" | sort
+  bookmarks	
+  namespaces	
+  obsolete	
+  phases	
+  $ wget -q -O - http://localhost:$HGPORT/?cmd=hello
+  capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream bundle2=HG20%0Achangegroup%3D01%2C02%0Adigests%3Dmd5%2Csha1%2Csha512%0Alistkeys%0Aobsmarkers%3DV0%2CV1%0Apushkey%0Aremote-changegroup%3Dhttp%2Chttps unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 _evoext_pushobsmarkers_0 _evoext_pullobsmarkers_0 _evoext_obshash_0 _evoext_obshash_1 _evoext_getbundle_obscommon
+  $ wget -q -O - http://localhost:$HGPORT/?cmd=capabilities
+  lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream bundle2=HG20%0Achangegroup%3D01%2C02%0Adigests%3Dmd5%2Csha1%2Csha512%0Alistkeys%0Aobsmarkers%3DV0%2CV1%0Apushkey%0Aremote-changegroup%3Dhttp%2Chttps unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 _evoext_pushobsmarkers_0 _evoext_pullobsmarkers_0 _evoext_obshash_0 _evoext_obshash_1 _evoext_getbundle_obscommon (no-eol)
new file mode 100644
--- /dev/null
+++ b/tests/test-simple4server.t
@@ -0,0 +1,170 @@
+
+  $ cat >> $HGRCPATH <<EOF
+  > [defaults]
+  > amend=-d "0 0"
+  > [web]
+  > push_ssl = false
+  > allow_push = *
+  > [phases]
+  > publish = False
+  > [extensions]
+  > EOF
+
+  $ mkcommit() {
+  >    echo "$1" > "$1"
+  >    hg add "$1"
+  >    hg ci -m "add $1"
+  > }
+
+setup repo
+
+  $ hg init server
+  $ echo "[extensions]" >> ./server/.hg/hgrc
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/simple4server.py" >> ./server/.hg/hgrc
+  $ hg serve -R server -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
+  $ cat hg.pid >> $DAEMON_PIDS
+
+  $ hg clone http://localhost:$HGPORT/ client
+  no changes found
+  updating to branch default
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cat ./errors.log
+  $ echo "[extensions]" >> ./client/.hg/hgrc
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> ./client/.hg/hgrc
+  $ cp -r client other
+
+Smoke testing
+===============
+
+  $ cd client
+  $ mkcommit 0
+  $ mkcommit a
+  $ hg push
+  pushing to http://localhost:$HGPORT/
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 2 changesets with 2 changes to 2 files
+  $ hg pull
+  pulling from http://localhost:$HGPORT/
+  searching for changes
+  no changes found
+  $ cat ../errors.log
+  $ hg pull -R ../other
+  pulling from http://localhost:$HGPORT/
+  requesting all changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 2 changes to 2 files
+  pull obsolescence markers
+  (run 'hg update' to get a working copy)
+  $ cat ../errors.log
+  $ hg push -R ../other
+  pushing to http://localhost:$HGPORT/
+  searching for changes
+  no changes found
+  [1]
+  $ cat ../errors.log
+
+Capacity testing
+===================
+
+  $ wget -q -O - http://localhost:$HGPORT/?cmd=hello
+  capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream bundle2=HG20%0Achangegroup%3D01%2C02%0Adigests%3Dmd5%2Csha1%2Csha512%0Alistkeys%0Aobsmarkers%3DV0%2CV1%0Apushkey%0Aremote-changegroup%3Dhttp%2Chttps unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 _evoext_pushobsmarkers_0 _evoext_pullobsmarkers_0 _evoext_obshash_0 _evoext_obshash_1 _evoext_getbundle_obscommon
+  $ wget -q -O - http://localhost:$HGPORT/?cmd=capabilities
+  lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream bundle2=HG20%0Achangegroup%3D01%2C02%0Adigests%3Dmd5%2Csha1%2Csha512%0Alistkeys%0Aobsmarkers%3DV0%2CV1%0Apushkey%0Aremote-changegroup%3Dhttp%2Chttps unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 _evoext_pushobsmarkers_0 _evoext_pullobsmarkers_0 _evoext_obshash_0 _evoext_obshash_1 _evoext_getbundle_obscommon (no-eol)
+
+  $ wget -q -O - "http://localhost:$HGPORT/?cmd=listkeys&namespace=namespaces" | sort
+  bookmarks	
+  namespaces	
+  obsolete	
+  phases	
+
+Push
+=============
+
+  $ echo 'A' > a
+  $ hg amend
+  $ hg push
+  pushing to http://localhost:$HGPORT/
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files (+1 heads)
+  pushing 2 obsolescence markers (* bytes) (glob)
+  $ cat ../errors.log
+  $ hg push
+  pushing to http://localhost:$HGPORT/
+  searching for changes
+  no changes found
+  [1]
+  $ cat ../errors.log
+
+Pull
+=============
+
+  $ hg -R ../other pull
+  pulling from http://localhost:$HGPORT/
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to [12] files \(\+1 heads\) (re)
+  pull obsolescence markers
+  2 obsolescence markers added
+  (run 'hg heads' to see heads)
+  $ cat ../errors.log
+  $ hg -R ../other pull
+  pulling from http://localhost:$HGPORT/
+  searching for changes
+  no changes found
+  $ cat ../errors.log
+
+  $ cd ..
+
+Test disabling obsolete advertisement
+===========================================
+(used by bitbucket to select which repo use evolve)
+
+  $ wget -q -O - "http://localhost:$HGPORT/?cmd=listkeys&namespace=namespaces" | sort
+  bookmarks	
+  namespaces	
+  obsolete	
+  phases	
+  $ wget -q -O - http://localhost:$HGPORT/?cmd=hello
+  capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream bundle2=HG20%0Achangegroup%3D01%2C02%0Adigests%3Dmd5%2Csha1%2Csha512%0Alistkeys%0Aobsmarkers%3DV0%2CV1%0Apushkey%0Aremote-changegroup%3Dhttp%2Chttps unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 _evoext_pushobsmarkers_0 _evoext_pullobsmarkers_0 _evoext_obshash_0 _evoext_obshash_1 _evoext_getbundle_obscommon
+  $ wget -q -O - http://localhost:$HGPORT/?cmd=capabilities
+  lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream bundle2=HG20%0Achangegroup%3D01%2C02%0Adigests%3Dmd5%2Csha1%2Csha512%0Alistkeys%0Aobsmarkers%3DV0%2CV1%0Apushkey%0Aremote-changegroup%3Dhttp%2Chttps unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 _evoext_pushobsmarkers_0 _evoext_pullobsmarkers_0 _evoext_obshash_0 _evoext_obshash_1 _evoext_getbundle_obscommon (no-eol)
+
+  $ echo '[__temporary__]' >> server/.hg/hgrc
+  $ echo 'advertiseobsolete=False' >> server/.hg/hgrc
+  $ $TESTDIR/killdaemons.py
+  $ hg serve -R server -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
+  $ cat hg.pid >> $DAEMON_PIDS
+
+  $ wget -q -O - "http://localhost:$HGPORT/?cmd=listkeys&namespace=namespaces" | sort
+  bookmarks	
+  namespaces	
+  phases	
+  $ wget -q -O - http://localhost:$HGPORT/?cmd=hello
+  capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream bundle2=HG20%0Achangegroup%3D01%2C02%0Adigests%3Dmd5%2Csha1%2Csha512%0Alistkeys%0Aobsmarkers%3DV0%2CV1%0Apushkey%0Aremote-changegroup%3Dhttp%2Chttps unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024
+  $ wget -q -O - http://localhost:$HGPORT/?cmd=capabilities
+  lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream bundle2=HG20%0Achangegroup%3D01%2C02%0Adigests%3Dmd5%2Csha1%2Csha512%0Alistkeys%0Aobsmarkers%3DV0%2CV1%0Apushkey%0Aremote-changegroup%3Dhttp%2Chttps unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 (no-eol)
+
+  $ echo 'advertiseobsolete=True' >> server/.hg/hgrc
+  $ $TESTDIR/killdaemons.py
+  $ hg serve -R server -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
+  $ cat hg.pid >> $DAEMON_PIDS
+
+  $ wget -q -O - "http://localhost:$HGPORT/?cmd=listkeys&namespace=namespaces" | sort
+  bookmarks	
+  namespaces	
+  obsolete	
+  phases	
+  $ wget -q -O - http://localhost:$HGPORT/?cmd=hello
+  capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream bundle2=HG20%0Achangegroup%3D01%2C02%0Adigests%3Dmd5%2Csha1%2Csha512%0Alistkeys%0Aobsmarkers%3DV0%2CV1%0Apushkey%0Aremote-changegroup%3Dhttp%2Chttps unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 _evoext_pushobsmarkers_0 _evoext_pullobsmarkers_0 _evoext_obshash_0 _evoext_obshash_1 _evoext_getbundle_obscommon
+  $ wget -q -O - http://localhost:$HGPORT/?cmd=capabilities
+  lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream bundle2=HG20%0Achangegroup%3D01%2C02%0Adigests%3Dmd5%2Csha1%2Csha512%0Alistkeys%0Aobsmarkers%3DV0%2CV1%0Apushkey%0Aremote-changegroup%3Dhttp%2Chttps unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 _evoext_pushobsmarkers_0 _evoext_pullobsmarkers_0 _evoext_obshash_0 _evoext_obshash_1 _evoext_getbundle_obscommon (no-eol)
new file mode 100644
--- /dev/null
+++ b/tests/test-stabilize-conflict.t
@@ -0,0 +1,262 @@
+=========================================================
+Test the proper behavior of evolve during merge conflict.
+=========================================================
+
+Initial setup
+
+  $ cat >> $HGRCPATH <<EOF
+  > [ui]
+  > interactive=false
+  > merge=internal:merge
+  > promptecho = True
+  > [defaults]
+  > amend=-d "0 0"
+  > [merge-tools]
+  > touch.checkchanged=true
+  > touch.gui=true
+  > touch.args=babar
+  > [extensions]
+  > EOF
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+
+  $ safesed() {
+  >   sed "$1" "$2" > `pwd`/sed.temp
+  >   mv `pwd`/sed.temp "$2"
+  > }
+
+create a simple repo
+
+  $ hg init repo
+  $ cd repo
+  $ cat << EOF > babar
+  > un
+  > deux
+  > trois
+  > quatre
+  > cinq
+  > EOF
+  $ hg add babar
+  $ hg commit -m "babar count up to five"
+  $ cat << EOF >> babar
+  > six
+  > sept
+  > huit
+  > neuf
+  > dix
+  > EOF
+  $ hg commit -m "babar count up to ten"
+  $ cat << EOF >> babar
+  > onze
+  > douze
+  > treize
+  > quatorze
+  > quinze
+  > EOF
+  $ hg commit -m "babar count up to fifteen"
+
+
+proper behavior without conflict
+----------------------------------
+
+  $ hg gdown
+  gdown have been deprecated in favor of previous
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  [1] babar count up to ten
+  $ safesed 's/huit/eight/' babar
+  $ hg diff
+  diff -r 9d5daf8bd956 babar
+  --- a/babar	Thu Jan 01 00:00:00 1970 +0000
+  +++ b/babar	* (glob)
+  @@ -5,6 +5,6 @@
+   cinq
+   six
+   sept
+  -huit
+  +eight
+   neuf
+   dix
+  $ hg amend
+  1 new unstable changesets
+  $ hg evolve
+  move:[2] babar count up to fifteen
+  atop:[4] babar count up to ten
+  merging babar
+  working directory is now at 71c18f70c34f
+  $ hg resolve -l
+  $ hg log -G
+  @  changeset:   5:71c18f70c34f
+  |  tag:         tip
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     babar count up to fifteen
+  |
+  o  changeset:   4:5977072d13c5
+  |  parent:      0:29ec1554cfaf
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     babar count up to ten
+  |
+  o  changeset:   0:29ec1554cfaf
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     babar count up to five
+  
+
+
+proper behavior with conflict using internal:merge
+--------------------------------------------------
+
+  $ hg gdown
+  gdown have been deprecated in favor of previous
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  [4] babar count up to ten
+  $ safesed 's/dix/ten/' babar
+  $ hg diff
+  diff -r 5977072d13c5 babar
+  --- a/babar	Thu Jan 01 00:00:00 1970 +0000
+  +++ b/babar	* (glob)
+  @@ -7,4 +7,4 @@
+   sept
+   eight
+   neuf
+  -dix
+  +ten
+  $ hg amend
+  1 new unstable changesets
+  $ hg evolve
+  move:[5] babar count up to fifteen
+  atop:[7] babar count up to ten
+  merging babar
+  warning: conflicts during merge.
+  merging babar incomplete! (edit conflicts, then use 'hg resolve --mark')
+  evolve failed!
+  fix conflict and run "hg evolve --continue" or use "hg update -C" to abort
+  abort: unresolved merge conflicts (see hg help resolve)
+  [255]
+  $ hg resolve -l
+  U babar
+  $ hg log -G
+  @  changeset:   7:e04690b09bc6
+  |  tag:         tip
+  |  parent:      0:29ec1554cfaf
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     babar count up to ten
+  |
+  | o  changeset:   5:71c18f70c34f
+  | |  user:        test
+  | |  date:        Thu Jan 01 00:00:00 1970 +0000
+  | |  summary:     babar count up to fifteen
+  | |
+  | x  changeset:   4:5977072d13c5
+  |/   parent:      0:29ec1554cfaf
+  |    user:        test
+  |    date:        Thu Jan 01 00:00:00 1970 +0000
+  |    summary:     babar count up to ten
+  |
+  o  changeset:   0:29ec1554cfaf
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     babar count up to five
+  
+(fix the conflict and continue)
+
+  $ hg revert -r 5 --all
+  reverting babar
+  $ safesed 's/dix/ten/' babar
+  $ hg resolve --all -m
+  (no more unresolved files)
+  $ hg evolve --continue
+  grafting 5:71c18f70c34f "babar count up to fifteen"
+  $ hg resolve -l
+  $ hg log -G
+  @  changeset:   8:1836b91c6c1d
+  |  tag:         tip
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     babar count up to fifteen
+  |
+  o  changeset:   7:e04690b09bc6
+  |  parent:      0:29ec1554cfaf
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     babar count up to ten
+  |
+  o  changeset:   0:29ec1554cfaf
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     babar count up to five
+  
+proper behavior with conflict using an external merge tool
+----------------------------------------------------------
+
+  $ safesed 's/merge=.*/merge=touch/' $HGRCPATH
+  $ safesed 's/touch.gui=.*/touch.gui=false/' $HGRCPATH
+  $ hg gdown
+  gdown have been deprecated in favor of previous
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  [7] babar count up to ten
+  $ safesed 's/ten/zehn/' babar
+  $ hg diff
+  diff -r e04690b09bc6 babar
+  --- a/babar	Thu Jan 01 00:00:00 1970 +0000
+  +++ b/babar	* (glob)
+  @@ -7,4 +7,4 @@
+   sept
+   eight
+   neuf
+  -ten
+  +zehn
+  $ hg amend
+  1 new unstable changesets
+  $ safesed 's/interactive=.*/interactive=true/' $HGRCPATH
+  $ hg evolve --tool touch <<EOF
+  > n
+  > EOF
+  move:[8] babar count up to fifteen
+  atop:[10] babar count up to ten
+  merging babar
+   output file babar appears unchanged
+  was merge successful (yn)? n
+  merging babar failed!
+  evolve failed!
+  fix conflict and run "hg evolve --continue" or use "hg update -C" to abort
+  abort: unresolved merge conflicts (see hg help resolve)
+  [255]
+  $ hg resolve -l
+  U babar
+  $ hg log -G
+  @  changeset:   10:b20d08eea373
+  |  tag:         tip
+  |  parent:      0:29ec1554cfaf
+  |  user:        test
+  |  date:        Thu Jan 01 00:00:00 1970 +0000
+  |  summary:     babar count up to ten
+  |
+  | o  changeset:   8:1836b91c6c1d
+  | |  user:        test
+  | |  date:        Thu Jan 01 00:00:00 1970 +0000
+  | |  summary:     babar count up to fifteen
+  | |
+  | x  changeset:   7:e04690b09bc6
+  |/   parent:      0:29ec1554cfaf
+  |    user:        test
+  |    date:        Thu Jan 01 00:00:00 1970 +0000
+  |    summary:     babar count up to ten
+  |
+  o  changeset:   0:29ec1554cfaf
+     user:        test
+     date:        Thu Jan 01 00:00:00 1970 +0000
+     summary:     babar count up to five
+  
+  $ cat babar
+  un
+  deux
+  trois
+  quatre
+  cinq
+  six
+  sept
+  eight
+  neuf
+  zehn
--- a/tests/test-stabilize-order.t
+++ b/tests/test-stabilize-order.t
@@ -2,10 +2,8 @@
   > [defaults]
   > amend=-d "0 0"
   > [extensions]
-  > hgext.rebase=
   > hgext.graphlog=
   > EOF
-  $ echo "obsolete=$(echo $(dirname $TESTDIR))/hgext/obsolete.py" >> $HGRCPATH
   $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
 
   $ glog() {
@@ -36,91 +34,102 @@
   o  0:c471ef929e6a@default(draft) addroot
   
   $ hg gdown
+  gdown have been deprecated in favor of previous
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   [2] addb
   $ echo b >> b
   $ hg amend
-  1 new unstables changesets
+  1 new unstable changesets
   $ hg gdown
+  gdown have been deprecated in favor of previous
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   [1] adda
   $ echo a >> a
   $ hg amend
-  1 new unstables changesets
+  1 new unstable changesets
   $ glog
-  @  7:f5ff10856e5a@default(draft) adda
+  @  7:005fe5914f78@default(draft) adda
   |
-  | o  5:ab8cbb6d87ff@default(draft) addb
+  | o  5:22619daeed78@default(draft) addb
   | |
   | | o  3:7a7552255fb5@default(draft) addc
   | | |
-  | | o  2:ef23d6ef94d6@default(draft) addb
+  | | x  2:ef23d6ef94d6@default(draft) addb
   | |/
-  | o  1:93418d2c0979@default(draft) adda
+  | x  1:93418d2c0979@default(draft) adda
   |/
   o  0:c471ef929e6a@default(draft) addroot
   
 
 Test stabilizing a predecessor child
 
-  $ hg stabilize -v
+  $ hg evolve -v
   move:[5] addb
   atop:[7] adda
-  hg rebase -Dr ab8cbb6d87ff -d f5ff10856e5a
+  hg rebase -r 22619daeed78 -d 005fe5914f78
   resolving manifests
   getting b
+  committing files:
   b
+  committing manifest
+  committing changelog
+  working directory is now at bede829dd2d3
   $ glog
-  @  8:6bf44048e43f@default(draft) addb
+  @  8:bede829dd2d3@default(draft) addb
   |
-  o  7:f5ff10856e5a@default(draft) adda
+  o  7:005fe5914f78@default(draft) adda
   |
   | o  3:7a7552255fb5@default(draft) addc
   | |
-  | o  2:ef23d6ef94d6@default(draft) addb
+  | x  2:ef23d6ef94d6@default(draft) addb
   | |
-  | o  1:93418d2c0979@default(draft) adda
+  | x  1:93418d2c0979@default(draft) adda
   |/
   o  0:c471ef929e6a@default(draft) addroot
   
 
-Test stabilizing a descendant predecessors child
+Test stabilizing a descendant predecessor's child
 
   $ hg up 7
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  $ hg debugsuccessors > successors.old
-  $ hg stabilize -v
+  $ hg debugobsolete > successors.old
+  $ hg evolve -v
   move:[3] addc
   atop:[8] addb
-  hg rebase -Dr 7a7552255fb5 -d 6bf44048e43f
+  hg rebase -r 7a7552255fb5 -d bede829dd2d3
   resolving manifests
   getting b
   resolving manifests
   getting c
+  committing files:
   c
-  $ hg debugsuccessors > successors.new
+  committing manifest
+  committing changelog
+  working directory is now at 65095d7d0dd5
+  $ hg debugobsolete > successors.new
   $ diff -u successors.old successors.new
   --- successors.old* (glob)
   +++ successors.new* (glob)
-  @@ -1,5 +1,6 @@
-   3a4a591493f8 f5ff10856e5a
-   3ca0ded0dc50 ab8cbb6d87ff
-  +7a7552255fb5 5e819fbb0d27
-   93418d2c0979 f5ff10856e5a
-   ab8cbb6d87ff 6bf44048e43f
-   ef23d6ef94d6 ab8cbb6d87ff
+  @@ -3,3 +3,4 @@
+   93418d2c0979643ad446f621195e78720edb05b4 005fe5914f78e8bc64c7eba28117b0b1fa210d0d 0 (*) {'user': 'test'} (glob)
+   7a7d76dc97c57751de9e80f61ed2a639bd03cd24 0 {93418d2c0979643ad446f621195e78720edb05b4} (*) {'user': 'test'} (glob)
+   22619daeed78036f80fbd326b6852519c4f0c25e bede829dd2d3b2ae9bf198c23432b250dc964458 0 (*) {'user': 'test'} (glob)
+  +7a7552255fb5f8bd745e46fba6f0ca633a4dd716 65095d7d0dd5e4f15503bb7b1f433a5fe9bac052 0 (*) {'user': 'test'} (glob)
   [1]
+
+
+
   $ glog
-  @  9:5e819fbb0d27@default(draft) addc
+  @  9:65095d7d0dd5@default(draft) addc
   |
-  o  8:6bf44048e43f@default(draft) addb
+  o  8:bede829dd2d3@default(draft) addb
   |
-  o  7:f5ff10856e5a@default(draft) adda
+  o  7:005fe5914f78@default(draft) adda
   |
   o  0:c471ef929e6a@default(draft) addroot
   
-  $ hg stabilize -v
-  no unstable changeset
+  $ hg evolve -v
+  no troubled changesets
   [1]
 
 Test behaviour with --any
@@ -129,43 +138,47 @@
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   $ echo b >> b
   $ hg amend
-  1 new unstables changesets
+  1 new unstable changesets
   $ glog
-  @  11:4e7cec6b4afe@default(draft) addb
+  @  11:036cf654e942@default(draft) addb
   |
-  | o  9:5e819fbb0d27@default(draft) addc
+  | o  9:65095d7d0dd5@default(draft) addc
   | |
-  | o  8:6bf44048e43f@default(draft) addb
+  | x  8:bede829dd2d3@default(draft) addb
   |/
-  o  7:f5ff10856e5a@default(draft) adda
+  o  7:005fe5914f78@default(draft) adda
   |
   o  0:c471ef929e6a@default(draft) addroot
   
   $ hg up 9
   2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  $ hg stabilize -v
-  nothing to stabilize here
-  (1 unstable changesets, do you want --any ?)
+  $ hg evolve -v
+  nothing to evolve here
+  (1 troubled changesets, do you want --any ?)
   [2]
-  $ hg stabilize --any -v
+  $ hg evolve --any -v
   move:[9] addc
   atop:[11] addb
-  hg rebase -Dr 5e819fbb0d27 -d 4e7cec6b4afe
+  hg rebase -r 65095d7d0dd5 -d 036cf654e942
   resolving manifests
   removing c
   getting b
   resolving manifests
   getting c
+  committing files:
   c
+  committing manifest
+  committing changelog
+  working directory is now at e99ecf51c867
   $ glog
-  @  12:24f95816bb21@default(draft) addc
+  @  12:e99ecf51c867@default(draft) addc
   |
-  o  11:4e7cec6b4afe@default(draft) addb
+  o  11:036cf654e942@default(draft) addb
   |
-  o  7:f5ff10856e5a@default(draft) adda
+  o  7:005fe5914f78@default(draft) adda
   |
   o  0:c471ef929e6a@default(draft) addroot
   
-  $ hg stabilize --any -v
-  no unstable changeset
+  $ hg evolve --any -v
+  no troubled changesets
   [1]
--- a/tests/test-stabilize-result.t
+++ b/tests/test-stabilize-result.t
@@ -5,7 +5,6 @@
   > hgext.rebase=
   > hgext.graphlog=
   > EOF
-  $ echo "obsolete=$(echo $(dirname $TESTDIR))/hgext/obsolete.py" >> $HGRCPATH
   $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
 
   $ glog() {
@@ -13,7 +12,7 @@
   >     '{rev}:{node|short}@{branch}({phase}) bk:[{bookmarks}] {desc|firstline}\n' "$@"
   > }
 
-Test stabilize removing the changeset being stabilized
+Test evolve removing the changeset being evolved
 
   $ hg init empty
   $ cd empty
@@ -26,26 +25,346 @@
   $ hg bookmark changea
   $ hg up 1
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  (leaving bookmark changea)
   $ echo a >> a
   $ hg amend -m changea
-  1 new unstables changesets
-  $ hg stabilize -v
+  1 new unstable changesets
+  $ hg evolve -v --confirm
   move:[2] changea
   atop:[4] changea
-  hg rebase -Dr cce2c55b8965 -d 1447e1c4828d
+  perform evolve? [Ny] n
+  abort: evolve aborted by user
+  [255]
+  $ echo y | hg evolve -v --confirm --config ui.interactive=True
+  move:[2] changea
+  atop:[4] changea
+  perform evolve? [Ny] y
+  hg rebase -r cce2c55b8965 -d fb9d051ec0a4
   resolving manifests
   $ glog --hidden
-  @  4:1447e1c4828d@default(draft) bk:[changea] changea
+  @  4:fb9d051ec0a4@default(draft) bk:[changea] changea
   |
-  | o  3:41ad4fe8c795@default(secret) bk:[] amends 102a90ea7b4a3361e4082ed620918c261189a36a
+  | x  3:c5727dbded3c@default(draft) bk:[] temporary amend commit for 102a90ea7b4a
   | |
-  | | o  2:cce2c55b8965@default(secret) bk:[] changea
+  | | x  2:cce2c55b8965@default(draft) bk:[] changea
   | |/
-  | o  1:102a90ea7b4a@default(secret) bk:[] addb
+  | x  1:102a90ea7b4a@default(draft) bk:[] addb
   |/
   o  0:07f494440405@default(draft) bk:[] adda
   
-  $ hg debugsuccessors
-  102a90ea7b4a 1447e1c4828d
-  41ad4fe8c795 1447e1c4828d
-  cce2c55b8965 000000000000
+  $ hg debugobsolete
+  102a90ea7b4a3361e4082ed620918c261189a36a fb9d051ec0a450a4aa2ffc8c324979832ef88065 0 (*) {'user': 'test'} (glob)
+  c5727dbded3c3a6877cf60d6bb552a76812cb844 0 {102a90ea7b4a3361e4082ed620918c261189a36a} (*) {'user': 'test'} (glob)
+  cce2c55b896511e0b6e04173c9450ba822ebc740 0 {102a90ea7b4a3361e4082ed620918c261189a36a} (*) {'user': 'test'} (glob)
+
+Test evolve with conflict
+
+  $ ls
+  a
+  b
+  $ hg pdiff a
+  diff -r 07f494440405 a
+  --- a/a	* (glob)
+  +++ b/a	* (glob)
+  @@ -1,1 +1,2 @@
+   a
+  +a
+  $ echo 'newer a' >> a
+  $ hg ci -m 'newer a'
+  $ hg gdown
+  gdown have been deprecated in favor of previous
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  [4] changea
+  $ echo 'a' > a
+  $ hg amend
+  1 new unstable changesets
+  $ hg evolve
+  move:[5] newer a
+  atop:[7] changea
+  merging a
+  warning: conflicts during merge.
+  merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
+  evolve failed!
+  fix conflict and run "hg evolve --continue" or use "hg update -C" to abort
+  abort: unresolved merge conflicts (see hg help resolve)
+  [255]
+  $ hg revert -r 'unstable()' a
+  $ hg diff
+  diff -r 66719795a494 a
+  --- a/a	* (glob)
+  +++ b/a	* (glob)
+  @@ -1,1 +1,3 @@
+   a
+  +a
+  +newer a
+  $ hg evolve --continue
+  grafting 5:3655f0f50885 "newer a"
+  abort: unresolved merge conflicts (see "hg help resolve")
+  [255]
+  $ hg resolve -m a
+  (no more unresolved files)
+  $ hg evolve --continue
+  grafting 5:3655f0f50885 "newer a"
+
+Stabilize latecomer with different parent
+=========================================
+
+(the same-parent case is handled in test-evolve.t)
+
+  $ glog
+  @  8:1cf0aacfd363@default(draft) bk:[] newer a
+  |
+  o  7:66719795a494@default(draft) bk:[changea] changea
+  |
+  o  0:07f494440405@default(draft) bk:[] adda
+  
+Add another commit
+
+  $ hg gdown
+  gdown have been deprecated in favor of previous
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  [7] changea
+  $ echo 'c' > c
+  $ hg add c
+  $ hg commit -m 'add c'
+  created new head
+
+Get a successors of 8 on it
+
+  $ hg grab 8
+  rebasing 8:1cf0aacfd363 "newer a"
+  ? files updated, 0 files merged, 0 files removed, 0 files unresolved (glob)
+
+Add real change to the successors
+
+  $ echo 'babar' >> a
+  $ hg amend
+
+Make precursors public
+
+  $ hg phase --hidden --public 8
+  1 new bumped changesets
+  $ glog
+  @  12:(73b15c7566e9|d5c7ef82d003)@default\(draft\) bk:\[\] newer a (re)
+  |
+  o  9:7bc2f5967f5e@default(draft) bk:[] add c
+  |
+  | o  8:1cf0aacfd363@default(public) bk:[] newer a
+  |/
+  o  7:66719795a494@default(public) bk:[changea] changea
+  |
+  o  0:07f494440405@default(public) bk:[] adda
+  
+
+Stabilize!
+
+  $ hg evolve --any --dry-run
+  recreate:[12] newer a
+  atop:[8] newer a
+  hg rebase --rev (73b15c7566e9|d5c7ef82d003) --dest 66719795a494; (re)
+  hg update 1cf0aacfd363;
+  hg revert --all --rev (73b15c7566e9|d5c7ef82d003); (re)
+  hg commit --msg "bumped update to %s" (no-eol)
+  $ hg evolve --any --confirm
+  recreate:[12] newer a
+  atop:[8] newer a
+  perform evolve? [Ny] n
+  abort: evolve aborted by user
+  [255]
+  $ echo y | hg evolve --any --confirm --config ui.interactive=True
+  recreate:[12] newer a
+  atop:[8] newer a
+  perform evolve? [Ny] y
+  rebasing to destination parent: 66719795a494
+  computing new diff
+  committed as (a7cabd7bd9c2|671b9d7eeaec) (re)
+  working directory is now at (a7cabd7bd9c2|671b9d7eeaec) (re)
+  $ glog
+  @  14:(a7cabd7bd9c2|671b9d7eeaec)@default\(draft\) bk:\[\] bumped update to 1cf0aacfd363: (re)
+  |
+  | o  9:7bc2f5967f5e@default(draft) bk:[] add c
+  | |
+  o |  8:1cf0aacfd363@default(public) bk:[] newer a
+  |/
+  o  7:66719795a494@default(public) bk:[changea] changea
+  |
+  o  0:07f494440405@default(public) bk:[] adda
+  
+
+Stabilize divergent changesets with same parent
+===============================================
+
+  $ rm a.orig
+  $ hg up 9
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cat << EOF >> a
+  > flore
+  > arthur
+  > zephir
+  > some
+  > less
+  > conflict
+  > EOF
+  $ hg ci -m 'More addition'
+  $ glog
+  @  15:3932c176bbaa@default(draft) bk:[] More addition
+  |
+  | o  14:(a7cabd7bd9c2|671b9d7eeaec)@default\(draft\) bk:\[\] bumped update to 1cf0aacfd363: (re)
+  | |
+  o |  9:7bc2f5967f5e@default(draft) bk:[] add c
+  | |
+  | o  8:1cf0aacfd363@default(public) bk:[] newer a
+  |/
+  o  7:66719795a494@default(public) bk:[changea] changea
+  |
+  o  0:07f494440405@default(public) bk:[] adda
+  
+  $ echo 'babar' >> a
+  $ hg amend
+  $ hg up --hidden 15
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  working directory parent is obsolete!
+  $ mv a a.old
+  $ echo 'jungle' > a
+  $ cat a.old >> a
+  $ rm a.old
+  $ hg amend
+  2 new divergent changesets
+  $ glog
+  @  19:eacc9c8240fe@default(draft) bk:[] More addition
+  |
+  | o  17:d2f173e25686@default(draft) bk:[] More addition
+  |/
+  | o  14:(a7cabd7bd9c2|671b9d7eeaec)@default\(draft\) bk:\[\] bumped update to 1cf0aacfd363: (re)
+  | |
+  o |  9:7bc2f5967f5e@default(draft) bk:[] add c
+  | |
+  | o  8:1cf0aacfd363@default(public) bk:[] newer a
+  |/
+  o  7:66719795a494@default(public) bk:[changea] changea
+  |
+  o  0:07f494440405@default(public) bk:[] adda
+  
+
+Stabilize it
+
+  $ hg evolve -qn --confirm
+  merge:[19] More addition
+  with: [17] More addition
+  base: [15] More addition
+  perform evolve? [Ny] n
+  abort: evolve aborted by user
+  [255]
+  $ echo y | hg evolve -qn --confirm --config ui.interactive=True
+  merge:[19] More addition
+  with: [17] More addition
+  base: [15] More addition
+  perform evolve? [Ny] y
+  hg update -c eacc9c8240fe &&
+  hg merge d2f173e25686 &&
+  hg commit -m "auto merge resolving conflict between eacc9c8240fe and d2f173e25686"&&
+  hg up -C 3932c176bbaa &&
+  hg revert --all --rev tip &&
+  hg commit -m "`hg log -r eacc9c8240fe --template={desc}`";
+  $ hg evolve -v
+  merge:[19] More addition
+  with: [17] More addition
+  base: [15] More addition
+  merging divergent changeset
+  resolving manifests
+  merging a
+  0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+  amending changeset eacc9c8240fe
+  committing files:
+  a
+  committing manifest
+  committing changelog
+  copying changeset 283ccd10e2b8 to 7bc2f5967f5e
+  committing files:
+  a
+  committing manifest
+  committing changelog
+  committed changeset 21:f344982e63c4
+  working directory is now at f344982e63c4
+  $ hg st
+  $ glog
+  @  21:f344982e63c4@default(draft) bk:[] More addition
+  |
+  | o  14:(a7cabd7bd9c2|671b9d7eeaec)@default\(draft\) bk:\[\] bumped update to 1cf0aacfd363: (re)
+  | |
+  o |  9:7bc2f5967f5e@default(draft) bk:[] add c
+  | |
+  | o  8:1cf0aacfd363@default(public) bk:[] newer a
+  |/
+  o  7:66719795a494@default(public) bk:[changea] changea
+  |
+  o  0:07f494440405@default(public) bk:[] adda
+  
+  $ hg summary
+  parent: 21:f344982e63c4 tip
+   More addition
+  branch: default
+  commit: (clean)
+  update: 2 new changesets, 2 branch heads (merge)
+  $ hg export .
+  # HG changeset patch
+  # User test
+  # Date 0 0
+  #      Thu Jan 01 00:00:00 1970 +0000
+  # Node ID f344982e63c462b1e44c0371c804685389e673a9
+  # Parent  7bc2f5967f5e4ed277f60a89b7b04cc5d6407ced
+  More addition
+  
+  diff -r 7bc2f5967f5e -r f344982e63c4 a
+  --- a/a	Thu Jan 01 00:00:00 1970 +0000
+  +++ b/a	Thu Jan 01 00:00:00 1970 +0000
+  @@ -1,1 +1,9 @@
+  +jungle
+   a
+  +flore
+  +arthur
+  +zephir
+  +some
+  +less
+  +conflict
+  +babar
+
+Check conflict during divergence resolution
+-------------------------------------------------
+
+  $ hg up --hidden 15
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  working directory parent is obsolete!
+  $ echo 'gotta break' >> a
+  $ hg amend
+  2 new divergent changesets
+# reamend so that the case is not the first precursor.
+  $ hg amend -m "More addition (2)"
+  $ hg phase 'divergent()'
+  21: draft
+  24: draft
+  $ hg evolve -qn
+  hg update -c 0b336205a5d0 &&
+  hg merge f344982e63c4 &&
+  hg commit -m "auto merge resolving conflict between 0b336205a5d0 and f344982e63c4"&&
+  hg up -C 3932c176bbaa &&
+  hg revert --all --rev tip &&
+  hg commit -m "`hg log -r 0b336205a5d0 --template={desc}`";
+  $ hg evolve
+  merge:[24] More addition (2)
+  with: [21] More addition
+  base: [15] More addition
+  merging a
+  warning: conflicts during merge.
+  merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
+  0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+  use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+  abort: merge conflict between several amendments (this is not automated yet)
+  (/!\ You can try:
+  /!\ * manual merge + resolve => new cset X
+  /!\ * hg up to the parent of the amended changeset (which are named W and Z)
+  /!\ * hg revert --all -r X
+  /!\ * hg ci -m "same message as the amended changeset" => new cset Y
+  /!\ * hg kill -n Y W Z
+  )
+  [255]
new file mode 100644
--- /dev/null
+++ b/tests/test-touch.t
@@ -0,0 +1,111 @@
+
+  $ cat >> $HGRCPATH <<EOF
+  > [ui]
+  > logtemplate={rev}:{node|short} {desc}\n
+  > [defaults]
+  > amend=-d "0 0"
+  > [extensions]
+  > hgext.rebase=
+  > EOF
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+
+  $ hg init repo
+  $ cd repo
+  $ echo A > a
+  $ hg add a
+  $ hg commit -m a
+
+Basic usage
+
+  $ hg log -G
+  @  0:e93df3427f45 a
+  
+  $ hg touch .
+  $ hg log -G
+  @  1:[0-9a-f]{12} a (re)
+  
+
+
+Revive usage
+
+  $ echo A > b
+  $ hg add b
+  $ hg commit -m ab --amend
+  $ hg up --hidden 1
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  working directory parent is obsolete!
+  $ hg log -G
+  o  3:[0-9a-f]{12} ab (re)
+  
+  @  1:[0-9a-f]{12} a (re)
+  
+  $ hg touch .
+  2 new divergent changesets
+  $ hg log -G
+  @  4:[0-9a-f]{12} a (re)
+  
+  o  3:[0-9a-f]{12} ab (re)
+  
+  $ hg prune 3
+  1 changesets pruned
+
+Duplicate
+
+  $ hg touch --duplicate .
+  $ hg log -G
+  @  5:[0-9a-f]{12} a (re)
+  
+  o  4:[0-9a-f]{12} a (re)
+  
+
+Multiple touch
+
+  $ echo C > c
+  $ hg add c
+  $ hg commit -m c
+  $ echo D > d
+  $ hg add d
+  $ hg commit -m d
+  $ hg log -G
+  @  7:[0-9a-f]{12} d (re)
+  |
+  o  6:[0-9a-f]{12} c (re)
+  |
+  o  5:[0-9a-f]{12} a (re)
+  
+  o  4:[0-9a-f]{12} a (re)
+  
+  $ hg touch 6:7
+  $ hg log -G
+  @  9:[0-9a-f]{12} d (re)
+  |
+  o  8:[0-9a-f]{12} c (re)
+  |
+  o  5:[0-9a-f]{12} a (re)
+  
+  o  4:[0-9a-f]{12} a (re)
+  
+
+check move data kept after rebase on touch:
+
+  $ touch gna1
+  $ hg commit -Am gna1
+  adding gna1
+  $ hg mv gna1 gna2
+  $ hg commit -m move
+  $ hg st -C --change=tip
+  A gna2
+    gna1
+  R gna1
+  $ hg up .^
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+  $ hg touch
+  1 new unstable changesets
+
+  $ hg rebase -s 11 -d 12
+  rebasing 11:* "move" (glob)
+  $ hg st -C --change=tip
+  A gna2
+    gna1
+  R gna1
old mode 120000
new mode 100644
--- a/tests/test-tutorial.t
+++ b/tests/test-tutorial.t
@@ -1,1 +1,867 @@
-../docs/tutorials/tutorial.t
\ No newline at end of file
+
+Initial setup
+-------------
+
+This Mercurial configuration example is used for testing.
+.. Various setup
+
+  $ cat >> $HGRCPATH << EOF
+  > [ui]
+  > # This is change the default output of log for clear tutorial
+  > logtemplate ="{node|short} ({phase}): {desc}\n"
+  > [diff]
+  > # use "git" diff format, clearer and smarter format
+  > git = 1
+  > [alias]
+  > # "-d '0 0'" means that the new commit will be at January 1st 1970.
+  > # This is used for stable hash during test
+  > # (this tutorial is automatically tested.)
+  > amend = amend -d '0 0'
+  > EOF
+
+  $ hg init local
+  $ cat >> local/.hg/hgrc << EOF
+  > [paths]
+  > remote = ../remote
+  > other = ../other
+  > [ui]
+  > user = Babar the King
+  > EOF
+
+  $ hg init remote
+  $ cat >> remote/.hg/hgrc << EOF
+  > [paths]
+  > local = ../local
+  > [ui]
+  > user = Celestine the Queen
+  > EOF
+
+  $ hg init other
+  $ cat >> other/.hg/hgrc << EOF
+  > [ui]
+  > user = Princess Flore
+  > EOF
+
+
+This tutorial uses the following configuration for Mercurial:
+
+A compact log template with phase data:
+
+  $ hg showconfig ui | grep log
+  ui.logtemplate="{node|short} ({phase}): {desc}\n"
+
+Improved git format diff:
+
+  $ hg showconfig diff
+  diff.git=1
+
+And of course, we enable the experimental extensions for mutable history:
+
+  $ cat >> $HGRCPATH <<EOF
+  > [extensions]
+  > evolve = $TESTDIR/../hgext/evolve.py
+  > # enabling rebase is also needed for now
+  > rebase =
+  > EOF
+
+-----------------------
+Single Developer Usage
+-----------------------
+
+This tutorial shows how to use evolution to rewrite history locally.
+
+
+Fixing mistake with `hg amend`
+--------------------------------
+
+We are versionning a shopping list
+
+  $ cd local
+  $ cat  >> shopping << EOF
+  > Spam
+  > Whizzo butter
+  > Albatross
+  > Rat (rather a lot)
+  > Jugged fish
+  > Blancmange
+  > Salmon mousse
+  > EOF
+  $ hg commit -A -m "Monthy Python Shopping list"
+  adding shopping
+
+Its first version is shared with the outside.
+
+  $ hg push remote
+  pushing to $TESTTMP/remote (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+
+Later I add additional item to my list
+
+  $ cat >> shopping << EOF
+  > Egg
+  > Suggar
+  > Vinegar
+  > Oil
+  > EOF
+  $ hg commit -m "adding condiment"
+  $ cat >> shopping << EOF
+  > Bananos
+  > Pear
+  > Apple
+  > EOF
+  $ hg commit -m "adding fruit"
+
+This history is very linear
+
+  $ hg log -G
+  @  d85de4546133 (draft): adding fruit
+  |
+  o  4d5dc8187023 (draft): adding condiment
+  |
+  o  7e82d3f3c2cb (public): Monthy Python Shopping list
+  
+
+But a typo was made in Babanas!
+
+  $ hg export tip
+  # HG changeset patch
+  # User test
+  # Date 0 0
+  #      Thu Jan 01 00:00:00 1970 +0000
+  # Node ID d85de4546133030c82d257bbcdd9b1b416d0c31c
+  # Parent  4d5dc81870237d492284826e21840b2ca00e26d1
+  adding fruit
+  
+  diff --git a/shopping b/shopping
+  --- a/shopping
+  +++ b/shopping
+  @@ -9,3 +9,6 @@
+   Suggar
+   Vinegar
+   Oil
+  +Bananos
+  +Pear
+  +Apple
+
+The faulty changeset is in the "draft" phase because it has not been exchanged with
+the outside. The first one has been exchanged and is "public" (immutable).
+
+  $ hg log -G
+  @  d85de4546133 (draft): adding fruit
+  |
+  o  4d5dc8187023 (draft): adding condiment
+  |
+  o  7e82d3f3c2cb (public): Monthy Python Shopping list
+  
+
+hopefully. I can use `hg commit --amend` to rewrite my faulty changeset!
+
+  $ sed -i'' -e s/Bananos/Banana/ shopping
+  $ hg diff
+  diff --git a/shopping b/shopping
+  --- a/shopping
+  +++ b/shopping
+  @@ -9,6 +9,6 @@
+   Suggar
+   Vinegar
+   Oil
+  -Bananos
+  +Banana
+   Pear
+   Apple
+  $ hg commit --amend
+
+A new changeset with the right diff replace the wrong one.
+
+  $ hg log -G
+  @  9d0363b81950 (draft): adding fruit
+  |
+  o  4d5dc8187023 (draft): adding condiment
+  |
+  o  7e82d3f3c2cb (public): Monthy Python Shopping list
+  
+  $ hg export tip
+  # HG changeset patch
+  # User test
+  # Date 0 0
+  #      Thu Jan 01 00:00:00 1970 +0000
+  # Node ID 9d0363b81950646bc6ad1ec5de8b8197ea586541
+  # Parent  4d5dc81870237d492284826e21840b2ca00e26d1
+  adding fruit
+  
+  diff --git a/shopping b/shopping
+  --- a/shopping
+  +++ b/shopping
+  @@ -9,3 +9,6 @@
+   Suggar
+   Vinegar
+   Oil
+  +Banana
+  +Pear
+  +Apple
+
+Getting rid of branchy history
+----------------------------------
+
+While I was working on my list. someone made a change remotly.
+
+  $ cd ../remote
+  $ hg up -q
+  $ sed -i'' -e 's/Spam/Spam Spam Spam/' shopping
+  $ hg ci -m 'SPAM'
+  $ cd ../local
+
+I'll get this remote changeset when pulling
+
+  $ hg pull remote
+  pulling from $TESTTMP/remote (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  pull obsolescence markers
+  (run 'hg heads' to see heads, 'hg merge' to merge)
+
+I now have a new heads. Note that this remote head is immutable
+
+  $ hg log -G
+  o  9ca060c80d74 (public): SPAM
+  |
+  | @  9d0363b81950 (draft): adding fruit
+  | |
+  | o  4d5dc8187023 (draft): adding condiment
+  |/
+  o  7e82d3f3c2cb (public): Monthy Python Shopping list
+  
+
+instead of merging my head with the new one. I'm going to rebase my work
+
+  $ hg diff
+  $ hg rebase --dest 9ca060c80d74 --source 4d5dc8187023
+  rebasing 1:4d5dc8187023 "adding condiment"
+  merging shopping
+  rebasing 4:9d0363b81950 "adding fruit"
+  merging shopping
+
+
+My local work is now rebased on the remote one.
+
+  $ hg log -G
+  @  41aff6a42b75 (draft): adding fruit
+  |
+  o  dfd3a2d7691e (draft): adding condiment
+  |
+  o  9ca060c80d74 (public): SPAM
+  |
+  o  7e82d3f3c2cb (public): Monthy Python Shopping list
+  
+
+Removing changesets
+------------------------
+
+I add new item to my list
+
+  $ cat >> shopping << EOF
+  > car
+  > bus
+  > plane
+  > boat
+  > EOF
+  $ hg ci -m 'transport'
+  $ hg log -G
+  @  1125e39fbf21 (draft): transport
+  |
+  o  41aff6a42b75 (draft): adding fruit
+  |
+  o  dfd3a2d7691e (draft): adding condiment
+  |
+  o  9ca060c80d74 (public): SPAM
+  |
+  o  7e82d3f3c2cb (public): Monthy Python Shopping list
+  
+
+I have a new commit but I realize that don't want it. (transport shop list does
+not fit well in my standard shopping list)
+
+  $ hg prune . # "." is for working directory parent
+  1 changesets pruned
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  working directory now at 41aff6a42b75
+
+The silly changeset is gone.
+
+  $ hg log -G
+  @  41aff6a42b75 (draft): adding fruit
+  |
+  o  dfd3a2d7691e (draft): adding condiment
+  |
+  o  9ca060c80d74 (public): SPAM
+  |
+  o  7e82d3f3c2cb (public): Monthy Python Shopping list
+  
+
+Reordering changesets
+------------------------
+
+
+We create two changesets.
+
+
+  $ cat >> shopping << EOF
+  > Shampoo
+  > Toothbrush
+  > ... More bathroom stuff to come
+  > Towel
+  > Soap
+  > EOF
+  $ hg ci -m 'bathroom stuff' -q # XXX remove the -q
+
+  $ sed -i'' -e 's/Spam/Spam Spam Spam/g' shopping
+  $ hg ci -m 'SPAM SPAM'
+  $ hg log -G
+  @  fac207dec9f5 (draft): SPAM SPAM
+  |
+  o  10b8aeaa8cc8 (draft): bathroom stuff
+  |
+  o  41aff6a42b75 (draft): adding fruit
+  |
+  o  dfd3a2d7691e (draft): adding condiment
+  |
+  o  9ca060c80d74 (public): SPAM
+  |
+  o  7e82d3f3c2cb (public): Monthy Python Shopping list
+  
+
+.. note:: We can't amend changeset 7e82d3f3c2cb or 9ca060c80d74 as they are immutable.
+
+ I now want to push to remote all my changes except the bathroom one, which I'm
+ not totally happy with yet. To be able to push "SPAM SPAM" I need a version of
+ "SPAM SPAM" which is not a child of "bathroom stuff"
+
+You can use the 'grab' alias for that.
+
+.. note: grab is an alias for `hg rebase --dest . --rev <target>; hg up <there>`
+
+  $ hg up 'p1(10b8aeaa8cc8)' # going on "bathroom stuff" parent
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg grab fac207dec9f5 # moving "SPAM SPAM" to the working directory parent
+  rebasing 10:fac207dec9f5 "SPAM SPAM" (tip)
+  merging shopping
+  ? files updated, 0 files merged, 0 files removed, 0 files unresolved (glob)
+  $ hg log -G
+  @  a224f2a4fb9f (draft): SPAM SPAM
+  |
+  | o  10b8aeaa8cc8 (draft): bathroom stuff
+  |/
+  o  41aff6a42b75 (draft): adding fruit
+  |
+  o  dfd3a2d7691e (draft): adding condiment
+  |
+  o  9ca060c80d74 (public): SPAM
+  |
+  o  7e82d3f3c2cb (public): Monthy Python Shopping list
+  
+
+We have a new SPAM SPAM version without the bathroom stuff
+
+  $ grep Spam shopping  # enough spam
+  Spam Spam Spam Spam Spam Spam Spam Spam Spam
+  $ grep Toothbrush shopping # no Toothbrush
+  [1]
+  $ hg export .
+  # HG changeset patch
+  # User test
+  # Date 0 0
+  #      Thu Jan 01 00:00:00 1970 +0000
+  # Node ID a224f2a4fb9f9f828f608959912229d7b38b26de
+  # Parent  41aff6a42b7578ec7ec3cb2041633f1ca43cca96
+  SPAM SPAM
+  
+  diff --git a/shopping b/shopping
+  --- a/shopping
+  +++ b/shopping
+  @@ -1,4 +1,4 @@
+  -Spam Spam Spam
+  +Spam Spam Spam Spam Spam Spam Spam Spam Spam
+   Whizzo butter
+   Albatross
+   Rat (rather a lot)
+
+To make sure I do not push unready changeset by mistake I set the "bathroom
+stuff" changeset in the secret phase.
+
+  $ hg phase --force --secret 10b8aeaa8cc8
+
+we can now push our change:
+
+  $ hg push remote
+  pushing to $TESTTMP/remote (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 3 changesets with 3 changes to 1 files
+  pushing 6 obsolescence markers (* bytes) (glob)
+  6 obsolescence markers added
+
+for simplicity sake we get the bathroom change in line again
+
+  $ hg grab 10b8aeaa8cc8
+  rebasing 9:10b8aeaa8cc8 "bathroom stuff"
+  merging shopping
+  ? files updated, 0 files merged, 0 files removed, 0 files unresolved (glob)
+  $ hg phase --draft .
+  $ hg log -G
+  @  75954b8cd933 (draft): bathroom stuff
+  |
+  o  a224f2a4fb9f (public): SPAM SPAM
+  |
+  o  41aff6a42b75 (public): adding fruit
+  |
+  o  dfd3a2d7691e (public): adding condiment
+  |
+  o  9ca060c80d74 (public): SPAM
+  |
+  o  7e82d3f3c2cb (public): Monthy Python Shopping list
+  
+
+
+
+Splitting change
+------------------
+
+This part is not written yet, but you can use either the `histedit` extension
+of the `uncommit` command to splitting a change.
+
+  $ hg help uncommit
+  hg uncommit [OPTION]... [NAME]
+  
+  move changes from parent revision to working directory
+  
+      Changes to selected files in the checked out revision appear again as
+      uncommitted changed in the working directory. A new revision without the
+      selected changes is created, becomes the checked out revision, and
+      obsoletes the previous one.
+  
+      The --include option specifies patterns to uncommit. The --exclude option
+      specifies patterns to keep in the commit.
+  
+      The --rev argument let you change the commit file to a content of another
+      revision. It still does not change the content of your file in the working
+      directory.
+  
+      Return 0 if changed files are uncommitted.
+  
+  options ([+] can be repeated):
+  
+   -a --all                 uncommit all changes when no arguments given
+   -r --rev VALUE           revert commit content to REV instead
+   -I --include PATTERN [+] include names matching the given patterns
+   -X --exclude PATTERN [+] exclude names matching the given patterns
+  
+  (some details hidden, use --verbose to show complete help)
+
+
+The edit command of histedit can be used to split changeset:
+
+
+Collapsing change
+------------------
+
+The tutorial part is not written yet but can use `hg fold`:
+
+  $ hg help fold
+  hg fold [OPTION]... [-r] REV
+  
+  aliases: squash
+  
+  fold multiple revisions into a single one
+  
+      Folds a set of revisions with the parent of the working directory. All
+      revisions linearly between the given revisions and the parent of the
+      working directory will also be folded.
+  
+      Use --exact for folding only the specified revisions while ignoring the
+      parent of the working directory. In this case, the given revisions must
+      form a linear unbroken chain.
+  
+  options ([+] can be repeated):
+  
+   -r --rev VALUE [+] revision to fold
+      --exact         only fold specified revisions
+   -m --message TEXT  use text as commit message
+   -l --logfile FILE  read commit message from file
+   -d --date DATE     record the specified date as commit date
+   -u --user USER     record the specified user as committer
+  
+  (some details hidden, use --verbose to show complete help)
+
+
+-----------------------
+Collaboration
+-----------------------
+
+
+sharing mutable changesets
+----------------------------
+
+To share mutable changesets with others, just check that the repo you interact
+with is "not publishing". Otherwise you will get the previously observe
+behavior where exchanged changeset are automatically published.
+
+  $ cd ../remote
+  $ hg -R ../local/ showconfig phases
+  [1]
+
+the localrepo does not have any specific configuration for `phases.publish`. It
+is ``true`` by default.
+
+  $ hg pull local
+  pulling from $TESTTMP/local (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  pull obsolescence markers
+  1 obsolescence markers added
+  (run 'hg update' to get a working copy)
+  $ hg log -G
+  o  75954b8cd933 (public): bathroom stuff
+  |
+  o  a224f2a4fb9f (public): SPAM SPAM
+  |
+  o  41aff6a42b75 (public): adding fruit
+  |
+  o  dfd3a2d7691e (public): adding condiment
+  |
+  @  9ca060c80d74 (public): SPAM
+  |
+  o  7e82d3f3c2cb (public): Monthy Python Shopping list
+  
+
+
+
+We do not want to publish the "bathroom changeset". Let's rollback the last transaction.
+
+.. Warning: Rollback is actually a dangerous kind of internal command that is deprecated and should not be exposed to user. Please forget you read about it until someone fix this tutorial.
+
+  $ hg rollback
+  repository tip rolled back to revision 4 (undo pull)
+  $ hg log -G
+  o  a224f2a4fb9f (public): SPAM SPAM
+  |
+  o  41aff6a42b75 (public): adding fruit
+  |
+  o  dfd3a2d7691e (public): adding condiment
+  |
+  @  9ca060c80d74 (public): SPAM
+  |
+  o  7e82d3f3c2cb (public): Monthy Python Shopping list
+  
+
+Let's make the local repo "non publishing"
+
+  $ echo '[phases]' >> ../local/.hg/hgrc
+  $ echo 'publish=false' >> ../local/.hg/hgrc
+  $ echo '[phases]' >> .hg/hgrc
+  $ echo 'publish=false' >> .hg/hgrc
+  $ hg showconfig phases
+  phases.publish=false
+  $ hg -R ../local/ showconfig phases
+  phases.publish=false
+
+
+I can now exchange mutable changeset between "remote" and "local" repository.
+
+  $ hg pull local
+  pulling from $TESTTMP/local (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  pull obsolescence markers
+  1 obsolescence markers added
+  (run 'hg update' to get a working copy)
+  $ hg log -G
+  o  75954b8cd933 (draft): bathroom stuff
+  |
+  o  a224f2a4fb9f (public): SPAM SPAM
+  |
+  o  41aff6a42b75 (public): adding fruit
+  |
+  o  dfd3a2d7691e (public): adding condiment
+  |
+  @  9ca060c80d74 (public): SPAM
+  |
+  o  7e82d3f3c2cb (public): Monthy Python Shopping list
+  
+
+Rebasing unstable change after pull
+----------------------------------------------
+
+Remotely someone add a new changeset on top of the mutable "bathroom" on.
+
+  $ hg up 75954b8cd933 -q
+  $ cat >> shopping << EOF
+  > Giraffe
+  > Rhino
+  > Lion
+  > Bear
+  > EOF
+  $ hg ci -m 'animals'
+
+But at the same time, locally, this same "bathroom changeset" was updated.
+
+  $ cd ../local
+  $ hg up 75954b8cd933 -q
+  $ sed -i'' -e 's/... More bathroom stuff to come/Bath Robe/' shopping
+  $ hg commit --amend
+  $ hg log -G
+  @  a44c85f957d3 (draft): bathroom stuff
+  |
+  o  a224f2a4fb9f (public): SPAM SPAM
+  |
+  o  41aff6a42b75 (public): adding fruit
+  |
+  o  dfd3a2d7691e (public): adding condiment
+  |
+  o  9ca060c80d74 (public): SPAM
+  |
+  o  7e82d3f3c2cb (public): Monthy Python Shopping list
+  
+
+
+When we pull from remote again we get an unstable state!
+
+  $ hg pull remote
+  pulling from $TESTTMP/remote (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  pull obsolescence markers
+  0 obsolescence markers added
+  (run 'hg heads' to see heads, 'hg merge' to merge)
+  1 new unstable changesets
+
+
+The new changeset "animal" is based on an old changeset of "bathroom". You can
+see both version showing up in the log.
+
+  $ hg log -G
+  o  bf1b0d202029 (draft): animals
+  |
+  | @  a44c85f957d3 (draft): bathroom stuff
+  | |
+  x |  75954b8cd933 (draft): bathroom stuff
+  |/
+  o  a224f2a4fb9f (public): SPAM SPAM
+  |
+  o  41aff6a42b75 (public): adding fruit
+  |
+  o  dfd3a2d7691e (public): adding condiment
+  |
+  o  9ca060c80d74 (public): SPAM
+  |
+  o  7e82d3f3c2cb (public): Monthy Python Shopping list
+  
+
+The older version 75954b8cd933 never ceased to exist in the local repo. It was
+just hidden and excluded from pull and push.
+
+.. note:: In hgview there is a nice dotted relation highlighting a44c85f957d3 as a new version of 75954b8cd933. this is not yet ported to ``hg log -G``.
+
+There is now an **unstable** changeset in this history. Mercurial will refuse to
+share it with the outside:
+
+  $ hg push other
+  pushing to $TESTTMP/other (glob)
+  searching for changes
+  abort: push includes unstable changeset: bf1b0d202029!
+  (use 'hg evolve' to get a stable history or --force to ignore warnings)
+  [255]
+ 
+
+
+
+To resolve this unstable state, you need to rebase bf1b0d202029 onto
+a44c85f957d3. The `hg evolve` command will do this for you.
+
+It has a --dry-run option to only suggest the next move.
+
+  $ hg evolve --dry-run
+  move:[15] animals
+  atop:[14] bathroom stuff
+  hg rebase -r bf1b0d202029 -d a44c85f957d3
+
+Let's do it
+
+  $ hg evolve
+  move:[15] animals
+  atop:[14] bathroom stuff
+  merging shopping
+  working directory is now at ee942144f952
+
+The old version of bathroom is hidden again.
+
+  $ hg log -G
+  @  ee942144f952 (draft): animals
+  |
+  o  a44c85f957d3 (draft): bathroom stuff
+  |
+  o  a224f2a4fb9f (public): SPAM SPAM
+  |
+  o  41aff6a42b75 (public): adding fruit
+  |
+  o  dfd3a2d7691e (public): adding condiment
+  |
+  o  9ca060c80d74 (public): SPAM
+  |
+  o  7e82d3f3c2cb (public): Monthy Python Shopping list
+  
+
+
+We can push this evolution to remote
+
+  $ hg push remote
+  pushing to $TESTTMP/remote (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 2 changes to 1 files (+1 heads)
+  pushing 10 obsolescence markers (* bytes) (glob)
+  3 obsolescence markers added
+
+remote get a warning that current working directory is based on an obsolete changeset
+
+  $ cd ../remote
+  $ hg pull local # we up again to trigger the warning. it was displayed during the push
+  pulling from $TESTTMP/local (glob)
+  searching for changes
+  no changes found
+  pull obsolescence markers
+  0 obsolescence markers added
+  working directory parent is obsolete!
+
+now let's see where we are, and update to the successor
+
+  $ hg parents
+  bf1b0d202029 (draft): animals
+  working directory parent is obsolete!
+  $ hg evolve
+  update:[8] animals
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  working directory is now at ee942144f952
+
+Relocating unstable change after prune
+----------------------------------------------
+
+The remote guy keep working
+
+  $ sed -i'' -e 's/Spam/Spam Spam Spam Spam/g' shopping
+  $ hg commit -m "SPAM SPAM SPAM"
+
+I'm pulling its work locally.
+
+  $ cd ../local
+  $ hg pull remote
+  pulling from $TESTTMP/remote (glob)
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  pull obsolescence markers
+  0 obsolescence markers added
+  (run 'hg update' to get a working copy)
+  $ hg log -G
+  o  99f039c5ec9e (draft): SPAM SPAM SPAM
+  |
+  @  ee942144f952 (draft): animals
+  |
+  o  a44c85f957d3 (draft): bathroom stuff
+  |
+  o  a224f2a4fb9f (public): SPAM SPAM
+  |
+  o  41aff6a42b75 (public): adding fruit
+  |
+  o  dfd3a2d7691e (public): adding condiment
+  |
+  o  9ca060c80d74 (public): SPAM
+  |
+  o  7e82d3f3c2cb (public): Monthy Python Shopping list
+  
+
+In the mean time I noticed you can't buy animals in a super market and I prune the animal changeset:
+
+  $ hg prune ee942144f952
+  1 changesets pruned
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  working directory now at a44c85f957d3
+  1 new unstable changesets
+
+
+The animals changeset is still displayed because the "SPAM SPAM SPAM" changeset
+is neither dead or obsolete.  My repository is in an unstable state again.
+
+  $ hg log -G
+  o  99f039c5ec9e (draft): SPAM SPAM SPAM
+  |
+  x  ee942144f952 (draft): animals
+  |
+  @  a44c85f957d3 (draft): bathroom stuff
+  |
+  o  a224f2a4fb9f (public): SPAM SPAM
+  |
+  o  41aff6a42b75 (public): adding fruit
+  |
+  o  dfd3a2d7691e (public): adding condiment
+  |
+  o  9ca060c80d74 (public): SPAM
+  |
+  o  7e82d3f3c2cb (public): Monthy Python Shopping list
+  
+
+  $ hg log -r 'unstable()'
+  99f039c5ec9e (draft): SPAM SPAM SPAM
+
+  $ hg evolve
+  move:[17] SPAM SPAM SPAM
+  atop:[14] bathroom stuff
+  merging shopping
+  working directory is now at 40aa40daeefb
+
+  $ hg log -G
+  @  40aa40daeefb (draft): SPAM SPAM SPAM
+  |
+  o  a44c85f957d3 (draft): bathroom stuff
+  |
+  o  a224f2a4fb9f (public): SPAM SPAM
+  |
+  o  41aff6a42b75 (public): adding fruit
+  |
+  o  dfd3a2d7691e (public): adding condiment
+  |
+  o  9ca060c80d74 (public): SPAM
+  |
+  o  7e82d3f3c2cb (public): Monthy Python Shopping list
+  
+
+
+Handling Divergent amend
+----------------------------------------------
+
+We can detect that multiple diverging amendments have been made.
+The `evolve` command can solve this situation. But all corner case are not
+handled now.
+
+This section needs to be written.
--- a/tests/test-uncommit.t
+++ b/tests/test-uncommit.t
@@ -1,9 +1,7 @@
   $ cat >> $HGRCPATH <<EOF
   > [extensions]
-  > hgext.rebase=
   > hgext.graphlog=
   > EOF
-  $ echo "obsolete=$(echo $(dirname $TESTDIR))/hgext/obsolete.py" >> $HGRCPATH
   $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
 
   $ glog() {
@@ -153,6 +151,7 @@
 
   $ hg uncommit
   abort: nothing to uncommit
+  (use --all to uncommit all files)
   [255]
   $ hg bookmarks
    * touncommit-bm             3:5eb72dbe0cb4
@@ -163,6 +162,7 @@
 
   $ hg uncommit --include nothere
   abort: nothing to uncommit
+  (use --all to uncommit all files)
   [255]
 
 Enjoy uncommit
@@ -220,7 +220,7 @@
   $ glog --hidden
   @  4:e8db4aa611f6@bar(stable/draft) touncommit
   |
-  | o  3:5eb72dbe0cb4@bar(extinct/secret) touncommit
+  | x  3:5eb72dbe0cb4@bar(extinct/draft) touncommit
   |/
   o    2:f63b90038565@default(stable/draft) merge
   |\
@@ -232,17 +232,18 @@
    * touncommit-bm             4:e8db4aa611f6
      touncommit-bm-inactive    4:e8db4aa611f6
      unrelated                 2:f63b90038565
-  $ hg debugsuccessors
-  5eb72dbe0cb4 e8db4aa611f6
+  $ hg debugobsolete
+  5eb72dbe0cb409d094e3b4ae8eaa30071c1b8730 e8db4aa611f6d5706374288e6898e498f5c44098 0 (*) {'user': 'test'} (glob)
 
 Test phase is preserved, no local changes
 
-  $ hg up -C 3
+  $ hg up -C 3 --hidden
   8 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  Working directory parent is obsolete
+  (leaving bookmark touncommit-bm)
+  working directory parent is obsolete!
   $ hg --config extensions.purge= purge
   $ hg uncommit -I 'set:added() and e'
-  2 new conflictings changesets
+  2 new divergent changesets
   $ hg st --copies
   A e
   $ hg st --copies --change .
@@ -263,11 +264,11 @@
   R m
   R n
   $ glog --hidden
-  @  5:c706fe2c12f8@bar(stable/secret) touncommit
+  @  5:c706fe2c12f8@bar(stable/draft) touncommit
   |
   | o  4:e8db4aa611f6@bar(stable/draft) touncommit
   |/
-  | o  3:5eb72dbe0cb4@bar(extinct/secret) touncommit
+  | x  3:5eb72dbe0cb4@bar(extinct/draft) touncommit
   |/
   o    2:f63b90038565@default(stable/draft) merge
   |\
@@ -275,18 +276,18 @@
   |
   o  0:07f494440405@default(stable/draft) adda
   
-  $ hg debugsuccessors
-  5eb72dbe0cb4 c706fe2c12f8
-  5eb72dbe0cb4 e8db4aa611f6
+  $ hg debugobsolete
+  5eb72dbe0cb409d094e3b4ae8eaa30071c1b8730 e8db4aa611f6d5706374288e6898e498f5c44098 0 (*) {'user': 'test'} (glob)
+  5eb72dbe0cb409d094e3b4ae8eaa30071c1b8730 c706fe2c12f83ba5010cb60ea6af3bd1f0c2d6d3 0 (*) {'user': 'test'} (glob)
 
 Test --all
 
-  $ hg up -C 3
+  $ hg up -C 3 --hidden
   2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  Working directory parent is obsolete
+  working directory parent is obsolete!
   $ hg --config extensions.purge= purge
   $ hg uncommit --all -X e
-  1 new conflictings changesets
+  1 new divergent changesets
   $ hg st --copies
   M b
   M d
@@ -308,29 +309,54 @@
   $ hg st --copies --change .
   A e
 
-  $ hg debugsuccessors
-  5eb72dbe0cb4 c4cbebac3751
-  5eb72dbe0cb4 c706fe2c12f8
-  5eb72dbe0cb4 e8db4aa611f6
+  $ hg debugobsolete
+  5eb72dbe0cb409d094e3b4ae8eaa30071c1b8730 e8db4aa611f6d5706374288e6898e498f5c44098 0 (*) {'user': 'test'} (glob)
+  5eb72dbe0cb409d094e3b4ae8eaa30071c1b8730 c706fe2c12f83ba5010cb60ea6af3bd1f0c2d6d3 0 (*) {'user': 'test'} (glob)
+  5eb72dbe0cb409d094e3b4ae8eaa30071c1b8730 c4cbebac3751269bdf12d1466deabcc78521d272 0 (*) {'user': 'test'} (glob)
 
 Display a warning if nothing left
 
   $ hg uncommit e
   new changeset is empty
-  (use "hg kill ." to remove it)
-  $ hg debugsuccessors
-  5eb72dbe0cb4 c4cbebac3751
-  5eb72dbe0cb4 c706fe2c12f8
-  5eb72dbe0cb4 e8db4aa611f6
-  c4cbebac3751 4f1c269eab68
+  (use "hg prune ." to remove it)
+  $ hg debugobsolete
+  5eb72dbe0cb409d094e3b4ae8eaa30071c1b8730 e8db4aa611f6d5706374288e6898e498f5c44098 0 (*) {'user': 'test'} (glob)
+  5eb72dbe0cb409d094e3b4ae8eaa30071c1b8730 c706fe2c12f83ba5010cb60ea6af3bd1f0c2d6d3 0 (*) {'user': 'test'} (glob)
+  5eb72dbe0cb409d094e3b4ae8eaa30071c1b8730 c4cbebac3751269bdf12d1466deabcc78521d272 0 (*) {'user': 'test'} (glob)
+  c4cbebac3751269bdf12d1466deabcc78521d272 4f1c269eab68720f54e88ce3c1dc02b2858b6b89 0 (*) {'user': 'test'} (glob)
 
 Test instability warning
 
   $ hg ci -m touncommit
   $ echo unrelated > unrelated
   $ hg ci -Am addunrelated unrelated
-  $ hg gdown
+  $ hg previous
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   [8] touncommit
   $ hg uncommit aa
-  1 new unstables changesets
+  1 new unstable changesets
+
+Test uncommiting agains a different base
+
+  $ hg cat b --rev .
+  b
+  b
+  $ hg cat b --rev .^
+  b
+  $ hg cat b --rev 0
+  b: no such file in rev 07f494440405
+  [1]
+  $ hg uncommit --rev . b
+  abort: cannot uncommit to parent changeset
+  [255]
+  $ hg uncommit --rev 0 b
+  $ hg cat b --rev .
+  b: no such file in rev 5b27f6b17da2
+  [1]
+
+Test uncommiting precursors
+
+  $ hg uncommit --hidden --rev 'precursors(.)' b
+  $ hg cat b --rev .
+  b
+  b
new file mode 100644
--- /dev/null
+++ b/tests/test-userguide.t
@@ -0,0 +1,319 @@
+ensure that all the scenarios in the user guide work as documented
+
+basic repo
+  $ hg init t
+  $ cd t
+  $ touch file1.c file2.c
+  $ hg -q commit -A -m init
+
+example 1: commit creates a changeset in draft phase
+(this is nothing to do with evolve, but it's mentioned in the user guide)
+  $ echo 'feature Y' >> file1.c
+  $ hg commit -u alice -d '0 0' -m 'implement feature X'
+  $ hg phase -r .
+  1: draft
+  $ hg identify -in
+  6e725fd2be6f 1
+
+example 2: unsafe amend with plain vanilla Mercurial: the original
+commit is stripped
+  $ hg commit --amend -u alice -d '1 0' -m 'implement feature Y'
+  saved backup bundle to $TESTTMP/t/.hg/strip-backup/6e725fd2be6f-42cc74d4-amend-backup.hg (glob)
+  $ hg log -r 23fe4ac6d3f1
+  abort: unknown revision '23fe4ac6d3f1'!
+  [255]
+  $ hg identify -in
+  fe0ecd3bd2a4 1
+
+enable evolve for safe history modification
+  $ cat >> $HGRCPATH <<EOF
+  > [alias]
+  > shortlog = log --template '{rev}:{node|short}  {phase}  {desc|firstline}\n'
+  > [extensions]
+  > rebase =
+  > EOF
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+
+example 3: safe amend with "hg commit --amend" (figure 2)
+  $ echo 'tweak feature Y' >> file1.c
+  $ hg commit --amend -u alice -d '2 0' -m 'implement feature Y'
+  $ hg shortlog -q -r fe0ecd3bd2a4
+  abort: hidden revision 'fe0ecd3bd2a4'!
+  (use --hidden to access hidden revisions)
+  [255]
+  $ hg --hidden shortlog -G
+  @  3:934359450037  draft  implement feature Y
+  |
+  | x  2:6c5f78d5d467  draft  temporary amend commit for fe0ecd3bd2a4
+  | |
+  | x  1:fe0ecd3bd2a4  draft  implement feature Y
+  |/
+  o  0:08c4b6f4efc8  draft  init
+  
+example 3 redux: repeat safe amend, this time with "hg amend"
+  $ hg rollback -q
+  $ hg amend -u alice -d '2 0' -m 'implement feature Y'
+  $ hg --hidden shortlog -G
+  @  3:934359450037  draft  implement feature Y
+  |
+  | x  2:6c5f78d5d467  draft  temporary amend commit for fe0ecd3bd2a4
+  | |
+  | x  1:fe0ecd3bd2a4  draft  implement feature Y
+  |/
+  o  0:08c4b6f4efc8  draft  init
+  
+example 4: prune at head (figure 3)
+  $ echo 'debug hack' >> file1.c
+  $ hg commit -m 'debug hack'
+  $ hg prune .
+  1 changesets pruned
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  working directory now at 934359450037
+  $ hg parents --template '{rev}:{node|short}  {desc|firstline}\n'
+  3:934359450037  implement feature Y
+  $ hg --hidden shortlog -G -r 3:
+  x  4:a3e0ef24aaf0  draft  debug hack
+  |
+  @  3:934359450037  draft  implement feature Y
+  |
+
+example 5: uncommit files at head (figure 4)
+  $ echo 'relevant' >> file1.c
+  $ echo 'irrelevant' >> file2.c
+  $ hg commit -u dan -d '10 0' -m 'fix bug 234'
+  $ hg uncommit file2.c
+  $ hg status
+  M file2.c
+  $ hg --hidden shortlog -G -r 'descendants(3) - 4'
+  @  6:c8defeecf7a4  draft  fix bug 234
+  |
+  | x  5:da4331967f5f  draft  fix bug 234
+  |/
+  o  3:934359450037  draft  implement feature Y
+  |
+  $ hg parents --template '{rev}:{node|short}  {desc|firstline}\n{files}\n'
+  6:c8defeecf7a4  fix bug 234
+  file1.c
+  $ hg revert --no-backup file2.c
+
+example 6: fold multiple changesets together into one (figure 5)
+  $ echo step1 >> file1.c
+  $ hg commit -m 'step 1'
+  $ echo step2 >> file1.c
+  $ hg commit -m 'step 2'
+  $ echo step3 >> file2.c
+  $ hg commit -m 'step 3'
+  $ hg log --template '{rev}:{node|short}  {desc|firstline}\n' -r 7::
+  7:05e61aab8294  step 1
+  8:be6d5bc8e4cc  step 2
+  9:35f432d9f7c1  step 3
+  $ hg fold -d '0 0' -m 'fix bug 64' -r 7::
+  3 changesets folded
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg --hidden shortlog -G -r 6::
+  @  10:171c6a79a27b  draft  fix bug 64
+  |
+  | x  9:35f432d9f7c1  draft  step 3
+  | |
+  | x  8:be6d5bc8e4cc  draft  step 2
+  | |
+  | x  7:05e61aab8294  draft  step 1
+  |/
+  o  6:c8defeecf7a4  draft  fix bug 234
+  |
+  $ hg --hidden log -q -r 'successors(7) | successors(8) | successors(9)'
+  10:171c6a79a27b
+  $ hg --hidden log -q -r 'precursors(10)'
+  7:05e61aab8294
+  8:be6d5bc8e4cc
+  9:35f432d9f7c1
+  $ hg diff -c 10 -U 0
+  diff -r c8defeecf7a4 -r 171c6a79a27b file1.c
+  --- a/file1.c	Thu Jan 01 00:00:10 1970 +0000
+  +++ b/file1.c	Thu Jan 01 00:00:00 1970 +0000
+  @@ -3,0 +4,2 @@
+  +step1
+  +step2
+  diff -r c8defeecf7a4 -r 171c6a79a27b file2.c
+  --- a/file2.c	Thu Jan 01 00:00:10 1970 +0000
+  +++ b/file2.c	Thu Jan 01 00:00:00 1970 +0000
+  @@ -0,0 +1,1 @@
+  +step3
+
+setup for example 7: amend an older changeset
+  $ echo 'fix fix oops fix' > file2.c
+  $ hg commit -u bob -d '3 0' -m 'fix bug 17'
+  $ echo 'cleanup' >> file1.c
+  $ hg commit -u bob -d '4 0' -m 'cleanup'
+  $ echo 'new feature' >> file1.c
+  $ hg commit -u bob -d '5 0' -m 'feature 23'
+  $ hg --hidden shortlog -G -r 10::
+  @  13:dadcbba2d606  draft  feature 23
+  |
+  o  12:debd46bb29dc  draft  cleanup
+  |
+  o  11:3e1cb8f70c02  draft  fix bug 17
+  |
+  o  10:171c6a79a27b  draft  fix bug 64
+  |
+
+example 7: amend an older changeset (figures 6, 7)
+  $ hg update -q 11
+  $ echo 'fix fix fix fix' > file2.c
+  $ hg amend -u bob -d '6 0'
+  2 new unstable changesets
+  $ hg shortlog -r 'obsolete()'
+  11:3e1cb8f70c02  draft  fix bug 17
+  $ hg shortlog -r 'unstable()'
+  12:debd46bb29dc  draft  cleanup
+  13:dadcbba2d606  draft  feature 23
+  $ hg --hidden shortlog -G -r 10::
+  @  15:395cbeda3a06  draft  fix bug 17
+  |
+  | x  14:f7fab707e247  draft  temporary amend commit for 3e1cb8f70c02
+  | |
+  | | o  13:dadcbba2d606  draft  feature 23
+  | | |
+  | | o  12:debd46bb29dc  draft  cleanup
+  | |/
+  | x  11:3e1cb8f70c02  draft  fix bug 17
+  |/
+  o  10:171c6a79a27b  draft  fix bug 64
+  |
+  $ hg evolve -q --all
+  $ hg shortlog -G -r 10::
+  @  17:91b4b0f8b5c5  draft  feature 23
+  |
+  o  16:fe8858bd9bc2  draft  cleanup
+  |
+  o  15:395cbeda3a06  draft  fix bug 17
+  |
+  o  10:171c6a79a27b  draft  fix bug 64
+  |
+
+setup for example 8: prune an older changeset (figure 8)
+  $ echo 'useful' >> file1.c
+  $ hg commit -u carl -d '7 0' -m 'useful work'
+  $ echo 'debug' >> file2.c
+  $ hg commit -u carl -d '8 0' -m 'debug hack'
+  $ echo 'more useful' >> file1.c
+  $ hg commit -u carl -d '9 0' -m 'more work'
+  $ hg shortlog -G -r 17::
+  @  20:ea8fafca914b  draft  more work
+  |
+  o  19:b23d06b457a8  draft  debug hack
+  |
+  o  18:1f33e68b18b9  draft  useful work
+  |
+  o  17:91b4b0f8b5c5  draft  feature 23
+  |
+
+example 8: prune an older changeset (figures 8, 9)
+  $ hg prune 19
+  1 changesets pruned
+  1 new unstable changesets
+  $ hg --hidden shortlog -G -r 18::
+  @  20:ea8fafca914b  draft  more work
+  |
+  x  19:b23d06b457a8  draft  debug hack
+  |
+  o  18:1f33e68b18b9  draft  useful work
+  |
+  $ hg evolve -q --all
+  $ hg --hidden shortlog -G -r 18::
+  @  21:4393e5877437  draft  more work
+  |
+  | x  20:ea8fafca914b  draft  more work
+  | |
+  | x  19:b23d06b457a8  draft  debug hack
+  |/
+  o  18:1f33e68b18b9  draft  useful work
+  |
+
+example 9: uncommit files from an older changeset (discard changes)
+(figure 10)
+  $ echo 'this fixes bug 53' >> file1.c
+  $ echo 'debug hack' >> file2.c
+  $ hg commit -u dan -d '11 0' -m 'fix bug 53'
+  $ echo 'and this handles bug 67' >> file1.c
+  $ hg commit -u dan -d '12 0' -m 'fix bug 67'
+  $ hg update 22
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg shortlog -G -r 21::
+  o  23:4db2428c8ae3  draft  fix bug 67
+  |
+  @  22:f84357446753  draft  fix bug 53
+  |
+  o  21:4393e5877437  draft  more work
+  |
+  $ hg uncommit file2.c
+  1 new unstable changesets
+  $ hg status
+  M file2.c
+  $ hg revert file2.c
+  $ hg evolve --all
+  move:[23] fix bug 67
+  atop:[24] fix bug 53
+  working directory is now at 0d972d6888e6
+  $ hg --hidden shortlog -G -r 21::
+  @  25:0d972d6888e6  draft  fix bug 67
+  |
+  o  24:71bb83d674c5  draft  fix bug 53
+  |
+  | x  23:4db2428c8ae3  draft  fix bug 67
+  | |
+  | x  22:f84357446753  draft  fix bug 53
+  |/
+  o  21:4393e5877437  draft  more work
+  |
+  $ rm file2.c.orig
+
+example 10: uncommit files from an older changeset (keep changes)
+(figures 11, 12)
+  $ echo 'fix a bug' >> file1.c
+  $ echo 'useful but unrelated' >> file2.c
+  $ hg commit -u dan -d '11 0' -m 'fix a bug'
+  $ echo 'new feature' >> file1.c
+  $ hg commit -u dan -d '12 0' -m 'new feature'
+  $ hg update 26
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg --hidden shortlog -G -r 25::
+  o  27:fbb3c6d50427  draft  new feature
+  |
+  @  26:5b31a1239ab9  draft  fix a bug
+  |
+  o  25:0d972d6888e6  draft  fix bug 67
+  |
+  $ hg uncommit file2.c
+  1 new unstable changesets
+  $ hg status
+  M file2.c
+  $ hg commit -m 'useful tweak'
+  $ hg --hidden shortlog -G -r 25::
+  @  29:51e0d8c0a922  draft  useful tweak
+  |
+  o  28:2594e98553a9  draft  fix a bug
+  |
+  | o  27:fbb3c6d50427  draft  new feature
+  | |
+  | x  26:5b31a1239ab9  draft  fix a bug
+  |/
+  o  25:0d972d6888e6  draft  fix bug 67
+  |
+  $ hg evolve --all
+  move:[27] new feature
+  atop:[28] fix a bug
+  working directory is now at 166c1c368ab6
+  $ hg --hidden shortlog -G -r 25::
+  @  30:166c1c368ab6  draft  new feature
+  |
+  | o  29:51e0d8c0a922  draft  useful tweak
+  |/
+  o  28:2594e98553a9  draft  fix a bug
+  |
+  | x  27:fbb3c6d50427  draft  new feature
+  | |
+  | x  26:5b31a1239ab9  draft  fix a bug
+  |/
+  o  25:0d972d6888e6  draft  fix bug 67
+  |
new file mode 100644
--- /dev/null
+++ b/tests/test-wireproto-bundle1.t
@@ -0,0 +1,100 @@
+
+  $ cat >> $HGRCPATH <<EOF
+  > [defaults]
+  > amend=-d "0 0"
+  > [ui]
+  > ssh=python "$TESTDIR/dummyssh"
+  > [phases]
+  > publish = False
+  > [extensions]
+  > EOF
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+
+  $ mkcommit() {
+  >    echo "$1" > "$1"
+  >    hg add "$1"
+  >    hg ci -m "add $1"
+  > }
+
+setup repo
+
+  $ hg init server
+
+  $ hg clone ssh://user@dummy/server client
+  no changes found
+  updating to branch default
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cp -r client other
+
+Smoke testing
+===============
+
+  $ cd client
+  $ mkcommit 0
+  $ mkcommit a
+  $ hg push
+  pushing to ssh://user@dummy/server
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 2 changesets with 2 changes to 2 files
+  $ hg pull
+  pulling from ssh://user@dummy/server
+  searching for changes
+  no changes found
+  $ hg pull -R ../other
+  pulling from ssh://user@dummy/server
+  requesting all changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 2 changes to 2 files
+  pull obsolescence markers
+  (run 'hg update' to get a working copy)
+  $ hg push -R ../other
+  pushing to ssh://user@dummy/server
+  searching for changes
+  no changes found
+  [1]
+
+Push
+=============
+
+  $ echo 'A' > a
+  $ hg amend
+  $ hg push
+  pushing to ssh://user@dummy/server
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files (+1 heads)
+  pushing 2 obsolescence markers (* bytes) (glob)
+  remote: 2 obsolescence markers added
+  $ hg push
+  pushing to ssh://user@dummy/server
+  searching for changes
+  no changes found
+  [1]
+
+Pull
+=============
+
+  $ hg -R ../other pull
+  pulling from ssh://user@dummy/server
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to [12] files \(\+1 heads\) (re)
+  pull obsolescence markers
+  2 obsolescence markers added
+  (run 'hg heads' to see heads)
+  $ hg -R ../other pull
+  pulling from ssh://user@dummy/server
+  searching for changes
+  no changes found
+
+  $ cd ..
+
new file mode 100644
--- /dev/null
+++ b/tests/test-wireproto.t
@@ -0,0 +1,152 @@
+
+  $ cat >> $HGRCPATH <<EOF
+  > [defaults]
+  > amend=-d "0 0"
+  > [experimental]
+  > obsmarkers-exchange-debug=true
+  > bundle2-exp=true
+  > [ui]
+  > ssh=python "$TESTDIR/dummyssh"
+  > [phases]
+  > publish = False
+  > [extensions]
+  > EOF
+  $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+
+  $ mkcommit() {
+  >    echo "$1" > "$1"
+  >    hg add "$1"
+  >    hg ci -m "add $1"
+  > }
+
+setup repo
+
+  $ hg init server
+
+  $ hg clone ssh://user@dummy/server client
+  no changes found
+  updating to branch default
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cp -r client other
+
+Smoke testing
+===============
+
+  $ cd client
+  $ mkcommit 0
+  $ mkcommit a
+  $ hg push
+  pushing to ssh://user@dummy/server
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 2 changesets with 2 changes to 2 files
+  $ hg pull
+  pulling from ssh://user@dummy/server
+  searching for changes
+  no changes found
+  $ hg pull -R ../other
+  pulling from ssh://user@dummy/server
+  requesting all changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 2 changesets with 2 changes to 2 files
+  (run 'hg update' to get a working copy)
+  $ hg push -R ../other
+  pushing to ssh://user@dummy/server
+  searching for changes
+  no changes found
+  [1]
+
+Push
+=============
+
+  $ echo 'A' > a
+  $ hg amend
+  $ hg push
+  pushing to ssh://user@dummy/server
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files (+1 heads)
+  remote: obsmarker-exchange: 139 bytes received
+  remote: 2 new obsolescence markers
+  $ hg push
+  pushing to ssh://user@dummy/server
+  searching for changes
+  no changes found
+  [1]
+
+Pull
+=============
+
+  $ hg -R ../other pull
+  pulling from ssh://user@dummy/server
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to [12] files \(\+1 heads\) (re)
+  obsmarker-exchange: 139 bytes received
+  2 new obsolescence markers
+  (run 'hg heads' to see heads, 'hg merge' to merge)
+  $ hg -R ../other pull
+  pulling from ssh://user@dummy/server
+  searching for changes
+  no changes found
+
+Test some markers discovery
+===========================
+
+  $ echo c > C
+  $ hg add C
+  $ hg commit -m C
+  $ echo c >> C
+  $ hg amend
+  $ hg push
+  pushing to ssh://user@dummy/server
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
+  remote: obsmarker-exchange: 139 bytes received
+  remote: 2 new obsolescence markers
+  $ hg -R ../other pull
+  pulling from ssh://user@dummy/server
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  obsmarker-exchange: 139 bytes received
+  2 new obsolescence markers
+  (run 'hg update' to get a working copy)
+
+some common hidden
+
+  $ hg touch .
+  $ hg push
+  pushing to ssh://user@dummy/server
+  searching for changes
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 0 changes to 1 files (+1 heads)
+  remote: obsmarker-exchange: 208 bytes received
+  remote: 1 new obsolescence markers
+  $ hg -R ../other pull
+  pulling from ssh://user@dummy/server
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 0 changes to 3 files (+1 heads)
+  obsmarker-exchange: 208 bytes received
+  1 new obsolescence markers
+  (run 'hg heads' to see heads, 'hg merge' to merge)
+
+  $ cd ..