merge backout
authorThomas Arendsen Hein <thomas@intevation.de>
Mon, 18 Feb 2008 19:21:33 +0100
changeset 6142 50a277e6ceaeaa5f890cacc9dcab745a4387dd58
parent 6141 90e5c82a3859f1c287d89e729deb3b8436d85ed5 (current diff)
parent 6140 47e6d5d5913a9a4487e07ca2bc188b2b0e3744ce (diff)
child 6143 5b159ebb19cf9e2fddd008012e836e3d720a167f
push id1
push usergszorc@mozilla.com
push dateWed, 18 Mar 2015 16:34:57 +0000
merge backout
contrib/favicon.ico
contrib/hgwebdir.fcgi
doc/hgmerge.1.txt
doc/hgrc.5.txt
doc/ja/hgmerge.1.ja.txt
hgmerge
hgweb.cgi
hgwebdir.cgi
mercurial/dispatch.py
mercurial/hgweb/hgweb_mod.py
deleted file mode 100644
index 2872cbdff68dbb52ff89565e3cdea704100df8f9..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/contrib/hgwebdir.fcgi
+++ b/contrib/hgwebdir.fcgi
@@ -4,19 +4,19 @@
 
 # adjust python path if not a system-wide install:
 #import sys
 #sys.path.insert(0, "/path/to/python/lib")
 
 # enable demandloading to reduce startup time
 from mercurial import demandimport; demandimport.enable()
 
-# send python tracebacks to the browser if an error occurs:
-import cgitb
-cgitb.enable()
+# Uncomment to send python tracebacks to the browser if an error occurs:
+#import cgitb
+#cgitb.enable()
 
 # If you'd like to serve pages with UTF-8 instead of your default
 # locale charset, you can do so by uncommenting the following lines.
 # Note that this will cause your .hgrc files to be interpreted in
 # UTF-8 and all your repo files to be displayed using UTF-8.
 #
 #import os
 #os.environ["HGENCODING"] = "UTF-8"
new file mode 100644
--- /dev/null
+++ b/contrib/logo-droplets.svg
@@ -0,0 +1,624 @@
+<?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://web.resource.org/cc/"
+   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="120"
+   viewBox="0 0 124.766 152.099"
+   id="Layer_1"
+   xml:space="preserve"
+   sodipodi:version="0.32"
+   inkscape:version="0.45.1"
+   sodipodi:docname="logo-droplets.svg"
+   sodipodi:docbase="/home/oxymoron/waste/selenic/public_html/hg-logo"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"><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>Mercurial &quot;droplets&quot; logo</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="576"
+   inkscape:window-width="746"
+   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="2.3216673"
+   inkscape:cx="4.1210694"
+   inkscape:cy="65.759396"
+   inkscape:window-x="377"
+   inkscape:window-y="398"
+   inkscape:current-layer="Layer_1"
+   width="100px"
+   height="120px"
+   units="px" /><defs
+   id="defs261" />
+<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.97552931;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+   id="rect6847"
+   width="124.77364"
+   height="150.12347"
+   x="0.31690097"
+   y="0.98776293" /><path
+   d="M 9.8480335,124.60683 C 11.62496,123.82337 13.513211,123.43203 15.327243,123.43203 C 17.067063,123.43203 18.177759,123.85879 18.806894,124.74937 C 20.139374,123.8596 21.953416,123.43203 23.360116,123.43203 C 27.581053,123.43203 27.728648,125.14068 27.728648,130.16028 L 27.728648,141.26547 C 27.728648,141.76382 27.802857,141.76382 25.692811,141.76382 L 25.692811,129.94606 C 25.692811,126.31544 25.618592,125.21154 23.213365,125.21154 C 22.139794,125.21154 21.029108,125.4603 19.844204,126.24379 L 19.844204,141.5142 C 19.807099,141.65677 19.732887,141.69215 19.474821,141.72758 C 19.436863,141.72758 19.400602,141.763 19.362653,141.763 L 17.807522,141.763 L 17.807522,129.94606 C 17.807522,126.45791 17.807522,125.17607 15.29098,125.17607 C 14.2174,125.17607 13.143818,125.38944 11.884705,125.99501 L 11.884705,141.26547 C 11.884705,141.76382 11.958925,141.76382 9.8488776,141.76382 L 9.8488776,124.60683 M 37.680118,123.43203 C 34.533596,123.43203 31.053954,124.32176 31.053954,133.8263 C 31.053954,141.15915 33.607611,142.29771 37.125192,142.29771 C 39.826435,142.29771 42.159131,141.40799 42.159131,140.98039 C 42.159131,140.44659 42.084921,139.62768 41.900221,139.16468 C 40.75243,139.94814 39.123081,140.37486 37.309893,140.37486 C 34.829612,140.37486 33.164001,139.66309 33.126052,134.14592 C 34.755402,134.14592 38.902128,134.11044 41.97444,133.50498 C 42.233351,132.33022 42.343821,130.62155 42.343821,129.12711 C 42.343821,125.56743 40.900016,123.43203 37.680118,123.43203 M 37.494584,125.21154 C 39.715955,125.21154 40.307995,126.67048 40.3451,129.51849 C 40.3451,130.26565 40.307995,131.15541 40.19667,132.00972 C 38.123729,132.50815 34.60612,132.50815 33.125209,132.50815 C 33.385806,126.0304 35.606333,125.21154 37.494584,125.21154 M 45.565397,124.99816 C 47.304384,123.85879 48.897464,123.43203 50.525969,123.43203 C 52.34,123.43203 53.191776,123.93046 53.191776,124.53602 C 53.191776,124.89187 53.079617,125.49742 52.894917,125.85331 C 52.376261,125.56823 51.785075,125.31945 50.821131,125.31945 C 49.637079,125.31945 48.526385,125.63909 47.638339,126.42255 L 47.638339,141.26632 C 47.638339,141.7647 47.675453,141.7647 45.565397,141.7647 L 45.565397,124.99816 M 64.254794,124.60683 C 64.254794,124.14383 62.700508,123.43203 61.145377,123.43203 C 58.145598,123.43203 54.481256,124.4643 54.481256,133.25617 C 54.481256,141.58507 56.70347,142.3331 60.589608,142.3331 C 62.514121,142.3331 64.254794,141.30089 64.254794,140.73161 C 64.254794,140.4111 64.181418,139.91269 63.99504,139.48515 C 63.217475,140.05441 62.033423,140.58905 60.775152,140.58905 C 58.11018,140.58905 56.55504,139.84185 56.55504,133.3633 C 56.55504,126.20837 59.108698,125.21154 61.330069,125.21154 C 62.58834,125.21154 63.291694,125.56743 63.99504,126.0304 C 64.181418,125.60367 64.254794,124.99816 64.254794,124.60683 M 78.435657,141.15915 C 76.806308,141.97803 74.659991,142.29851 72.808845,142.29851 C 68.070088,142.29851 67.366733,140.30571 67.366733,135.57114 L 67.366733,124.42971 C 67.366733,123.96757 67.330471,123.96757 69.440527,123.96757 L 69.440527,135.7854 C 69.440527,139.34513 69.958338,140.55538 72.734626,140.55538 C 73.808215,140.55538 75.289126,140.34199 76.399811,139.70105 L 76.399811,124.43056 C 76.399811,123.96839 76.325602,123.96839 78.435657,123.96839 L 78.435657,141.15915 M 82.657438,124.99816 C 84.396406,123.85879 85.98865,123.43203 87.617156,123.43203 C 89.431178,123.43203 90.282962,123.93046 90.282962,124.53602 C 90.282962,124.89187 90.171639,125.49742 89.986938,125.85331 C 89.468283,125.56823 88.876272,125.31945 87.913163,125.31945 C 86.729111,125.31945 85.618415,125.63909 84.729535,126.42255 L 84.729535,141.26632 C 84.729535,141.7647 84.767484,141.7647 82.657438,141.7647 L 82.657438,124.99816 M 95.036045,123.9659 C 93.406714,123.9659 92.926008,123.9659 92.926008,124.92729 L 92.926008,141.76382 C 94.99895,141.76382 95.036045,141.76382 95.036045,141.26547 L 95.036045,123.9659 M 92.851787,117.70149 C 92.851787,118.87629 93.222023,119.30304 93.961631,119.33843 C 94.813415,119.33843 95.220746,118.73376 95.220746,117.66526 C 95.257851,116.56214 94.960991,116.06374 94.11006,116.06374 C 93.296243,116.06374 92.888893,116.66926 92.851787,117.70149 M 98.547748,124.99816 C 98.547748,124.60683 98.62196,124.39264 98.770389,124.28635 C 99.473743,123.89502 102.17666,123.43203 105.24898,123.43203 C 107.58166,123.43203 109.06174,124.53602 109.06174,127.73899 L 109.06174,130.05231 C 109.06174,136.38835 108.87704,141.12293 108.87704,141.12293 C 108.02528,141.58507 106.43387,142.29771 103.84143,142.29771 C 101.17646,142.3331 98.511478,142.0843 98.511478,136.81596 C 98.511478,131.7972 101.25067,131.01375 103.98986,131.01375 C 105.02633,131.01375 106.24834,131.12082 107.06301,131.4413 C 107.06301,131.4413 107.06301,129.12711 107.06301,128.13033 C 107.06301,125.81704 105.87895,125.31862 104.47141,125.31862 C 102.58399,125.31862 99.956127,125.67451 98.808337,126.20837 C 98.585707,125.81704 98.547748,125.21154 98.547748,124.99816 M 107.06216,132.9011 C 106.35882,132.65147 105.35945,132.54522 104.65609,132.54522 C 102.54604,132.54522 100.62069,132.97198 100.62069,136.88763 C 100.62069,140.55363 102.21293,140.58991 104.10032,140.58991 C 105.28522,140.58991 106.47014,140.26946 106.87663,139.84271 C 106.87747,139.84185 107.06216,135.57029 107.06216,132.9011 M 114.91792,141.26547 C 114.91792,141.76382 114.95503,141.76382 112.88124,141.76382 L 112.88124,116.56214 C 112.88124,115.60073 113.28857,115.60073 114.91792,115.60073 L 114.91792,141.26547"
+   style="fill:#010101;stroke-width:2.02999997;stroke-miterlimit:4;stroke-dasharray:none"
+   id="text2611" /><g
+   transform="matrix(0.9351326,0,0,0.9351326,150.39508,-1.251766)"
+   id="g4503"
+   style="opacity:1"><path
+     d="M -45.749655,92.691592 C -25.709638,59.370739 -49.98206,5.3291313 -94.363693,10.819389 C -134.46337,15.776665 -135.10949,57.983708 -99.76917,68.010455 C -69.186498,76.695132 -93.451029,96.093536 -92.742037,109.01138 C -92.030055,121.92728 -66.155038,126.61324 -45.749655,92.691592 z "
+     style="fill:#1b1a1b"
+     id="path2339" /><circle
+     cx="33.728001"
+     cy="85.363998"
+     r="15.414"
+     transform="matrix(1.0917947,-0.2858168,0.2858168,1.0917947,-180.30817,13.494135)"
+     style="fill:#1b1a1b"
+     id="circle2341"
+     sodipodi:cx="33.728001"
+     sodipodi:cy="85.363998"
+     sodipodi:rx="15.414"
+     sodipodi:ry="15.414" /><path
+     d="M -140.06215,48.935849 C -146.31997,49.541603 -150.90082,55.100456 -150.29507,61.358275 C -149.68817,67.620461 -144.12955,72.20487 -137.87064,71.59883 C -131.61373,70.985148 -127.02904,65.427621 -127.63726,59.169282 C -128.24543,52.915596 -133.80324,48.329809 -140.06215,48.935849 z "
+     style="fill:#1b1a1b"
+     id="path2343" /><path
+     d="M -44.99294,91.339709 C -24.951831,58.018571 -49.224253,3.976963 -93.605885,9.4672202 C -133.70556,14.424496 -134.35249,56.632918 -99.012168,66.659664 C -68.429497,75.344341 -92.694028,94.742745 -91.984749,107.66168 C -91.271961,120.5762 -65.398322,125.26135 -44.99294,91.339709 z "
+     style="fill:#bfbfbf"
+     id="path2561" /><path
+     d="M -86.84228,112.75985 C -88.056751,110.79004 -86.19955,108.60176 -84.290569,108.76815 C -81.251858,109.03428 -74.635637,108.73252 -69.415044,105.77341 C -56.372412,98.379694 -36.300952,62.803704 -46.395841,40.365295 C -50.915249,30.320886 -53.115898,27.444964 -57.770162,22.531645 C -58.719625,21.529587 -58.174556,21.584053 -57.531623,21.923221 C -55.014762,23.244092 -50.592026,28.36035 -46.055478,36.687677 C -38.390628,50.757116 -38.788117,67.483141 -41.638835,77.975343 C -43.624548,85.27439 -50.464117,101.78644 -60.480639,108.92577 C -70.5197,116.0815 -82.266433,120.18559 -86.84228,112.75985 z "
+     style="fill:#000000"
+     id="path2563" /><path
+     d="M -95.930347,66.591355 C -102.76341,64.562985 -111.57238,61.738267 -116.66758,55.073789 C -120.42371,50.15984 -122.3305,44.796759 -122.81745,41.755703 C -122.99069,40.670602 -123.13785,39.765332 -122.82526,39.515509 C -122.68064,39.399486 -120.02045,45.412302 -116.04367,50.451645 C -112.06769,55.492366 -106.51047,58.440379 -101.88092,59.511496 C -97.763206,60.46345 -89.233623,62.555175 -86.347769,65.013729 C -83.380949,67.540918 -83.133309,73.00119 -84.131664,73.617197 C -85.138469,74.236583 -87.180025,69.187603 -95.930347,66.591355 z "
+     style="fill:#000000"
+     id="path2565" /><path
+     d="M -81.840812,113.72311 C -81.972699,115.28707 -80.176315,115.59377 -77.75828,115.23141 C -74.658947,114.76654 -72.037923,114.41754 -68.470623,112.62971 C -63.63582,110.20674 -58.742752,106.74072 -55.159223,102.06476 C -44.467444,88.115271 -40.681354,71.610444 -41.264404,69.236185 C -41.459242,71.196944 -44.040349,81.489071 -49.943268,90.767882 C -57.52457,102.68631 -63.022197,109.03464 -75.701416,112.1124 C -79.230011,112.96964 -81.668137,111.66432 -81.840812,113.72311 z "
+     style="fill:#ffffff"
+     id="path2567" /><path
+     d="M -109.96233,59.479354 C -108.51822,60.704238 -105.55938,62.336389 -99.737455,64.245644 C -92.705873,66.551032 -89.282274,68.550326 -87.848506,69.508429 C -86.329222,70.525809 -85.366279,72.795951 -85.27115,70.779631 C -85.17194,68.761076 -86.416123,67.025373 -89.192166,66.104839 C -91.070345,65.481234 -94.229847,63.996111 -97.258539,63.398373 C -99.204694,63.014221 -102.37098,62.251845 -105.08636,61.420426 C -106.57454,60.963046 -108.09089,60.161888 -109.96233,59.479354 z "
+     style="fill:#ffffff"
+     id="path2569" /><circle
+     cx="34.681"
+     cy="84.375"
+     r="15.414"
+     transform="matrix(1.0917947,-0.2858168,0.2858168,1.0917947,-180.30817,13.494135)"
+     style="fill:#bfbfbf"
+     id="circle2577"
+     sodipodi:cx="34.681"
+     sodipodi:cy="84.375"
+     sodipodi:rx="15.414"
+     sodipodi:ry="15.414" /><path
+     d="M -128.68413,108.37945 C -115.15301,120.91784 -94.786007,103.69471 -103.75445,88.482597 C -104.76154,86.774656 -106.06907,85.474351 -105.63906,86.782721 C -102.77288,95.529828 -105.42141,102.44941 -110.3632,106.01451 C -115.20857,109.5112 -121.86847,110.09622 -127.20028,107.33186 C -128.76601,106.5203 -129.41538,107.70291 -128.68413,108.37945 z "
+     style="fill:#000000"
+     id="path2579" /><path
+     d="M -118.06686,110.95477 C -116.34413,110.59244 -106.32442,107.99742 -103.97055,99.756195 C -103.23743,97.186709 -103.1058,97.702893 -103.31295,99.095232 C -104.37035,106.20143 -111.08741,111.44338 -116.80312,111.63773 C -117.963,111.75704 -119.48484,111.25131 -118.06686,110.95477 z "
+     style="fill:#ffffff"
+     id="path2585" /><path
+     d="M -139.30435,47.583681 C -145.56216,48.189435 -150.14301,53.748288 -149.53726,60.006106 C -148.93065,66.2672 -143.37174,70.852702 -137.11392,70.246948 C -130.85592,69.632979 -126.27151,64.074361 -126.88083,57.816308 C -127.48791,51.562336 -133.04544,46.977641 -139.30435,47.583681 z "
+     style="fill:#bfbfbf"
+     id="path2589" /><path
+     d="M -144.46878,67.571208 C -144.39939,68.375508 -143.29781,69.408789 -141.56718,69.883196 C -140.08038,70.290771 -136.24758,71.332594 -131.32372,68.224839 C -126.39986,65.117084 -125.8321,56.804464 -128.07041,54.35955 C -128.76326,53.121154 -129.66426,52.21957 -128.94737,54.195974 C -127.13695,59.186468 -130.65487,63.854586 -133.68917,66.0162 C -136.72238,68.177528 -140.56932,67.154692 -142.14014,66.675779 C -143.71095,66.196867 -144.53929,66.740369 -144.46878,67.571208 z "
+     style="fill:#000000"
+     id="path2591" /><path
+     d="M -138.11472,68.687851 C -137.66344,68.281557 -135.37889,68.447629 -133.31622,67.338341 C -131.25464,66.229338 -128.80419,63.798254 -128.36692,60.343756 C -128.10933,58.315237 -128.03197,58.824631 -127.92942,59.929403 C -128.24939,65.67243 -133.53086,68.844638 -136.55132,69.263202 C -137.36636,69.376239 -138.8007,69.307247 -138.11472,68.687851 z "
+     style="fill:#ffffff"
+     id="path2597" /><path
+     d="M -47.767489,69.693822 C -39.234739,45.099506 -57.090457,7.9576459 -93.212919,12.425552 C -125.85191,16.461012 -126.37823,50.814524 -97.613495,58.976486 C -65.031338,63.908526 -84.650966,88.487524 -87.434101,100.88229 C -89.929232,111.99304 -61.102889,113.82164 -47.767489,69.693822 z "
+     style="fill:#999999"
+     id="path2561_1_" /><path
+     d="M -70.093288,88.904346 C -78.920045,87.812046 -91.622267,107.74061 -79.645446,105.40671 C -67.670523,103.07448 -91.622267,107.74061 -79.645446,105.40671 C -73.888849,104.55302 -69.119803,102.52058 -64.850547,97.64761 C -59.283982,91.295233 -50.968477,77.5735 -48.563483,68.707586 C -46.537563,61.232354 -47.555881,49.650767 -49.644305,60.532553 C -51.786232,71.700167 -61.266532,89.996647 -70.093288,88.904346 z "
+     style="fill:#f3f3f3"
+     id="path2571" /><path
+     d="M -129.3854,104.84502 C -127.34184,104.87935 -126.10573,105.16706 -124.03635,106.61908 C -119.94568,108.31891 -112.42648,107.24179 -108.9543,102.67081 C -105.48212,98.099823 -105.36811,91.801741 -106.69103,87.996073 C -109.92728,78.682039 -123.67593,78.846722 -129.81795,86.579362 C -136.46216,95.2146 -131.42897,104.81069 -129.3854,104.84502 z "
+     style="fill:#999999"
+     id="path2581" /><path
+     d="M -147.63565,61.683628 C -147.22833,62.966318 -146.18754,64.837882 -143.9897,65.149887 C -141.05481,65.566524 -140.45479,66.892551 -136.9892,66.204631 C -133.52361,65.516711 -130.89674,62.676625 -129.84557,59.535064 C -128.64212,55.188187 -130.44406,52.944024 -133.15599,50.940416 C -135.86791,48.936808 -141.83359,49.152263 -145.3938,52.39768 C -147.92393,54.702631 -148.62733,58.560726 -147.63565,61.683628 z "
+     style="fill:#999999"
+     id="path2593_2_" /><path
+     d="M -136.11009,64.55822 C -133.44721,63.861113 -129.92545,60.232613 -131.67381,57.462279 C -133.83086,54.048798 -139.84051,56.970651 -140.04374,60.77103 C -140.24777,64.572786 -138.93238,65.297057 -136.11009,64.55822 z "
+     style="fill:#f3f3f3"
+     id="path256" /><path
+     d="M -116.11512,105.50904 C -113.8431,104.91425 -106.88259,102.0818 -108.18994,91.962983 C -108.85161,86.83742 -111.64725,98.324328 -116.82409,100.04237 C -124.66721,102.64507 -123.78607,107.51719 -116.11512,105.50904 z "
+     style="fill:#f3f3f3"
+     id="path258" /></g>
+</svg>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/contrib/mergetools.hgrc
@@ -0,0 +1,50 @@
+# Some default global settings for common merge tools
+
+[merge-tools]
+kdiff3.args=--auto -L1 base --L2 local --L3 other $base $local $other -o $output
+kdiff3.regkey=Software\KDiff3
+kdiff3.regappend=\kdiff3.exe
+kdiff3.fixeol=True
+kdiff3.gui=True
+
+gvimdiff.args=--nofork -d -g -O $local $other $base
+gvimdiff.regkey=Software\Vim\GVim
+gvimdiff.regname=path
+gvimdiff.priority=-9
+
+merge.checkconflicts=True
+merge.priority=-10
+
+gpyfm.gui=True
+
+meld.gui=True
+
+tkdiff.args=$local $other -a $base -o $output
+tkdiff.gui=True
+tkdiff.priority=-8
+
+xxdiff.args=--show-merged-pane --exit-with-merge-status --title1 local --title2 base --title3 other --merged-filename $output --merge $local $base $other
+xxdiff.gui=True
+xxdiff.priority=-8
+
+diffmerge.args=--nosplash --merge --title1=base --title2=local --title3=other $base $local $other
+diffmerge.checkchanged=True
+diffmerge.gui=True
+
+p4merge.args=$base $local $other $output
+p4merge.regkey=Software\Perforce\Environment
+p4merge.regname=P4INSTROOT
+p4merge.regappend=\p4merge.exe
+p4merge.gui=True
+p4merge.priority=-8
+
+tortoisemerge.args=/base: $output /mine:$local /theirs:$other /merged:$output
+tortoisemerge.regkey=Software\TortoiseSVN
+tortoisemerge.gui=True
+
+ecmerge.args=$base $local $other --mode=merge3 --title0=base --title1=local --title2=other --to=$output
+ecmerge.regkey=Software\Elli\xc3\xa9 Computing\Merge
+ecmerge.gui=True
+
+filemerge.args=-left $other -right $local -ancestor $base -merge $output
+filemerge.gui=True
--- a/contrib/simplemerge
+++ b/contrib/simplemerge
@@ -1,508 +1,16 @@
 #!/usr/bin/env python
-# Copyright (C) 2004, 2005 Canonical Ltd
-#
-# 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-
-# mbp: "you know that thing where cvs gives you conflict markers?"
-# s: "i hate that."
 
 from mercurial import demandimport
 demandimport.enable()
 
-from mercurial import util, mdiff, fancyopts
+import os, sys
 from mercurial.i18n import _
-
-
-class CantReprocessAndShowBase(Exception):
-    pass
-
-
-def warn(message):
-    sys.stdout.flush()
-    sys.stderr.write(message)
-    sys.stderr.flush()
-
-
-def intersect(ra, rb):
-    """Given two ranges return the range where they intersect or None.
-
-    >>> intersect((0, 10), (0, 6))
-    (0, 6)
-    >>> intersect((0, 10), (5, 15))
-    (5, 10)
-    >>> intersect((0, 10), (10, 15))
-    >>> intersect((0, 9), (10, 15))
-    >>> intersect((0, 9), (7, 15))
-    (7, 9)
-    """
-    assert ra[0] <= ra[1]
-    assert rb[0] <= rb[1]
-
-    sa = max(ra[0], rb[0])
-    sb = min(ra[1], rb[1])
-    if sa < sb:
-        return sa, sb
-    else:
-        return None
-
-
-def compare_range(a, astart, aend, b, bstart, bend):
-    """Compare a[astart:aend] == b[bstart:bend], without slicing.
-    """
-    if (aend-astart) != (bend-bstart):
-        return False
-    for ia, ib in zip(xrange(astart, aend), xrange(bstart, bend)):
-        if a[ia] != b[ib]:
-            return False
-    else:
-        return True
-
-
-
-
-class Merge3Text(object):
-    """3-way merge of texts.
-
-    Given strings BASE, OTHER, THIS, tries to produce a combined text
-    incorporating the changes from both BASE->OTHER and BASE->THIS."""
-    def __init__(self, basetext, atext, btext, base=None, a=None, b=None):
-        self.basetext = basetext
-        self.atext = atext
-        self.btext = btext
-        if base is None:
-            base = mdiff.splitnewlines(basetext)
-        if a is None:
-            a = mdiff.splitnewlines(atext)
-        if b is None:
-            b = mdiff.splitnewlines(btext)
-        self.base = base
-        self.a = a
-        self.b = b
-
-
-
-    def merge_lines(self,
-                    name_a=None,
-                    name_b=None,
-                    name_base=None,
-                    start_marker='<<<<<<<',
-                    mid_marker='=======',
-                    end_marker='>>>>>>>',
-                    base_marker=None,
-                    reprocess=False):
-        """Return merge in cvs-like form.
-        """
-        self.conflicts = False
-        newline = '\n'
-        if len(self.a) > 0:
-            if self.a[0].endswith('\r\n'):
-                newline = '\r\n'
-            elif self.a[0].endswith('\r'):
-                newline = '\r'
-        if base_marker and reprocess:
-            raise CantReprocessAndShowBase()
-        if name_a:
-            start_marker = start_marker + ' ' + name_a
-        if name_b:
-            end_marker = end_marker + ' ' + name_b
-        if name_base and base_marker:
-            base_marker = base_marker + ' ' + name_base
-        merge_regions = self.merge_regions()
-        if reprocess is True:
-            merge_regions = self.reprocess_merge_regions(merge_regions)
-        for t in merge_regions:
-            what = t[0]
-            if what == 'unchanged':
-                for i in range(t[1], t[2]):
-                    yield self.base[i]
-            elif what == 'a' or what == 'same':
-                for i in range(t[1], t[2]):
-                    yield self.a[i]
-            elif what == 'b':
-                for i in range(t[1], t[2]):
-                    yield self.b[i]
-            elif what == 'conflict':
-                self.conflicts = True
-                yield start_marker + newline
-                for i in range(t[3], t[4]):
-                    yield self.a[i]
-                if base_marker is not None:
-                    yield base_marker + newline
-                    for i in range(t[1], t[2]):
-                        yield self.base[i]
-                yield mid_marker + newline
-                for i in range(t[5], t[6]):
-                    yield self.b[i]
-                yield end_marker + newline
-            else:
-                raise ValueError(what)
-
-
-
-
-
-    def merge_annotated(self):
-        """Return merge with conflicts, showing origin of lines.
-
-        Most useful for debugging merge.
-        """
-        for t in self.merge_regions():
-            what = t[0]
-            if what == 'unchanged':
-                for i in range(t[1], t[2]):
-                    yield 'u | ' + self.base[i]
-            elif what == 'a' or what == 'same':
-                for i in range(t[1], t[2]):
-                    yield what[0] + ' | ' + self.a[i]
-            elif what == 'b':
-                for i in range(t[1], t[2]):
-                    yield 'b | ' + self.b[i]
-            elif what == 'conflict':
-                yield '<<<<\n'
-                for i in range(t[3], t[4]):
-                    yield 'A | ' + self.a[i]
-                yield '----\n'
-                for i in range(t[5], t[6]):
-                    yield 'B | ' + self.b[i]
-                yield '>>>>\n'
-            else:
-                raise ValueError(what)
-
-
-
-
-
-    def merge_groups(self):
-        """Yield sequence of line groups.  Each one is a tuple:
-
-        'unchanged', lines
-             Lines unchanged from base
-
-        'a', lines
-             Lines taken from a
-
-        'same', lines
-             Lines taken from a (and equal to b)
-
-        'b', lines
-             Lines taken from b
-
-        'conflict', base_lines, a_lines, b_lines
-             Lines from base were changed to either a or b and conflict.
-        """
-        for t in self.merge_regions():
-            what = t[0]
-            if what == 'unchanged':
-                yield what, self.base[t[1]:t[2]]
-            elif what == 'a' or what == 'same':
-                yield what, self.a[t[1]:t[2]]
-            elif what == 'b':
-                yield what, self.b[t[1]:t[2]]
-            elif what == 'conflict':
-                yield (what,
-                       self.base[t[1]:t[2]],
-                       self.a[t[3]:t[4]],
-                       self.b[t[5]:t[6]])
-            else:
-                raise ValueError(what)
-
-
-    def merge_regions(self):
-        """Return sequences of matching and conflicting regions.
-
-        This returns tuples, where the first value says what kind we
-        have:
-
-        'unchanged', start, end
-             Take a region of base[start:end]
-
-        'same', astart, aend
-             b and a are different from base but give the same result
-
-        'a', start, end
-             Non-clashing insertion from a[start:end]
-
-        Method is as follows:
-
-        The two sequences align only on regions which match the base
-        and both descendents.  These are found by doing a two-way diff
-        of each one against the base, and then finding the
-        intersections between those regions.  These "sync regions"
-        are by definition unchanged in both and easily dealt with.
-
-        The regions in between can be in any of three cases:
-        conflicted, or changed on only one side.
-        """
-
-        # section a[0:ia] has been disposed of, etc
-        iz = ia = ib = 0
-
-        for zmatch, zend, amatch, aend, bmatch, bend in self.find_sync_regions():
-            #print 'match base [%d:%d]' % (zmatch, zend)
-
-            matchlen = zend - zmatch
-            assert matchlen >= 0
-            assert matchlen == (aend - amatch)
-            assert matchlen == (bend - bmatch)
-
-            len_a = amatch - ia
-            len_b = bmatch - ib
-            len_base = zmatch - iz
-            assert len_a >= 0
-            assert len_b >= 0
-            assert len_base >= 0
-
-            #print 'unmatched a=%d, b=%d' % (len_a, len_b)
-
-            if len_a or len_b:
-                # try to avoid actually slicing the lists
-                equal_a = compare_range(self.a, ia, amatch,
-                                        self.base, iz, zmatch)
-                equal_b = compare_range(self.b, ib, bmatch,
-                                        self.base, iz, zmatch)
-                same = compare_range(self.a, ia, amatch,
-                                     self.b, ib, bmatch)
-
-                if same:
-                    yield 'same', ia, amatch
-                elif equal_a and not equal_b:
-                    yield 'b', ib, bmatch
-                elif equal_b and not equal_a:
-                    yield 'a', ia, amatch
-                elif not equal_a and not equal_b:
-                    yield 'conflict', iz, zmatch, ia, amatch, ib, bmatch
-                else:
-                    raise AssertionError("can't handle a=b=base but unmatched")
-
-                ia = amatch
-                ib = bmatch
-            iz = zmatch
-
-            # if the same part of the base was deleted on both sides
-            # that's OK, we can just skip it.
-
-
-            if matchlen > 0:
-                assert ia == amatch
-                assert ib == bmatch
-                assert iz == zmatch
-
-                yield 'unchanged', zmatch, zend
-                iz = zend
-                ia = aend
-                ib = bend
-
-
-    def reprocess_merge_regions(self, merge_regions):
-        """Where there are conflict regions, remove the agreed lines.
-
-        Lines where both A and B have made the same changes are
-        eliminated.
-        """
-        for region in merge_regions:
-            if region[0] != "conflict":
-                yield region
-                continue
-            type, iz, zmatch, ia, amatch, ib, bmatch = region
-            a_region = self.a[ia:amatch]
-            b_region = self.b[ib:bmatch]
-            matches = mdiff.get_matching_blocks(''.join(a_region),
-                                                ''.join(b_region))
-            next_a = ia
-            next_b = ib
-            for region_ia, region_ib, region_len in matches[:-1]:
-                region_ia += ia
-                region_ib += ib
-                reg = self.mismatch_region(next_a, region_ia, next_b,
-                                           region_ib)
-                if reg is not None:
-                    yield reg
-                yield 'same', region_ia, region_len+region_ia
-                next_a = region_ia + region_len
-                next_b = region_ib + region_len
-            reg = self.mismatch_region(next_a, amatch, next_b, bmatch)
-            if reg is not None:
-                yield reg
-
-
-    def mismatch_region(next_a, region_ia,  next_b, region_ib):
-        if next_a < region_ia or next_b < region_ib:
-            return 'conflict', None, None, next_a, region_ia, next_b, region_ib
-    mismatch_region = staticmethod(mismatch_region)
-
-
-    def find_sync_regions(self):
-        """Return a list of sync regions, where both descendents match the base.
-
-        Generates a list of (base1, base2, a1, a2, b1, b2).  There is
-        always a zero-length sync region at the end of all the files.
-        """
-
-        ia = ib = 0
-        amatches = mdiff.get_matching_blocks(self.basetext, self.atext)
-        bmatches = mdiff.get_matching_blocks(self.basetext, self.btext)
-        len_a = len(amatches)
-        len_b = len(bmatches)
-
-        sl = []
-
-        while ia < len_a and ib < len_b:
-            abase, amatch, alen = amatches[ia]
-            bbase, bmatch, blen = bmatches[ib]
-
-            # there is an unconflicted block at i; how long does it
-            # extend?  until whichever one ends earlier.
-            i = intersect((abase, abase+alen), (bbase, bbase+blen))
-            if i:
-                intbase = i[0]
-                intend = i[1]
-                intlen = intend - intbase
-
-                # found a match of base[i[0], i[1]]; this may be less than
-                # the region that matches in either one
-                assert intlen <= alen
-                assert intlen <= blen
-                assert abase <= intbase
-                assert bbase <= intbase
-
-                asub = amatch + (intbase - abase)
-                bsub = bmatch + (intbase - bbase)
-                aend = asub + intlen
-                bend = bsub + intlen
-
-                assert self.base[intbase:intend] == self.a[asub:aend], \
-                       (self.base[intbase:intend], self.a[asub:aend])
-
-                assert self.base[intbase:intend] == self.b[bsub:bend]
-
-                sl.append((intbase, intend,
-                           asub, aend,
-                           bsub, bend))
-
-            # advance whichever one ends first in the base text
-            if (abase + alen) < (bbase + blen):
-                ia += 1
-            else:
-                ib += 1
-
-        intbase = len(self.base)
-        abase = len(self.a)
-        bbase = len(self.b)
-        sl.append((intbase, intbase, abase, abase, bbase, bbase))
-
-        return sl
-
-
-
-    def find_unconflicted(self):
-        """Return a list of ranges in base that are not conflicted."""
-        am = mdiff.get_matching_blocks(self.basetext, self.atext)
-        bm = mdiff.get_matching_blocks(self.basetext, self.btext)
-
-        unc = []
-
-        while am and bm:
-            # there is an unconflicted block at i; how long does it
-            # extend?  until whichever one ends earlier.
-            a1 = am[0][0]
-            a2 = a1 + am[0][2]
-            b1 = bm[0][0]
-            b2 = b1 + bm[0][2]
-            i = intersect((a1, a2), (b1, b2))
-            if i:
-                unc.append(i)
-
-            if a2 < b2:
-                del am[0]
-            else:
-                del bm[0]
-
-        return unc
-
-
-# bzr compatible interface, for the tests
-class Merge3(Merge3Text):
-    """3-way merge of texts.
-
-    Given BASE, OTHER, THIS, tries to produce a combined text
-    incorporating the changes from both BASE->OTHER and BASE->THIS.
-    All three will typically be sequences of lines."""
-    def __init__(self, base, a, b):
-        basetext = '\n'.join([i.strip('\n') for i in base] + [''])
-        atext = '\n'.join([i.strip('\n') for i in a] + [''])
-        btext = '\n'.join([i.strip('\n') for i in b] + [''])
-        if util.binary(basetext) or util.binary(atext) or util.binary(btext):
-            raise util.Abort(_("don't know how to merge binary files"))
-        Merge3Text.__init__(self, basetext, atext, btext, base, a, b)
-
-
-def simplemerge(local, base, other, **opts):
-    def readfile(filename):
-        f = open(filename, "rb")
-        text = f.read()
-        f.close()
-        if util.binary(text):
-            msg = _("%s looks like a binary file.") % filename
-            if not opts.get('text'):
-                raise util.Abort(msg)
-            elif not opts.get('quiet'):
-                warn(_('warning: %s\n') % msg)
-        return text
-
-    name_a = local
-    name_b = other
-    labels = opts.get('label', [])
-    if labels:
-        name_a = labels.pop(0)
-    if labels:
-        name_b = labels.pop(0)
-    if labels:
-        raise util.Abort(_("can only specify two labels."))
-
-    localtext = readfile(local)
-    basetext = readfile(base)
-    othertext = readfile(other)
-
-    orig = local
-    local = os.path.realpath(local)
-    if not opts.get('print'):
-        opener = util.opener(os.path.dirname(local))
-        out = opener(os.path.basename(local), "w", atomictemp=True)
-    else:
-        out = sys.stdout
-
-    reprocess = not opts.get('no_minimal')
-
-    m3 = Merge3Text(basetext, localtext, othertext)
-    for line in m3.merge_lines(name_a=name_a, name_b=name_b,
-                               reprocess=reprocess):
-        out.write(line)
-
-    if not opts.get('print'):
-        out.rename()
-
-    if m3.conflicts:
-        if not opts.get('quiet'):
-            warn(_("warning: conflicts during merge.\n"))
-        return 1
+from mercurial import simplemerge, fancyopts, util
 
 options = [('L', 'label', [], _('labels to use on conflict markers')),
            ('a', 'text', None, _('treat all files as text')),
            ('p', 'print', None,
             _('print results instead of overwriting LOCAL')),
            ('', 'no-minimal', None,
             _('do not try to minimize conflict regions')),
            ('h', 'help', None, _('display help and exit')),
@@ -512,51 +20,45 @@ usage = _('''simplemerge [OPTS] LOCAL BA
 
     Simple three-way file merge utility with a minimal feature set.
 
     Apply to LOCAL the changes necessary to go from BASE to OTHER.
 
     By default, LOCAL is overwritten with the results of this operation.
 ''')
 
+class ParseError(Exception):
+    """Exception raised on errors in parsing the command line."""
+
 def showhelp():
     sys.stdout.write(usage)
     sys.stdout.write('\noptions:\n')
 
     out_opts = []
     for shortopt, longopt, default, desc in options:
         out_opts.append(('%2s%s' % (shortopt and '-%s' % shortopt,
                                     longopt and ' --%s' % longopt),
                          '%s' % desc))
     opts_len = max([len(opt[0]) for opt in out_opts])
     for first, second in out_opts:
         sys.stdout.write(' %-*s  %s\n' % (opts_len, first, second))
 
-class ParseError(Exception):
-    """Exception raised on errors in parsing the command line."""
-
-def main(argv):
+try:
+    opts = {}
     try:
-        opts = {}
-        try:
-            args = fancyopts.fancyopts(argv[1:], options, opts)
-        except fancyopts.getopt.GetoptError, e:
-            raise ParseError(e)
-        if opts['help']:
-            showhelp()
-            return 0
-        if len(args) != 3:
-                raise ParseError(_('wrong number of arguments'))
-        return simplemerge(*args, **opts)
-    except ParseError, e:
-        sys.stdout.write("%s: %s\n" % (sys.argv[0], e))
+        args = fancyopts.fancyopts(sys.argv[1:], options, opts)
+    except fancyopts.getopt.GetoptError, e:
+        raise ParseError(e)
+    if opts['help']:
         showhelp()
-        return 1
-    except util.Abort, e:
-        sys.stderr.write("abort: %s\n" % e)
-        return 255
-    except KeyboardInterrupt:
-        return 255
-
-if __name__ == '__main__':
-    import sys
-    import os
-    sys.exit(main(sys.argv))
+        sys.exit(0)
+    if len(args) != 3:
+            raise ParseError(_('wrong number of arguments'))
+    sys.exit(simplemerge.simplemerge(*args, **opts))
+except ParseError, e:
+    sys.stdout.write("%s: %s\n" % (sys.argv[0], e))
+    showhelp()
+    sys.exit(1)
+except util.Abort, e:
+    sys.stderr.write("abort: %s\n" % e)
+    sys.exit(255)
+except KeyboardInterrupt:
+    sys.exit(255)
deleted file mode 100644
--- a/doc/hgmerge.1.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-HGMERGE(1)
-==========
-Matt Mackall <mpm@selenic.com>
-v0.1, 27 May 2005
-
-NAME
-----
-hgmerge - default wrapper to merge files in Mercurial SCM system
-
-SYNOPSIS
---------
-'hgmerge' local ancestor remote
-
-DESCRIPTION
------------
-The hgmerge(1) command provides a graphical interface to merge files in the
-Mercurial system. It is a simple wrapper around kdiff3, merge(1) and tkdiff(1),
-or simply diff(1) and patch(1) depending on what is present on the system.
-
-hgmerge(1) is used by the Mercurial SCM if the environment variable HGMERGE is
-not set.
-
-AUTHOR
-------
-Written by Vincent Danjean <Vincent.Danjean@free.fr>
-
-SEE ALSO
---------
-hg(1) - the command line interface to Mercurial SCM
-
-COPYING
--------
-Copyright \(C) 2005-2007 Matt Mackall.
-Free use of this software is granted under the terms of the GNU General
-Public License (GPL).
--- a/doc/hgrc.5.txt
+++ b/doc/hgrc.5.txt
@@ -228,16 +228,92 @@ format::
 
   usestore;;
     Enable or disable the "store" repository format which improves
     compatibility with systems that fold case or otherwise mangle
     filenames. Enabled by default. Disabling this option will allow
     you to store longer filenames in some situations at the expense of
     compatibility.
 
+merge-patterns::
+  This section specifies merge tools to associate with particular file
+  patterns. Tools matched here will take precedence over the default
+  merge tool. Patterns are globs by default, rooted at the repository root.
+
+  Example:
+
+    [merge-patterns]
+    **.c = kdiff3
+    **.jpg = myimgmerge
+
+merge-tools::
+  This section configures external merge tools to use for file-level
+  merges.
+
+  Example ~/.hgrc:
+
+    [merge-tools]
+    # Override stock tool location
+    kdiff3.executable = ~/bin/kdiff3
+    # Specify command line
+    kdiff3.args = $base $local $other -o $output
+    # Give higher priority
+    kdiff3.priority = 1
+
+    # Define new tool
+    myHtmlTool.args = -m $local $other $base $output
+    myHtmlTool.regkey = Software\FooSoftware\HtmlMerge
+    myHtmlTool.priority = 1
+
+  Supported arguments:
+  priority;;
+    The priority in which to evaluate this tool.
+    Default: 0.
+  executable;;
+    Either just the name of the executable or its pathname.
+    Default: the tool name.
+  args;;
+    The arguments to pass to the tool executable. You can refer to the files
+    being merged as well as the output file through these variables: $base,
+    $local, $other, $output.
+    Default: $local $base $other
+  premerge;;
+    Attempt to run internal non-interactive 3-way merge tool before
+    launching external tool.
+    Default: True
+  binary;;
+    This tool can merge binary files.  Defaults to False, unless tool
+    was selected by file pattern match.
+  symlink;;
+    This tool can merge symlinks.  Defaults to False, even if tool was
+    selected by file pattern match.
+  checkconflicts;;
+    Check whether there are conflicts even though the tool reported
+    success.
+    Default: False
+  checkchanged;;
+    Check whether outputs were written even though the tool reported
+    success.
+    Default: False
+  fixeol;;
+    Attempt to fix up EOL changes caused by the merge tool.
+    Default: False
+  gui:;
+    This tool requires a graphical interface to run. Default: False
+  regkey;;
+    Windows registry key which describes install location of this tool.
+    Mercurial will search for this key first under HKEY_CURRENT_USER and
+    then under HKEY_LOCAL_MACHINE.  Default: None
+  regname;;
+    Name of value to read from specified registry key.  Defaults to the
+    unnamed (default) value.
+  regappend;;
+    String to append to the value read from the registry, typically the
+    executable name of the tool.  Default: None
+
 hooks::
   Commands or Python functions that get automatically executed by
   various actions such as starting or finishing a commit. Multiple
   hooks can be run for the same action by appending a suffix to the
   action. Overriding a site-wide hook can be done by changing its
   value or setting it to an empty string.
 
   Example .hg/hgrc:
@@ -448,17 +524,28 @@ ui::
     "ignore.other = ~/.hgignore2". For details of the ignore file
     format, see the hgignore(5) man page.
   interactive;;
     Allow to prompt the user.  True or False.  Default is True.
   logtemplate;;
     Template string for commands that print changesets.
   merge;;
     The conflict resolution program to use during a manual merge.
-    Default is "hgmerge".
+    There are some internal tools available:
+
+      internal:local;;
+        keep the local version
+      internal:other;;
+        use the other version
+      internal:merge;;
+        use the internal non-interactive merge tool
+      internal:fail;;
+        fail to merge
+
+    See the merge-tools section for more information on configuring tools.
   patch;;
     command to use to apply patches. Look for 'gpatch' or 'patch' in PATH if
     unset.
   quiet;;
     Reduce the amount of output printed.  True or False.  Default is False.
   remotecmd;;
     remote command to use for clone/push/pull operations. Default is 'hg'.
   report_untrusted;;
deleted file mode 100644
--- a/doc/ja/hgmerge.1.ja.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-HGMERGE(1)
-==========
-Matt Mackall <mpm@selenic.com>
-v0.1, 27 May 2005
-
-名前
---
-hgmerge - Mercurial ソースコード管理システムでファイルをマージする
-のに使われるデフォルトのラッパー
-
-書式
---
-'hgmerge' local ancestor remote
-
-説明
---
-hgmerge(1) コマンドは Mercurial システムでファイルをマージするため
-のグラフィカルなインターフェイスを提供します。これは kdiff3,
-merge(1), tkdiff(1), または単純に diff(1) と patch(1) のラッパーで、
-どれがシステム上にあるかに依存します。
-
-hgmerge(1) は Mercurial ソースコード管理システムで環境変数
-HGMERGE が設定されていない場合に使われます。
-
-著者
---
-Vincent Danjean <Vincent.Danjean@free.fr> によって書かれました。
-
-関連情報
---
-hg(1) - Mercurial システムへのコマンドラインインターフェイス
-
-著作権情報
-----
-Copyright (C) 2005-2007 Matt Mackall.
-このソフトウェアの自由な使用は GNU 一般公有使用許諾 (GPL) のもとで
-認められます。
--- a/hgext/convert/__init__.py
+++ b/hgext/convert/__init__.py
@@ -14,16 +14,17 @@ def convert(ui, src, dest=None, revmapfi
     """Convert a foreign SCM repository to a Mercurial one.
 
     Accepted source formats:
     - Mercurial
     - CVS
     - Darcs
     - git
     - Subversion
+    - GNU Arch
 
     Accepted destination formats:
     - Mercurial
     - Subversion (history on branches is not preserved)
 
     If no revision is given, all revisions will be converted. Otherwise,
     convert will only import up to the named revision (given in a format
     understood by the source).
--- a/hgext/convert/common.py
+++ b/hgext/convert/common.py
@@ -25,18 +25,18 @@ def checktool(exe, name=None):
 
 class NoRepo(Exception): pass
 
 SKIPREV = 'SKIP'
 
 class commit(object):
     def __init__(self, author, date, desc, parents, branch=None, rev=None,
                  extra={}):
-        self.author = author
-        self.date = date
+        self.author = author or 'unknown'
+        self.date = date or '0 0'
         self.desc = desc
         self.parents = parents
         self.branch = branch
         self.rev = rev
         self.extra = extra
 
 class converter_source(object):
     """Conversion source interface"""
@@ -222,17 +222,17 @@ class commandline(object):
             try:
                 if len(k) == 1:
                     cmdline.append('' + v)
                 else:
                     cmdline[-1] += '=' + v
             except TypeError:
                 pass
         cmdline = [util.shellquote(arg) for arg in cmdline]
-        cmdline += ['<', util.nulldev]
+        cmdline += ['2>', util.nulldev, '<', util.nulldev]
         cmdline = ' '.join(cmdline)
         self.ui.debug(cmdline, '\n')
         return cmdline
 
     def _run(self, cmd, *args, **kwargs):
         cmdline = self._cmdline(cmd, *args, **kwargs)
         self.prerun()
         try:
@@ -241,29 +241,40 @@ class commandline(object):
             self.postrun()
 
     def run(self, cmd, *args, **kwargs):
         fp = self._run(cmd, *args, **kwargs)
         output = fp.read()
         self.ui.debug(output)
         return output, fp.close()
 
+    def runlines(self, cmd, *args, **kwargs):
+        fp = self._run(cmd, *args, **kwargs)
+        output = fp.readlines()
+        self.ui.debug(''.join(output))
+        return output, fp.close()
+
     def checkexit(self, status, output=''):
         if status:
             if output:
                 self.ui.warn(_('%s error:\n') % self.command)
                 self.ui.warn(output)
             msg = util.explain_exit(status)[0]
             raise util.Abort(_('%s %s') % (self.command, msg))
 
     def run0(self, cmd, *args, **kwargs):
         output, status = self.run(cmd, *args, **kwargs)
         self.checkexit(status, output)
         return output
 
+    def runlines0(self, cmd, *args, **kwargs):
+        output, status = self.runlines(cmd, *args, **kwargs)
+        self.checkexit(status, ''.join(output))
+        return output
+
     def getargmax(self):
         if '_argmax' in self.__dict__:
             return self._argmax
 
         # POSIX requires at least 4096 bytes for ARG_MAX
         self._argmax = 4096
         try:
             self._argmax = os.sysconf("SC_ARG_MAX")
@@ -306,16 +317,18 @@ class mapfile(dict):
         super(mapfile, self).__init__()
         self.ui = ui
         self.path = path
         self.fp = None
         self.order = []
         self._read()
 
     def _read(self):
+        if self.path is None:
+            return
         try:
             fp = open(self.path, 'r')
         except IOError, err:
             if err.errno != errno.ENOENT:
                 raise
             return
         for line in fp:
             key, value = line[:-1].split(' ', 1)
--- a/hgext/convert/convcmd.py
+++ b/hgext/convert/convcmd.py
@@ -6,28 +6,38 @@
 # of the GNU General Public License, incorporated herein by reference.
 
 from common import NoRepo, SKIPREV, converter_source, converter_sink, mapfile
 from cvs import convert_cvs
 from darcs import darcs_source
 from git import convert_git
 from hg import mercurial_source, mercurial_sink
 from subversion import debugsvnlog, svn_source, svn_sink
+from gnuarch import gnuarch_source
 import filemap
 
 import os, shutil
 from mercurial import hg, util
 from mercurial.i18n import _
 
+orig_encoding = 'ascii'
+
+def recode(s):
+    if isinstance(s, unicode):
+        return s.encode(orig_encoding, 'replace')
+    else:
+        return s.decode('utf-8').encode(orig_encoding, 'replace')
+
 source_converters = [
     ('cvs', convert_cvs),
     ('git', convert_git),
     ('svn', svn_source),
     ('hg', mercurial_source),
     ('darcs', darcs_source),
+    ('gnuarch', gnuarch_source),
     ]
 
 sink_converters = [
     ('hg', mercurial_sink),
     ('svn', svn_sink),
     ]
 
 def convertsource(ui, path, type, rev):
@@ -69,16 +79,18 @@ class converter(object):
         authorfile = self.dest.authorfile()
         if authorfile and os.path.exists(authorfile):
             self.readauthormap(authorfile)
         # Extend/Override with new author map if necessary
         if opts.get('authors'):
             self.readauthormap(opts.get('authors'))
             self.authorfile = self.dest.authorfile()
 
+        self.splicemap = mapfile(ui, ui.config('convert', 'splicemap'))
+
     def walktree(self, heads):
         '''Return a mapping that identifies the uncommitted parents of every
         uncommitted changeset.'''
         visit = heads
         known = {}
         parents = {}
         while visit:
             n = visit.pop(0)
@@ -93,67 +105,82 @@ class converter(object):
         return parents
 
     def toposort(self, parents):
         '''Return an ordering such that every uncommitted changeset is
         preceeded by all its uncommitted ancestors.'''
         visit = parents.keys()
         seen = {}
         children = {}
+        actives = []
 
         while visit:
             n = visit.pop(0)
             if n in seen: continue
             seen[n] = 1
             # Ensure that nodes without parents are present in the 'children'
             # mapping.
             children.setdefault(n, [])
+            hasparent = False
             for p in parents[n]:
                 if not p in self.map:
                     visit.append(p)
+                    hasparent = True
                 children.setdefault(p, []).append(n)
+            if not hasparent:
+                actives.append(n)
+
+        del seen
+        del visit
+
+        if self.opts.get('datesort'):
+            dates = {}
+            def getdate(n):
+                if n not in dates:
+                    dates[n] = util.parsedate(self.commitcache[n].date)
+                return dates[n]
+
+            def picknext(nodes):
+                return min([(getdate(n), n) for n in nodes])[1]
+        else:
+            prev = [None]
+            def picknext(nodes):
+                # Return the first eligible child of the previously converted
+                # revision, or any of them.
+                next = nodes[0]
+                for n in nodes:
+                    if prev[0] in parents[n]:
+                        next = n
+                        break
+                prev[0] = next
+                return next
 
         s = []
-        removed = {}
-        visit = children.keys()
-        while visit:
-            n = visit.pop(0)
-            if n in removed: continue
-            dep = 0
-            if n in parents:
-                for p in parents[n]:
-                    if p in self.map: continue
-                    if p not in removed:
-                        # we're still dependent
-                        visit.append(n)
-                        dep = 1
-                        break
+        pendings = {}
+        while actives:
+            n = picknext(actives)
+            actives.remove(n)
+            s.append(n)
 
-            if not dep:
-                # all n's parents are in the list
-                removed[n] = 1
-                if n not in self.map:
-                    s.append(n)
-                if n in children:
-                    for c in children[n]:
-                        visit.insert(0, c)
+            # Update dependents list
+            for c in children.get(n, []):
+                if c not in pendings:
+                    pendings[c] = [p for p in parents[c] if p not in self.map]
+                try:
+                    pendings[c].remove(n)
+                except ValueError:
+                    raise util.Abort(_('cycle detected between %s and %s')
+                                       % (recode(c), recode(n)))
+                if not pendings[c]:
+                    # Parents are converted, node is eligible
+                    actives.insert(0, c)
+                    pendings[c] = None
 
-        if self.opts.get('datesort'):
-            depth = {}
-            for n in s:
-                depth[n] = 0
-                pl = [p for p in self.commitcache[n].parents
-                      if p not in self.map]
-                if pl:
-                    depth[n] = max([depth[p] for p in pl]) + 1
-
-            s = [(depth[n], util.parsedate(self.commitcache[n].date), n)
-                 for n in s]
-            s.sort()
-            s = [e[2] for e in s]
+        if len(s) != len(parents):
+            raise util.Abort(_("not all revisions were sorted"))
 
         return s
 
     def writeauthormap(self):
         authorfile = self.authorfile
         if authorfile:
            self.ui.status('Writing author map file %s\n' % authorfile)
            ofile = open(authorfile, 'w+')
@@ -219,26 +246,28 @@ class converter(object):
                 e = self.source.getmode(f, v)
                 self.dest.putfile(f, e, data)
                 if do_copies:
                     if f in copies:
                         copyf = copies[f]
                         # Merely marks that a copy happened.
                         self.dest.copyfile(copyf, f)
 
-        parents = [b[0] for b in pbranches]
+        try:
+            parents = [self.splicemap[rev]]
+            self.ui.debug('spliced in %s as parents of %s\n' %
+                          (parents, rev))
+        except KeyError:
+            parents = [b[0] for b in pbranches]
         newnode = self.dest.putcommit(filenames, parents, commit)
         self.source.converted(rev, newnode)
         self.map[rev] = newnode
 
     def convert(self):
 
-        def recode(s):
-            return s.decode('utf-8').encode(orig_encoding, 'replace')
-
         try:
             self.source.before()
             self.dest.before()
             self.source.setrevmap(self.map)
             self.ui.status("scanning source...\n")
             heads = self.source.getheads()
             parents = self.walktree(heads)
             self.ui.status("sorting...\n")
@@ -279,18 +308,16 @@ class converter(object):
 
     def cleanup(self):
         try:
             self.dest.after()
         finally:
             self.source.after()
         self.map.close()
 
-orig_encoding = 'ascii'
-
 def convert(ui, src, dest=None, revmapfile=None, **opts):
     global orig_encoding
     orig_encoding = util._encoding
     util._encoding = 'UTF-8'
 
     if not dest:
         dest = hg.defaultdest(src) + "-hg"
         ui.status("assuming destination %s\n" % dest)
--- a/hgext/convert/cvs.py
+++ b/hgext/convert/cvs.py
@@ -66,17 +66,17 @@ class convert_cvs(converter_source):
                         date = util.datestr(date)
                     elif l.startswith("Branch"):
                         branch = l[8:-1]
                         self.parent[id] = self.lastbranch.get(branch, 'bad')
                         self.lastbranch[branch] = id
                     elif l.startswith("Ancestor branch"):
                         ancestor = l[17:-1]
                         # figure out the parent later
-                        self.parent[id] = None
+                        self.parent[id] = self.lastbranch[ancestor]
                     elif l.startswith("Author"):
                         author = self.recode(l[8:-1])
                     elif l.startswith("Tag:") or l.startswith("Tags:"):
                         t = l[l.index(':')+1:]
                         t = [ut.strip() for ut in t.split(',')]
                         if (len(t) > 1) or (t[0] and (t[0] != "(none)")):
                             self.tags.update(dict.fromkeys(t, id))
                     elif l.startswith("Log:"):
@@ -96,23 +96,24 @@ class convert_cvs(converter_source):
                 elif state == 2: # members
                     if l == "\n": # start of next entry
                         state = 0
                         p = [self.parent[id]]
                         if id == "1":
                             p = []
                         if branch == "HEAD":
                             branch = ""
-                        if branch and p[0] == None:
+                        if branch:
                             latest = None
                             # the last changeset that contains a base
                             # file is our parent
                             for r in oldrevs:
-                                latest = max(filerevids[r], latest)
-                            p = [latest]
+                                latest = max(filerevids.get(r, None), latest)
+                            if latest:
+                                p = [latest]
 
                         # add current commit to set
                         c = commit(author=author, date=date, parents=p,
                                    desc=log, branch=branch)
                         self.changeset[id] = c
                         self.files[id] = files
                     else:
                         colon = l.rfind(':')
--- a/hgext/convert/git.py
+++ b/hgext/convert/git.py
@@ -97,17 +97,16 @@ class convert_git(converter_source):
                 if committer[0] == "<": committer = committer[1:-1]
                 committer = self.recode(committer)
                 message += "\ncommitter: %s\n" % committer
             if n == "parent": parents.append(v)
 
         tzs, tzh, tzm = tz[-5:-4] + "1", tz[-4:-2], tz[-2:]
         tz = -int(tzs) * (int(tzh) * 3600 + int(tzm))
         date = tm + " " + str(tz)
-        author = author or "unknown"
 
         c = commit(parents=parents, date=date, author=author, desc=message,
                    rev=version)
         return c
 
     def gettags(self):
         tags = {}
         fh = self.gitcmd('git-ls-remote --tags "%s"' % self.path)
new file mode 100644
--- /dev/null
+++ b/hgext/convert/gnuarch.py
@@ -0,0 +1,301 @@
+# GNU Arch support for the convert extension
+
+from common import NoRepo, checktool, commandline, commit, converter_source
+from mercurial.i18n import _
+from mercurial import util
+import os, shutil, tempfile, stat
+
+class gnuarch_source(converter_source, commandline):
+
+    class gnuarch_rev:
+        def __init__(self, rev):
+            self.rev = rev
+            self.summary = ''
+            self.date = None
+            self.author = ''
+            self.add_files = []
+            self.mod_files = []
+            self.del_files = []
+            self.ren_files = {}
+            self.ren_dirs = {}
+
+    def __init__(self, ui, path, rev=None):
+        super(gnuarch_source, self).__init__(ui, path, rev=rev)
+
+        if not os.path.exists(os.path.join(path, '{arch}')):
+            raise NoRepo(_("%s does not look like a GNU Arch repo" % path))
+
+        # Could use checktool, but we want to check for baz or tla.
+        self.execmd = None
+        if util.find_exe('baz'):
+            self.execmd = 'baz'
+        else:
+            if util.find_exe('tla'):
+                self.execmd = 'tla'
+            else:
+                raise util.Abort(_('cannot find a GNU Arch tool'))
+
+        commandline.__init__(self, ui, self.execmd)
+
+        self.path = os.path.realpath(path)
+        self.tmppath = None
+
+        self.treeversion = None
+        self.lastrev = None
+        self.changes = {}
+        self.parents = {}
+        self.tags = {}
+        self.modecache = {}
+
+    def before(self):
+        if self.execmd == 'tla':
+            output = self.run0('tree-version', self.path)
+        else:
+            output = self.run0('tree-version', '-d', self.path)
+        self.treeversion = output.strip()
+
+        self.ui.status(_('analyzing tree version %s...\n' % self.treeversion))
+
+        # Get name of temporary directory
+        version = self.treeversion.split('/')
+        self.tmppath = os.path.join(tempfile.gettempdir(),
+                                    'hg-%s' % version[1])
+
+        # Generate parents dictionary
+        child = []
+        output, status = self.runlines('revisions', self.treeversion)
+        self.checkexit(status, 'archive registered?')
+        for l in output:
+            rev = l.strip()
+            self.changes[rev] = self.gnuarch_rev(rev)
+
+            # Read author, date and summary
+            catlog = self.runlines0('cat-log', '-d', self.path, rev)
+            self._parsecatlog(catlog, rev)
+
+            self.parents[rev] = child
+            child = [rev]
+            if rev == self.rev:
+                break
+        self.parents[None] = child
+
+    def after(self):
+        self.ui.debug(_('cleaning up %s\n' % self.tmppath))
+        shutil.rmtree(self.tmppath, ignore_errors=True)
+
+    def getheads(self):
+        return self.parents[None]
+
+    def getfile(self, name, rev):
+        if rev != self.lastrev:
+            raise util.Abort(_('internal calling inconsistency'))
+
+        # Raise IOError if necessary (i.e. deleted files).
+        if not os.path.exists(os.path.join(self.tmppath, name)):
+            raise IOError
+
+        data, mode = self._getfile(name, rev)
+        self.modecache[(name, rev)] = mode
+
+        return data
+
+    def getmode(self, name, rev):
+        return self.modecache[(name, rev)]
+
+    def getchanges(self, rev):
+        self.modecache = {}
+        self._update(rev)
+        changes = []
+        copies = {}
+
+        for f in self.changes[rev].add_files:
+            changes.append((f, rev))
+
+        for f in self.changes[rev].mod_files:
+            changes.append((f, rev))
+
+        for f in self.changes[rev].del_files:
+            changes.append((f, rev))
+
+        for src in self.changes[rev].ren_files:
+            to = self.changes[rev].ren_files[src]
+            changes.append((src, rev))
+            changes.append((to, rev))
+            copies[src] = to
+
+        for src in self.changes[rev].ren_dirs:
+            to = self.changes[rev].ren_dirs[src]
+            chgs, cps = self._rendirchanges(src, to);
+            changes += [(f, rev) for f in chgs]
+            for c in cps:
+                copies[c] = cps[c]
+
+        changes.sort()
+        self.lastrev = rev
+
+        return changes, copies
+
+    def getcommit(self, rev):
+        changes = self.changes[rev]
+        return commit(author = changes.author, date = changes.date,
+                      desc = changes.summary, parents = self.parents[rev])
+
+    def gettags(self):
+        return self.tags
+
+    def _execute(self, cmd, *args, **kwargs):
+        cmdline = [self.execmd, cmd]
+        cmdline += args
+        cmdline = [util.shellquote(arg) for arg in cmdline]
+        cmdline += ['>', util.nulldev, '2>', util.nulldev]
+        cmdline = util.quotecommand(' '.join(cmdline))
+        self.ui.debug(cmdline, '\n')
+        return os.system(cmdline)
+
+    def _update(self, rev):
+        if rev == 'base-0':
+            # Initialise 'base-0' revision
+            self._obtainrevision(rev)
+        else:
+            self.ui.debug(_('applying revision %s...\n' % rev))
+            revision = '%s--%s' % (self.treeversion, rev)
+            changeset, status = self.runlines('replay', '-d', self.tmppath,
+                                              revision)
+            if status:
+                # Something went wrong while merging (baz or tla
+                # issue?), get latest revision and try from there
+                shutil.rmtree(self.tmppath, ignore_errors=True)
+                self._obtainrevision(rev)
+            else:
+                old_rev = self.parents[rev][0]
+                self.ui.debug(_('computing changeset between %s and %s...\n' \
+                                    % (old_rev, rev)))
+                rev_a = '%s--%s' % (self.treeversion, old_rev)
+                rev_b = '%s--%s' % (self.treeversion, rev)
+                self._parsechangeset(changeset, rev)
+
+    def _getfile(self, name, rev):
+        mode = os.lstat(os.path.join(self.tmppath, name)).st_mode
+        if stat.S_ISLNK(mode):
+            data = os.readlink(os.path.join(self.tmppath, name))
+            mode = mode and 'l' or ''
+        else:
+            data = open(os.path.join(self.tmppath, name), 'rb').read()
+            mode = (mode & 0111) and 'x' or ''
+        return data, mode
+
+    def _exclude(self, name):
+        exclude = [ '{arch}', '.arch-ids', '.arch-inventory' ]
+        for exc in exclude:
+            if name.find(exc) != -1:
+                return True
+        return False
+
+    def _readcontents(self, path):
+        files = []
+        contents = os.listdir(path)
+        while len(contents) > 0:
+            c = contents.pop()
+            p = os.path.join(path, c)
+            # os.walk could be used, but here we avoid internal GNU
+            # Arch files and directories, thus saving a lot time.
+            if not self._exclude(p):
+                if os.path.isdir(p):
+                    contents += [os.path.join(c, f) for f in os.listdir(p)]
+                else:
+                    files.append(c)
+        return files
+
+    def _rendirchanges(self, src, dest):
+        changes = []
+        copies = {}
+        files = self._readcontents(os.path.join(self.tmppath, dest))
+        for f in files:
+            s = os.path.join(src, f)
+            d = os.path.join(dest, f)
+            changes.append(s)
+            changes.append(d)
+            copies[s] = d
+        return changes, copies
+
+    def _obtainrevision(self, rev):
+        self.ui.debug(_('obtaining revision %s...\n' % rev))
+        revision = '%s--%s' % (self.treeversion, rev)
+        output = self._execute('get', revision, self.tmppath)
+        self.checkexit(output)
+        self.ui.debug(_('analysing revision %s...\n' % rev))
+        files = self._readcontents(self.tmppath)
+        self.changes[rev].add_files += files
+
+    def _stripbasepath(self, path):
+        if path.startswith('./'):
+            return path[2:]
+        return path
+
+    def _parsecatlog(self, data, rev):
+        summary = []
+        for l in data:
+            l = l.strip()
+            if summary:
+                summary.append(l)
+            elif l.startswith('Summary:'):
+                summary.append(l[len('Summary: '):])
+            elif l.startswith('Standard-date:'):
+                date = l[len('Standard-date: '):]
+                strdate = util.strdate(date, '%Y-%m-%d %H:%M:%S')
+                self.changes[rev].date = util.datestr(strdate)
+            elif l.startswith('Creator:'):
+                self.changes[rev].author = l[len('Creator: '):]
+        self.changes[rev].summary = '\n'.join(summary)
+
+    def _parsechangeset(self, data, rev):
+        for l in data:
+            l = l.strip()
+            # Added file (ignore added directory)
+            if l.startswith('A') and not l.startswith('A/'):
+                file = self._stripbasepath(l[1:].strip())
+                if not self._exclude(file):
+                    self.changes[rev].add_files.append(file)
+            # Deleted file (ignore deleted directory)
+            elif l.startswith('D') and not l.startswith('D/'):
+                file = self._stripbasepath(l[1:].strip())
+                if not self._exclude(file):
+                    self.changes[rev].del_files.append(file)
+            # Modified binary file
+            elif l.startswith('Mb'):
+                file = self._stripbasepath(l[2:].strip())
+                if not self._exclude(file):
+                    self.changes[rev].mod_files.append(file)
+            # Modified link
+            elif l.startswith('M->'):
+                file = self._stripbasepath(l[3:].strip())
+                if not self._exclude(file):
+                    self.changes[rev].mod_files.append(file)
+            # Modified file
+            elif l.startswith('M'):
+                file = self._stripbasepath(l[1:].strip())
+                if not self._exclude(file):
+                    self.changes[rev].mod_files.append(file)
+            # Renamed file (or link)
+            elif l.startswith('=>'):
+                files = l[2:].strip().split(' ')
+                if len(files) == 1:
+                    files = l[2:].strip().split('\t')
+                src = self._stripbasepath(files[0])
+                dst = self._stripbasepath(files[1])
+                if not self._exclude(src) and not self._exclude(dst):
+                    self.changes[rev].ren_files[src] = dst
+            # Conversion from file to link or from link to file (modified)
+            elif l.startswith('ch'):
+                file = self._stripbasepath(l[2:].strip())
+                if not self._exclude(file):
+                    self.changes[rev].mod_files.append(file)
+            # Renamed directory
+            elif l.startswith('/>'):
+                dirs = l[2:].strip().split(' ')
+                if len(dirs) == 1:
+                    dirs = l[2:].strip().split('\t')
+                src = self._stripbasepath(dirs[0])
+                dst = self._stripbasepath(dirs[1])
+                if not self._exclude(src) and not self._exclude(dst):
+                    self.changes[rev].ren_dirs[src] = dst
--- a/hgext/convert/subversion.py
+++ b/hgext/convert/subversion.py
@@ -942,17 +942,17 @@ class svn_sink(converter_sink, commandli
             if exists:
                 try:
                     os.unlink(wdest)
                 except OSError:
                     pass
                 os.rename(tempname, wdest)
 
     def dirs_of(self, files):
-        dirs = set()
+        dirs = util.set()
         for f in files:
             if os.path.isdir(self.wjoin(f)):
                 dirs.add(f)
             for i in strutil.rfindall(f, '/'):
                 dirs.add(f[:i])
         return dirs
 
     def add_dirs(self, files):
@@ -965,17 +965,18 @@ class svn_sink(converter_sink, commandli
 
     def add_files(self, files):
         if files:
             self.xargs(files, 'add', quiet=True)
         return files
 
     def tidy_dirs(self, names):
         dirs = list(self.dirs_of(names))
-        dirs.sort(reverse=True)
+        dirs.sort()
+        dirs.reverse()
         deleted = []
         for d in dirs:
             wd = self.wjoin(d)
             if os.listdir(wd) == '.svn':
                 self.run0('delete', d)
                 deleted.append(d)
         return deleted
 
@@ -986,17 +987,17 @@ class svn_sink(converter_sink, commandli
         return u"svn:%s@%s" % (self.uuid, rev)
 
     def putcommit(self, files, parents, commit):
         for parent in parents:
             try:
                 return self.revid(self.childmap[parent])
             except KeyError:
                 pass
-        entries = set(self.delete)
+        entries = util.set(self.delete)
         files = util.frozenset(files)
         entries.update(self.add_dirs(files.difference(entries)))
         if self.copies:
             for s, d in self.copies:
                 self._copyfile(s, d)
             self.copies = []
         if self.delete:
             self.xargs(self.delete, 'delete')
--- a/hgext/extdiff.py
+++ b/hgext/extdiff.py
@@ -75,56 +75,81 @@ def snapshot_node(ui, repo, files, node,
         open(dest, 'wb').write(data)
     return dirname
 
 
 def snapshot_wdir(ui, repo, files, tmproot):
     '''snapshot files from working directory.
     if not using snapshot, -I/-X does not work and recursive diff
     in tools like kdiff3 and meld displays too many files.'''
-    dirname = os.path.basename(repo.root)
+    repo_root = repo.root
+
+    dirname = os.path.basename(repo_root)
     if dirname == "":
         dirname = "root"
     base = os.path.join(tmproot, dirname)
     os.mkdir(base)
     ui.note(_('making snapshot of %d files from working dir\n') %
             (len(files)))
+
+    fns_and_mtime = []
+
     for fn in files:
         wfn = util.pconvert(fn)
         ui.note('  %s\n' % wfn)
         dest = os.path.join(base, wfn)
         destdir = os.path.dirname(dest)
         if not os.path.isdir(destdir):
             os.makedirs(destdir)
+
         fp = open(dest, 'wb')
         for chunk in util.filechunkiter(repo.wopener(wfn)):
             fp.write(chunk)
-    return dirname
+        fp.close()
+
+        fns_and_mtime.append((dest, os.path.join(repo_root, fn),
+            os.path.getmtime(dest)))
+
+
+    return dirname, fns_and_mtime
 
 
 def dodiff(ui, repo, diffcmd, diffopts, pats, opts):
+    '''Do the actuall diff:
+
+    - copy to a temp structure if diffing 2 internal revisions
+    - copy to a temp structure if diffing working revision with
+      another one and more than 1 file is changed
+    - just invoke the diff for a single file in the working dir
+    '''
     node1, node2 = cmdutil.revpair(repo, opts['rev'])
     files, matchfn, anypats = cmdutil.matchpats(repo, pats, opts)
     modified, added, removed, deleted, unknown = repo.status(
         node1, node2, files, match=matchfn)[:5]
     if not (modified or added or removed):
         return 0
 
     tmproot = tempfile.mkdtemp(prefix='extdiff.')
     dir2root = ''
     try:
         # Always make a copy of node1
         dir1 = snapshot_node(ui, repo, modified + removed, node1, tmproot)
         changes = len(modified) + len(removed) + len(added)
 
+        fns_and_mtime = []
+
         # If node2 in not the wc or there is >1 change, copy it
         if node2:
             dir2 = snapshot_node(ui, repo, modified + added, node2, tmproot)
         elif changes > 1:
-            dir2 = snapshot_wdir(ui, repo, modified + added, tmproot)
+            #we only actually need to get the files to copy back to the working
+            #dir in this case (because the other cases are: diffing 2 revisions
+            #or single file -- in which case the file is already directly passed
+            #to the diff tool).
+            dir2, fns_and_mtime = snapshot_wdir(ui, repo, modified + added, tmproot)
         else:
             # This lets the diff tool open the changed file directly
             dir2 = ''
             dir2root = repo.root
 
         # If only one change, diff the files instead of the directories
         if changes == 1 :
             if len(modified):
@@ -137,16 +162,23 @@ def dodiff(ui, repo, diffcmd, diffopts, 
                 dir1 = os.devnull
                 dir2 = os.path.join(dir2root, dir2, util.localpath(added[0]))
 
         cmdline = ('%s %s %s %s' %
                    (util.shellquote(diffcmd), ' '.join(diffopts),
                     util.shellquote(dir1), util.shellquote(dir2)))
         ui.debug('running %r in %s\n' % (cmdline, tmproot))
         util.system(cmdline, cwd=tmproot)
+
+        for copy_fn, working_fn, mtime in fns_and_mtime:
+            if os.path.getmtime(copy_fn) != mtime:
+                ui.debug('File changed while diffing. '
+                         'Overwriting: %s (src: %s)\n' % (working_fn, copy_fn))
+                util.copyfile(copy_fn, working_fn)
+
         return 1
     finally:
         ui.note(_('cleaning up temp directory\n'))
         shutil.rmtree(tmproot)
 
 def extdiff(ui, repo, *pats, **opts):
     '''use external program to diff repository (or selected files)
 
--- a/hgext/fetch.py
+++ b/hgext/fetch.py
@@ -60,16 +60,20 @@ def fetch(ui, repo, source='default', **
         revs = None
         if opts['rev'] and not other.local():
             raise util.Abort(_("fetch -r doesn't work for remote repositories yet"))
         elif opts['rev']:
             revs = [other.lookup(rev) for rev in opts['rev']]
         modheads = repo.pull(other, heads=revs)
         return postincoming(other, modheads)
 
+    date = opts.get('date')
+    if date:
+        opts['date'] = util.parsedate(date)
+
     parent, p2 = repo.dirstate.parents()
     if parent != repo.changelog.tip():
         raise util.Abort(_('working dir not at tip '
                            '(use "hg update" to check out tip)'))
     if p2 != nullid:
         raise util.Abort(_('outstanding uncommitted merge'))
     wlock = lock = None
     try:
--- a/hgext/gpg.py
+++ b/hgext/gpg.py
@@ -198,16 +198,21 @@ def sign(ui, repo, *revs, **opts):
 
     If no revision is given, the parent of the working directory is used,
     or tip if no revision is checked out.
     """
 
     mygpg = newgpg(ui, **opts)
     sigver = "0"
     sigmessage = ""
+
+    date = opts.get('date')
+    if date:
+        opts['date'] = util.parsedate(date)
+
     if revs:
         nodes = [repo.lookup(n) for n in revs]
     else:
         nodes = [node for node in repo.dirstate.parents()
                  if node != hgnode.nullid]
         if len(nodes) > 1:
             raise util.Abort(_('uncommitted merge - please provide a '
                                'specific revision'))
--- a/hgext/imerge.py
+++ b/hgext/imerge.py
@@ -2,17 +2,18 @@
 # Published under the GNU GPL
 
 '''
 imerge - interactive merge
 '''
 
 from mercurial.i18n import _
 from mercurial.node import *
-from mercurial import commands, cmdutil, dispatch, fancyopts, hg, merge, util
+from mercurial import commands, cmdutil, dispatch, fancyopts
+from mercurial import hg, filemerge, util
 import os, tarfile
 
 class InvalidStateFileException(Exception): pass
 
 class ImergeStateFile(object):
     def __init__(self, im):
         self.im = im
 
@@ -121,32 +122,32 @@ class Imerge(object):
             os.environ['HGMERGE'] = 'merge'
 
         # The filemerge ancestor algorithm does not work if self.wctx
         # already has two parents (in normal merge it doesn't yet). But
         # this is very dirty.
         self.wctx._parents.pop()
         try:
             # TODO: we should probably revert the file if merge fails
-            return merge.filemerge(self.repo, fn, fd, fo, self.wctx, p2)
+            return filemerge.filemerge(self.repo, fn, fd, fo, self.wctx, p2)
         finally:
             self.wctx._parents.append(p2)
             if realmerge:
                 os.environ['HGMERGE'] = realmerge
             elif not interactive:
                 del os.environ['HGMERGE']
 
     def start(self, rev=None):
-        _filemerge = merge.filemerge
-        def filemerge(repo, fw, fd, fo, wctx, mctx):
+        _filemerge = filemerge.filemerge
+        def filemerge_(repo, fw, fd, fo, wctx, mctx):
             self.conflicts[fw] = (fd, fo)
 
-        merge.filemerge = filemerge
+        filemerge.filemerge = filemerge_
         commands.merge(self.ui, self.repo, rev=rev)
-        merge.filemerge = _filemerge
+        filemerge.filemerge = _filemerge
 
         self.wctx = self.repo.workingctx()
         self.save()
 
     def resume(self):
         self.load()
 
         dp = self.repo.dirstate.parents()
--- a/hgext/keyword.py
+++ b/hgext/keyword.py
@@ -75,205 +75,252 @@ question to update keyword expansions af
 
 Expansions spanning more than one line and incremental expansions,
 like CVS' $Log$, are not supported. A keyword template map
 "Log = {desc}" expands to the first line of the changeset description.
 '''
 
 from mercurial import commands, cmdutil, context, dispatch, filelog, revlog
 from mercurial import patch, localrepo, templater, templatefilters, util
+from mercurial.hgweb import webcommands
 from mercurial.node import *
 from mercurial.i18n import _
-import re, shutil, sys, tempfile, time
+import re, shutil, tempfile, time
 
 commands.optionalrepo += ' kwdemo'
 
+# hg commands that do not act on keywords
+nokwcommands = ('add addremove bundle copy export grep identify incoming init'
+                ' log outgoing push remove rename rollback tip'
+                ' convert email glog')
+
 # hg commands that trigger expansion only when writing to working dir,
 # not when reading filelog, and unexpand when reading from working dir
-restricted = ('diff1', 'record',
-              'qfold', 'qimport', 'qnew', 'qpush', 'qrefresh', 'qrecord')
+restricted = 'record qfold qimport qnew qpush qrefresh qrecord'
 
 def utcdate(date):
     '''Returns hgdate in cvs-like UTC format.'''
     return time.strftime('%Y/%m/%d %H:%M:%S', time.gmtime(date[0]))
 
 
-_kwtemplater = None
+# make keyword tools accessible
+kwtools = {'templater': None, 'hgcmd': None}
+
+# store originals of monkeypatches
+_patchfile_init = patch.patchfile.__init__
+_patch_diff = patch.diff
+_dispatch_parse = dispatch._parse
+
+def _kwpatchfile_init(self, ui, fname, missing=False):
+    '''Monkeypatch/wrap patch.patchfile.__init__ to avoid
+    rejects or conflicts due to expanded keywords in working dir.'''
+    _patchfile_init(self, ui, fname, missing=missing)
+    # shrink keywords read from working dir
+    kwt = kwtools['templater']
+    self.lines = kwt.shrinklines(self.fname, self.lines)
+
+def _kw_diff(repo, node1=None, node2=None, files=None, match=util.always,
+             fp=None, changes=None, opts=None):
+    '''Monkeypatch patch.diff to avoid expansion except when
+    comparing against working dir.'''
+    if node2 is not None:
+        kwtools['templater'].matcher = util.never
+    elif node1 is not None and node1 != repo.changectx().node():
+        kwtools['templater'].restrict = True
+    _patch_diff(repo, node1=node1, node2=node2, files=files, match=match,
+                fp=fp, changes=changes, opts=opts)
+
+def _kwweb_changeset(web, req, tmpl):
+    '''Wraps webcommands.changeset turning off keyword expansion.'''
+    kwtools['templater'].matcher = util.never
+    return web.changeset(tmpl, web.changectx(req))
+
+def _kwweb_filediff(web, req, tmpl):
+    '''Wraps webcommands.filediff turning off keyword expansion.'''
+    kwtools['templater'].matcher = util.never
+    return web.filediff(tmpl, web.filectx(req))
+
+def _kwdispatch_parse(ui, args):
+    '''Monkeypatch dispatch._parse to obtain running hg command.'''
+    cmd, func, args, options, cmdoptions = _dispatch_parse(ui, args)
+    kwtools['hgcmd'] = cmd
+    return cmd, func, args, options, cmdoptions
+
+# dispatch._parse is run before reposetup, so wrap it here
+dispatch._parse = _kwdispatch_parse
+
 
 class kwtemplater(object):
     '''
     Sets up keyword templates, corresponding keyword regex, and
     provides keyword substitution functions.
     '''
     templates = {
         'Revision': '{node|short}',
         'Author': '{author|user}',
         'Date': '{date|utcdate}',
         'RCSFile': '{file|basename},v',
         'Source': '{root}/{file},v',
         'Id': '{file|basename},v {node|short} {date|utcdate} {author|user}',
         'Header': '{root}/{file},v {node|short} {date|utcdate} {author|user}',
     }
 
-    def __init__(self, ui, repo, inc, exc, hgcmd):
+    def __init__(self, ui, repo, inc, exc):
         self.ui = ui
         self.repo = repo
         self.matcher = util.matcher(repo.root, inc=inc, exc=exc)[1]
-        self.hgcmd = hgcmd
-        self.commitnode = None
-        self.path = ''
+        self.restrict = kwtools['hgcmd'] in restricted.split()
 
         kwmaps = self.ui.configitems('keywordmaps')
         if kwmaps: # override default templates
             kwmaps = [(k, templater.parsestring(v, quoted=False))
                       for (k, v) in kwmaps]
             self.templates = dict(kwmaps)
         escaped = map(re.escape, self.templates.keys())
         kwpat = r'\$(%s)(: [^$\n\r]*? )??\$' % '|'.join(escaped)
         self.re_kw = re.compile(kwpat)
 
         templatefilters.filters['utcdate'] = utcdate
         self.ct = cmdutil.changeset_templater(self.ui, self.repo,
                                               False, '', False)
 
-    def substitute(self, node, data, subfunc):
-        '''Obtains file's changenode if commit node not given,
-        and calls given substitution function.'''
-        if self.commitnode:
-            fnode = self.commitnode
-        else:
-            c = context.filectx(self.repo, self.path, fileid=node)
-            fnode = c.node()
+    def getnode(self, path, fnode):
+        '''Derives changenode from file path and filenode.'''
+        # used by kwfilelog.read and kwexpand
+        c = context.filectx(self.repo, path, fileid=fnode)
+        return c.node()
 
+    def substitute(self, data, path, node, subfunc):
+        '''Replaces keywords in data with expanded template.'''
         def kwsub(mobj):
-            '''Substitutes keyword using corresponding template.'''
             kw = mobj.group(1)
             self.ct.use_template(self.templates[kw])
             self.ui.pushbuffer()
-            self.ct.show(changenode=fnode, root=self.repo.root, file=self.path)
-            return '$%s: %s $' % (kw, templatefilters.firstline(
-                self.ui.popbuffer()))
-
+            self.ct.show(changenode=node, root=self.repo.root, file=path)
+            ekw = templatefilters.firstline(self.ui.popbuffer())
+            return '$%s: %s $' % (kw, ekw)
         return subfunc(kwsub, data)
 
-    def expand(self, node, data):
+    def expand(self, path, node, data):
         '''Returns data with keywords expanded.'''
-        if util.binary(data) or self.hgcmd in restricted:
-            return data
-        return self.substitute(node, data, self.re_kw.sub)
+        if not self.restrict and self.matcher(path) and not util.binary(data):
+            changenode = self.getnode(path, node)
+            return self.substitute(data, path, changenode, self.re_kw.sub)
+        return data
+
+    def iskwfile(self, path, islink):
+        '''Returns true if path matches [keyword] pattern
+        and is not a symbolic link.
+        Caveat: localrepository._link fails on Windows.'''
+        return self.matcher(path) and not islink(path)
 
-    def process(self, node, data, expand):
-        '''Returns a tuple: data, count.
-        Count is number of keywords/keyword substitutions,
-        telling caller whether to act on file containing data.'''
-        if util.binary(data):
-            return data, None
-        if expand:
-            return self.substitute(node, data, self.re_kw.subn)
-        return data, self.re_kw.search(data)
+    def overwrite(self, node=None, expand=True, files=None):
+        '''Overwrites selected files expanding/shrinking keywords.'''
+        ctx = self.repo.changectx(node)
+        mf = ctx.manifest()
+        if node is not None:     # commit
+            files = [f for f in ctx.files() if f in mf]
+            notify = self.ui.debug
+        else:                    # kwexpand/kwshrink
+            notify = self.ui.note
+        candidates = [f for f in files if self.iskwfile(f, mf.linkf)]
+        if candidates:
+            self.restrict = True # do not expand when reading
+            candidates.sort()
+            action = expand and 'expanding' or 'shrinking'
+            for f in candidates:
+                fp = self.repo.file(f)
+                data = fp.read(mf[f])
+                if util.binary(data):
+                    continue
+                if expand:
+                    changenode = node or self.getnode(f, mf[f])
+                    data, found = self.substitute(data, f, changenode,
+                                                  self.re_kw.subn)
+                else:
+                    found = self.re_kw.search(data)
+                if found:
+                    notify(_('overwriting %s %s keywords\n') % (f, action))
+                    self.repo.wwrite(f, data, mf.flags(f))
+                    self.repo.dirstate.normal(f)
+            self.restrict = False
 
-    def shrink(self, text):
+    def shrinktext(self, text):
+        '''Unconditionally removes all keyword substitutions from text.'''
+        return self.re_kw.sub(r'$\1$', text)
+
+    def shrink(self, fname, text):
         '''Returns text with all keyword substitutions removed.'''
-        if util.binary(text):
-            return text
-        return self.re_kw.sub(r'$\1$', text)
+        if self.matcher(fname) and not util.binary(text):
+            return self.shrinktext(text)
+        return text
+
+    def shrinklines(self, fname, lines):
+        '''Returns lines with keyword substitutions removed.'''
+        if self.matcher(fname):
+            text = ''.join(lines)
+            if not util.binary(text):
+                return self.shrinktext(text).splitlines(True)
+        return lines
+
+    def wread(self, fname, data):
+        '''If in restricted mode returns data read from wdir with
+        keyword substitutions removed.'''
+        return self.restrict and self.shrink(fname, data) or data
 
 class kwfilelog(filelog.filelog):
     '''
     Subclass of filelog to hook into its read, add, cmp methods.
     Keywords are "stored" unexpanded, and processed on reading.
     '''
     def __init__(self, opener, path):
         super(kwfilelog, self).__init__(opener, path)
-        _kwtemplater.path = path
-
-    def kwctread(self, node, expand):
-        '''Reads expanding and counting keywords, called from _overwrite.'''
-        data = super(kwfilelog, self).read(node)
-        return _kwtemplater.process(node, data, expand)
+        self.kwt = kwtools['templater']
+        self.path = path
 
     def read(self, node):
         '''Expands keywords when reading filelog.'''
         data = super(kwfilelog, self).read(node)
-        return _kwtemplater.expand(node, data)
+        return self.kwt.expand(self.path, node, data)
 
     def add(self, text, meta, tr, link, p1=None, p2=None):
         '''Removes keyword substitutions when adding to filelog.'''
-        text = _kwtemplater.shrink(text)
+        text = self.kwt.shrink(self.path, text)
         return super(kwfilelog, self).add(text, meta, tr, link, p1=p1, p2=p2)
 
     def cmp(self, node, text):
         '''Removes keyword substitutions for comparison.'''
-        text = _kwtemplater.shrink(text)
+        text = self.kwt.shrink(self.path, text)
         if self.renamed(node):
             t2 = super(kwfilelog, self).read(node)
             return t2 != text
         return revlog.revlog.cmp(self, node, text)
 
-
-# store original patch.patchfile.__init__
-_patchfile_init = patch.patchfile.__init__
-
-def _kwpatchfile_init(self, ui, fname, missing=False):
-    '''Monkeypatch/wrap patch.patchfile.__init__ to avoid
-    rejects or conflicts due to expanded keywords in working dir.'''
-    _patchfile_init(self, ui, fname, missing=missing)
-
-    if _kwtemplater.matcher(self.fname):
-        # shrink keywords read from working dir
-        kwshrunk = _kwtemplater.shrink(''.join(self.lines))
-        self.lines = kwshrunk.splitlines(True)
-
-
-def _iskwfile(f, link):
-    return not link(f) and _kwtemplater.matcher(f)
-
-def _status(ui, repo, *pats, **opts):
+def _status(ui, repo, kwt, *pats, **opts):
     '''Bails out if [keyword] configuration is not active.
     Returns status of working directory.'''
-    if _kwtemplater:
+    if kwt:
         files, match, anypats = cmdutil.matchpats(repo, pats, opts)
         return repo.status(files=files, match=match, list_clean=True)
     if ui.configitems('keyword'):
         raise util.Abort(_('[keyword] patterns cannot match'))
     raise util.Abort(_('no [keyword] patterns configured'))
 
-def _overwrite(ui, repo, node=None, expand=True, files=None):
-    '''Overwrites selected files expanding/shrinking keywords.'''
-    ctx = repo.changectx(node)
-    mf = ctx.manifest()
-    if node is not None:   # commit
-        _kwtemplater.commitnode = node
-        files = [f for f in ctx.files() if f in mf]
-        notify = ui.debug
-    else:                  # kwexpand/kwshrink
-        notify = ui.note
-    candidates = [f for f in files if _iskwfile(f, mf.linkf)]
-    if candidates:
-        candidates.sort()
-        action = expand and 'expanding' or 'shrinking'
-        for f in candidates:
-            fp = repo.file(f, kwmatch=True)
-            data, kwfound = fp.kwctread(mf[f], expand)
-            if kwfound:
-                notify(_('overwriting %s %s keywords\n') % (f, action))
-                repo.wwrite(f, data, mf.flags(f))
-                repo.dirstate.normal(f)
-
 def _kwfwrite(ui, repo, expand, *pats, **opts):
-    '''Selects files and passes them to _overwrite.'''
-    status = _status(ui, repo, *pats, **opts)
+    '''Selects files and passes them to kwtemplater.overwrite.'''
+    kwt = kwtools['templater']
+    status = _status(ui, repo, kwt, *pats, **opts)
     modified, added, removed, deleted, unknown, ignored, clean = status
     if modified or added or removed or deleted:
         raise util.Abort(_('outstanding uncommitted changes in given files'))
     wlock = lock = None
     try:
         wlock = repo.wlock()
         lock = repo.lock()
-        _overwrite(ui, repo, expand=expand, files=clean)
+        kwt.overwrite(expand=expand, files=clean)
     finally:
         del wlock, lock
 
 
 def demo(ui, repo, *args, **opts):
     '''print [keywordmaps] configuration and an expansion example
 
     Show current, custom, or default keyword template maps
@@ -365,23 +412,26 @@ def expand(ui, repo, *pats, **opts):
 
 def files(ui, repo, *pats, **opts):
     '''print files currently configured for keyword expansion
 
     Crosscheck which files in working directory are potential targets for
     keyword expansion.
     That is, files matched by [keyword] config patterns but not symlinks.
     '''
-    status = _status(ui, repo, *pats, **opts)
+    kwt = kwtools['templater']
+    status = _status(ui, repo, kwt, *pats, **opts)
     modified, added, removed, deleted, unknown, ignored, clean = status
     files = modified + added + clean
     if opts.get('untracked'):
         files += unknown
     files.sort()
-    kwfiles = [f for f in files if _iskwfile(f, repo._link)]
+    wctx = repo.workingctx()
+    islink = lambda p: 'l' in wctx.fileflags(p)
+    kwfiles = [f for f in files if kwt.iskwfile(f, islink)]
     cwd = pats and repo.getcwd() or ''
     kwfstats = not opts.get('ignore') and (('K', kwfiles),) or ()
     if opts.get('all') or opts.get('ignore'):
         kwfstats += (('I', [f for f in files if f not in kwfiles]),)
     for char, filenames in kwfstats:
         format = (opts.get('all') or ui.verbose) and '%s %%s\n' % char or '%s\n'
         for f in filenames:
             ui.write(format % repo.pathto(f, cwd))
@@ -402,66 +452,48 @@ def reposetup(ui, repo):
     '''Sets up repo as kwrepo for keyword substitution.
     Overrides file method to return kwfilelog instead of filelog
     if file matches user configuration.
     Wraps commit to overwrite configured files with updated
     keyword substitutions.
     This is done for local repos only, and only if there are
     files configured at all for keyword substitution.'''
 
-    if not repo.local():
-        return
+    try:
+        if (not repo.local() or kwtools['hgcmd'] in nokwcommands.split()
+            or '.hg' in util.splitpath(repo.root)
+            or repo._url.startswith('bundle:')):
+            return
+    except AttributeError:
+        pass
 
-    nokwcommands = ('add', 'addremove', 'bundle', 'clone', 'copy',
-                    'export', 'grep', 'identify', 'incoming', 'init',
-                    'log', 'outgoing', 'push', 'remove', 'rename',
-                    'rollback', 'tip',
-                    'convert')
-    hgcmd, func, args, opts, cmdopts = dispatch._parse(ui, sys.argv[1:])
-    if hgcmd in nokwcommands:
-        return
-
-    if hgcmd == 'diff':
-        # only expand if comparing against working dir
-        node1, node2 = cmdutil.revpair(repo, cmdopts.get('rev'))
-        if node2 is not None:
-            return
-        # shrink if rev is not current node
-        if node1 is not None and node1 != repo.changectx().node():
-            hgcmd = 'diff1'
-
-    inc, exc = [], ['.hgtags']
+    inc, exc = [], ['.hg*']
     for pat, opt in ui.configitems('keyword'):
         if opt != 'ignore':
             inc.append(pat)
         else:
             exc.append(pat)
     if not inc:
         return
 
-    global _kwtemplater
-    _kwtemplater = kwtemplater(ui, repo, inc, exc, hgcmd)
+    kwtools['templater'] = kwt = kwtemplater(ui, repo, inc, exc)
 
     class kwrepo(repo.__class__):
-        def file(self, f, kwmatch=False):
+        def file(self, f):
             if f[0] == '/':
                 f = f[1:]
-            if kwmatch or _kwtemplater.matcher(f):
-                return kwfilelog(self.sopener, f)
-            return filelog.filelog(self.sopener, f)
+            return kwfilelog(self.sopener, f)
 
         def wread(self, filename):
             data = super(kwrepo, self).wread(filename)
-            if hgcmd in restricted and _kwtemplater.matcher(filename):
-                return _kwtemplater.shrink(data)
-            return data
+            return kwt.wread(filename, data)
 
         def commit(self, files=None, text='', user=None, date=None,
                    match=util.always, force=False, force_editor=False,
-                   p1=None, p2=None, extra={}):
+                   p1=None, p2=None, extra={}, empty_ok=False):
             wlock = lock = None
             _p1 = _p2 = None
             try:
                 wlock = self.wlock()
                 lock = self.lock()
                 # store and postpone commit hooks
                 commithooks = {}
                 for name, cmd in ui.configitems('hooks'):
@@ -479,30 +511,34 @@ def reposetup(ui, repo):
                         _p2 = ''
                     else:
                         _p2 = hex(_p2)
 
                 node = super(kwrepo,
                              self).commit(files=files, text=text, user=user,
                                           date=date, match=match, force=force,
                                           force_editor=force_editor,
-                                          p1=p1, p2=p2, extra=extra)
+                                          p1=p1, p2=p2, extra=extra,
+                                          empty_ok=empty_ok)
 
                 # restore commit hooks
                 for name, cmd in commithooks.iteritems():
                     ui.setconfig('hooks', name, cmd)
                 if node is not None:
-                    _overwrite(ui, self, node=node)
+                    kwt.overwrite(node=node)
                     repo.hook('commit', node=node, parent1=_p1, parent2=_p2)
                 return node
             finally:
                 del wlock, lock
 
     repo.__class__ = kwrepo
     patch.patchfile.__init__ = _kwpatchfile_init
+    patch.diff = _kw_diff
+    webcommands.changeset = webcommands.rev = _kwweb_changeset
+    webcommands.filediff = webcommands.diff = _kwweb_filediff
 
 
 cmdtable = {
     'kwdemo':
         (demo,
          [('d', 'default', None, _('show default keyword template maps')),
           ('f', 'rcfile', [], _('read maps from rcfile'))],
          _('hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]...')),
--- a/hgext/mq.py
+++ b/hgext/mq.py
@@ -595,21 +595,31 @@ class queue:
         if m or a or r or d:
             if not force:
                 if refresh:
                     raise util.Abort(_("local changes found, refresh first"))
                 else:
                     raise util.Abort(_("local changes found"))
         return m, a, r, d
 
+    _reserved = ('series', 'status', 'guards')
+    def check_reserved_name(self, name):
+        if (name in self._reserved or name.startswith('.hg')
+            or name.startswith('.mq')):
+            raise util.Abort(_('"%s" cannot be used as the name of a patch')
+                             % name)
+
     def new(self, repo, patch, *pats, **opts):
         msg = opts.get('msg')
         force = opts.get('force')
         user = opts.get('user')
         date = opts.get('date')
+        if date:
+            date = util.parsedate(date)
+        self.check_reserved_name(patch)
         if os.path.exists(self.join(patch)):
             raise util.Abort(_('patch "%s" already exists') % patch)
         if opts.get('include') or opts.get('exclude') or pats:
             fns, match, anypats = cmdutil.matchpats(repo, pats, opts)
             m, a, r, d = repo.status(files=fns, match=match)[:4]
         else:
             m, a, r, d = self.check_localchanges(repo, force)
             fns, match, anypats = cmdutil.matchpats(repo, m + a + r)
@@ -627,17 +637,17 @@ class queue:
             self.parse_series()
             self.series_dirty = 1
             self.applied_dirty = 1
             p = self.opener(patch, "w")
             if date:
                 p.write("# HG changeset patch\n")
                 if user:
                     p.write("# User " + user + "\n")
-                p.write("# Date " + date + "\n")
+                p.write("# Date %d %d\n" % date)
                 p.write("\n")
             elif user:
                 p.write("From: " + user + "\n")
                 p.write("\n")
             if msg:
                 msg = msg + "\n"
                 p.write(msg)
             p.close()
@@ -867,20 +877,26 @@ class queue:
                 if popi >= end:
                     self.ui.warn("qpop: %s is already at the top\n" % patch)
                     return
             info = [ popi ] + [self.applied[popi].rev, self.applied[popi].name]
 
             start = info[0]
             rev = revlog.bin(info[1])
 
+            if update:
+                top = self.check_toppatch(repo)
+
+            if repo.changelog.heads(rev) != [revlog.bin(self.applied[-1].rev)]:
+                raise util.Abort("popping would remove a revision not "
+                                 "managed by this patch queue")
+
             # we know there are no local changes, so we can make a simplified
             # form of hg.update.
             if update:
-                top = self.check_toppatch(repo)
                 qp = self.qparents(repo, rev)
                 changes = repo.changelog.read(qp)
                 mmap = repo.manifest.read(changes[0])
                 m, a, r, d, u = repo.status(qp, top)[:5]
                 if d:
                     raise util.Abort("deletions found between repo revs")
                 for f in m:
                     getfile(f, mmap[f], mmap.flags(f))
@@ -893,18 +909,18 @@ class queue:
                         os.unlink(repo.wjoin(f))
                     except OSError, e:
                         if e.errno != errno.ENOENT:
                             raise
                     try: os.removedirs(os.path.dirname(repo.wjoin(f)))
                     except: pass
                     repo.dirstate.forget(f)
                 repo.dirstate.setparents(qp, revlog.nullid)
+            del self.applied[start:end]
             self.strip(repo, rev, update=False, backup='strip')
-            del self.applied[start:end]
             if len(self.applied):
                 self.ui.write("Now at: %s\n" % self.applied[-1].name)
             else:
                 self.ui.write("Patch queue now empty\n")
         finally:
             del wlock
 
     def diff(self, repo, pats, opts):
@@ -916,21 +932,26 @@ class queue:
         if opts.get('git'):
             self.diffopts().git = True
         self.printdiff(repo, qp, files=pats, opts=opts)
 
     def refresh(self, repo, pats=None, **opts):
         if len(self.applied) == 0:
             self.ui.write("No patches applied\n")
             return 1
+        newdate = opts.get('date')
+        if newdate:
+            newdate = '%d %d' % util.parsedate(newdate)
         wlock = repo.wlock()
         try:
             self.check_toppatch(repo)
             (top, patchfn) = (self.applied[-1].rev, self.applied[-1].name)
             top = revlog.bin(top)
+            if repo.changelog.heads(top) != [top]:
+                raise util.Abort("cannot refresh a revision with children")
             cparents = repo.changelog.parents(top)
             patchparent = self.qparents(repo, top)
             message, comments, user, date, patchfound = self.readheaders(patchfn)
 
             patchf = self.opener(patchfn, 'r+')
 
             # if the patch was a git patch, refresh it as a git patch
             for line in patchf:
@@ -974,17 +995,16 @@ class queue:
                 if not setheaderfield(comments, ['From: ', '# User '], newuser):
                     try:
                         patchheaderat = comments.index('# HG changeset patch')
                         comments.insert(patchheaderat + 1,'# User ' + newuser)
                     except ValueError:
                         comments = ['From: ' + newuser, ''] + comments
                 user = newuser
 
-            newdate = opts.get('date')
             if newdate:
                 if setheaderfield(comments, ['# Date '], newdate):
                     date = newdate
 
             if msg:
                 comments.append(msg)
 
             patchf.seek(0)
@@ -1107,22 +1127,23 @@ class queue:
                     else:
                         message = "\n".join(message)
                 else:
                     message = msg
 
                 if not user:
                     user = changes[1]
 
+                self.applied.pop()
+                self.applied_dirty = 1
                 self.strip(repo, top, update=False,
                            backup='strip')
                 n = repo.commit(filelist, message, user, date, match=matchfn,
                                 force=1)
-                self.applied[-1] = statusentry(revlog.hex(n), patchfn)
-                self.applied_dirty = 1
+                self.applied.append(statusentry(revlog.hex(n), patchfn))
                 self.removeundo(repo)
             else:
                 self.printdiff(repo, patchparent, fp=patchf)
                 patchf.close()
                 added = repo.status()[1]
                 for a in added:
                     f = repo.wjoin(a)
                     try:
@@ -1401,16 +1422,17 @@ class queue:
                     raise util.Abort(_('cannot import merge revision %d') % r)
                 if lastparent and lastparent != r:
                     raise util.Abort(_('revision %d is not the parent of %d')
                                      % (r, lastparent))
                 lastparent = p1
 
                 if not patchname:
                     patchname = normname('%d.diff' % r)
+                self.check_reserved_name(patchname)
                 checkseries(patchname)
                 checkfile(patchname)
                 self.full_series.insert(0, patchname)
 
                 patchf = self.opener(patchname, "w")
                 patch.export(repo, [n], fp=patchf, opts=self.diffopts())
                 patchf.close()
 
@@ -1423,30 +1445,32 @@ class queue:
             self.applied_dirty = 1
 
         for filename in files:
             if existing:
                 if filename == '-':
                     raise util.Abort(_('-e is incompatible with import from -'))
                 if not patchname:
                     patchname = normname(filename)
+                self.check_reserved_name(patchname)
                 if not os.path.isfile(self.join(patchname)):
                     raise util.Abort(_("patch %s does not exist") % patchname)
             else:
                 try:
                     if filename == '-':
                         if not patchname:
                             raise util.Abort(_('need --name to import a patch from -'))
                         text = sys.stdin.read()
                     else:
-                        text = file(filename).read()
+                        text = file(filename, 'rb').read()
                 except IOError:
                     raise util.Abort(_("unable to read %s") % patchname)
                 if not patchname:
                     patchname = normname(os.path.basename(filename))
+                self.check_reserved_name(patchname)
                 checkfile(patchname)
                 patchf = self.opener(patchname, "w")
                 patchf.write(text)
             checkseries(patchname)
             index = self.full_series_end() + i
             self.full_series[index:index] = [patchname]
             self.parse_series()
             self.ui.warn("adding %s to series file\n" % patchname)
@@ -1529,16 +1553,18 @@ def init(ui, repo, **opts):
     an unversioned patch repository into a versioned one).
     You can use qcommit to commit changes to this queue repository."""
     q = repo.mq
     r = q.init(repo, create=opts['create_repo'])
     q.save_dirty()
     if r:
         if not os.path.exists(r.wjoin('.hgignore')):
             fp = r.wopener('.hgignore', 'w')
+            fp.write('^\\.hg\n')
+            fp.write('^\\.mq\n')
             fp.write('syntax: glob\n')
             fp.write('status\n')
             fp.write('guards\n')
             fp.close()
         if not os.path.exists(r.wjoin('series')):
             r.wopener('series', 'w').close()
         r.add(['.hgignore', 'series'])
         commands.add(ui, r)
@@ -2142,37 +2168,46 @@ def reposetup(ui, repo):
 
             tagscache = super(mqrepo, self).tags()
 
             q = self.mq
             if not q.applied:
                 return tagscache
 
             mqtags = [(revlog.bin(patch.rev), patch.name) for patch in q.applied]
+
+            if mqtags[-1][0] not in self.changelog.nodemap:
+                self.ui.warn('mq status file refers to unknown node %s\n'
+                             % revlog.short(mqtags[-1][0]))
+                return tagscache
+
             mqtags.append((mqtags[-1][0], 'qtip'))
             mqtags.append((mqtags[0][0], 'qbase'))
             mqtags.append((self.changelog.parents(mqtags[0][0])[0], 'qparent'))
             for patch in mqtags:
                 if patch[1] in tagscache:
                     self.ui.warn('Tag %s overrides mq patch of the same name\n' % patch[1])
                 else:
                     tagscache[patch[1]] = patch[0]
 
             return tagscache
 
-        def _branchtags(self):
+        def _branchtags(self, partial, lrev):
             q = self.mq
             if not q.applied:
-                return super(mqrepo, self)._branchtags()
+                return super(mqrepo, self)._branchtags(partial, lrev)
 
-            self.branchcache = {} # avoid recursion in changectx
             cl = self.changelog
-            partial, last, lrev = self._readbranchcache()
+            qbasenode = revlog.bin(q.applied[0].rev)
+            if qbasenode not in cl.nodemap:
+                self.ui.warn('mq status file refers to unknown node %s\n'
+                             % revlog.short(qbasenode))
+                return super(mqrepo, self)._branchtags(partial, lrev)
 
-            qbase = cl.rev(revlog.bin(q.applied[0].rev))
+            qbase = cl.rev(qbasenode)
             start = lrev + 1
             if start < qbase:
                 # update the cache (excluding the patches) and save it
                 self._updatebranchcache(partial, lrev+1, qbase)
                 self._writebranchcache(partial, cl.node(qbase-1), qbase-1)
                 start = qbase
             # if start = qbase, the cache is as updated as it should be.
             # if start > qbase, the cache includes (part of) the patches.
@@ -2208,18 +2243,19 @@ cmdtable = {
          _('hg qclone [OPTION]... SOURCE [DEST]')),
     "qcommit|qci":
         (commit,
          commands.table["^commit|ci"][1],
          _('hg qcommit [OPTION]... [FILE]...')),
     "^qdiff":
         (diff,
          [('g', 'git', None, _('use git extended diff format')),
+          ('U', 'unified', 3, _('number of lines of context to show')),
          ] + commands.walkopts,
-         _('hg qdiff [-I] [-X] [-g] [FILE]...')),
+         _('hg qdiff [-I] [-X] [-U NUM] [-g] [FILE]...')),
     "qdelete|qremove|qrm":
         (delete,
          [('k', 'keep', None, _('keep patch file')),
           ('r', 'rev', [], _('stop managing a revision'))],
          _('hg qdelete [-k] [-r REV]... [PATCH]...')),
     'qfold':
         (fold,
          [('e', 'edit', None, _('edit patch header')),
deleted file mode 100755
--- a/hgmerge
+++ /dev/null
@@ -1,213 +0,0 @@
-#!/bin/sh
-#
-# hgmerge - default merge helper for Mercurial
-#
-# This tries to find a way to do three-way merge on the current system.
-# The result ought to end up in $1.  Script is run in root directory of
-# repository.
-#
-# Environment variables set by Mercurial:
-# HG_FILE            name of file within repo
-# HG_MY_NODE         revision being merged
-# HG_OTHER_NODE      revision being merged
-
-set -e # bail out quickly on failure
-
-LOCAL="$1"
-BASE="$2"
-OTHER="$3"
-
-if [ -n "$VISUAL" ]; then
-    EDIT_PROG="$VISUAL"
-elif [ -n "$EDITOR" ]; then
-    EDIT_PROG="$EDITOR"
-else
-    EDIT_PROG="vi"
-fi
-
-# find decent versions of our utilities, insisting on the GNU versions where we
-# need to
-MERGE="merge"
-DIFF3="gdiff3"
-DIFF="gdiff"
-PATCH="gpatch"
-
-type "$MERGE" >/dev/null 2>&1 || MERGE=
-type "$DIFF3" >/dev/null 2>&1 || DIFF3="diff3"
-$DIFF3 --version >/dev/null 2>&1 || DIFF3=
-type "$DIFF"  >/dev/null 2>&1 || DIFF="diff"
-type "$DIFF"  >/dev/null 2>&1 || DIFF=
-type "$PATCH" >/dev/null 2>&1 || PATCH="patch"
-type "$PATCH" >/dev/null 2>&1 || PATCH=
-
-# find optional visual utilities
-FILEMERGE="/Developer/Applications/Utilities/FileMerge.app/Contents/MacOS/FileMerge"
-KDIFF3="kdiff3"
-TKDIFF="tkdiff"
-MELD="meld"
-
-type "$FILEMERGE" >/dev/null 2>&1 || FILEMERGE=
-type "$KDIFF3"    >/dev/null 2>&1 || KDIFF3=
-type "$TKDIFF"    >/dev/null 2>&1 || TKDIFF=
-type "$MELD"      >/dev/null 2>&1 || MELD=
-
-# Hack for Solaris
-TEST="/usr/bin/test"
-type "$TEST" >/dev/null 2>&1 || TEST="/bin/test"
-type "$TEST" >/dev/null 2>&1 || TEST="test"
-
-# random part of names
-RAND="$RANDOM$RANDOM"
-
-# temporary directory for diff+patch merge
-HGTMP="${TMPDIR-/tmp}/hgmerge.$RAND"
-
-# backup file
-BACKUP="$LOCAL.orig.$RAND"
-
-# file used to test for file change
-CHGTEST="$LOCAL.chg.$RAND"
-
-# put all your required cleanup here
-cleanup() {
-    rm -f "$BACKUP" "$CHGTEST"
-    rm -rf "$HGTMP"
-}
-
-# functions concerning program exit
-success() {
-    cleanup
-    exit 0
-}
-
-failure() {
-    echo "merge failed" 1>&2
-    mv "$BACKUP" "$LOCAL"
-    cleanup
-    exit 1
-}
-
-# Ask if the merge was successful
-ask_if_merged() {
-    while true; do
-        echo "$LOCAL seems unchanged."
-        echo "Was the merge successful? [y/n]"
-        read answer
-        case "$answer" in
-            y*|Y*) success;;
-            n*|N*) failure;;
-        esac
-    done
-}
-
-# Check if conflict markers are present and ask if the merge was successful
-conflicts_or_success() {
-    while egrep '^(<<<<<<< .*|=======|>>>>>>> .*)$' "$LOCAL" >/dev/null; do
-        echo "$LOCAL contains conflict markers."
-        echo "Keep this version? [y/n]"
-        read answer
-        case "$answer" in
-            y*|Y*) success;;
-            n*|N*) failure;;
-        esac
-    done
-    success
-}
-
-# Clean up when interrupted
-trap "failure" 1 2 3 6 15 # HUP INT QUIT ABRT TERM
-
-# Back up our file (and try hard to keep the mtime unchanged)
-mv "$LOCAL" "$BACKUP"
-cp "$BACKUP" "$LOCAL"
-
-# Attempt to do a non-interactive merge
-if [ -n "$MERGE" -o -n "$DIFF3" ]; then
-    if [ -n "$MERGE" ]; then
-        $MERGE "$LOCAL" "$BASE" "$OTHER" 2> /dev/null && success
-    elif [ -n "$DIFF3" ]; then
-        $DIFF3 -m "$BACKUP" "$BASE" "$OTHER" > "$LOCAL" && success
-    fi
-    if [ $? -gt 1 ]; then
-        echo "automatic merge failed! Exiting." 1>&2
-        failure
-    fi
-fi
-
-# on MacOS X try FileMerge.app, shipped with Apple's developer tools
-if [ -n "$FILEMERGE" ]; then
-    cp "$BACKUP" "$LOCAL"
-    cp "$BACKUP" "$CHGTEST"
-    # filemerge prefers the right by default
-    $FILEMERGE -left "$OTHER" -right "$LOCAL" -ancestor "$BASE" -merge "$LOCAL"
-    [ $? -ne 0 ] && echo "FileMerge failed to launch" && failure
-    $TEST "$LOCAL" -nt "$CHGTEST" && conflicts_or_success || ask_if_merged
-fi
-
-if [ -n "$DISPLAY" ]; then
-    # try using kdiff3, which is fairly nice
-    if [ -n "$KDIFF3" ]; then
-        $KDIFF3 --auto "$BASE" "$BACKUP" "$OTHER" -o "$LOCAL" || failure
-        conflicts_or_success
-    fi
-
-    # try using tkdiff, which is a bit less sophisticated
-    if [ -n "$TKDIFF" ]; then
-        $TKDIFF "$BACKUP" "$OTHER" -a "$BASE" -o "$LOCAL" || failure
-        conflicts_or_success
-    fi
-
-    if [ -n "$MELD" ]; then
-        cp "$BACKUP" "$CHGTEST"
-        # protect our feet - meld allows us to save to the left file
-        cp "$BACKUP" "$LOCAL.tmp.$RAND"
-        # Meld doesn't have automatic merging, so to reduce intervention
-        # use the file with conflicts
-        $MELD "$LOCAL.tmp.$RAND" "$LOCAL" "$OTHER" || failure
-        # Also it doesn't return good error code
-        $TEST "$LOCAL" -nt "$CHGTEST" && conflicts_or_success || ask_if_merged
-    fi
-fi
-
-# Attempt to do a merge with $EDIT_PROG
-if [ -n "$MERGE" -o -n "$DIFF3" ]; then
-    echo "conflicts detected in $LOCAL"
-    cp "$BACKUP" "$CHGTEST"
-    case "$EDIT_PROG" in
-        "emacs")
-            $EDIT_PROG "$LOCAL" --eval '(condition-case nil (smerge-mode 1) (error nil))' || failure
-            ;;
-        *)
-            $EDIT_PROG "$LOCAL" || failure
-            ;;
-    esac
-    # Some editors do not return meaningful error codes
-    # Do not take any chances
-    $TEST "$LOCAL" -nt "$CHGTEST" && conflicts_or_success || ask_if_merged
-fi
-
-# attempt to manually merge with diff and patch
-if [ -n "$DIFF" -a -n "$PATCH" ]; then
-
-    (umask 077 && mkdir "$HGTMP") || {
-        echo "Could not create temporary directory $HGTMP" 1>&2
-        failure
-    }
-
-    $DIFF -u "$BASE" "$OTHER" > "$HGTMP/diff" || :
-    if $PATCH "$LOCAL" < "$HGTMP/diff"; then
-        success
-    else
-        # If rejects are empty after using the editor, merge was ok
-        $EDIT_PROG "$LOCAL" "$LOCAL.rej" || failure
-        $TEST -s "$LOCAL.rej" || success
-    fi
-    failure
-fi
-
-echo
-echo "hgmerge: unable to find any merge utility!"
-echo "supported programs:"
-echo "merge, FileMerge, tkdiff, kdiff3, meld, diff+patch"
-echo
-failure
--- a/hgweb.cgi
+++ b/hgweb.cgi
@@ -4,19 +4,19 @@
 
 # adjust python path if not a system-wide install:
 #import sys
 #sys.path.insert(0, "/path/to/python/lib")
 
 # enable importing on demand to reduce startup time
 from mercurial import demandimport; demandimport.enable()
 
-# send python tracebacks to the browser if an error occurs:
-import cgitb
-cgitb.enable()
+# Uncomment to send python tracebacks to the browser if an error occurs:
+#import cgitb
+#cgitb.enable()
 
 # If you'd like to serve pages with UTF-8 instead of your default
 # locale charset, you can do so by uncommenting the following lines.
 # Note that this will cause your .hgrc files to be interpreted in
 # UTF-8 and all your repo files to be displayed using UTF-8.
 #
 #import os
 #os.environ["HGENCODING"] = "UTF-8"
--- a/hgwebdir.cgi
+++ b/hgwebdir.cgi
@@ -4,19 +4,19 @@
 
 # adjust python path if not a system-wide install:
 #import sys
 #sys.path.insert(0, "/path/to/python/lib")
 
 # enable importing on demand to reduce startup time
 from mercurial import demandimport; demandimport.enable()
 
-# send python tracebacks to the browser if an error occurs:
-import cgitb
-cgitb.enable()
+# Uncomment to send python tracebacks to the browser if an error occurs:
+#import cgitb
+#cgitb.enable()
 
 # If you'd like to serve pages with UTF-8 instead of your default
 # locale charset, you can do so by uncommenting the following lines.
 # Note that this will cause your .hgrc files to be interpreted in
 # UTF-8 and all your repo files to be displayed using UTF-8.
 #
 #import os
 #os.environ["HGENCODING"] = "UTF-8"
--- a/mercurial/archival.py
+++ b/mercurial/archival.py
@@ -203,16 +203,18 @@ def archive(repo, dest, node, kind, deco
     def write(name, mode, islink, getdata):
         if matchfn and not matchfn(name): return
         data = getdata()
         if decode:
             data = repo.wwritedata(name, data)
         archiver.addfile(name, mode, islink, data)
 
     ctx = repo.changectx(node)
+    if kind not in archivers:
+        raise util.Abort(_("unknown archive type '%s'" % kind))
     archiver = archivers[kind](dest, prefix, mtime or ctx.date()[0])
     m = ctx.manifest()
     items = m.items()
     items.sort()
     write('.hg_archival.txt', 0644, False,
           lambda: 'repo: %s\nnode: %s\n' % (hex(repo.changelog.node(0)), hex(node)))
     for filename, filenode in items:
         write(filename, m.execf(filename) and 0755 or 0644, m.linkf(filename),
--- a/mercurial/bundlerepo.py
+++ b/mercurial/bundlerepo.py
@@ -149,18 +149,20 @@ class bundlefilelog(bundlerevlog, filelo
         filelog.filelog.__init__(self, opener, path)
         bundlerevlog.__init__(self, opener, self.indexfile, bundlefile,
                               linkmapper)
 
 class bundlerepository(localrepo.localrepository):
     def __init__(self, ui, path, bundlename):
         localrepo.localrepository.__init__(self, ui, path)
 
-        self._url = 'bundle:' + bundlename
-        if path: self._url += '+' + path
+        if path:
+            self._url = 'bundle:' + path + '+' + bundlename
+        else:
+            self._url = 'bundle:' + bundlename
 
         self.tempfile = None
         self.bundlefile = open(bundlename, "rb")
         header = self.bundlefile.read(6)
         if not header.startswith("HG"):
             raise util.Abort(_("%s: not a Mercurial bundle file") % bundlename)
         elif not header.startswith("HG10"):
             raise util.Abort(_("%s: unknown bundle version") % bundlename)
--- a/mercurial/cmdutil.py
+++ b/mercurial/cmdutil.py
@@ -1110,16 +1110,19 @@ def walkchangerevs(ui, repo, pats, chang
                     fns = fns_generator()
                 yield 'add', rev, fns
             for rev in nrevs:
                 yield 'iter', rev, None
     return iterate(), matchfn
 
 def commit(ui, repo, commitfunc, pats, opts):
     '''commit the specified files or all outstanding changes'''
+    date = opts.get('date')
+    if date:
+        opts['date'] = util.parsedate(date)
     message = logmessage(opts)
 
     # extract addremove carefully -- this function can be called from a command
     # that doesn't support addremove
     if opts.get('addremove'):
         addremove(repo, pats, opts)
 
     fns, match, anypats = matchpats(repo, pats, opts)
@@ -1128,32 +1131,33 @@ def commit(ui, repo, commitfunc, pats, o
         modified, added, removed, deleted, unknown = status[:5]
         files = modified + added + removed
         slist = None
         for f in fns:
             if f == '.':
                 continue
             if f not in files:
                 rf = repo.wjoin(f)
+                rel = repo.pathto(f)
                 try:
                     mode = os.lstat(rf)[stat.ST_MODE]
                 except OSError:
-                    raise util.Abort(_("file %s not found!") % rf)
+                    raise util.Abort(_("file %s not found!") % rel)
                 if stat.S_ISDIR(mode):
                     name = f + '/'
                     if slist is None:
                         slist = list(files)
                         slist.sort()
                     i = bisect.bisect(slist, name)
                     if i >= len(slist) or not slist[i].startswith(name):
                         raise util.Abort(_("no match under directory %s!")
-                                         % rf)
+                                         % rel)
                 elif not (stat.S_ISREG(mode) or stat.S_ISLNK(mode)):
                     raise util.Abort(_("can't commit %s: "
-                                       "unsupported file type!") % rf)
+                                       "unsupported file type!") % rel)
                 elif f not in repo.dirstate:
-                    raise util.Abort(_("file %s not tracked!") % rf)
+                    raise util.Abort(_("file %s not tracked!") % rel)
     else:
         files = []
     try:
         return commitfunc(ui, repo, files, message, match, opts)
     except ValueError, inst:
         raise util.Abort(str(inst))
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -73,17 +73,18 @@ def annotate(ui, repo, *pats, **opts):
 
     This command is useful to discover who did a change or when a change took
     place.
 
     Without the -a option, annotate will avoid processing files it
     detects as binary. With -a, annotate will generate an annotation
     anyway, probably with undesirable results.
     """
-    getdate = util.cachefunc(lambda x: util.datestr(x[0].date()))
+    datefunc = ui.quiet and util.shortdate or util.datestr
+    getdate = util.cachefunc(lambda x: datefunc(x[0].date()))
 
     if not pats:
         raise util.Abort(_('at least one file name or pattern required'))
 
     opmap = [('user', lambda x: ui.shortuser(x[0].user())),
              ('number', lambda x: str(x[0].rev())),
              ('changeset', lambda x: short(x[0].node())),
              ('date', getdate),
@@ -190,16 +191,20 @@ def backout(ui, repo, node=None, rev=Non
         raise util.Abort(_("please specify just one revision"))
 
     if not rev:
         rev = node
 
     if not rev:
         raise util.Abort(_("please specify a revision to backout"))
 
+    date = opts.get('date')
+    if date:
+        opts['date'] = util.parsedate(date)
+
     cmdutil.bail_if_changed(repo)
     node = repo.lookup(rev)
 
     op1, op2 = repo.dirstate.parents()
     a = repo.changelog.ancestor(op1, node)
     if a != node:
         raise util.Abort(_('cannot back out change on a different branch'))
 
@@ -220,16 +225,17 @@ def backout(ui, repo, node=None, rev=Non
             raise util.Abort(_('cannot use --parent on non-merge changeset'))
         parent = p1
 
     hg.clean(repo, node, show_stats=False)
     revert_opts = opts.copy()
     revert_opts['date'] = None
     revert_opts['all'] = True
     revert_opts['rev'] = hex(parent)
+    revert_opts['no_backup'] = None
     revert(ui, repo, **revert_opts)
     commit_opts = opts.copy()
     commit_opts['addremove'] = False
     if not commit_opts['message'] and not commit_opts['logfile']:
         commit_opts['message'] = _("Backed out changeset %s") % (short(node))
         commit_opts['force_editor'] = True
     commit(ui, repo, **commit_opts)
     def nice(node):
@@ -334,16 +340,18 @@ def branch(ui, repo, label=None, **opts)
     """set or show the current branch name
 
     With no argument, show the current branch name. With one argument,
     set the working directory branch name (the branch does not exist in
     the repository until the next commit).
 
     Unless --force is specified, branch will not let you set a
     branch name that shadows an existing branch.
+
+    Use the command 'hg update' to switch to an existing branch.
     """
 
     if label:
         if not opts.get('force') and label in repo.branchtags():
             if label not in [p.branch() for p in repo.workingctx().parents()]:
                 raise util.Abort(_('a branch of the same name already exists'
                                    ' (use --force to override)'))
         repo.dirstate.setbranch(util.fromlocal(label))
@@ -353,16 +361,18 @@ def branch(ui, repo, label=None, **opts)
 
 def branches(ui, repo, active=False):
     """list repository named branches
 
     List the repository's named branches, indicating which ones are
     inactive.  If active is specified, only show active branches.
 
     A branch is considered active if it contains unmerged heads.
+
+    Use the command 'hg update' to switch to an existing branch.
     """
     b = repo.branchtags()
     heads = dict.fromkeys(repo.heads(), 1)
     l = [((n in heads), repo.changelog.rev(n), n, t) for t, n in b.items()]
     l.sort()
     l.reverse()
     for ishead, r, n, t in l:
         if active and not ishead:
@@ -456,17 +466,20 @@ def cat(ui, repo, file1, *pats, **opts):
     %d   dirname of file being printed, or '.' if in repo root
     %p   root-relative path name of file being printed
     """
     ctx = repo.changectx(opts['rev'])
     err = 1
     for src, abs, rel, exact in cmdutil.walk(repo, (file1,) + pats, opts,
                                              ctx.node()):
         fp = cmdutil.make_file(repo, opts['output'], ctx.node(), pathname=abs)
-        fp.write(ctx.filectx(abs).data())
+        data = ctx.filectx(abs).data()
+        if opts.get('decode'):
+            data = repo.wwritedata(abs, data)
+        fp.write(data)
         err = 0
     return err
 
 def clone(ui, source, dest=None, **opts):
     """make a copy of an existing repository
 
     Create a copy of an existing repository in a new directory.
 
@@ -804,50 +817,16 @@ def debuginstall(ui):
         else:
             ui.write(_(" Internal patcher failure, please report this error"
                        " to http://www.selenic.com/mercurial/bts\n"))
     problems += patchproblems
 
     os.unlink(fa)
     os.unlink(fd)
 
-    # merge helper
-    ui.status(_("Checking merge helper...\n"))
-    cmd = (os.environ.get("HGMERGE") or ui.config("ui", "merge")
-           or "hgmerge")
-    cmdpath = util.find_exe(cmd) or util.find_exe(cmd.split()[0])
-    if not cmdpath:
-        if cmd == 'hgmerge':
-            ui.write(_(" No merge helper set and can't find default"
-                       " hgmerge script in PATH\n"))
-            ui.write(_(" (specify a merge helper in your .hgrc file)\n"))
-        else:
-            ui.write(_(" Can't find merge helper '%s' in PATH\n") % cmd)
-            ui.write(_(" (specify a merge helper in your .hgrc file)\n"))
-            problems += 1
-    else:
-        # actually attempt a patch here
-        fa = writetemp("1\n2\n3\n4\n")
-        fl = writetemp("1\n2\n3\ninsert\n4\n")
-        fr = writetemp("begin\n1\n2\n3\n4\n")
-        r = util.system('%s "%s" "%s" "%s"' % (cmd, fl, fa, fr))
-        if r:
-            ui.write(_(" Got unexpected merge error %d!\n") % r)
-            problems += 1
-        m = file(fl).read()
-        if m != "begin\n1\n2\n3\ninsert\n4\n":
-            ui.write(_(" Got unexpected merge results!\n"))
-            ui.write(_(" (your merge helper may have the"
-                       " wrong argument order)\n"))
-            ui.write(_(" Result: %r\n") % m)
-            problems += 1
-        os.unlink(fa)
-        os.unlink(fl)
-        os.unlink(fr)
-
     # editor
     ui.status(_("Checking commit editor...\n"))
     editor = ui.geteditor()
     cmdpath = util.find_exe(editor) or util.find_exe(editor.split()[0])
     if not cmdpath:
         if editor == 'vi':
             ui.write(_(" No commit editor set and can't find vi in PATH\n"))
             ui.write(_(" (specify a commit editor in your .hgrc file)\n"))
@@ -987,17 +966,17 @@ def grep(ui, repo, pattern, *pats, **opt
     use the --all flag.
     """
     reflags = 0
     if opts['ignore_case']:
         reflags |= re.I
     try:
         regexp = re.compile(pattern, reflags)
     except Exception, inst:
-        ui.warn(_("grep: invalid match pattern: %s!\n") % inst)
+        ui.warn(_("grep: invalid match pattern: %s\n") % inst)
         return None
     sep, eol = ':', '\n'
     if opts['print0']:
         sep = eol = '\0'
 
     fcache = {}
     def getfile(fn):
         if fn not in fcache:
@@ -1049,31 +1028,34 @@ def grep(ui, repo, pattern, *pats, **opt
             elif tag == 'replace':
                 for i in xrange(alo, ahi):
                     yield ('-', a[i])
                 for i in xrange(blo, bhi):
                     yield ('+', b[i])
 
     prev = {}
     def display(fn, rev, states, prevstates):
+        datefunc = ui.quiet and util.shortdate or util.datestr
         found = False
         filerevmatches = {}
         r = prev.get(fn, -1)
         if opts['all']:
             iter = difflinestates(states, prevstates)
         else:
             iter = [('', l) for l in prevstates]
         for change, l in iter:
             cols = [fn, str(r)]
             if opts['line_number']:
                 cols.append(str(l.linenum))
             if opts['all']:
                 cols.append(change)
             if opts['user']:
                 cols.append(ui.shortuser(get(r)[1]))
+            if opts.get('date'):
+                cols.append(datefunc(get(r)[2]))
             if opts['files_with_matches']:
                 c = (fn, r)
                 if c in filerevmatches:
                     continue
                 filerevmatches[c] = 1
             else:
                 cols.append(l.line)
             ui.write(sep.join(cols), eol)
@@ -1457,16 +1439,20 @@ def import_(ui, repo, patch1, *patches, 
     if the resulting changeset has a different ID than the one
     recorded in the patch. This may happen due to character set
     problems or other deficiencies in the text patch format.
 
     To read a patch from standard input, use patch name "-".
     """
     patches = (patch1,) + patches
 
+    date = opts.get('date')
+    if date:
+        opts['date'] = util.parsedate(date)
+
     if opts.get('exact') or not opts['force']:
         cmdutil.bail_if_changed(repo)
 
     d = opts["base"]
     strip = opts["strip"]
     wlock = lock = None
     try:
         wlock = repo.wlock()
@@ -1531,16 +1517,19 @@ def import_(ui, repo, patch1, *patches, 
                 if not opts.get('no_commit'):
                     n = repo.commit(files, message, opts.get('user') or user,
                                     opts.get('date') or date)
                     if opts.get('exact'):
                         if hex(n) != nodeid:
                             repo.rollback()
                             raise util.Abort(_('patch is damaged'
                                                ' or loses information'))
+                    # Force a dirstate write so that the next transaction
+                    # backups an up-do-date file.
+                    repo.dirstate.write()
             finally:
                 os.unlink(tmpname)
     finally:
         del lock, wlock
 
 def incoming(ui, repo, source="default", **opts):
     """show new changesets found in source
 
@@ -1734,27 +1723,34 @@ def log(ui, repo, *pats, **opts):
         except revlog.LookupError:
             pass
         return None
 
     df = False
     if opts["date"]:
         df = util.matchdate(opts["date"])
 
+    only_branches = opts['only_branch']
+
     displayer = cmdutil.show_changeset(ui, repo, opts, True, matchfn)
     for st, rev, fns in changeiter:
         if st == 'add':
             changenode = repo.changelog.node(rev)
             parents = [p for p in repo.changelog.parentrevs(rev)
                        if p != nullrev]
             if opts['no_merges'] and len(parents) == 2:
                 continue
             if opts['only_merges'] and len(parents) != 2:
                 continue
 
+            if only_branches:
+                revbranch = get(rev)[5]['branch']
+                if revbranch not in only_branches:
+                    continue
+
             if df:
                 changes = get(rev)
                 if not df(changes[2][0]):
                     continue
 
             if opts['keyword']:
                 changes = get(rev)
                 miss = 0
@@ -2218,26 +2214,26 @@ def revert(ui, repo, *pats, **opts):
     else:
         pmf = None
 
     # need all matching names in dirstate and manifest of target rev,
     # so have to walk both. do not print errors if files exist in one
     # but not other.
 
     names = {}
-    target_only = {}
 
     wlock = repo.wlock()
     try:
         # walk dirstate.
+        files = []
         for src, abs, rel, exact in cmdutil.walk(repo, pats, opts,
                                                  badmatch=mf.has_key):
             names[abs] = (rel, exact)
-            if src == 'b':
-                target_only[abs] = True
+            if src != 'b':
+                files.append(abs)
 
         # walk target manifest.
 
         def badmatch(path):
             if path in names:
                 return True
             path_ = path + '/'
             for f in names:
@@ -2245,107 +2241,134 @@ def revert(ui, repo, *pats, **opts):
                     return True
             return False
 
         for src, abs, rel, exact in cmdutil.walk(repo, pats, opts, node=node,
                                                  badmatch=badmatch):
             if abs in names or src == 'b':
                 continue
             names[abs] = (rel, exact)
-            target_only[abs] = True
-
-        changes = repo.status(match=names.has_key)[:5]
-        modified, added, removed, deleted, unknown = map(dict.fromkeys, changes)
+
+        changes = repo.status(files=files, match=names.has_key)[:4]
+        modified, added, removed, deleted = map(dict.fromkeys, changes)
 
         # if f is a rename, also revert the source
         cwd = repo.getcwd()
         for f in added:
             src = repo.dirstate.copied(f)
             if src and src not in names and repo.dirstate[src] == 'r':
                 removed[src] = None
                 names[src] = (repo.pathto(src, cwd), True)
 
+        def removeforget(abs):
+            if repo.dirstate[abs] == 'a':
+                return _('forgetting %s\n')
+            return _('removing %s\n')
+
         revert = ([], _('reverting %s\n'))
         add = ([], _('adding %s\n'))
-        remove = ([], _('removing %s\n'))
-        forget = ([], _('forgetting %s\n'))
+        remove = ([], removeforget)
         undelete = ([], _('undeleting %s\n'))
-        update = {}
 
         disptable = (
             # dispatch table:
             #   file state
             #   action if in target manifest
             #   action if not in target manifest
             #   make backup if in target manifest
             #   make backup if not in target manifest
             (modified, revert, remove, True, True),
-            (added, revert, forget, True, False),
+            (added, revert, remove, True, False),
             (removed, undelete, None, False, False),
             (deleted, revert, remove, False, False),
-            (unknown, add, None, True, False),
-            (target_only, add, None, False, False),
             )
 
         entries = names.items()
         entries.sort()
 
         for abs, (rel, exact) in entries:
             mfentry = mf.get(abs)
             target = repo.wjoin(abs)
             def handle(xlist, dobackup):
                 xlist[0].append(abs)
-                update[abs] = 1
                 if dobackup and not opts['no_backup'] and util.lexists(target):
                     bakname = "%s.orig" % rel
                     ui.note(_('saving current version of %s as %s\n') %
                             (rel, bakname))
                     if not opts.get('dry_run'):
                         util.copyfile(target, bakname)
                 if ui.verbose or not exact:
-                    ui.status(xlist[1] % rel)
+                    msg = xlist[1]
+                    if not isinstance(msg, basestring):
+                        msg = msg(abs)
+                    ui.status(msg % rel)
             for table, hitlist, misslist, backuphit, backupmiss in disptable:
                 if abs not in table: continue
                 # file has changed in dirstate
                 if mfentry:
                     handle(hitlist, backuphit)
                 elif misslist is not None:
                     handle(misslist, backupmiss)
-                else:
-                    if exact: ui.warn(_('file not managed: %s\n') % rel)
                 break
             else:
+                if abs not in repo.dirstate:
+                    if mfentry:
+                        handle(add, True)
+                    elif exact:
+                        ui.warn(_('file not managed: %s\n') % rel)
+                    continue
                 # file has not changed in dirstate
                 if node == parent:
                     if exact: ui.warn(_('no changes needed to %s\n') % rel)
                     continue
                 if pmf is None:
                     # only need parent manifest in this unlikely case,
                     # so do not read by default
                     pmf = repo.changectx(parent).manifest()
                 if abs in pmf:
                     if mfentry:
                         # if version of file is same in parent and target
                         # manifests, do nothing
-                        if pmf[abs] != mfentry:
+                        if (pmf[abs] != mfentry or
+                            pmf.flags(abs) != mf.flags(abs)):
                             handle(revert, False)
                     else:
                         handle(remove, False)
 
         if not opts.get('dry_run'):
-            for f in forget[0]:
-                repo.dirstate.forget(f)
-            r = hg.revert(repo, node, update.has_key)
+            def checkout(f):
+                fc = ctx[f]
+                repo.wwrite(f, fc.data(), fc.fileflags())
+
+            audit_path = util.path_auditor(repo.root)
+            for f in remove[0]:
+                if repo.dirstate[f] == 'a':
+                    repo.dirstate.forget(f)
+                    continue
+                audit_path(f)
+                try:
+                    util.unlink(repo.wjoin(f))
+                except OSError:
+                    pass
+                repo.dirstate.remove(f)
+
+            for f in revert[0]:
+                checkout(f)
+
             for f in add[0]:
+                checkout(f)
                 repo.dirstate.add(f)
+
+            normal = repo.dirstate.normallookup
+            if node == parent and p2 == nullid:
+                normal = repo.dirstate.normal
             for f in undelete[0]:
-                repo.dirstate.normal(f)
-            for f in remove[0]:
-                repo.dirstate.remove(f)
-            return r
+                checkout(f)
+                normal(f)
+
     finally:
         del wlock
 
 def rollback(ui, repo):
     """roll back the last transaction
 
     This command should be used with care. There is only one level of
     rollback, and there is no way to undo a rollback. It will also
@@ -2436,35 +2459,37 @@ def serve(ui, repo, **opts):
     service = service()
 
     cmdutil.service(opts, initfn=service.init, runfn=service.run)
 
 def status(ui, repo, *pats, **opts):
     """show changed files in the working directory
 
     Show status of files in the repository.  If names are given, only
-    files that match are shown.  Files that are clean or ignored, are
-    not listed unless -c (clean), -i (ignored) or -A is given.
+    files that match are shown.  Files that are clean or ignored or
+    source of a copy/move operation, are not listed unless -c (clean),
+    -i (ignored), -C (copies) or -A is given.  Unless options described
+    with "show only ..." are given, the options -mardu are used.
 
     NOTE: status may appear to disagree with diff if permissions have
     changed or a merge has occurred. The standard diff format does not
     report permission changes and diff only reports changes relative
     to one merge parent.
 
     If one revision is given, it is used as the base revision.
     If two revisions are given, the difference between them is shown.
 
     The codes used to show the status of files are:
     M = modified
     A = added
     R = removed
     C = clean
     ! = deleted, but still tracked
     ? = not tracked
-    I = ignored (not shown by default)
+    I = ignored
       = the previous added file was copied from here
     """
 
     all = opts['all']
     node1, node2 = cmdutil.revpair(repo, opts.get('rev'))
 
     files, matchfn, anypats = cmdutil.matchpats(repo, pats, opts)
     cwd = (pats and repo.getcwd()) or ''
@@ -2722,18 +2747,18 @@ table = {
            _('guess renamed files by similarity (0<=s<=100)')),
          ] + walkopts + dryrunopts,
          _('hg addremove [OPTION]... [FILE]...')),
     "^annotate":
         (annotate,
          [('r', 'rev', '', _('annotate the specified revision')),
           ('f', 'follow', None, _('follow file copies and renames')),
           ('a', 'text', None, _('treat all files as text')),
-          ('u', 'user', None, _('list the author')),
-          ('d', 'date', None, _('list the date')),
+          ('u', 'user', None, _('list the author (long with -v)')),
+          ('d', 'date', None, _('list the date (short with -q)')),
           ('n', 'number', None, _('list the revision number (default)')),
           ('c', 'changeset', None, _('list the changeset')),
           ('l', 'line-number', None,
            _('show line number at the first appearance'))
          ] + walkopts,
          _('hg annotate [-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...')),
     "archive":
         (archive,
@@ -2778,16 +2803,17 @@ table = {
           ('', 'base', [],
            _('a base changeset to specify instead of a destination')),
          ] + remoteopts,
          _('hg bundle [-f] [-r REV]... [--base REV]... FILE [DEST]')),
     "cat":
         (cat,
          [('o', 'output', '', _('print output to file with formatted name')),
           ('r', 'rev', '', _('print the given revision')),
+          ('', 'decode', None, _('apply any matching decode filter')),
          ] + walkopts,
          _('hg cat [OPTION]... FILE...')),
     "^clone":
         (clone,
          [('U', 'noupdate', None, _('do not update the new working directory')),
           ('r', 'rev', [],
            _('a changeset you would like to have after cloning')),
           ('', 'pull', None, _('use pull protocol to copy metadata')),
@@ -2852,16 +2878,18 @@ table = {
           ('g', 'git', None, _('use git extended diff format')),
           ('', 'nodates', None, _("don't include dates in diff headers")),
           ('w', 'ignore-all-space', None,
            _('ignore white space when comparing lines')),
           ('b', 'ignore-space-change', None,
            _('ignore changes in the amount of white space')),
           ('B', 'ignore-blank-lines', None,
            _('ignore changes whose lines are all blank')),
+          ('U', 'unified', 3,
+           _('number of lines of context to show'))
          ] + walkopts,
          _('hg diff [OPTION]... [-r REV1 [-r REV2]] [FILE]...')),
     "^export":
         (export,
          [('o', 'output', '', _('print output to file with formatted name')),
           ('a', 'text', None, _('treat all files as text')),
           ('g', 'git', None, _('use git extended diff format')),
           ('', 'nodates', None, _("don't include dates in diff headers")),
@@ -2873,17 +2901,18 @@ table = {
           ('', 'all', None, _('print all revisions that match')),
           ('f', 'follow', None,
            _('follow changeset history, or file history across copies and renames')),
           ('i', 'ignore-case', None, _('ignore case when matching')),
           ('l', 'files-with-matches', None,
            _('print only filenames and revs that match')),
           ('n', 'line-number', None, _('print matching line numbers')),
           ('r', 'rev', [], _('search in given revision range')),
-          ('u', 'user', None, _('print user who committed change')),
+          ('u', 'user', None, _('list the author (long with -v)')),
+          ('d', 'date', None, _('list the date (short with -q)')),
          ] + walkopts,
          _('hg grep [OPTION]... PATTERN [FILE]...')),
     "heads":
         (heads,
          [('', 'style', '', _('display using template map file')),
           ('r', 'rev', '', _('show only heads which are descendants of rev')),
           ('', 'template', '', _('display with template'))],
          _('hg heads [-r REV] [REV]...')),
@@ -2948,16 +2977,18 @@ table = {
           ('C', 'copies', None, _('show copied files')),
           ('k', 'keyword', [], _('do case-insensitive search for a keyword')),
           ('l', 'limit', '', _('limit number of changes displayed')),
           ('r', 'rev', [], _('show the specified revision or range')),
           ('', 'removed', None, _('include revs where files were removed')),
           ('M', 'no-merges', None, _('do not show merges')),
           ('', 'style', '', _('display using template map file')),
           ('m', 'only-merges', None, _('show only merges')),
+          ('b', 'only-branch', [],
+            _('show only changesets within the given named branch')),
           ('p', 'patch', None, _('show patch')),
           ('P', 'prune', [], _('do not display revision or any of its ancestors')),
           ('', 'template', '', _('display with template')),
          ] + walkopts,
          _('hg log [OPTION]... [FILE]')),
     "manifest":
         (manifest,
          [('r', 'rev', '', _('revision to display'))],
--- a/mercurial/dirstate.py
+++ b/mercurial/dirstate.py
@@ -192,17 +192,18 @@ class dirstate(object):
             if dirs[base] == 1:
                 del dirs[base]
                 self._decpath(base)
             else:
                 dirs[base] -= 1
 
     def _incpathcheck(self, f):
         if '\r' in f or '\n' in f:
-            raise util.Abort(_("'\\n' and '\\r' disallowed in filenames"))
+            raise util.Abort(_("'\\n' and '\\r' disallowed in filenames: %r")
+                             % f)
         # shadows
         if f in self._dirs:
             raise util.Abort(_('directory %r already in dirstate') % f)
         for c in strutil.rfindall(f, '/'):
             d = f[:c]
             if d in self._dirs:
                 break
             if d in self._map and self[d] != 'r':
@@ -281,17 +282,17 @@ class dirstate(object):
 
     def forget(self, f):
         'forget a file'
         self._dirty = True
         try:
             self._changepath(f, '?')
             del self._map[f]
         except KeyError:
-            self._ui.warn(_("not in dirstate: %s!\n") % f)
+            self._ui.warn(_("not in dirstate: %s\n") % f)
 
     def clear(self):
         self._map = {}
         if "_dirs" in self.__dict__:
             delattr(self, "_dirs");
         self._copymap = {}
         self._pl = [nullid, nullid]
         self._dirty = True
@@ -364,16 +365,24 @@ class dirstate(object):
             elif stat.S_ISBLK(mode): kind = _('block device')
             elif stat.S_ISFIFO(mode): kind = _('fifo')
             elif stat.S_ISSOCK(mode): kind = _('socket')
             elif stat.S_ISDIR(mode): kind = _('directory')
             self._ui.warn(_('%s: unsupported file type (type is %s)\n')
                           % (self.pathto(f), kind))
         return False
 
+    def _dirignore(self, f):
+        if self._ignore(f):
+            return True
+        for c in strutil.findall(f, '/'):
+            if self._ignore(f[:c]):
+                return True
+        return False
+
     def walk(self, files=None, match=util.always, badmatch=None):
         # filter out the stat
         for src, f, st in self.statwalk(files, match, badmatch=badmatch):
             yield src, f
 
     def statwalk(self, files=None, match=util.always, ignored=False,
                  badmatch=None, directories=False):
         '''
@@ -399,19 +408,21 @@ class dirstate(object):
             dc = self._filter(files)
 
         def imatch(file_):
             if file_ not in dc and self._ignore(file_):
                 return False
             return match(file_)
 
         ignore = self._ignore
+        dirignore = self._dirignore
         if ignored:
             imatch = match
             ignore = util.never
+            dirignore = util.never
 
         # self._root may end with a path separator when self._root == '/'
         common_prefix_len = len(self._root)
         if not util.endswithsep(self._root):
             common_prefix_len += 1
 
         normpath = util.normpath
         listdir = osutil.listdir
@@ -487,18 +498,19 @@ class dirstate(object):
                 if not found:
                     if inst.errno != errno.ENOENT or not badmatch:
                         self._ui.warn('%s: %s\n' %
                                       (self.pathto(ff), inst.strerror))
                     elif badmatch and badmatch(ff) and imatch(nf):
                         yield 'b', ff, None
                 continue
             if s_isdir(st.st_mode):
-                for f, src, st in findfiles(f):
-                    yield src, f, st
+                if not dirignore(nf):
+                    for f, src, st in findfiles(f):
+                        yield src, f, st
             else:
                 if nf in known:
                     continue
                 known[nf] = 1
                 if match(nf):
                     if supported(ff, st.st_mode, verbose=True):
                         yield 'f', nf, st
                     elif ff in dc:
@@ -514,16 +526,17 @@ class dirstate(object):
             known[k] = 1
             if imatch(k):
                 yield 'm', k, None
 
     def status(self, files, match, list_ignored, list_clean):
         lookup, modified, added, unknown, ignored = [], [], [], [], []
         removed, deleted, clean = [], [], []
 
+        files = files or []
         _join = self._join
         lstat = os.lstat
         cmap = self._copymap
         dmap = self._map
         ladd = lookup.append
         madd = modified.append
         aadd = added.append
         uadd = unknown.append
@@ -531,18 +544,19 @@ class dirstate(object):
         radd = removed.append
         dadd = deleted.append
         cadd = clean.append
 
         for src, fn, st in self.statwalk(files, match, ignored=list_ignored):
             if fn in dmap:
                 type_, mode, size, time, foo = dmap[fn]
             else:
-                if list_ignored and self._ignore(fn):
-                    iadd(fn)
+                if (list_ignored or fn in files) and self._dirignore(fn):
+                    if list_ignored:
+                        iadd(fn)
                 else:
                     uadd(fn)
                 continue
             if src == 'm':
                 nonexistent = True
                 if not st:
                     try:
                         st = lstat(_join(fn))
@@ -550,17 +564,17 @@ class dirstate(object):
                         if inst.errno not in (errno.ENOENT, errno.ENOTDIR):
                             raise
                         st = None
                     # We need to re-check that it is a valid file
                     if st and self._supported(fn, st.st_mode):
                         nonexistent = False
                 # XXX: what to do with file no longer present in the fs
                 # who are not removed in the dirstate ?
-                if nonexistent and type_ in "nm":
+                if nonexistent and type_ in "nma":
                     dadd(fn)
                     continue
             # check the common case first
             if type_ == 'n':
                 if not st:
                     st = lstat(_join(fn))
                 if (size >= 0 and (size != st.st_size
                                    or (mode ^ st.st_mode) & 0100)
--- a/mercurial/dispatch.py
+++ b/mercurial/dispatch.py
@@ -335,19 +335,19 @@ def _dispatch(ui, args):
     elif not cmd:
         return commands.help_(ui, 'shortlist')
 
     repo = None
     if cmd not in commands.norepo.split():
         try:
             repo = hg.repository(ui, path=path)
             ui = repo.ui
-            ui.setconfig("bundle", "mainreporoot", repo.root)
             if not repo.local():
                 raise util.Abort(_("repository '%s' is not local") % path)
+            ui.setconfig("bundle", "mainreporoot", repo.root)
         except hg.RepoError:
             if cmd not in commands.optionalrepo.split():
                 if not path:
                     raise hg.RepoError(_("There is no Mercurial repository here"
                                          " (.hg not found)"))
                 raise
         d = lambda: func(ui, repo, *args, **cmdoptions)
     else:
new file mode 100644
--- /dev/null
+++ b/mercurial/filemerge.py
@@ -0,0 +1,217 @@
+# filemerge.py - file-level merge handling for Mercurial
+#
+# Copyright 2006, 2007, 2008 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms
+# of the GNU General Public License, incorporated herein by reference.
+
+from node import *
+from i18n import _
+import util, os, tempfile, context, simplemerge, re, filecmp
+
+def _toolstr(ui, tool, part, default=""):
+    return ui.config("merge-tools", tool + "." + part, default)
+
+def _toolbool(ui, tool, part, default=False):
+    return ui.configbool("merge-tools", tool + "." + part, default)
+
+def _findtool(ui, tool):
+    k = _toolstr(ui, tool, "regkey")
+    if k:
+        p = util.lookup_reg(k, _toolstr(ui, tool, "regname"))
+        if p:
+            p = util.find_exe(p + _toolstr(ui, tool, "regappend"))
+            if p:
+                return p
+    return util.find_exe(_toolstr(ui, tool, "executable", tool))
+
+def _picktool(repo, ui, path, binary, symlink):
+    def check(tool, pat, symlink, binary):
+        tmsg = tool
+        if pat:
+            tmsg += " specified for " + pat
+        if pat and not _findtool(ui, tool): # skip search if not matching
+            ui.warn(_("couldn't find merge tool %s\n") % tmsg)
+        elif symlink and not _toolbool(ui, tool, "symlink"):
+            ui.warn(_("tool %s can't handle symlinks\n") % tmsg)
+        elif binary and not _toolbool(ui, tool, "binary"):
+            ui.warn(_("tool %s can't handle binary\n") % tmsg)
+        elif not util.gui() and _toolbool(ui, tool, "gui"):
+            ui.warn(_("tool %s requires a GUI\n") % tmsg)
+        else:
+            return True
+        return False
+
+    # HGMERGE takes precedence
+    hgmerge = os.environ.get("HGMERGE")
+    if hgmerge:
+        return (hgmerge, hgmerge)
+
+    # then patterns
+    for pat, tool in ui.configitems("merge-patterns"):
+        mf = util.matcher(repo.root, "", [pat], [], [])[1]
+        if mf(path) and check(tool, pat, symlink, False):
+                toolpath = _findtool(ui, tool)
+                return (tool, '"' + toolpath + '"')
+
+    # then merge tools
+    tools = {}
+    for k,v in ui.configitems("merge-tools"):
+        t = k.split('.')[0]
+        if t not in tools:
+            tools[t] = int(_toolstr(ui, t, "priority", "0"))
+    names = tools.keys()
+    tools = [(-p,t) for t,p in tools.items()]
+    tools.sort()
+    uimerge = ui.config("ui", "merge")
+    if uimerge:
+        if uimerge not in names:
+            return (uimerge, uimerge)
+        tools.insert(0, (None, uimerge)) # highest priority
+    tools.append((None, "hgmerge")) # the old default, if found
+    for p,t in tools:
+        toolpath = _findtool(ui, t)
+        if toolpath and check(t, None, symlink, binary):
+            return (t, '"' + toolpath + '"')
+    # internal merge as last resort
+    return (not (symlink or binary) and "internal:merge" or None, None)
+
+def _eoltype(data):
+    "Guess the EOL type of a file"
+    if '\0' in data: # binary
+        return None
+    if '\r\n' in data: # Windows
+        return '\r\n'
+    if '\r' in data: # Old Mac
+        return '\r'
+    if '\n' in data: # UNIX
+        return '\n'
+    return None # unknown
+
+def _matcheol(file, origfile):
+    "Convert EOL markers in a file to match origfile"
+    tostyle = _eoltype(open(origfile, "rb").read())
+    if tostyle:
+        data = open(file, "rb").read()
+        style = _eoltype(data)
+        if style:
+            newdata = data.replace(style, tostyle)
+            if newdata != data:
+                open(file, "wb").write(newdata)
+
+def filemerge(repo, fw, fd, fo, wctx, mctx):
+    """perform a 3-way merge in the working directory
+
+    fw = original filename in the working directory
+    fd = destination filename in the working directory
+    fo = filename in other parent
+    wctx, mctx = working and merge changecontexts
+    """
+
+    def temp(prefix, ctx):
+        pre = "%s~%s." % (os.path.basename(ctx.path()), prefix)
+        (fd, name) = tempfile.mkstemp(prefix=pre)
+        data = repo.wwritedata(ctx.path(), ctx.data())
+        f = os.fdopen(fd, "wb")
+        f.write(data)
+        f.close()
+        return name
+
+    def isbin(ctx):
+        try:
+            return util.binary(ctx.data())
+        except IOError:
+            return False
+
+    fco = mctx.filectx(fo)
+    if not fco.cmp(wctx.filectx(fd).data()): # files identical?
+        return None
+
+    ui = repo.ui
+    fcm = wctx.filectx(fw)
+    fca = fcm.ancestor(fco) or repo.filectx(fw, fileid=nullrev)
+    binary = isbin(fcm) or isbin(fco) or isbin(fca)
+    symlink = fcm.islink() or fco.islink()
+    tool, toolpath = _picktool(repo, ui, fw, binary, symlink)
+    ui.debug(_("picked tool '%s' for %s (binary %s symlink %s)\n") %
+               (tool, fw, binary, symlink))
+
+    if not tool:
+        tool = "internal:local"
+        if ui.prompt(_(" no tool found to merge %s\n"
+                       "keep (l)ocal or take (o)ther?") % fw,
+                     _("[lo]"), _("l")) != _("l"):
+            tool = "internal:other"
+    if tool == "internal:local":
+        return 0
+    if tool == "internal:other":
+        repo.wwrite(fd, fco.data(), fco.fileflags())
+        return 0
+    if tool == "internal:fail":
+        return 1
+
+    # do the actual merge
+    a = repo.wjoin(fd)
+    b = temp("base", fca)
+    c = temp("other", fco)
+    out = ""
+    back = a + ".orig"
+    util.copyfile(a, back)
+
+    if fw != fo:
+        repo.ui.status(_("merging %s and %s\n") % (fw, fo))
+    else:
+        repo.ui.status(_("merging %s\n") % fw)
+    repo.ui.debug(_("my %s other %s ancestor %s\n") % (fcm, fco, fca))
+
+    # do we attempt to simplemerge first?
+    if _toolbool(ui, tool, "premerge", not (binary or symlink)):
+        r = simplemerge.simplemerge(a, b, c, quiet=True)
+        if not r:
+            ui.debug(_(" premerge successful\n"))
+            os.unlink(back)
+            os.unlink(b)
+            os.unlink(c)
+            return 0
+        util.copyfile(back, a) # restore from backup and try again
+
+    env = dict(HG_FILE=fd,
+               HG_MY_NODE=str(wctx.parents()[0]),
+               HG_OTHER_NODE=str(mctx),
+               HG_MY_ISLINK=fcm.islink(),
+               HG_OTHER_ISLINK=fco.islink(),
+               HG_BASE_ISLINK=fca.islink())
+
+    if tool == "internal:merge":
+        r = simplemerge.simplemerge(a, b, c, label=['local', 'other'])
+    else:
+        args = _toolstr(ui, tool, "args", '$local $base $other')
+        if "$output" in args:
+            out, a = a, back # read input from backup, write to original
+        replace = dict(local=a, base=b, other=c, output=out)
+        args = re.sub("\$(local|base|other|output)",
+                      lambda x: '"%s"' % replace[x.group()[1:]], args)
+        r = util.system(toolpath + ' ' + args, cwd=repo.root, environ=env)
+
+    if not r and _toolbool(ui, tool, "checkconflicts"):
+        if re.match("^(<<<<<<< .*|=======|>>>>>>> .*)$", fcm.data()):
+            r = 1
+
+    if not r and _toolbool(ui, tool, "checkchanged"):
+        if filecmp.cmp(repo.wjoin(fd), back):
+            if ui.prompt(_(" output file %s appears unchanged\n"
+                "was merge successful (yn)?") % fd,
+                _("[yn]"), _("n")) != _("y"):
+                r = 1
+
+    if _toolbool(ui, tool, "fixeol"):
+        _matcheol(repo.wjoin(fd), back)
+
+    if r:
+        repo.ui.warn(_("merging %s failed!\n") % fd)
+    else:
+        os.unlink(back)
+
+    os.unlink(b)
+    os.unlink(c)
+    return r
--- a/mercurial/help.py
+++ b/mercurial/help.py
@@ -61,19 +61,16 @@ HGENCODINGMODE::
     "ignore", which drops them. This setting can be overridden with
     the --encodingmode command-line option.
 
 HGMERGE::
     An executable to use for resolving merge conflicts. The program
     will be executed with three arguments: local file, remote file,
     ancestor file.
 
-    The default program is "hgmerge", which is a shell script provided
-    by Mercurial with some sensible defaults.
-
     (deprecated, use .hgrc)
 
 HGRCPATH::
     A list of files or directories to search for hgrc files.  Item
     separator is ":" on Unix, ";" on Windows.  If HGRCPATH is not set,
     platform default search path is used.  If empty, only .hg/hgrc of
     current repository is read.
 
@@ -92,21 +89,21 @@ EMAIL::
 LOGNAME::
     If neither HGUSER nor EMAIL is set, LOGNAME will be used (with
     '@hostname' appended) as the author value for a commit.
 
 VISUAL::
     This is the name of the editor to use when committing. See EDITOR.
 
 EDITOR::
-    Sometimes Mercurial needs to open a text file in an editor for a user
-    to modify, for example when writing commit messages or when using the
-    hgmerge script. The editor it uses is determined by looking at the
-    environment variables HGEDITOR, VISUAL and EDITOR, in that order. The
-    first non-empty one is chosen. If all of them are empty, the editor
+    Sometimes Mercurial needs to open a text file in an editor
+    for a user to modify, for example when writing commit messages.
+    The editor it uses is determined by looking at the environment
+    variables HGEDITOR, VISUAL and EDITOR, in that order. The first
+    non-empty one is chosen. If all of them are empty, the editor
     defaults to 'vi'.
 
 PYTHONPATH::
     This is used by Python to find imported modules and may need to be set
     appropriately if Mercurial is not installed system-wide.
     ''',
 
     "patterns|File Name Patterns": r'''
--- a/mercurial/hg.py
+++ b/mercurial/hg.py
@@ -100,24 +100,24 @@ def clone(ui, source, dest=None, pull=Fa
     LAN, slow over WAN)
 
     rev: revision to clone up to (implies pull=True)
 
     update: update working directory after clone completes, if
     destination is local repository
     """
 
-    origsource = source
-    source, rev, checkout = parseurl(ui.expandpath(source), rev)
-
     if isinstance(source, str):
+        origsource = ui.expandpath(source)
+        source, rev, checkout = parseurl(origsource, rev)
         src_repo = repository(ui, source)
     else:
         src_repo = source
-        source = src_repo.url()
+        origsource = source = src_repo.url()
+        checkout = None
 
     if dest is None:
         dest = defaultdest(source)
         ui.status(_("destination directory: %s\n") % dest)
 
     def localpath(path):
         if path.startswith('file://'):
             return path[7:]
--- a/mercurial/hgweb/common.py
+++ b/mercurial/hgweb/common.py
@@ -96,16 +96,22 @@ def paritygen(stripecount, offset=0):
         parity = 0
     while True:
         yield parity
         count += 1
         if stripecount and count >= stripecount:
             parity = 1 - parity
             count = 0
 
+def countgen(start=0, step=1):
+    """count forever -- useful for line numbers"""
+    while True:
+        yield start
+        start += step
+
 def get_contact(config):
     """Return repo contact information or empty string.
 
     web.contact is the primary source, but if that is not set, try
     ui.username or $EMAIL as a fallback to display something useful.
     """
     return (config("web", "contact") or
             config("ui", "username") or
--- a/mercurial/hgweb/hgweb_mod.py
+++ b/mercurial/hgweb/hgweb_mod.py
@@ -5,17 +5,18 @@
 #
 # This software may be used and distributed according to the terms
 # of the GNU General Public License, incorporated herein by reference.
 
 import os, mimetypes, re
 from mercurial.node import *
 from mercurial import mdiff, ui, hg, util, archival, patch, hook
 from mercurial import revlog, templater, templatefilters
-from common import ErrorResponse, get_mtime, style_map, paritygen, get_contact
+from common import get_mtime, style_map, paritygen, countgen, get_contact
+from common import ErrorResponse
 from common import HTTP_OK, HTTP_BAD_REQUEST, HTTP_NOT_FOUND, HTTP_SERVER_ERROR
 from request import wsgirequest
 import webcommands, protocol
 
 shortcuts = {
     'cl': [('cmd', ['changelog']), ('rev', None)],
     'sl': [('cmd', ['shortlog']), ('rev', None)],
     'cs': [('cmd', ['changeset']), ('node', None)],
@@ -366,26 +367,36 @@ class hgweb(object):
         parity = paritygen(self.stripecount)
         def diffblock(diff, f, fn):
             yield tmpl("diffblock",
                        lines=prettyprintlines(diff),
                        parity=parity.next(),
                        file=f,
                        filenode=hex(fn or nullid))
 
+        blockcount = countgen()
         def prettyprintlines(diff):
-            for l in diff.splitlines(1):
+            blockno = blockcount.next()
+            for lineno, l in enumerate(diff.splitlines(1)):
+                if blockno == 0:
+                    lineno = lineno + 1
+                else:
+                    lineno = "%d.%d" % (blockno, lineno + 1)
                 if l.startswith('+'):
-                    yield tmpl("difflineplus", line=l)
+                    ltype = "difflineplus"
                 elif l.startswith('-'):
-                    yield tmpl("difflineminus", line=l)
+                    ltype = "difflineminus"
                 elif l.startswith('@'):
-                    yield tmpl("difflineat", line=l)
+                    ltype = "difflineat"
                 else:
-                    yield tmpl("diffline", line=l)
+                    ltype = "diffline"
+                yield tmpl(ltype,
+                           line=l,
+                           lineid="l%s" % lineno,
+                           linenumber="% 8s" % lineno)
 
         r = self.repo
         c1 = r.changectx(node1)
         c2 = r.changectx(node2)
         date1 = util.datestr(c1.date())
         date2 = util.datestr(c2.date())
 
         modified, added, removed, deleted, unknown = r.status(node1, node2)[:5]
@@ -461,17 +472,17 @@ class hgweb(object):
         def changelist(**map):
             cl = self.repo.changelog
             count = 0
             qw = query.lower().split()
 
             def revgen():
                 for i in xrange(cl.count() - 1, 0, -100):
                     l = []
-                    for j in xrange(max(0, i - 100), i):
+                    for j in xrange(max(0, i - 100), i + 1):
                         ctx = self.repo.changectx(j)
                         l.append(ctx)
                     l.reverse()
                     for e in l:
                         yield e
 
             for ctx in revgen():
                 miss = 0
@@ -591,19 +602,20 @@ class hgweb(object):
         n = fctx.filenode()
         parity = paritygen(self.stripecount)
 
         if util.binary(text):
             mt = mimetypes.guess_type(f)[0] or 'application/octet-stream'
             text = '(binary:%s)' % mt
 
         def lines():
-            for l, t in enumerate(text.splitlines(1)):
+            for lineno, t in enumerate(text.splitlines(1)):
                 yield {"line": t,
-                       "linenumber": "% 6d" % (l + 1),
+                       "lineid": "l%d" % (lineno + 1),
+                       "linenumber": "% 6d" % (lineno + 1),
                        "parity": parity.next()}
 
         return tmpl("filerevision",
                     file=f,
                     path=_up(f),
                     text=lines(),
                     rev=fctx.rev(),
                     node=hex(fctx.node()),
@@ -618,29 +630,33 @@ class hgweb(object):
     def fileannotate(self, tmpl, fctx):
         f = fctx.path()
         n = fctx.filenode()
         fl = fctx.filelog()
         parity = paritygen(self.stripecount)
 
         def annotate(**map):
             last = None
-            for f, l in fctx.annotate(follow=True):
+            lines = enumerate(fctx.annotate(follow=True, linenumber=True))
+            for lineno, ((f, targetline), l) in lines:
                 fnode = f.filenode()
                 name = self.repo.ui.shortuser(f.user())
 
                 if last != fnode:
                     last = fnode
 
                 yield {"parity": parity.next(),
                        "node": hex(f.node()),
                        "rev": f.rev(),
                        "author": name,
                        "file": f.path(),
-                       "line": l}
+                       "targetline": targetline,
+                       "line": l,
+                       "lineid": "l%d" % (lineno + 1),
+                       "linenumber": "% 6d" % (lineno + 1)}
 
         return tmpl("fileannotate",
                     file=f,
                     annotate=annotate,
                     path=_up(f),
                     rev=fctx.rev(),
                     node=hex(fctx.node()),
                     author=fctx.user(),
--- a/mercurial/hgweb/hgwebdir_mod.py
+++ b/mercurial/hgweb/hgwebdir_mod.py
@@ -172,17 +172,17 @@ class hgwebdir(object):
                     u.warn(_('error reading %s/.hg/hgrc: %s\n' % (path, e)))
                     continue
                 def get(section, name, default=None):
                     return u.config(section, name, default, untrusted=True)
 
                 if u.configbool("web", "hidden", untrusted=True):
                     continue
 
-                parts = [req.env['PATH_INFO'].strip('/'), name]
+                parts = [req.env['PATH_INFO'].rstrip('/'), name]
                 if req.env['SCRIPT_NAME']:
                     parts.insert(0, req.env['SCRIPT_NAME'])
                 url = ('/'.join(parts).replace("//", "/")) + '/'
 
                 # update time with local timezone
                 try:
                     d = (get_mtime(path), util.makedate()[1])
                 except OSError:
--- a/mercurial/hgweb/request.py
+++ b/mercurial/hgweb/request.py
@@ -80,18 +80,20 @@ class wsgirequest(object):
     def header(self, headers=[('Content-Type','text/html')]):
         self.headers.extend(headers)
 
     def httphdr(self, type=None, filename=None, length=0, headers={}):
         headers = headers.items()
         if type is not None:
             headers.append(('Content-Type', type))
         if filename:
-            headers.append(('Content-Disposition', 'inline; filename=%s' %
-                            filename))
+            filename = (filename.split('/')[-1]
+                        .replace('\\', '\\\\').replace('"', '\\"'))
+            headers.append(('Content-Disposition',
+                            'inline; filename="%s"' % filename))
         if length:
             headers.append(('Content-Length', str(length)))
         self.header(headers)
 
 def wsgiapplication(app_maker):
     '''For compatibility with old CGI scripts. A plain hgweb() or hgwebdir()
     can and should now be used as a WSGI application.'''
     application = app_maker()
--- a/mercurial/httprepo.py
+++ b/mercurial/httprepo.py
@@ -98,33 +98,33 @@ def _gen_sendfile(connection):
         else:
             connection.send(self, data)
     return _sendfile
 
 class httpconnection(keepalive.HTTPConnection):
     # must be able to send big bundle as stream.
     send = _gen_sendfile(keepalive.HTTPConnection)
 
-class basehttphandler(keepalive.HTTPHandler):
+class httphandler(keepalive.HTTPHandler):
     def http_open(self, req):
         return self.do_open(httpconnection, req)
 
+    def __del__(self):
+        self.close_all()
+
 has_https = hasattr(urllib2, 'HTTPSHandler')
 if has_https:
     class httpsconnection(httplib.HTTPSConnection):
         response_class = keepalive.HTTPResponse
         # must be able to send big bundle as stream.
         send = _gen_sendfile(httplib.HTTPSConnection)
 
-    class httphandler(basehttphandler, urllib2.HTTPSHandler):
+    class httpshandler(keepalive.KeepAliveHandler, urllib2.HTTPSHandler):
         def https_open(self, req):
             return self.do_open(httpsconnection, req)
-else:
-    class httphandler(basehttphandler):
-        pass
 
 # In python < 2.5 AbstractDigestAuthHandler raises a ValueError if
 # it doesn't know about the auth type requested.  This can happen if
 # somebody is using BasicAuth and types a bad password.
 class httpdigestauthhandler(urllib2.HTTPDigestAuthHandler):
     def http_error_auth_reqed(self, auth_header, host, req, headers):
         try:
             return urllib2.HTTPDigestAuthHandler.http_error_auth_reqed(
@@ -198,18 +198,19 @@ class httprepository(remoterepository):
         # urllib cannot handle URLs with embedded user or passwd
         self._url = urlparse.urlunsplit((scheme, netlocunsplit(host, port),
                                          urlpath, '', ''))
         self.ui = ui
         self.ui.debug(_('using %s\n') % self._url)
 
         proxyurl = ui.config("http_proxy", "host") or os.getenv('http_proxy')
         # XXX proxyauthinfo = None
-        self.handler = httphandler()
-        handlers = [self.handler]
+        handlers = [httphandler()]
+        if has_https:
+            handlers.append(httpshandler())
 
         if proxyurl:
             # proxy can be proper url or host[:port]
             if not (proxyurl.startswith('http:') or
                     proxyurl.startswith('https:')):
                 proxyurl = 'http://' + proxyurl + '/'
             snpqf = urlparse.urlsplit(proxyurl)
             proxyscheme, proxynetloc, proxypath, proxyquery, proxyfrag = snpqf
@@ -265,21 +266,16 @@ class httprepository(remoterepository):
         handlers.extend((urllib2.HTTPBasicAuthHandler(passmgr),
                          httpdigestauthhandler(passmgr)))
         opener = urllib2.build_opener(*handlers)
 
         # 1.0 here is the _protocol_ version
         opener.addheaders = [('User-agent', 'mercurial/proto-1.0')]
         urllib2.install_opener(opener)
 
-    def __del__(self):
-        if self.handler:
-            self.handler.close_all()
-            self.handler = None
-
     def url(self):
         return self.path
 
     # look up capabilities only when needed
 
     def get_caps(self):
         if self.caps is None:
             try:
--- a/mercurial/keepalive.py
+++ b/mercurial/keepalive.py
@@ -170,17 +170,17 @@ class ConnectionManager:
         return conn
 
     def get_all(self, host=None):
         if host:
             return list(self._hostmap.get(host, []))
         else:
             return dict(self._hostmap)
 
-class HTTPHandler(urllib2.HTTPHandler):
+class KeepAliveHandler:
     def __init__(self):
         self._cm = ConnectionManager()
 
     #### Connection Management
     def open_connections(self):
         """return a list of connected hosts and the number of connections
         to each.  [('foo.com:80', 2), ('bar.org', 1)]"""
         return [(host, len(li)) for (host, li) in self._cm.get_all().items()]
@@ -309,16 +309,19 @@ class HTTPHandler(urllib2.HTTPHandler):
         body = req.data
         if sys.version_info >= (2, 4):
             headers.update(req.unredirected_hdrs)
         try:
             h.request(req.get_method(), req.get_selector(), body, headers)
         except socket.error, err: # XXX what error?
             raise urllib2.URLError(err)
 
+class HTTPHandler(KeepAliveHandler, urllib2.HTTPHandler):
+    pass
+
 class HTTPResponse(httplib.HTTPResponse):
     # we need to subclass HTTPResponse in order to
     # 1) add readline() and readlines() methods
     # 2) add close_connection() methods
     # 3) add info() and geturl() methods
 
     # in order to add readline(), read must be modified to deal with a
     # buffer.  example: readline must read a buffer and then spit back
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -63,29 +63,44 @@ class localrepository(repo.repository):
         if "store" in requirements:
             self.encodefn = util.encodefilename
             self.decodefn = util.decodefilename
             self.spath = os.path.join(self.path, "store")
         else:
             self.encodefn = lambda x: x
             self.decodefn = lambda x: x
             self.spath = self.path
-        self.sopener = util.encodedopener(util.opener(self.spath),
-                                          self.encodefn)
+
+        try:
+            # files in .hg/ will be created using this mode
+            mode = os.stat(self.spath).st_mode
+            # avoid some useless chmods
+            if (0777 & ~util._umask) == (0777 & mode):
+                mode = None
+        except OSError:
+            mode = None
+
+        self._createmode = mode
+        self.opener.createmode = mode
+        sopener = util.opener(self.spath)
+        sopener.createmode = mode
+        self.sopener = util.encodedopener(sopener, self.encodefn)
 
         self.ui = ui.ui(parentui=parentui)
         try:
             self.ui.readconfig(self.join("hgrc"), self.root)
             extensions.loadall(self.ui)
         except IOError:
             pass
 
         self.tagscache = None
         self._tagstypecache = None
         self.branchcache = None
+        self._ubranchcache = None  # UTF-8 version of branchcache
+        self._branchcachetip = None
         self.nodetagscache = None
         self.filterpats = {}
         self._datafilters = {}
         self._transref = self._lockref = self._wlockref = None
 
     def __getattr__(self, name):
         if name == 'changelog':
             self.changelog = changelog.changelog(self.sopener)
@@ -115,16 +130,17 @@ class localrepository(repo.repository):
 
         for c in self.tag_disallowed:
             if c in name:
                 raise util.Abort(_('%r cannot be used in a tag name') % c)
 
         self.hook('pretag', throw=True, node=hex(node), tag=name, local=local)
 
         def writetag(fp, name, munge, prevtags):
+            fp.seek(0, 2)
             if prevtags and prevtags[-1] != '\n':
                 fp.write('\n')
             fp.write('%s %s\n' % (hex(node), munge and munge(name) or name))
             fp.close()
 
         prevtags = ''
         if local:
             try:
@@ -181,16 +197,17 @@ class localrepository(repo.repository):
         (default False)
 
         message: commit message to use if committing
 
         user: name of user to use if committing
 
         date: date tuple to use if committing'''
 
+        date = util.parsedate(date)
         for x in self.status()[:5]:
             if '.hgtags' in x:
                 raise util.Abort(_('working copy of .hgtags is changed '
                                    '(please commit .hgtags manually)'))
 
 
         self._tag(name, node, message, local, user, date)
 
@@ -325,37 +342,48 @@ class localrepository(repo.repository):
     def nodetags(self, node):
         '''return the tags associated with a node'''
         if not self.nodetagscache:
             self.nodetagscache = {}
             for t, n in self.tags().items():
                 self.nodetagscache.setdefault(n, []).append(t)
         return self.nodetagscache.get(node, [])
 
-    def _branchtags(self):
-        partial, last, lrev = self._readbranchcache()
-
+    def _branchtags(self, partial, lrev):
         tiprev = self.changelog.count() - 1
         if lrev != tiprev:
             self._updatebranchcache(partial, lrev+1, tiprev+1)
             self._writebranchcache(partial, self.changelog.tip(), tiprev)
 
         return partial
 
     def branchtags(self):
-        if self.branchcache is not None:
+        tip = self.changelog.tip()
+        if self.branchcache is not None and self._branchcachetip == tip:
             return self.branchcache
 
-        self.branchcache = {} # avoid recursion in changectx
-        partial = self._branchtags()
+        oldtip = self._branchcachetip
+        self._branchcachetip = tip
+        if self.branchcache is None:
+            self.branchcache = {} # avoid recursion in changectx
+        else:
+            self.branchcache.clear() # keep using the same dict
+        if oldtip is None or oldtip not in self.changelog.nodemap:
+            partial, last, lrev = self._readbranchcache()
+        else:
+            lrev = self.changelog.rev(oldtip)
+            partial = self._ubranchcache
+
+        self._branchtags(partial, lrev)
 
         # the branch cache is stored on disk as UTF-8, but in the local
         # charset internally
         for k, v in partial.items():
             self.branchcache[util.tolocal(k)] = v
+        self._ubranchcache = partial
         return self.branchcache
 
     def _readbranchcache(self):
         partial = {}
         try:
             f = self.opener("branch.cache")
             lines = f.read().split('\n')
             f.close()
@@ -363,17 +391,17 @@ class localrepository(repo.repository):
             return {}, nullid, nullrev
 
         try:
             last, lrev = lines.pop(0).split(" ", 1)
             last, lrev = bin(last), int(lrev)
             if not (lrev < self.changelog.count() and
                     self.changelog.node(lrev) == last): # sanity check
                 # invalidate the cache
-                raise ValueError('Invalid branch cache: unknown tip')
+                raise ValueError('invalidating branch cache (tip differs)')
             for l in lines:
                 if not l: continue
                 node, label = l.split(" ", 1)
                 partial[label.strip()] = bin(node)
         except (KeyboardInterrupt, util.SignalInterrupt):
             raise
         except Exception, inst:
             if self.ui.debugflag:
@@ -482,27 +510,29 @@ class localrepository(repo.repository):
         return os.path.islink(self.wjoin(f))
 
     def _filter(self, filter, filename, data):
         if filter not in self.filterpats:
             l = []
             for pat, cmd in self.ui.configitems(filter):
                 mf = util.matcher(self.root, "", [pat], [], [])[1]
                 fn = None
+                params = cmd
                 for name, filterfn in self._datafilters.iteritems():
                     if cmd.startswith(name): 
                         fn = filterfn
+                        params = cmd[len(name):].lstrip()
                         break
                 if not fn:
                     fn = lambda s, c, **kwargs: util.filter(s, c)
                 # Wrap old filters not supporting keyword arguments
                 if not inspect.getargspec(fn)[2]:
                     oldfn = fn
                     fn = lambda s, c, **kwargs: oldfn(s, c)
-                l.append((mf, fn, cmd))
+                l.append((mf, fn, params))
             self.filterpats[filter] = l
 
         for mf, fn, cmd in self.filterpats[filter]:
             if mf(filename):
                 self.ui.debug(_("filtering %s through %s\n") % (filename, cmd))
                 data = fn(data, cmd, ui=self.ui, repo=self, filename=filename)
                 break
 
@@ -545,18 +575,19 @@ class localrepository(repo.repository):
             ds = ""
         self.opener("journal.dirstate", "w").write(ds)
         self.opener("journal.branch", "w").write(self.dirstate.branch())
 
         renames = [(self.sjoin("journal"), self.sjoin("undo")),
                    (self.join("journal.dirstate"), self.join("undo.dirstate")),
                    (self.join("journal.branch"), self.join("undo.branch"))]
         tr = transaction.transaction(self.ui.warn, self.sopener,
-                                       self.sjoin("journal"),
-                                       aftertrans(renames))
+                                     self.sjoin("journal"),
+                                     aftertrans(renames),
+                                     self._createmode)
         self._transref = weakref.ref(tr)
         return tr
 
     def recover(self):
         l = self.lock()
         try:
             if os.path.exists(self.sjoin("journal")):
                 self.ui.status(_("rolling back interrupted transaction\n"))
@@ -573,32 +604,40 @@ class localrepository(repo.repository):
         wlock = lock = None
         try:
             wlock = self.wlock()
             lock = self.lock()
             if os.path.exists(self.sjoin("undo")):
                 self.ui.status(_("rolling back last transaction\n"))
                 transaction.rollback(self.sopener, self.sjoin("undo"))
                 util.rename(self.join("undo.dirstate"), self.join("dirstate"))
-                branch = self.opener("undo.branch").read()
-                self.dirstate.setbranch(branch)
+                try:
+                    branch = self.opener("undo.branch").read()
+                    self.dirstate.setbranch(branch)
+                except IOError:
+                    self.ui.warn(_("Named branch could not be reset, "
+                                   "current branch still is: %s\n")
+                                 % util.tolocal(self.dirstate.branch()))
                 self.invalidate()
                 self.dirstate.invalidate()
             else:
                 self.ui.warn(_("no rollback information available\n"))
         finally:
             del lock, wlock
 
     def invalidate(self):
         for a in "changelog manifest".split():
             if hasattr(self, a):
                 self.__delattr__(a)
         self.tagscache = None
         self._tagstypecache = None
         self.nodetagscache = None
+        self.branchcache = None
+        self._ubranchcache = None
+        self._branchcachetip = None
 
     def _lock(self, lockname, wait, releasefn, acquirefn, desc):
         try:
             l = lock.lock(lockname, 0, releasefn, desc=desc)
         except lock.LockHeld, inst:
             if not wait:
                 raise
             self.ui.warn(_("waiting for lock on %s held by %r\n") %
@@ -855,18 +894,18 @@ class localrepository(repo.repository):
                 text = '\n'.join(lines)
 
             n = self.changelog.add(mn, changed + removed, text, trp, p1, p2,
                                    user, date, extra)
             self.hook('pretxncommit', throw=True, node=hex(n), parent1=xp1,
                       parent2=xp2)
             tr.close()
 
-            if self.branchcache and "branch" in extra:
-                self.branchcache[util.tolocal(extra["branch"])] = n
+            if self.branchcache:
+                self.branchtags()
 
             if use_dirstate or update_dirstate:
                 self.dirstate.setparents(n)
                 if use_dirstate:
                     for f in removed:
                         self.dirstate.forget(f)
             valid = 1 # our dirstate updates are complete
 
@@ -1479,17 +1518,17 @@ class localrepository(repo.repository):
                         newheads.append(r)
                 if len(newheads) > len(remote_heads):
                     warn = 1
 
             if warn:
                 self.ui.warn(_("abort: push creates new remote branches!\n"))
                 self.ui.status(_("(did you forget to merge?"
                                  " use push -f to force)\n"))
-                return None, 1
+                return None, 0
             elif inc:
                 self.ui.warn(_("note: unsynced remote changes!\n"))
 
 
         if revs is None:
             cg = self.changegroup(update, 'push')
         else:
             cg = self.changegroupsubset(update, revs, 'push')
@@ -1976,16 +2015,19 @@ class localrepository(repo.repository):
                           node=hex(self.changelog.node(cor+1)), source=srctype,
                           url=url)
 
             tr.close()
         finally:
             del tr
 
         if changesets > 0:
+            # forcefully update the on-disk branch cache
+            self.ui.debug(_("updating the branch cache\n"))
+            self.branchtags()
             self.hook("changegroup", node=hex(self.changelog.node(cor+1)),
                       source=srctype, url=url)
 
             for i in xrange(cor + 1, cnr + 1):
                 self.hook("incoming", node=hex(self.changelog.node(i)),
                           source=srctype, url=url)
 
         # never return 0 here:
--- a/mercurial/merge.py
+++ b/mercurial/merge.py
@@ -2,72 +2,17 @@
 #
 # Copyright 2006, 2007 Matt Mackall <mpm@selenic.com>
 #
 # This software may be used and distributed according to the terms
 # of the GNU General Public License, incorporated herein by reference.
 
 from node import *
 from i18n import _
-import errno, util, os, tempfile, context, heapq
-
-def filemerge(repo, fw, fd, fo, wctx, mctx):
-    """perform a 3-way merge in the working directory
-
-    fw = original filename in the working directory
-    fd = destination filename in the working directory
-    fo = filename in other parent
-    wctx, mctx = working and merge changecontexts
-    """
-
-    def temp(prefix, ctx):
-        pre = "%s~%s." % (os.path.basename(ctx.path()), prefix)
-        (fd, name) = tempfile.mkstemp(prefix=pre)
-        data = repo.wwritedata(ctx.path(), ctx.data())
-        f = os.fdopen(fd, "wb")
-        f.write(data)
-        f.close()
-        return name
-
-    fcm = wctx.filectx(fw)
-    fcmdata = wctx.filectx(fd).data()
-    fco = mctx.filectx(fo)
-
-    if not fco.cmp(fcmdata): # files identical?
-        return None
-
-    fca = fcm.ancestor(fco)
-    if not fca:
-        fca = repo.filectx(fw, fileid=nullrev)
-    a = repo.wjoin(fd)
-    b = temp("base", fca)
-    c = temp("other", fco)
-
-    if fw != fo:
-        repo.ui.status(_("merging %s and %s\n") % (fw, fo))
-    else:
-        repo.ui.status(_("merging %s\n") % fw)
-
-    repo.ui.debug(_("my %s other %s ancestor %s\n") % (fcm, fco, fca))
-
-    cmd = (os.environ.get("HGMERGE") or repo.ui.config("ui", "merge")
-           or "hgmerge")
-    r = util.system('%s "%s" "%s" "%s"' % (cmd, a, b, c), cwd=repo.root,
-                    environ={'HG_FILE': fd,
-                             'HG_MY_NODE': str(wctx.parents()[0]),
-                             'HG_OTHER_NODE': str(mctx),
-                             'HG_MY_ISLINK': fcm.islink(),
-                             'HG_OTHER_ISLINK': fco.islink(),
-                             'HG_BASE_ISLINK': fca.islink(),})
-    if r:
-        repo.ui.warn(_("merging %s failed!\n") % fd)
-
-    os.unlink(b)
-    os.unlink(c)
-    return r
+import errno, util, os, heapq, filemerge
 
 def checkunknown(wctx, mctx):
     "check for collisions between unknown files and files in mctx"
     man = mctx.manifest()
     for f in wctx.unknown():
         if f in man:
             if mctx.filectx(f).cmp(wctx.filectx(f).data()):
                 raise util.Abort(_("untracked file in working directory differs"
@@ -509,17 +454,17 @@ def applyupdates(repo, action, wctx, mct
                 util.unlink(repo.wjoin(f))
             except OSError, inst:
                 if inst.errno != errno.ENOENT:
                     repo.ui.warn(_("update failed to remove %s: %s!\n") %
                                  (f, inst.strerror))
             removed += 1
         elif m == "m": # merge
             f2, fd, flags, move = a[2:]
-            r = filemerge(repo, f, fd, f2, wctx, mctx)
+            r = filemerge.filemerge(repo, f, fd, f2, wctx, mctx)
             if r > 0:
                 unresolved += 1
             else:
                 if r is None:
                     updated += 1
                 else:
                     merged += 1
             util.set_flags(repo.wjoin(fd), flags)
--- a/mercurial/patch.py
+++ b/mercurial/patch.py
@@ -1051,17 +1051,18 @@ def diffopts(ui, opts={}, untrusted=Fals
                 ui.configbool('diff', name or key, None, untrusted=untrusted))
     return mdiff.diffopts(
         text=opts.get('text'),
         git=get('git'),
         nodates=get('nodates'),
         showfunc=get('show_function', 'showfunc'),
         ignorews=get('ignore_all_space', 'ignorews'),
         ignorewsamount=get('ignore_space_change', 'ignorewsamount'),
-        ignoreblanklines=get('ignore_blank_lines', 'ignoreblanklines'))
+        ignoreblanklines=get('ignore_blank_lines', 'ignoreblanklines'),
+        context=get('unified'))
 
 def updatedir(ui, repo, patches):
     '''Update dirstate after patch application according to metadata'''
     if not patches:
         return
     copies = []
     removes = {}
     cfiles = patches.keys()
copy from contrib/simplemerge
copy to mercurial/simplemerge.py
--- a/contrib/simplemerge
+++ b/mercurial/simplemerge.py
@@ -10,37 +10,30 @@
 # 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
-
 # mbp: "you know that thing where cvs gives you conflict markers?"
 # s: "i hate that."
 
-from mercurial import demandimport
-demandimport.enable()
-
-from mercurial import util, mdiff, fancyopts
-from mercurial.i18n import _
-
+from i18n import _
+import util, mdiff, fancyopts, sys, os
 
 class CantReprocessAndShowBase(Exception):
     pass
 
-
 def warn(message):
     sys.stdout.flush()
     sys.stderr.write(message)
     sys.stderr.flush()
 
-
 def intersect(ra, rb):
     """Given two ranges return the range where they intersect or None.
 
     >>> intersect((0, 10), (0, 6))
     (0, 6)
     >>> intersect((0, 10), (5, 15))
     (5, 10)
     >>> intersect((0, 10), (10, 15))
@@ -53,31 +46,27 @@ def intersect(ra, rb):
 
     sa = max(ra[0], rb[0])
     sb = min(ra[1], rb[1])
     if sa < sb:
         return sa, sb
     else:
         return None
 
-
 def compare_range(a, astart, aend, b, bstart, bend):
     """Compare a[astart:aend] == b[bstart:bend], without slicing.
     """
     if (aend-astart) != (bend-bstart):
         return False
     for ia, ib in zip(xrange(astart, aend), xrange(bstart, bend)):
         if a[ia] != b[ib]:
             return False
     else:
         return True
 
-
-
-
 class Merge3Text(object):
     """3-way merge of texts.
 
     Given strings BASE, OTHER, THIS, tries to produce a combined text
     incorporating the changes from both BASE->OTHER and BASE->THIS."""
     def __init__(self, basetext, atext, btext, base=None, a=None, b=None):
         self.basetext = basetext
         self.atext = atext
@@ -87,18 +76,16 @@ class Merge3Text(object):
         if a is None:
             a = mdiff.splitnewlines(atext)
         if b is None:
             b = mdiff.splitnewlines(btext)
         self.base = base
         self.a = a
         self.b = b
 
-
-
     def merge_lines(self,
                     name_a=None,
                     name_b=None,
                     name_base=None,
                     start_marker='<<<<<<<',
                     mid_marker='=======',
                     end_marker='>>>>>>>',
                     base_marker=None,
@@ -145,20 +132,16 @@ class Merge3Text(object):
                         yield self.base[i]
                 yield mid_marker + newline
                 for i in range(t[5], t[6]):
                     yield self.b[i]
                 yield end_marker + newline
             else:
                 raise ValueError(what)
 
-
-
-
-
     def merge_annotated(self):
         """Return merge with conflicts, showing origin of lines.
 
         Most useful for debugging merge.
         """
         for t in self.merge_regions():
             what = t[0]
             if what == 'unchanged':
@@ -176,20 +159,16 @@ class Merge3Text(object):
                     yield 'A | ' + self.a[i]
                 yield '----\n'
                 for i in range(t[5], t[6]):
                     yield 'B | ' + self.b[i]
                 yield '>>>>\n'
             else:
                 raise ValueError(what)
 
-
-
-
-
     def merge_groups(self):
         """Yield sequence of line groups.  Each one is a tuple:
 
         'unchanged', lines
              Lines unchanged from base
 
         'a', lines
              Lines taken from a
@@ -214,17 +193,16 @@ class Merge3Text(object):
             elif what == 'conflict':
                 yield (what,
                        self.base[t[1]:t[2]],
                        self.a[t[3]:t[4]],
                        self.b[t[5]:t[6]])
             else:
                 raise ValueError(what)
 
-
     def merge_regions(self):
         """Return sequences of matching and conflicting regions.
 
         This returns tuples, where the first value says what kind we
         have:
 
         'unchanged', start, end
              Take a region of base[start:end]
@@ -300,17 +278,16 @@ class Merge3Text(object):
                 assert ib == bmatch
                 assert iz == zmatch
 
                 yield 'unchanged', zmatch, zend
                 iz = zend
                 ia = aend
                 ib = bend
 
-
     def reprocess_merge_regions(self, merge_regions):
         """Where there are conflict regions, remove the agreed lines.
 
         Lines where both A and B have made the same changes are
         eliminated.
         """
         for region in merge_regions:
             if region[0] != "conflict":
@@ -332,23 +309,21 @@ class Merge3Text(object):
                     yield reg
                 yield 'same', region_ia, region_len+region_ia
                 next_a = region_ia + region_len
                 next_b = region_ib + region_len
             reg = self.mismatch_region(next_a, amatch, next_b, bmatch)
             if reg is not None:
                 yield reg
 
-
     def mismatch_region(next_a, region_ia,  next_b, region_ib):
         if next_a < region_ia or next_b < region_ib:
             return 'conflict', None, None, next_a, region_ia, next_b, region_ib
     mismatch_region = staticmethod(mismatch_region)
 
-
     def find_sync_regions(self):
         """Return a list of sync regions, where both descendents match the base.
 
         Generates a list of (base1, base2, a1, a2, b1, b2).  There is
         always a zero-length sync region at the end of all the files.
         """
 
         ia = ib = 0
@@ -400,18 +375,16 @@ class Merge3Text(object):
 
         intbase = len(self.base)
         abase = len(self.a)
         bbase = len(self.b)
         sl.append((intbase, intbase, abase, abase, bbase, bbase))
 
         return sl
 
-
-
     def find_unconflicted(self):
         """Return a list of ranges in base that are not conflicted."""
         am = mdiff.get_matching_blocks(self.basetext, self.atext)
         bm = mdiff.get_matching_blocks(self.basetext, self.btext)
 
         unc = []
 
         while am and bm:
@@ -427,33 +400,16 @@ class Merge3Text(object):
 
             if a2 < b2:
                 del am[0]
             else:
                 del bm[0]
 
         return unc
 
-
-# bzr compatible interface, for the tests
-class Merge3(Merge3Text):
-    """3-way merge of texts.
-
-    Given BASE, OTHER, THIS, tries to produce a combined text
-    incorporating the changes from both BASE->OTHER and BASE->THIS.
-    All three will typically be sequences of lines."""
-    def __init__(self, base, a, b):
-        basetext = '\n'.join([i.strip('\n') for i in base] + [''])
-        atext = '\n'.join([i.strip('\n') for i in a] + [''])
-        btext = '\n'.join([i.strip('\n') for i in b] + [''])
-        if util.binary(basetext) or util.binary(atext) or util.binary(btext):
-            raise util.Abort(_("don't know how to merge binary files"))
-        Merge3Text.__init__(self, basetext, atext, btext, base, a, b)
-
-
 def simplemerge(local, base, other, **opts):
     def readfile(filename):
         f = open(filename, "rb")
         text = f.read()
         f.close()
         if util.binary(text):
             msg = _("%s looks like a binary file.") % filename
             if not opts.get('text'):
@@ -493,70 +449,8 @@ def simplemerge(local, base, other, **op
 
     if not opts.get('print'):
         out.rename()
 
     if m3.conflicts:
         if not opts.get('quiet'):
             warn(_("warning: conflicts during merge.\n"))
         return 1
-
-options = [('L', 'label', [], _('labels to use on conflict markers')),
-           ('a', 'text', None, _('treat all files as text')),
-           ('p', 'print', None,
-            _('print results instead of overwriting LOCAL')),
-           ('', 'no-minimal', None,
-            _('do not try to minimize conflict regions')),
-           ('h', 'help', None, _('display help and exit')),
-           ('q', 'quiet', None, _('suppress output'))]
-
-usage = _('''simplemerge [OPTS] LOCAL BASE OTHER
-
-    Simple three-way file merge utility with a minimal feature set.
-
-    Apply to LOCAL the changes necessary to go from BASE to OTHER.
-
-    By default, LOCAL is overwritten with the results of this operation.
-''')
-
-def showhelp():
-    sys.stdout.write(usage)
-    sys.stdout.write('\noptions:\n')
-
-    out_opts = []
-    for shortopt, longopt, default, desc in options:
-        out_opts.append(('%2s%s' % (shortopt and '-%s' % shortopt,
-                                    longopt and ' --%s' % longopt),
-                         '%s' % desc))
-    opts_len = max([len(opt[0]) for opt in out_opts])
-    for first, second in out_opts:
-        sys.stdout.write(' %-*s  %s\n' % (opts_len, first, second))
-
-class ParseError(Exception):
-    """Exception raised on errors in parsing the command line."""
-
-def main(argv):
-    try:
-        opts = {}
-        try:
-            args = fancyopts.fancyopts(argv[1:], options, opts)
-        except fancyopts.getopt.GetoptError, e:
-            raise ParseError(e)
-        if opts['help']:
-            showhelp()
-            return 0
-        if len(args) != 3:
-                raise ParseError(_('wrong number of arguments'))
-        return simplemerge(*args, **opts)
-    except ParseError, e:
-        sys.stdout.write("%s: %s\n" % (sys.argv[0], e))
-        showhelp()
-        return 1
-    except util.Abort, e:
-        sys.stderr.write("abort: %s\n" % e)
-        return 255
-    except KeyboardInterrupt:
-        return 255
-
-if __name__ == '__main__':
-    import sys
-    import os
-    sys.exit(main(sys.argv))
--- a/mercurial/sshrepo.py
+++ b/mercurial/sshrepo.py
@@ -109,24 +109,35 @@ class sshrepository(remoterepository):
         for k, v in args.items():
             self.pipeo.write("%s %d\n" % (k, len(v)))
             self.pipeo.write(v)
         self.pipeo.flush()
 
         return self.pipei
 
     def call(self, cmd, **args):
-        r = self.do_cmd(cmd, **args)
-        l = r.readline()
+        self.do_cmd(cmd, **args)
+        return self._recv()
+
+    def _recv(self):
+        l = self.pipei.readline()
         self.readerr()
         try:
             l = int(l)
         except:
             self.raise_(util.UnexpectedOutput(_("unexpected response:"), l))
-        return r.read(l)
+        return self.pipei.read(l)
+
+    def _send(self, data, flush=False):
+        self.pipeo.write("%d\n" % len(data))
+        if data:
+            self.pipeo.write(data)
+        if flush:
+            self.pipeo.flush()
+        self.readerr()
 
     def lock(self):
         self.call("lock")
         return remotelock(self)
 
     def unlock(self):
         self.call("unlock")
 
@@ -177,51 +188,51 @@ class sshrepository(remoterepository):
     def unbundle(self, cg, heads, source):
         d = self.call("unbundle", heads=' '.join(map(hex, heads)))
         if d:
             # remote may send "unsynced changes"
             self.raise_(repo.RepoError(_("push refused: %s") % d))
 
         while 1:
             d = cg.read(4096)
-            if not d: break
-            self.pipeo.write(str(len(d)) + '\n')
-            self.pipeo.write(d)
-            self.readerr()
+            if not d:
+                break
+            self._send(d)
 
-        self.pipeo.write('0\n')
-        self.pipeo.flush()
+        self._send("", flush=True)
 
-        self.readerr()
-        l = int(self.pipei.readline())
-        r = self.pipei.read(l)
+        r = self._recv()
         if r:
             # remote may send "unsynced changes"
             self.raise_(repo.RepoError(_("push failed: %s") % r))
 
-        self.readerr()
-        l = int(self.pipei.readline())
-        r = self.pipei.read(l)
-        return int(r)
+        r = self._recv()
+        try:
+            return int(r)
+        except:
+            self.raise_(util.UnexpectedOutput(_("unexpected response:"), r))
 
     def addchangegroup(self, cg, source, url):
         d = self.call("addchangegroup")
         if d:
             self.raise_(repo.RepoError(_("push refused: %s") % d))
         while 1:
             d = cg.read(4096)
-            if not d: break
+            if not d:
+                break
             self.pipeo.write(d)
             self.readerr()
 
         self.pipeo.flush()
 
         self.readerr()
-        l = int(self.pipei.readline())
-        r = self.pipei.read(l)
+        r = self._recv()
         if not r:
             return 1
-        return int(r)
+        try:
+            return int(r)
+        except:
+            self.raise_(util.UnexpectedOutput(_("unexpected response:"), r))
 
     def stream_out(self):
         return self.do_cmd('stream_out')
 
 instance = sshrepository
--- a/mercurial/statichttprepo.py
+++ b/mercurial/statichttprepo.py
@@ -4,24 +4,26 @@
 #
 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
 #
 # This software may be used and distributed according to the terms
 # of the GNU General Public License, incorporated herein by reference.
 
 from i18n import _
 import changelog, filelog, httprangereader
-import repo, localrepo, manifest, os, urllib, urllib2, util
+import repo, localrepo, manifest, util
+import urllib, urllib2, errno
 
 class rangereader(httprangereader.httprangereader):
     def read(self, size=None):
         try:
             return httprangereader.httprangereader.read(self, size)
         except urllib2.HTTPError, inst:
-            raise IOError(None, inst)
+            num = inst.code == 404 and errno.ENOENT or None
+            raise IOError(num, inst)
         except urllib2.URLError, inst:
             raise IOError(None, inst.reason[1])
 
 def opener(base):
     """return a function that opens files over http"""
     p = base
     def o(path, mode="r"):
         f = "/".join((p, urllib.quote(path)))
@@ -30,21 +32,27 @@ def opener(base):
 
 class statichttprepository(localrepo.localrepository):
     def __init__(self, ui, path):
         self._url = path
         self.ui = ui
 
         self.path = path.rstrip('/') + "/.hg"
         self.opener = opener(self.path)
+
         # find requirements
         try:
             requirements = self.opener("requires").read().splitlines()
-        except IOError:
-            requirements = []
+        except IOError, inst:
+            if inst.errno == errno.ENOENT:
+                msg = _("'%s' does not appear to be an hg repository") % path
+                raise repo.RepoError(msg)
+            else:
+                requirements = []
+
         # check them
         for r in requirements:
             if r not in self.supported:
                 raise repo.RepoError(_("requirement '%s' not supported") % r)
 
         # setup store
         if "store" in requirements:
             self.encodefn = util.encodefilename
--- a/mercurial/templatefilters.py
+++ b/mercurial/templatefilters.py
@@ -95,20 +95,16 @@ def domain(author):
     return author
 
 def person(author):
     '''get name of author, or else username.'''
     f = author.find('<')
     if f == -1: return util.shortuser(author)
     return author[:f].rstrip()
 
-def shortdate(date):
-    '''turn (timestamp, tzoff) tuple into iso 8631 date.'''
-    return util.datestr(date, format='%Y-%m-%d', timezone=False)
-
 def indent(text, prefix):
     '''indent each non-empty line of text after first with prefix.'''
     lines = text.splitlines()
     num_lines = len(lines)
     def indenter():
         for i in xrange(num_lines):
             l = lines[i]
             if i and l.strip():
@@ -140,16 +136,16 @@ filters = {
     "hgdate": hgdate,
     "isodate": isodate,
     "obfuscate": obfuscate,
     "permissions": permissions,
     "person": person,
     "rfc822date": lambda x: util.datestr(x, "%a, %d %b %Y %H:%M:%S"),
     "rfc3339date": lambda x: util.datestr(x, "%Y-%m-%dT%H:%M:%S", True, "%+03d:%02d"),
     "short": lambda x: x[:12],
-    "shortdate": shortdate,
+    "shortdate": util.shortdate,
     "stringify": templater.stringify,
     "strip": lambda x: x.strip(),
     "urlescape": lambda x: urllib.quote(x),
     "user": lambda x: util.shortuser(x),
     "stringescape": lambda x: x.encode('string_escape'),
     }
 
--- a/mercurial/transaction.py
+++ b/mercurial/transaction.py
@@ -10,28 +10,30 @@
 #
 # This software may be used and distributed according to the terms
 # of the GNU General Public License, incorporated herein by reference.
 
 from i18n import _
 import os
 
 class transaction(object):
-    def __init__(self, report, opener, journal, after=None):
+    def __init__(self, report, opener, journal, after=None, createmode=None):
         self.journal = None
 
         self.count = 1
         self.report = report
         self.opener = opener
         self.after = after
         self.entries = []
         self.map = {}
         self.journal = journal
 
         self.file = open(self.journal, "w")
+        if createmode is not None:
+            os.chmod(self.journal, createmode & 0666)
 
     def __del__(self):
         if self.journal:
             if self.entries: self.abort()
             self.file.close()
             try: os.unlink(self.journal)
             except: pass
 
--- a/mercurial/util.py
+++ b/mercurial/util.py
@@ -330,17 +330,17 @@ def pathto(root, n1, n2):
         n2 = '/'.join((pconvert(root), n2))
     a, b = splitpath(n1), n2.split('/')
     a.reverse()
     b.reverse()
     while a and b and a[-1] == b[-1]:
         a.pop()
         b.pop()
     b.reverse()
-    return os.sep.join((['..'] * len(a)) + b)
+    return os.sep.join((['..'] * len(a)) + b) or '.'
 
 def canonpath(root, cwd, myname):
     """return the canonical path of myname, given cwd and root"""
     if root == os.sep:
         rootsep = os.sep
     elif endswithsep(root):
         rootsep = root
     else:
@@ -454,16 +454,18 @@ def _matcher(canonroot, cwd, names, inc,
         return globre(name, '', tail)
 
     def matchfn(pats, tail):
         """build a matching function from a set of patterns"""
         if not pats:
             return
         try:
             pat = '(?:%s)' % '|'.join([regex(k, p, tail) for (k, p) in pats])
+            if len(pat) > 20000:
+                raise OverflowError()
             return re.compile(pat).match
         except OverflowError:
             # We're using a Python with a tiny regex engine and we
             # made it explode, so we'll divide the pattern list in two
             # until it works
             l = len(pats)
             if l < 2:
                 raise
@@ -890,16 +892,23 @@ def endswithsep(path):
 def splitpath(path):
     '''Split path by os.sep.
     Note that this function does not use os.altsep because this is
     an alternative of simple "xxx.split(os.sep)".
     It is recommended to use os.path.normpath() before using this
     function if need.'''
     return path.split(os.sep)
 
+def gui():
+    '''Are we running in a GUI?'''
+    return os.name == "nt" or os.name == "mac" or os.environ.get("DISPLAY")
+
+def lookup_reg(key, name=None, scope=None):
+    return None
+
 # Platform specific variants
 if os.name == 'nt':
     import msvcrt
     nulldev = 'NUL:'
 
     class winstdout:
         '''stdout on windows misbehaves if sent through a pipe'''
 
@@ -1286,17 +1295,17 @@ def _buildencodefun():
 
 encodefilename, decodefilename = _buildencodefun()
 
 def encodedopener(openerfn, fn):
     def o(path, *args, **kw):
         return openerfn(fn(path), *args, **kw)
     return o
 
-def mktempcopy(name, emptyok=False):
+def mktempcopy(name, emptyok=False, createmode=None):
     """Create a temporary file with the same contents from name
 
     The permission bits are copied from the original file.
 
     If the temporary file is going to be truncated immediately, you
     can use emptyok=True as an optimization.
 
     Returns the name of the temporary file.
@@ -1307,17 +1316,20 @@ def mktempcopy(name, emptyok=False):
     # Temporary files are created with mode 0600, which is usually not
     # what we want.  If the original file already exists, just copy
     # its mode.  Otherwise, manually obey umask.
     try:
         st_mode = os.lstat(name).st_mode & 0777
     except OSError, inst:
         if inst.errno != errno.ENOENT:
             raise
-        st_mode = 0666 & ~_umask
+        st_mode = createmode
+        if st_mode is None:
+            st_mode = ~_umask
+        st_mode &= 0666
     os.chmod(temp, st_mode)
     if emptyok:
         return temp
     try:
         try:
             ifp = posixfile(name, "rb")
         except IOError, inst:
             if inst.errno == errno.ENOENT:
@@ -1338,95 +1350,123 @@ def mktempcopy(name, emptyok=False):
 
 class atomictempfile(posixfile):
     """file-like object that atomically updates a file
 
     All writes will be redirected to a temporary copy of the original
     file.  When rename is called, the copy is renamed to the original
     name, making the changes visible.
     """
-    def __init__(self, name, mode):
+    def __init__(self, name, mode, createmode):
         self.__name = name
-        self.temp = mktempcopy(name, emptyok=('w' in mode))
+        self.temp = mktempcopy(name, emptyok=('w' in mode),
+                               createmode=createmode)
         posixfile.__init__(self, self.temp, mode)
 
     def rename(self):
         if not self.closed:
             posixfile.close(self)
             rename(self.temp, localpath(self.__name))
 
     def __del__(self):
         if not self.closed:
             try:
                 os.unlink(self.temp)
             except: pass
             posixfile.close(self)
 
+def makedirs(name, mode=None):
+    """recursive directory creation with parent mode inheritance"""
+    try:
+        os.mkdir(name)
+        if mode is not None:
+            os.chmod(name, mode)
+        return
+    except OSError, err:
+        if err.errno == errno.EEXIST:
+            return
+        if err.errno != errno.ENOENT:
+            raise
+    parent = os.path.abspath(os.path.dirname(name))
+    makedirs(parent, mode)
+    makedirs(name, mode)
+
 class opener(object):
     """Open files relative to a base directory
 
     This class is used to hide the details of COW semantics and
     remote file access from higher level code.
     """
     def __init__(self, base, audit=True):
         self.base = base
         if audit:
             self.audit_path = path_auditor(base)
         else:
             self.audit_path = always
+        self.createmode = None
 
     def __getattr__(self, name):
         if name == '_can_symlink':
             self._can_symlink = checklink(self.base)
             return self._can_symlink
         raise AttributeError(name)
 
+    def _fixfilemode(self, name):
+        if self.createmode is None:
+            return
+        os.chmod(name, self.createmode & 0666)
+
     def __call__(self, path, mode="r", text=False, atomictemp=False):
         self.audit_path(path)
         f = os.path.join(self.base, path)
 
         if not text and "b" not in mode:
             mode += "b" # for that other OS
 
+        nlink = -1
         if mode[0] != "r":
             try:
                 nlink = nlinks(f)
             except OSError:
                 nlink = 0
                 d = os.path.dirname(f)
                 if not os.path.isdir(d):
-                    os.makedirs(d)
+                    makedirs(d, self.createmode)
             if atomictemp:
-                return atomictempfile(f, mode)
+                return atomictempfile(f, mode, self.createmode)
             if nlink > 1:
                 rename(mktempcopy(f), f)
-        return posixfile(f, mode)
+        fp = posixfile(f, mode)
+        if nlink == 0:
+            self._fixfilemode(f)
+        return fp
 
     def symlink(self, src, dst):
         self.audit_path(dst)
         linkname = os.path.join(self.base, dst)
         try:
             os.unlink(linkname)
         except OSError:
             pass
 
         dirname = os.path.dirname(linkname)
         if not os.path.exists(dirname):
-            os.makedirs(dirname)
+            makedirs(dirname, self.createmode)
 
         if self._can_symlink:
             try:
                 os.symlink(src, linkname)
             except OSError, err:
                 raise OSError(err.errno, _('could not symlink to %r: %s') %
                               (src, err.strerror), linkname)
         else:
             f = self(dst, "w")
             f.write(src)
             f.close()
+            self._fixfilemode(dst)
 
 class chunkbuffer(object):
     """Allow arbitrary sized chunks of data to be efficiently read from an
     iterator over chunks of arbitrary size."""
 
     def __init__(self, in_iter):
         """in_iter is the iterator that's iterating over the input chunks.
         targetsize is how big a buffer to try to maintain."""
@@ -1488,16 +1528,20 @@ def datestr(date=None, format='%a %b %d 
     number of seconds away from UTC. if timezone is false, do not
     append time zone to string."""
     t, tz = date or makedate()
     s = time.strftime(format, time.gmtime(float(t) - tz))
     if timezone:
         s += timezone_format % (-tz / 3600, ((-tz % 3600) / 60))
     return s
 
+def shortdate(date=None):
+    """turn (timestamp, tzoff) tuple into iso 8631 date."""
+    return datestr(date, format='%Y-%m-%d', timezone=False)
+
 def strdate(string, format, defaults=[]):
     """parse a localized time string and return a (unixtime, offset) tuple.
     if the string cannot be parsed, ValueError is raised."""
     def timezone(string):
         tz = string.split()[-1]
         if tz[0] in "+-" and len(tz) == 5 and tz[1:].isdigit():
             tz = int(tz)
             offset = - 3600 * (tz / 100) - 60 * (tz % 100)
@@ -1523,50 +1567,54 @@ def strdate(string, format, defaults=[])
     if offset is None:
         # local timezone
         unixtime = int(time.mktime(timetuple))
         offset = unixtime - localunixtime
     else:
         unixtime = localunixtime + offset
     return unixtime, offset
 
-def parsedate(string, formats=None, defaults=None):
-    """parse a localized time string and return a (unixtime, offset) tuple.
+def parsedate(date, formats=None, defaults=None):
+    """parse a localized date/time string and return a (unixtime, offset) tuple.
+
     The date may be a "unixtime offset" string or in one of the specified
-    formats."""
-    if not string:
+    formats. If the date already is a (unixtime, offset) tuple, it is returned.
+    """
+    if not date:
         return 0, 0
+    if type(date) is type((0, 0)) and len(date) == 2:
+        return date
     if not formats:
         formats = defaultdateformats
-    string = string.strip()
+    date = date.strip()
     try:
-        when, offset = map(int, string.split(' '))
+        when, offset = map(int, date.split(' '))
     except ValueError:
         # fill out defaults
         if not defaults:
             defaults = {}
         now = makedate()
         for part in "d mb yY HI M S".split():
             if part not in defaults:
                 if part[0] in "HMS":
                     defaults[part] = "00"
                 elif part[0] in "dm":
                     defaults[part] = "1"
                 else:
                     defaults[part] = datestr(now, "%" + part[0], False)
 
         for format in formats:
             try:
-                when, offset = strdate(string, format, defaults)
-            except ValueError:
+                when, offset = strdate(date, format, defaults)
+            except (ValueError, OverflowError):
                 pass
             else:
                 break
         else:
-            raise Abort(_('invalid date: %r ') % string)
+            raise Abort(_('invalid date: %r ') % date)
     # validate explicit (probably user-specified) date and
     # time zone offset. values must fit in signed 32 bits for
     # current 32-bit linux runtimes. timezones go from UTC-12
     # to UTC+14
     if abs(when) > 0x7fffffff:
         raise Abort(_('date exceeds 32 bits: %d') % when)
     if offset < -50400 or offset > 43200:
         raise Abort(_('impossible time zone offset: %d') % offset)
@@ -1651,21 +1699,19 @@ def ellipsis(text, maxlength=400):
 
 def walkrepos(path):
     '''yield every hg repository under path, recursively.'''
     def errhandler(err):
         if err.filename == path:
             raise err
 
     for root, dirs, files in os.walk(path, onerror=errhandler):
-        for d in dirs:
-            if d == '.hg':
-                yield root
-                dirs[:] = []
-                break
+        if '.hg' in dirs:
+            dirs[:] = [] # don't descend further
+            yield root # found a repository
 
 _rcpath = None
 
 def os_rcpath():
     '''return default os-specific hgrc search path'''
     path = system_rcpath()
     path.extend(user_rcpath())
     path = [os.path.normpath(f) for f in path]
--- a/mercurial/util_win32.py
+++ b/mercurial/util_win32.py
@@ -182,16 +182,47 @@ def testpid(pid):
             win32con.PROCESS_QUERY_INFORMATION, False, pid)
         if handle:
             status = win32process.GetExitCodeProcess(handle)
             return status == win32con.STILL_ACTIVE
     except pywintypes.error, details:
         return details[0] != winerror.ERROR_INVALID_PARAMETER
     return True
 
+def lookup_reg(key, valname=None, scope=None):
+    ''' Look up a key/value name in the Windows registry.
+
+    valname: value name. If unspecified, the default value for the key
+    is used.
+    scope: optionally specify scope for registry lookup, this can be
+    a sequence of scopes to look up in order. Default (CURRENT_USER,
+    LOCAL_MACHINE).
+    '''
+    try:
+        from _winreg import HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, \
+            QueryValueEx, OpenKey
+    except ImportError:
+        return None
+
+    def query_val(scope, key, valname):
+        try:
+            keyhandle = OpenKey(scope, key)
+            return QueryValueEx(keyhandle, valname)[0]
+        except EnvironmentError:
+            return None
+
+    if scope is None:
+        scope = (HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE)
+    elif not isinstance(scope, (list, tuple)):
+        scope = (scope,)
+    for s in scope:
+        val = query_val(s, key, valname)
+        if val is not None:
+            return val
+
 def system_rcpath_win32():
     '''return default os-specific hgrc search path'''
     proc = win32api.GetCurrentProcess()
     try:
         # This will fail on windows < NT
         filename = win32process.GetModuleFileNameEx(proc, 0)
     except:
         filename = win32api.GetModuleFileName(0)
--- a/setup.py
+++ b/setup.py
@@ -35,21 +35,16 @@ try:
     except ImportError:
         pass
 
     extra['console'] = ['hg']
 
 except ImportError:
     pass
 
-if os.name in ['nt']:
-    extra['scripts'] = ['hg']
-else:
-    extra['scripts'] = ['hg', 'hgmerge']
-
 # specify version string, otherwise 'hg identify' will be used:
 version = ''
 
 class install_package_data(install_data):
     def finalize_options(self):
         self.set_undefined_options('install',
                                    ('install_lib', 'install_dir'))
         install_data.finalize_options(self)
@@ -72,16 +67,17 @@ except ImportError:
 
 setup(name='mercurial',
       version=mercurial.version.get_version(),
       author='Matt Mackall',
       author_email='mpm@selenic.com',
       url='http://selenic.com/mercurial',
       description='Scalable distributed SCM',
       license='GNU GPL',
+      scripts=['hg'],
       packages=['mercurial', 'mercurial.hgweb', 'hgext', 'hgext.convert'],
       ext_modules=ext_modules,
       data_files=[(os.path.join('mercurial', root),
                    [os.path.join(root, file_) for file_ in files])
                   for root, dirs, files in os.walk('templates')],
       cmdclass=cmdclass,
       options=dict(py2exe=dict(packages=['hgext']),
                    bdist_mpkg=dict(zipdist=True,
--- a/templates/footer.tmpl
+++ b/templates/footer.tmpl
@@ -1,8 +1,8 @@
 #motd#
 <div class="logo">
-powered by<br/>
-<a href="http://www.selenic.com/mercurial/">mercurial</a>
+<a href="http://www.selenic.com/mercurial/">
+<img src="#staticurl#hglogo.png" width=75 height=90 border=0 alt="mercurial"></a>
 </div>
 
 </body>
 </html>
--- a/templates/gitweb/map
+++ b/templates/gitweb/map
@@ -18,22 +18,22 @@ searchentry = changelogentry.tmpl
 changeset = changeset.tmpl
 manifest = manifest.tmpl
 manifestdirentry = '<tr class="parity#parity#"><td style="font-family:monospace">drwxr-xr-x</td><td style="font-family:monospace"></td><td style="font-family:monospace"></td><td><a href="#url#file/#node|short##path|urlescape#{sessionvars%urlparameter}">#basename|escape#</a></td><td class="link"><a href="#url#file/#node|short##path|urlescape#{sessionvars%urlparameter}">manifest</a></td></tr>'
 manifestfileentry = '<tr class="parity#parity#"><td style="font-family:monospace">#permissions|permissions#</td><td style="font-family:monospace" align=right>#date|isodate#</td><td style="font-family:monospace" align=right>#size#</td><td class="list"><a class="list" href="#url#file/#node|short#/#file|urlescape#{sessionvars%urlparameter}">#basename|escape#</a></td><td class="link"><a href="#url#file/#node|short#/#file|urlescape#{sessionvars%urlparameter}">file</a> | <a href="#url#log/#node|short#/#file|urlescape#{sessionvars%urlparameter}">revisions</a> | <a href="#url#annotate/#node|short#/#file|urlescape#{sessionvars%urlparameter}">annotate</a></td></tr>'
 filerevision = filerevision.tmpl
 fileannotate = fileannotate.tmpl
 filediff = filediff.tmpl
 filelog = filelog.tmpl
-fileline = '<div style="font-family:monospace" class="parity#parity#"><pre><span class="linenr">   #linenumber#</span> #line|escape#</pre></div>'
-annotateline = '<tr style="font-family:monospace" class="parity#parity#"><td class="linenr" style="text-align: right;"><a href="#url#annotate/#node|short#/#file|urlescape#{sessionvars%urlparameter}">#author|obfuscate#@#rev#</a></td><td><pre>#line|escape#</pre></td></tr>'
-difflineplus = '<span style="color:#008800;">#line|escape#</span>'
-difflineminus = '<span style="color:#cc0000;">#line|escape#</span>'
-difflineat = '<span style="color:#990099;">#line|escape#</span>'
-diffline = '<span>#line|escape#</span>'
+fileline = '<div style="font-family:monospace" class="parity#parity#"><pre><a class="linenr" href="##lineid#" id="#lineid#">#linenumber#</a> #line|escape#</pre></div>'
+annotateline = '<tr style="font-family:monospace" class="parity#parity#"><td class="linenr" style="text-align: right;"><a href="#url#annotate/#node|short#/#file|urlescape#{sessionvars%urlparameter}#l{targetline}">#author|obfuscate#@#rev#</a></td><td><pre><a class="linenr" href="##lineid#" id="#lineid#">#linenumber#</a></pre></td><td><pre>#line|escape#</pre></td></tr>'
+difflineplus = '<span style="color:#008800;"><a class="linenr" href="##lineid#" id="#lineid#">#linenumber#</a> #line|escape#</span>'
+difflineminus = '<span style="color:#cc0000;"><a class="linenr" href="##lineid#" id="#lineid#">#linenumber#</a> #line|escape#</span>'
+difflineat = '<span style="color:#990099;"><a class="linenr" href="##lineid#" id="#lineid#">#linenumber#</a> #line|escape#</span>'
+diffline = '<span><a class="linenr" href="##lineid#" id="#lineid#">#linenumber#</a> #line|escape#</span>'
 changelogparent = '<tr><th class="parent">parent #rev#:</th><td class="parent"><a href="#url#rev/#node|short#{sessionvars%urlparameter}">#node|short#</a></td></tr>'
 changesetparent = '<tr><td>parent {rev}</td><td style="font-family:monospace"><a class="list" href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td></tr>'
 filerevparent = '<tr><td>parent {rev}</td><td style="font-family:monospace"><a class="list" href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rename%filerename}{node|short}</a></td></tr>'
 filerename = '{file|escape}@'
 filelogrename = '| <a href="{url}file/#node|short#/#file|urlescape#{sessionvars%urlparameter}">base</a>'
 fileannotateparent = '<tr><td>parent {rev}</td><td style="font-family:monospace"><a class="list" href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rename%filerename}{node|short}</a></td></tr>'
 changelogchild = '<tr><th class="child">child #rev#:</th><td class="child"><a href="{url}rev/#node|short#{sessionvars%urlparameter}">#node|short#</a></td></tr>'
 changesetchild = '<tr><td>child {rev}</td><td style="font-family:monospace"><a class="list" href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td></tr>'
--- a/templates/map
+++ b/templates/map
@@ -17,23 +17,23 @@ searchentry = changelogentry.tmpl
 changeset = changeset.tmpl
 manifest = manifest.tmpl
 manifestdirentry = '<tr class="parity#parity#"><td><tt>drwxr-xr-x</tt>&nbsp;<td>&nbsp;<td>&nbsp;<td><a href="#url#file/#node|short##path|urlescape#{sessionvars%urlparameter}">#basename|escape#/</a>'
 manifestfileentry = '<tr class="parity#parity#"><td><tt>#permissions|permissions#</tt>&nbsp;<td align=right><tt class="date">#date|isodate#</tt>&nbsp;<td align=right><tt>#size#</tt>&nbsp;<td><a href="#url#file/#node|short#/#file|urlescape#{sessionvars%urlparameter}">#basename|escape#</a>'
 filerevision = filerevision.tmpl
 fileannotate = fileannotate.tmpl
 filediff = filediff.tmpl
 filelog = filelog.tmpl
-fileline = '<div class="parity#parity#"><span class="lineno">#linenumber#</span>#line|escape#</div>'
+fileline = '<div class="parity#parity#"><a class="lineno" href="##lineid#" id="#lineid#">#linenumber#</a>#line|escape#</div>'
 filelogentry = filelogentry.tmpl
-annotateline = '<tr class="parity#parity#"><td class="annotate"><a href="#url#annotate/#node|short#/#file|urlescape#{sessionvars%urlparameter}">#author|obfuscate#@#rev#</a></td><td><pre>#line|escape#</pre></td></tr>'
-difflineplus = '<span class="plusline">#line|escape#</span>'
-difflineminus = '<span class="minusline">#line|escape#</span>'
-difflineat = '<span class="atline">#line|escape#</span>'
-diffline = '#line|escape#'
+annotateline = '<tr class="parity#parity#"><td class="annotate"><a href="#url#annotate/#node|short#/#file|urlescape#{sessionvars%urlparameter}#l{targetline}">#author|obfuscate#@#rev#</a></td><td><a class="lineno" href="##lineid#" id="#lineid#">#linenumber#</a></td><td><pre>#line|escape#</pre></td></tr>'
+difflineplus = '<span class="plusline"><a class="lineno" href="##lineid#" id="#lineid#">#linenumber#</a>#line|escape#</span>'
+difflineminus = '<span class="minusline"><a class="lineno" href="##lineid#" id="#lineid#">#linenumber#</a>#line|escape#</span>'
+difflineat = '<span class="atline"><a class="lineno" href="##lineid#" id="#lineid#">#linenumber#</a>#line|escape#</span>'
+diffline = '<a class="lineno" href="##lineid#" id="#lineid#">#linenumber#</a>#line|escape#'
 changelogparent = '<tr><th class="parent">parent #rev#:</th><td class="parent"><a href="#url#rev/#node|short#{sessionvars%urlparameter}">#node|short#</a></td></tr>'
 changesetparent = '<tr><th class="parent">parent #rev#:</th><td class="parent"><a href="#url#rev/#node|short#{sessionvars%urlparameter}">#node|short#</a></td></tr>'
 filerevparent = '<tr><td class="metatag">parent:</td><td><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rename%filerename}{node|short}</a></td></tr>'
 filerename = '{file|escape}@'
 filelogrename = '<tr><th>base:</th><td><a href="#url#file/#node|short#/#file|urlescape#{sessionvars%urlparameter}">#file|escape#@#node|short#</a></td></tr>'
 fileannotateparent = '<tr><td class="metatag">parent:</td><td><a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rename%filerename}{node|short}</a></td></tr>'
 changesetchild = '<tr><th class="child">child #rev#:</th><td class="child"><a href="#url#rev/#node|short#{sessionvars%urlparameter}">#node|short#</a></td></tr>'
 changelogchild = '<tr><th class="child">child #rev#:</th><td class="child"><a href="#url#rev/#node|short#{sessionvars%urlparameter}">#node|short#</a></td></tr>'
index 37ba3d1c6f17137d9c5f5776fa040caf5fe73ff9..7745acfee3575b1bd58f5c1b28e5d8664937e2ba
GIT binary patch
literal 857
zc$@)Q1E&0mP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00006VoOIv0RI60
z0RN!9r;`8x010qNS#tmYDYO6pDYOBGE-hOC00PTNL_t(I%Y~BPOImRl#-H;&2hDYA
z9xD71$+4ETAds{MMuS1M^k%x@prCHM-Y&=1#rh8h+r`G()gXwxNyuQuie~ddFANUO
z6pt2WKZYf-%+8P9<Q4_>-aha1d0%)QN>x={ozv4(vnYx$bGe+SR4TPn6s2$+Cs?i4
zS&PN;fnk_G)m`c;pja&Shr{88d_K=z)o7ZA#bQZ0oz5p5#|hT}<#PE>I2=x<QmJO#
zFp?w{#>U1T==J&>xh#mH=srF^zR?T-8jZ#{H#hf5RaG#Th27m<bEQ(b%@0LUaBy%i
zl*wfJi6lui`F#F)sZ{E!tE=0LL?WPR`c_CwOA8eWg~pk+wY9J5bo!}YuP^uZ_S%cZ
zVptFaS9f<eZu&-16eN?$0TPeLJ)NDM;Ca4gYip}>`t9_yteA}~EiECDNZ{n;1cZ=l
z0F%jtR4T>OKA*2S5C}Na>2z#jV&Y9xQ&Z9F^L}A#S>e2Lt~>mF*v7IfxeOtMps}$L
zi;Ih(6h%Qcn>Cuv=6#Juqg=fdi^d%5Ki0poEUT9!2>@WVTCuviild_=kx&!`p63ey
zYGbk3OfVQsZ)|MLmCI!#0Q5L|q8%L_3$iR%BZR?V!1D4k1_uY%|HT-MM&EC4ZjN8X
z*}Ai{bJy?p4_{Q<s?};?G#X*E*)Tgh3y$N|zP`TC1OO_P3K0asUxjsbbzx;?<&iAQ
z%>MrVeOZ=WZnqmQmkYUE4#8j$qobn>CX?wqbJ20-?Ck8AVVD|+!vU>U3zlU?LWm@a
z;v~=Wgr;f4<8e$)O<`nYB=7NfCMk+S6@d18?XTto^B*&r46Ul_ncwe!K~WS6g+gyA
z6vE!#9&|b#JRVQM>-D-D8X5`!{#SWucxc9KHvdfgO4#jo`$k(^TLu8?>+9cb=eBJF
z4+j{N(G(bdJp9^VFzi-+e*tGrI?Z9I)FS`@03v!+SaefwW^{L9a%BJjc-kv3FW1Y=
j%Pvk%EJ)SMFG>dhHrNJO5L3!r00000NkvXXu0mjfpYVt}
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..07c8e17c4c33b54d92a54d16d71ecffbc9b9abaa
GIT binary patch
literal 6045
zc$^iO2RPJ!9LKNm7iZ7RWDAkV3dac<9g)!`*$UYsBU`q!MIw8<?6~ZCj*xLim!0g9
zJ^x=k=bp#oe!t)M`+a}j@7G(nHbRvg$_#}-AmnO~AL)R14e&w|6M>&w9VH{+jmS(x
z^%3Oa^7~6;K?3*<iR0tvE)a;a_~q+Lc~=b^1agy7?UCZMca!U%y<MM;5)NS2@tVA1
z2`6U~B*7Y*{?~iq3XkZ*zL!Nt(*O5Jfz&Xr7Fv@n+$k^YV~9i+^N4KeC@tP8@&D3E
z%<w2efm>mLfu`rb$2}oNOUZqA#j2)ZKhu@DNfPcEtqgA>kLJ^>4&=R?tT(663HveE
ziO;X0W=OXttTRPTTKqAD6mJGgOH0j6`Nq$sSFRDoW@Px*owyDtIn_Pf+PprEAp}r-
zBiNVf3zn6Y8J6j@Qrw^jy;e6x?hnsu85p4S^YasDCTET&N>UHuR=arE<1EE0E+O%A
zWF&a#b;q)+yO(fq>;)aPlf0wwnLt}xTUb;SH#he}Ev-j4mIiJj@u}WxParxv`aYAy
zC-Rcf2!eh0tmEL=7%!@r!Zk`bPbXYG51un*QiCiiDpJhTiHnU@(9|SrYN}hZCOoYK
z54O0t2<~`woeTF`-0Xg;W4)1N*`_<DVrqSS-M!CBjGUaDKS@0>Fp!vnBEPgWs<&4?
zK0ZDyGV<T?V+@xC2}faBSzc)=S>06h@N#ZN1$6?}75DZPEJ;a8iG-Xyuev(1p+Sa-
z@>Y~e&d~t}Zrxp1Uti_P6LN@ERcb>+155sR8Jt+r#YK!aA-u4V9|DC!8Sj}uDk>_B
znJnw{+^FD=+jGh`HZ}|Fx-VX=x@DJ#f*a-Me>gt&G7`SY!^4x9l*G|d#v)J`EyQs>
zMdVd}c{v3nXNVtH{P0RptAd-`1L2g&vKMvnnVEh#_T}2RJp5`=Y3cPAtE#83Uio#0
zt@wAEWi>RU_4R4~em74Z!z%5p!L?Q!yXY!Y|8AReP`+)0=qcOR3A>N|RvCWhp8BPR
ztrJz&Cz|7LIaYt>X@H&ja<)2YSBp{6S7i^T>dTP(G=2I<a%605zlaT;u;^URfA?+@
zx-sk4yK5>raSIC;bMx~@!<py76LuSJEXI5#U%$rs`$N9Gha!cNG5rZqU~yJI(y`?)
zF^5aAiwWC+O}9z`0Re6P$xm(=!mT%dJfOlUqzTv#u>slkP2You<;IPZCCA`O8_1Uh
zKM1z>n4_aurD=j%TYh|g=*^?msGdBv-en^G>#e*!w9$AVUE1YvCWw+>Q1IWk3<Io<
zt!=waO)tI<cigN8mZ=iO7@$+Mfc87HEs#IBj*jP1qhW{)IX(56xRLivU{gX;@=N;@
zaqAzfwe|!7!2yp%As7q>^b`^jl9-qXc{jRpzzgI<DZ2#$+Fv7J@LWeLdvSTObh&wX
z6~1R)zw9Ly6%{=`r3epYiKAE~W8}Q|2L}fot+7`Jmt8x$x^(pQyIO;8Y#$t`mW=*>
zYu^yuX=b|66UQp&mAJBEvl+MOjuB-f8yOkVe(@p_Yq9dPtJh0Bl9mr~&$R9OSlNqE
zV>I9W`#NKd8$9E75<0rN6^25r@;-+j7!}Z9dbD+Q+bhhw`T6;0`clQx<=>~xccWb9
zI!Mye(qxjfG&FK5vf_$#3&2zuR#}nD%gc9kbo_d2Z|_gA=i}xMZfQ{fTD`|eCYQYF
z^!6rP8;R`A(@1%3XZO9;m4u88tTRM0hzN`vq#9RtMEWP;(<cpmeFpD?4a=$8x0fO*
zEG)#V1RTmwPEKxZZ*zc)W@mFosc=zKQxm{NEk?)2baZsuMoSDZ)!Q=J;!6XWDTFSF
zZoX!#g}CUOIqs|1u1!?Gp~ZM?@=8gK+X@>yv@AMv1S^#3yBzIU?s~mPEn;|ZW)+UJ
zZU3#Tta$BS0IedCNW(_28Y4uO_SY4H-ol?hmG8FAf~iVhVv?VHlE~68QBzlk=jjmM
zmixOu7gD1k3R0x#-%BeE47>_H+b{xim0_cl+ohWCidHHaHLF2Nd+u=e_xC%e=H_x6
z`^~%k$dJaZO;l0Czq+mJ`))_Ra$Nq&Lqkg&9v)tAt8N=QP6Y>+L=AUbpM3B<?=SuH
zJf1u$))<zJf`Wp7E!QZi*x6Bt0xmHz+7Niagk6&&ZHD+88q%A>xf@8fDyx2YJa<H7
zq~~_$P0xS*lJ$<WSDl=kfH6|h(FLPW18iJ^ckhw|bLCcx@Be&!e0&SLqThlyF5!{l
z{x&Sf&d&aUjLA8u&j~|t&OJPNw^PJ7^!mZ+0p_BAt}}81;~}D^rj`!#%g9kh(J(Uh
z3}z`|dwNU`w`O-&@st=s46uuunxxuV2{i5E>Z-=;*Ze>oQlAmv=={^ohiog!yxPf~
zI|l~P!*~Z<+nn6o;P)r{)NE`|ntjh2>{j_;M<jRd-1&a`6DNDR)h@+K5ucEtrm2}*
zU!RI@I*!;|#d8JUmX%FE*=)`Xr{#-}iwhvw7u45Jlps37!ibMN#2-As<`jX+Qhix6
z_2wh6bvL~S0RaI!a-aG?482Y?_Yb9Dn**zPW?+yI8|#lO+t^nI8Q^m~Q4n=H^tjxp
z3GV244`2Q=r@TDort!M~Fxu{G<E^?{a>}Nr9JmybrR9Q5UP;LmV9I9Z=8gH|DypjU
z?igygt24ws>D4UtbFoZ2k7gAWm3VM_Lqo>%^Yhbr_6w7P4T8_fdR@Alck<_l9&<}e
z-H{?q?}ib@&jgas&F)}e(@%_ySUZ(FgM))FhcJ}gx94}GH<O%~IB*Z2vpu|prDcWZ
zKPzLeWgZ_NpU00MZ$V8#AQ%cUB&ze=6gG<8JUKZzFhoyDc6WA)+U^TgR#hF%MT!_U
zxZe3B>F{T!H3&FPN_sl0@XLlr;L%WW`;4inskb~NI5`9H#@^9rO5gt7<zdlO&BT->
zuqtVf4OVpHJ~N+IhDCqc1EVINRNy^TmN<rI0!gfCn}UHsK_JeQ(Rf-as+M|}r3Gu|
z==^Tf(7bgT%ugP64uf6Z6*wman@q?4`c!yK4DX#g;as7pt;48pIcB|=Abv&NR-Q@N
z|LQqM?~8fw+X1;)BQmp^$}^G#4JysMDdf)&&12YMF}Ov}d-tedux9y$q{PHvZZ&an
z@tOH~B_}7*L1C1`m^<oE47Zw)QFUx6yXVJ?i5=L&`%kL6y0jrnP|ulw8{-$F=k_69
z4q%kAy}g`*f{|%y%wreRd#pIv2mKt&y_M0!!$XsMjKq|bsyRcyMq*Z>(2&5yL^|Ng
zPo6w6`u^^zJ_`tKP4G31T~Sb1hYC&`FVpMDDuScC*!$t<bbjh-d_1aQVPQ4nj<FnF
zu&T^^2*v{iVr*q~HI6&HJ(LnRKt#r<;OOXxO73i2lB}m#US77FYKorAHv8?hT80pG
zao|v+0kVW7CMRb<6OeXZAcla?rTo+LuH@f%Qwaggb2!sZdFXSnwA0vR(Vm-|OU25n
zX=^J8{AOWk2{*Jel%vX}Mgz1j$9z=BbNbWNXlmV^Tdi$+`Xc$d3wZLg<AZjqsw|x%
zuaQbjpiYs+_*YX19X);4s13Hi|G&w_k19DF!onN*!j9-Tp5QMP6>%j7=-yXrUZloZ
z+EmQU5x|S2q`u+p)4;vV?=gmjhc6HLu0olZm;jauF_0!DB~{ndIIWD_fpkSNDS3KI
zM>5>y6cSq7Pgr!6;ujWHLF4BgrS7F_0ttIw=cj{Sy?S-w4iyUv&i~3aFH5P=(9q%W
z@i5%tiXNS`yu9&m8<+jH=a=sO)imgo!y2GKhMYG*u%;r-@0OKo?hgyJGV_54b#-+K
zr?>+6ny~A#lc1%e<Hjg|pkP}OH5InT#Eec(t~gBt=`x8~k;QXo0q!X*R4973vxk3m
zE%xKbuu&V!)5GmY%F2WhnQuH-0QlVz63PYFEiM*7xw0o<A1Nta^J>h9yeZ<9ZusZ5
z%goZ!k`q){TbqiOR})-`Gk6BG*~A5s3k5qjlt_N%xk%r1x}%{I&8%!^xAtV}JI^Jz
zfR!6z+{+Af+fD8b{`}eYft*D~n#?;8x7fDq>b3CxvAVk1&H~oizb-o)j<}F_obfl}
z6%~yGip<W=mW2`>crvH;TM55viUQu7mzRg%TX%ox>FEhjE%?oF{+{93Yw<at!{*^V
zViFQ?niPP2(P)vOp`q(HZg_ZUDJotuH8m|Ys@J)N-E6*)pO~2VzSTzh*Hs2}{L8u$
zKvF0?>swL6#mQf7F2FHZEcWzhz>il@Py^w=3N<J<QY;yDk6;GIBj&vD*j46bonQ%7
zU;>|3wl;qc4wn%9M=gQ((&8UKCI%k{-u7<fK>mpm$8~_%-;9J&V%joWIqYX)9UYGV
zw}OcG0of(jE0cm#2Ah2M?%m2#5-4<TNR>S)dTvAe`ExAD{ipnNcE7$+L(23u+}$Ob
z&(<A0cd&fR)6LD@Hkz3|l@oU2k`E4$(ra7#het<XnBuuj#hJk=|E)zRD~H%UQo^*J
z^>CqniSv8`JObc|iiruk>38AnX=+$wL(hjuzb!AHQC(e)(A~HCJ1jo3y7$ef+&Go3
zsi`T7`2kcd-cf4OpqAol!;4uN*;F>qSHLK4u={*fMF~|GB(ux=FxDXZHwc)c4a_E_
zr?=OvHSj;p4B1p*Y4;sxT8z&&<l_K5@>XHZ+0?SM@42rTK3}%Ax97cm+rP5%ep`Ec
zcvRF{rLmq~Qu+<(dinC!*4C|Qz;;+1E~l(48YEE_$N~t^K@S!?yIwbK1(XuSD4LD`
zW009|3c`2KZI3^x_ZGdhT6|b^wB^rSHRtpnR#i@bE&y2pZU;0OpPv59@=Va6{I(hm
z*lS>aj??cC_QpjDhOuC(0Z58VN><s73IGQLL1s5q8yz1{b4eMe+ubLL-a`d(i<_Gw
zIKgO@VM~Okg#~wxN;D@w|6_(PaALrL;AM8QzYex6;=_jz!iy^18~QcK==Ry$5)!p9
zV98Wh0dxc0jO8Y&n&?|aH^+?HD93XHOjSi9nRN>gi%GAVe+u3_-1|G+6VDy~^Z+$C
zQluLk8ajQip&EIY5_amy7c{Z#3R;X7aC%@lM&BH-fTsrq1jG7yiF6=m)Mkoyfi6P0
zz$bM39Bh>HOv{xKn+HIDLN98`swSei)qJ*EZ}feBn38$6X5IHuG>H9Tq5D0B*Y5Ly
zv<J2fVwoSYu^dW(zX2wKAyCPo2I>Ue%%&!7Y)qe-nfaURGL1k|#N;IMd?%%OYX>J%
z<uEPZg<_w!JkcA~+p!<n+HwSCO$y{Gz<XeKyIyj8dwT%D;Yv#3VPUuV_(HW{XU`D(
zhRwcmTC&^MNg0Gpwq{y|kky5%?>B1W=;`P>+LTGb48?KvbE!n#mX>C!n$Yz1^*tf=
zdH=NN8L-b<yNSR~vsp^N!)u$32e*J-Z@Am&>D46sw~lORZidm*(^r;{Qk#4=6k7XL
zp8%>w53{d|3K4(<UJj0cR55E%V%v5WaSkhi^=~b%$ZmJg(%q!5TE2MOh95{-%J7Z>
z@h|53S35f==gRBXufG%)64y=jm!O*>RB}w$Cu@WZzkYc!!4dp7w+xTR1GJAEUVcOz
z&}tH^y1EB_>*FIUs9!pBw3NvQgJpXD`x6%z*NXPt6GU?l6KI~tb8r87;ZSK$kg0W;
z`cX9?kIPaDJ)D|8C#n{Vg<TvCq)NN++Sh#&X+Dhy_4!X<1{Yt1E8ZR)1*m-hVD-z8
zqj#D-<bX1O5znMrXPAQI0b~5tc~M<JP#{&xi4$bd4w7c;?nxE5n%VNtJlWkrrP3n;
zvst$J-)VHS58|@^0P6w_AD^0v74bXLxa8tt_wHzx?(?$~&)p%_hi_J4XUkgHzP?9g
z`U%O&yajTpn!ID^S6ar#w@9{0G*j<~Jg>6$bej*n9@f?dN2e<fSK#C~U*F2J1l_-y
zs*v1brX?VX>7h!pV#XIR&l6Qv30|)RKz0IAMuD7(xh2;-USaMe#hRFs0+OXga@r@T
z(~N_Y^J<wsZrCN`PgC`YtS`Rb@%;2?e~rT-e(~+)Lgz;5jfCoZ4!7s;fO73Z3r79&
z-y`DUiLo<OK=!DMU8k;SmZd%MK8nhX{{9CSf%+wj?XdSf^;JvbHMTcZg5m~awE<BA
zb^rbN`o5T0s;uXI5)u;F_jx@pQnh%-WYH*7ruGeYgN?J>tBt`Iv7@A?U$DjH<;l7c
zvWo8Rwdogw^uB`@jeBD+z-s#DcRoqHU5WeUZQL>qwd(sgWQ+IEI#f*98#hOJ*2tmq
zXAg3^*b0jF@?#1H9QMRHwN?)n<p}XLws_%u#OF)S5Ep;u?hPi?ph?oIk1--5LdMMm
zmwea4!h(v125w^`@X&oNHZvtD33NI*5HT?+srm2ko(h<0A3}p$Zb1PpGjnekHJ22q
zWDwi2(%DO|FKA)|ISKYvw@Fw)zzpmoH!m*@14CClj|Sv$Awdfe(Y3)_JZWOq6yRW-
zZ%fF@eFo)cf5V)Pfgxhkd~LkK?09#1t|Oc_J3n9L`^g3dbg=E!R~N{1X&05mq@?ie
z`R+)dbF7=Qi;J>?g8$*)9MmIA%e>3?VD&s2kf79XVo{F`BT>g0g$kD?gwyfvn+m@R
zUyfiZkjC(m(Fg$SPoF=(6T>Ra`6EM4Fqp~=+;Q%+$M5Blx@Z>3h}rf~9DX?e2`%7A
zGf*?;0K(4!?1mF_WO#2#i~61WfQx~GK(+b(UrbMbKYcff{U%^~I#8LZ&AX!FrkLb?
zzKwr#nkP2`D}$c9={VL|oNc506452a#elT4tE-<i)mim3Z_fl#_To{pJ7I=RKAr{c
zI=Z^b2t<tL7}zrzIgffHPEpaP-!INjvIXC%j{#%wQX;HkSD=}G=k-8`yB~#6dZFbs
zx}!EV>4sJ{NbJCXHQ2(>y&WALyNq)pf`U24#SsM=Ud8zP3;KXXz1@n#yGu+B5WXRB
z4vc3>NlC?o9T~HDp>Ar-NLNM=l$7)z|KgH9M=%(uYhc@nKsoL-Th`lZvn^Iqz3ti=
zL9gJQ{KU=eK>_0PT(soxzZDrOIrZyPOTkn^#@{~z7yN3{dKDnGl*=DY^zYRNmFWoU
zf*uzI1<35|EH@wD!QYFG9?x%tjilaQb!TU1DWAi8VArmgOgFu6M3OhE=$n|_2DSu<
z%Z(*wvpfS(=d!E&@>P9)I%Da(%WWZ~fI^%u&JJ(~Ywq4?m1Mk~(q}}dPSKjg*Fm=9
zgH2Sc$(Q2dV%!q4tXAuVRuigRW%DJMM$S-dQc~xXL-XCG`yVxV<<EA9Z$%F)1`%Zq
zFTVp0zo2cPr$-Nh3_`{t5e2$5_WsbU<L<}o5jJoxz&co^92II6WMWwM=?IAS@$qp4
zlOQw%eoKyxn2c;Kaiqe19SH_908s$k?&svBIvjpA(`Sdoe@$$2w}uW13M2>xip=->
zOj%i3jATTh3oC-|pph&z3)-tf!7xC(yX<2PVCw3l3kwT{>&9L-n?C@Ix`;~=1HJBe
z&vx2>aB#2%xVc~o3WaLU^24{UULoB^w;T0aReirUN^4lAudc361&>Wjn^YrE!2#rj
z8>9I^*ZYjXFA<nQP>zg^&24UKHT#~)PKxh2P!sA61{KFBCy$oio`#khx7_?Y$`NqE
zGSrId@H<zF>pr~r;ax+Tte2|?fj~IDo*BC8I#{`Sm^xcRAnzsxMMUtpKAbQDA@q0@
cC!&4>A~8;6NTu6r1pXSLri^%04mSz>AC(aZ8UO$Q
--- a/templates/static/style.css
+++ b/templates/static/style.css
@@ -29,31 +29,18 @@ a { text-decoration:none; }
   color: white;
   text-align: right;
 }
 
 /* Common */
 pre { margin: 0; }
 
 .logo {
-  background-color: #333;
-  padding: 4pt;
-  margin: 8pt 0 8pt 8pt;
-  font-family: sans;
-  font-size: 60%;
-  color: white;
   float: right;
   clear: right;
-  text-align: left;
-}
-
-.logo a {
-  font-weight: bold;
-  font-size: 150%;
-  color: #999;
 }
 
 /* Changelog/Filelog entries */
 .logEntry { width: 100%; }
 .logEntry .age { width: 15%; }
 .logEntry th { font-weight: normal; text-align: right; vertical-align: top; }
 .logEntry th.age, .logEntry th.firstline { font-weight: bold; }
 .logEntry th.firstline { text-align: left; width: inherit; }
--- a/tests/coverage.py
+++ b/tests/coverage.py
@@ -213,17 +213,17 @@ class StatementFindingAstVisitor(compile
         # Finding the exclude lines for else's is tricky, because they aren't
         # present in the compiler parse tree.  Look at the previous suite,
         # and find its last line.  If any line between there and the else's
         # first line are excluded, then we exclude the else.
         lastprev = self.getLastLine(prevsuite)
         firstelse = self.getFirstLine(suite)
         for l in range(lastprev+1, firstelse):
             if l in self.suite_spots:
-                self.doSuite(None, suite, l in exclude=self.excluded)
+                self.doSuite(None, suite, exclude=l in self.excluded)
                 break
         else:
             self.doSuite(None, suite)
 
     def doElse(self, prevsuite, node):
         if node.else_:
             self.doPlainWordSuite(prevsuite, node.else_)
 
--- a/tests/hghave
+++ b/tests/hghave
@@ -16,16 +16,19 @@ def matchoutput(cmd, regexp, ignorestatu
     is matched by the supplied regular expression.
     """
     r = re.compile(regexp)
     fh = os.popen(cmd)
     s = fh.read()
     ret = fh.close()
     return (ignorestatus or ret is None) and r.search(s)
 
+def has_baz():
+    return matchoutput('baz --version 2>&1', r'baz Bazaar version')
+
 def has_cvs():
     return matchoutput('cvs --version 2>&1', r'Concurrent Versions System')
 
 def has_cvsps():
     return matchoutput('cvsps -h -q 2>&1', r'cvsps version', True)
 
 def has_darcs():
     return matchoutput('darcs', 'darcs version', True)
@@ -80,29 +83,51 @@ def has_svn_bindings():
         import svn.core
         return True
     except ImportError:
         return False
 
 def has_symlink():
     return hasattr(os, "symlink")
 
+def has_tla():
+    return matchoutput('tla --version 2>&1', r'The GNU Arch Revision')
+
+def has_unix_permissions():
+    d = tempfile.mkdtemp(prefix=tempprefix, dir=".")
+    try:
+        fname = os.path.join(d, 'foo')
+        for umask in (077, 007, 022):
+            os.umask(umask)
+            f = open(fname, 'w')
+            f.close()
+            mode = os.stat(fname).st_mode
+            os.unlink(fname)
+            if mode & 0777 != ~umask & 0666:
+                return False
+        return True
+    finally:
+        os.rmdir(d)
+
 checks = {
+    "baz": (has_baz, "GNU Arch baz client"),
     "cvs": (has_cvs, "cvs client"),
     "cvsps": (has_cvsps, "cvsps utility"),
     "darcs": (has_darcs, "darcs client"),
     "eol-in-paths": (has_eol_in_paths, "end-of-lines in paths"),
     "execbit": (has_executablebit, "executable bit"),
     "fifo": (has_fifo, "named pipes"),
     "git": (has_git, "git command line client"),
     "hotshot": (has_hotshot, "python hotshot module"),
     "lsprof": (has_lsprof, "python lsprof module"),
     "svn": (has_svn, "subversion client and admin tools"),
     "svn-bindings": (has_svn_bindings, "subversion python bindings"),
     "symlink": (has_symlink, "symbolic links"),
+    "tla": (has_tla, "GNU Arch tla client"),
+    "unix-permissions": (has_unix_permissions, "unix-style permissions"),
 }
 
 def list_features():
     for name, feature in checks.iteritems():
         desc = feature[1]
         print name + ':', desc
 
 parser = optparse.OptionParser("%prog [options] [features]")
--- a/tests/run-tests.py
+++ b/tests/run-tests.py
@@ -415,19 +415,17 @@ os.environ['TZ'] = 'GMT'
 os.environ["EMAIL"] = "Foo Bar <foo.bar@example.com>"
 
 TESTDIR = os.environ["TESTDIR"] = os.getcwd()
 HGTMP = os.environ['HGTMP'] = tempfile.mkdtemp('', 'hgtests.', options.tmpdir)
 DAEMON_PIDS = None
 HGRCPATH = None
 
 os.environ["HGEDITOR"] = sys.executable + ' -c "import sys; sys.exit(0)"'
-os.environ["HGMERGE"]  = ('python "%s" -L my -L other'
-                          % os.path.join(TESTDIR, os.path.pardir,
-                                         'contrib', 'simplemerge'))
+os.environ["HGMERGE"] = "internal:merge"
 os.environ["HGUSER"]   = "test"
 os.environ["HGENCODING"] = "ascii"
 os.environ["HGENCODINGMODE"] = "strict"
 os.environ["HGPORT"] = str(options.port)
 os.environ["HGPORT1"] = str(options.port + 1)
 os.environ["HGPORT2"] = str(options.port + 2)
 
 if options.with_hg:
--- a/tests/test-acl.out
+++ b/tests/test-acl.out
@@ -23,16 +23,17 @@ add changeset ef1ea85a6374
 add changeset f9cafe1212c8
 add changeset 911600dab2ae
 adding manifests
 adding file changes
 adding foo/Bar/file.txt revisions
 adding foo/file.txt revisions
 adding quux/file.py revisions
 added 3 changesets with 3 changes to 3 files
+updating the branch cache
 rolling back last transaction
 0:6675d58eff77
 
 Extension disabled for lack of acl.sources
 Pushing as user fred
 hgrc = """
 [hooks]
 pretxnchangegroup.acl = python:hgext.acl.hook
@@ -54,16 +55,17 @@ adding file changes
 adding foo/Bar/file.txt revisions
 adding foo/file.txt revisions
 adding quux/file.py revisions
 added 3 changesets with 3 changes to 3 files
 calling hook pretxnchangegroup.acl: hgext.acl.hook
 acl: acl.allow not enabled
 acl: acl.deny not enabled
 acl: changes have source "push" - skipping
+updating the branch cache
 rolling back last transaction
 0:6675d58eff77
 
 No [acl.allow]/[acl.deny]
 Pushing as user fred
 hgrc = """
 [hooks]
 pretxnchangegroup.acl = python:hgext.acl.hook
@@ -89,16 +91,17 @@ adding foo/file.txt revisions
 adding quux/file.py revisions
 added 3 changesets with 3 changes to 3 files
 calling hook pretxnchangegroup.acl: hgext.acl.hook
 acl: acl.allow not enabled
 acl: acl.deny not enabled
 acl: allowing changeset ef1ea85a6374
 acl: allowing changeset f9cafe1212c8
 acl: allowing changeset 911600dab2ae
+updating the branch cache
 rolling back last transaction
 0:6675d58eff77
 
 Empty [acl.allow]
 Pushing as user fred
 hgrc = """
 [hooks]
 pretxnchangegroup.acl = python:hgext.acl.hook
@@ -378,16 +381,17 @@ adding foo/file.txt revisions
 adding quux/file.py revisions
 added 3 changesets with 3 changes to 3 files
 calling hook pretxnchangegroup.acl: hgext.acl.hook
 acl: acl.allow enabled, 1 entries for user barney
 acl: acl.deny enabled, 0 entries for user barney
 acl: allowing changeset ef1ea85a6374
 acl: allowing changeset f9cafe1212c8
 acl: allowing changeset 911600dab2ae
+updating the branch cache
 rolling back last transaction
 0:6675d58eff77
 
 wilma can change files with a .txt extension
 Pushing as user wilma
 hgrc = """
 [hooks]
 pretxnchangegroup.acl = python:hgext.acl.hook
@@ -573,11 +577,12 @@ adding foo/file.txt revisions
 adding quux/file.py revisions
 added 3 changesets with 3 changes to 3 files
 calling hook pretxnchangegroup.acl: hgext.acl.hook
 acl: acl.allow enabled, 1 entries for user barney
 acl: acl.deny enabled, 0 entries for user barney
 acl: allowing changeset ef1ea85a6374
 acl: allowing changeset f9cafe1212c8
 acl: allowing changeset 911600dab2ae
+updating the branch cache
 rolling back last transaction
 0:6675d58eff77
 
--- a/tests/test-add.out
+++ b/tests/test-add.out
@@ -8,26 +8,31 @@ A a
 A b
 % should fail
 b already tracked!
 A a
 A b
 % should fail
 a already tracked!
 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+merging a
 warning: conflicts during merge.
-merging a
 merging a failed!
 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
 There are unresolved merges, you can redo the full merge using:
   hg update -C 2
   hg merge 1
 M a
+? a.orig
 % should fail
 a already tracked!
 M a
+? a.orig
 % issue683
 R a
+? a.orig
 M a
+? a.orig
 c does not exist!
 d does not exist!
 M a
 A c
+? a.orig
--- a/tests/test-archive
+++ b/tests/test-archive
@@ -64,16 +64,18 @@ unzip -t test.zip
 
 hg archive -t tar - | tar tf - | sed "s/$QTIP/TIP/"
 
 hg archive -r 0 -t tar rev-%r.tar
 if [ -f rev-0.tar ]; then
     echo 'rev-0.tar created'
 fi
 
+hg archive -t bogus test.bogus
+
 echo % server errors
 cat errors.log
 
 echo '% empty repo'
 hg init ../empty
 cd ../empty
 hg archive ../test-empty
 
--- a/tests/test-archive.out
+++ b/tests/test-archive.out
@@ -34,11 +34,12 @@ Archive:  test.zip
     testing: test/baz/bletch          OK
     testing: test/foo                 OK
 No errors detected in compressed data of test.zip.
 test-TIP/.hg_archival.txt
 test-TIP/bar
 test-TIP/baz/bletch
 test-TIP/foo
 rev-0.tar created
+abort: unknown archive type 'bogus'
 % server errors
 % empty repo
 abort: repository has no revisions
--- a/tests/test-bheads
+++ b/tests/test-bheads
@@ -1,108 +1,113 @@
 #!/bin/sh
 
+heads()
+{
+    hg heads --template '#rev#: #desc|firstline|strip#\n' "$@"
+}
+
 hg init a
 cd a
 echo 'root' >root
 hg add root
-hg commit -d '0 0' -u test -m "Adding root node"
-hg heads
+hg commit -m "Adding root node"
+heads
 echo '-------'
-hg heads .
+heads .
 
 echo '======='
 echo 'a' >a
 hg add a
 hg branch a
-hg commit -d '1 0' -u test -m "Adding a branch"
-hg heads
+hg commit -m "Adding a branch"
+heads
 echo '-------'
-hg heads .
+heads .
 
 echo '======='
 hg update -C 0
 echo 'b' >b
 hg add b
 hg branch b
-hg commit -d '2 0' -u test -m "Adding b branch"
-hg heads
+hg commit -m "Adding b branch"
+heads
 echo '-------'
-hg heads .
+heads .
 
 echo '======='
 echo 'bh1' >bh1
 hg add bh1
-hg commit -d '3 0' -u test -m "Adding b branch head 1"
-hg heads
+hg commit -m "Adding b branch head 1"
+heads
 echo '-------'
-hg heads .
+heads .
 
 echo '======='
 hg update -C 2
 echo 'bh2' >bh2
 hg add bh2
-hg commit -d '4 0' -u test -m "Adding b branch head 2"
-hg heads
+hg commit -m "Adding b branch head 2"
+heads
 echo '-------'
-hg heads .
+heads .
 
 echo '======='
 hg update -C 2
 echo 'bh3' >bh3
 hg add bh3
-hg commit -d '5 0' -u test -m "Adding b branch head 3"
-hg heads
+hg commit -m "Adding b branch head 3"
+heads
 echo '-------'
-hg heads .
+heads .
 
 echo '======='
 hg merge 4
-hg commit -d '6 0' -u test -m "Merging b branch head 2 and b branch head 3"
-hg heads
+hg commit -m "Merging b branch head 2 and b branch head 3"
+heads
 echo '-------'
-hg heads .
+heads .
 
 echo '======='
 echo 'c' >c
 hg add c
 hg branch c
-hg commit -d '7 0' -u test -m "Adding c branch"
-hg heads
+hg commit -m "Adding c branch"
+heads
 echo '-------'
-hg heads .
+heads .
 
 echo '======='
-hg heads -r 3 .
+heads -r 3 .
 echo $?
 echo '-------'
-hg heads -r 2 .
+heads -r 2 .
 echo $?
 echo '-------'
 hg update -C 4
 echo $?
 echo '-------'
-hg heads -r 3 .
+heads -r 3 .
 echo $?
 echo '-------'
-hg heads -r 2 .
+heads -r 2 .
 echo $?
 echo '-------'
-hg heads -r 7 .
+heads -r 7 .
 echo $?
 
 echo '======='
 for i in 0 1 2 3 4 5 6 7; do
     hg update -C "$i"
-    hg heads
+    heads
     echo '-------'
-    hg heads .
+    heads .
     echo '-------'
 done
 
 echo '======='
 for i in a b c z; do
-    hg heads "$i"
+    heads "$i"
     echo '-------'
 done
 
 echo '======='
-hg heads 0 1 2 3 4 5 6 7
+heads 0 1 2 3 4 5 6 7
--- a/tests/test-bheads.out
+++ b/tests/test-bheads.out
@@ -1,608 +1,151 @@
-changeset:   0:19709c5a4e75
-tag:         tip
-user:        test
-date:        Thu Jan 01 00:00:00 1970 +0000
-summary:     Adding root node
-
+0: Adding root node
 -------
-changeset:   0:19709c5a4e75
-tag:         tip
-user:        test
-date:        Thu Jan 01 00:00:00 1970 +0000
-summary:     Adding root node
-
+0: Adding root node
 =======
 marked working directory as branch a
-changeset:   1:dd6b440dd85a
-branch:      a
-tag:         tip
-user:        test
-date:        Thu Jan 01 00:00:01 1970 +0000
-summary:     Adding a branch
-
+1: Adding a branch
 -------
-changeset:   1:dd6b440dd85a
-branch:      a
-tag:         tip
-user:        test
-date:        Thu Jan 01 00:00:01 1970 +0000
-summary:     Adding a branch
-
+1: Adding a branch
 =======
 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
 marked working directory as branch b
-changeset:   2:ac22033332d1
-branch:      b
-tag:         tip
-parent:      0:19709c5a4e75
-user:        test
-date:        Thu Jan 01 00:00:02 1970 +0000
-summary:     Adding b branch
-
-changeset:   1:dd6b440dd85a
-branch:      a
-user:        test
-date:        Thu Jan 01 00:00:01 1970 +0000
-summary:     Adding a branch
-
+2: Adding b branch
+1: Adding a branch
 -------
-changeset:   2:ac22033332d1
-branch:      b
-tag:         tip
-parent:      0:19709c5a4e75
-user:        test
-date:        Thu Jan 01 00:00:02 1970 +0000
-summary:     Adding b branch
-
+2: Adding b branch
 =======
-changeset:   3:aee39cd168d0
-branch:      b
-tag:         tip
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
-changeset:   1:dd6b440dd85a
-branch:      a
-user:        test
-date:        Thu Jan 01 00:00:01 1970 +0000
-summary:     Adding a branch
-
+3: Adding b branch head 1
+1: Adding a branch
 -------
-changeset:   3:aee39cd168d0
-branch:      b
-tag:         tip
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
+3: Adding b branch head 1
 =======
 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-changeset:   4:22df7444f7c1
-branch:      b
-tag:         tip
-parent:      2:ac22033332d1
-user:        test
-date:        Thu Jan 01 00:00:04 1970 +0000
-summary:     Adding b branch head 2
-
-changeset:   3:aee39cd168d0
-branch:      b
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
-changeset:   1:dd6b440dd85a
-branch:      a
-user:        test
-date:        Thu Jan 01 00:00:01 1970 +0000
-summary:     Adding a branch
-
+4: Adding b branch head 2
+3: Adding b branch head 1
+1: Adding a branch
 -------
-changeset:   4:22df7444f7c1
-branch:      b
-tag:         tip
-parent:      2:ac22033332d1
-user:        test
-date:        Thu Jan 01 00:00:04 1970 +0000
-summary:     Adding b branch head 2
-
-changeset:   3:aee39cd168d0
-branch:      b
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
+4: Adding b branch head 2
+3: Adding b branch head 1
 =======
 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-changeset:   5:0d57af4f9583
-branch:      b
-tag:         tip
-parent:      2:ac22033332d1
-user:        test
-date:        Thu Jan 01 00:00:05 1970 +0000
-summary:     Adding b branch head 3
-
-changeset:   4:22df7444f7c1
-branch:      b
-parent:      2:ac22033332d1
-user:        test
-date:        Thu Jan 01 00:00:04 1970 +0000
-summary:     Adding b branch head 2
-
-changeset:   3:aee39cd168d0
-branch:      b
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
-changeset:   1:dd6b440dd85a
-branch:      a
-user:        test
-date:        Thu Jan 01 00:00:01 1970 +0000
-summary:     Adding a branch
-
+5: Adding b branch head 3
+4: Adding b branch head 2
+3: Adding b branch head 1
+1: Adding a branch
 -------
-changeset:   5:0d57af4f9583
-branch:      b
-tag:         tip
-parent:      2:ac22033332d1
-user:        test
-date:        Thu Jan 01 00:00:05 1970 +0000
-summary:     Adding b branch head 3
-
-changeset:   4:22df7444f7c1
-branch:      b
-parent:      2:ac22033332d1
-user:        test
-date:        Thu Jan 01 00:00:04 1970 +0000
-summary:     Adding b branch head 2
-
-changeset:   3:aee39cd168d0
-branch:      b
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
+5: Adding b branch head 3
+4: Adding b branch head 2
+3: Adding b branch head 1
 =======
 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
 (branch merge, don't forget to commit)
-changeset:   6:00432327d822
-branch:      b
-tag:         tip
-parent:      5:0d57af4f9583
-parent:      4:22df7444f7c1
-user:        test
-date:        Thu Jan 01 00:00:06 1970 +0000
-summary:     Merging b branch head 2 and b branch head 3
-
-changeset:   3:aee39cd168d0
-branch:      b
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
-changeset:   1:dd6b440dd85a
-branch:      a
-user:        test
-date:        Thu Jan 01 00:00:01 1970 +0000
-summary:     Adding a branch
-
+6: Merging b branch head 2 and b branch head 3
+3: Adding b branch head 1
+1: Adding a branch
 -------
-changeset:   6:00432327d822
-branch:      b
-tag:         tip
-parent:      5:0d57af4f9583
-parent:      4:22df7444f7c1
-user:        test
-date:        Thu Jan 01 00:00:06 1970 +0000
-summary:     Merging b branch head 2 and b branch head 3
-
-changeset:   3:aee39cd168d0
-branch:      b
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
+6: Merging b branch head 2 and b branch head 3
+3: Adding b branch head 1
 =======
 marked working directory as branch c
-changeset:   7:9fb091bb9835
-branch:      c
-tag:         tip
-user:        test
-date:        Thu Jan 01 00:00:07 1970 +0000
-summary:     Adding c branch
-
-changeset:   3:aee39cd168d0
-branch:      b
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
-changeset:   1:dd6b440dd85a
-branch:      a
-user:        test
-date:        Thu Jan 01 00:00:01 1970 +0000
-summary:     Adding a branch
-
+7: Adding c branch
+3: Adding b branch head 1
+1: Adding a branch
 -------
-changeset:   7:9fb091bb9835
-branch:      c
-tag:         tip
-user:        test
-date:        Thu Jan 01 00:00:07 1970 +0000
-summary:     Adding c branch
-
+7: Adding c branch
 =======
 no changes on branch c containing . are reachable from 3
 1
 -------
-changeset:   7:9fb091bb9835
-branch:      c
-tag:         tip
-user:        test
-date:        Thu Jan 01 00:00:07 1970 +0000
-summary:     Adding c branch
-
+7: Adding c branch
 0
 -------
 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
 0
 -------
-changeset:   3:aee39cd168d0
-branch:      b
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
+3: Adding b branch head 1
 0
 -------
-changeset:   3:aee39cd168d0
-branch:      b
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
-changeset:   6:00432327d822
-branch:      b
-parent:      5:0d57af4f9583
-parent:      4:22df7444f7c1
-user:        test
-date:        Thu Jan 01 00:00:06 1970 +0000
-summary:     Merging b branch head 2 and b branch head 3
-
+3: Adding b branch head 1
+6: Merging b branch head 2 and b branch head 3
 0
 -------
 no changes on branch b containing . are reachable from 7
 1
 =======
 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
-changeset:   7:9fb091bb9835
-branch:      c
-tag:         tip
-user:        test
-date:        Thu Jan 01 00:00:07 1970 +0000
-summary:     Adding c branch
-
-changeset:   3:aee39cd168d0
-branch:      b
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
-changeset:   1:dd6b440dd85a
-branch:      a
-user:        test
-date:        Thu Jan 01 00:00:01 1970 +0000
-summary:     Adding a branch
-
+7: Adding c branch
+3: Adding b branch head 1
+1: Adding a branch
 -------
-changeset:   0:19709c5a4e75
-user:        test
-date:        Thu Jan 01 00:00:00 1970 +0000
-summary:     Adding root node
-
+0: Adding root node
 -------
 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-changeset:   7:9fb091bb9835
-branch:      c
-tag:         tip
-user:        test
-date:        Thu Jan 01 00:00:07 1970 +0000
-summary:     Adding c branch
-
-changeset:   3:aee39cd168d0
-branch:      b
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
-changeset:   1:dd6b440dd85a
-branch:      a
-user:        test
-date:        Thu Jan 01 00:00:01 1970 +0000
-summary:     Adding a branch
-
+7: Adding c branch
+3: Adding b branch head 1
+1: Adding a branch
 -------
-changeset:   1:dd6b440dd85a
-branch:      a
-user:        test
-date:        Thu Jan 01 00:00:01 1970 +0000
-summary:     Adding a branch
-
+1: Adding a branch
 -------
 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
-changeset:   7:9fb091bb9835
-branch:      c
-tag:         tip
-user:        test
-date:        Thu Jan 01 00:00:07 1970 +0000
-summary:     Adding c branch
-
-changeset:   3:aee39cd168d0
-branch:      b
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
-changeset:   1:dd6b440dd85a
-branch:      a
-user:        test
-date:        Thu Jan 01 00:00:01 1970 +0000
-summary:     Adding a branch
-
+7: Adding c branch
+3: Adding b branch head 1
+1: Adding a branch
 -------
-changeset:   6:00432327d822
-branch:      b
-parent:      5:0d57af4f9583
-parent:      4:22df7444f7c1
-user:        test
-date:        Thu Jan 01 00:00:06 1970 +0000
-summary:     Merging b branch head 2 and b branch head 3
-
-changeset:   3:aee39cd168d0
-branch:      b
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
+6: Merging b branch head 2 and b branch head 3
+3: Adding b branch head 1
 -------
 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-changeset:   7:9fb091bb9835
-branch:      c
-tag:         tip
-user:        test
-date:        Thu Jan 01 00:00:07 1970 +0000
-summary:     Adding c branch
-
-changeset:   3:aee39cd168d0
-branch:      b
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
-changeset:   1:dd6b440dd85a
-branch:      a
-user:        test
-date:        Thu Jan 01 00:00:01 1970 +0000
-summary:     Adding a branch
-
+7: Adding c branch
+3: Adding b branch head 1
+1: Adding a branch
 -------
-changeset:   6:00432327d822
-branch:      b
-parent:      5:0d57af4f9583
-parent:      4:22df7444f7c1
-user:        test
-date:        Thu Jan 01 00:00:06 1970 +0000
-summary:     Merging b branch head 2 and b branch head 3
-
-changeset:   3:aee39cd168d0
-branch:      b
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
+6: Merging b branch head 2 and b branch head 3
+3: Adding b branch head 1
 -------
 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
-changeset:   7:9fb091bb9835
-branch:      c
-tag:         tip
-user:        test
-date:        Thu Jan 01 00:00:07 1970 +0000
-summary:     Adding c branch
-
-changeset:   3:aee39cd168d0
-branch:      b
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
-changeset:   1:dd6b440dd85a
-branch:      a
-user:        test
-date:        Thu Jan 01 00:00:01 1970 +0000
-summary:     Adding a branch
-
+7: Adding c branch
+3: Adding b branch head 1
+1: Adding a branch
 -------
-changeset:   6:00432327d822
-branch:      b
-parent:      5:0d57af4f9583
-parent:      4:22df7444f7c1
-user:        test
-date:        Thu Jan 01 00:00:06 1970 +0000
-summary:     Merging b branch head 2 and b branch head 3
-
-changeset:   3:aee39cd168d0
-branch:      b
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
+6: Merging b branch head 2 and b branch head 3
+3: Adding b branch head 1
 -------
 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
-changeset:   7:9fb091bb9835
-branch:      c
-tag:         tip
-user:        test
-date:        Thu Jan 01 00:00:07 1970 +0000
-summary:     Adding c branch
-
-changeset:   3:aee39cd168d0
-branch:      b
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
-changeset:   1:dd6b440dd85a
-branch:      a
-user:        test
-date:        Thu Jan 01 00:00:01 1970 +0000
-summary:     Adding a branch
-
+7: Adding c branch
+3: Adding b branch head 1
+1: Adding a branch
 -------
-changeset:   6:00432327d822
-branch:      b
-parent:      5:0d57af4f9583
-parent:      4:22df7444f7c1
-user:        test
-date:        Thu Jan 01 00:00:06 1970 +0000
-summary:     Merging b branch head 2 and b branch head 3
-
-changeset:   3:aee39cd168d0
-branch:      b
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
+6: Merging b branch head 2 and b branch head 3
+3: Adding b branch head 1
 -------
 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-changeset:   7:9fb091bb9835
-branch:      c
-tag:         tip
-user:        test
-date:        Thu Jan 01 00:00:07 1970 +0000
-summary:     Adding c branch
-
-changeset:   3:aee39cd168d0
-branch:      b
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
-changeset:   1:dd6b440dd85a
-branch:      a
-user:        test
-date:        Thu Jan 01 00:00:01 1970 +0000
-summary:     Adding a branch
-
+7: Adding c branch
+3: Adding b branch head 1
+1: Adding a branch
 -------
-changeset:   6:00432327d822
-branch:      b
-parent:      5:0d57af4f9583
-parent:      4:22df7444f7c1
-user:        test
-date:        Thu Jan 01 00:00:06 1970 +0000
-summary:     Merging b branch head 2 and b branch head 3
-
-changeset:   3:aee39cd168d0
-branch:      b
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
+6: Merging b branch head 2 and b branch head 3
+3: Adding b branch head 1
 -------
 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-changeset:   7:9fb091bb9835
-branch:      c
-tag:         tip
-user:        test
-date:        Thu Jan 01 00:00:07 1970 +0000
-summary:     Adding c branch
-
-changeset:   3:aee39cd168d0
-branch:      b
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
-changeset:   1:dd6b440dd85a
-branch:      a
-user:        test
-date:        Thu Jan 01 00:00:01 1970 +0000
-summary:     Adding a branch
-
+7: Adding c branch
+3: Adding b branch head 1
+1: Adding a branch
 -------
-changeset:   7:9fb091bb9835
-branch:      c
-tag:         tip
-user:        test
-date:        Thu Jan 01 00:00:07 1970 +0000
-summary:     Adding c branch
-
+7: Adding c branch
 -------
 =======
-changeset:   1:dd6b440dd85a
-branch:      a
-user:        test
-date:        Thu Jan 01 00:00:01 1970 +0000
-summary:     Adding a branch
-
+1: Adding a branch
 -------
-changeset:   6:00432327d822
-branch:      b
-parent:      5:0d57af4f9583
-parent:      4:22df7444f7c1
-user:        test
-date:        Thu Jan 01 00:00:06 1970 +0000
-summary:     Merging b branch head 2 and b branch head 3
-
-changeset:   3:aee39cd168d0
-branch:      b
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
+6: Merging b branch head 2 and b branch head 3
+3: Adding b branch head 1
 -------
-changeset:   7:9fb091bb9835
-branch:      c
-tag:         tip
-user:        test
-date:        Thu Jan 01 00:00:07 1970 +0000
-summary:     Adding c branch
-
+7: Adding c branch
 -------
 abort: unknown revision 'z'!
 -------
 =======
-changeset:   0:19709c5a4e75
-user:        test
-date:        Thu Jan 01 00:00:00 1970 +0000
-summary:     Adding root node
-
-changeset:   1:dd6b440dd85a
-branch:      a
-user:        test
-date:        Thu Jan 01 00:00:01 1970 +0000
-summary:     Adding a branch
-
-changeset:   6:00432327d822
-branch:      b
-parent:      5:0d57af4f9583
-parent:      4:22df7444f7c1
-user:        test
-date:        Thu Jan 01 00:00:06 1970 +0000
-summary:     Merging b branch head 2 and b branch head 3
-
-changeset:   3:aee39cd168d0
-branch:      b
-user:        test
-date:        Thu Jan 01 00:00:03 1970 +0000
-summary:     Adding b branch head 1
-
-changeset:   7:9fb091bb9835
-branch:      c
-tag:         tip
-user:        test
-date:        Thu Jan 01 00:00:07 1970 +0000
-summary:     Adding c branch
-
+0: Adding root node
+1: Adding a branch
+6: Merging b branch head 2 and b branch head 3
+3: Adding b branch head 1
+7: Adding c branch
--- a/tests/test-branches
+++ b/tests/test-branches
@@ -29,8 +29,14 @@ hg commit -d '4 0' -u test -m "Adding b 
 echo 'c' >c
 hg add c
 hg branch c
 hg commit -d '5 0' -u test -m "Adding c branch"
 
 hg branches
 echo '-------'
 hg branches -a
+
+echo "--- Branch a"
+hg log -b a
+
+echo "---- Branch b"
+hg log -b b
--- a/tests/test-branches.out
+++ b/tests/test-branches.out
@@ -5,8 +5,36 @@ 0 files updated, 0 files merged, 1 files
 marked working directory as branch c
 c                              5:5ca481e59b8c
 a                              1:dd6b440dd85a
 b                              4:22df7444f7c1 (inactive)
 default                        0:19709c5a4e75 (inactive)
 -------
 c                              5:5ca481e59b8c
 a                              1:dd6b440dd85a
+--- Branch a
+changeset:   1:dd6b440dd85a
+branch:      a
+user:        test
+date:        Thu Jan 01 00:00:01 1970 +0000
+summary:     Adding a branch
+
+---- Branch b
+changeset:   4:22df7444f7c1
+branch:      b
+parent:      2:ac22033332d1
+user:        test
+date:        Thu Jan 01 00:00:04 1970 +0000
+summary:     Adding b branch head 2
+
+changeset:   3:aee39cd168d0
+branch:      b
+user:        test
+date:        Thu Jan 01 00:00:03 1970 +0000
+summary:     Adding b branch head 1
+
+changeset:   2:ac22033332d1
+branch:      b
+parent:      0:19709c5a4e75
+user:        test
+date:        Thu Jan 01 00:00:02 1970 +0000
+summary:     Adding b branch
+
--- a/tests/test-bundle
+++ b/tests/test-bundle
@@ -65,17 +65,24 @@ cd empty
 hg -R bundle://../full.hg log
 
 echo "====== Pull ../full.hg into empty (with hook)"
 echo '[hooks]' >> .hg/hgrc
 echo 'changegroup = python ../printenv.py changegroup' >> .hg/hgrc
 #doesn't work (yet ?)
 #hg -R bundle://../full.hg verify
 hg pull bundle://../full.hg
+echo "====== Rollback empty"
+hg rollback
 cd ..
+echo "====== Log -R bundle:empty+full.hg"
+hg -R bundle:empty+full.hg log --template="{rev} "
+echo ""
+echo "====== Pull full.hg into empty again (using -R; with hook)"
+hg -R empty pull full.hg
 
 echo "====== Create partial clones"
 rm -r empty
 hg init empty
 hg clone -r 3 test partial
 hg clone partial partial2
 cd partial
 echo "====== Log -R full.hg in partial"
--- a/tests/test-bundle.out
+++ b/tests/test-bundle.out
@@ -119,16 +119,29 @@ summary:     0.0
 changegroup hook: HG_NODE=5649c9d34dd87d0ecb5fd39672128376e83b22e1 HG_SOURCE=pull HG_URL=bundle:../full.hg 
 pulling from bundle://../full.hg
 requesting all changes
 adding changesets
 adding manifests
 adding file changes
 added 9 changesets with 7 changes to 4 files (+1 heads)
 (run 'hg heads' to see heads, 'hg merge' to merge)
+====== Rollback empty
+rolling back last transaction
+====== Log -R bundle:empty+full.hg
+8 7 6 5 4 3 2 1 0 
+====== Pull full.hg into empty again (using -R; with hook)
+changegroup hook: HG_NODE=5649c9d34dd87d0ecb5fd39672128376e83b22e1 HG_SOURCE=pull HG_URL=bundle:empty+full.hg 
+pulling from full.hg
+requesting all changes
+adding changesets
+adding manifests
+adding file changes
+added 9 changesets with 7 changes to 4 files (+1 heads)
+(run 'hg heads' to see heads, 'hg merge' to merge)
 ====== Create partial clones
 requesting all changes
 adding changesets
 adding manifests
 adding file changes
 added 4 changesets with 4 changes to 1 files
 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
--- a/tests/test-cat
+++ b/tests/test-cat
@@ -3,16 +3,17 @@
 mkdir t
 cd t
 hg init
 echo 0 > a
 echo 0 > b
 hg ci -A -m m -d "1000000 0"
 hg rm a
 hg cat a
+hg cat --decode a # more tests in test-encode
 sleep 1 # make sure mtime is changed
 echo 1 > b
 hg ci -m m -d "1000000 0"
 echo 2 > b
 hg cat -r 0 a
 hg cat -r 0 b
 hg cat -r 1 a
 hg cat -r 1 b
--- a/tests/test-cat.out
+++ b/tests/test-cat.out
@@ -1,7 +1,8 @@
 adding a
 adding b
 0
 0
 0
+0
 a: No such file in rev 03f6b0774996
 1
--- a/tests/test-clone
+++ b/tests/test-clone
@@ -27,9 +27,13 @@ cd a
 hg cat a
 
 # check that we drop the file:// from the path before
 # writing the .hgrc
 cd ../..
 hg clone file://a e
 grep 'file:' e/.hg/hgrc
 
+# check that path aliases are expanded
+hg clone -q -U --config 'paths.foobar=a#0' foobar f
+hg -R f showconfig paths.default | sed -e 's,.*/,,'
+
 exit 0
--- a/tests/test-clone.out
+++ b/tests/test-clone.out
@@ -10,8 +10,9 @@ checking changesets
 checking manifests
 crosschecking files in changesets and manifests
 checking files
 1 files, 1 changesets, 1 total revisions
 destination directory: a
 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
 a
 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+a#0
--- a/tests/test-commit
+++ b/tests/test-commit
@@ -1,60 +1,56 @@
 #!/bin/sh
 
-cleanpath()
-{
-    sed -e "s:/.*\(/test/.*\):...\1:"
-}
-
 echo % commit date test
 hg init test
 cd test
 echo foo > foo
 hg add foo
 HGEDITOR=true hg commit -m ""
 hg commit -d '0 0' -m commit-1
 echo foo >> foo
 hg commit -d '1 4444444' -m commit-3
 hg commit -d '1	15.1' -m commit-4
 hg commit -d 'foo bar' -m commit-5
 hg commit -d ' 1 4444' -m commit-6
 hg commit -d '111111111111 0' -m commit-7
 
-echo % partial commit test
+echo % commit added file that has been deleted
 echo bar > bar
 hg add bar
 rm bar
-hg commit -d "1000000 0" -m commit-8 2>&1 | cleanpath
+hg commit -d "1000000 0" -m commit-8
+hg commit -d "1000000 0" -m commit-8-2 bar
 
 hg -q revert -a --no-backup
 
 mkdir dir
 echo boo > dir/file
 hg add
 hg -v commit -d '0 0' -m commit-9 dir
 
 echo > dir.file
 hg add
-hg commit -d '0 0' -m commit-10 dir dir.file 2>&1 | cleanpath
+hg commit -d '0 0' -m commit-10 dir dir.file
 
 echo >> dir/file
 mkdir bleh
 mkdir dir2
 cd bleh
-hg commit -d '0 0' -m commit-11 . 2>&1 | cleanpath
-hg commit -d '0 0' -m commit-12 ../dir ../dir2 2>&1 | cleanpath
+hg commit -d '0 0' -m commit-11 .
+hg commit -d '0 0' -m commit-12 ../dir ../dir2
 hg -v commit -d '0 0' -m commit-13 ../dir
 cd ..
 
-hg commit -d '0 0' -m commit-14 does-not-exist 2>&1 | cleanpath
+hg commit -d '0 0' -m commit-14 does-not-exist
 ln -s foo baz
-hg commit -d '0 0' -m commit-15 baz 2>&1 | cleanpath
+hg commit -d '0 0' -m commit-15 baz
 touch quux
-hg commit -d '0 0' -m commit-16 quux 2>&1 | cleanpath
+hg commit -d '0 0' -m commit-16 quux
 echo >> dir/file
 hg -v commit -d '0 0' -m commit-17 dir/file
 cd ..
 
 echo % partial subdir commit test
 hg init test2
 cd test2
 mkdir foo
--- a/tests/test-commit.out
+++ b/tests/test-commit.out
@@ -1,36 +1,30 @@
 % commit date test
 transaction abort!
 rollback completed
 abort: empty commit message
-transaction abort!
-rollback completed
 abort: impossible time zone offset: 4444444
-transaction abort!
-rollback completed
 abort: invalid date: '1\t15.1' 
-transaction abort!
-rollback completed
 abort: invalid date: 'foo bar' 
+abort: date exceeds 32 bits: 111111111111
+% commit added file that has been deleted
 nothing changed
-% partial commit test
-trouble committing bar!
-abort: No such file or directory: .../test/bar
+abort: file bar not found!
 adding dir/file
 dir/file
 adding dir.file
-abort: no match under directory .../test/dir!
-abort: no match under directory .../test/bleh!
-abort: no match under directory .../test/dir2!
+abort: no match under directory dir!
+abort: no match under directory .!
+abort: no match under directory ../dir2!
 dir/file
 does-not-exist: No such file or directory
-abort: file .../test/does-not-exist not found!
-abort: file .../test/baz not tracked!
-abort: file .../test/quux not tracked!
+abort: file does-not-exist not found!
+abort: file baz not tracked!
+abort: file quux not tracked!
 dir/file
 % partial subdir commit test
 adding bar/bar
 adding foo/foo
 % subdir log 1
 changeset:   0:6ef3cb06bb80
 user:        test
 date:        Mon Jan 12 13:46:40 1970 +0000
--- a/tests/test-conflict.out
+++ b/tests/test-conflict.out
@@ -1,15 +1,16 @@
 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+merging a
 warning: conflicts during merge.
-merging a
 merging a failed!
 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
 There are unresolved merges, you can redo the full merge using:
   hg update -C 2
   hg merge 1
 e7fe8eb3e180+0d24b7662d3e+ tip
-<<<<<<< my
+<<<<<<< local
 something else
 =======
 something
 >>>>>>> other
 M a
+? a.orig
new file mode 100755
--- /dev/null
+++ b/tests/test-convert-baz
@@ -0,0 +1,72 @@
+#!/bin/sh
+
+"$TESTDIR/hghave" baz || exit 80
+
+mkdir do_not_use_HOME_baz
+cd do_not_use_HOME_baz
+HOME=`pwd`; export HOME
+cd ..
+baz my-id "mercurial <mercurial@selenic.com>"
+
+echo "[extensions]" >> $HGRCPATH
+echo "convert=" >> $HGRCPATH
+echo 'hgext.graphlog =' >> $HGRCPATH
+
+echo % create baz archive
+baz make-archive baz@mercurial--convert hg-test-convert-baz
+
+echo % initialize baz repo
+mkdir baz-repo
+cd baz-repo/
+baz init-tree baz@mercurial--convert/baz--test--0
+baz import
+
+echo % create initial files
+echo 'this is a file' > a
+baz add a
+mkdir src
+baz add src
+cd src
+dd count=1 if=/dev/zero of=b > /dev/null 2> /dev/null
+baz add b
+baz commit -s "added a file, src and src/b (binary)"
+
+echo % create link file and modify a
+ln -s ../a a-link
+baz add a-link
+echo 'this a modification to a' >> ../a
+baz commit -s "added link to a and modify a"
+
+echo % create second link and modify b
+ln -s ../a a-link-2
+baz add a-link-2
+dd count=1 seek=1 if=/dev/zero of=b > /dev/null 2> /dev/null
+baz commit -s "added second link and modify b"
+
+echo % b file to link and a-link-2 to regular file
+rm -f a-link-2
+echo 'this is now a regular file' > a-link-2
+ln -sf ../a b
+baz commit -s "file to link and link to file test"
+
+echo % move a-link-2 file and src directory
+cd ..
+baz mv src/a-link-2 c
+baz mv src test
+baz commit -s "move and rename a-link-2 file and src directory"
+
+cd ..
+
+echo % converting baz repo to Mercurial
+hg convert baz-repo baz-repo-hg
+
+baz register-archive -d baz@mercurial--convert
+
+glog()
+{
+    hg glog --template '#rev# "#desc|firstline#" files: #files#\n' "$@"
+}
+
+echo % show graph log
+glog -R baz-repo-hg
+hg -R baz-repo-hg manifest --debug
new file mode 100644
--- /dev/null
+++ b/tests/test-convert-baz.out
@@ -0,0 +1,75 @@
+% create baz archive
+% initialize baz repo
+* creating version baz@mercurial--convert/baz--test--0
+* imported baz@mercurial--convert/baz--test--0
+% create initial files
+* build pristine tree for baz@mercurial--convert/baz--test--0--base-0
+* Scanning for full-tree revision: .
+* from import revision: baz@mercurial--convert/baz--test--0--base-0
+A/ .arch-ids
+A/ src
+A/ src/.arch-ids
+A  .arch-ids/a.id
+A  a
+A  src/.arch-ids/=id
+A  src/.arch-ids/b.id
+A  src/b
+* update pristine tree (baz@mercurial--convert/baz--test--0--base-0 => baz--test--0--patch-1)
+* committed baz@mercurial--convert/baz--test--0--patch-1
+% create link file and modify a
+A  src/.arch-ids/a-link.id
+A  src/a-link
+M  a
+* update pristine tree (baz@mercurial--convert/baz--test--0--patch-1 => baz--test--0--patch-2)
+* committed baz@mercurial--convert/baz--test--0--patch-2
+% create second link and modify b
+A  src/.arch-ids/a-link-2.id
+A  src/a-link-2
+Mb src/b
+* update pristine tree (baz@mercurial--convert/baz--test--0--patch-2 => baz--test--0--patch-3)
+* committed baz@mercurial--convert/baz--test--0--patch-3
+% b file to link and a-link-2 to regular file
+fl src/b
+lf src/a-link-2
+* update pristine tree (baz@mercurial--convert/baz--test--0--patch-3 => baz--test--0--patch-4)
+* committed baz@mercurial--convert/baz--test--0--patch-4
+% move a-link-2 file and src directory
+D/ src/.arch-ids
+A/ test/.arch-ids
+/> src	test
+=> src/.arch-ids/a-link-2.id	.arch-ids/c.id
+=> src/a-link-2	c
+=> src/.arch-ids/=id	test/.arch-ids/=id
+=> src/.arch-ids/a-link.id	test/.arch-ids/a-link.id
+=> src/.arch-ids/b.id	test/.arch-ids/b.id
+* update pristine tree (baz@mercurial--convert/baz--test--0--patch-4 => baz--test--0--patch-5)
+* committed baz@mercurial--convert/baz--test--0--patch-5
+% converting baz repo to Mercurial
+initializing destination baz-repo-hg repository
+analyzing tree version baz@mercurial--convert/baz--test--0...
+scanning source...
+sorting...
+converting...
+5 initial import
+4 added a file, src and src/b (binary)
+3 added link to a and modify a
+2 added second link and modify b
+1 file to link and link to file test
+0 move and rename a-link-2 file and src directory
+% show graph log
+o  5 "move and rename a-link-2 file and src directory" files: c src/a-link src/a-link-2 src/b test/a-link test/b
+|
+o  4 "file to link and link to file test" files: src/a-link-2 src/b
+|
+o  3 "added second link and modify b" files: src/a-link-2 src/b
+|
+o  2 "added link to a and modify a" files: a src/a-link
+|
+o  1 "added a file, src and src/b (binary)" files: a src/b
+|
+o  0 "initial import" files:
+
+c4072c4b72e1cabace081888efa148ee80ca3cbb 644   a
+e3207be798aaf87a444a62903621edab4ddc1fb6 644   c
+1f6b5bb93f1da278ef1fead1e4740a03d8802e9f 644 @ test/a-link
+1f6b5bb93f1da278ef1fead1e4740a03d8802e9f 644 @ test/b
--- a/tests/test-convert-clonebranches.out
+++ b/tests/test-convert-clonebranches.out
@@ -11,19 +11,19 @@ 0 mergeab
 pulling from default into branch0
 1 changesets found
 marked working directory as branch branch1
 marked working directory as branch branch2
 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
 (branch merge, don't forget to commit)
 marked working directory as branch branch3
 % incremental conversion
-2 c1
-pulling from branch0 into branch1
+2 c2
+pulling from branch0 into branch2
 2 changesets found
-1 c2
-pulling from branch0 into branch2
+1 c1
+pulling from branch0 into branch1
 2 changesets found
 0 c3
 pulling from branch2 into branch3
 3 changesets found
 pulling from branch1 into branch3
 1 changesets found
new file mode 100755
--- /dev/null
+++ b/tests/test-convert-datesort
@@ -0,0 +1,40 @@
+#!/bin/sh
+
+cat >> $HGRCPATH <<EOF
+[extensions]
+convert=
+graphlog=
+EOF
+
+hg init t
+cd t
+echo a >> a
+hg ci -Am a0 -d '1 0'
+hg branch brancha
+echo a >> a
+hg ci -m a1 -d '2 0'
+echo a >> a
+hg ci -m a2 -d '3 0'
+echo a >> a
+hg ci -m a3 -d '4 0'
+hg up -C 0
+hg branch branchb
+echo b >> b
+hg ci -Am b0 -d '5 0'
+hg up -C brancha
+echo a >> a
+hg ci -m a4 -d '6 0'
+echo a >> a
+hg ci -m a5 -d '7 0'
+echo a >> a
+hg ci -m a6 -d '8 0'
+hg up -C branchb
+echo b >> b
+hg ci -m b1 -d '9 0'
+cd ..
+
+echo % convert with datesort
+hg convert --datesort t t2
+echo % graph converted repo
+hg -R t2 glog --template '#rev# "#desc#"\n'
+
new file mode 100644
--- /dev/null
+++ b/tests/test-convert-datesort.out
@@ -0,0 +1,40 @@
+adding a
+marked working directory as branch brancha
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+marked working directory as branch branchb
+adding b
+1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+% convert with datesort
+initializing destination t2 repository
+scanning source...
+sorting...
+converting...
+8 a0
+7 a1
+6 a2
+5 a3
+4 b0
+3 a4
+2 a5
+1 a6
+0 b1
+% graph converted repo
+o  8 "b1"
+|
+| o  7 "a6"
+| |
+| o  6 "a5"
+| |
+| o  5 "a4"
+| |
+o |  4 "b0"
+| |
+| o  3 "a3"
+| |
+| o  2 "a2"
+| |
+| o  1 "a1"
+|/
+o  0 "a0"
+
--- a/tests/test-convert-svn-sink.out
+++ b/tests/test-convert-svn-sink.out
@@ -255,18 +255,18 @@ At revision 2.
 % branchy history
 adding b
 adding left-1
 adding left-2
 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
 adding right-1
 adding right-2
 3 files updated, 0 files merged, 2 files removed, 0 files unresolved
+merging b
 warning: conflicts during merge.
-merging b
 merging b failed!
 2 files updated, 0 files merged, 0 files removed, 1 files unresolved
 There are unresolved merges, you can redo the full merge using:
   hg update -C 2
   hg merge 4
 assuming destination b-hg
 initializing svn repo 'b-hg'
 initializing svn wc 'b-hg-wc'
new file mode 100755
--- /dev/null
+++ b/tests/test-convert-tla
@@ -0,0 +1,72 @@
+#!/bin/sh
+
+"$TESTDIR/hghave" tla || exit 80
+
+mkdir do_not_use_HOME_tla
+cd do_not_use_HOME_tla
+HOME=`pwd`; export HOME
+cd ..
+tla my-id "mercurial <mercurial@selenic.com>"
+
+echo "[extensions]" >> $HGRCPATH
+echo "convert=" >> $HGRCPATH
+echo 'hgext.graphlog =' >> $HGRCPATH
+
+echo % create tla archive
+tla make-archive tla@mercurial--convert `pwd`/hg-test-convert-tla
+
+echo % initialize tla repo
+mkdir tla-repo
+cd tla-repo/
+tla init-tree tla@mercurial--convert/tla--test--0
+tla import
+
+echo % create initial files
+echo 'this is a file' > a
+tla add a
+mkdir src
+tla add src
+cd src
+dd count=1 if=/dev/zero of=b > /dev/null 2> /dev/null
+tla add b
+tla commit -s "added a file, src and src/b (binary)"
+
+echo % create link file and modify a
+ln -s ../a a-link
+tla add a-link
+echo 'this a modification to a' >> ../a
+tla commit -s "added link to a and modify a"
+
+echo % create second link and modify b
+ln -s ../a a-link-2
+tla add a-link-2
+dd count=1 seek=1 if=/dev/zero of=b > /dev/null 2> /dev/null
+tla commit -s "added second link and modify b"
+
+echo % b file to link and a-link-2 to regular file
+rm -f a-link-2
+echo 'this is now a regular file' > a-link-2
+ln -sf ../a b
+tla commit -s "file to link and link to file test"
+
+echo % move a-link-2 file and src directory
+cd ..
+tla mv src/a-link-2 c
+tla mv src test
+tla commit -s "move and rename a-link-2 file and src directory"
+
+cd ..
+
+echo % converting tla repo to Mercurial
+hg convert tla-repo tla-repo-hg
+
+tla register-archive -d tla@mercurial--convert
+
+glog()
+{
+    hg glog --template '#rev# "#desc|firstline#" files: #files#\n' "$@"
+}
+
+echo % show graph log
+glog -R tla-repo-hg
+hg -R tla-repo-hg manifest --debug
new file mode 100644
--- /dev/null
+++ b/tests/test-convert-tla.out
@@ -0,0 +1,72 @@
+% create tla archive
+% initialize tla repo
+* creating version tla@mercurial--convert/tla--test--0
+* imported tla@mercurial--convert/tla--test--0
+% create initial files
+A/ .arch-ids
+A/ src
+A/ src/.arch-ids
+A  .arch-ids/a.id
+A  a
+A  src/.arch-ids/=id
+A  src/.arch-ids/b.id
+A  src/b
+* update pristine tree (tla@mercurial--convert/tla--test--0--base-0 => tla--test--0--patch-1)
+* committed tla@mercurial--convert/tla--test--0--patch-1
+% create link file and modify a
+A  src/.arch-ids/a-link.id
+A  src/a-link
+M  a
+* update pristine tree (tla@mercurial--convert/tla--test--0--patch-1 => tla--test--0--patch-2)
+* committed tla@mercurial--convert/tla--test--0--patch-2
+% create second link and modify b
+A  src/.arch-ids/a-link-2.id
+A  src/a-link-2
+Mb src/b
+* update pristine tree (tla@mercurial--convert/tla--test--0--patch-2 => tla--test--0--patch-3)
+* committed tla@mercurial--convert/tla--test--0--patch-3
+% b file to link and a-link-2 to regular file
+fl src/b
+lf src/a-link-2
+* update pristine tree (tla@mercurial--convert/tla--test--0--patch-3 => tla--test--0--patch-4)
+* committed tla@mercurial--convert/tla--test--0--patch-4
+% move a-link-2 file and src directory
+D/ src/.arch-ids
+A/ test/.arch-ids
+/> src	test
+=> src/.arch-ids/a-link-2.id	.arch-ids/c.id
+=> src/a-link-2	c
+=> src/.arch-ids/=id	test/.arch-ids/=id
+=> src/.arch-ids/a-link.id	test/.arch-ids/a-link.id
+=> src/.arch-ids/b.id	test/.arch-ids/b.id
+* update pristine tree (tla@mercurial--convert/tla--test--0--patch-4 => tla--test--0--patch-5)
+* committed tla@mercurial--convert/tla--test--0--patch-5
+% converting tla repo to Mercurial
+initializing destination tla-repo-hg repository
+analyzing tree version tla@mercurial--convert/tla--test--0...
+scanning source...
+sorting...
+converting...
+5 initial import
+4 added a file, src and src/b (binary)
+3 added link to a and modify a
+2 added second link and modify b
+1 file to link and link to file test
+0 move and rename a-link-2 file and src directory
+% show graph log
+o  5 "move and rename a-link-2 file and src directory" files: c src/a-link src/a-link-2 src/b test/a-link test/b
+|
+o  4 "file to link and link to file test" files: src/a-link-2 src/b
+|
+o  3 "added second link and modify b" files: src/a-link-2 src/b
+|
+o  2 "added link to a and modify a" files: a src/a-link
+|
+o  1 "added a file, src and src/b (binary)" files: a src/b
+|
+o  0 "initial import" files:
+
+c4072c4b72e1cabace081888efa148ee80ca3cbb 644   a
+e3207be798aaf87a444a62903621edab4ddc1fb6 644   c
+1f6b5bb93f1da278ef1fead1e4740a03d8802e9f 644 @ test/a-link
+1f6b5bb93f1da278ef1fead1e4740a03d8802e9f 644 @ test/b
--- a/tests/test-convert.out
+++ b/tests/test-convert.out
@@ -3,16 +3,17 @@ hg convert [OPTION]... SOURCE [DEST [MAP
 Convert a foreign SCM repository to a Mercurial one.
 
     Accepted source formats:
     - Mercurial
     - CVS
     - Darcs
     - git
     - Subversion
+    - GNU Arch
 
     Accepted destination formats:
     - Mercurial
     - Subversion (history on branches is not preserved)
 
     If no revision is given, all revisions will be converted. Otherwise,
     convert will only import up to the named revision (given in a format
     understood by the source).
--- a/tests/test-copy-move-merge.out
+++ b/tests/test-copy-move-merge.out
@@ -9,21 +9,25 @@ resolving manifests
   all copies found (* = to merge, ! = divergent):
    c -> a *
    b -> a *
   checking for directory renames
  a: remote moved to c -> m
  a: remote moved to b -> m
 copying a to b
 copying a to c
+picked tool 'internal:merge' for a (binary False symlink False)
 merging a and b
 my a@fb3948d97f07+ other b@40da226db0f0 ancestor a@583c7b748052
+ premerge successful
 removing a
+picked tool 'internal:merge' for a (binary False symlink False)
 merging a and c
 my a@fb3948d97f07+ other c@40da226db0f0 ancestor a@583c7b748052
+ premerge successful
 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
 (branch merge, don't forget to commit)
 -- b --
 0
 1
 2
 -- c --
 0
new file mode 100755
--- /dev/null
+++ b/tests/test-custom-filters
@@ -0,0 +1,60 @@
+#!/bin/sh
+
+hg init
+
+cat > .hg/hgrc <<EOF
+[extensions]
+prefixfilter = prefix.py
+[encode]
+*.txt = stripprefix: Copyright 2046, The Masters
+[decode]
+*.txt = insertprefix: Copyright 2046, The Masters
+EOF
+
+cat > prefix.py <<EOF
+from mercurial import util
+def stripprefix(s, cmd, filename, **kwargs):
+    header = '%s\n' % cmd
+    if s[:len(header)] != header:
+        raise util.Abort('missing header "%s" in %s' % (cmd, filename))
+    return s[len(header):]
+def insertprefix(s, cmd):
+    return '%s\n%s' % (cmd, s)
+def reposetup(ui, repo):
+    repo.adddatafilter('stripprefix:', stripprefix)
+    repo.adddatafilter('insertprefix:', insertprefix)
+EOF
+
+cat > .hgignore <<EOF
+.hgignore
+prefix.py
+prefix.pyc
+EOF
+
+cat > stuff.txt <<EOF
+Copyright 2046, The Masters
+Some stuff to ponder very carefully.
+EOF
+hg add stuff.txt
+hg ci -m stuff
+
+echo '% Repository data:'
+hg cat stuff.txt
+
+echo '% Fresh checkout:'
+rm stuff.txt
+hg up
+cat stuff.txt
+echo >> stuff.txt <<EOF
+Very very carefully.
+EOF
+hg stat
+
+cat > morestuff.txt <<EOF
+Unauthorized material subject to destruction.
+EOF
+
+echo '% Problem encoding:'
+hg add morestuff.txt
+hg ci -m morestuff
+hg stat
new file mode 100644
--- /dev/null
+++ b/tests/test-custom-filters.out
@@ -0,0 +1,11 @@
+% Repository data:
+Some stuff to ponder very carefully.
+% Fresh checkout:
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+Copyright 2046, The Masters
+Some stuff to ponder very carefully.
+M stuff.txt
+% Problem encoding:
+abort: missing header "Copyright 2046, The Masters" in morestuff.txt
+M stuff.txt
+A morestuff.txt
--- a/tests/test-dispatch.out
+++ b/tests/test-dispatch.out
@@ -16,16 +16,17 @@ output the current or given revision of 
     %s   basename of file being printed
     %d   dirname of file being printed, or '.' if in repo root
     %p   root-relative path name of file being printed
 
 options:
 
  -o --output   print output to file with formatted name
  -r --rev      print the given revision
+    --decode   apply any matching decode filter
  -I --include  include names matching the given patterns
  -X --exclude  exclude names matching the given patterns
 
 use "hg -v help cat" to show global options
 % [defaults]
 a
 a
 % no repo
--- a/tests/test-double-merge.out
+++ b/tests/test-double-merge.out
@@ -5,20 +5,24 @@ resolving manifests
   unmatched files in other:
    bar
   all copies found (* = to merge, ! = divergent):
    bar -> foo *
   checking for directory renames
  foo: versions differ -> m
  foo: remote copied to bar -> m
 copying foo to bar
+picked tool 'internal:merge' for foo (binary False symlink False)
 merging foo and bar
 my foo@2092631ce82b+ other bar@7731dad1c2b9 ancestor foo@310fd17130da
+ premerge successful
+picked tool 'internal:merge' for foo (binary False symlink False)
 merging foo
 my foo@2092631ce82b+ other foo@7731dad1c2b9 ancestor foo@310fd17130da
+ premerge successful
 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
 (branch merge, don't forget to commit)
 -- foo --
 line 0
 line 1
 line 2-1
 -- bar --
 line 0
--- a/tests/test-encode
+++ b/tests/test-encode
@@ -27,8 +27,16 @@ hg debugdata .hg/store/data/a.gz.d 0
 echo %% uncompress our working dir copy
 gunzip < a.gz
 
 rm a.gz
 hg co
 
 echo %% uncompress our new working dir copy
 gunzip < a.gz
+
+echo %% check hg cat operation
+hg cat a.gz
+hg cat --decode a.gz | gunzip
+mkdir subdir
+cd subdir
+hg -R .. cat ../a.gz
+hg -R .. cat --decode ../a.gz | gunzip
--- a/tests/test-encode.out
+++ b/tests/test-encode.out
@@ -2,8 +2,13 @@
 %% no changes
 %% uncompressed contents in repo
 this is a test
 %% uncompress our working dir copy
 this is a test
 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
 %% uncompress our new working dir copy
 this is a test
+%% check hg cat operation
+this is a test
+this is a test
+this is a test
+this is a test
--- a/tests/test-grep.out
+++ b/tests/test-grep.out
@@ -1,10 +1,10 @@
 % pattern error
-grep: invalid match pattern: nothing to repeat!
+grep: invalid match pattern: nothing to repeat
 % simple
 port:4:export
 port:4:vaportight
 port:4:import/export
 % all
 port:4:4:-:spam:import/export
 port:3:4:+:eggs:import/export
 port:2:1:-:spam:import
--- a/tests/test-help.out
+++ b/tests/test-help.out
@@ -200,46 +200,49 @@ options:
  -r --rev                  revision
  -a --text                 treat all files as text
  -p --show-function        show which function each change is in
  -g --git                  use git extended diff format
     --nodates              don't include dates in diff headers
  -w --ignore-all-space     ignore white space when comparing lines
  -b --ignore-space-change  ignore changes in the amount of white space
  -B --ignore-blank-lines   ignore changes whose lines are all blank
+ -U --unified              number of lines of context to show (default: 3)
  -I --include              include names matching the given patterns
  -X --exclude              exclude names matching the given patterns
 
 use "hg -v help diff" to show global options
 hg status [OPTION]... [FILE]...
 
 aliases: st
 
 show changed files in the working directory
 
     Show status of files in the repository.  If names are given, only
-    files that match are shown.  Files that are clean or ignored, are
-    not listed unless -c (clean), -i (ignored) or -A is given.
+    files that match are shown.  Files that are clean or ignored or
+    source of a copy/move operation, are not listed unless -c (clean),
+    -i (ignored), -C (copies) or -A is given.  Unless options described
+    with "show only ..." are given, the options -mardu are used.
 
     NOTE: status may appear to disagree with diff if permissions have
     changed or a merge has occurred. The standard diff format does not
     report permission changes and diff only reports changes relative
     to one merge parent.
 
     If one revision is given, it is used as the base revision.
     If two revisions are given, the difference between them is shown.
 
     The codes used to show the status of files are:
     M = modified
     A = added
     R = removed
     C = clean
     ! = deleted, but still tracked
     ? = not tracked
-    I = ignored (not shown by default)
+    I = ignored
       = the previous added file was copied from here
 
 options:
 
  -A --all        show status of all files
  -m --modified   show only modified files
  -a --added      show only added files
  -r --removed    show only removed files
index 326d8df07cad7af2196b263febeb5b826bf1fdc8..431f26721ea7a39e409c35780b552486ef6e1081
GIT binary patch
literal 14908
zc%1E9dvn`163_j4n)?u2dfZn`k(A|!WLZt?_|o3ANhfyZ9{=P(5|TKfNDc^DcGG^7
z`>?kQ@GVM~+$7Vxv7$&Mu-FB57rQ?!<$bu~5*7)_83)0WxWjxuh^F8(YZ4cCbh!^d
z#?us7<byY3(Uhm1o^8XGCxS#mypYL4B4HTD%e2!OeRDex;f9Meh@*4E>DmVH$cu^H
zxxrE|2#jyWozaAIACNRk&yAUs$<VT#-bvTSe~yLxkF0NHJU7N27=31%aG@lJ@f1vx
z+5&&PGHPUDEB1v!^bXe)o*O9-CkD&}pR@>J$lpYchE*TLLdiwMBwssHkC1^3`B?H)
zma`jKx)r+@iH|(|u`@WaP20iuwQUd8`>FaISvg4u$$2Ej9gfTSe(U?FAjzhHDn#{)
zT={6W9-r9EJLwOY(=R2qD`n1ww-5mft-XSQ$@-H)kNdsD!D-Ls_R+CBI6dn5{K%j1
z)00Eako&~;d8W}!J8QHd_>HwKL!~(wv4xz)f-YecvANdb$WoW8k<VEWjz8aXoZ~b6
zv>p0%j?Q$;$kP49$|`y7q;e!r7H$}%v&{oaA{yewkwi;@yi54GaXXXq(9kpXgPXPP
z><k72t3r&T1t;oZnlKL;;cd#r4L5c$JC4zkEflR)k<E_0&&vI2#j#wL@&`FhRXp!c
zj!xJSJMH!Q$9-lG?4EZ#IhpkPr<1LnW?P1jPIHgbXp?T|5S@`lp?CZk!yjY#V+?<c
z;g2!=kKr``12MeK%klt>&X~}_;eqixAKr}0Lpp)LEJ$T6?mk>#e%wEg`{%y>^V#!P
z7uWy%`4Yar{^>{f`OSAf{%`??X<2_iys)h2*UxoFziT^iEm)KW5_cN9i*@-DXFH-<
z(-&tbsIngdoKU_WtW+`?c-Cx6t=%M=8kvTIIh%5e8gTHOO9o`)b3?>#EK>urRUu*I
z^V<W6Vm)&MteUh`-h~{kz-3dW>gjrEnv0bDR$A)bA{A9PVTz6-tI((&YH2<!Ny5Nm
zqz$#dpQ61CGD;@Dz-*wHof{NjK*b@-l_b&FUV=!|rT}cJ@qc}FwaVVg4CBVW@(6N6
zFJvjYp}UYWj#8pxIZujFjxqL1kjSdtnCy|BJ{ujAAmlY<Wf|i+i-L*Tw~QpS4XbJ{
zX^a=Sg!@NrrD-D4EcKp2m+g&ngBNtDuO9W`{T!GlRZ_9kl(01+doh=XL{A}~32%n#
z(ig*#r8<!)h-i~#uFP)?2>g<~;)e#L!7q4yXe0lK-2_uK{}4v$oP}X-r@Y-5m-@~p
zUJI<o_)GgMS|hX&V&*~11&Qvrlmt=+t;wS0s?EUMkmqt!9Ck^O1QI3!d1tHaD0L{6
zeolrPSlRjx?r?!<Ht9DhR0KA%AimNa#eQvVO_06|(q!XI0DcKtnOf2Ko|QSDaAkFa
z>2SVo*1I`kZ#PHm{ec~^7N>AfTn$oL`dluTT?Ab`3cRit&nrNNh=chQQsGr|5Ao5t
zXBqf%c7AdMGagK5@_b-}8w;O{a~m)UpBn`)Txu<5SUQekm{4hNQ)cb#!S^pJj+!v(
z&9LzeW^xs4@cKDw6Kt^Y@+JBT{O}yMJ)Yu_pP3-6u`RahY`cv*9n&<y^3hwPMHv41
zdbWVSu?P?W<md+o5dmT#+wMGl`V?HNJDXBoxR3bRGcfG~ymJm5c=oLGblcg}oI9O;
z_$y`_6Z0jZv`y-#lKv*^kOiLE3V3(uwTadj%Ufa68+_I=#nKcey`g^u*}7}38PiAD
zwH54A$Eh4}eOSCw1RYA!1-RP|(yXSTVz=xHe(LkBQPN>>jG_WMzc#19q9{gn@|Gca
zS98*AX|7I33t`I@{G(K_5l@jQh029R4kPbC?Nn9|&M;3`__;}8)w?3g=^WSDAW3J{
zs*v>uy@KI-c66YtGTR)X;L9@O1DnQQZ6zb&VjiT*hE-8zP*~y8K2@Hoc!7L|6+E#^
zh1FO1p@t$x>bO|lN(G=p>*ZNCh<Fs|+juW@G*-axF`Y=kAp=re%ls!hg#Le|>IdXI
zRK?D@F3&al@ahJS^8sIe>SxR!>RE(}nma#?C`VOK-8%LbHLr9rpEGf%pH`5|7iF=$
zr&AP&baCjX+y&t3;-{=iRH^&?-YOdEy;?-uWx)?9ece-|Lxt>Ko%_^vFLk2Odi%&_
z-2z6@CU1pN|4=xJ!se9}fhQG!f@)-19(H3fwXR?55}ZTBvP&~nW4gZdbI{e;XcY#P
zDxRv{g^cFPBlFFb0o9uif!h=i+XcDp1l-JNAeY=-kKgKbvn#zZKUvw#+Frzi>Soqv
zAex{N-cmOgyCu6^ViB<L*iGs_Hzr}sP?3Ui+?i2EG=-W<IIH#ijUJ?JloucHFl|9b
zu%>R1RRgq=W&vUfbUE!lilYHHEL`AS###ATW!<`N&}5{`2bB_o8kU0ueV{Lra#M>D
zyFq^0wBgql=-yat6~))+S4nG!f*LJloTd`913-;#1xYss)j_^1toD^Es~h9bBR5UX
za?NA~DISJY<5yvgYA*y13Gr2spoWh4e-XWl;$_r;lGKB(ToiPl@158RAUnn9VGlo!
z2|^D}RAawrRHSyVF`%z#PwNAY`y~eN*+ri{P!x)VeOi!c7K4(pqC4(2Q9Df;6(uuF
zTPy?7)d4{(LRbn_6&Opwt16cg>XLHNfOXa1<5L-y)+dzvtg{NC8wJBrFb?BrN@oX5
zz~f>$*sgbKwXFib(=rq{Pg0Hfj@%s%1nw9iRe~xkA-X>D)>>V`B5y`#kUU2De8Lu?
zq%(=SK=_694Q4o?I;Je`WwiRcJo=TYqVSDTBVG!YY&b)<TS}k6;a7OrRxLee#h%Vb
zvuD*RtM=4&;O%VHP&#2FjkSJ{(l<=+9;I&>*{<~JE($5(Wjc>(uVJ?88|(DAX8(4(
z-KK<<fY2HbHspbi83-QgB+AI{ddq$YlQv8Fn{(<%_l3i?zR+U3hx);uG1l?#<L7{f
z#`}6Dt?mP5gudS=9u!-fMa$iMV&|aT;uCqfY(t1BZCQ1LW-V+5fKK9AY8c<%^H!f_
zb)?sRQ3%F^#9LMIT6uhpM+&8kO~l1PXZ&sPXxbIJI-aBFMhR;lJeDvw2m={x{_}(|
zj^8bk3=~X7yhzf8OW<G;xr@k08+`x5v0wb_fWE%dUvFOS1D$F%GT!>})IR7rY+`1^
z7w`Dp7f74$zYigL>jz?BZ~5AqkStWHeA8lX|Kt7p*^?(v{_^Bc`*;WxoXy`N&88s^
za=%iCbfAs3Sy%8L$a77fd$CYQ;b9a<{0x5UbkV!9dpQdvH`Nb}h8hy6PAUVf?^RU=
z3M}b*nk*_Jfy=yiq>0EkaqGrn2z$PIRp^{{I<8)dPFJQ$9@T<}aBL^HXOI&z^*Y0)
zN7AH+*h5f{l({%lKc&(yr3;49B+3ujkm$etG1cwR;d4EyaFLQg6qiYu3eF?dHxHs_
zr{H=mOxD|zg-F6o+u4&E>};9i{WF7nYT5HIK-=QVT6A`-UbO6t!w`Cjr2C9Q8I11L
zL?&z=gm*X<7Ntewl53%E9QtP+l$t;EUoY14yf&GwGO{slh-`>GDpf!GSjYTSz1r5W
zsyO0jeGM1!d>%*ewbh|t(Y=Q`6Vm{RY|<jS69!==tyXg(0U>9i$t%xo7Cm>SUkXtX
z6N4|Y?-oBJDSXqh?S1XEc~`#Mvi_q+x18mEk!wDR1^Py-W883oyPt)5vy77_HxhRM
zwU$XB(%d~)ZQLARrLImP<P)4hwu~T}aooI0p{S*+{AW~E<)j<5lde(EY3Ax>KW6<c
z^rI)YPCZp_UHw>~Y7s4y)^W{hOQ2%=Wp?`>2xgcHzt9{glvW(8aDL@v)q&mY`ffKC
zrSnnNR+V!#r2?hpJbznhTklfs`>TwllgXsj@7iQ^RSr6UmYz!O3TLv$Dzre_Q{V@a
r3DC1JwLaoXEtTcfn?A<sFtJ{~e*Nn86<of&c=hJx_2ui!=biro-@6T_
--- a/tests/test-hgweb.out
+++ b/tests/test-hgweb.out
@@ -38,18 +38,18 @@ 404 Not Found
 An error occurred while processing your request:
 </p>
 <p>
 Not Found
 </p>
 
 
 <div class="logo">
-powered by<br/>
-<a href="http://www.selenic.com/mercurial/">mercurial</a>
+<a href="http://www.selenic.com/mercurial/">
+<img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial"></a>
 </div>
 
 </body>
 </html>
 
 % should give a 404 - bad revision
 404 Not Found
 
--- a/tests/test-import
+++ b/tests/test-import
@@ -120,16 +120,28 @@ EOF
 
 echo '% plain diff in email, [PATCH] subject, message body with subject'
 hg clone -r0 a b
 hg --cwd a diff -r0:1 > tip.patch
 python mkmsg2.py | hg --cwd b import -
 hg --cwd b tip --template '{desc}\n'
 rm -r b
 
+# We weren't backing up the correct dirstate file when importing many patches
+# (issue963)
+echo '% import patch1 patch2; rollback'
+echo line 3 >> a/a
+hg --cwd a ci -m'third change'
+hg --cwd a export -o '../patch%R' 1 2
+hg clone -qr0 a b
+hg --cwd b parents --template 'parent: #rev#\n'
+hg --cwd b import ../patch1 ../patch2
+hg --cwd b rollback
+hg --cwd b parents --template 'parent: #rev#\n'
+rm -r b
 
 # bug non regression test
 # importing a patch in a subdirectory failed at the commit stage
 echo line 2 >> a/d1/d2/a
 hg --cwd a ci -u someoneelse -d '1 0' -m'subdir change'
 echo % hg import in a subdirectory
 hg clone -r0 a b
 hg --cwd a export tip | sed -e 's/d1\/d2\///' > tip.patch
--- a/tests/test-import.out
+++ b/tests/test-import.out
@@ -147,16 +147,22 @@ adding manifests
 adding file changes
 added 1 changesets with 2 changes to 2 files
 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
 applying patch from stdin
 email patch
 
 next line
 ---
+% import patch1 patch2; rollback
+parent: 0
+applying ../patch1
+applying ../patch2
+rolling back last transaction
+parent: 1
 % hg import in a subdirectory
 requesting all changes
 adding changesets
 adding manifests
 adding file changes
 added 1 changesets with 2 changes to 2 files
 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
 applying ../../../tip.patch
new file mode 100755
--- /dev/null
+++ b/tests/test-inherit-mode
@@ -0,0 +1,90 @@
+#!/bin/sh
+
+# test that new files created in .hg inherit the permissions from .hg/store
+
+"$TESTDIR/hghave" unix-permissions || exit 80
+
+mkdir dir
+# just in case somebody has a strange $TMPDIR
+chmod g-s dir
+cd dir
+
+cat >printmodes.py <<EOF
+import os, sys
+
+allnames = []
+isdir = {}
+for root, dirs, files in os.walk(sys.argv[1]):
+    for d in dirs:
+	name = os.path.join(root, d)
+	isdir[name] = 1
+	allnames.append(name)
+    for f in files:
+	name = os.path.join(root, f)
+	allnames.append(name)
+allnames.sort()
+for name in allnames:
+    suffix = name in isdir and '/' or ''
+    print '%05o %s%s' % (os.lstat(name).st_mode & 07777, name, suffix)
+EOF
+
+cat >mode.py <<EOF
+import sys
+import os
+print '%05o' % os.lstat(sys.argv[1]).st_mode
+EOF
+
+umask 077
+
+hg init repo
+cd repo
+
+chmod 0770 .hg/store
+
+echo '% before commit'
+echo '% store can be written by the group, other files cannot'
+echo '% store is setgid'
+python ../printmodes.py .
+
+mkdir dir
+touch foo dir/bar
+hg ci -qAm 'add files'
+
+echo
+echo '% after commit'
+echo '% working dir files can only be written by the owner'
+echo '% files created in .hg can be written by the group'
+echo '% (in particular, store/**, dirstate, branch.cache, undo files)'
+echo '% new directories are setgid'
+python ../printmodes.py .
+
+umask 007
+hg init ../push
+echo
+echo '% before push'
+echo '% group can write everything'
+python ../printmodes.py ../push
+
+umask 077
+hg -q push ../push
+echo
+echo '% after push'
+echo '% group can still write everything'
+python ../printmodes.py ../push
+
+# Test that we don't lose the setgid bit when we call chmod.
+# Not all systems support setgid directories (e.g. HFS+), so
+# just check that directories have the same mode.
+cd ..
+hg init setgid
+cd setgid
+chmod g+s .hg/store 2> /dev/null
+mkdir dir
+touch dir/file
+hg ci -qAm 'add dir/file'
+storemode=`python ../mode.py .hg/store`
+dirmode=`python ../mode.py .hg/store/data/dir`
+if [ "$storemode" != "$dirmode" ]; then
+    echo "$storemode != $dirmode"
+fi
+
new file mode 100644
--- /dev/null
+++ b/tests/test-inherit-mode.out
@@ -0,0 +1,54 @@
+% before commit
+% store can be written by the group, other files cannot
+% store is setgid
+00700 ./.hg/
+00600 ./.hg/00changelog.i
+00600 ./.hg/requires
+00770 ./.hg/store/
+
+% after commit
+% working dir files can only be written by the owner
+% files created in .hg can be written by the group
+% (in particular, store/**, dirstate, branch.cache, undo files)
+% new directories are setgid
+00700 ./.hg/
+00600 ./.hg/00changelog.i
+00660 ./.hg/dirstate
+00600 ./.hg/requires
+00770 ./.hg/store/
+00660 ./.hg/store/00changelog.i
+00660 ./.hg/store/00manifest.i
+00770 ./.hg/store/data/
+00770 ./.hg/store/data/dir/
+00660 ./.hg/store/data/dir/bar.i
+00660 ./.hg/store/data/foo.i
+00660 ./.hg/store/undo
+00660 ./.hg/undo.branch
+00660 ./.hg/undo.dirstate
+00700 ./dir/
+00600 ./dir/bar
+00600 ./foo
+
+% before push
+% group can write everything
+00770 ../push/.hg/
+00660 ../push/.hg/00changelog.i
+00660 ../push/.hg/requires
+00770 ../push/.hg/store/
+
+% after push
+% group can still write everything
+00770 ../push/.hg/
+00660 ../push/.hg/00changelog.i
+00660 ../push/.hg/branch.cache
+00660 ../push/.hg/requires
+00770 ../push/.hg/store/
+00660 ../push/.hg/store/00changelog.i
+00660 ../push/.hg/store/00manifest.i
+00770 ../push/.hg/store/data/
+00770 ../push/.hg/store/data/dir/
+00660 ../push/.hg/store/data/dir/bar.i
+00660 ../push/.hg/store/data/foo.i
+00660 ../push/.hg/store/undo
+00660 ../push/.hg/undo.branch
+00660 ../push/.hg/undo.dirstate
--- a/tests/test-install.out
+++ b/tests/test-install.out
@@ -1,8 +1,7 @@
 Checking encoding (ascii)...
 Checking extensions...
 Checking templates...
 Checking patch...
-Checking merge helper...
 Checking commit editor...
 Checking username...
 No problems detected
--- a/tests/test-issue352.out
+++ b/tests/test-issue352.out
@@ -1,14 +1,14 @@
 adding he
llo
-abort: '\n' and '\r' disallowed in filenames
+abort: '\n' and '\r' disallowed in filenames: 'he\rllo'
 adding he
llo
-abort: '\n' and '\r' disallowed in filenames
+abort: '\n' and '\r' disallowed in filenames: 'he\rllo'
 adding hell
 o
-abort: '\n' and '\r' disallowed in filenames
+abort: '\n' and '\r' disallowed in filenames: 'hell\no'
 adding hell
 o
-abort: '\n' and '\r' disallowed in filenames
+abort: '\n' and '\r' disallowed in filenames: 'hell\no'
 f  he
llo  he
llo
 f  hell
 o  hell
 o
--- a/tests/test-issue672.out
+++ b/tests/test-issue672.out
@@ -23,29 +23,33 @@ resolving manifests
  ancestor c64f439569a9 local ac7575e3c052+ remote 746e9549ea96
   searching for copies back to rev 1
   unmatched files in local:
    1a
   all copies found (* = to merge, ! = divergent):
    1a -> 1 *
   checking for directory renames
  1a: local moved to 1 -> m
+picked tool 'internal:merge' for 1a (binary False symlink False)
 merging 1a and 1
 my 1a@ac7575e3c052+ other 1@746e9549ea96 ancestor 1@81f4b099af3d
+ premerge successful
 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
 (branch merge, don't forget to commit)
 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
 resolving manifests
  overwrite None partial False
  ancestor c64f439569a9 local 746e9549ea96+ remote ac7575e3c052
   searching for copies back to rev 1
   unmatched files in other:
    1a
   all copies found (* = to merge, ! = divergent):
    1a -> 1 *
   checking for directory renames
  1: remote moved to 1a -> m
 copying 1 to 1a
+picked tool 'internal:merge' for 1 (binary False symlink False)
 merging 1 and 1a
 my 1@746e9549ea96+ other 1a@ac7575e3c052 ancestor 1@81f4b099af3d
+ premerge successful
 removing 1
 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
 (branch merge, don't forget to commit)
--- a/tests/test-keyword
+++ b/tests/test-keyword
@@ -1,14 +1,15 @@
 #!/bin/sh
 
 cat <<EOF >> $HGRCPATH
 [extensions]
 hgext.keyword =
 hgext.mq =
+hgext.notify =
 [keyword]
 * =
 b = ignore
 [hooks]
 commit=
 commit.test=cp a hooktest
 EOF
 
@@ -19,29 +20,41 @@ echo % hg kwdemo
 hg --quiet kwdemo --default \
 | sed -e 's![^ ][^ ]*demo.txt,v!/TMP/demo.txt,v!' \
  -e 's/,v [a-z0-9][a-z0-9]* /,v xxxxxxxxxxxx /' \
  -e '/[$]Revision/ s/: [a-z0-9][a-z0-9]* /: xxxxxxxxxxxx /' \
  -e 's! 20[0-9][0-9]/[01][0-9]/[0-3][0-9] [0-2][0-9]:[0-6][0-9]:[0-6][0-9]! 2000/00/00 00:00:00!'
 
 hg --quiet kwdemo "Branch = {branches}"
 
-hg init Test
-cd Test
+hg init Test-bndl
+cd Test-bndl
 
 echo % kwshrink should exit silently in empty/invalid repo
 hg kwshrink
 
+# Symlinks cannot be created on Windows. The bundle was made with:
+#
+# hg init t
+# cd t
+# echo a > a
+# ln -s a sym
+# hg add sym
+# hg ci -m addsym -u mercurial
+# hg bundle --base null ../test-keyword.hg
+#
+hg pull -u "$TESTDIR/test-keyword.hg" \
+    | sed 's/pulling from.*test-keyword.hg/pulling from test-keyword.hg/'
+
 echo 'expand $Id$' > a
 echo 'do not process $Id:' >> a
 echo 'xxx $' >> a
 echo 'ignore $Id$' > b
-ln -s a sym
 echo % cat
-cat sym a b
+cat a b
 
 echo % addremove
 hg addremove
 echo % status
 hg status
 
 echo % default keyword expansion including commit hook
 echo % interrupted commit should not change state or run commit hook
@@ -51,52 +64,83 @@ hg status
 
 echo % commit
 hg --debug commit -mabsym -d '0 0' -u 'User Name <user@example.com>'
 echo % status
 hg status
 echo % identify
 hg --quiet identify
 echo % cat
-cat sym a b
+cat a b
 echo % hg cat
 hg cat sym a b
 
 echo
 echo % diff a hooktest
 diff a hooktest
 
 echo % removing commit hook from config
 sed -e '/\[hooks\]/,$ d' $HGRCPATH > $HGRCPATH.nohook
 mv $HGRCPATH.nohook $HGRCPATH
 rm hooktest
 
+echo % bundle
+hg bundle --base null ../kw.hg
+
+cd ..
+hg init Test
+cd Test
+
+echo % notify on pull to check whether keywords stay as is in email
+echo % ie. if patch.diff wrapper acts as it should
+
+cat <<EOF >> $HGRCPATH
+[hooks]
+incoming.notify = python:hgext.notify.hook
+[notify]
+sources = pull
+diffstat = False
+[reposubs]
+* = Test
+EOF
+
+echo % pull from bundle
+hg pull -u ../kw.hg 2>&1 | sed -e '/^Date:/,/^diffs (/ d'
+
+echo % remove notify config
+sed -e '/\[hooks\]/,$ d' $HGRCPATH > $HGRCPATH.nonotify
+mv $HGRCPATH.nonotify $HGRCPATH
+
 echo % touch
 touch a b
 echo % status
 hg status
 
 rm sym a b
 echo % update
 hg update
 echo % cat
-cat sym a b
+cat a b
 
 echo % check whether expansion is filewise
 echo '$Id$' > c
 echo 'tests for different changenodes' >> c
 echo % commit c
 hg commit -A -mcndiff -d '1 0' -u 'User Name <user@example.com>'
 echo % force expansion
 hg -v kwexpand
 echo % compare changenodes in a c
 cat a c
 
+echo % qinit -c
+hg qinit -c
 echo % qimport
 hg qimport -r tip -n mqtest.diff
+echo % qcommit
+hg qcommit -mqtest
 echo % keywords should not be expanded in patch
 cat .hg/patches/mqtest.diff
 echo % qpop
 hg qpop
 echo % qgoto - should imply qpush
 hg qgoto mqtest.diff
 echo % cat
 cat c
@@ -118,17 +162,17 @@ sleep 1
 touch c
 echo % status
 hg status
 
 echo % kwfiles
 hg kwfiles
 
 echo % diff --rev
-hg diff --rev 0 | grep -v 'b/c'
+hg diff --rev 1 | grep -v 'b/c'
 
 echo % rollback
 hg rollback
 echo % status
 hg status
 echo % update -C
 hg update --clean
 
@@ -138,17 +182,17 @@ hg --quiet kwdemo "Xinfo = {author}: {de
 
 cat <<EOF >>$HGRCPATH
 [keywordmaps]
 Id = {file} {node|short} {date|rfc822date} {author|user}
 Xinfo = {author}: {desc}
 EOF
 
 echo % cat
-cat sym a b
+cat a b
 echo % hg cat
 hg cat sym a b
 
 echo
 echo '$Xinfo$' >> a
 cat <<EOF >> log
 firstline
 secondline
@@ -161,17 +205,17 @@ hg status
 
 echo % commit
 hg --debug commit -l log -d '2 0' -u 'User Name <user@example.com>'
 rm log
 echo % status
 hg status
 
 echo % cat
-cat sym a b
+cat a b
 echo % hg cat
 hg cat sym a b
 echo
 
 echo % remove
 hg remove a
 hg --debug commit -m rma
 echo % status
@@ -182,17 +226,17 @@ echo % status
 hg status
 echo % revert a
 hg revert --no-backup --rev tip a
 echo % cat a
 cat a
 
 echo % clone to test incoming
 cd ..
-hg clone -r0 Test Test-a
+hg clone -r1 Test Test-a
 cd Test-a
 cat <<EOF >> .hg/hgrc
 [paths]
 default = ../Test
 EOF
 echo % incoming
 # remove path to temp dir
 hg incoming | sed -e 's/^\(comparing with \).*\(test-keyword.*\)/\1\2/'
@@ -203,17 +247,17 @@ echo % commit rejecttest
 hg --debug commit -m'rejects?' -d '3 0' -u 'User Name <user@example.com>'
 echo % export
 hg export -o ../rejecttest.diff tip
 
 cd ../Test
 echo % import
 hg import ../rejecttest.diff
 echo % cat
-cat sym a b
+cat a b
 echo
 echo % rollback
 hg rollback
 echo % clean update
 hg update --clean
 
 echo % kwexpand/kwshrink on selected files
 mkdir x
@@ -229,25 +273,25 @@ echo % cat a
 cat a
 echo % kwshrink a inside directory x
 hg --verbose kwshrink a
 echo % cat a
 cat a
 cd ..
 
 echo % kwexpand nonexistent
-hg kwexpand nonexistent
+hg kwexpand nonexistent 2>&1 | sed 's/nonexistent:.*/nonexistent:/'
 
 echo % switch off expansion
 echo % kwshrink with unknown file u
 cp a u
 hg --verbose kwshrink
 echo % cat
-cat sym a b
+cat a b
 echo % hg cat
 hg cat sym a b
 echo
 rm $HGRCPATH
 echo % cat
-cat sym a b
+cat a b
 echo % hg cat
 hg cat sym a b
 echo
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..2d0305fb7b19e4f741350d2ce964cd3a5e7576b9
GIT binary patch
literal 302
zc$@()0nz?QM=>x$T4*^jL0KkKSsG5x5&!@R|NrdK*?@E>f8z)MfC4{v8Yl!I0HT=y
zfI<NP5TF2v!67gJ*_bs@84Vg~kOo1f5HtW88Vs2<ev}%h)702OHlWZw5C8xTGynhq
z)F|0Uq-f9p&>Cr`O#@8^fHVLPk*G-za~yyvB)||Dp(P>;MC^R!RjVz564wCs1V{sj
z4k@Z>835p0ptG%^$K)~v>Mp?YR}2|tV<Aj$K{0sfDhh`PL^>c?raXZJR$xPJ5wl1#
zS|<Z#1CR?8tRqeSpl5sUFfr3j5X<jvBeB!I6)B0P53I`SUU_iB0orbn)H^5Sqre56
z2ti?I&SoE;z;*NhF1E}Eh=A1$r%0s9q97!_z`orv8u%1H7!Ts^NT&)C14-G!K)gJ2
A2><{9
--- a/tests/test-keyword.out
+++ b/tests/test-keyword.out
@@ -79,141 +79,169 @@ hgext.keyword =
 [keyword]
 * = 
 b = ignore
 demo.txt = 
 [keywordmaps]
 Branch = {branches}
 $Branch: demobranch $
 % kwshrink should exit silently in empty/invalid repo
+pulling from test-keyword.hg
+requesting all changes
+adding changesets
+adding manifests
+adding file changes
+added 1 changesets with 1 changes to 1 files
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
 % cat
 expand $Id$
 do not process $Id:
 xxx $
-expand $Id$
-do not process $Id:
-xxx $
 ignore $Id$
 % addremove
 adding a
 adding b
-adding sym
 % status
 A a
 A b
-A sym
 % default keyword expansion including commit hook
 % interrupted commit should not change state or run commit hook
 a
 b
-sym
 transaction abort!
 rollback completed
 abort: empty commit message
 % status
 A a
 A b
-A sym
 % commit
 a
 b
-sym
 overwriting a expanding keywords
 running hook commit.test: cp a hooktest
 % status
 ? hooktest
 % identify
-f782df5f9602
+ef63ca68695b
 % cat
-expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $
-do not process $Id:
-xxx $
-expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $
+expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
 do not process $Id:
 xxx $
 ignore $Id$
 % hg cat
-expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $
+expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
 do not process $Id:
 xxx $
 ignore $Id$
 a
 % diff a hooktest
 % removing commit hook from config
+% bundle
+2 changesets found
+% notify on pull to check whether keywords stay as is in email
+% ie. if patch.diff wrapper acts as it should
+% pull from bundle
+pulling from ../kw.hg
+requesting all changes
+adding changesets
+adding manifests
+adding file changes
+added 2 changesets with 3 changes to 3 files
+
+diff -r 000000000000 -r a2392c293916 sym
+--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
++++ b/sym	Sat Feb 09 20:25:47 2008 +0100
+@@ -0,0 +1,1 @@
++a
+\ No newline at end of file
+
+diff -r a2392c293916 -r ef63ca68695b a
+--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
++++ b/a	Thu Jan 01 00:00:00 1970 +0000
+@@ -0,0 +1,3 @@
++expand $Id$
++do not process $Id:
++xxx $
+diff -r a2392c293916 -r ef63ca68695b b
+--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
++++ b/b	Thu Jan 01 00:00:00 1970 +0000
+@@ -0,0 +1,1 @@
++ignore $Id$
+3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+% remove notify config
 % touch
 % status
 % update
 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
 % cat
-expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $
-do not process $Id:
-xxx $
-expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $
+expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
 do not process $Id:
 xxx $
 ignore $Id$
 % check whether expansion is filewise
 % commit c
 adding c
 % force expansion
 overwriting a expanding keywords
 overwriting c expanding keywords
 % compare changenodes in a c
-expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $
+expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
 do not process $Id:
 xxx $
-$Id: c,v ba4426d1938e 1970/01/01 00:00:01 user $
+$Id: c,v 40a904bbbe4c 1970/01/01 00:00:01 user $
 tests for different changenodes
+% qinit -c
 % qimport
+% qcommit
 % keywords should not be expanded in patch
 # HG changeset patch
 # User User Name <user@example.com>
 # Date 1 0
-# Node ID ba4426d1938ec9673e03ab274d88c44e24618f7f
-# Parent  f782df5f9602483b4e51c31a12315f353bba380c
+# Node ID 40a904bbbe4cd4ab0a1f28411e35db26341a40ad
+# Parent  ef63ca68695bc9495032c6fda1350c71e6d256e9
 cndiff
 
-diff -r f782df5f9602 -r ba4426d1938e c
+diff -r ef63ca68695b -r 40a904bbbe4c c
 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
 +++ b/c	Thu Jan 01 00:00:01 1970 +0000
 @@ -0,0 +1,2 @@
 +$Id$
 +tests for different changenodes
 % qpop
 Patch queue now empty
 % qgoto - should imply qpush
 applying mqtest.diff
 Now at: mqtest.diff
 % cat
-$Id: c,v ba4426d1938e 1970/01/01 00:00:01 user $
+$Id: c,v 40a904bbbe4c 1970/01/01 00:00:01 user $
 tests for different changenodes
 % qpop and move on
 Patch queue now empty
 % copy
 % kwfiles added
 a
 c
 % commit
 c
  c: copy a:0045e12f6c5791aac80ca6cbfd97709a88307292
 overwriting c expanding keywords
 % cat a c
-expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $
+expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
 do not process $Id:
 xxx $
-expand $Id: c,v 0ba462c0f077 1970/01/01 00:00:01 user $
+expand $Id: c,v e22d299ac0c2 1970/01/01 00:00:01 user $
 do not process $Id:
 xxx $
 % touch copied c after 1 second
 % status
 % kwfiles
 a
 c
 % diff --rev
-diff -r f782df5f9602 c
+diff -r ef63ca68695b c
 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
 @@ -0,0 +1,3 @@
 +expand $Id$
 +do not process $Id:
 +xxx $
 % rollback
 rolling back last transaction
 % status
@@ -227,97 +255,86 @@ hgext.keyword =
 [keyword]
 * = 
 b = ignore
 demo.txt = 
 [keywordmaps]
 Xinfo = {author}: {desc}
 $Xinfo: test: hg keyword config and expansion example $
 % cat
-expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $
-do not process $Id:
-xxx $
-expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $
+expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
 do not process $Id:
 xxx $
 ignore $Id$
 % hg cat
-expand $Id: a f782df5f9602 Thu, 01 Jan 1970 00:00:00 +0000 user $
+expand $Id: a ef63ca68695b Thu, 01 Jan 1970 00:00:00 +0000 user $
 do not process $Id:
 xxx $
 ignore $Id$
 a
 % interrupted commit should not change state
 transaction abort!
 rollback completed
 abort: empty commit message
 % status
 M a
 ? log
 % commit
 a
 overwriting a expanding keywords
 % status
 % cat
-expand $Id: a 0729690beff6 Thu, 01 Jan 1970 00:00:02 +0000 user $
-do not process $Id:
-xxx $
-$Xinfo: User Name <user@example.com>: firstline $
-expand $Id: a 0729690beff6 Thu, 01 Jan 1970 00:00:02 +0000 user $
+expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
 do not process $Id:
 xxx $
 $Xinfo: User Name <user@example.com>: firstline $
 ignore $Id$
 % hg cat
-expand $Id: a 0729690beff6 Thu, 01 Jan 1970 00:00:02 +0000 user $
+expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
 do not process $Id:
 xxx $
 $Xinfo: User Name <user@example.com>: firstline $
 ignore $Id$
 a
 % remove
 % status
 % rollback
 rolling back last transaction
 % status
 R a
 % revert a
 % cat a
-expand $Id: a 0729690beff6 Thu, 01 Jan 1970 00:00:02 +0000 user $
+expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
 do not process $Id:
 xxx $
 $Xinfo: User Name <user@example.com>: firstline $
 % clone to test incoming
 requesting all changes
 adding changesets