]> arthur.barton.de Git - bup.git/commitdiff
tests: move all tests to test/
authorJohannes Berg <johannes@sipsolutions.net>
Wed, 27 May 2020 17:58:38 +0000 (19:58 +0200)
committerRob Browning <rlb@defaultvalue.org>
Thu, 26 Nov 2020 21:53:09 +0000 (15:53 -0600)
Instead of having some testing code interleaved with bup's
real code in lib/bup/test/ and lib/bup/t/ move everything
related to testing into test/, which is also renamed from
just t/.

This aligns with pytest for future changes, and, almost more
importantly, cleans up the lib/ directory to only have the
operational code.

The latter is necessary to properly 'libify' bup in order to
be able to use tox properly to test with different versions
of python in venv later.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Reviewed-by: Rob Browning <rlb@defaultvalue.org>
[rlb@defaultvalue.org: also move utilities like compare-trees to dev/;
 make test/lib a test-specific module tree and have wvtest.py include
 it; use test/ext/ and test/int/ (external and internal) as the test
 dir names.]

Signed-off-by: Rob Browning <rlb@defaultvalue.org>
Tested-by: Rob Browning <rlb@defaultvalue.org>
187 files changed:
.gitignore
Documentation/bup-gc.md
Documentation/bup-get.md
Documentation/bup-prune-older.md
HACKING
Makefile
README.md
buptest.py [deleted file]
dev/cleanup-mounts-under [new file with mode: 0755]
dev/compare-trees [new file with mode: 0755]
dev/configure-sampledata [new file with mode: 0755]
dev/data-size [new file with mode: 0755]
dev/echo-argv-bytes [new file with mode: 0755]
dev/force-delete [new file with mode: 0755]
dev/git-cat-tree [new file with mode: 0755]
dev/hardlink-sets [new file with mode: 0755]
dev/id-other-than [new file with mode: 0755]
dev/lib.sh [new file with mode: 0644]
dev/make-random-paths [new file with mode: 0755]
dev/mksock [new file with mode: 0755]
dev/ns-timestamp-resolutions [new file with mode: 0755]
dev/perf-glance [new file with mode: 0755]
dev/root-status [new file with mode: 0755]
dev/sparse-test-data [new file with mode: 0755]
dev/subtree-hash [new file with mode: 0755]
dev/sync-tree [new file with mode: 0755]
dev/unknown-owner [new file with mode: 0755]
lib/bup/t/__init__.py [deleted file]
lib/bup/t/tbloom.py [deleted file]
lib/bup/t/tclient.py [deleted file]
lib/bup/t/tcompat.py [deleted file]
lib/bup/t/tgit.py [deleted file]
lib/bup/t/thashsplit.py [deleted file]
lib/bup/t/thelpers.py [deleted file]
lib/bup/t/tindex.py [deleted file]
lib/bup/t/tmetadata.py [deleted file]
lib/bup/t/toptions.py [deleted file]
lib/bup/t/tresolve.py [deleted file]
lib/bup/t/tshquote.py [deleted file]
lib/bup/t/tvfs.py [deleted file]
lib/bup/t/tvint.py [deleted file]
lib/bup/t/txstat.py [deleted file]
lib/bup/test/__init__.py [deleted file]
lib/bup/test/vfs.py [deleted file]
t/bin/sort-z [deleted symlink]
t/cleanup-mounts-under [deleted file]
t/compare-trees [deleted file]
t/configure-sampledata [deleted file]
t/data-size [deleted file]
t/echo-argv-bytes [deleted file]
t/force-delete [deleted file]
t/git-cat-tree [deleted file]
t/hardlink-sets [deleted file]
t/id-other-than [deleted file]
t/lib.sh [deleted file]
t/make-random-paths [deleted file]
t/mksock [deleted file]
t/ns-timestamp-resolutions [deleted file]
t/perf-glance [deleted file]
t/root-status [deleted file]
t/sampledata/b2/foozy [deleted file]
t/sampledata/b2/foozy2 [deleted file]
t/sampledata/x [deleted file]
t/sampledata/y-2000 [deleted file]
t/sampledata/y/testfile1 [deleted file]
t/sampledata/y/text [deleted file]
t/sparse-test-data [deleted file]
t/subtree-hash [deleted file]
t/sync-tree [deleted file]
t/test-argv [deleted file]
t/test-cat-file.sh [deleted file]
t/test-command-without-init-fails.sh [deleted file]
t/test-compression.sh [deleted file]
t/test-drecurse.sh [deleted file]
t/test-fsck.sh [deleted file]
t/test-ftp [deleted file]
t/test-fuse.sh [deleted file]
t/test-gc.sh [deleted file]
t/test-get [deleted file]
t/test-help [deleted file]
t/test-import-duplicity.sh [deleted file]
t/test-import-rdiff-backup.sh [deleted file]
t/test-index-check-device.sh [deleted file]
t/test-index-clear.sh [deleted file]
t/test-index.sh [deleted file]
t/test-list-idx.sh [deleted file]
t/test-ls [deleted file]
t/test-ls-remote [deleted file]
t/test-main.sh [deleted file]
t/test-meta.sh [deleted file]
t/test-on.sh [deleted file]
t/test-packsizelimit [deleted file]
t/test-prune-older [deleted file]
t/test-redundant-saves.sh [deleted file]
t/test-release-archive.sh [deleted file]
t/test-restore-map-owner.sh [deleted file]
t/test-restore-single-file.sh [deleted file]
t/test-rm-between-index-and-save.sh [deleted file]
t/test-rm.sh [deleted file]
t/test-save-creates-no-unrefs.sh [deleted file]
t/test-save-errors [deleted file]
t/test-save-restore [deleted file]
t/test-save-restore-excludes.sh [deleted file]
t/test-save-smaller [deleted file]
t/test-save-strip-graft.sh [deleted file]
t/test-save-with-valid-parent.sh [deleted file]
t/test-sparse-files.sh [deleted file]
t/test-split-join.sh [deleted file]
t/test-tz.sh [deleted file]
t/test-web.sh [deleted file]
t/test-xdev.sh [deleted file]
t/test.sh [deleted file]
t/testfile1 [deleted file]
t/testfile2 [deleted file]
t/unknown-owner [deleted file]
test/__init__.py [new file with mode: 0644]
test/ext/bin/sort-z [new symlink]
test/ext/test-argv [new file with mode: 0755]
test/ext/test-cat-file.sh [new file with mode: 0755]
test/ext/test-command-without-init-fails.sh [new file with mode: 0755]
test/ext/test-compression.sh [new file with mode: 0755]
test/ext/test-drecurse.sh [new file with mode: 0755]
test/ext/test-fsck.sh [new file with mode: 0755]
test/ext/test-ftp [new file with mode: 0755]
test/ext/test-fuse.sh [new file with mode: 0755]
test/ext/test-gc.sh [new file with mode: 0755]
test/ext/test-get [new file with mode: 0755]
test/ext/test-help [new file with mode: 0755]
test/ext/test-import-duplicity.sh [new file with mode: 0755]
test/ext/test-import-rdiff-backup.sh [new file with mode: 0755]
test/ext/test-index-check-device.sh [new file with mode: 0755]
test/ext/test-index-clear.sh [new file with mode: 0755]
test/ext/test-index.sh [new file with mode: 0755]
test/ext/test-list-idx.sh [new file with mode: 0755]
test/ext/test-ls [new file with mode: 0755]
test/ext/test-ls-remote [new file with mode: 0755]
test/ext/test-main.sh [new file with mode: 0755]
test/ext/test-meta.sh [new file with mode: 0755]
test/ext/test-on.sh [new file with mode: 0755]
test/ext/test-packsizelimit [new file with mode: 0755]
test/ext/test-prune-older [new file with mode: 0755]
test/ext/test-redundant-saves.sh [new file with mode: 0755]
test/ext/test-release-archive.sh [new file with mode: 0755]
test/ext/test-restore-map-owner.sh [new file with mode: 0755]
test/ext/test-restore-single-file.sh [new file with mode: 0755]
test/ext/test-rm-between-index-and-save.sh [new file with mode: 0755]
test/ext/test-rm.sh [new file with mode: 0755]
test/ext/test-save-creates-no-unrefs.sh [new file with mode: 0755]
test/ext/test-save-errors [new file with mode: 0755]
test/ext/test-save-restore [new file with mode: 0755]
test/ext/test-save-restore-excludes.sh [new file with mode: 0755]
test/ext/test-save-smaller [new file with mode: 0755]
test/ext/test-save-strip-graft.sh [new file with mode: 0755]
test/ext/test-save-with-valid-parent.sh [new file with mode: 0755]
test/ext/test-sparse-files.sh [new file with mode: 0755]
test/ext/test-split-join.sh [new file with mode: 0755]
test/ext/test-tz.sh [new file with mode: 0755]
test/ext/test-web.sh [new file with mode: 0755]
test/ext/test-xdev.sh [new file with mode: 0755]
test/ext/test.sh [new file with mode: 0755]
test/int/__init__.py [new file with mode: 0644]
test/int/tbloom.py [new file with mode: 0644]
test/int/tclient.py [new file with mode: 0644]
test/int/tcompat.py [new file with mode: 0644]
test/int/tgit.py [new file with mode: 0644]
test/int/thashsplit.py [new file with mode: 0644]
test/int/thelpers.py [new file with mode: 0644]
test/int/tindex.py [new file with mode: 0644]
test/int/tmetadata.py [new file with mode: 0644]
test/int/toptions.py [new file with mode: 0644]
test/int/tresolve.py [new file with mode: 0644]
test/int/tshquote.py [new file with mode: 0644]
test/int/tvfs.py [new file with mode: 0644]
test/int/tvint.py [new file with mode: 0644]
test/int/txstat.py [new file with mode: 0644]
test/lib/buptest/__init__.py [new file with mode: 0644]
test/lib/buptest/vfs.py [new file with mode: 0644]
test/sampledata/b2/foozy [new file with mode: 0644]
test/sampledata/b2/foozy2 [new file with mode: 0644]
test/sampledata/x [new file with mode: 0644]
test/sampledata/y-2000 [new file with mode: 0644]
test/sampledata/y/testfile1 [new file with mode: 0644]
test/sampledata/y/text [new file with mode: 0644]
test/testfile1 [new file with mode: 0644]
test/testfile2 [new file with mode: 0644]
wvtest-bup.sh
wvtest.py

index b6322523bd51969ac1f009bb52dcddb911937cc2..bda8de8bff067ae5d048518a7c012257c608771a 100644 (file)
@@ -16,5 +16,5 @@ memtest
 *.swp
 nbproject
 /lib/cmd/bup-*
-/t/sampledata/var/
-/t/tmp/
+/test/sampledata/var/
+/test/tmp/
index fd21705b8a8fe7505564186501d292f69c3fe730..64120e89bc73d07afc3984066162e4dc3cd46fd9 100644 (file)
@@ -30,7 +30,7 @@ WARNING: This is one of the few bup commands that modifies your
 archive in intentionally destructive ways.  Though if an attempt to
 `join` or `restore` the data you still care about after a `gc`
 succeeds, that's a fairly encouraging sign that the commands worked
-correctly.  (The `t/compare-trees` command in the source tree can be
+correctly.  (The `dev/compare-trees` command in the source tree can be
 used to help test before/after results.)
 
 # OPTIONS
index 94cb4f3ea0cf888aab84b4db53981dc8133536e5..dcc2bd9d1aff1eefdf3c6d6392b632166bf20848 100644 (file)
@@ -60,7 +60,7 @@ WARNING: This is one of the few bup commands that can modify your
 archives in intentionally destructive ways.  Though if an attempt to
 join or restore the data you still care about succeeds after you've
 run this command, then that's a fairly encouraging sign that it worked
-correctly.  (The t/compare-trees command in the source tree can be
+correctly.  (The dev/compare-trees command in the source tree can be
 used to help test before/after results.)
 
 # METHODS
index efb57a211e2de428988e009d6a2cef041fe73648..24e2eea80885a8a727bd68b1252f305bd7dfc38f 100644 (file)
@@ -21,7 +21,7 @@ WARNING: This is one of the few bup commands that modifies your
 archive in intentionally destructive ways.  Though if an attempt to
 `join` or `restore` the data you still care about after a
 `prune-older` succeeds, that's a fairly encouraging sign that the
-commands worked correctly.  (The `t/compare-trees` command in the
+commands worked correctly.  (The `dev/compare-trees` command in the
 source tree can be used to help test before/after results.)
 
 # KEEP PERIODS
diff --git a/HACKING b/HACKING
index 6aafd76816a6f36691053668c0076c7146d4089e..773f187ee4e037735e91fdf1474eebba74051d8f 100644 (file)
--- a/HACKING
+++ b/HACKING
@@ -66,13 +66,17 @@ output (interleaved parallel test output), and inaccurate intermediate
 success/failure counts, but the final counts displayed should be
 correct.
 
-Individual non-Python tests can be run via "./wvtest run t/TEST" and
+Individual non-Python tests can be run via "./wvtest run test/TEST" and
 if you'd like to see all of the test output, you can omit the wvtest
-run wrapper: "t/TEST"
+run wrapper: "test/TEST"
 
 Individual Python tests can be run via "./wvtest run ./wvtest.py
-lib/bup/t/TEST", and as above, you can see all the output by omitting
-the wvtest run wrapper like this: "./wvtest.py lib/bup/t/TEST"
+test/int/TEST", and as above, you can see all the output by omitting
+the wvtest run wrapper like this: "./wvtest.py test/TEST"
+
+Internal tests that test bup's code directly are located in test/int,
+and external tests that test bup from the outside, typically by
+running the executable, are located in test/ext.
 
 
 Submitting patches
index 51afd1a0a722933812de191408b9af5af648ea21..3c6d522482577661d4641cab3ff04c2e5e0a7574 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -19,11 +19,11 @@ define shout
 $(if $(subst ok,,$(lastword $(1))),$(error $(2)),$(shell x="$(1)"; echo $${x%???}))
 endef
 
-sampledata_rev := $(shell t/configure-sampledata --revision $(isok))
+sampledata_rev := $(shell dev/configure-sampledata --revision $(isok))
 sampledata_rev := \
   $(call shout,$(sampledata_rev),Could not parse sampledata revision)
 
-current_sampledata := t/sampledata/var/rev/v$(sampledata_rev)
+current_sampledata := test/sampledata/var/rev/v$(sampledata_rev)
 
 os := $(shell ($(pf); uname | sed 's/[-_].*//') $(isok))
 os := $(call shout,$(os),Unable to determine OS)
@@ -40,7 +40,7 @@ endif
 ifdef TMPDIR
   test_tmp := $(TMPDIR)
 else
-  test_tmp := $(CURDIR)/t/tmp
+  test_tmp := $(CURDIR)/test/tmp
 endif
 
 initial_setup := $(shell dev/update-checkout-info lib/bup/checkout_info.py $(isok))
@@ -82,7 +82,7 @@ bup_deps := lib/bup/_helpers$(SOEXT) $(bup_cmds)
 all: $(bup_deps) Documentation/all $(current_sampledata)
 
 $(current_sampledata):
-       t/configure-sampledata --setup
+       dev/configure-sampledata --setup
 
 PANDOC ?= $(shell type -p pandoc)
 
@@ -156,81 +156,82 @@ lib/bup/_helpers$(SOEXT): \
          "import glob; assert(len(glob.glob('lib/bup/build/*/_helpers*$(SOEXT)')) == 1)"
        cp lib/bup/build/*/_helpers*$(SOEXT) "$@"
 
-t/tmp:
-       mkdir t/tmp
+test/tmp:
+       mkdir test/tmp
 
 runtests: runtests-python runtests-cmdline
 
 python_tests := \
-  lib/bup/t/tbloom.py \
-  lib/bup/t/tclient.py \
-  lib/bup/t/tcompat.py \
-  lib/bup/t/tgit.py \
-  lib/bup/t/thashsplit.py \
-  lib/bup/t/thelpers.py \
-  lib/bup/t/tindex.py \
-  lib/bup/t/tmetadata.py \
-  lib/bup/t/toptions.py \
-  lib/bup/t/tresolve.py \
-  lib/bup/t/tshquote.py \
-  lib/bup/t/tvfs.py \
-  lib/bup/t/tvint.py \
-  lib/bup/t/txstat.py
+  test/int/tbloom.py \
+  test/int/tclient.py \
+  test/int/tcompat.py \
+  test/int/tgit.py \
+  test/int/thashsplit.py \
+  test/int/thelpers.py \
+  test/int/tindex.py \
+  test/int/tmetadata.py \
+  test/int/toptions.py \
+  test/int/tresolve.py \
+  test/int/tshquote.py \
+  test/int/tvfs.py \
+  test/int/tvint.py \
+  test/int/txstat.py
+
 
 # The "pwd -P" here may not be appropriate in the long run, but we
 # need it until we settle the relevant drecurse/exclusion questions:
 # https://groups.google.com/forum/#!topic/bup-list/9ke-Mbp10Q0
-runtests-python: all t/tmp
-       mkdir -p t/tmp/test-log
+runtests-python: all test/tmp
+       mkdir -p test/tmp/test-log
        $(pf); cd $$(pwd -P); TMPDIR="$(test_tmp)" \
          ./wvtest.py  $(python_tests) 2>&1 \
-           | tee -a t/tmp/test-log/$$$$.log
+           | tee -a test/tmp/test-log/$$$$.log
 
 cmdline_tests := \
-  t/test-help \
-  t/test.sh \
-  t/test-argv \
-  t/test-cat-file.sh \
-  t/test-command-without-init-fails.sh \
-  t/test-compression.sh \
-  t/test-drecurse.sh \
-  t/test-fsck.sh \
-  t/test-fuse.sh \
-  t/test-ftp \
-  t/test-web.sh \
-  t/test-gc.sh \
-  t/test-import-duplicity.sh \
-  t/test-import-rdiff-backup.sh \
-  t/test-index.sh \
-  t/test-index-check-device.sh \
-  t/test-index-clear.sh \
-  t/test-list-idx.sh \
-  t/test-ls \
-  t/test-ls-remote \
-  t/test-main.sh \
-  t/test-meta.sh \
-  t/test-on.sh \
-  t/test-packsizelimit \
-  t/test-prune-older \
-  t/test-redundant-saves.sh \
-  t/test-restore-map-owner.sh \
-  t/test-restore-single-file.sh \
-  t/test-rm.sh \
-  t/test-rm-between-index-and-save.sh \
-  t/test-save-creates-no-unrefs.sh \
-  t/test-save-restore \
-  t/test-save-errors \
-  t/test-save-restore-excludes.sh \
-  t/test-save-strip-graft.sh \
-  t/test-save-with-valid-parent.sh \
-  t/test-sparse-files.sh \
-  t/test-split-join.sh \
-  t/test-tz.sh \
-  t/test-xdev.sh
-
-tmp-target-run-test-get-%: all t/tmp
+  test/ext/test.sh \
+  test/ext/test-argv \
+  test/ext/test-cat-file.sh \
+  test/ext/test-command-without-init-fails.sh \
+  test/ext/test-compression.sh \
+  test/ext/test-drecurse.sh \
+  test/ext/test-fsck.sh \
+  test/ext/test-fuse.sh \
+  test/ext/test-ftp \
+  test/ext/test-help \
+  test/ext/test-web.sh \
+  test/ext/test-gc.sh \
+  test/ext/test-import-duplicity.sh \
+  test/ext/test-import-rdiff-backup.sh \
+  test/ext/test-index.sh \
+  test/ext/test-index-check-device.sh \
+  test/ext/test-index-clear.sh \
+  test/ext/test-list-idx.sh \
+  test/ext/test-ls \
+  test/ext/test-ls-remote \
+  test/ext/test-main.sh \
+  test/ext/test-meta.sh \
+  test/ext/test-on.sh \
+  test/ext/test-packsizelimit \
+  test/ext/test-prune-older \
+  test/ext/test-redundant-saves.sh \
+  test/ext/test-restore-map-owner.sh \
+  test/ext/test-restore-single-file.sh \
+  test/ext/test-rm.sh \
+  test/ext/test-rm-between-index-and-save.sh \
+  test/ext/test-save-creates-no-unrefs.sh \
+  test/ext/test-save-restore \
+  test/ext/test-save-errors \
+  test/ext/test-save-restore-excludes.sh \
+  test/ext/test-save-strip-graft.sh \
+  test/ext/test-save-with-valid-parent.sh \
+  test/ext/test-sparse-files.sh \
+  test/ext/test-split-join.sh \
+  test/ext/test-tz.sh \
+  test/ext/test-xdev.sh
+
+tmp-target-run-test-get-%: all test/tmp
        $(pf); cd $$(pwd -P); TMPDIR="$(test_tmp)" \
-         t/test-get $* 2>&1 | tee -a t/tmp/test-log/$$$$.log
+         test/ext/test-get $* 2>&1 | tee -a test/tmp/test-log/$$$$.log
 
 test_get_targets += \
   tmp-target-run-test-get-replace \
@@ -245,26 +246,26 @@ test_get_targets += \
 # The "pwd -P" here may not be appropriate in the long run, but we
 # need it until we settle the relevant drecurse/exclusion questions:
 # https://groups.google.com/forum/#!topic/bup-list/9ke-Mbp10Q0
-tmp-target-run-test%: all t/tmp
+tmp-target-run-test%: all test/tmp
        $(pf); cd $$(pwd -P); TMPDIR="$(test_tmp)" \
-         t/test$* 2>&1 | tee -a t/tmp/test-log/$$$$.log
+         test/ext/test$* 2>&1 | tee -a test/tmp/test-log/$$$$.log
 
-runtests-cmdline: $(test_get_targets) $(subst t/test,tmp-target-run-test,$(cmdline_tests))
+runtests-cmdline: $(test_get_targets) $(subst test/ext/test,tmp-target-run-test,$(cmdline_tests))
 
 stupid:
        PATH=/bin:/usr/bin $(MAKE) test
 
 test: all
-       if test -e t/tmp/test-log; then rm -r t/tmp/test-log; fi
-       mkdir -p t/tmp/test-log
+       if test -e test/tmp/test-log; then rm -r test/tmp/test-log; fi
+       mkdir -p test/tmp/test-log
        ./wvtest watch --no-counts \
-         $(MAKE) runtests 2>t/tmp/test-log/$$$$.log
-       ./wvtest report t/tmp/test-log/*.log
+         $(MAKE) runtests 2>test/tmp/test-log/$$$$.log
+       ./wvtest report test/tmp/test-log/*.log
 
 check: test
 
 distcheck: all
-       ./wvtest run t/test-release-archive.sh
+       ./wvtest run test/ext/test-release-archive.sh
 
 long-test: export BUP_TEST_LEVEL=11
 long-test: test
@@ -330,18 +331,18 @@ clean: Documentation/clean config/bin/python
                *.pyc */*.pyc lib/*/*.pyc lib/*/*/*.pyc \
                lib/bup/checkout_info.py \
                randomgen memtest \
-               testfs.img lib/bup/t/testfs.img
+               testfs.img test/int/testfs.img
        for x in $$(ls cmd/*-cmd.py cmd/*-cmd.sh | grep -vF python-cmd.sh | cut -b 5-); do \
            echo "cmd/bup-$${x%-cmd.*}"; \
        done | xargs -t rm -f
-       if test -e t/mnt; then t/cleanup-mounts-under t/mnt; fi
-       if test -e t/mnt; then rm -r t/mnt; fi
-       if test -e t/tmp; then t/cleanup-mounts-under t/tmp; fi
-        # FIXME: migrate these to t/mnt/
-       if test -e lib/bup/t/testfs; \
-         then umount lib/bup/t/testfs || true; fi
-       rm -rf *.tmp *.tmp.meta t/*.tmp lib/*/*/*.tmp build lib/bup/build lib/bup/t/testfs
-       if test -e t/tmp; then t/force-delete t/tmp; fi
-       t/configure-sampledata --clean
+       if test -e test/mnt; then dev/cleanup-mounts-under test/mnt; fi
+       if test -e test/mnt; then rm -r test/mnt; fi
+       if test -e test/tmp; then dev/cleanup-mounts-under test/tmp; fi
+        # FIXME: migrate these to test/mnt/
+       if test -e test/int/testfs; \
+         then umount test/int/testfs || true; fi
+       rm -rf *.tmp *.tmp.meta test/*.tmp lib/*/*/*.tmp build lib/bup/build test/int/testfs
+       if test -e test/tmp; then dev/force-delete test/tmp; fi
+       dev/configure-sampledata --clean
         # Remove last so that cleanup tools can depend on it
        rm -rf config/bin
index 5c2f28eafaa0c6e7292d6155c8fbdd5500fc6801..07ad1ec3258484e1c71f27107159638825ad7803 100644 (file)
--- a/README.md
+++ b/README.md
@@ -453,16 +453,16 @@ Notes on NetBSD/pkgsrc
    cycle and error out, so "ls -R" and "find" will not work.
 
  - There is no support for ACLs.  If/when some enterprising person
-   fixes this, adjust t/compare-trees.
+   fixes this, adjust dev/compare-trees.
 
 
 Notes on Cygwin
 ---------------
 
  - There is no support for ACLs.  If/when some enterprising person
-   fixes this, adjust t/compare-trees.
+   fixes this, adjust dev/compare-trees.
 
- - In t/test.sh, two tests have been disabled.  These tests check to
+ - In test/ext/test.sh, two tests have been disabled.  These tests check to
    see that repeated saves produce identical trees and that an
    intervening index doesn't change the SHA1.  Apparently Cygwin has
    some unusual behaviors with respect to access times (that probably
@@ -474,7 +474,7 @@ Notes on OS X
 -------------
 
  - There is no support for ACLs.  If/when some enterprising person
-   fixes this, adjust t/compare-trees.
+   fixes this, adjust dev/compare-trees.
 
 
 How it works
diff --git a/buptest.py b/buptest.py
deleted file mode 100644 (file)
index 2089fcf..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-
-from __future__ import absolute_import, print_function
-from collections import namedtuple
-from contextlib import contextmanager
-from os.path import abspath, basename, dirname, realpath
-from pipes import quote
-from subprocess import PIPE, Popen
-from traceback import extract_stack
-import errno, os, subprocess, sys, tempfile
-
-from wvtest import WVPASSEQ, wvfailure_count
-
-from bup import helpers
-from bup.compat import fsencode, str_type
-from bup.io import byte_stream
-
-
-@contextmanager
-def no_lingering_errors():
-    def fail_if_errors():
-        if helpers.saved_errors:
-            bt = extract_stack()
-            src_file, src_line, src_func, src_txt = bt[-4]
-            msg = 'saved_errors ' + repr(helpers.saved_errors)
-            print('! %-70s %s' % ('%s:%-4d %s' % (basename(src_file),
-                                                  src_line,
-                                                  msg),
-                                  'FAILED'))
-            sys.stdout.flush()
-    fail_if_errors()
-    helpers.clear_errors()
-    yield
-    fail_if_errors()
-    helpers.clear_errors()
-
-
-# Assumes (of course) this file is at the top-level of the source tree
-_bup_tmp = realpath(dirname(fsencode(__file__))) + b'/t/tmp'
-try:
-    os.makedirs(_bup_tmp)
-except OSError as e:
-    if e.errno != errno.EEXIST:
-        raise
-
-
-@contextmanager
-def test_tempdir(prefix):
-    initial_failures = wvfailure_count()
-    tmpdir = tempfile.mkdtemp(dir=_bup_tmp, prefix=prefix)
-    yield tmpdir
-    if wvfailure_count() == initial_failures:
-        subprocess.call(['chmod', '-R', 'u+rwX', tmpdir])
-        subprocess.call(['rm', '-rf', tmpdir])
-
-
-ex_res = namedtuple('SubprocResult', ['out', 'err', 'proc', 'rc'])
-
-def run(cmd, check=True, input=None, **kwargs):
-    """Run a subprocess as per subprocess.Popen(cmd, **kwargs) followed by
-    communicate(input=input).  If check is true, then throw an
-    exception if the subprocess exits with non-zero status.  Return a
-    SubprocResult tuple.
-
-    """
-    if input:
-        assert 'stdin' not in kwargs
-        kwargs['stdin'] = PIPE
-    p = Popen(cmd, **kwargs)
-    out, err = p.communicate(input=input)
-    if check and p.returncode != 0:
-        raise Exception('subprocess %r failed with status %d%s'
-                        % (cmd, p.returncode,
-                           (', stderr: %r' % err) if err else ''))
-    return ex_res(out=out, err=err, proc=p, rc=p.returncode)
-
-def logcmd(cmd):
-    s = helpers.shstr(cmd)
-    if isinstance(cmd, str_type):
-        print(s, file=sys.stderr)
-    else:
-        # bytes - for now just escape it
-        print(s.decode(errors='backslashreplace'), file=sys.stderr)
-
-def ex(cmd, **kwargs):
-    """Print cmd to stderr and then run it as per ex(...).
-    Print the subprocess stderr to stderr if stderr=PIPE and there's
-    any data.
-    """
-    logcmd(cmd)
-    result = run(cmd, **kwargs)
-    if result.err:
-        sys.stderr.flush()
-        byte_stream(sys.stderr).write(result.err)
-    return result
-
-def exo(cmd, **kwargs):
-    """Print cmd to stderr and then run it as per ex(..., stdout=PIPE).
-    Print the subprocess stderr to stderr if stderr=PIPE and there's
-    any data.
-
-    """
-    assert 'stdout' not in kwargs
-    kwargs['stdout'] = PIPE
-    return ex(cmd, **kwargs)
diff --git a/dev/cleanup-mounts-under b/dev/cleanup-mounts-under
new file mode 100755 (executable)
index 0000000..c0c2671
--- /dev/null
@@ -0,0 +1,46 @@
+#!/bin/sh
+"""": # -*-python-*-
+bup_python="$(dirname "$0")/../config/bin/python" || exit $?
+exec "$bup_python" "$0" ${1+"$@"}
+"""
+
+from sys import stderr
+import os.path, re, subprocess, sys
+
+def mntent_unescape(x):
+    def replacement(m):
+        unescapes = {
+            "\\\\" : "\\",
+            "\\011" : "\t",
+            "\\012" : "\n",
+            "\\040" : " "
+        }
+        return unescapes.get(m.group(0))
+    return re.sub(r'(\\\\|\\011|\\012|\\040)', replacement, x)
+
+targets = sys.argv[1:]
+
+if not os.path.exists('/proc/mounts'):
+    print >> stderr, 'No /proc/mounts; skipping mount cleanup in', repr(targets)
+    sys.exit(0)
+
+exit_status = 0
+for target in targets:
+    if not os.path.isdir(target):
+        print >> stderr, repr(target), 'is not a directory'
+        exit_status = 1
+        continue
+    top = os.path.realpath(target)
+    proc_mounts = open('/proc/mounts', 'r')
+    for line in proc_mounts:
+        _, point, fstype, _ = line.split(' ', 3)
+        point = mntent_unescape(point)
+        if top == point or os.path.commonprefix((top + '/', point)) == top + '/':
+            if fstype.startswith('fuse'):
+                if subprocess.call(['fusermount', '-uz', point]) != 0:
+                    exit_status = 1
+            else:
+                if subprocess.call(['umount', '-l', point]) != 0:
+                    exit_status = 1
+
+sys.exit(exit_status)
diff --git a/dev/compare-trees b/dev/compare-trees
new file mode 100755 (executable)
index 0000000..aeaa086
--- /dev/null
@@ -0,0 +1,89 @@
+#!/usr/bin/env bash
+
+set -u
+
+# Test that src and dest trees are as identical as bup is capable of
+# making them.  For now, use rsync -niaHAX ...
+
+usage() {
+cat <<EOF
+Usage: compare-trees [-h] [-c] [-x] SOURCE DEST
+OPTIONS:
+  -h
+    Display help
+  -c
+    Check file content (default)
+  -x
+    Don't check file content (rely on size/timestamps, etc.)
+EOF
+}
+
+verify_content=" --checksum"
+
+while getopts "hcx" OPTION
+do
+    case "$OPTION" in
+        h) usage; exit 0;;
+        c) verify_content=" --checksum";;
+        x) verify_content="";;
+        ?) usage 1>&2; exit 1;;
+    esac
+done
+
+shift $(($OPTIND - 1)) || exit $?
+
+if ! test $# -eq 2
+then
+    usage 1>&2
+    exit 1
+fi
+
+src="$1"
+dest="$2"
+
+tmpfile="$(mktemp /tmp/bup-test-XXXXXXX)" || exit $?
+trap "rm -rf '$tmpfile'" EXIT || exit $?
+
+rsync_opts="-niaH$verify_content --delete"
+
+rsync_version=$(rsync --version)
+if [[ ! "$rsync_version" =~ "ACLs" ]] || [[ "$rsync_version" =~ "no ACLs" ]]; then
+    echo "Not comparing ACLs (not supported by available rsync)" 1>&2
+else
+    case $OSTYPE in
+        cygwin|darwin|netbsd)
+            echo "Not comparing ACLs (not yet supported on $OSTYPE)" 1>&2
+            ;;
+        *)
+            rsync_opts="$rsync_opts -A"
+            ;;
+    esac
+fi
+
+xattrs_available=''
+if [[ ! "$rsync_version" =~ "xattrs" ]] || [[ "$rsync_version" =~ "no xattrs" ]]; then
+    echo "Not comparing xattrs (not supported by available rsync)" 1>&2
+else
+    xattrs_available=yes
+fi
+
+# Even in dry-run mode, rsync may fail if -X is specified and the
+# filesystems don't support xattrs.
+
+if test "$xattrs_available"; then
+    rsync $rsync_opts -X "$src" "$dest" > "$tmpfile"
+    if test $? -ne 0; then
+        # Try again without -X
+        rsync $rsync_opts "$src" "$dest" > "$tmpfile" || exit $?
+    fi
+else
+    rsync $rsync_opts "$src" "$dest" > "$tmpfile" || exit $?
+fi
+
+if test $(wc -l < "$tmpfile") != 0; then
+    echo "Differences between $src and $dest" 1>&2
+    cat "$tmpfile"
+    exit 1
+fi
+
+exit 0
diff --git a/dev/configure-sampledata b/dev/configure-sampledata
new file mode 100755 (executable)
index 0000000..c24a79c
--- /dev/null
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash
+
+set -o pipefail
+
+# NOTE: any relevant changes to var/ must be accompanied by an
+# increment to the revision.
+
+revision=3
+
+top="$(pwd)" || exit $?
+
+usage()
+{
+    echo 'Usage: dev/configure-sampledata [--setup | --clean | --revision]'
+}
+
+if test "$#" -ne 1; then
+    usage 1>&2; exit 1
+fi
+
+rm_symlinks()
+{
+    for p in "$@"; do
+        # test -e is false for dangling symlinks.
+        if test -h "$p" -o -e "$p"; then rm "$p" || exit $?; fi
+    done
+}
+
+clean()
+(
+    cd test/sampledata || exit $?
+    if test -e var; then rm -r var || exit $?; fi
+    # Remove legacy content (before everything moved to var/).
+    rm_symlinks abs-symlink b c etc
+)
+
+case "$1" in
+    --setup)
+        (
+            clean
+            mkdir -p test/sampledata/var/rev || exit $?
+            cd test/sampledata/var || exit $?
+            ln -sf a b || exit $?
+            ln -sf b c || exit $?
+            ln -sf "$(pwd)/abs-symlink-target" abs-symlink || exit $?
+            mkfifo fifo
+            mkdir -p cmd doc lib/bup || exit $?
+            cp -pP "$top"/cmd/*.py cmd/ || exit $?
+            cp -pP "$top"/Documentation/*.md doc/ || exit $?
+            cp -pP "$top"/lib/bup/*.py lib/bup || exit $?
+            mkdir path-zoo || exit $?
+            if test "$BUP_TEST_RANDOMIZED_SAMPLEDATA_PATHS"; then
+                "$top"/dev/make-random-paths 3000 path-zoo || exit $?
+            fi
+            # The "v" ensures that if "configure-sampledata
+            # --revision" and/or the setup above fails somehow,
+            # callers like make will be looking for a file that won't
+            # exist.
+            touch rev/v$revision || exit $?
+        ) || exit $?
+        ;;
+    --clean)
+        clean
+        ;;
+    --revision)
+        echo "$revision" || exit $?
+        ;;
+    *)
+        usage 1>&2; exit 1
+        ;;
+esac
diff --git a/dev/data-size b/dev/data-size
new file mode 100755 (executable)
index 0000000..e5068da
--- /dev/null
@@ -0,0 +1,28 @@
+#!/bin/sh
+"""": # -*-python-*-
+bup_python="$(dirname "$0")/../config/bin/python" || exit $?
+exec "$bup_python" "$0" ${1+"$@"}
+"""
+# end of bup preamble
+
+from __future__ import absolute_import, print_function
+
+from os.path import getsize, isdir
+from sys import argv, stderr
+import os
+
+def listdir_failure(ex):
+    raise ex
+
+def usage():
+    print('Usage: data-size PATH ...', file=sys.stderr)
+
+total = 0
+for path in argv[1:]:
+    if isdir(path):
+        for root, dirs, files in os.walk(path, onerror=listdir_failure):
+            total += sum(getsize(os.path.join(root, name)) for name in files)
+    else:
+        total += getsize(path)
+
+print(total)
diff --git a/dev/echo-argv-bytes b/dev/echo-argv-bytes
new file mode 100755 (executable)
index 0000000..1be7288
--- /dev/null
@@ -0,0 +1,30 @@
+#!/bin/sh
+"""": # -*-python-*-
+# https://sourceware.org/bugzilla/show_bug.cgi?id=26034
+export "BUP_ARGV_0"="$0"
+arg_i=1
+for arg in "$@"; do
+    export "BUP_ARGV_${arg_i}"="$arg"
+    shift
+    arg_i=$((arg_i + 1))
+done
+bup_python="$(dirname "$0")/../config/bin/python" || exit $?
+exec "$bup_python" "$0"
+"""
+# end of bup preamble
+
+from __future__ import absolute_import, print_function
+
+from os.path import abspath, dirname
+from sys import stdout
+import os, sys
+
+script_home = abspath(dirname(__file__))
+sys.path[:0] = [abspath(script_home + '/../lib'), abspath(script_home + '/..')]
+
+from bup import compat
+
+for arg in compat.argvb:
+    os.write(stdout.fileno(), arg)
+    os.write(stdout.fileno(), b'\0\n')
+    stdout.flush()
diff --git a/dev/force-delete b/dev/force-delete
new file mode 100755 (executable)
index 0000000..cb12732
--- /dev/null
@@ -0,0 +1,32 @@
+#!/usr/bin/env bash
+
+set -o pipefail
+
+# Try *hard* to delete $@.  Among other things, some systems have
+# r-xr-xr-x for root and other system dirs.
+
+rc=0
+rm -rf "$@" # Maybe we'll get lucky.
+for f in "$@"; do
+    test -e "$f" || continue
+    if test "$(type -p setfacl)"; then
+        setfacl -Rb "$f"
+    fi
+    if test "$(type -p chattr)"; then
+        chattr -R -aisu "$f"
+    fi
+    chmod -R u+rwX "$f"
+    rm -r "$f"
+    if test -e "$f"; then
+        rc=1
+        find "$f" -ls
+        lsattr -aR "$f"
+        getfacl -R "$f"
+    fi
+done
+
+if test "$rc" -ne 0; then
+    echo "Failed to delete everything" 1>&2
+fi
+
+exit "$rc"
diff --git a/dev/git-cat-tree b/dev/git-cat-tree
new file mode 100755 (executable)
index 0000000..3a12f4d
--- /dev/null
@@ -0,0 +1,55 @@
+#!/usr/bin/env bash
+
+# Recursively dump all blobs in the subtree identified by ID.
+
+set -o pipefail
+
+usage() {
+cat <<EOF
+Usage: cat-git-tree [--git-dir DIR] ID
+EOF
+}
+
+cat-item()
+{
+    local hash="$1"
+    local type="$2"
+    case "$type" in
+        blob)
+            git cat-file blob "$hash" || exit $?
+            ;;
+        tree)
+            local tree=$(git ls-tree "$hash") || exit $?
+            while read -r line; do
+                local sub_type=$(echo "$line" | cut -d' ' -f 2) || exit $?
+                local sub_hash=$(echo "$line" | cut -d' ' -f 3) || exit $?
+                sub_hash=$(echo "$sub_hash" | cut -d'  ' -f 1) || exit $?
+                cat-item "$sub_hash" "$sub_type"
+            done <<< "$tree"
+            ;;
+        *)
+            echo "Unexpected item: $type $hash" 1>&2
+            exit 1
+            ;;
+    esac
+}
+
+case $# in
+    1) ;;
+    3)
+        if test "$1" != --git-dir; then
+            usage 1>&2
+            exit 1
+        fi
+        export GIT_DIR="$2"
+        shift 2
+        ;;
+    *)
+        usage 1>&2
+        exit 1
+        ;;
+esac
+
+top="$1"
+type=$(git cat-file -t "$top") || exit $?
+cat-item "$top" "$type"
diff --git a/dev/hardlink-sets b/dev/hardlink-sets
new file mode 100755 (executable)
index 0000000..a0329f8
--- /dev/null
@@ -0,0 +1,69 @@
+#!/bin/sh
+"""": # -*-python-*-
+# https://sourceware.org/bugzilla/show_bug.cgi?id=26034
+export "BUP_ARGV_0"="$0"
+arg_i=1
+for arg in "$@"; do
+    export "BUP_ARGV_${arg_i}"="$arg"
+    shift
+    arg_i=$((arg_i + 1))
+done
+bup_python="$(dirname "$0")/bup-python" || exit $?
+exec "$bup_python" "$0"
+"""
+# end of bup preamble
+
+from __future__ import absolute_import, print_function
+import os, stat, sys
+
+from bup import compat
+from bup.io import byte_stream
+
+
+# Print the full paths of all the files in each hardlink set
+# underneath one of the paths.  Separate sets with a blank line, sort
+# the paths within each set, and sort the sets by their first path.
+
+def usage():
+    print("Usage: hardlink-sets <paths ...>", file=sys.stderr)
+
+if len(compat.argv) < 2:
+    usage()
+    sys.exit(1)
+
+def on_walk_error(e):
+    raise e
+
+sys.stdout.flush()
+out = byte_stream(sys.stdout)
+
+hardlink_set = {}
+
+for p in compat.argvb[1:]:
+  for root, dirs, files in os.walk(p, onerror = on_walk_error):
+      for filename in files:
+          full_path = os.path.join(root, filename)
+          st = os.lstat(full_path)
+          if not stat.S_ISDIR(st.st_mode):
+              node = b'%d:%d' % (st.st_dev, st.st_ino)
+              link_paths = hardlink_set.get(node)
+              if link_paths:
+                  link_paths.append(full_path)
+              else:
+                  hardlink_set[node] = [full_path]
+
+# Sort the link sets.
+for node, link_paths in hardlink_set.items():
+    link_paths.sort()
+
+first_set = True
+for link_paths in sorted(hardlink_set.values(), key = lambda x : x[0]):
+    if len(link_paths) > 1:
+        if first_set:
+            first_set = False
+        else:
+            out.write(b'\n')
+        for p in sorted(link_paths):
+            out.write(p + b'\n')
+
+sys.exit(0)
diff --git a/dev/id-other-than b/dev/id-other-than
new file mode 100755 (executable)
index 0000000..e54696a
--- /dev/null
@@ -0,0 +1,51 @@
+#!/bin/sh
+"""": # -*-python-*-
+bup_python="$(dirname "$0")/../config/bin/python" || exit $?
+exec "$bup_python" "$0" ${1+"$@"}
+"""
+# end of bup preamble
+
+# Note: this currently relies on bup-python to handle arbitrary binary
+# user/group names.
+
+from __future__ import absolute_import, print_function
+
+import grp
+import pwd
+import sys
+
+def usage():
+    print('Usage: id-other-than <--user|--group> ID [ID ...]',
+          file=sys.stderr)
+
+if len(sys.argv) < 2:
+    usage()
+    sys.exit(1)
+
+def is_integer(x):
+    try:
+        int(x)
+        return True
+    except ValueError as e:
+        return False
+
+excluded_ids = set(int(x) for x in sys.argv[2:] if is_integer(x))
+excluded_names = (x for x in sys.argv[2:] if not is_integer(x))
+
+if sys.argv[1] == '--user':
+    for x in excluded_names:
+        excluded_ids.add(pwd.getpwnam(x).pw_uid)
+    for x in pwd.getpwall():
+        if x.pw_uid not in excluded_ids:
+            print(x.pw_name + ':' + str(x.pw_uid))
+            sys.exit(0)
+elif sys.argv[1] == '--group':
+    for x in excluded_names:
+        excluded_ids.add(grp.getgrnam(x).gr_gid)
+    for x in grp.getgrall():
+        if x.gr_gid not in excluded_ids:
+            print(x.gr_name + ':' + str(x.gr_gid))
+            sys.exit(0)
+else:
+    usage()
+    sys.exit(1)
diff --git a/dev/lib.sh b/dev/lib.sh
new file mode 100644 (file)
index 0000000..20780e2
--- /dev/null
@@ -0,0 +1,57 @@
+# Assumes shell is Bash, and pipefail is set.
+
+# Assumes this is always loaded while pwd is still the source tree root
+bup_dev_lib_top=$(pwd) || exit $?
+
+bup-cfg-py() { "$bup_dev_lib_top/config/bin/python" "$@"; }
+bup-python() { "$bup_dev_lib_top/dev/bup-python" "$@"; }
+
+force-delete()
+{
+    "$bup_dev_lib_top/dev/force-delete" "$@"
+}
+
+resolve-parent()
+{
+    test "$#" -eq 1 || return $?
+    echo "$1" | \
+        bup-python \
+            -c "import sys, bup.helpers; print(bup.helpers.resolve_parent(sys.stdin.readline()))" \
+        || return $?
+}
+
+current-filesystem()
+{
+    local kernel="$(uname -s)" || return $?
+    case "$kernel" in
+        NetBSD)
+            df -G . | sed -En 's/.* ([^ ]*) fstype.*/\1/p'
+            ;;
+        SunOS)
+            df -g . | sed -En 's/.* ([^ ]*) fstype.*/\1/p'
+            ;;
+        *)
+            df -T . | awk 'END{print $2}'
+    esac
+}
+
+path-filesystems()
+(
+    # Return filesystem for each dir from $1 to /.
+    # Perhaps for /foo/bar, "ext4\next4\nbtrfs\n".
+    test "$#" -eq 1 || exit $?
+    cd "$1" || exit $?
+    current-filesystem || exit $?
+    dir="$(pwd)" || exit $?
+    while test "$dir" != /; do
+        cd .. || exit $?
+        dir="$(pwd)" || exit $?
+        current-filesystem || exit $?
+    done
+    exit 0
+)
+
+escape-erx()
+{
+    sed 's/[][\.|$(){?+*^]/\\&/g' <<< "$*"
+}
diff --git a/dev/make-random-paths b/dev/make-random-paths
new file mode 100755 (executable)
index 0000000..05d24f4
--- /dev/null
@@ -0,0 +1,53 @@
+#!/bin/sh
+"""": # -*-python-*-
+bup_python="$(dirname "$0")//bup-python" || exit $?
+exec "$bup_python" "$0" ${1+"$@"}
+"""
+# end of bup preamble
+
+from __future__ import absolute_import, print_function
+
+from os.path import abspath, dirname
+from random import randint
+from sys import argv, exit, stderr, stdout
+import errno, re, sys
+
+from bup.compat import fsencode, range
+
+
+def usage(out=stdout):
+    print('Usage:', argv[0], 'NUM', 'DEST_DIR', file=out)
+
+def misuse():
+    usage(stderr)
+    exit(2)
+
+if sys.version_info[0] >= 3:
+    def bytes_from_ints(ints):
+        return bytes(ints)
+else:
+    def bytes_from_ints(ints):
+        return ''.join([chr(x) for x in ints])
+
+invalid_fragments = re.compile(br'(\x00|[./]|\.\.)')
+
+def random_filename():
+    n = randint(1, 32)
+    def random_candidate():
+        return invalid_fragments.sub(b'', bytes_from_ints([randint(1, 255)
+                                                           for x in range(n)]))
+    candidate = random_candidate()
+    while not candidate:
+        candidate = random_candidate()
+    return candidate
+
+if len(argv) != 3:
+    misuse()
+
+count, dest = argv[1:]
+count = int(count)
+
+i = 0
+while i < count:
+    with open(fsencode(dest) + b'/' + random_filename(), 'w') as _:
+        i += 1
diff --git a/dev/mksock b/dev/mksock
new file mode 100755 (executable)
index 0000000..88372c3
--- /dev/null
@@ -0,0 +1,13 @@
+#!/bin/sh
+"""": # -*-python-*-
+bup_python="$(dirname "$0")/../config/bin/python" || exit $?
+exec "$bup_python" "$0" ${1+"$@"}
+"""
+# end of bup preamble
+
+from __future__ import absolute_import
+
+import socket, sys
+
+s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0)
+s.bind(sys.argv[1])
diff --git a/dev/ns-timestamp-resolutions b/dev/ns-timestamp-resolutions
new file mode 100755 (executable)
index 0000000..1938e78
--- /dev/null
@@ -0,0 +1,62 @@
+#!/bin/sh
+"""": # -*-python-*-
+# https://sourceware.org/bugzilla/show_bug.cgi?id=26034
+export "BUP_ARGV_0"="$0"
+arg_i=1
+for arg in "$@"; do
+    export "BUP_ARGV_${arg_i}"="$arg"
+    shift
+    arg_i=$((arg_i + 1))
+done
+bup_python="$(dirname "$0")/bup-python" || exit $?
+exec "$bup_python" "$0"
+"""
+# end of bup preamble
+
+from __future__ import absolute_import
+import os.path, sys
+
+sys.path[:0] = [os.path.dirname(os.path.realpath(__file__)) + '/../lib']
+
+from bup.compat import argv_bytes
+from bup.helpers import handle_ctrl_c, saved_errors
+from bup.io import byte_stream
+from bup import compat, metadata, options
+import bup.xstat as xstat
+
+
+optspec = """
+ns-timestamp-resolutions TEST_FILE_NAME
+--
+"""
+
+handle_ctrl_c()
+
+o = options.Options(optspec)
+opt, flags, extra = o.parse(compat.argv[1:])
+
+sys.stdout.flush()
+out = byte_stream(sys.stdout)
+
+if len(extra) != 1:
+    o.fatal('must specify a test file name')
+
+target = argv_bytes(extra[0])
+
+open(target, 'w').close()
+xstat.utime(target, (123456789, 123456789))
+meta = metadata.from_path(target)
+
+def ns_resolution(x):
+    n = 1;
+    while n < 10**9 and x % 10 == 0:
+        x /= 10
+        n *= 10
+    return n
+
+out.write(b'%d %d\n' % (ns_resolution(meta.atime),
+                        ns_resolution(meta.mtime)))
+
+if saved_errors:
+    log('warning: %d errors encountered\n' % len(saved_errors))
+    sys.exit(1)
diff --git a/dev/perf-glance b/dev/perf-glance
new file mode 100755 (executable)
index 0000000..8151f6b
--- /dev/null
@@ -0,0 +1,64 @@
+#!/usr/bin/env bash
+
+set -ueo pipefail
+
+if test $# -lt 1; then
+    echo "Usage: perf-glance SRC_DATA_PATH..." 1>&2
+    exit 1
+fi
+set -x
+src_data=("$@")
+
+top="$(pwd)"
+script_name="$(basename $0)"
+
+mkdir -p "$top/test/tmp"
+tmpdir="$(mktemp -d "$top/test/tmp/$script_name-XXXXXXX")"
+
+export BUP_DIR="$tmpdir/bup"
+
+bup()
+{
+    "$top/bup" "$@"
+}
+
+get-time()
+{
+    python -c 'import time; print(time.time())'
+}
+
+rm -rf "$BUP_DIR"
+
+all_start="$(get-time)"
+
+init_start="$(get-time)"
+bup init
+init_finish="$(get-time)"
+
+index_start="$(get-time)"
+bup index "${src_data[@]}"
+index_finish="$(get-time)"
+
+save_start="$(get-time)"
+bup save -t -n data "${src_data[@]}"
+save_finish="$(get-time)"
+
+mkdir "$tmpdir/restore"
+restore_start="$(get-time)"
+bup restore -C "$tmpdir/restore" "/data/latest/"
+restore_finish="$(get-time)"
+
+all_finish="$(get-time)"
+
+set +x
+cat <<EOS
+
+init: $(python -c "print($init_finish - $init_start)")
+index: $(python -c "print($index_finish - $index_start)")
+save: $(python -c "print($save_finish - $save_start)")
+restore: $(python -c "print($restore_finish - $restore_start)")
+all: $(python -c "print($all_finish - $all_start)")
+EOS
+
+cd "$top"
+rm -r "$tmpdir"
diff --git a/dev/root-status b/dev/root-status
new file mode 100755 (executable)
index 0000000..c37806d
--- /dev/null
@@ -0,0 +1,24 @@
+#!/bin/sh
+"""": # -*-python-*-
+bup_python="$(dirname "$0")/../config/bin/python" || exit $?
+exec "$bup_python" "$0" ${1+"$@"}
+"""
+# end of bup preamble
+
+from __future__ import absolute_import, print_function
+import os, sys
+
+if sys.platform.startswith('cygwin'):
+    groups = os.getgroups()
+    if 544 in groups or 0 in groups:
+        print('root')
+    else:
+        print('none')
+else:
+    if os.environ.get('FAKEROOTKEY'):
+        print('fake')
+    else:
+        if os.geteuid() == 0:
+            print('root')
+        else:
+            print('none')
diff --git a/dev/sparse-test-data b/dev/sparse-test-data
new file mode 100755 (executable)
index 0000000..002e525
--- /dev/null
@@ -0,0 +1,97 @@
+#!/bin/sh
+"""": # -*-python-*-
+bup_python="$(dirname "$0")/bup-python" || exit $?
+exec "$bup_python" "$0" ${1+"$@"}
+"""
+
+from __future__ import absolute_import, print_function
+from random import randint
+from sys import stderr, stdout
+import os, sys
+
+from bup.io import byte_stream
+
+def smaller_region(max_offset):
+    start = randint(0, max_offset)
+    return (start, min(max_offset, randint(start + 1, start + 5)))
+
+
+def possibly_larger_region(max_offset, min_sparse_len):
+    start = randint(0, max_offset)
+    return (start, min(max_offset, randint(start + 1,
+                                           start + 3 * min_sparse_len)))
+
+
+def initial_region(max_offset, min_sparse_len):
+    start = 0
+    return (start, min(max_offset, randint(start + 1,
+                                           start + 3 * min_sparse_len)))
+
+
+def final_region(max_offset, min_sparse_len):
+    start = max(0, randint(max_offset - 3 * min_sparse_len,
+                           max_offset - 1))
+    return (start, max_offset)
+
+
+def region_around_min_len(max_offset, min_sparse_len):
+    start = randint(0, max_offset)
+    return (start, min(max_offset, randint(start + min_sparse_len - 5,
+                                           start + min_sparse_len + 5)))
+
+
+generators = []
+
+def random_region():
+    global generators
+    return generators[randint(0, len(generators) - 1)]()
+
+if len(sys.argv) == 0:
+    stdout.flush()
+    out = byte_stream(stdout)
+if len(sys.argv) == 2:
+    out = open(sys.argv[1], 'wb')
+else:
+    print('Usage: sparse-test-data [FILE]', file=stderr)
+    sys.exit(2)
+
+bup_read_size = 2 ** 16
+bup_min_sparse_len = 512
+out_size = randint(0, bup_read_size * 10)
+
+generators = (lambda : smaller_region(out_size),
+              lambda : possibly_larger_region(out_size, bup_min_sparse_len),
+              lambda : initial_region(out_size, bup_min_sparse_len),
+              lambda : final_region(out_size, bup_min_sparse_len),
+              lambda : region_around_min_len(out_size, bup_min_sparse_len))
+
+sparse = []
+sparse.append(random_region())
+sparse.append(random_region())
+
+# Handle overlaps
+if sparse[1][0] < sparse[0][0]:
+    sparse[0], sparse[1] = sparse[1], sparse[0]
+
+sparse_offsets = []
+sparse_offsets.append(sparse[0][0])
+if sparse[1][0] <= sparse[0][1]:
+    sparse_offsets.append(max(sparse[0][1], sparse[1][1]))
+else:
+    sparse_offsets.extend((sparse[0][1], sparse[1][0], sparse[1][1]))
+
+if sparse[1][1] != out_size:
+    sparse_offsets.append(out_size)
+
+# Now sparse_offsets indicates where to start/stop zero runs
+data = b'x'
+pos = 0
+print('offsets:', sparse_offsets, file=stderr)
+for offset in sparse_offsets:
+    count = offset - pos
+    print('write:', 'x' if data == 'x' else '0', count, file=stderr)
+    out.write(data * (offset - pos))
+    pos += count
+    data = b'\0' if data == b'x' else b'x'
+
+out.close()
diff --git a/dev/subtree-hash b/dev/subtree-hash
new file mode 100755 (executable)
index 0000000..84f1682
--- /dev/null
@@ -0,0 +1,56 @@
+#!/bin/sh
+"""": # -*-python-*-
+bup_python="$(dirname "$0")/bup-python" || exit $?
+exec "$bup_python" "$0" ${1+"$@"}
+"""
+# end of bup preamble
+
+from __future__ import absolute_import, print_function
+import os.path, sys
+
+from bup.compat import argv_bytes
+from bup.helpers import handle_ctrl_c, readpipe
+from bup.io import byte_stream
+from bup import options
+
+
+optspec = """
+subtree-hash ROOT_HASH [PATH_ITEM...]
+--
+"""
+
+handle_ctrl_c()
+
+o = options.Options(optspec)
+(opt, flags, extra) = o.parse(sys.argv[1:])
+
+if len(extra) < 1:
+    o.fatal('must specify a root hash')
+
+tree_hash = argv_bytes(extra[0])
+path = [argv_bytes(x) for x in extra[1:]]
+
+while path:
+    target_name = path[0]
+    subtree_items = readpipe([b'git', b'ls-tree', b'-z', tree_hash])
+    target_hash = None
+    for entry in subtree_items.split(b'\0'):
+        if not entry:
+            break
+        info, name = entry.split(b'\t', 1)
+        if name == target_name:
+            _, _, target_hash = info.split(b' ')
+            break
+    if not target_hash:
+        print("Can't find %r in %s" % (target_name, tree_hash.decode('ascii')),
+              file=sys.stderr)
+        break
+    tree_hash = target_hash
+    path = path[1:]
+
+if path:
+    sys.exit(1)
+
+sys.stdout.flush()
+out = byte_stream(sys.stdout)
+out.write(tree_hash + b'\n')
diff --git a/dev/sync-tree b/dev/sync-tree
new file mode 100755 (executable)
index 0000000..11d4abe
--- /dev/null
@@ -0,0 +1,69 @@
+#!/usr/bin/env bash
+
+set -u
+
+usage() {
+cat <<EOF
+Usage: sync-tree [-h] [-c] [-x] SOURCE/ DEST/
+  Make the DEST tree match SOURCE as closely as possible
+OPTIONS:
+  -h
+    Display help
+EOF
+}
+
+while getopts "h" OPTION
+do
+    case "$OPTION" in
+        h) usage; exit 0;;
+        ?) usage 1>&2; exit 1;;
+    esac
+done
+
+shift $(($OPTIND - 1)) || exit $?
+
+if ! test $# -eq 2
+then
+    usage 1>&2
+    exit 1
+fi
+
+src="$1"
+dest="$2"
+
+rsync_opts="-aH --delete"
+
+rsync_version=$(rsync --version)
+if [[ ! "$rsync_version" =~ "ACLs" ]] || [[ "$rsync_version" =~ "no ACLs" ]]; then
+    echo "Not syncing ACLs (not supported by available rsync)" 1>&2
+else
+    case $OSTYPE in
+        cygwin|darwin|netbsd)
+            echo "Not syncing ACLs (not yet supported on $OSTYPE)" 1>&2
+            ;;
+        *)
+            rsync_opts="$rsync_opts -A"
+            ;;
+    esac
+fi
+
+xattrs_available=''
+if [[ ! "$rsync_version" =~ "xattrs" ]] || [[ "$rsync_version" =~ "no xattrs" ]]; then
+    echo "Not syncing xattrs (not supported by available rsync)" 1>&2
+else
+    xattrs_available=yes
+fi
+
+
+# rsync may fail if -X is specified and the filesystems don't support
+# xattrs.
+
+if test "$xattrs_available"; then
+    rsync $rsync_opts -X "$src" "$dest"
+    if test $? -ne 0; then
+        # Try again without -X
+        exec rsync $rsync_opts "$src" "$dest"
+    fi
+else
+    exec rsync $rsync_opts "$src" "$dest"
+fi
diff --git a/dev/unknown-owner b/dev/unknown-owner
new file mode 100755 (executable)
index 0000000..937e708
--- /dev/null
@@ -0,0 +1,29 @@
+#!/bin/sh
+"""": # -*-python-*-
+bup_python="$(dirname "$0")/../config/bin/python" || exit $?
+exec "$bup_python" "$0" ${1+"$@"}
+"""
+# end of bup preamble
+
+from __future__ import absolute_import, print_function
+
+import grp
+import pwd
+import sys
+
+def usage():
+    print("Usage: unknown-owner (--user | --group)", file=sys.stderr)
+
+if len(sys.argv) != 2:
+    usage()
+    sys.exit(1)
+
+if sys.argv[1] == '--user':
+    max_name_len = max([len(x.pw_name) for x in pwd.getpwall()])
+elif sys.argv[1] == '--group':
+    max_name_len = max([len(x.gr_name) for x in grp.getgrall()])
+else:
+    usage()
+    sys.exit(1)
+
+print('x' * (max_name_len + 1))
diff --git a/lib/bup/t/__init__.py b/lib/bup/t/__init__.py
deleted file mode 100644 (file)
index 580ba19..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-
-from __future__ import absolute_import
-import sys
-
-sys.path[:0] = ['../..']
diff --git a/lib/bup/t/tbloom.py b/lib/bup/t/tbloom.py
deleted file mode 100644 (file)
index 3fa9f35..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-
-from __future__ import absolute_import, print_function
-import errno, platform, tempfile
-
-from wvtest import *
-
-from bup import bloom
-from bup.helpers import mkdirp
-from buptest import no_lingering_errors, test_tempdir
-
-
-@wvtest
-def test_bloom():
-    with no_lingering_errors():
-        with test_tempdir(b'bup-tbloom-') as tmpdir:
-            hashes = [os.urandom(20) for i in range(100)]
-            class Idx:
-                pass
-            ix = Idx()
-            ix.name = b'dummy.idx'
-            ix.shatable = b''.join(hashes)
-            for k in (4, 5):
-                b = bloom.create(tmpdir + b'/pybuptest.bloom', expected=100, k=k)
-                b.add_idx(ix)
-                WVPASSLT(b.pfalse_positive(), .1)
-                b.close()
-                b = bloom.ShaBloom(tmpdir + b'/pybuptest.bloom')
-                all_present = True
-                for h in hashes:
-                    all_present &= (b.exists(h) or False)
-                WVPASS(all_present)
-                false_positives = 0
-                for h in [os.urandom(20) for i in range(1000)]:
-                    if b.exists(h):
-                        false_positives += 1
-                WVPASSLT(false_positives, 5)
-                os.unlink(tmpdir + b'/pybuptest.bloom')
-
-            tf = tempfile.TemporaryFile(dir=tmpdir)
-            b = bloom.create(b'bup.bloom', f=tf, expected=100)
-            WVPASSEQ(b.rwfile, tf)
-            WVPASSEQ(b.k, 5)
-
-            # Test large (~1GiB) filter.  This may fail on s390 (31-bit
-            # architecture), and anywhere else where the address space is
-            # sufficiently limited.
-            tf = tempfile.TemporaryFile(dir=tmpdir)
-            skip_test = False
-            try:
-                b = bloom.create(b'bup.bloom', f=tf, expected=2**28,
-                                 delaywrite=False)
-            except EnvironmentError as ex:
-                (ptr_width, linkage) = platform.architecture()
-                if ptr_width == '32bit' and ex.errno == errno.ENOMEM:
-                    WVMSG('skipping large bloom filter test (mmap probably failed) '
-                          + str(ex))
-                    skip_test = True
-                else:
-                    raise
-            if not skip_test:
-                WVPASSEQ(b.k, 4)
diff --git a/lib/bup/t/tclient.py b/lib/bup/t/tclient.py
deleted file mode 100644 (file)
index 2eca440..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-
-from __future__ import absolute_import
-import sys, os, stat, time, random, subprocess, glob
-
-from wvtest import *
-
-from bup import client, git, path
-from bup.compat import bytes_from_uint, environ, range
-from bup.helpers import mkdirp
-from buptest import no_lingering_errors, test_tempdir
-
-
-def randbytes(sz):
-    s = b''
-    for i in range(sz):
-        s += bytes_from_uint(random.randrange(0,256))
-    return s
-
-
-s1 = randbytes(10000)
-s2 = randbytes(10000)
-s3 = randbytes(10000)
-
-IDX_PAT = b'/*.idx'
-    
-
-@wvtest
-def test_server_split_with_indexes():
-    with no_lingering_errors():
-        with test_tempdir(b'bup-tclient-') as tmpdir:
-            environ[b'BUP_DIR'] = bupdir = tmpdir
-            git.init_repo(bupdir)
-            lw = git.PackWriter()
-            c = client.Client(bupdir, create=True)
-            rw = c.new_packwriter()
-
-            lw.new_blob(s1)
-            lw.close()
-
-            rw.new_blob(s2)
-            rw.breakpoint()
-            rw.new_blob(s1)
-            rw.close()
-    
-
-@wvtest
-def test_multiple_suggestions():
-    with no_lingering_errors():
-        with test_tempdir(b'bup-tclient-') as tmpdir:
-            environ[b'BUP_DIR'] = bupdir = tmpdir
-            git.init_repo(bupdir)
-
-            lw = git.PackWriter()
-            lw.new_blob(s1)
-            lw.close()
-            lw = git.PackWriter()
-            lw.new_blob(s2)
-            lw.close()
-            WVPASSEQ(len(glob.glob(git.repo(b'objects/pack'+IDX_PAT))), 2)
-
-            c = client.Client(bupdir, create=True)
-            WVPASSEQ(len(glob.glob(c.cachedir+IDX_PAT)), 0)
-            rw = c.new_packwriter()
-            s1sha = rw.new_blob(s1)
-            WVPASS(rw.exists(s1sha))
-            s2sha = rw.new_blob(s2)
-
-            # This is a little hacky, but ensures that we test the
-            # code under test. First, flush to ensure that we've
-            # actually sent all the command ('receive-objects-v2')
-            # and their data to the server. This may be needed if
-            # the output buffer size is bigger than the data (both
-            # command and objects) we're writing. To see the need
-            # for this, change the object sizes at the beginning
-            # of this file to be very small (e.g. 10 instead of 10k)
-            c.conn.outp.flush()
-
-            # Then, check if we've already received the idx files.
-            # This may happen if we're preempted just after writing
-            # the data, then the server runs and suggests, and only
-            # then we continue in PackWriter_Remote::_raw_write()
-            # and check the has_input(), in that case we'll receive
-            # the idx still in the rw.new_blob() calls above.
-            #
-            # In most cases though, that doesn't happen, and we'll
-            # get past the has_input() check before the server has
-            # a chance to respond - it has to actually hash the new
-            # object here, so it takes some time. So also break out
-            # of the loop if the server has sent something on the
-            # connection.
-            #
-            # Finally, abort this after a little while (about one
-            # second) just in case something's actually broken.
-            n = 0
-            while (len(glob.glob(c.cachedir+IDX_PAT)) < 2 and
-                   not c.conn.has_input() and n < 10):
-                time.sleep(0.1)
-                n += 1
-            WVPASS(len(glob.glob(c.cachedir+IDX_PAT)) == 2 or c.conn.has_input())
-            rw.new_blob(s2)
-            WVPASS(rw.objcache.exists(s1sha))
-            WVPASS(rw.objcache.exists(s2sha))
-            rw.new_blob(s3)
-            WVPASSEQ(len(glob.glob(c.cachedir+IDX_PAT)), 2)
-            rw.close()
-            WVPASSEQ(len(glob.glob(c.cachedir+IDX_PAT)), 3)
-
-
-@wvtest
-def test_dumb_client_server():
-    with no_lingering_errors():
-        with test_tempdir(b'bup-tclient-') as tmpdir:
-            environ[b'BUP_DIR'] = bupdir = tmpdir
-            git.init_repo(bupdir)
-            open(git.repo(b'bup-dumb-server'), 'w').close()
-
-            lw = git.PackWriter()
-            lw.new_blob(s1)
-            lw.close()
-
-            c = client.Client(bupdir, create=True)
-            rw = c.new_packwriter()
-            WVPASSEQ(len(glob.glob(c.cachedir+IDX_PAT)), 1)
-            rw.new_blob(s1)
-            WVPASSEQ(len(glob.glob(c.cachedir+IDX_PAT)), 1)
-            rw.new_blob(s2)
-            rw.close()
-            WVPASSEQ(len(glob.glob(c.cachedir+IDX_PAT)), 2)
-
-
-@wvtest
-def test_midx_refreshing():
-    with no_lingering_errors():
-        with test_tempdir(b'bup-tclient-') as tmpdir:
-            environ[b'BUP_DIR'] = bupdir = tmpdir
-            git.init_repo(bupdir)
-            c = client.Client(bupdir, create=True)
-            rw = c.new_packwriter()
-            rw.new_blob(s1)
-            p1base = rw.breakpoint()
-            p1name = os.path.join(c.cachedir, p1base)
-            s1sha = rw.new_blob(s1)  # should not be written; it's already in p1
-            s2sha = rw.new_blob(s2)
-            p2base = rw.close()
-            p2name = os.path.join(c.cachedir, p2base)
-            del rw
-
-            pi = git.PackIdxList(bupdir + b'/objects/pack')
-            WVPASSEQ(len(pi.packs), 2)
-            pi.refresh()
-            WVPASSEQ(len(pi.packs), 2)
-            WVPASSEQ(sorted([os.path.basename(i.name) for i in pi.packs]),
-                     sorted([p1base, p2base]))
-
-            p1 = git.open_idx(p1name)
-            WVPASS(p1.exists(s1sha))
-            p2 = git.open_idx(p2name)
-            WVFAIL(p2.exists(s1sha))
-            WVPASS(p2.exists(s2sha))
-
-            subprocess.call([path.exe(), b'midx', b'-f'])
-            pi.refresh()
-            WVPASSEQ(len(pi.packs), 1)
-            pi.refresh(skip_midx=True)
-            WVPASSEQ(len(pi.packs), 2)
-            pi.refresh(skip_midx=False)
-            WVPASSEQ(len(pi.packs), 1)
-
-
-@wvtest
-def test_remote_parsing():
-    with no_lingering_errors():
-        tests = (
-            (b':/bup', (b'file', None, None, b'/bup')),
-            (b'file:///bup', (b'file', None, None, b'/bup')),
-            (b'192.168.1.1:/bup', (b'ssh', b'192.168.1.1', None, b'/bup')),
-            (b'ssh://192.168.1.1:2222/bup', (b'ssh', b'192.168.1.1', b'2222', b'/bup')),
-            (b'ssh://[ff:fe::1]:2222/bup', (b'ssh', b'ff:fe::1', b'2222', b'/bup')),
-            (b'bup://foo.com:1950', (b'bup', b'foo.com', b'1950', None)),
-            (b'bup://foo.com:1950/bup', (b'bup', b'foo.com', b'1950', b'/bup')),
-            (b'bup://[ff:fe::1]/bup', (b'bup', b'ff:fe::1', None, b'/bup')),)
-        for remote, values in tests:
-            WVPASSEQ(client.parse_remote(remote), values)
-        try:
-            client.parse_remote(b'http://asdf.com/bup')
-            WVFAIL()
-        except client.ClientError:
-            WVPASS()
diff --git a/lib/bup/t/tcompat.py b/lib/bup/t/tcompat.py
deleted file mode 100644 (file)
index 039eb12..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-
-from __future__ import absolute_import, print_function
-
-from wvtest import *
-
-from bup.compat import pending_raise
-
-@wvtest
-def test_pending_raise():
-    outer = Exception('outer')
-    inner = Exception('inner')
-
-    try:
-        try:
-            raise outer
-        except Exception as ex:
-            with pending_raise(ex):
-                pass
-    except Exception as ex:
-        WVPASSEQ(outer, ex)
-        WVPASSEQ(None, getattr(outer, '__context__', None))
-
-    try:
-        try:
-            raise outer
-        except Exception as ex:
-            with pending_raise(ex):
-                raise inner
-    except Exception as ex:
-        WVPASSEQ(inner, ex)
-        WVPASSEQ(None, getattr(outer, '__context__', None))
-        WVPASSEQ(outer, getattr(inner, '__context__', None))
diff --git a/lib/bup/t/tgit.py b/lib/bup/t/tgit.py
deleted file mode 100644 (file)
index 09faa2e..0000000
+++ /dev/null
@@ -1,547 +0,0 @@
-
-from __future__ import absolute_import, print_function
-from binascii import hexlify, unhexlify
-from subprocess import check_call
-import struct, os, time
-
-from wvtest import *
-
-from bup import git, path
-from bup.compat import bytes_from_byte, environ, range
-from bup.helpers import localtime, log, mkdirp, readpipe
-from buptest import no_lingering_errors, test_tempdir
-
-
-bup_exe = path.exe()
-
-
-def exc(*cmd):
-    print(repr(cmd), file=sys.stderr)
-    check_call(cmd)
-
-
-def exo(*cmd):
-    print(repr(cmd), file=sys.stderr)
-    return readpipe(cmd)
-
-
-@wvtest
-def test_git_version_detection():
-    with no_lingering_errors():
-        # Test version types from git's tag history
-        for expected, ver in \
-            (('insufficient', b'git version 0.99'),
-             ('insufficient', b'git version 0.99.1'),
-             ('insufficient', b'git version 0.99.7a'),
-             ('insufficient', b'git version 1.0rc1'),
-             ('insufficient', b'git version 1.0.1'),
-             ('insufficient', b'git version 1.4.2.1'),
-             ('insufficient', b'git version 1.5.5'),
-             ('insufficient', b'git version 1.5.6-rc0'),
-             ('suitable', b'git version 1.5.6'),
-             ('suitable', b'git version 1.5.6.1'),
-             ('suitable', b'git version 2.14.0-rc0'),
-             ('suitable', b'git version 2.14.0 (something ...)'),
-             ('suitable', b'git version 111.222.333.444-rc555'),
-             ('unrecognized', b'huh?')):
-            WVMSG('Checking version validation: %r' % ver)
-            WVPASSEQ(expected, git.is_suitable_git(ver_str=ver))
-            try:
-                if expected == 'insufficient':
-                    WVEXCEPT(SystemExit, git.require_suitable_git, ver)
-                elif expected == 'suitable':
-                    git.require_suitable_git(ver_str=ver)
-                elif expected == 'unrecognized':
-                    WVEXCEPT(git.GitError, git.require_suitable_git, ver)
-                else:
-                    WVPASS(False)
-            finally:
-                git._git_great = None
-            try:
-                environ[b'BUP_GIT_VERSION_IS_FINE'] = b'true'
-                git.require_suitable_git(ver_str=ver)
-            finally:
-                del environ[b'BUP_GIT_VERSION_IS_FINE']
-                git._git_great = None
-
-
-@wvtest
-def testmangle():
-    with no_lingering_errors():
-        afile  = 0o100644
-        afile2 = 0o100770
-        alink  = 0o120000
-        adir   = 0o040000
-        adir2  = 0o040777
-        WVPASSEQ(git.mangle_name(b'a', adir2, adir), b'a')
-        WVPASSEQ(git.mangle_name(b'.bup', adir2, adir), b'.bup.bupl')
-        WVPASSEQ(git.mangle_name(b'a.bupa', adir2, adir), b'a.bupa.bupl')
-        WVPASSEQ(git.mangle_name(b'b.bup', alink, alink), b'b.bup.bupl')
-        WVPASSEQ(git.mangle_name(b'b.bu', alink, alink), b'b.bu')
-        WVPASSEQ(git.mangle_name(b'f', afile, afile2), b'f')
-        WVPASSEQ(git.mangle_name(b'f.bup', afile, afile2), b'f.bup.bupl')
-        WVPASSEQ(git.mangle_name(b'f.bup', afile, adir), b'f.bup.bup')
-        WVPASSEQ(git.mangle_name(b'f', afile, adir), b'f.bup')
-
-        WVPASSEQ(git.demangle_name(b'f.bup', afile), (b'f', git.BUP_CHUNKED))
-        WVPASSEQ(git.demangle_name(b'f.bupl', afile), (b'f', git.BUP_NORMAL))
-        WVPASSEQ(git.demangle_name(b'f.bup.bupl', afile), (b'f.bup', git.BUP_NORMAL))
-
-        WVPASSEQ(git.demangle_name(b'.bupm', afile), (b'', git.BUP_NORMAL))
-        WVPASSEQ(git.demangle_name(b'.bupm', adir), (b'', git.BUP_CHUNKED))
-
-        # for safety, we ignore .bup? suffixes we don't recognize.  Future
-        # versions might implement a .bup[a-z] extension as something other
-        # than BUP_NORMAL.
-        WVPASSEQ(git.demangle_name(b'f.bupa', afile), (b'f.bupa', git.BUP_NORMAL))
-
-
-@wvtest
-def testencode():
-    with no_lingering_errors():
-        s = b'hello world'
-        looseb = b''.join(git._encode_looseobj(b'blob', s))
-        looset = b''.join(git._encode_looseobj(b'tree', s))
-        loosec = b''.join(git._encode_looseobj(b'commit', s))
-        packb = b''.join(git._encode_packobj(b'blob', s))
-        packt = b''.join(git._encode_packobj(b'tree', s))
-        packc = b''.join(git._encode_packobj(b'commit', s))
-        packlb = b''.join(git._encode_packobj(b'blob', s * 200))
-        WVPASSEQ(git._decode_looseobj(looseb), (b'blob', s))
-        WVPASSEQ(git._decode_looseobj(looset), (b'tree', s))
-        WVPASSEQ(git._decode_looseobj(loosec), (b'commit', s))
-        WVPASSEQ(git._decode_packobj(packb), (b'blob', s))
-        WVPASSEQ(git._decode_packobj(packt), (b'tree', s))
-        WVPASSEQ(git._decode_packobj(packc), (b'commit', s))
-        WVPASSEQ(git._decode_packobj(packlb), (b'blob', s * 200))
-        for i in range(10):
-            WVPASS(git._encode_looseobj(b'blob', s, compression_level=i))
-        def encode_pobj(n):
-            return b''.join(git._encode_packobj(b'blob', s, compression_level=n))
-        WVEXCEPT(ValueError, encode_pobj, -1)
-        WVEXCEPT(ValueError, encode_pobj, 10)
-        WVEXCEPT(ValueError, encode_pobj, b'x')
-
-
-@wvtest
-def testpacks():
-    with no_lingering_errors():
-        with test_tempdir(b'bup-tgit-') as tmpdir:
-            environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
-            git.init_repo(bupdir)
-            git.verbose = 1
-
-            w = git.PackWriter()
-            w.new_blob(os.urandom(100))
-            w.new_blob(os.urandom(100))
-            w.abort()
-
-            w = git.PackWriter()
-            hashes = []
-            nobj = 1000
-            for i in range(nobj):
-                hashes.append(w.new_blob(b'%d' % i))
-            log('\n')
-            nameprefix = w.close()
-            print(repr(nameprefix))
-            WVPASS(os.path.exists(nameprefix + b'.pack'))
-            WVPASS(os.path.exists(nameprefix + b'.idx'))
-
-            r = git.open_idx(nameprefix + b'.idx')
-            print(repr(r.fanout))
-
-            for i in range(nobj):
-                WVPASS(r.find_offset(hashes[i]) > 0)
-            WVPASS(r.exists(hashes[99]))
-            WVFAIL(r.exists(b'\0'*20))
-
-            pi = iter(r)
-            for h in sorted(hashes):
-                WVPASSEQ(hexlify(next(pi)), hexlify(h))
-
-            WVFAIL(r.find_offset(b'\0'*20))
-
-            r = git.PackIdxList(bupdir + b'/objects/pack')
-            WVPASS(r.exists(hashes[5]))
-            WVPASS(r.exists(hashes[6]))
-            WVFAIL(r.exists(b'\0'*20))
-
-
-@wvtest
-def test_pack_name_lookup():
-    with no_lingering_errors():
-        with test_tempdir(b'bup-tgit-') as tmpdir:
-            environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
-            git.init_repo(bupdir)
-            git.verbose = 1
-            packdir = git.repo(b'objects/pack')
-
-            idxnames = []
-            hashes = []
-
-            for start in range(0,28,2):
-                w = git.PackWriter()
-                for i in range(start, start+2):
-                    hashes.append(w.new_blob(b'%d' % i))
-                log('\n')
-                idxnames.append(os.path.basename(w.close() + b'.idx'))
-
-            r = git.PackIdxList(packdir)
-            WVPASSEQ(len(r.packs), 2)
-            for e,idxname in enumerate(idxnames):
-                for i in range(e*2, (e+1)*2):
-                    WVPASSEQ(idxname, r.exists(hashes[i], want_source=True))
-
-
-@wvtest
-def test_long_index():
-    with no_lingering_errors():
-        with test_tempdir(b'bup-tgit-') as tmpdir:
-            environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
-            git.init_repo(bupdir)
-            idx = git.PackIdxV2Writer()
-            obj_bin = struct.pack('!IIIII',
-                    0x00112233, 0x44556677, 0x88990011, 0x22334455, 0x66778899)
-            obj2_bin = struct.pack('!IIIII',
-                    0x11223344, 0x55667788, 0x99001122, 0x33445566, 0x77889900)
-            obj3_bin = struct.pack('!IIIII',
-                    0x22334455, 0x66778899, 0x00112233, 0x44556677, 0x88990011)
-            pack_bin = struct.pack('!IIIII',
-                    0x99887766, 0x55443322, 0x11009988, 0x77665544, 0x33221100)
-            idx.add(obj_bin, 1, 0xfffffffff)
-            idx.add(obj2_bin, 2, 0xffffffffff)
-            idx.add(obj3_bin, 3, 0xff)
-            name = tmpdir + b'/tmp.idx'
-            r = idx.write(name, pack_bin)
-            i = git.PackIdxV2(name, open(name, 'rb'))
-            WVPASSEQ(i.find_offset(obj_bin), 0xfffffffff)
-            WVPASSEQ(i.find_offset(obj2_bin), 0xffffffffff)
-            WVPASSEQ(i.find_offset(obj3_bin), 0xff)
-
-
-@wvtest
-def test_check_repo_or_die():
-    with no_lingering_errors():
-        with test_tempdir(b'bup-tgit-') as tmpdir:
-            environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
-            orig_cwd = os.getcwd()
-            try:
-                os.chdir(tmpdir)
-                git.init_repo(bupdir)
-                git.check_repo_or_die()
-                # if we reach this point the call above passed
-                WVPASS('check_repo_or_die')
-
-                os.rename(bupdir + b'/objects/pack',
-                          bupdir + b'/objects/pack.tmp')
-                open(bupdir + b'/objects/pack', 'w').close()
-                try:
-                    git.check_repo_or_die()
-                except SystemExit as e:
-                    WVPASSEQ(e.code, 14)
-                else:
-                    WVFAIL()
-                os.unlink(bupdir + b'/objects/pack')
-                os.rename(bupdir + b'/objects/pack.tmp',
-                          bupdir + b'/objects/pack')
-
-                try:
-                    git.check_repo_or_die(b'nonexistantbup.tmp')
-                except SystemExit as e:
-                    WVPASSEQ(e.code, 15)
-                else:
-                    WVFAIL()
-            finally:
-                os.chdir(orig_cwd)
-
-
-@wvtest
-def test_commit_parsing():
-
-    def restore_env_var(name, val):
-        if val is None:
-            del environ[name]
-        else:
-            environ[name] = val
-
-    def showval(commit, val):
-        return readpipe([b'git', b'show', b'-s',
-                         b'--pretty=format:%s' % val, commit]).strip()
-
-    with no_lingering_errors():
-        with test_tempdir(b'bup-tgit-') as tmpdir:
-            orig_cwd = os.getcwd()
-            workdir = tmpdir + b'/work'
-            repodir = workdir + b'/.git'
-            orig_author_name = environ.get(b'GIT_AUTHOR_NAME')
-            orig_author_email = environ.get(b'GIT_AUTHOR_EMAIL')
-            orig_committer_name = environ.get(b'GIT_COMMITTER_NAME')
-            orig_committer_email = environ.get(b'GIT_COMMITTER_EMAIL')
-            environ[b'GIT_AUTHOR_NAME'] = b'bup test'
-            environ[b'GIT_COMMITTER_NAME'] = environ[b'GIT_AUTHOR_NAME']
-            environ[b'GIT_AUTHOR_EMAIL'] = b'bup@a425bc70a02811e49bdf73ee56450e6f'
-            environ[b'GIT_COMMITTER_EMAIL'] = environ[b'GIT_AUTHOR_EMAIL']
-            try:
-                readpipe([b'git', b'init', workdir])
-                environ[b'GIT_DIR'] = environ[b'BUP_DIR'] = repodir
-                git.check_repo_or_die(repodir)
-                os.chdir(workdir)
-                with open('foo', 'w') as f:
-                    print('bar', file=f)
-                readpipe([b'git', b'add', b'.'])
-                readpipe([b'git', b'commit', b'-am', b'Do something',
-                          b'--author', b'Someone <someone@somewhere>',
-                          b'--date', b'Sat Oct 3 19:48:49 2009 -0400'])
-                commit = readpipe([b'git', b'show-ref', b'-s', b'master']).strip()
-                parents = showval(commit, b'%P')
-                tree = showval(commit, b'%T')
-                cname = showval(commit, b'%cn')
-                cmail = showval(commit, b'%ce')
-                cdate = showval(commit, b'%ct')
-                coffs = showval(commit, b'%ci')
-                coffs = coffs[-5:]
-                coff = (int(coffs[-4:-2]) * 60 * 60) + (int(coffs[-2:]) * 60)
-                if bytes_from_byte(coffs[-5]) == b'-':
-                    coff = - coff
-                commit_items = git.get_commit_items(commit, git.cp())
-                WVPASSEQ(commit_items.parents, [])
-                WVPASSEQ(commit_items.tree, tree)
-                WVPASSEQ(commit_items.author_name, b'Someone')
-                WVPASSEQ(commit_items.author_mail, b'someone@somewhere')
-                WVPASSEQ(commit_items.author_sec, 1254613729)
-                WVPASSEQ(commit_items.author_offset, -(4 * 60 * 60))
-                WVPASSEQ(commit_items.committer_name, cname)
-                WVPASSEQ(commit_items.committer_mail, cmail)
-                WVPASSEQ(commit_items.committer_sec, int(cdate))
-                WVPASSEQ(commit_items.committer_offset, coff)
-                WVPASSEQ(commit_items.message, b'Do something\n')
-                with open(b'bar', 'wb') as f:
-                    f.write(b'baz\n')
-                readpipe([b'git', b'add', '.'])
-                readpipe([b'git', b'commit', b'-am', b'Do something else'])
-                child = readpipe([b'git', b'show-ref', b'-s', b'master']).strip()
-                parents = showval(child, b'%P')
-                commit_items = git.get_commit_items(child, git.cp())
-                WVPASSEQ(commit_items.parents, [commit])
-            finally:
-                os.chdir(orig_cwd)
-                restore_env_var(b'GIT_AUTHOR_NAME', orig_author_name)
-                restore_env_var(b'GIT_AUTHOR_EMAIL', orig_author_email)
-                restore_env_var(b'GIT_COMMITTER_NAME', orig_committer_name)
-                restore_env_var(b'GIT_COMMITTER_EMAIL', orig_committer_email)
-
-
-@wvtest
-def test_new_commit():
-    with no_lingering_errors():
-        with test_tempdir(b'bup-tgit-') as tmpdir:
-            environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
-            git.init_repo(bupdir)
-            git.verbose = 1
-
-            w = git.PackWriter()
-            tree = os.urandom(20)
-            parent = os.urandom(20)
-            author_name = b'Author'
-            author_mail = b'author@somewhere'
-            adate_sec = 1439657836
-            cdate_sec = adate_sec + 1
-            committer_name = b'Committer'
-            committer_mail = b'committer@somewhere'
-            adate_tz_sec = cdate_tz_sec = None
-            commit = w.new_commit(tree, parent,
-                                  b'%s <%s>' % (author_name, author_mail),
-                                  adate_sec, adate_tz_sec,
-                                  b'%s <%s>' % (committer_name, committer_mail),
-                                  cdate_sec, cdate_tz_sec,
-                                  b'There is a small mailbox here')
-            adate_tz_sec = -60 * 60
-            cdate_tz_sec = 120 * 60
-            commit_off = w.new_commit(tree, parent,
-                                      b'%s <%s>' % (author_name, author_mail),
-                                      adate_sec, adate_tz_sec,
-                                      b'%s <%s>' % (committer_name, committer_mail),
-                                      cdate_sec, cdate_tz_sec,
-                                      b'There is a small mailbox here')
-            w.close()
-
-            commit_items = git.get_commit_items(hexlify(commit), git.cp())
-            local_author_offset = localtime(adate_sec).tm_gmtoff
-            local_committer_offset = localtime(cdate_sec).tm_gmtoff
-            WVPASSEQ(tree, unhexlify(commit_items.tree))
-            WVPASSEQ(1, len(commit_items.parents))
-            WVPASSEQ(parent, unhexlify(commit_items.parents[0]))
-            WVPASSEQ(author_name, commit_items.author_name)
-            WVPASSEQ(author_mail, commit_items.author_mail)
-            WVPASSEQ(adate_sec, commit_items.author_sec)
-            WVPASSEQ(local_author_offset, commit_items.author_offset)
-            WVPASSEQ(committer_name, commit_items.committer_name)
-            WVPASSEQ(committer_mail, commit_items.committer_mail)
-            WVPASSEQ(cdate_sec, commit_items.committer_sec)
-            WVPASSEQ(local_committer_offset, commit_items.committer_offset)
-
-            commit_items = git.get_commit_items(hexlify(commit_off), git.cp())
-            WVPASSEQ(tree, unhexlify(commit_items.tree))
-            WVPASSEQ(1, len(commit_items.parents))
-            WVPASSEQ(parent, unhexlify(commit_items.parents[0]))
-            WVPASSEQ(author_name, commit_items.author_name)
-            WVPASSEQ(author_mail, commit_items.author_mail)
-            WVPASSEQ(adate_sec, commit_items.author_sec)
-            WVPASSEQ(adate_tz_sec, commit_items.author_offset)
-            WVPASSEQ(committer_name, commit_items.committer_name)
-            WVPASSEQ(committer_mail, commit_items.committer_mail)
-            WVPASSEQ(cdate_sec, commit_items.committer_sec)
-            WVPASSEQ(cdate_tz_sec, commit_items.committer_offset)
-
-
-@wvtest
-def test_list_refs():
-    with no_lingering_errors():
-        with test_tempdir(b'bup-tgit-') as tmpdir:
-            environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
-            src = tmpdir + b'/src'
-            mkdirp(src)
-            with open(src + b'/1', 'wb+') as f:
-                f.write(b'something\n')
-            with open(src + b'/2', 'wb+') as f:
-                f.write(b'something else\n')
-            git.init_repo(bupdir)
-            emptyset = frozenset()
-            WVPASSEQ(frozenset(git.list_refs()), emptyset)
-            WVPASSEQ(frozenset(git.list_refs(limit_to_tags=True)), emptyset)
-            WVPASSEQ(frozenset(git.list_refs(limit_to_heads=True)), emptyset)
-            exc(bup_exe, b'index', src)
-            exc(bup_exe, b'save', b'-n', b'src', b'--strip', src)
-            src_hash = exo(b'git', b'--git-dir', bupdir,
-                           b'rev-parse', b'src').strip().split(b'\n')
-            assert(len(src_hash) == 1)
-            src_hash = unhexlify(src_hash[0])
-            tree_hash = unhexlify(exo(b'git', b'--git-dir', bupdir,
-                                      b'rev-parse',
-                                      b'src:').strip().split(b'\n')[0])
-            blob_hash = unhexlify(exo(b'git', b'--git-dir', bupdir,
-                                      b'rev-parse',
-                                      b'src:1').strip().split(b'\n')[0])
-            WVPASSEQ(frozenset(git.list_refs()),
-                     frozenset([(b'refs/heads/src', src_hash)]))
-            WVPASSEQ(frozenset(git.list_refs(limit_to_tags=True)), emptyset)
-            WVPASSEQ(frozenset(git.list_refs(limit_to_heads=True)),
-                     frozenset([(b'refs/heads/src', src_hash)]))
-            exc(b'git', b'--git-dir', bupdir, b'tag', b'commit-tag', b'src')
-            WVPASSEQ(frozenset(git.list_refs()),
-                     frozenset([(b'refs/heads/src', src_hash),
-                                (b'refs/tags/commit-tag', src_hash)]))
-            WVPASSEQ(frozenset(git.list_refs(limit_to_tags=True)),
-                     frozenset([(b'refs/tags/commit-tag', src_hash)]))
-            WVPASSEQ(frozenset(git.list_refs(limit_to_heads=True)),
-                     frozenset([(b'refs/heads/src', src_hash)]))
-            exc(b'git', b'--git-dir', bupdir, b'tag', b'tree-tag', b'src:')
-            exc(b'git', b'--git-dir', bupdir, b'tag', b'blob-tag', b'src:1')
-            os.unlink(bupdir + b'/refs/heads/src')
-            expected_tags = frozenset([(b'refs/tags/commit-tag', src_hash),
-                                       (b'refs/tags/tree-tag', tree_hash),
-                                       (b'refs/tags/blob-tag', blob_hash)])
-            WVPASSEQ(frozenset(git.list_refs()), expected_tags)
-            WVPASSEQ(frozenset(git.list_refs(limit_to_heads=True)), frozenset([]))
-            WVPASSEQ(frozenset(git.list_refs(limit_to_tags=True)), expected_tags)
-
-
-@wvtest
-def test__git_date_str():
-    with no_lingering_errors():
-        WVPASSEQ(b'0 +0000', git._git_date_str(0, 0))
-        WVPASSEQ(b'0 -0130', git._git_date_str(0, -90 * 60))
-        WVPASSEQ(b'0 +0130', git._git_date_str(0, 90 * 60))
-
-
-@wvtest
-def test_cat_pipe():
-    with no_lingering_errors():
-        with test_tempdir(b'bup-tgit-') as tmpdir:
-            environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
-            src = tmpdir + b'/src'
-            mkdirp(src)
-            with open(src + b'/1', 'wb+') as f:
-                f.write(b'something\n')
-            with open(src + b'/2', 'wb+') as f:
-                f.write(b'something else\n')
-            git.init_repo(bupdir)
-            exc(bup_exe, b'index', src)
-            oidx = exo(bup_exe, b'save', b'-cn', b'src', b'--strip',
-                       src).strip()
-            typ = exo(b'git', b'--git-dir', bupdir,
-                      b'cat-file', b'-t', b'src').strip()
-            size = int(exo(b'git', b'--git-dir', bupdir,
-                               b'cat-file', b'-s', b'src'))
-            it = git.cp().get(b'src')
-            get_info = next(it)
-            for buf in next(it):
-                pass
-            WVPASSEQ((oidx, typ, size), get_info)
-
-def _create_idx(d, i):
-    idx = git.PackIdxV2Writer()
-    # add 255 vaguely reasonable entries
-    for s in range(255):
-        idx.add(struct.pack('18xBB', i, s), s, 100 * s)
-    packbin = struct.pack('B19x', i)
-    packname = os.path.join(d, b'pack-%s.idx' % hexlify(packbin))
-    idx.write(packname, packbin)
-
-@wvtest
-def test_midx_close():
-    fddir = b'/proc/self/fd'
-    try:
-        os.listdir(fddir)
-    except Exception:
-        # not supported, not Linux, I guess
-        return
-
-    def openfiles():
-        for fd in os.listdir(fddir):
-            try:
-                yield os.readlink(os.path.join(fddir, fd))
-            except OSError:
-                pass
-
-    def force_midx(objdir):
-        args = [path.exe(), b'midx', b'--auto', b'--dir', objdir]
-        check_call(args)
-
-    with no_lingering_errors(), \
-         test_tempdir(b'bup-tgit-') as tmpdir:
-        environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
-        git.init_repo(bupdir)
-        # create a few dummy idxes
-        for i in range(10):
-            _create_idx(tmpdir, i)
-        git.auto_midx(tmpdir)
-        l = git.PackIdxList(tmpdir)
-        # this doesn't exist (yet)
-        WVPASSEQ(None, l.exists(struct.pack('18xBB', 10, 0)))
-        for i in range(10, 15):
-            _create_idx(tmpdir, i)
-        # delete the midx ...
-        # TODO: why do we need to? git.auto_midx() below doesn't?!
-        for fn in os.listdir(tmpdir):
-            if fn.endswith(b'.midx'):
-                os.unlink(os.path.join(tmpdir, fn))
-        # and make a new one
-        git.auto_midx(tmpdir)
-        # check it still doesn't exist - we haven't refreshed
-        WVPASSEQ(None, l.exists(struct.pack('18xBB', 10, 0)))
-        # check that we still have the midx open, this really
-        # just checks more for the kernel API ('deleted' string)
-        for fn in openfiles():
-            if not b'midx-' in fn:
-                continue
-            WVPASSEQ(True, b'deleted' in fn)
-        # refresh the PackIdxList
-        l.refresh()
-        # and check that an object in pack 10 exists now
-        WVPASSEQ(True, l.exists(struct.pack('18xBB', 10, 0)))
-        for fn in openfiles():
-            if not b'midx-' in fn:
-                continue
-            # check that we don't have it open anymore
-            WVPASSEQ(False, b'deleted' in fn)
diff --git a/lib/bup/t/thashsplit.py b/lib/bup/t/thashsplit.py
deleted file mode 100644 (file)
index fc6a9ab..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-
-from __future__ import absolute_import
-from io import BytesIO
-
-from wvtest import *
-
-from bup import hashsplit, _helpers, helpers
-from bup.compat import byte_int, bytes_from_uint
-from buptest import no_lingering_errors
-
-
-def nr_regions(x, max_count=None):
-    return list(hashsplit._nonresident_page_regions(bytearray(x), 1, max_count))
-
-
-@wvtest
-def test_nonresident_page_regions():
-    with no_lingering_errors():
-        WVPASSEQ(nr_regions([]), [])
-        WVPASSEQ(nr_regions([1]), [])
-        WVPASSEQ(nr_regions([0]), [(0, 1)])
-        WVPASSEQ(nr_regions([1, 0]), [(1, 1)])
-        WVPASSEQ(nr_regions([0, 0]), [(0, 2)])
-        WVPASSEQ(nr_regions([1, 0, 1]), [(1, 1)])
-        WVPASSEQ(nr_regions([1, 0, 0]), [(1, 2)])
-        WVPASSEQ(nr_regions([0, 1, 0]), [(0, 1), (2, 1)])
-        WVPASSEQ(nr_regions([0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0]),
-                 [(0, 2), (5, 3), (9, 2)])
-        WVPASSEQ(nr_regions([2, 42, 3, 101]), [(0, 2)])
-        # Test limit
-        WVPASSEQ(nr_regions([0, 0, 0], None), [(0, 3)])
-        WVPASSEQ(nr_regions([0, 0, 0], 1), [(0, 1), (1, 1), (2, 1)])
-        WVPASSEQ(nr_regions([0, 0, 0], 2), [(0, 2), (2, 1)])
-        WVPASSEQ(nr_regions([0, 0, 0], 3), [(0, 3)])
-        WVPASSEQ(nr_regions([0, 0, 0], 4), [(0, 3)])
-        WVPASSEQ(nr_regions([0, 0, 1], None), [(0, 2)])
-        WVPASSEQ(nr_regions([0, 0, 1], 1), [(0, 1), (1, 1)])
-        WVPASSEQ(nr_regions([0, 0, 1], 2), [(0, 2)])
-        WVPASSEQ(nr_regions([0, 0, 1], 3), [(0, 2)])
-        WVPASSEQ(nr_regions([1, 0, 0], None), [(1, 2)])
-        WVPASSEQ(nr_regions([1, 0, 0], 1), [(1, 1), (2, 1)])
-        WVPASSEQ(nr_regions([1, 0, 0], 2), [(1, 2)])
-        WVPASSEQ(nr_regions([1, 0, 0], 3), [(1, 2)])
-        WVPASSEQ(nr_regions([1, 0, 0, 0, 1], None), [(1, 3)])
-        WVPASSEQ(nr_regions([1, 0, 0, 0, 1], 1), [(1, 1), (2, 1), (3, 1)])
-        WVPASSEQ(nr_regions([1, 0, 0, 0, 1], 2), [(1, 2), (3, 1)])
-        WVPASSEQ(nr_regions([1, 0, 0, 0, 1], 3), [(1, 3)])
-        WVPASSEQ(nr_regions([1, 0, 0, 0, 1], 4), [(1, 3)])
-
-
-@wvtest
-def test_uncache_ours_upto():
-    history = []
-    def mock_fadvise_pages_done(f, ofs, len):
-        history.append((f, ofs, len))
-
-    with no_lingering_errors():
-        uncache_upto = hashsplit._uncache_ours_upto
-        page_size = helpers.sc_page_size
-        orig_pages_done = hashsplit._fadvise_pages_done
-        try:
-            hashsplit._fadvise_pages_done = mock_fadvise_pages_done
-            history = []
-            uncache_upto(42, 0, (0, 1), iter([]))
-            WVPASSEQ([], history)
-            uncache_upto(42, page_size, (0, 1), iter([]))
-            WVPASSEQ([(42, 0, 1)], history)
-            history = []
-            uncache_upto(42, page_size, (0, 3), iter([(5, 2)]))
-            WVPASSEQ([], history)
-            uncache_upto(42, 2 * page_size, (0, 3), iter([(5, 2)]))
-            WVPASSEQ([], history)
-            uncache_upto(42, 3 * page_size, (0, 3), iter([(5, 2)]))
-            WVPASSEQ([(42, 0, 3)], history)
-            history = []
-            uncache_upto(42, 5 * page_size, (0, 3), iter([(5, 2)]))
-            WVPASSEQ([(42, 0, 3)], history)
-            history = []
-            uncache_upto(42, 6 * page_size, (0, 3), iter([(5, 2)]))
-            WVPASSEQ([(42, 0, 3)], history)
-            history = []
-            uncache_upto(42, 7 * page_size, (0, 3), iter([(5, 2)]))
-            WVPASSEQ([(42, 0, 3), (42, 5, 2)], history)
-        finally:
-            hashsplit._fadvise_pages_done = orig_pages_done
-
-
-@wvtest
-def test_rolling_sums():
-    with no_lingering_errors():
-        WVPASS(_helpers.selftest())
-
-@wvtest
-def test_fanout_behaviour():
-
-    # Drop in replacement for bupsplit, but splitting if the int value of a
-    # byte >= BUP_BLOBBITS
-    basebits = _helpers.blobbits()
-    def splitbuf(buf):
-        ofs = 0
-        for b in buf:
-            b = byte_int(b)
-            ofs += 1
-            if b >= basebits:
-                return ofs, b
-        return 0, 0
-
-    with no_lingering_errors():
-        old_splitbuf = _helpers.splitbuf
-        _helpers.splitbuf = splitbuf
-        old_BLOB_MAX = hashsplit.BLOB_MAX
-        hashsplit.BLOB_MAX = 4
-        old_BLOB_READ_SIZE = hashsplit.BLOB_READ_SIZE
-        hashsplit.BLOB_READ_SIZE = 10
-        old_fanout = hashsplit.fanout
-        hashsplit.fanout = 2
-
-        levels = lambda f: [(len(b), l) for b, l in
-            hashsplit.hashsplit_iter([f], True, None)]
-        # Return a string of n null bytes
-        z = lambda n: b'\x00' * n
-        # Return a byte which will be split with a level of n
-        sb = lambda n: bytes_from_uint(basebits + n)
-
-        split_never = BytesIO(z(16))
-        split_first = BytesIO(z(1) + sb(3) + z(14))
-        split_end   = BytesIO(z(13) + sb(1) + z(2))
-        split_many  = BytesIO(sb(1) + z(3) + sb(2) + z(4) +
-                              sb(0) + z(4) + sb(5) + z(1))
-        WVPASSEQ(levels(split_never), [(4, 0), (4, 0), (4, 0), (4, 0)])
-        WVPASSEQ(levels(split_first), [(2, 3), (4, 0), (4, 0), (4, 0), (2, 0)])
-        WVPASSEQ(levels(split_end), [(4, 0), (4, 0), (4, 0), (2, 1), (2, 0)])
-        WVPASSEQ(levels(split_many),
-            [(1, 1), (4, 2), (4, 0), (1, 0), (4, 0), (1, 5), (1, 0)])
-
-        _helpers.splitbuf = old_splitbuf
-        hashsplit.BLOB_MAX = old_BLOB_MAX
-        hashsplit.BLOB_READ_SIZE = old_BLOB_READ_SIZE
-        hashsplit.fanout = old_fanout
diff --git a/lib/bup/t/thelpers.py b/lib/bup/t/thelpers.py
deleted file mode 100644 (file)
index e05c1f6..0000000
+++ /dev/null
@@ -1,259 +0,0 @@
-
-from __future__ import absolute_import
-from time import tzset
-import helpers, math, os, re, subprocess
-
-from wvtest import *
-
-from bup.compat import bytes_from_byte, bytes_from_uint, environ
-from bup.helpers import (atomically_replaced_file, batchpipe, detect_fakeroot,
-                         grafted_path_components, mkdirp, parse_num,
-                         path_components, readpipe, stripped_path_components,
-                         shstr,
-                         utc_offset_str)
-from buptest import no_lingering_errors, test_tempdir
-import bup._helpers as _helpers
-
-
-bup_tmp = os.path.realpath(b'../../../t/tmp')
-mkdirp(bup_tmp)
-
-
-@wvtest
-def test_parse_num():
-    with no_lingering_errors():
-        pn = parse_num
-        WVPASSEQ(pn(b'1'), 1)
-        WVPASSEQ(pn('1'), 1)
-        WVPASSEQ(pn('0'), 0)
-        WVPASSEQ(pn('1.5k'), 1536)
-        WVPASSEQ(pn('2 gb'), 2*1024*1024*1024)
-        WVPASSEQ(pn('1e+9 k'), 1000000000 * 1024)
-        WVPASSEQ(pn('-3e-3mb'), int(-0.003 * 1024 * 1024))
-
-@wvtest
-def test_detect_fakeroot():
-    with no_lingering_errors():
-        if b'FAKEROOTKEY' in environ:
-            WVPASS(detect_fakeroot())
-        else:
-            WVPASS(not detect_fakeroot())
-
-@wvtest
-def test_path_components():
-    with no_lingering_errors():
-        WVPASSEQ(path_components(b'/'), [(b'', b'/')])
-        WVPASSEQ(path_components(b'/foo'), [(b'', b'/'), (b'foo', b'/foo')])
-        WVPASSEQ(path_components(b'/foo/'), [(b'', b'/'), (b'foo', b'/foo')])
-        WVPASSEQ(path_components(b'/foo/bar'),
-                 [(b'', b'/'), (b'foo', b'/foo'), (b'bar', b'/foo/bar')])
-        WVEXCEPT(Exception, path_components, b'foo')
-
-
-@wvtest
-def test_stripped_path_components():
-    with no_lingering_errors():
-        WVPASSEQ(stripped_path_components(b'/', []), [(b'', b'/')])
-        WVPASSEQ(stripped_path_components(b'/', [b'']), [(b'', b'/')])
-        WVPASSEQ(stripped_path_components(b'/', [b'/']), [(b'', b'/')])
-        WVPASSEQ(stripped_path_components(b'/foo', [b'/']),
-                 [(b'', b'/'), (b'foo', b'/foo')])
-        WVPASSEQ(stripped_path_components(b'/', [b'/foo']), [(b'', b'/')])
-        WVPASSEQ(stripped_path_components(b'/foo', [b'/bar']),
-                 [(b'', b'/'), (b'foo', b'/foo')])
-        WVPASSEQ(stripped_path_components(b'/foo', [b'/foo']), [(b'', b'/foo')])
-        WVPASSEQ(stripped_path_components(b'/foo/bar', [b'/foo']),
-                 [(b'', b'/foo'), (b'bar', b'/foo/bar')])
-        WVPASSEQ(stripped_path_components(b'/foo/bar', [b'/bar', b'/foo', b'/baz']),
-                 [(b'', b'/foo'), (b'bar', b'/foo/bar')])
-        WVPASSEQ(stripped_path_components(b'/foo/bar/baz', [b'/foo/bar/baz']),
-                 [(b'', b'/foo/bar/baz')])
-        WVEXCEPT(Exception, stripped_path_components, b'foo', [])
-
-
-@wvtest
-def test_grafted_path_components():
-    with no_lingering_errors():
-        WVPASSEQ(grafted_path_components([(b'/chroot', b'/')], b'/foo'),
-                 [(b'', b'/'), (b'foo', b'/foo')])
-        WVPASSEQ(grafted_path_components([(b'/foo/bar', b'/')],
-                                         b'/foo/bar/baz/bax'),
-                 [(b'', b'/foo/bar'),
-                  (b'baz', b'/foo/bar/baz'),
-                  (b'bax', b'/foo/bar/baz/bax')])
-        WVPASSEQ(grafted_path_components([(b'/foo/bar/baz', b'/bax')],
-                                         b'/foo/bar/baz/1/2'),
-                 [(b'', None),
-                  (b'bax', b'/foo/bar/baz'),
-                  (b'1', b'/foo/bar/baz/1'),
-                  (b'2', b'/foo/bar/baz/1/2')])
-        WVPASSEQ(grafted_path_components([(b'/foo', b'/bar/baz/bax')],
-                                         b'/foo/bar'),
-                 [(b'', None),
-                  (b'bar', None),
-                  (b'baz', None),
-                  (b'bax', b'/foo'),
-                  (b'bar', b'/foo/bar')])
-        WVPASSEQ(grafted_path_components([(b'/foo/bar/baz', b'/a/b/c')],
-                                         b'/foo/bar/baz'),
-                 [(b'', None), (b'a', None), (b'b', None), (b'c', b'/foo/bar/baz')])
-        WVPASSEQ(grafted_path_components([(b'/', b'/a/b/c/')], b'/foo/bar'),
-                 [(b'', None), (b'a', None), (b'b', None), (b'c', b'/'),
-                  (b'foo', b'/foo'), (b'bar', b'/foo/bar')])
-        WVEXCEPT(Exception, grafted_path_components, b'foo', [])
-
-
-@wvtest
-def test_shstr():
-    with no_lingering_errors():
-        # Do nothing for strings and bytes
-        WVPASSEQ(shstr(b''), b'')
-        WVPASSEQ(shstr(b'1'), b'1')
-        WVPASSEQ(shstr(b'1 2'), b'1 2')
-        WVPASSEQ(shstr(b"1'2"), b"1'2")
-        WVPASSEQ(shstr(''), '')
-        WVPASSEQ(shstr('1'), '1')
-        WVPASSEQ(shstr('1 2'), '1 2')
-        WVPASSEQ(shstr("1'2"), "1'2")
-
-        # Escape parts of sequences
-        WVPASSEQ(shstr((b'1 2', b'3')), b"'1 2' 3")
-        WVPASSEQ(shstr((b"1'2", b'3')), b"'1'\"'\"'2' 3")
-        WVPASSEQ(shstr((b"'1", b'3')), b"''\"'\"'1' 3")
-        WVPASSEQ(shstr(('1 2', '3')), "'1 2' 3")
-        WVPASSEQ(shstr(("1'2", '3')), "'1'\"'\"'2' 3")
-        WVPASSEQ(shstr(("'1", '3')), "''\"'\"'1' 3")
-
-
-@wvtest
-def test_readpipe():
-    with no_lingering_errors():
-        x = readpipe([b'echo', b'42'])
-        WVPASSEQ(x, b'42\n')
-        try:
-            readpipe([b'bash', b'-c', b'exit 42'])
-        except Exception as ex:
-            rx = '^subprocess b?"bash -c \'exit 42\'" failed with status 42$'
-            if not re.match(rx, str(ex)):
-                WVPASSEQ(str(ex), rx)
-
-
-@wvtest
-def test_batchpipe():
-    with no_lingering_errors():
-        for chunk in batchpipe([b'echo'], []):
-            WVPASS(False)
-        out = b''
-        for chunk in batchpipe([b'echo'], [b'42']):
-            out += chunk
-        WVPASSEQ(out, b'42\n')
-        try:
-            batchpipe([b'bash', b'-c'], [b'exit 42'])
-        except Exception as ex:
-            WVPASSEQ(str(ex),
-                     "subprocess 'bash -c exit 42' failed with status 42")
-        args = [str(x) for x in range(6)]
-        # Force batchpipe to break the args into batches of 3.  This
-        # approach assumes all args are the same length.
-        arg_max = \
-            helpers._argmax_base([b'echo']) + helpers._argmax_args_size(args[:3])
-        batches = batchpipe(['echo'], args, arg_max=arg_max)
-        WVPASSEQ(next(batches), b'0 1 2\n')
-        WVPASSEQ(next(batches), b'3 4 5\n')
-        WVPASSEQ(next(batches, None), None)
-        batches = batchpipe([b'echo'], [str(x) for x in range(5)], arg_max=arg_max)
-        WVPASSEQ(next(batches), b'0 1 2\n')
-        WVPASSEQ(next(batches), b'3 4\n')
-        WVPASSEQ(next(batches, None), None)
-
-
-@wvtest
-def test_atomically_replaced_file():
-    with no_lingering_errors():
-        with test_tempdir(b'bup-thelper-') as tmpdir:
-            target_file = os.path.join(tmpdir, b'test-atomic-write')
-
-            with atomically_replaced_file(target_file, mode='w') as f:
-                f.write('asdf')
-                WVPASSEQ(f.mode, 'w')
-            f = open(target_file, 'r')
-            WVPASSEQ(f.read(), 'asdf')
-
-            try:
-                with atomically_replaced_file(target_file, mode='w') as f:
-                    f.write('wxyz')
-                    raise Exception()
-            except:
-                pass
-            with open(target_file) as f:
-                WVPASSEQ(f.read(), 'asdf')
-
-            with atomically_replaced_file(target_file, mode='wb') as f:
-                f.write(os.urandom(20))
-                WVPASSEQ(f.mode, 'wb')
-
-
-def set_tz(tz):
-    if not tz:
-        del environ[b'TZ']
-    else:
-        environ[b'TZ'] = tz
-    tzset()
-
-
-@wvtest
-def test_utc_offset_str():
-    with no_lingering_errors():
-        tz = environ.get(b'TZ')
-        tzset()
-        try:
-            set_tz(b'FOO+0:00')
-            WVPASSEQ(utc_offset_str(0), b'+0000')
-            set_tz(b'FOO+1:00')
-            WVPASSEQ(utc_offset_str(0), b'-0100')
-            set_tz(b'FOO-1:00')
-            WVPASSEQ(utc_offset_str(0), b'+0100')
-            set_tz(b'FOO+3:3')
-            WVPASSEQ(utc_offset_str(0), b'-0303')
-            set_tz(b'FOO-3:3')
-            WVPASSEQ(utc_offset_str(0), b'+0303')
-            # Offset is not an integer number of minutes
-            set_tz(b'FOO+3:3:3')
-            WVPASSEQ(utc_offset_str(1), b'-0303')
-            set_tz(b'FOO-3:3:3')
-            WVPASSEQ(utc_offset_str(1), b'+0303')
-            WVPASSEQ(utc_offset_str(314159), b'+0303')
-        finally:
-            if tz:
-                set_tz(tz)
-            else:
-                try:
-                    set_tz(None)
-                except KeyError:
-                    pass
-
-@wvtest
-def test_valid_save_name():
-    with no_lingering_errors():
-        valid = helpers.valid_save_name
-        WVPASS(valid(b'x'))
-        WVPASS(valid(b'x@'))
-        WVFAIL(valid(b'@'))
-        WVFAIL(valid(b'/'))
-        WVFAIL(valid(b'/foo'))
-        WVFAIL(valid(b'foo/'))
-        WVFAIL(valid(b'/foo/'))
-        WVFAIL(valid(b'foo//bar'))
-        WVFAIL(valid(b'.'))
-        WVFAIL(valid(b'bar.'))
-        WVFAIL(valid(b'foo@{'))
-        for x in b' ~^:?*[\\':
-            WVFAIL(valid(b'foo' + bytes_from_byte(x)))
-        for i in range(20):
-            WVFAIL(valid(b'foo' + bytes_from_uint(i)))
-        WVFAIL(valid(b'foo' + bytes_from_uint(0x7f)))
-        WVFAIL(valid(b'foo..bar'))
-        WVFAIL(valid(b'bar.lock/baz'))
-        WVFAIL(valid(b'foo/bar.lock/baz'))
-        WVFAIL(valid(b'.bar/baz'))
-        WVFAIL(valid(b'foo/.bar/baz'))
diff --git a/lib/bup/t/tindex.py b/lib/bup/t/tindex.py
deleted file mode 100644 (file)
index dea7cd8..0000000
+++ /dev/null
@@ -1,184 +0,0 @@
-
-from __future__ import absolute_import, print_function
-import os, time
-
-from wvtest import *
-
-from bup import index, metadata
-from bup.compat import fsencode
-from bup.helpers import mkdirp, resolve_parent
-from buptest import no_lingering_errors, test_tempdir
-import bup.xstat as xstat
-
-
-lib_t_dir = os.path.dirname(fsencode(__file__))
-
-
-@wvtest
-def index_basic():
-    with no_lingering_errors():
-        cd = os.path.realpath(b'../../../t')
-        WVPASS(cd)
-        sd = os.path.realpath(cd + b'/sampledata')
-        WVPASSEQ(resolve_parent(cd + b'/sampledata'), sd)
-        WVPASSEQ(os.path.realpath(cd + b'/sampledata/x'), sd + b'/x')
-        WVPASSEQ(os.path.realpath(cd + b'/sampledata/var/abs-symlink'),
-                 sd + b'/var/abs-symlink-target')
-        WVPASSEQ(resolve_parent(cd + b'/sampledata/var/abs-symlink'),
-                 sd + b'/var/abs-symlink')
-
-
-@wvtest
-def index_writer():
-    with no_lingering_errors():
-        with test_tempdir(b'bup-tindex-') as tmpdir:
-            orig_cwd = os.getcwd()
-            try:
-                os.chdir(tmpdir)
-                ds = xstat.stat(b'.')
-                fs = xstat.stat(lib_t_dir + b'/tindex.py')
-                ms = index.MetaStoreWriter(b'index.meta.tmp');
-                tmax = (time.time() - 1) * 10**9
-                w = index.Writer(b'index.tmp', ms, tmax)
-                w.add(b'/var/tmp/sporky', fs, 0)
-                w.add(b'/etc/passwd', fs, 0)
-                w.add(b'/etc/', ds, 0)
-                w.add(b'/', ds, 0)
-                ms.close()
-                w.close()
-            finally:
-                os.chdir(orig_cwd)
-
-
-def dump(m):
-    for e in list(m):
-        print('%s%s %s' % (e.is_valid() and ' ' or 'M',
-                           e.is_fake() and 'F' or ' ',
-                           e.name))
-
-def fake_validate(*l):
-    for i in l:
-        for e in i:
-            e.validate(0o100644, index.FAKE_SHA)
-            e.repack()
-
-def eget(l, ename):
-    for e in l:
-        if e.name == ename:
-            return e
-
-@wvtest
-def index_negative_timestamps():
-    with no_lingering_errors():
-        with test_tempdir(b'bup-tindex-') as tmpdir:
-            # Makes 'foo' exist
-            foopath = tmpdir + b'/foo'
-            f = open(foopath, 'wb')
-            f.close()
-
-            # Dec 31, 1969
-            os.utime(foopath, (-86400, -86400))
-            ns_per_sec = 10**9
-            tmax = (time.time() - 1) * ns_per_sec
-            e = index.BlankNewEntry(foopath, 0, tmax)
-            e.update_from_stat(xstat.stat(foopath), 0)
-            WVPASS(e.packed())
-
-            # Jun 10, 1893
-            os.utime(foopath, (-0x80000000, -0x80000000))
-            e = index.BlankNewEntry(foopath, 0, tmax)
-            e.update_from_stat(xstat.stat(foopath), 0)
-            WVPASS(e.packed())
-
-
-@wvtest
-def index_dirty():
-    with no_lingering_errors():
-        with test_tempdir(b'bup-tindex-') as tmpdir:
-            orig_cwd = os.getcwd()
-            try:
-                os.chdir(tmpdir)
-                default_meta = metadata.Metadata()
-                ms1 = index.MetaStoreWriter(b'index.meta.tmp')
-                ms2 = index.MetaStoreWriter(b'index2.meta.tmp')
-                ms3 = index.MetaStoreWriter(b'index3.meta.tmp')
-                meta_ofs1 = ms1.store(default_meta)
-                meta_ofs2 = ms2.store(default_meta)
-                meta_ofs3 = ms3.store(default_meta)
-
-                ds = xstat.stat(lib_t_dir)
-                fs = xstat.stat(lib_t_dir + b'/tindex.py')
-                tmax = (time.time() - 1) * 10**9
-
-                w1 = index.Writer(b'index.tmp', ms1, tmax)
-                w1.add(b'/a/b/x', fs, meta_ofs1)
-                w1.add(b'/a/b/c', fs, meta_ofs1)
-                w1.add(b'/a/b/', ds, meta_ofs1)
-                w1.add(b'/a/', ds, meta_ofs1)
-                #w1.close()
-                WVPASS()
-
-                w2 = index.Writer(b'index2.tmp', ms2, tmax)
-                w2.add(b'/a/b/n/2', fs, meta_ofs2)
-                #w2.close()
-                WVPASS()
-
-                w3 = index.Writer(b'index3.tmp', ms3, tmax)
-                w3.add(b'/a/c/n/3', fs, meta_ofs3)
-                #w3.close()
-                WVPASS()
-
-                r1 = w1.new_reader()
-                r2 = w2.new_reader()
-                r3 = w3.new_reader()
-                WVPASS()
-
-                r1all = [e.name for e in r1]
-                WVPASSEQ(r1all,
-                         [b'/a/b/x', b'/a/b/c', b'/a/b/', b'/a/', b'/'])
-                r2all = [e.name for e in r2]
-                WVPASSEQ(r2all,
-                         [b'/a/b/n/2', b'/a/b/n/', b'/a/b/', b'/a/', b'/'])
-                r3all = [e.name for e in r3]
-                WVPASSEQ(r3all,
-                         [b'/a/c/n/3', b'/a/c/n/', b'/a/c/', b'/a/', b'/'])
-                all = [e.name for e in index.merge(r2, r1, r3)]
-                WVPASSEQ(all,
-                         [b'/a/c/n/3', b'/a/c/n/', b'/a/c/',
-                          b'/a/b/x', b'/a/b/n/2', b'/a/b/n/', b'/a/b/c',
-                          b'/a/b/', b'/a/', b'/'])
-                fake_validate(r1)
-                dump(r1)
-
-                print([hex(e.flags) for e in r1])
-                WVPASSEQ([e.name for e in r1 if e.is_valid()], r1all)
-                WVPASSEQ([e.name for e in r1 if not e.is_valid()], [])
-                WVPASSEQ([e.name for e in index.merge(r2, r1, r3) if not e.is_valid()],
-                         [b'/a/c/n/3', b'/a/c/n/', b'/a/c/',
-                          b'/a/b/n/2', b'/a/b/n/', b'/a/b/', b'/a/', b'/'])
-
-                expect_invalid = [b'/'] + r2all + r3all
-                expect_real = (set(r1all) - set(r2all) - set(r3all)) \
-                                | set([b'/a/b/n/2', b'/a/c/n/3'])
-                dump(index.merge(r2, r1, r3))
-                for e in index.merge(r2, r1, r3):
-                    print(e.name, hex(e.flags), e.ctime)
-                    eiv = e.name in expect_invalid
-                    er  = e.name in expect_real
-                    WVPASSEQ(eiv, not e.is_valid())
-                    WVPASSEQ(er, e.is_real())
-                fake_validate(r2, r3)
-                dump(index.merge(r2, r1, r3))
-                WVPASSEQ([e.name for e in index.merge(r2, r1, r3) if not e.is_valid()], [])
-
-                e = eget(index.merge(r2, r1, r3), b'/a/b/c')
-                e.invalidate()
-                e.repack()
-                dump(index.merge(r2, r1, r3))
-                WVPASSEQ([e.name for e in index.merge(r2, r1, r3) if not e.is_valid()],
-                         [b'/a/b/c', b'/a/b/', b'/a/', b'/'])
-                w1.close()
-                w2.close()
-                w3.close()
-            finally:
-                os.chdir(orig_cwd)
diff --git a/lib/bup/t/tmetadata.py b/lib/bup/t/tmetadata.py
deleted file mode 100644 (file)
index be9c772..0000000
+++ /dev/null
@@ -1,320 +0,0 @@
-
-from __future__ import absolute_import, print_function
-import errno, glob, grp, pwd, stat, tempfile, subprocess
-
-from wvtest import *
-
-from bup import git, metadata
-from bup import vfs
-from bup.compat import range
-from bup.helpers import clear_errors, detect_fakeroot, is_superuser, resolve_parent
-from bup.repo import LocalRepo
-from bup.xstat import utime, lutime
-from buptest import no_lingering_errors, test_tempdir
-import bup.helpers as helpers
-
-
-top_dir = b'../../..'
-bup_tmp = os.path.realpath(b'../../../t/tmp')
-bup_path = top_dir + b'/bup'
-start_dir = os.getcwd()
-
-
-def ex(*cmd):
-    try:
-        cmd_str = b' '.join(cmd)
-        print(cmd_str, file=sys.stderr)
-        rc = subprocess.call(cmd)
-        if rc < 0:
-            print('terminated by signal', - rc, file=sys.stderr)
-            sys.exit(1)
-        elif rc > 0:
-            print('returned exit status', rc, file=sys.stderr)
-            sys.exit(1)
-    except OSError as e:
-        print('subprocess call failed:', e, file=sys.stderr)
-        sys.exit(1)
-
-
-def setup_testfs():
-    assert(sys.platform.startswith('linux'))
-    # Set up testfs with user_xattr, etc.
-    if subprocess.call([b'modprobe', b'loop']) != 0:
-        return False
-    subprocess.call([b'umount', b'testfs'])
-    ex(b'dd', b'if=/dev/zero', b'of=testfs.img', b'bs=1M', b'count=32')
-    ex(b'mke2fs', b'-F', b'-j', b'-m', b'0', b'testfs.img')
-    ex(b'rm', b'-rf', b'testfs')
-    os.mkdir(b'testfs')
-    ex(b'mount', b'-o', b'loop,acl,user_xattr', b'testfs.img', b'testfs')
-    # Hide, so that tests can't create risks.
-    os.chown(b'testfs', 0, 0)
-    os.chmod(b'testfs', 0o700)
-    return True
-
-
-def cleanup_testfs():
-    subprocess.call([b'umount', b'testfs'])
-    helpers.unlink(b'testfs.img')
-
-
-@wvtest
-def test_clean_up_archive_path():
-    with no_lingering_errors():
-        cleanup = metadata._clean_up_path_for_archive
-        WVPASSEQ(cleanup(b'foo'), b'foo')
-        WVPASSEQ(cleanup(b'/foo'), b'foo')
-        WVPASSEQ(cleanup(b'///foo'), b'foo')
-        WVPASSEQ(cleanup(b'/foo/bar'), b'foo/bar')
-        WVPASSEQ(cleanup(b'foo/./bar'), b'foo/bar')
-        WVPASSEQ(cleanup(b'/foo/./bar'), b'foo/bar')
-        WVPASSEQ(cleanup(b'/foo/./bar/././baz'), b'foo/bar/baz')
-        WVPASSEQ(cleanup(b'/foo/./bar///././baz'), b'foo/bar/baz')
-        WVPASSEQ(cleanup(b'//./foo/./bar///././baz/.///'), b'foo/bar/baz/')
-        WVPASSEQ(cleanup(b'./foo/./.bar'), b'foo/.bar')
-        WVPASSEQ(cleanup(b'./foo/.'), b'foo')
-        WVPASSEQ(cleanup(b'./foo/..'), b'.')
-        WVPASSEQ(cleanup(b'//./..//.../..//.'), b'.')
-        WVPASSEQ(cleanup(b'//./..//..././/.'), b'...')
-        WVPASSEQ(cleanup(b'/////.'), b'.')
-        WVPASSEQ(cleanup(b'/../'), b'.')
-        WVPASSEQ(cleanup(b''), b'.')
-
-
-@wvtest
-def test_risky_path():
-    with no_lingering_errors():
-        risky = metadata._risky_path
-        WVPASS(risky(b'/foo'))
-        WVPASS(risky(b'///foo'))
-        WVPASS(risky(b'/../foo'))
-        WVPASS(risky(b'../foo'))
-        WVPASS(risky(b'foo/..'))
-        WVPASS(risky(b'foo/../'))
-        WVPASS(risky(b'foo/../bar'))
-        WVFAIL(risky(b'foo'))
-        WVFAIL(risky(b'foo/'))
-        WVFAIL(risky(b'foo///'))
-        WVFAIL(risky(b'./foo'))
-        WVFAIL(risky(b'foo/.'))
-        WVFAIL(risky(b'./foo/.'))
-        WVFAIL(risky(b'foo/bar'))
-        WVFAIL(risky(b'foo/./bar'))
-
-
-@wvtest
-def test_clean_up_extract_path():
-    with no_lingering_errors():
-        cleanup = metadata._clean_up_extract_path
-        WVPASSEQ(cleanup(b'/foo'), b'foo')
-        WVPASSEQ(cleanup(b'///foo'), b'foo')
-        WVFAIL(cleanup(b'/../foo'))
-        WVFAIL(cleanup(b'../foo'))
-        WVFAIL(cleanup(b'foo/..'))
-        WVFAIL(cleanup(b'foo/../'))
-        WVFAIL(cleanup(b'foo/../bar'))
-        WVPASSEQ(cleanup(b'foo'), b'foo')
-        WVPASSEQ(cleanup(b'foo/'), b'foo/')
-        WVPASSEQ(cleanup(b'foo///'), b'foo///')
-        WVPASSEQ(cleanup(b'./foo'), b'./foo')
-        WVPASSEQ(cleanup(b'foo/.'), b'foo/.')
-        WVPASSEQ(cleanup(b'./foo/.'), b'./foo/.')
-        WVPASSEQ(cleanup(b'foo/bar'), b'foo/bar')
-        WVPASSEQ(cleanup(b'foo/./bar'), b'foo/./bar')
-        WVPASSEQ(cleanup(b'/'), b'.')
-        WVPASSEQ(cleanup(b'./'), b'./')
-        WVPASSEQ(cleanup(b'///foo/bar'), b'foo/bar')
-        WVPASSEQ(cleanup(b'///foo/bar'), b'foo/bar')
-
-
-@wvtest
-def test_metadata_method():
-    with no_lingering_errors():
-        with test_tempdir(b'bup-tmetadata-') as tmpdir:
-            bup_dir = tmpdir + b'/bup'
-            data_path = tmpdir + b'/foo'
-            os.mkdir(data_path)
-            ex(b'touch', data_path + b'/file')
-            ex(b'ln', b'-s', b'file', data_path + b'/symlink')
-            test_time1 = 13 * 1000000000
-            test_time2 = 42 * 1000000000
-            utime(data_path + b'/file', (0, test_time1))
-            lutime(data_path + b'/symlink', (0, 0))
-            utime(data_path, (0, test_time2))
-            ex(bup_path, b'-d', bup_dir, b'init')
-            ex(bup_path, b'-d', bup_dir, b'index', b'-v', data_path)
-            ex(bup_path, b'-d', bup_dir, b'save', b'-tvvn', b'test', data_path)
-            git.check_repo_or_die(bup_dir)
-            repo = LocalRepo()
-            resolved = vfs.resolve(repo,
-                                   b'/test/latest' + resolve_parent(data_path),
-                                   follow=False)
-            leaf_name, leaf_item = resolved[-1]
-            m = leaf_item.meta
-            WVPASS(m.mtime == test_time2)
-            WVPASS(leaf_name == b'foo')
-            contents = tuple(vfs.contents(repo, leaf_item))
-            WVPASS(len(contents) == 3)
-            WVPASSEQ(frozenset(name for name, item in contents),
-                     frozenset((b'.', b'file', b'symlink')))
-            for name, item in contents:
-                if name == b'file':
-                    m = item.meta
-                    WVPASS(m.mtime == test_time1)
-                elif name == b'symlink':
-                    m = item.meta
-                    WVPASSEQ(m.symlink_target, b'file')
-                    WVPASSEQ(m.size, 4)
-                    WVPASSEQ(m.mtime, 0)
-
-
-def _first_err():
-    if helpers.saved_errors:
-        return str(helpers.saved_errors[0])
-    return ''
-
-
-@wvtest
-def test_from_path_error():
-    if is_superuser() or detect_fakeroot():
-        return
-    with no_lingering_errors():
-        with test_tempdir(b'bup-tmetadata-') as tmpdir:
-            path = tmpdir + b'/foo'
-            os.mkdir(path)
-            m = metadata.from_path(path, archive_path=path, save_symlinks=True)
-            WVPASSEQ(m.path, path)
-            os.chmod(path, 0o000)
-            metadata.from_path(path, archive_path=path, save_symlinks=True)
-            if metadata.get_linux_file_attr:
-                print('saved_errors:', helpers.saved_errors, file=sys.stderr)
-                WVPASS(len(helpers.saved_errors) == 1)
-                errmsg = _first_err()
-                WVPASS(errmsg.startswith('read Linux attr'))
-                clear_errors()
-
-
-def _linux_attr_supported(path):
-    # Expects path to denote a regular file or a directory.
-    if not metadata.get_linux_file_attr:
-        return False
-    try:
-        metadata.get_linux_file_attr(path)
-    except OSError as e:
-        if e.errno in (errno.ENOTTY, errno.ENOSYS, errno.EOPNOTSUPP):
-            return False
-        else:
-            raise
-    return True
-
-
-@wvtest
-def test_apply_to_path_restricted_access():
-    if is_superuser() or detect_fakeroot():
-        return
-    if sys.platform.startswith('cygwin'):
-        return # chmod 000 isn't effective.
-    with no_lingering_errors():
-        with test_tempdir(b'bup-tmetadata-') as tmpdir:
-            parent = tmpdir + b'/foo'
-            path = parent + b'/bar'
-            os.mkdir(parent)
-            os.mkdir(path)
-            clear_errors()
-            if metadata.xattr:
-                try:
-                    metadata.xattr.set(path, b'user.buptest', b'bup')
-                except:
-                    print("failed to set test xattr")
-                    # ignore any failures here - maybe FS cannot do it
-                    pass
-            m = metadata.from_path(path, archive_path=path, save_symlinks=True)
-            WVPASSEQ(m.path, path)
-            os.chmod(parent, 0o000)
-            m.apply_to_path(path)
-            print('saved_errors:', helpers.saved_errors, file=sys.stderr)
-            expected_errors = ['utime: ']
-            if m.linux_attr and _linux_attr_supported(tmpdir):
-                expected_errors.append('Linux chattr: ')
-            if metadata.xattr and m.linux_xattr:
-                expected_errors.append("xattr.set ")
-            WVPASS(len(helpers.saved_errors) == len(expected_errors))
-            for i in range(len(expected_errors)):
-                WVPASS(str(helpers.saved_errors[i]).startswith(expected_errors[i]))
-            clear_errors()
-
-
-@wvtest
-def test_restore_over_existing_target():
-    with no_lingering_errors():
-        with test_tempdir(b'bup-tmetadata-') as tmpdir:
-            path = tmpdir + b'/foo'
-            os.mkdir(path)
-            dir_m = metadata.from_path(path, archive_path=path, save_symlinks=True)
-            os.rmdir(path)
-            open(path, 'w').close()
-            file_m = metadata.from_path(path, archive_path=path, save_symlinks=True)
-            # Restore dir over file.
-            WVPASSEQ(dir_m.create_path(path, create_symlinks=True), None)
-            WVPASS(stat.S_ISDIR(os.stat(path).st_mode))
-            # Restore dir over dir.
-            WVPASSEQ(dir_m.create_path(path, create_symlinks=True), None)
-            WVPASS(stat.S_ISDIR(os.stat(path).st_mode))
-            # Restore file over dir.
-            WVPASSEQ(file_m.create_path(path, create_symlinks=True), None)
-            WVPASS(stat.S_ISREG(os.stat(path).st_mode))
-            # Restore file over file.
-            WVPASSEQ(file_m.create_path(path, create_symlinks=True), None)
-            WVPASS(stat.S_ISREG(os.stat(path).st_mode))
-            # Restore file over non-empty dir.
-            os.remove(path)
-            os.mkdir(path)
-            open(path + b'/bar', 'w').close()
-            WVEXCEPT(Exception, file_m.create_path, path, create_symlinks=True)
-            # Restore dir over non-empty dir.
-            os.remove(path + b'/bar')
-            os.mkdir(path + b'/bar')
-            WVEXCEPT(Exception, dir_m.create_path, path, create_symlinks=True)
-
-
-from bup.metadata import read_acl
-if not read_acl:
-    @wvtest
-    def POSIX1E_ACL_SUPPORT_IS_MISSING():
-        pass
-
-
-from bup.metadata import xattr
-if xattr:
-    def remove_selinux(attrs):
-        return list(filter(lambda i: not i in (b'security.selinux', ),
-                           attrs))
-
-    @wvtest
-    def test_handling_of_incorrect_existing_linux_xattrs():
-        if not is_superuser() or detect_fakeroot():
-            WVMSG('skipping test -- not superuser')
-            return
-        if not setup_testfs():
-            WVMSG('unable to load loop module; skipping dependent tests')
-            return
-        for f in glob.glob(b'testfs/*'):
-            ex(b'rm', b'-rf', f)
-        path = b'testfs/foo'
-        open(path, 'w').close()
-        xattr.set(path, b'foo', b'bar', namespace=xattr.NS_USER)
-        m = metadata.from_path(path, archive_path=path, save_symlinks=True)
-        xattr.set(path, b'baz', b'bax', namespace=xattr.NS_USER)
-        m.apply_to_path(path, restore_numeric_ids=False)
-        WVPASSEQ(remove_selinux(xattr.list(path)), [b'user.foo'])
-        WVPASSEQ(xattr.get(path, b'user.foo'), b'bar')
-        xattr.set(path, b'foo', b'baz', namespace=xattr.NS_USER)
-        m.apply_to_path(path, restore_numeric_ids=False)
-        WVPASSEQ(remove_selinux(xattr.list(path)), [b'user.foo'])
-        WVPASSEQ(xattr.get(path, b'user.foo'), b'bar')
-        xattr.remove(path, b'foo', namespace=xattr.NS_USER)
-        m.apply_to_path(path, restore_numeric_ids=False)
-        WVPASSEQ(remove_selinux(xattr.list(path)), [b'user.foo'])
-        WVPASSEQ(xattr.get(path, b'user.foo'), b'bar')
-        os.chdir(start_dir)
-        cleanup_testfs()
diff --git a/lib/bup/t/toptions.py b/lib/bup/t/toptions.py
deleted file mode 100644 (file)
index 1b60554..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-
-from __future__ import absolute_import
-
-from wvtest import *
-
-from bup import options
-from buptest import no_lingering_errors
-
-
-@wvtest
-def test_optdict():
-    with no_lingering_errors():
-        d = options.OptDict({
-            'x': ('x', False),
-            'y': ('y', False),
-            'z': ('z', False),
-            'other_thing': ('other_thing', False),
-            'no_other_thing': ('other_thing', True),
-            'no_z': ('z', True),
-            'no_smart': ('smart', True),
-            'smart': ('smart', False),
-            'stupid': ('smart', True),
-            'no_smart': ('smart', False),
-        })
-        WVPASS('foo')
-        d['x'] = 5
-        d['y'] = 4
-        d['z'] = 99
-        d['no_other_thing'] = 5
-        WVPASSEQ(d.x, 5)
-        WVPASSEQ(d.y, 4)
-        WVPASSEQ(d.z, 99)
-        WVPASSEQ(d.no_z, False)
-        WVPASSEQ(d.no_other_thing, True)
-        WVEXCEPT(KeyError, lambda: d.p)
-
-
-invalid_optspec0 = """
-"""
-
-
-invalid_optspec1 = """
-prog <whatever>
-"""
-
-
-invalid_optspec2 = """
---
-x,y
-"""
-
-
-@wvtest
-def test_invalid_optspec():
-    with no_lingering_errors():
-        WVPASS(options.Options(invalid_optspec0).parse([]))
-        WVPASS(options.Options(invalid_optspec1).parse([]))
-        WVPASS(options.Options(invalid_optspec2).parse([]))
-
-
-optspec = """
-prog <optionset> [stuff...]
-prog [-t] <boggle>
---
-t       test
-q,quiet   quiet
-l,longoption=   long option with parameters and a really really long description that will require wrapping
-p= short option with parameters
-onlylong  long option with no short
-neveropt never called options
-deftest1=  a default option with default [1]
-deftest2=  a default option with [1] default [2]
-deftest3=  a default option with [3] no actual default
-deftest4=  a default option with [[square]]
-deftest5=  a default option with "correct" [[square]
-s,smart,no-stupid  disable stupidity
-x,extended,no-simple   extended mode [2]
-#,compress=  set compression level [5]
-"""
-
-@wvtest
-def test_options():
-    with no_lingering_errors():
-        o = options.Options(optspec)
-        (opt,flags,extra) = o.parse(['-tttqp', 7, '--longoption', '19',
-                                     'hanky', '--onlylong', '-7'])
-        WVPASSEQ(flags[0], ('-t', ''))
-        WVPASSEQ(flags[1], ('-t', ''))
-        WVPASSEQ(flags[2], ('-t', ''))
-        WVPASSEQ(flags[3], ('-q', ''))
-        WVPASSEQ(flags[4], ('-p', 7))
-        WVPASSEQ(flags[5], ('--longoption', '19'))
-        WVPASSEQ(extra, ['hanky'])
-        WVPASSEQ((opt.t, opt.q, opt.p, opt.l, opt.onlylong,
-                  opt.neveropt), (3,1,7,19,1,None))
-        WVPASSEQ((opt.deftest1, opt.deftest2, opt.deftest3, opt.deftest4,
-                  opt.deftest5), (1,2,None,None,'[square'))
-        WVPASSEQ((opt.stupid, opt.no_stupid), (True, None))
-        WVPASSEQ((opt.smart, opt.no_smart), (None, True))
-        WVPASSEQ((opt.x, opt.extended, opt.no_simple), (2,2,2))
-        WVPASSEQ((opt.no_x, opt.no_extended, opt.simple), (False,False,False))
-        WVPASSEQ(opt['#'], 7)
-        WVPASSEQ(opt.compress, 7)
-
-        (opt,flags,extra) = o.parse(['--onlylong', '-t', '--no-onlylong',
-                                     '--smart', '--simple'])
-        WVPASSEQ((opt.t, opt.q, opt.onlylong), (1, None, 0))
-        WVPASSEQ((opt.stupid, opt.no_stupid), (False, True))
-        WVPASSEQ((opt.smart, opt.no_smart), (True, False))
-        WVPASSEQ((opt.x, opt.extended, opt.no_simple), (0,0,0))
-        WVPASSEQ((opt.no_x, opt.no_extended, opt.simple), (True,True,True))
diff --git a/lib/bup/t/tresolve.py b/lib/bup/t/tresolve.py
deleted file mode 100644 (file)
index f2e29d4..0000000
+++ /dev/null
@@ -1,334 +0,0 @@
-
-from __future__ import absolute_import, print_function
-from binascii import unhexlify
-from errno import ELOOP, ENOTDIR
-from os import symlink
-from stat import S_IFDIR
-from sys import stderr
-from time import localtime, strftime
-
-from wvtest import *
-
-from bup import git, path, vfs
-from bup.compat import environ
-from bup.io import path_msg
-from bup.metadata import Metadata
-from bup.repo import LocalRepo, RemoteRepo
-from bup.test.vfs import tree_dict
-from buptest import ex, exo, no_lingering_errors, test_tempdir
-
-bup_path = path.exe()
-
-## The clear_cache() calls below are to make sure that the test starts
-## from a known state since at the moment the cache entry for a given
-## item (like a commit) can change.  For example, its meta value might
-## be promoted from a mode to a Metadata instance once the tree it
-## refers to is traversed.
-
-def prep_and_test_repo(name, create_repo, test_repo):
-    with no_lingering_errors():
-        with test_tempdir(b'bup-t' + name) as tmpdir:
-            bup_dir = tmpdir + b'/bup'
-            environ[b'GIT_DIR'] = bup_dir
-            environ[b'BUP_DIR'] = bup_dir
-            ex((bup_path, b'init'))
-            git.repodir = bup_dir
-            with create_repo(bup_dir) as repo:
-                test_repo(repo, tmpdir)
-
-# Currently, we just test through the repos since LocalRepo resolve is
-# just a straight redirection to vfs.resolve.
-
-def test_resolve(repo, tmpdir):
-        data_path = tmpdir + b'/src'
-        resolve = repo.resolve
-        save_time = 100000
-        save_time_str = strftime('%Y-%m-%d-%H%M%S', localtime(save_time)).encode('ascii')
-        os.mkdir(data_path)
-        os.mkdir(data_path + b'/dir')
-        with open(data_path + b'/file', 'wb+') as tmpfile:
-            tmpfile.write(b'canary\n')
-        symlink(b'file', data_path + b'/file-symlink')
-        symlink(b'dir', data_path + b'/dir-symlink')
-        symlink(b'not-there', data_path + b'/bad-symlink')
-        ex((bup_path, b'index', b'-v', data_path))
-        ex((bup_path, b'save', b'-d', b'%d' % save_time, b'-tvvn', b'test',
-            b'--strip', data_path))
-        ex((bup_path, b'tag', b'test-tag', b'test'))
-
-        tip_hash = exo((b'git', b'show-ref', b'refs/heads/test'))[0]
-        tip_oidx = tip_hash.strip().split()[0]
-        tip_oid = unhexlify(tip_oidx)
-        tip_tree_oidx = exo((b'git', b'log', b'--pretty=%T', b'-n1',
-                             tip_oidx))[0].strip()
-        tip_tree_oid = unhexlify(tip_tree_oidx)
-        tip_tree = tree_dict(repo, tip_tree_oid)
-        test_revlist_w_meta = vfs.RevList(meta=tip_tree[b'.'].meta,
-                                          oid=tip_oid)
-        expected_latest_item = vfs.Commit(meta=S_IFDIR | 0o755,
-                                          oid=tip_tree_oid,
-                                          coid=tip_oid)
-        expected_latest_item_w_meta = vfs.Commit(meta=tip_tree[b'.'].meta,
-                                                 oid=tip_tree_oid,
-                                                 coid=tip_oid)
-        expected_latest_link = vfs.FakeLink(meta=vfs.default_symlink_mode,
-                                            target=save_time_str)
-        expected_test_tag_item = expected_latest_item
-
-        wvstart('resolve: /')
-        vfs.clear_cache()
-        res = resolve(b'/')
-        wvpasseq(1, len(res))
-        wvpasseq(((b'', vfs._root),), res)
-        ignore, root_item = res[0]
-        root_content = frozenset(vfs.contents(repo, root_item))
-        wvpasseq(frozenset([(b'.', root_item),
-                            (b'.tag', vfs._tags),
-                            (b'test', test_revlist_w_meta)]),
-                 root_content)
-        for path in (b'//', b'/.', b'/./', b'/..', b'/../',
-                     b'/test/latest/dir/../../..',
-                     b'/test/latest/dir/../../../',
-                     b'/test/latest/dir/../../../.',
-                     b'/test/latest/dir/../../..//',
-                     b'/test//latest/dir/../../..',
-                     b'/test/./latest/dir/../../..',
-                     b'/test/././latest/dir/../../..',
-                     b'/test/.//./latest/dir/../../..',
-                     b'/test//.//.//latest/dir/../../..'
-                     b'/test//./latest/dir/../../..'):
-            wvstart('resolve: ' + path_msg(path))
-            vfs.clear_cache()
-            res = resolve(path)
-            wvpasseq(((b'', vfs._root),), res)
-
-        wvstart('resolve: /.tag')
-        vfs.clear_cache()
-        res = resolve(b'/.tag')
-        wvpasseq(2, len(res))
-        wvpasseq(((b'', vfs._root), (b'.tag', vfs._tags)),
-                 res)
-        ignore, tag_item = res[1]
-        tag_content = frozenset(vfs.contents(repo, tag_item))
-        wvpasseq(frozenset([(b'.', tag_item),
-                            (b'test-tag', expected_test_tag_item)]),
-                 tag_content)
-
-        wvstart('resolve: /test')
-        vfs.clear_cache()
-        res = resolve(b'/test')
-        wvpasseq(2, len(res))
-        wvpasseq(((b'', vfs._root), (b'test', test_revlist_w_meta)), res)
-        ignore, test_item = res[1]
-        test_content = frozenset(vfs.contents(repo, test_item))
-        # latest has metadata here due to caching
-        wvpasseq(frozenset([(b'.', test_revlist_w_meta),
-                            (save_time_str, expected_latest_item_w_meta),
-                            (b'latest', expected_latest_link)]),
-                 test_content)
-
-        wvstart('resolve: /test/latest')
-        vfs.clear_cache()
-        res = resolve(b'/test/latest')
-        wvpasseq(3, len(res))
-        expected_latest_item_w_meta = vfs.Commit(meta=tip_tree[b'.'].meta,
-                                                 oid=tip_tree_oid,
-                                                 coid=tip_oid)
-        expected = ((b'', vfs._root),
-                    (b'test', test_revlist_w_meta),
-                    (save_time_str, expected_latest_item_w_meta))
-        wvpasseq(expected, res)
-        ignore, latest_item = res[2]
-        latest_content = frozenset(vfs.contents(repo, latest_item))
-        expected = frozenset((x.name, vfs.Item(oid=x.oid, meta=x.meta))
-                             for x in (tip_tree[name]
-                                       for name in (b'.',
-                                                    b'bad-symlink',
-                                                    b'dir',
-                                                    b'dir-symlink',
-                                                    b'file',
-                                                    b'file-symlink')))
-        wvpasseq(expected, latest_content)
-
-        wvstart('resolve: /test/latest/file')
-        vfs.clear_cache()
-        res = resolve(b'/test/latest/file')
-        wvpasseq(4, len(res))
-        expected_file_item_w_meta = vfs.Item(meta=tip_tree[b'file'].meta,
-                                             oid=tip_tree[b'file'].oid)
-        expected = ((b'', vfs._root),
-                    (b'test', test_revlist_w_meta),
-                    (save_time_str, expected_latest_item_w_meta),
-                    (b'file', expected_file_item_w_meta))
-        wvpasseq(expected, res)
-
-        wvstart('resolve: /test/latest/bad-symlink')
-        vfs.clear_cache()
-        res = resolve(b'/test/latest/bad-symlink')
-        wvpasseq(4, len(res))
-        expected = ((b'', vfs._root),
-                    (b'test', test_revlist_w_meta),
-                    (save_time_str, expected_latest_item_w_meta),
-                    (b'not-there', None))
-        wvpasseq(expected, res)
-
-        wvstart('resolve nofollow: /test/latest/bad-symlink')
-        vfs.clear_cache()
-        res = resolve(b'/test/latest/bad-symlink', follow=False)
-        wvpasseq(4, len(res))
-        bad_symlink_value = tip_tree[b'bad-symlink']
-        expected_bad_symlink_item_w_meta = vfs.Item(meta=bad_symlink_value.meta,
-                                                    oid=bad_symlink_value.oid)
-        expected = ((b'', vfs._root),
-                    (b'test', test_revlist_w_meta),
-                    (save_time_str, expected_latest_item_w_meta),
-                    (b'bad-symlink', expected_bad_symlink_item_w_meta))
-        wvpasseq(expected, res)
-
-        wvstart('resolve: /test/latest/file-symlink')
-        vfs.clear_cache()
-        res = resolve(b'/test/latest/file-symlink')
-        wvpasseq(4, len(res))
-        expected = ((b'', vfs._root),
-                    (b'test', test_revlist_w_meta),
-                    (save_time_str, expected_latest_item_w_meta),
-                    (b'file', expected_file_item_w_meta))
-        wvpasseq(expected, res)
-
-        wvstart('resolve nofollow: /test/latest/file-symlink')
-        vfs.clear_cache()
-        res = resolve(b'/test/latest/file-symlink', follow=False)
-        wvpasseq(4, len(res))
-        file_symlink_value = tip_tree[b'file-symlink']
-        expected_file_symlink_item_w_meta = vfs.Item(meta=file_symlink_value.meta,
-                                                     oid=file_symlink_value.oid)
-        expected = ((b'', vfs._root),
-                    (b'test', test_revlist_w_meta),
-                    (save_time_str, expected_latest_item_w_meta),
-                    (b'file-symlink', expected_file_symlink_item_w_meta))
-        wvpasseq(expected, res)
-
-        wvstart('resolve: /test/latest/missing')
-        vfs.clear_cache()
-        res = resolve(b'/test/latest/missing')
-        wvpasseq(4, len(res))
-        name, item = res[-1]
-        wvpasseq(b'missing', name)
-        wvpass(item is None)
-
-        for path in (b'/test/latest/file/',
-                     b'/test/latest/file/.',
-                     b'/test/latest/file/..',
-                     b'/test/latest/file/../',
-                     b'/test/latest/file/../.',
-                     b'/test/latest/file/../..',
-                     b'/test/latest/file/foo'):
-            wvstart('resolve: ' + path_msg(path))
-            vfs.clear_cache()
-            try:
-                resolve(path)
-            except vfs.IOError as res_ex:
-                wvpasseq(ENOTDIR, res_ex.errno)
-                wvpasseq([b'', b'test', save_time_str, b'file'],
-                         [name for name, item in res_ex.terminus])
-
-        for path in (b'/test/latest/file-symlink/',
-                     b'/test/latest/file-symlink/.',
-                     b'/test/latest/file-symlink/..',
-                     b'/test/latest/file-symlink/../',
-                     b'/test/latest/file-symlink/../.',
-                     b'/test/latest/file-symlink/../..'):
-            wvstart('resolve nofollow: ' + path_msg(path))
-            vfs.clear_cache()
-            try:
-                resolve(path, follow=False)
-            except vfs.IOError as res_ex:
-                wvpasseq(ENOTDIR, res_ex.errno)
-                wvpasseq([b'', b'test', save_time_str, b'file'],
-                         [name for name, item in res_ex.terminus])
-
-        wvstart('resolve: non-directory parent')
-        vfs.clear_cache()
-        file_res = resolve(b'/test/latest/file')
-        try:
-            resolve(b'foo', parent=file_res)
-        except vfs.IOError as res_ex:
-            wvpasseq(ENOTDIR, res_ex.errno)
-            wvpasseq(None, res_ex.terminus)
-
-        wvstart('resolve nofollow: /test/latest/dir-symlink')
-        vfs.clear_cache()
-        res = resolve(b'/test/latest/dir-symlink', follow=False)
-        wvpasseq(4, len(res))
-        dir_symlink_value = tip_tree[b'dir-symlink']
-        expected_dir_symlink_item_w_meta = vfs.Item(meta=dir_symlink_value.meta,
-                                                     oid=dir_symlink_value.oid)
-        expected = ((b'', vfs._root),
-                    (b'test', test_revlist_w_meta),
-                    (save_time_str, expected_latest_item_w_meta),
-                    (b'dir-symlink', expected_dir_symlink_item_w_meta))
-        wvpasseq(expected, res)
-
-        dir_value = tip_tree[b'dir']
-        expected_dir_item = vfs.Item(oid=dir_value.oid,
-                                     meta=tree_dict(repo, dir_value.oid)[b'.'].meta)
-        expected = ((b'', vfs._root),
-                    (b'test', test_revlist_w_meta),
-                    (save_time_str, expected_latest_item_w_meta),
-                    (b'dir', expected_dir_item))
-        def lresolve(*args, **keys):
-            return resolve(*args, **dict(keys, follow=False))
-        for resname, resolver in (('resolve', resolve),
-                                  ('resolve nofollow', lresolve)):
-            for path in (b'/test/latest/dir-symlink/',
-                         b'/test/latest/dir-symlink/.'):
-                wvstart(resname + ': ' + path_msg(path))
-                vfs.clear_cache()
-                res = resolver(path)
-                wvpasseq(4, len(res))
-                wvpasseq(expected, res)
-        wvstart('resolve: /test/latest/dir-symlink')
-        vfs.clear_cache()
-        res = resolve(path)
-        wvpasseq(4, len(res))
-        wvpasseq(expected, res)
-
-@wvtest
-def test_local_resolve():
-    prep_and_test_repo(b'local-vfs-resolve',
-                       lambda x: LocalRepo(repo_dir=x), test_resolve)
-
-@wvtest
-def test_remote_resolve():
-    prep_and_test_repo(b'remote-vfs-resolve',
-                       lambda x: RemoteRepo(x), test_resolve)
-
-def test_resolve_loop(repo, tmpdir):
-    data_path = tmpdir + b'/src'
-    os.mkdir(data_path)
-    symlink(b'loop', data_path + b'/loop')
-    ex((bup_path, b'init'))
-    ex((bup_path, b'index', b'-v', data_path))
-    save_utc = 100000
-    ex((bup_path, b'save', b'-d', b'%d' % save_utc, b'-tvvn', b'test', b'--strip',
-        data_path))
-    save_name = strftime('%Y-%m-%d-%H%M%S', localtime(save_utc)).encode('ascii')
-    try:
-        wvpasseq('this call should never return',
-                 repo.resolve(b'/test/%s/loop' % save_name))
-    except vfs.IOError as res_ex:
-        wvpasseq(ELOOP, res_ex.errno)
-        wvpasseq([b'', b'test', save_name, b'loop'],
-                 [name for name, item in res_ex.terminus])
-
-@wvtest
-def test_local_resolve_loop():
-    prep_and_test_repo(b'local-vfs-resolve-loop',
-                       lambda x: LocalRepo(x), test_resolve_loop)
-
-@wvtest
-def test_remote_resolve_loop():
-    prep_and_test_repo(b'remote-vfs-resolve-loop',
-                       lambda x: RemoteRepo(x), test_resolve_loop)
-
-# FIXME: add tests for the want_meta=False cases.
diff --git a/lib/bup/t/tshquote.py b/lib/bup/t/tshquote.py
deleted file mode 100644 (file)
index 8c85d4b..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-
-from __future__ import absolute_import
-
-from wvtest import *
-
-from bup import shquote
-from buptest import no_lingering_errors
-
-
-def qst(line):
-    return [word for offset,word in shquote.quotesplit(line)]
-
-@wvtest
-def test_shquote():
-    with no_lingering_errors():
-        WVPASSEQ(qst(b"""  this is    basic \t\n\r text  """),
-                 [b'this', b'is', b'basic', b'text'])
-        WVPASSEQ(qst(br""" \"x\" "help" 'yelp' """), [b'"x"', b'help', b'yelp'])
-        WVPASSEQ(qst(br""" "'\"\"'" '\"\'' """), [b"'\"\"'", b'\\"\''])
-
-        WVPASSEQ(shquote.quotesplit(b'  this is "unfinished'),
-                 [(2, b'this'), (7, b'is'), (10, b'unfinished')])
-
-        WVPASSEQ(shquote.quotesplit(b'"silly"\'will'),
-                 [(0, b'silly'), (7, b'will')])
-
-        WVPASSEQ(shquote.unfinished_word(b'this is a "billy" "goat'),
-                 (b'"', b'goat'))
-        WVPASSEQ(shquote.unfinished_word(b"'x"),
-                 (b"'", b'x'))
-        WVPASSEQ(shquote.unfinished_word(b"abra cadabra "),
-                 (None, b''))
-        WVPASSEQ(shquote.unfinished_word(b"abra cadabra"),
-                 (None, b'cadabra'))
-
-        qtype, word = shquote.unfinished_word(b"this is /usr/loc")
-        WVPASSEQ(shquote.what_to_add(qtype, word, b"/usr/local", True),
-                 b"al")
-        qtype, word = shquote.unfinished_word(b"this is '/usr/loc")
-        WVPASSEQ(shquote.what_to_add(qtype, word, b"/usr/local", True),
-                 b"al'")
-        qtype, word = shquote.unfinished_word(b"this is \"/usr/loc")
-        WVPASSEQ(shquote.what_to_add(qtype, word, b"/usr/local", True),
-                 b"al\"")
-        qtype, word = shquote.unfinished_word(b"this is \"/usr/loc")
-        WVPASSEQ(shquote.what_to_add(qtype, word, b"/usr/local", False),
-                 b"al")
-        qtype, word = shquote.unfinished_word(b"this is \\ hammer\\ \"")
-        WVPASSEQ(word, b' hammer "')
-        WVPASSEQ(shquote.what_to_add(qtype, word, b" hammer \"time\"", True),
-                 b"time\\\"")
-
-        WVPASSEQ(shquote.quotify_list([b'a', b'', b'"word"', b"'third'", b"'",
-                                       b"x y"]),
-                 b"a '' '\"word\"' \"'third'\" \"'\" 'x y'")
diff --git a/lib/bup/t/tvfs.py b/lib/bup/t/tvfs.py
deleted file mode 100644 (file)
index 2563333..0000000
+++ /dev/null
@@ -1,402 +0,0 @@
-
-from __future__ import absolute_import, print_function
-from binascii import unhexlify
-from collections import namedtuple
-from errno import ELOOP, ENOTDIR
-from io import BytesIO
-from os import symlink
-from random import Random, randint
-from stat import S_IFDIR, S_IFLNK, S_IFREG, S_ISDIR, S_ISREG
-from sys import stderr
-from time import localtime, strftime, tzset
-
-from wvtest import *
-
-from bup._helpers import write_random
-from bup import git, metadata, vfs
-from bup.compat import environ, fsencode, items, range
-from bup.git import BUP_CHUNKED
-from bup.helpers import exc, shstr
-from bup.metadata import Metadata
-from bup.repo import LocalRepo
-from bup.test.vfs import tree_dict
-from buptest import ex, exo, no_lingering_errors, test_tempdir
-
-top_dir = b'../../..'
-bup_tmp = os.path.realpath(b'../../../t/tmp')
-bup_path = top_dir + b'/bup'
-start_dir = os.getcwd()
-
-def ex(cmd, **kwargs):
-    print(shstr(cmd), file=stderr)
-    return exc(cmd, **kwargs)
-
-@wvtest
-def test_default_modes():
-    wvpasseq(S_IFREG | 0o644, vfs.default_file_mode)
-    wvpasseq(S_IFDIR | 0o755, vfs.default_dir_mode)
-    wvpasseq(S_IFLNK | 0o755, vfs.default_symlink_mode)
-
-@wvtest
-def test_cache_behavior():
-    orig_max = vfs._cache_max_items
-    try:
-        vfs._cache_max_items = 2
-        vfs.clear_cache()
-        wvpasseq({}, vfs._cache)
-        wvpasseq([], vfs._cache_keys)
-        wvfail(vfs._cache_keys)
-        wvexcept(Exception, vfs.cache_notice, b'x', 1)
-        key_0 = b'itm:' + b'\0' * 20
-        key_1 = b'itm:' + b'\1' * 20
-        key_2 = b'itm:' + b'\2' * 20
-        vfs.cache_notice(key_0, b'something')
-        wvpasseq({key_0 : b'something'}, vfs._cache)
-        wvpasseq([key_0], vfs._cache_keys)
-        vfs.cache_notice(key_1, b'something else')
-        wvpasseq({key_0 : b'something', key_1 : b'something else'}, vfs._cache)
-        wvpasseq(frozenset([key_0, key_1]), frozenset(vfs._cache_keys))
-        vfs.cache_notice(key_2, b'and also')
-        wvpasseq(2, len(vfs._cache))
-        wvpass(frozenset(items(vfs._cache))
-               < frozenset(items({key_0 : b'something',
-                                  key_1 : b'something else',
-                                  key_2 : b'and also'})))
-        wvpasseq(2, len(vfs._cache_keys))
-        wvpass(frozenset(vfs._cache_keys) < frozenset([key_0, key_1, key_2]))
-        vfs.clear_cache()
-        wvpasseq({}, vfs._cache)
-        wvpasseq([], vfs._cache_keys)
-    finally:
-        vfs._cache_max_items = orig_max
-        vfs.clear_cache()
-
-## The clear_cache() calls below are to make sure that the test starts
-## from a known state since at the moment the cache entry for a given
-## item (like a commit) can change.  For example, its meta value might
-## be promoted from a mode to a Metadata instance once the tree it
-## refers to is traversed.
-
-def run_augment_item_meta_tests(repo,
-                                file_path, file_size,
-                                link_path, link_target):
-    _, file_item = vfs.resolve(repo, file_path)[-1]
-    _, link_item = vfs.resolve(repo, link_path, follow=False)[-1]
-    wvpass(isinstance(file_item.meta, Metadata))
-    wvpass(isinstance(link_item.meta, Metadata))
-    # Note: normally, modifying item.meta values is forbidden
-    file_item.meta.size = file_item.meta.size or vfs.item_size(repo, file_item)
-    link_item.meta.size = link_item.meta.size or vfs.item_size(repo, link_item)
-
-    ## Ensure a fully populated item is left alone
-    augmented = vfs.augment_item_meta(repo, file_item)
-    wvpass(augmented is file_item)
-    wvpass(augmented.meta is file_item.meta)
-    augmented = vfs.augment_item_meta(repo, file_item, include_size=True)
-    wvpass(augmented is file_item)
-    wvpass(augmented.meta is file_item.meta)
-
-    ## Ensure a missing size is handled poperly
-    file_item.meta.size = None
-    augmented = vfs.augment_item_meta(repo, file_item)
-    wvpass(augmented is file_item)
-    wvpass(augmented.meta is file_item.meta)
-    augmented = vfs.augment_item_meta(repo, file_item, include_size=True)
-    wvpass(augmented is not file_item)
-    wvpasseq(file_size, augmented.meta.size)
-
-    ## Ensure a meta mode is handled properly
-    mode_item = file_item._replace(meta=vfs.default_file_mode)
-    augmented = vfs.augment_item_meta(repo, mode_item)
-    augmented_w_size = vfs.augment_item_meta(repo, mode_item, include_size=True)
-    for item in (augmented, augmented_w_size):
-        meta = item.meta
-        wvpass(item is not file_item)
-        wvpass(isinstance(meta, Metadata))
-        wvpasseq(vfs.default_file_mode, meta.mode)
-        wvpasseq((None, None, 0, 0, 0),
-                 (meta.uid, meta.gid, meta.atime, meta.mtime, meta.ctime))
-    wvpass(augmented.meta.size is None)
-    wvpasseq(file_size, augmented_w_size.meta.size)
-
-    ## Ensure symlinks are handled properly
-    mode_item = link_item._replace(meta=vfs.default_symlink_mode)
-    augmented = vfs.augment_item_meta(repo, mode_item)
-    wvpass(augmented is not mode_item)
-    wvpass(isinstance(augmented.meta, Metadata))
-    wvpasseq(link_target, augmented.meta.symlink_target)
-    wvpasseq(len(link_target), augmented.meta.size)
-    augmented = vfs.augment_item_meta(repo, mode_item, include_size=True)
-    wvpass(augmented is not mode_item)
-    wvpass(isinstance(augmented.meta, Metadata))
-    wvpasseq(link_target, augmented.meta.symlink_target)
-    wvpasseq(len(link_target), augmented.meta.size)
-
-
-@wvtest
-def test_item_mode():
-    with no_lingering_errors():
-        mode = S_IFDIR | 0o755
-        meta = metadata.from_path(b'.')
-        oid = b'\0' * 20
-        wvpasseq(mode, vfs.item_mode(vfs.Item(oid=oid, meta=mode)))
-        wvpasseq(meta.mode, vfs.item_mode(vfs.Item(oid=oid, meta=meta)))
-
-@wvtest
-def test_reverse_suffix_duplicates():
-    suffix = lambda x: tuple(vfs._reverse_suffix_duplicates(x))
-    wvpasseq((b'x',), suffix((b'x',)))
-    wvpasseq((b'x', b'y'), suffix((b'x', b'y')))
-    wvpasseq((b'x-1', b'x-0'), suffix((b'x',) * 2))
-    wvpasseq([b'x-%02d' % n for n in reversed(range(11))],
-             list(suffix((b'x',) * 11)))
-    wvpasseq((b'x-1', b'x-0', b'y'), suffix((b'x', b'x', b'y')))
-    wvpasseq((b'x', b'y-1', b'y-0'), suffix((b'x', b'y', b'y')))
-    wvpasseq((b'x', b'y-1', b'y-0', b'z'), suffix((b'x', b'y', b'y', b'z')))
-
-@wvtest
-def test_misc():
-    with no_lingering_errors():
-        with test_tempdir(b'bup-tvfs-') as tmpdir:
-            bup_dir = tmpdir + b'/bup'
-            environ[b'GIT_DIR'] = bup_dir
-            environ[b'BUP_DIR'] = bup_dir
-            git.repodir = bup_dir
-            data_path = tmpdir + b'/src'
-            os.mkdir(data_path)
-            with open(data_path + b'/file', 'wb+') as tmpfile:
-                tmpfile.write(b'canary\n')
-            symlink(b'file', data_path + b'/symlink')
-            ex((bup_path, b'init'))
-            ex((bup_path, b'index', b'-v', data_path))
-            ex((bup_path, b'save', b'-d', b'100000', b'-tvvn', b'test',
-                b'--strip', data_path))
-            repo = LocalRepo()
-
-            wvstart('readlink')
-            ls_tree = exo((b'git', b'ls-tree', b'test', b'symlink')).out
-            mode, typ, oidx, name = ls_tree.strip().split(None, 3)
-            assert name == b'symlink'
-            link_item = vfs.Item(oid=unhexlify(oidx), meta=int(mode, 8))
-            wvpasseq(b'file', vfs.readlink(repo, link_item))
-
-            ls_tree = exo((b'git', b'ls-tree', b'test', b'file')).out
-            mode, typ, oidx, name = ls_tree.strip().split(None, 3)
-            assert name == b'file'
-            file_item = vfs.Item(oid=unhexlify(oidx), meta=int(mode, 8))
-            wvexcept(Exception, vfs.readlink, repo, file_item)
-
-            wvstart('item_size')
-            wvpasseq(4, vfs.item_size(repo, link_item))
-            wvpasseq(7, vfs.item_size(repo, file_item))
-            meta = metadata.from_path(fsencode(__file__))
-            meta.size = 42
-            fake_item = file_item._replace(meta=meta)
-            wvpasseq(42, vfs.item_size(repo, fake_item))
-
-            _, fakelink_item = vfs.resolve(repo, b'/test/latest', follow=False)[-1]
-            wvpasseq(17, vfs.item_size(repo, fakelink_item))
-
-            wvstart('augment_item_meta')
-            run_augment_item_meta_tests(repo,
-                                        b'/test/latest/file', 7,
-                                        b'/test/latest/symlink', b'file')
-
-            wvstart('copy_item')
-            # FIXME: this caused StopIteration
-            #_, file_item = vfs.resolve(repo, '/file')[-1]
-            _, file_item = vfs.resolve(repo, b'/test/latest/file')[-1]
-            file_copy = vfs.copy_item(file_item)
-            wvpass(file_copy is not file_item)
-            wvpass(file_copy.meta is not file_item.meta)
-            wvpass(isinstance(file_copy, tuple))
-            wvpass(file_item.meta.user)
-            wvpass(file_copy.meta.user)
-            file_copy.meta.user = None
-            wvpass(file_item.meta.user)
-
-def write_sized_random_content(parent_dir, size, seed):
-    verbose = 0
-    with open(b'%s/%d' % (parent_dir, size), 'wb') as f:
-        write_random(f.fileno(), size, seed, verbose)
-
-def validate_vfs_streaming_read(repo, item, expected_path, read_sizes):
-    for read_size in read_sizes:
-        with open(expected_path, 'rb') as expected:
-            with vfs.fopen(repo, item) as actual:
-                ex_buf = expected.read(read_size)
-                act_buf = actual.read(read_size)
-                while ex_buf and act_buf:
-                    wvpassge(read_size, len(ex_buf))
-                    wvpassge(read_size, len(act_buf))
-                    wvpasseq(len(ex_buf), len(act_buf))
-                    wvpass(ex_buf == act_buf)
-                    ex_buf = expected.read(read_size)
-                    act_buf = actual.read(read_size)
-                wvpasseq(b'', ex_buf)
-                wvpasseq(b'', act_buf)
-
-def validate_vfs_seeking_read(repo, item, expected_path, read_sizes):
-    def read_act(act_pos):
-        with vfs.fopen(repo, item) as actual:
-            actual.seek(act_pos)
-            wvpasseq(act_pos, actual.tell())
-            act_buf = actual.read(read_size)
-            act_pos += len(act_buf)
-            wvpasseq(act_pos, actual.tell())
-            return act_pos, act_buf
-
-    for read_size in read_sizes:
-        with open(expected_path, 'rb') as expected:
-                ex_buf = expected.read(read_size)
-                act_buf = None
-                act_pos = 0
-                while ex_buf:
-                    act_pos, act_buf = read_act(act_pos)
-                    wvpassge(read_size, len(ex_buf))
-                    wvpassge(read_size, len(act_buf))
-                    wvpasseq(len(ex_buf), len(act_buf))
-                    wvpass(ex_buf == act_buf)
-                    if not act_buf:
-                        break
-                    ex_buf = expected.read(read_size)
-                else:  # hit expected eof first
-                    act_pos, act_buf = read_act(act_pos)
-                wvpasseq(b'', ex_buf)
-                wvpasseq(b'', act_buf)
-
-@wvtest
-def test_read_and_seek():
-    # Write a set of randomly sized files containing random data whose
-    # names are their sizes, and then verify that what we get back
-    # from the vfs when seeking and reading with various block sizes
-    # matches the original content.
-    with no_lingering_errors():
-        with test_tempdir(b'bup-tvfs-read-') as tmpdir:
-            resolve = vfs.resolve
-            bup_dir = tmpdir + b'/bup'
-            environ[b'GIT_DIR'] = bup_dir
-            environ[b'BUP_DIR'] = bup_dir
-            git.repodir = bup_dir
-            repo = LocalRepo()
-            data_path = tmpdir + b'/src'
-            os.mkdir(data_path)
-            seed = randint(-(1 << 31), (1 << 31) - 1)
-            rand = Random()
-            rand.seed(seed)
-            print('test_read seed:', seed, file=sys.stderr)
-            max_size = 2 * 1024 * 1024
-            sizes = set((rand.randint(1, max_size) for _ in range(5)))
-            sizes.add(1)
-            sizes.add(max_size)
-            for size in sizes:
-                write_sized_random_content(data_path, size, seed)
-            ex((bup_path, b'init'))
-            ex((bup_path, b'index', b'-v', data_path))
-            ex((bup_path, b'save', b'-d', b'100000', b'-tvvn', b'test',
-                b'--strip', data_path))
-            read_sizes = set((rand.randint(1, max_size) for _ in range(10)))
-            sizes.add(1)
-            sizes.add(max_size)
-            print('test_read src sizes:', sizes, file=sys.stderr)
-            print('test_read read sizes:', read_sizes, file=sys.stderr)
-            for size in sizes:
-                res = resolve(repo, b'/test/latest/' + str(size).encode('ascii'))
-                _, item = res[-1]
-                wvpasseq(size, vfs.item_size(repo, res[-1][1]))
-                validate_vfs_streaming_read(repo, item,
-                                            b'%s/%d' % (data_path, size),
-                                            read_sizes)
-                validate_vfs_seeking_read(repo, item,
-                                          b'%s/%d' % (data_path, size),
-                                          read_sizes)
-
-@wvtest
-def test_contents_with_mismatched_bupm_git_ordering():
-    with no_lingering_errors():
-        with test_tempdir(b'bup-tvfs-') as tmpdir:
-            bup_dir = tmpdir + b'/bup'
-            environ[b'GIT_DIR'] = bup_dir
-            environ[b'BUP_DIR'] = bup_dir
-            git.repodir = bup_dir
-            data_path = tmpdir + b'/src'
-            os.mkdir(data_path)
-            os.mkdir(data_path + b'/foo')
-            with open(data_path + b'/foo.', 'wb+') as tmpfile:
-                tmpfile.write(b'canary\n')
-            ex((bup_path, b'init'))
-            ex((bup_path, b'index', b'-v', data_path))
-            save_utc = 100000
-            save_name = strftime('%Y-%m-%d-%H%M%S', localtime(save_utc)).encode('ascii')
-            ex((bup_path, b'save', b'-tvvn', b'test', b'-d', b'%d' % save_utc,
-                b'--strip', data_path))
-            repo = LocalRepo()
-            tip_sref = exo((b'git', b'show-ref', b'refs/heads/test')).out
-            tip_oidx = tip_sref.strip().split()[0]
-            tip_tree_oidx = exo((b'git', b'log', b'--pretty=%T', b'-n1',
-                                 tip_oidx)).out.strip()
-            tip_tree_oid = unhexlify(tip_tree_oidx)
-            tip_tree = tree_dict(repo, tip_tree_oid)
-
-            name, item = vfs.resolve(repo, b'/test/latest')[2]
-            wvpasseq(save_name, name)
-            expected = frozenset((x.name, vfs.Item(oid=x.oid, meta=x.meta))
-                                 for x in (tip_tree[name]
-                                           for name in (b'.', b'foo', b'foo.')))
-            contents = tuple(vfs.contents(repo, item))
-            wvpasseq(expected, frozenset(contents))
-            # Spot check, in case tree_dict shares too much code with the vfs
-            name, item = next(((n, i) for n, i in contents if n == b'foo'))
-            wvpass(S_ISDIR(item.meta))
-            name, item = next(((n, i) for n, i in contents if n == b'foo.'))
-            wvpass(S_ISREG(item.meta.mode))
-
-@wvtest
-def test_duplicate_save_dates():
-    with no_lingering_errors():
-        with test_tempdir(b'bup-tvfs-') as tmpdir:
-            bup_dir = tmpdir + b'/bup'
-            environ[b'GIT_DIR'] = bup_dir
-            environ[b'BUP_DIR'] = bup_dir
-            environ[b'TZ'] = b'UTC'
-            tzset()
-            git.repodir = bup_dir
-            data_path = tmpdir + b'/src'
-            os.mkdir(data_path)
-            with open(data_path + b'/file', 'wb+') as tmpfile:
-                tmpfile.write(b'canary\n')
-            ex((b'env',))
-            ex((bup_path, b'init'))
-            ex((bup_path, b'index', b'-v', data_path))
-            for i in range(11):
-                ex((bup_path, b'save', b'-d', b'100000', b'-n', b'test',
-                    data_path))
-            repo = LocalRepo()
-            res = vfs.resolve(repo, b'/test')
-            wvpasseq(2, len(res))
-            name, revlist = res[-1]
-            wvpasseq(b'test', name)
-            wvpasseq((b'.',
-                      b'1970-01-02-034640-00',
-                      b'1970-01-02-034640-01',
-                      b'1970-01-02-034640-02',
-                      b'1970-01-02-034640-03',
-                      b'1970-01-02-034640-04',
-                      b'1970-01-02-034640-05',
-                      b'1970-01-02-034640-06',
-                      b'1970-01-02-034640-07',
-                      b'1970-01-02-034640-08',
-                      b'1970-01-02-034640-09',
-                      b'1970-01-02-034640-10',
-                      b'latest'),
-                     tuple(sorted(x[0] for x in vfs.contents(repo, revlist))))
-
-@wvtest
-def test_item_read_write():
-    with no_lingering_errors():
-        x = vfs.Root(meta=13)
-        stream = BytesIO()
-        vfs.write_item(stream, x)
-        print('stream:', repr(stream.getvalue()), stream.tell(), file=sys.stderr)
-        stream.seek(0)
-        wvpasseq(x, vfs.read_item(stream))
diff --git a/lib/bup/t/tvint.py b/lib/bup/t/tvint.py
deleted file mode 100644 (file)
index 6bee0f3..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-
-from __future__ import absolute_import
-from io import BytesIO
-
-from wvtest import *
-
-from bup import vint
-from buptest import no_lingering_errors
-
-
-def encode_and_decode_vuint(x):
-    f = BytesIO()
-    vint.write_vuint(f, x)
-    return vint.read_vuint(BytesIO(f.getvalue()))
-
-
-@wvtest
-def test_vuint():
-    with no_lingering_errors():
-        for x in (0, 1, 42, 128, 10**16):
-            WVPASSEQ(encode_and_decode_vuint(x), x)
-        WVEXCEPT(Exception, vint.write_vuint, BytesIO(), -1)
-        WVEXCEPT(EOFError, vint.read_vuint, BytesIO())
-
-
-def encode_and_decode_vint(x):
-    f = BytesIO()
-    vint.write_vint(f, x)
-    return vint.read_vint(BytesIO(f.getvalue()))
-
-
-@wvtest
-def test_vint():
-    with no_lingering_errors():
-        values = (0, 1, 42, 64, 10**16)
-        for x in values:
-            WVPASSEQ(encode_and_decode_vint(x), x)
-        for x in [-x for x in values]:
-            WVPASSEQ(encode_and_decode_vint(x), x)
-        WVEXCEPT(EOFError, vint.read_vint, BytesIO())
-        WVEXCEPT(EOFError, vint.read_vint, BytesIO(b"\x80\x80"))
-
-
-def encode_and_decode_bvec(x):
-    f = BytesIO()
-    vint.write_bvec(f, x)
-    return vint.read_bvec(BytesIO(f.getvalue()))
-
-
-@wvtest
-def test_bvec():
-    with no_lingering_errors():
-        values = (b'', b'x', b'foo', b'\0', b'\0foo', b'foo\0bar\0')
-        for x in values:
-            WVPASSEQ(encode_and_decode_bvec(x), x)
-        WVEXCEPT(EOFError, vint.read_bvec, BytesIO())
-        outf = BytesIO()
-        for x in (b'foo', b'bar', b'baz', b'bax'):
-            vint.write_bvec(outf, x)
-        inf = BytesIO(outf.getvalue())
-        WVPASSEQ(vint.read_bvec(inf), b'foo')
-        WVPASSEQ(vint.read_bvec(inf), b'bar')
-        vint.skip_bvec(inf)
-        WVPASSEQ(vint.read_bvec(inf), b'bax')
-
-
-def pack_and_unpack(types, *values):
-    data = vint.pack(types, *values)
-    return vint.unpack(types, data)
-
-
-@wvtest
-def test_pack_and_unpack():
-    with no_lingering_errors():
-        tests = [('', []),
-                 ('s', [b'foo']),
-                 ('ss', [b'foo', b'bar']),
-                 ('sV', [b'foo', 0]),
-                 ('sv', [b'foo', -1]),
-                 ('V', [0]),
-                 ('Vs', [0, b'foo']),
-                 ('VV', [0, 1]),
-                 ('Vv', [0, -1]),
-                 ('v', [0]),
-                 ('vs', [0, b'foo']),
-                 ('vV', [0, 1]),
-                 ('vv', [0, -1])]
-        for test in tests:
-            (types, values) = test
-            WVPASSEQ(pack_and_unpack(types, *values), values)
-        WVEXCEPT(Exception, vint.pack, 's')
-        WVEXCEPT(Exception, vint.pack, 's', 'foo', 'bar')
-        WVEXCEPT(Exception, vint.pack, 'x', 1)
-        WVEXCEPT(Exception, vint.unpack, 's', '')
-        WVEXCEPT(Exception, vint.unpack, 'x', '')
diff --git a/lib/bup/t/txstat.py b/lib/bup/t/txstat.py
deleted file mode 100644 (file)
index d002a36..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-
-from __future__ import absolute_import
-import math, tempfile, subprocess
-
-from wvtest import *
-
-import bup._helpers as _helpers
-from bup import xstat
-from buptest import no_lingering_errors, test_tempdir
-
-
-@wvtest
-def test_fstime():
-    with no_lingering_errors():
-        WVPASSEQ(xstat.timespec_to_nsecs((0, 0)), 0)
-        WVPASSEQ(xstat.timespec_to_nsecs((1, 0)), 10**9)
-        WVPASSEQ(xstat.timespec_to_nsecs((0, 10**9 / 2)), 500000000)
-        WVPASSEQ(xstat.timespec_to_nsecs((1, 10**9 / 2)), 1500000000)
-        WVPASSEQ(xstat.timespec_to_nsecs((-1, 0)), -10**9)
-        WVPASSEQ(xstat.timespec_to_nsecs((-1, 10**9 / 2)), -500000000)
-        WVPASSEQ(xstat.timespec_to_nsecs((-2, 10**9 / 2)), -1500000000)
-        WVPASSEQ(xstat.timespec_to_nsecs((0, -1)), -1)
-        WVPASSEQ(type(xstat.timespec_to_nsecs((2, 22222222))), type(0))
-        WVPASSEQ(type(xstat.timespec_to_nsecs((-2, 22222222))), type(0))
-
-        WVPASSEQ(xstat.nsecs_to_timespec(0), (0, 0))
-        WVPASSEQ(xstat.nsecs_to_timespec(10**9), (1, 0))
-        WVPASSEQ(xstat.nsecs_to_timespec(500000000), (0, 10**9 / 2))
-        WVPASSEQ(xstat.nsecs_to_timespec(1500000000), (1, 10**9 / 2))
-        WVPASSEQ(xstat.nsecs_to_timespec(-10**9), (-1, 0))
-        WVPASSEQ(xstat.nsecs_to_timespec(-500000000), (-1, 10**9 / 2))
-        WVPASSEQ(xstat.nsecs_to_timespec(-1500000000), (-2, 10**9 / 2))
-        x = xstat.nsecs_to_timespec(1977777778)
-        WVPASSEQ(type(x[0]), type(0))
-        WVPASSEQ(type(x[1]), type(0))
-        x = xstat.nsecs_to_timespec(-1977777778)
-        WVPASSEQ(type(x[0]), type(0))
-        WVPASSEQ(type(x[1]), type(0))
-
-        WVPASSEQ(xstat.nsecs_to_timeval(0), (0, 0))
-        WVPASSEQ(xstat.nsecs_to_timeval(10**9), (1, 0))
-        WVPASSEQ(xstat.nsecs_to_timeval(500000000), (0, (10**9 / 2) / 1000))
-        WVPASSEQ(xstat.nsecs_to_timeval(1500000000), (1, (10**9 / 2) / 1000))
-        WVPASSEQ(xstat.nsecs_to_timeval(-10**9), (-1, 0))
-        WVPASSEQ(xstat.nsecs_to_timeval(-500000000), (-1, (10**9 / 2) / 1000))
-        WVPASSEQ(xstat.nsecs_to_timeval(-1500000000), (-2, (10**9 / 2) / 1000))
-        x = xstat.nsecs_to_timeval(1977777778)
-        WVPASSEQ(type(x[0]), type(0))
-        WVPASSEQ(type(x[1]), type(0))
-        x = xstat.nsecs_to_timeval(-1977777778)
-        WVPASSEQ(type(x[0]), type(0))
-        WVPASSEQ(type(x[1]), type(0))
-
-        WVPASSEQ(xstat.fstime_floor_secs(0), 0)
-        WVPASSEQ(xstat.fstime_floor_secs(10**9 / 2), 0)
-        WVPASSEQ(xstat.fstime_floor_secs(10**9), 1)
-        WVPASSEQ(xstat.fstime_floor_secs(-10**9 / 2), -1)
-        WVPASSEQ(xstat.fstime_floor_secs(-10**9), -1)
-        WVPASSEQ(type(xstat.fstime_floor_secs(10**9 / 2)), type(0))
-        WVPASSEQ(type(xstat.fstime_floor_secs(-10**9 / 2)), type(0))
-
-
-@wvtest
-def test_bup_utimensat():
-    if not xstat._bup_utimensat:
-        return
-    with no_lingering_errors():
-        with test_tempdir(b'bup-txstat-') as tmpdir:
-            path = tmpdir + b'/foo'
-            open(path, 'w').close()
-            frac_ts = (0, 10**9 // 2)
-            xstat._bup_utimensat(_helpers.AT_FDCWD, path, (frac_ts, frac_ts), 0)
-            st = _helpers.stat(path)
-            atime_ts = st[8]
-            mtime_ts = st[9]
-            WVPASSEQ(atime_ts[0], 0)
-            WVPASS(atime_ts[1] == 0 or atime_ts[1] == frac_ts[1])
-            WVPASSEQ(mtime_ts[0], 0)
-            WVPASS(mtime_ts[1] == 0 or mtime_ts[1] == frac_ts[1])
-
-
-@wvtest
-def test_bup_utimes():
-    if not xstat._bup_utimes:
-        return
-    with no_lingering_errors():
-        with test_tempdir(b'bup-txstat-') as tmpdir:
-            path = tmpdir + b'/foo'
-            open(path, 'w').close()
-            frac_ts = (0, 10**6 // 2)
-            xstat._bup_utimes(path, (frac_ts, frac_ts))
-            st = _helpers.stat(path)
-            atime_ts = st[8]
-            mtime_ts = st[9]
-            WVPASSEQ(atime_ts[0], 0)
-            WVPASS(atime_ts[1] == 0 or atime_ts[1] == frac_ts[1] * 1000)
-            WVPASSEQ(mtime_ts[0], 0)
-            WVPASS(mtime_ts[1] == 0 or mtime_ts[1] == frac_ts[1] * 1000)
-
-
-@wvtest
-def test_bup_lutimes():
-    if not xstat._bup_lutimes:
-        return
-    with no_lingering_errors():
-        with test_tempdir(b'bup-txstat-') as tmpdir:
-            path = tmpdir + b'/foo'
-            open(path, 'w').close()
-            frac_ts = (0, 10**6 // 2)
-            xstat._bup_lutimes(path, (frac_ts, frac_ts))
-            st = _helpers.stat(path)
-            atime_ts = st[8]
-            mtime_ts = st[9]
-            WVPASSEQ(atime_ts[0], 0)
-            WVPASS(atime_ts[1] == 0 or atime_ts[1] == frac_ts[1] * 1000)
-            WVPASSEQ(mtime_ts[0], 0)
-            WVPASS(mtime_ts[1] == 0 or mtime_ts[1] == frac_ts[1] * 1000)
diff --git a/lib/bup/test/__init__.py b/lib/bup/test/__init__.py
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/lib/bup/test/vfs.py b/lib/bup/test/vfs.py
deleted file mode 100644 (file)
index db2e9f4..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-
-from __future__ import absolute_import, print_function
-from collections import namedtuple
-from stat import S_ISDIR
-
-from bup import vfs
-from bup.metadata import Metadata
-from bup.git import BUP_CHUNKED
-
-TreeDictValue = namedtuple('TreeDictValue', ('name', 'oid', 'meta'))
-
-def tree_items(repo, oid):
-    """Yield (name, entry_oid, meta) for each entry in oid.  meta will be
-    a Metadata object for any non-directories and for '.', otherwise
-    None.
-
-    """
-    # This is a simpler approach than the one in the vfs, used to
-    # cross-check its behavior.
-    tree_data, bupm_oid = vfs.tree_data_and_bupm(repo, oid)
-    bupm = vfs._FileReader(repo, bupm_oid) if bupm_oid else None
-    try:
-        maybe_meta = lambda : Metadata.read(bupm) if bupm else None
-        m = maybe_meta()
-        if m and m.size is None:
-            m.size = 0
-        yield TreeDictValue(name=b'.', oid=oid, meta=m)
-        tree_ents = vfs.ordered_tree_entries(tree_data, bupm=True)
-        for name, mangled_name, kind, gitmode, sub_oid in tree_ents:
-            if mangled_name == b'.bupm':
-                continue
-            assert name != b'.'
-            if S_ISDIR(gitmode):
-                if kind == BUP_CHUNKED:
-                    yield TreeDictValue(name=name, oid=sub_oid,
-                                        meta=maybe_meta())
-                else:
-                    yield TreeDictValue(name=name, oid=sub_oid,
-                                        meta=vfs.default_dir_mode)
-            else:
-                yield TreeDictValue(name=name, oid=sub_oid, meta=maybe_meta())
-    finally:
-        if bupm:
-            bupm.close()
-
-def tree_dict(repo, oid):
-    return dict((x.name, x) for x in tree_items(repo, oid))
diff --git a/t/bin/sort-z b/t/bin/sort-z
deleted file mode 120000 (symlink)
index 36ca24a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../../dev/sort-z
\ No newline at end of file
diff --git a/t/cleanup-mounts-under b/t/cleanup-mounts-under
deleted file mode 100755 (executable)
index c0c2671..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/../config/bin/python" || exit $?
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-
-from sys import stderr
-import os.path, re, subprocess, sys
-
-def mntent_unescape(x):
-    def replacement(m):
-        unescapes = {
-            "\\\\" : "\\",
-            "\\011" : "\t",
-            "\\012" : "\n",
-            "\\040" : " "
-        }
-        return unescapes.get(m.group(0))
-    return re.sub(r'(\\\\|\\011|\\012|\\040)', replacement, x)
-
-targets = sys.argv[1:]
-
-if not os.path.exists('/proc/mounts'):
-    print >> stderr, 'No /proc/mounts; skipping mount cleanup in', repr(targets)
-    sys.exit(0)
-
-exit_status = 0
-for target in targets:
-    if not os.path.isdir(target):
-        print >> stderr, repr(target), 'is not a directory'
-        exit_status = 1
-        continue
-    top = os.path.realpath(target)
-    proc_mounts = open('/proc/mounts', 'r')
-    for line in proc_mounts:
-        _, point, fstype, _ = line.split(' ', 3)
-        point = mntent_unescape(point)
-        if top == point or os.path.commonprefix((top + '/', point)) == top + '/':
-            if fstype.startswith('fuse'):
-                if subprocess.call(['fusermount', '-uz', point]) != 0:
-                    exit_status = 1
-            else:
-                if subprocess.call(['umount', '-l', point]) != 0:
-                    exit_status = 1
-
-sys.exit(exit_status)
diff --git a/t/compare-trees b/t/compare-trees
deleted file mode 100755 (executable)
index aeaa086..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-#!/usr/bin/env bash
-
-set -u
-
-# Test that src and dest trees are as identical as bup is capable of
-# making them.  For now, use rsync -niaHAX ...
-
-usage() {
-cat <<EOF
-Usage: compare-trees [-h] [-c] [-x] SOURCE DEST
-OPTIONS:
-  -h
-    Display help
-  -c
-    Check file content (default)
-  -x
-    Don't check file content (rely on size/timestamps, etc.)
-EOF
-}
-
-verify_content=" --checksum"
-
-while getopts "hcx" OPTION
-do
-    case "$OPTION" in
-        h) usage; exit 0;;
-        c) verify_content=" --checksum";;
-        x) verify_content="";;
-        ?) usage 1>&2; exit 1;;
-    esac
-done
-
-shift $(($OPTIND - 1)) || exit $?
-
-if ! test $# -eq 2
-then
-    usage 1>&2
-    exit 1
-fi
-
-src="$1"
-dest="$2"
-
-tmpfile="$(mktemp /tmp/bup-test-XXXXXXX)" || exit $?
-trap "rm -rf '$tmpfile'" EXIT || exit $?
-
-rsync_opts="-niaH$verify_content --delete"
-
-rsync_version=$(rsync --version)
-if [[ ! "$rsync_version" =~ "ACLs" ]] || [[ "$rsync_version" =~ "no ACLs" ]]; then
-    echo "Not comparing ACLs (not supported by available rsync)" 1>&2
-else
-    case $OSTYPE in
-        cygwin|darwin|netbsd)
-            echo "Not comparing ACLs (not yet supported on $OSTYPE)" 1>&2
-            ;;
-        *)
-            rsync_opts="$rsync_opts -A"
-            ;;
-    esac
-fi
-
-xattrs_available=''
-if [[ ! "$rsync_version" =~ "xattrs" ]] || [[ "$rsync_version" =~ "no xattrs" ]]; then
-    echo "Not comparing xattrs (not supported by available rsync)" 1>&2
-else
-    xattrs_available=yes
-fi
-
-# Even in dry-run mode, rsync may fail if -X is specified and the
-# filesystems don't support xattrs.
-
-if test "$xattrs_available"; then
-    rsync $rsync_opts -X "$src" "$dest" > "$tmpfile"
-    if test $? -ne 0; then
-        # Try again without -X
-        rsync $rsync_opts "$src" "$dest" > "$tmpfile" || exit $?
-    fi
-else
-    rsync $rsync_opts "$src" "$dest" > "$tmpfile" || exit $?
-fi
-
-if test $(wc -l < "$tmpfile") != 0; then
-    echo "Differences between $src and $dest" 1>&2
-    cat "$tmpfile"
-    exit 1
-fi
-
-exit 0
diff --git a/t/configure-sampledata b/t/configure-sampledata
deleted file mode 100755 (executable)
index 111c7c3..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-#!/usr/bin/env bash
-
-set -o pipefail
-
-# NOTE: any relevant changes to var/ must be accompanied by an
-# increment to the revision.
-
-revision=3
-
-top="$(pwd)" || exit $?
-
-usage()
-{
-    echo 'Usage: t/configure-sampledata [--setup | --clean | --revision]'
-}
-
-if test "$#" -ne 1; then
-    usage 1>&2; exit 1
-fi
-
-rm_symlinks()
-{
-    for p in "$@"; do
-        # test -e is false for dangling symlinks.
-        if test -h "$p" -o -e "$p"; then rm "$p" || exit $?; fi
-    done
-}
-
-clean()
-(
-    cd t/sampledata || exit $?
-    if test -e var; then rm -r var || exit $?; fi
-    # Remove legacy content (before everything moved to var/).
-    rm_symlinks abs-symlink b c etc
-)
-
-case "$1" in
-    --setup)
-        (
-            clean
-            mkdir -p t/sampledata/var/rev || exit $?
-            cd t/sampledata/var || exit $?
-            ln -sf a b || exit $?
-            ln -sf b c || exit $?
-            ln -sf "$(pwd)/abs-symlink-target" abs-symlink || exit $?
-            mkfifo fifo
-            mkdir -p cmd doc lib/bup || exit $?
-            cp -pP "$top"/cmd/*.py cmd/ || exit $?
-            cp -pP "$top"/Documentation/*.md doc/ || exit $?
-            cp -pP "$top"/lib/bup/*.py lib/bup || exit $?
-            mkdir path-zoo || exit $?
-            if test "$BUP_TEST_RANDOMIZED_SAMPLEDATA_PATHS"; then
-                "$top"/t/make-random-paths 3000 path-zoo || exit $?
-            fi
-            # The "v" ensures that if "configure-sampledata
-            # --revision" and/or the setup above fails somehow,
-            # callers like make will be looking for a file that won't
-            # exist.
-            touch rev/v$revision || exit $?
-        ) || exit $?
-        ;;
-    --clean)
-        clean
-        ;;
-    --revision)
-        echo "$revision" || exit $?
-        ;;
-    *)
-        usage 1>&2; exit 1
-        ;;
-esac
diff --git a/t/data-size b/t/data-size
deleted file mode 100755 (executable)
index e5068da..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/../config/bin/python" || exit $?
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-# end of bup preamble
-
-from __future__ import absolute_import, print_function
-
-from os.path import getsize, isdir
-from sys import argv, stderr
-import os
-
-def listdir_failure(ex):
-    raise ex
-
-def usage():
-    print('Usage: data-size PATH ...', file=sys.stderr)
-
-total = 0
-for path in argv[1:]:
-    if isdir(path):
-        for root, dirs, files in os.walk(path, onerror=listdir_failure):
-            total += sum(getsize(os.path.join(root, name)) for name in files)
-    else:
-        total += getsize(path)
-
-print(total)
diff --git a/t/echo-argv-bytes b/t/echo-argv-bytes
deleted file mode 100755 (executable)
index 5347b5a..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/sh
-"""": # -*-python-*-
-# https://sourceware.org/bugzilla/show_bug.cgi?id=26034
-export "BUP_ARGV_0"="$0"
-arg_i=1
-for arg in "$@"; do
-    export "BUP_ARGV_${arg_i}"="$arg"
-    shift
-    arg_i=$((arg_i + 1))
-done
-bup_python="$(dirname "$0")/../dev/bup-python" || exit $?
-exec "$bup_python" "$0"
-"""
-# end of bup preamble
-
-from __future__ import absolute_import, print_function
-
-from os.path import abspath, dirname
-from sys import stdout
-import os, sys
-
-script_home = abspath(dirname(__file__))
-sys.path[:0] = [abspath(script_home + '/../lib'), abspath(script_home + '/..')]
-
-from bup import compat
-
-for arg in compat.argvb:
-    os.write(stdout.fileno(), arg)
-    os.write(stdout.fileno(), b'\0\n')
-    stdout.flush()
diff --git a/t/force-delete b/t/force-delete
deleted file mode 100755 (executable)
index cb12732..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/env bash
-
-set -o pipefail
-
-# Try *hard* to delete $@.  Among other things, some systems have
-# r-xr-xr-x for root and other system dirs.
-
-rc=0
-rm -rf "$@" # Maybe we'll get lucky.
-for f in "$@"; do
-    test -e "$f" || continue
-    if test "$(type -p setfacl)"; then
-        setfacl -Rb "$f"
-    fi
-    if test "$(type -p chattr)"; then
-        chattr -R -aisu "$f"
-    fi
-    chmod -R u+rwX "$f"
-    rm -r "$f"
-    if test -e "$f"; then
-        rc=1
-        find "$f" -ls
-        lsattr -aR "$f"
-        getfacl -R "$f"
-    fi
-done
-
-if test "$rc" -ne 0; then
-    echo "Failed to delete everything" 1>&2
-fi
-
-exit "$rc"
diff --git a/t/git-cat-tree b/t/git-cat-tree
deleted file mode 100755 (executable)
index 3a12f4d..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/usr/bin/env bash
-
-# Recursively dump all blobs in the subtree identified by ID.
-
-set -o pipefail
-
-usage() {
-cat <<EOF
-Usage: cat-git-tree [--git-dir DIR] ID
-EOF
-}
-
-cat-item()
-{
-    local hash="$1"
-    local type="$2"
-    case "$type" in
-        blob)
-            git cat-file blob "$hash" || exit $?
-            ;;
-        tree)
-            local tree=$(git ls-tree "$hash") || exit $?
-            while read -r line; do
-                local sub_type=$(echo "$line" | cut -d' ' -f 2) || exit $?
-                local sub_hash=$(echo "$line" | cut -d' ' -f 3) || exit $?
-                sub_hash=$(echo "$sub_hash" | cut -d'  ' -f 1) || exit $?
-                cat-item "$sub_hash" "$sub_type"
-            done <<< "$tree"
-            ;;
-        *)
-            echo "Unexpected item: $type $hash" 1>&2
-            exit 1
-            ;;
-    esac
-}
-
-case $# in
-    1) ;;
-    3)
-        if test "$1" != --git-dir; then
-            usage 1>&2
-            exit 1
-        fi
-        export GIT_DIR="$2"
-        shift 2
-        ;;
-    *)
-        usage 1>&2
-        exit 1
-        ;;
-esac
-
-top="$1"
-type=$(git cat-file -t "$top") || exit $?
-cat-item "$top" "$type"
diff --git a/t/hardlink-sets b/t/hardlink-sets
deleted file mode 100755 (executable)
index 2d17e37..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-#!/bin/sh
-"""": # -*-python-*-
-# https://sourceware.org/bugzilla/show_bug.cgi?id=26034
-export "BUP_ARGV_0"="$0"
-arg_i=1
-for arg in "$@"; do
-    export "BUP_ARGV_${arg_i}"="$arg"
-    shift
-    arg_i=$((arg_i + 1))
-done
-bup_python="$(dirname "$0")/../dev/bup-python" || exit $?
-exec "$bup_python" "$0"
-"""
-# end of bup preamble
-
-from __future__ import absolute_import, print_function
-import os, stat, sys
-
-sys.path[:0] = [os.path.dirname(os.path.realpath(__file__)) + '/../lib']
-
-from bup import compat
-from bup.io import byte_stream
-
-
-# Print the full paths of all the files in each hardlink set
-# underneath one of the paths.  Separate sets with a blank line, sort
-# the paths within each set, and sort the sets by their first path.
-
-def usage():
-    print("Usage: hardlink-sets <paths ...>", file=sys.stderr)
-
-if len(compat.argv) < 2:
-    usage()
-    sys.exit(1)
-
-def on_walk_error(e):
-    raise e
-
-sys.stdout.flush()
-out = byte_stream(sys.stdout)
-
-hardlink_set = {}
-
-for p in compat.argvb[1:]:
-  for root, dirs, files in os.walk(p, onerror = on_walk_error):
-      for filename in files:
-          full_path = os.path.join(root, filename)
-          st = os.lstat(full_path)
-          if not stat.S_ISDIR(st.st_mode):
-              node = b'%d:%d' % (st.st_dev, st.st_ino)
-              link_paths = hardlink_set.get(node)
-              if link_paths:
-                  link_paths.append(full_path)
-              else:
-                  hardlink_set[node] = [full_path]
-
-# Sort the link sets.
-for node, link_paths in hardlink_set.items():
-    link_paths.sort()
-
-first_set = True
-for link_paths in sorted(hardlink_set.values(), key = lambda x : x[0]):
-    if len(link_paths) > 1:
-        if first_set:
-            first_set = False
-        else:
-            out.write(b'\n')
-        for p in sorted(link_paths):
-            out.write(p + b'\n')
-
-sys.exit(0)
diff --git a/t/id-other-than b/t/id-other-than
deleted file mode 100755 (executable)
index e54696a..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/../config/bin/python" || exit $?
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-# end of bup preamble
-
-# Note: this currently relies on bup-python to handle arbitrary binary
-# user/group names.
-
-from __future__ import absolute_import, print_function
-
-import grp
-import pwd
-import sys
-
-def usage():
-    print('Usage: id-other-than <--user|--group> ID [ID ...]',
-          file=sys.stderr)
-
-if len(sys.argv) < 2:
-    usage()
-    sys.exit(1)
-
-def is_integer(x):
-    try:
-        int(x)
-        return True
-    except ValueError as e:
-        return False
-
-excluded_ids = set(int(x) for x in sys.argv[2:] if is_integer(x))
-excluded_names = (x for x in sys.argv[2:] if not is_integer(x))
-
-if sys.argv[1] == '--user':
-    for x in excluded_names:
-        excluded_ids.add(pwd.getpwnam(x).pw_uid)
-    for x in pwd.getpwall():
-        if x.pw_uid not in excluded_ids:
-            print(x.pw_name + ':' + str(x.pw_uid))
-            sys.exit(0)
-elif sys.argv[1] == '--group':
-    for x in excluded_names:
-        excluded_ids.add(grp.getgrnam(x).gr_gid)
-    for x in grp.getgrall():
-        if x.gr_gid not in excluded_ids:
-            print(x.gr_name + ':' + str(x.gr_gid))
-            sys.exit(0)
-else:
-    usage()
-    sys.exit(1)
diff --git a/t/lib.sh b/t/lib.sh
deleted file mode 100644 (file)
index 3ea7226..0000000
--- a/t/lib.sh
+++ /dev/null
@@ -1,56 +0,0 @@
-# Assumes shell is Bash, and pipefail is set.
-
-bup_t_lib_script_home=$(cd "$(dirname $0)" && pwd) || exit $?
-
-bup-cfg-py() { "$bup_t_lib_script_home/../config/bin/python" "$@"; }
-bup-python() { "$bup_t_lib_script_home/../dev/bup-python" "$@"; }
-
-force-delete()
-{
-    "$bup_t_lib_script_home/force-delete" "$@"
-}
-
-resolve-parent()
-{
-    test "$#" -eq 1 || return $?
-    echo "$1" | \
-        PYTHONPATH="$bup_t_lib_script_home/../lib" bup-python -c \
-        "import sys, bup.helpers; print(bup.helpers.resolve_parent(sys.stdin.readline()))" \
-        || return $?
-}
-
-current-filesystem()
-{
-    local kernel="$(uname -s)" || return $?
-    case "$kernel" in
-        NetBSD)
-            df -G . | sed -En 's/.* ([^ ]*) fstype.*/\1/p'
-            ;;
-        SunOS)
-            df -g . | sed -En 's/.* ([^ ]*) fstype.*/\1/p'
-            ;;
-        *)
-            df -T . | awk 'END{print $2}'
-    esac
-}
-
-path-filesystems()
-(
-    # Return filesystem for each dir from $1 to /.
-    # Perhaps for /foo/bar, "ext4\next4\nbtrfs\n".
-    test "$#" -eq 1 || exit $?
-    cd "$1" || exit $?
-    current-filesystem || exit $?
-    dir="$(pwd)" || exit $?
-    while test "$dir" != /; do
-        cd .. || exit $?
-        dir="$(pwd)" || exit $?
-        current-filesystem || exit $?
-    done
-    exit 0
-)
-
-escape-erx()
-{
-    sed 's/[][\.|$(){?+*^]/\\&/g' <<< "$*"
-}
diff --git a/t/make-random-paths b/t/make-random-paths
deleted file mode 100755 (executable)
index af80643..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/../dev/bup-python" || exit $?
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-# end of bup preamble
-
-from __future__ import absolute_import, print_function
-
-from os.path import abspath, dirname
-from random import randint
-from sys import argv, exit, stderr, stdout
-import errno, re, sys
-
-script_home = abspath(dirname(sys.argv[0] or '.'))
-sys.path[:0] = [abspath(script_home + '/../lib'), abspath(script_home + '/..')]
-
-from bup.compat import fsencode, range
-
-
-def usage(out=stdout):
-    print('Usage:', argv[0], 'NUM', 'DEST_DIR', file=out)
-
-def misuse():
-    usage(stderr)
-    exit(2)
-
-if sys.version_info[0] >= 3:
-    def bytes_from_ints(ints):
-        return bytes(ints)
-else:
-    def bytes_from_ints(ints):
-        return ''.join([chr(x) for x in ints])
-
-invalid_fragments = re.compile(br'(\x00|[./]|\.\.)')
-
-def random_filename():
-    n = randint(1, 32)
-    def random_candidate():
-        return invalid_fragments.sub(b'', bytes_from_ints([randint(1, 255)
-                                                           for x in range(n)]))
-    candidate = random_candidate()
-    while not candidate:
-        candidate = random_candidate()
-    return candidate
-
-if len(argv) != 3:
-    misuse()
-
-count, dest = argv[1:]
-count = int(count)
-
-i = 0
-while i < count:
-    with open(fsencode(dest) + b'/' + random_filename(), 'w') as _:
-        i += 1
diff --git a/t/mksock b/t/mksock
deleted file mode 100755 (executable)
index 88372c3..0000000
--- a/t/mksock
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/../config/bin/python" || exit $?
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-# end of bup preamble
-
-from __future__ import absolute_import
-
-import socket, sys
-
-s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0)
-s.bind(sys.argv[1])
diff --git a/t/ns-timestamp-resolutions b/t/ns-timestamp-resolutions
deleted file mode 100755 (executable)
index d138749..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/bin/sh
-"""": # -*-python-*-
-# https://sourceware.org/bugzilla/show_bug.cgi?id=26034
-export "BUP_ARGV_0"="$0"
-arg_i=1
-for arg in "$@"; do
-    export "BUP_ARGV_${arg_i}"="$arg"
-    shift
-    arg_i=$((arg_i + 1))
-done
-bup_python="$(dirname "$0")/../dev/bup-python" || exit $?
-exec "$bup_python" "$0"
-"""
-# end of bup preamble
-
-from __future__ import absolute_import
-import os.path, sys
-
-sys.path[:0] = [os.path.dirname(os.path.realpath(__file__)) + '/../lib']
-
-from bup.compat import argv_bytes
-from bup.helpers import handle_ctrl_c, saved_errors
-from bup.io import byte_stream
-from bup import compat, metadata, options
-import bup.xstat as xstat
-
-
-optspec = """
-ns-timestamp-resolutions TEST_FILE_NAME
---
-"""
-
-handle_ctrl_c()
-
-o = options.Options(optspec)
-opt, flags, extra = o.parse(compat.argv[1:])
-
-sys.stdout.flush()
-out = byte_stream(sys.stdout)
-
-if len(extra) != 1:
-    o.fatal('must specify a test file name')
-
-target = argv_bytes(extra[0])
-
-open(target, 'w').close()
-xstat.utime(target, (123456789, 123456789))
-meta = metadata.from_path(target)
-
-def ns_resolution(x):
-    n = 1;
-    while n < 10**9 and x % 10 == 0:
-        x /= 10
-        n *= 10
-    return n
-
-out.write(b'%d %d\n' % (ns_resolution(meta.atime),
-                        ns_resolution(meta.mtime)))
-
-if saved_errors:
-    log('warning: %d errors encountered\n' % len(saved_errors))
-    sys.exit(1)
diff --git a/t/perf-glance b/t/perf-glance
deleted file mode 100755 (executable)
index 55ae966..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/usr/bin/env bash
-
-set -ueo pipefail
-
-if test $# -lt 1; then
-    echo "Usage: perf-glance SRC_DATA_PATH..." 1>&2
-    exit 1
-fi
-set -x
-src_data=("$@")
-
-top="$(pwd)"
-script_name="$(basename $0)"
-
-mkdir -p "$top/t/tmp"
-tmpdir="$(mktemp -d "$top/t/tmp/$script_name-XXXXXXX")"
-
-export BUP_DIR="$tmpdir/bup"
-
-bup()
-{
-    "$top/bup" "$@"
-}
-
-get-time()
-{
-    python -c 'import time; print(time.time())'
-}
-
-rm -rf "$BUP_DIR"
-
-all_start="$(get-time)"
-
-init_start="$(get-time)"
-bup init
-init_finish="$(get-time)"
-
-index_start="$(get-time)"
-bup index "${src_data[@]}"
-index_finish="$(get-time)"
-
-save_start="$(get-time)"
-bup save -t -n data "${src_data[@]}"
-save_finish="$(get-time)"
-
-mkdir "$tmpdir/restore"
-restore_start="$(get-time)"
-bup restore -C "$tmpdir/restore" "/data/latest/"
-restore_finish="$(get-time)"
-
-all_finish="$(get-time)"
-
-set +x
-cat <<EOS
-
-init: $(python -c "print($init_finish - $init_start)")
-index: $(python -c "print($index_finish - $index_start)")
-save: $(python -c "print($save_finish - $save_start)")
-restore: $(python -c "print($restore_finish - $restore_start)")
-all: $(python -c "print($all_finish - $all_start)")
-EOS
-
-cd "$top"
-rm -r "$tmpdir"
diff --git a/t/root-status b/t/root-status
deleted file mode 100755 (executable)
index c37806d..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/../config/bin/python" || exit $?
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-# end of bup preamble
-
-from __future__ import absolute_import, print_function
-import os, sys
-
-if sys.platform.startswith('cygwin'):
-    groups = os.getgroups()
-    if 544 in groups or 0 in groups:
-        print('root')
-    else:
-        print('none')
-else:
-    if os.environ.get('FAKEROOTKEY'):
-        print('fake')
-    else:
-        if os.geteuid() == 0:
-            print('root')
-        else:
-            print('none')
diff --git a/t/sampledata/b2/foozy b/t/sampledata/b2/foozy
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/t/sampledata/b2/foozy2 b/t/sampledata/b2/foozy2
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/t/sampledata/x b/t/sampledata/x
deleted file mode 100644 (file)
index bd5e1be..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Sun Jan  3 01:54:26 EST 2010
diff --git a/t/sampledata/y-2000 b/t/sampledata/y-2000
deleted file mode 100644 (file)
index db94cc3..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-this file should come *before* y/ in the sort order, because of that
-trailing slash.
diff --git a/t/sampledata/y/testfile1 b/t/sampledata/y/testfile1
deleted file mode 100644 (file)
index 31ee979..0000000
+++ /dev/null
@@ -1,5580 +0,0 @@
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg bcgvbaf, qerphefr
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc qerphefr <cngu>
---
-k,kqri,bar-svyr-flfgrz   qba'g pebff svyrflfgrz obhaqnevrf
-d,dhvrg  qba'g npghnyyl cevag svyranzrf
-cebsvyr  eha haqre gur clguba cebsvyre
-"""
-b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar svyranzr rkcrpgrq")
-
-vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
-vs bcg.cebsvyr:
-    vzcbeg pCebsvyr
-    qrs qb_vg():
-        sbe v va vg:
-            cnff
-    pCebsvyr.eha('qb_vg()')
-ryfr:
-    vs bcg.dhvrg:
-        sbe v va vg:
-            cnff
-    ryfr:
-        sbe (anzr,fg) va vg:
-            cevag anzr
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-o,oybof    bhgchg n frevrf bs oybo vqf
-g,gerr     bhgchg n gerr vq
-p,pbzzvg   bhgchg n pbzzvg vq
-a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
-A,abbc     qba'g npghnyyl fnir gur qngn naljurer
-d,dhvrg    qba'g cevag cebterff zrffntrf
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-pbcl       whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
-orapu      cevag orapuznex gvzvatf gb fgqree
-znk-cnpx-fvmr=  znkvzhz olgrf va n fvatyr cnpx
-znk-cnpx-bowrpgf=  znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
-snabhg=  znkvzhz ahzore bs oybof va n fvatyr gerr
-"""
-b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
-        bcg.abbc be bcg.pbcl):
-    b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
-vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be 
-                               bcg.pbzzvg be bcg.anzr):
-    b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
-
-vs bcg.ireobfr >= 2:
-    tvg.ireobfr = bcg.ireobfr - 1
-    bcg.orapu = 1
-vs bcg.znk_cnpx_fvmr:
-    unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
-vs bcg.znk_cnpx_bowrpgf:
-    unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
-vs bcg.snabhg:
-    unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
-vs bcg.oybof:
-    unfufcyvg.snabhg = 0
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
-    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-fgneg_gvzr = gvzr.gvzr()
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.abbc be bcg.pbcl:
-    pyv = j = byqers = Abar
-ryvs bcg.erzbgr be vf_erirefr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
-    j = pyv.arj_cnpxjevgre()
-ryfr:
-    pyv = Abar
-    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
-    j = tvg.CnpxJevgre()
-
-svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
-vs j:
-    funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
-    gerr = j.arj_gerr(funyvfg)
-ryfr:
-    ynfg = 0
-    sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
-        unfufcyvg.gbgny_fcyvg += yra(oybo)
-        vs bcg.pbcl:
-            flf.fgqbhg.jevgr(fge(oybo))
-        zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
-        vs abg bcg.dhvrg naq ynfg != zrtf:
-            cebterff('%q Zolgrf ernq\e' % zrtf)
-            ynfg = zrtf
-    cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
-
-vs bcg.ireobfr:
-    ybt('\a')
-vs bcg.oybof:
-    sbe (zbqr,anzr,ova) va funyvfg:
-        cevag ova.rapbqr('urk')
-vs bcg.gerr:
-    cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
-    zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
-    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
-    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
-    vs bcg.pbzzvg:
-        cevag pbzzvg.rapbqr('urk')
-
-vs j:
-    j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
-        
-vs bcg.anzr:
-    vs pyv:
-        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
-    ryfr:
-        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
-    pyv.pybfr()
-
-frpf = gvzr.gvzr() - fgneg_gvzr
-fvmr = unfufcyvg.gbgny_fcyvg
-vs bcg.orapu:
-    ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
-        % (fvmr/1024., frpf, fvmr/1024./frpf))
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, fgehpg, zznc
-sebz ohc vzcbeg tvg, bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs f_sebz_olgrf(olgrf):
-    pyvfg = [pue(o) sbe o va olgrf]
-    erghea ''.wbva(pyvfg)
-
-
-qrs ercbeg(pbhag):
-    svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
-    q = {}
-    sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
-        y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
-        q[y[0]] = y[1]
-    vs pbhag >= 0:
-        r1 = pbhag
-        svryqf = [q[x] sbe x va svryqf]
-    ryfr:
-        r1 = ''
-    cevag ('%9f  ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
-    flf.fgqbhg.syhfu()
-
-
-bcgfcrp = """
-ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
---
-a,ahzore=  ahzore bs bowrpgf cre plpyr
-p,plpyrf=  ahzore bs plpyrf gb eha
-vtaber-zvqk  vtaber .zvqk svyrf, hfr bayl .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-tvg.vtaber_zvqk = bcg.vtaber_zvqk
-
-tvg.purpx_ercb_be_qvr()
-z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-
-plpyrf = bcg.plpyrf be 100
-ahzore = bcg.ahzore be 10000
-
-ercbeg(-1)
-s = bcra('/qri/henaqbz')
-n = zznc.zznc(-1, 20)
-ercbeg(0)
-sbe p va kenatr(plpyrf):
-    sbe a va kenatr(ahzore):
-        o = s.ernq(3)
-        vs 0:
-            olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
-            olgrf[2] &= 0ks0
-            ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
-        ryfr:
-            n[0:2] = o[0:2]
-            n[2] = pue(beq(o[2]) & 0ks0)
-            ova = fge(n[0:20])
-        #cevag ova.rapbqr('urk')
-        z.rkvfgf(ova)
-    ercbeg((p+1)*ahzore)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-qrs cevag_abqr(grkg, a):
-    cersvk = ''
-    vs bcg.unfu:
-        cersvk += "%f " % a.unfu.rapbqr('urk')
-    vs fgng.F_VFQVE(a.zbqr):
-        cevag '%f%f/' % (cersvk, grkg)
-    ryvs fgng.F_VFYAX(a.zbqr):
-        cevag '%f%f@' % (cersvk, grkg)
-    ryfr:
-        cevag '%f%f' % (cersvk, grkg)
-
-
-bcgfcrp = """
-ohc yf <qvef...>
---
-f,unfu   fubj unfu sbe rnpu svyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-
-vs abg rkgen:
-    rkgen = ['/']
-
-erg = 0
-sbe q va rkgen:
-    gel:
-        a = gbc.yerfbyir(q)
-        vs fgng.F_VFQVE(a.zbqr):
-            sbe fho va a:
-                cevag_abqr(fho.anzr, fho)
-        ryfr:
-            cevag_abqr(q, a)
-    rkprcg isf.AbqrReebe, r:
-        ybt('reebe: %f\a' % r)
-        erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
-sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
-sebz ohc.urycref vzcbeg *
-
-qrs abqr_anzr(grkg, a):
-    vs fgng.F_VFQVE(a.zbqr):
-        erghea '%f/' % grkg
-    ryvs fgng.F_VFYAX(a.zbqr):
-        erghea '%f@' % grkg
-    ryfr:
-        erghea '%f' % grkg
-
-
-qrs qb_yf(cngu, a):
-    y = []
-    vs fgng.F_VFQVE(a.zbqr):
-        sbe fho va a:
-            y.nccraq(abqr_anzr(fho.anzr, fho))
-    ryfr:
-        y.nccraq(abqr_anzr(cngu, a))
-    cevag pbyhzangr(y, '')
-    
-
-qrs jevgr_gb_svyr(vas, bhgs):
-    sbe oybo va puhaxlernqre(vas):
-        bhgs.jevgr(oybo)
-    
-
-qrs vachgvgre():
-    vs bf.vfnggl(flf.fgqva.svyrab()):
-        juvyr 1:
-            gel:
-                lvryq enj_vachg('ohc> ')
-            rkprcg RBSReebe:
-                oernx
-    ryfr:
-        sbe yvar va flf.fgqva:
-            lvryq yvar
-
-
-qrs _pbzcyrgre_trg_fhof(yvar):
-    (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
-    (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
-    #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
-    a = cjq.erfbyir(qve)
-    fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
-                       a.fhof()))
-    erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
-
-
-_ynfg_yvar = Abar
-_ynfg_erf = Abar
-qrs pbzcyrgre(grkg, fgngr):
-    tybony _ynfg_yvar
-    tybony _ynfg_erf
-    gel:
-        yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
-        vs _ynfg_yvar != yvar:
-            _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
-            _ynfg_yvar = yvar
-        (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
-        vs fgngr < yra(fhof):
-            fa = fhof[fgngr]
-            fa1 = fa.erfbyir('')  # qrers flzyvaxf
-            shyyanzr = bf.cngu.wbva(qve, fa.anzr)
-            vs fgng.F_VFQVE(fa1.zbqr):
-                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
-                                          grezvangr=Snyfr)
-            ryfr:
-                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
-                                          grezvangr=Gehr) + ' '
-            erghea grkg + erg
-    rkprcg Rkprcgvba, r:
-        ybt('\areebe va pbzcyrgvba: %f\a' % r)
-
-            
-bcgfcrp = """
-ohc sgc
-"""
-b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-gbc = isf.ErsYvfg(Abar)
-cjq = gbc
-
-vs rkgen:
-    yvarf = rkgen
-ryfr:
-    ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
-    ernqyvar.frg_pbzcyrgre(pbzcyrgre)
-    ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
-    yvarf = vachgvgre()
-
-sbe yvar va yvarf:
-    vs abg yvar.fgevc():
-        pbagvahr
-    jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
-    pzq = jbeqf[0].ybjre()
-    #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
-    gel:
-        vs pzq == 'yf':
-            sbe cnez va (jbeqf[1:] be ['.']):
-                qb_yf(cnez, cjq.erfbyir(cnez))
-        ryvs pzq == 'pq':
-            sbe cnez va jbeqf[1:]:
-                cjq = cjq.erfbyir(cnez)
-        ryvs pzq == 'cjq':
-            cevag cjq.shyyanzr()
-        ryvs pzq == 'png':
-            sbe cnez va jbeqf[1:]:
-                jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
-        ryvs pzq == 'trg':
-            vs yra(jbeqf) abg va [2,3]:
-                envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
-            eanzr = jbeqf[1]
-            (qve,onfr) = bf.cngu.fcyvg(eanzr)
-            yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
-            vas = cjq.erfbyir(eanzr).bcra()
-            ybt('Fnivat %e\a' % yanzr)
-            jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
-        ryvs pzq == 'ztrg':
-            sbe cnez va jbeqf[1:]:
-                (qve,onfr) = bf.cngu.fcyvg(cnez)
-                sbe a va cjq.erfbyir(qve).fhof():
-                    vs sazngpu.sazngpu(a.anzr, onfr):
-                        gel:
-                            ybt('Fnivat %e\a' % a.anzr)
-                            vas = a.bcra()
-                            bhgs = bcra(a.anzr, 'jo')
-                            jevgr_gb_svyr(vas, bhgs)
-                            bhgs.pybfr()
-                        rkprcg Rkprcgvba, r:
-                            ybt('  reebe: %f\a' % r)
-        ryvs pzq == 'uryc' be pzq == '?':
-            ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
-        ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
-            oernx
-        ryfr:
-            envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
-    rkprcg Rkprcgvba, r:
-        ybt('reebe: %f\a' % r)
-        #envfr
-#!/hfe/ova/rai clguba
-vzcbeg flf, zznc
-sebz ohc vzcbeg bcgvbaf, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc enaqbz [-F frrq] <ahzolgrf>
---
-F,frrq=   bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
-s,sbepr   cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
-"""
-b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-gbgny = cnefr_ahz(rkgen[0])
-
-vs bcg.sbepr be (abg bf.vfnggl(1) naq
-                 abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
-    _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
-ryfr:
-    ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc uryc <pbzznaq>
-"""
-b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) == 0:
-    # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
-    bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
-ryvs yra(rkgen) == 1:
-    qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
-    rkr = flf.neti[0]
-    (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
-    znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
-    t = tybo.tybo(znacngu)
-    vs t:
-        bf.rkrpic('zna', ['zna', '-y', t[0]])
-    ryfr:
-        bf.rkrpic('zna', ['zna', qbpanzr])
-ryfr:
-    b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-
-pynff Fgng(shfr.Fgng):
-    qrs __vavg__(frys):
-        frys.fg_zbqr = 0
-        frys.fg_vab = 0
-        frys.fg_qri = 0
-        frys.fg_ayvax = 0
-        frys.fg_hvq = 0
-        frys.fg_tvq = 0
-        frys.fg_fvmr = 0
-        frys.fg_ngvzr = 0
-        frys.fg_zgvzr = 0
-        frys.fg_pgvzr = 0
-        frys.fg_oybpxf = 0
-        frys.fg_oyxfvmr = 0
-        frys.fg_eqri = 0
-
-
-pnpur = {}
-qrs pnpur_trg(gbc, cngu):
-    cnegf = cngu.fcyvg('/')
-    pnpur[('',)] = gbc
-    p = Abar
-    znk = yra(cnegf)
-    #ybt('pnpur: %e\a' % pnpur.xrlf())
-    sbe v va enatr(znk):
-        cer = cnegf[:znk-v]
-        #ybt('pnpur gelvat: %e\a' % cer)
-        p = pnpur.trg(ghcyr(cer))
-        vs p:
-            erfg = cnegf[znk-v:]
-            sbe e va erfg:
-                #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
-                p = p.yerfbyir(e)
-                xrl = ghcyr(cer + [e])
-                #ybt('fnivat: %e\a' % (xrl,))
-                pnpur[xrl] = p
-            oernx
-    nffreg(p)
-    erghea p
-        
-    
-
-pynff OhcSf(shfr.Shfr):
-    qrs __vavg__(frys, gbc):
-        shfr.Shfr.__vavg__(frys)
-        frys.gbc = gbc
-    
-    qrs trgngge(frys, cngu):
-        ybt('--trgngge(%e)\a' % cngu)
-        gel:
-            abqr = pnpur_trg(frys.gbc, cngu)
-            fg = Fgng()
-            fg.fg_zbqr = abqr.zbqr
-            fg.fg_ayvax = abqr.ayvaxf()
-            fg.fg_fvmr = abqr.fvmr()
-            fg.fg_zgvzr = abqr.zgvzr
-            fg.fg_pgvzr = abqr.pgvzr
-            fg.fg_ngvzr = abqr.ngvzr
-            erghea fg
-        rkprcg isf.AbFhpuSvyr:
-            erghea -reeab.RABRAG
-
-    qrs ernqqve(frys, cngu, bssfrg):
-        ybt('--ernqqve(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        lvryq shfr.Qveragel('.')
-        lvryq shfr.Qveragel('..')
-        sbe fho va abqr.fhof():
-            lvryq shfr.Qveragel(fho.anzr)
-
-    qrs ernqyvax(frys, cngu):
-        ybt('--ernqyvax(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        erghea abqr.ernqyvax()
-
-    qrs bcra(frys, cngu, syntf):
-        ybt('--bcra(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
-        vs (syntf & nppzbqr) != bf.B_EQBAYL:
-            erghea -reeab.RNPPRF
-        abqr.bcra()
-
-    qrs eryrnfr(frys, cngu, syntf):
-        ybt('--eryrnfr(%e)\a' % cngu)
-
-    qrs ernq(frys, cngu, fvmr, bssfrg):
-        ybt('--ernq(%e)\a' % cngu)
-        a = pnpur_trg(frys.gbc, cngu)
-        b = a.bcra()
-        b.frrx(bssfrg)
-        erghea b.ernq(fvmr)
-
-
-vs abg unfngge(shfr, '__irefvba__'):
-    envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
-shfr.shfr_clguba_ncv = (0, 2)
-
-
-bcgfcrp = """
-ohc shfr [-q] [-s] <zbhagcbvag>
---
-q,qroht   vapernfr qroht yriry
-s,sbertebhaq  eha va sbertebhaq
-"""
-b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-s = OhcSf(gbc)
-s.shfr_netf.zbhagcbvag = rkgen[0]
-vs bcg.qroht:
-    s.shfr_netf.nqq('qroht')
-vs bcg.sbertebhaq:
-    s.shfr_netf.frgzbq('sbertebhaq')
-cevag s.zhygvguernqrq
-s.zhygvguernqrq = Snyfr
-
-s.znva()
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-
-vs bcg.erzbgr:
-    tvg.vavg_ercb()  # ybpny ercb
-    tvg.purpx_ercb_be_qvr()
-    pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
-    pyv.pybfr()
-ryfr:
-    tvg.vavg_ercb()
-#!/hfe/ova/rai clguba
-vzcbeg flf, zngu, fgehpg, tybo
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-CNTR_FVMR=4096
-FUN_CRE_CNTR=CNTR_FVMR/200.
-
-
-qrs zretr(vqkyvfg, ovgf, gnoyr):
-    pbhag = 0
-    sbe r va tvg.vqkzretr(vqkyvfg):
-        pbhag += 1
-        cersvk = tvg.rkgenpg_ovgf(r, ovgf)
-        gnoyr[cersvk] = pbhag
-        lvryq r
-
-
-qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
-    vs abg bhgsvyranzr:
-        nffreg(bhgqve)
-        fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
-        bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
-    
-    vac = []
-    gbgny = 0
-    sbe anzr va vasvyranzrf:
-        vk = tvg.CnpxVqk(anzr)
-        vac.nccraq(vk)
-        gbgny += yra(vk)
-
-    ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
-    vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
-       be (bcg.sbepr naq abg gbgny):
-        ybt('zvqk: abguvat gb qb.\a')
-        erghea
-
-    cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
-    ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
-    ragevrf = 2**ovgf
-    ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
-    
-    gnoyr = [0]*ragevrf
-
-    gel:
-        bf.hayvax(bhgsvyranzr)
-    rkprcg BFReebe:
-        cnff
-    s = bcra(bhgsvyranzr + '.gzc', 'j+')
-    s.jevgr('ZVQK\0\0\0\2')
-    s.jevgr(fgehpg.cnpx('!V', ovgf))
-    nffreg(s.gryy() == 12)
-    s.jevgr('\0'*4*ragevrf)
-    
-    sbe r va zretr(vac, ovgf, gnoyr):
-        s.jevgr(r)
-        
-    s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
-
-    s.frrx(12)
-    s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
-    s.pybfr()
-    bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
-
-    # guvf vf whfg sbe grfgvat
-    vs 0:
-        c = tvg.CnpxZvqk(bhgsvyranzr)
-        nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
-        cevag c.vqkanzrf
-        nffreg(yra(c) == gbgny)
-        cv = vgre(c)
-        sbe v va zretr(vac, gbgny, ovgf, gnoyr):
-            nffreg(v == cv.arkg())
-            nffreg(c.rkvfgf(v))
-
-    cevag bhgsvyranzr
-
-bcgfcrp = """
-ohc zvqk [bcgvbaf...] <vqkanzrf...>
---
-b,bhgchg=  bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
-n,nhgb     nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
-s,sbepr    nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen naq (bcg.nhgb be bcg.sbepr):
-    b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
-
-tvg.purpx_ercb_be_qvr()
-
-vs rkgen:
-    qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
-ryvs bcg.nhgb be bcg.sbepr:
-    cnguf = [tvg.ercb('bowrpgf/cnpx')]
-    cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
-    sbe cngu va cnguf:
-        ybt('zvqk: fpnaavat %f\a' % cngu)
-        vs bcg.sbepr:
-            qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
-        ryvs bcg.nhgb:
-            z = tvg.CnpxVqkYvfg(cngu)
-            arrqrq = {}
-            sbe cnpx va z.cnpxf:  # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
-                vs cnpx.anzr.raqfjvgu('.vqk'):
-                    arrqrq[cnpx.anzr] = 1
-            qry z
-            qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
-        ybt('\a')
-ryfr:
-    b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, enaqbz
-sebz ohc vzcbeg bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs enaqoybpx(a):
-    y = []
-    sbe v va kenatr(a):
-        y.nccraq(pue(enaqbz.enaqenatr(0,256)))
-    erghea ''.wbva(y)
-
-
-bcgfcrp = """
-ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
---
-   JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
-a,ahz=   ahzore bs oybpxf gb qnzntr
-f,fvmr=  znkvzhz fvmr bs rnpu qnzntrq oybpx
-creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
-rdhny    fcernq qnzntr rirayl guebhtubhg gur svyr
-F,frrq=  enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
-"""
-b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg rkgen:
-    b.sngny('svyranzrf rkcrpgrq')
-
-vs bcg.frrq != Abar:
-    enaqbz.frrq(bcg.frrq)
-
-sbe anzr va rkgen:
-    ybt('Qnzntvat "%f"...\a' % anzr)
-    s = bcra(anzr, 'e+o')
-    fg = bf.sfgng(s.svyrab())
-    fvmr = fg.fg_fvmr
-    vs bcg.creprag be bcg.fvmr:
-        zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
-        zf2 = bcg.fvmr be fvmr
-        znkfvmr = zva(zf1, zf2)
-    ryfr:
-        znkfvmr = 1
-    puhaxf = bcg.ahz be 10
-    puhaxfvmr = fvmr/puhaxf
-    sbe e va enatr(puhaxf):
-        fm = enaqbz.enaqenatr(1, znkfvmr+1)
-        vs fm > fvmr:
-            fm = fvmr
-        vs bcg.rdhny:
-            bsf = e*puhaxfvmr
-        ryfr:
-            bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
-        ybt('  %6q olgrf ng %q\a' % (fm, bsf))
-        s.frrx(bsf)
-        s.jevgr(enaqoybpx(fm))
-    s.pybfr()
-#!/hfe/ova/rai clguba
-vzcbeg flf, fgehpg, zznc
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-fhfcraqrq_j = Abar
-
-
-qrs vavg_qve(pbaa, net):
-    tvg.vavg_ercb(net)
-    ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
-    pbaa.bx()
-
-
-qrs frg_qve(pbaa, net):
-    tvg.purpx_ercb_be_qvr(net)
-    ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
-    pbaa.bx()
-
-    
-qrs yvfg_vaqrkrf(pbaa, whax):
-    tvg.purpx_ercb_be_qvr()
-    sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
-        vs s.raqfjvgu('.vqk'):
-            pbaa.jevgr('%f\a' % s)
-    pbaa.bx()
-
-
-qrs fraq_vaqrk(pbaa, anzr):
-    tvg.purpx_ercb_be_qvr()
-    nffreg(anzr.svaq('/') < 0)
-    nffreg(anzr.raqfjvgu('.vqk'))
-    vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
-    pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
-    pbaa.jevgr(vqk.znc)
-    pbaa.bx()
-
-
-qrs erprvir_bowrpgf(pbaa, whax):
-    tybony fhfcraqrq_j
-    tvg.purpx_ercb_be_qvr()
-    fhttrfgrq = {}
-    vs fhfcraqrq_j:
-        j = fhfcraqrq_j
-        fhfcraqrq_j = Abar
-    ryfr:
-        j = tvg.CnpxJevgre()
-    juvyr 1:
-        af = pbaa.ernq(4)
-        vs abg af:
-            j.nobeg()
-            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
-        a = fgehpg.hacnpx('!V', af)[0]
-        #ybt('rkcrpgvat %q olgrf\a' % a)
-        vs abg a:
-            ybt('ohc freire: erprvirq %q bowrpg%f.\a' 
-                % (j.pbhag, j.pbhag!=1 naq "f" be ''))
-            shyycngu = j.pybfr()
-            vs shyycngu:
-                (qve, anzr) = bf.cngu.fcyvg(shyycngu)
-                pbaa.jevgr('%f.vqk\a' % anzr)
-            pbaa.bx()
-            erghea
-        ryvs a == 0kssssssss:
-            ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
-            fhfcraqrq_j = j
-            pbaa.bx()
-            erghea
-            
-        ohs = pbaa.ernq(a)  # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
-        #ybt('ernq %q olgrf\a' % a)
-        vs yra(ohs) < a:
-            j.nobeg()
-            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
-                            % (a, yra(ohs)))
-        (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
-        fun = tvg.pnyp_unfu(glcr, pbagrag)
-        byqcnpx = j.rkvfgf(fun)
-        # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
-        # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
-        # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
-        # ba gur freire fvqr.
-        vs abg fhttrfgrq naq \
-          byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
-            # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
-            # ng guvf ynlre.  Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
-            # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
-            # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
-            # znxr gur svyrf ovttre.  Guvf zrgubq vf pregnvayl abg irel
-            # rssvpvrag.
-            j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
-            byqcnpx = j.bowpnpur.rkvfgf(fun)
-            ybt('arj fhttrfgvba: %e\a' % byqcnpx)
-            nffreg(byqcnpx)
-            nffreg(byqcnpx != Gehr)
-            nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
-            j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
-        vs abg fhttrfgrq naq byqcnpx:
-            nffreg(byqcnpx.raqfjvgu('.vqk'))
-            (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
-            vs abg (anzr va fhttrfgrq):
-                ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
-                pbaa.jevgr('vaqrk %f\a' % anzr)
-                fhttrfgrq[anzr] = 1
-        ryfr:
-            j._enj_jevgr([ohs])
-    # ABGERNPURQ
-
-
-qrs ernq_ers(pbaa, ersanzr):
-    tvg.purpx_ercb_be_qvr()
-    e = tvg.ernq_ers(ersanzr)
-    pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
-    pbaa.bx()
-
-
-qrs hcqngr_ers(pbaa, ersanzr):
-    tvg.purpx_ercb_be_qvr()
-    arjiny = pbaa.ernqyvar().fgevc()
-    byqiny = pbaa.ernqyvar().fgevc()
-    tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
-    pbaa.bx()
-
-
-qrs png(pbaa, vq):
-    tvg.purpx_ercb_be_qvr()
-    gel:
-        sbe oybo va tvg.png(vq):
-            pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
-            pbaa.jevgr(oybo)
-    rkprcg XrlReebe, r:
-        ybt('freire: reebe: %f\a' % r)
-        pbaa.jevgr('\0\0\0\0')
-        pbaa.reebe(r)
-    ryfr:
-        pbaa.jevgr('\0\0\0\0')
-        pbaa.bx()
-
-
-bcgfcrp = """
-ohc freire
-"""
-b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-ybt('ohc freire: ernqvat sebz fgqva.\a')
-
-pbzznaqf = {
-    'vavg-qve': vavg_qve,
-    'frg-qve': frg_qve,
-    'yvfg-vaqrkrf': yvfg_vaqrkrf,
-    'fraq-vaqrk': fraq_vaqrk,
-    'erprvir-bowrpgf': erprvir_bowrpgf,
-    'ernq-ers': ernq_ers,
-    'hcqngr-ers': hcqngr_ers,
-    'png': png,
-}
-
-# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
-# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
-pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
-ye = yvarernqre(pbaa)
-sbe _yvar va ye:
-    yvar = _yvar.fgevc()
-    vs abg yvar:
-        pbagvahr
-    ybt('ohc freire: pbzznaq: %e\a' % yvar)
-    jbeqf = yvar.fcyvg(' ', 1)
-    pzq = jbeqf[0]
-    erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
-    vs pzq == 'dhvg':
-        oernx
-    ryfr:
-        pzq = pbzznaqf.trg(pzq)
-        vs pzq:
-            pzq(pbaa, erfg)
-        ryfr:
-            envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
-
-ybt('ohc freire: qbar\a')
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
-    rkgen = yvarernqre(flf.fgqva)
-
-erg = 0
-
-vs bcg.erzbgr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    png = pyv.png
-ryfr:
-    pc = tvg.PngCvcr()
-    png = pc.wbva
-
-sbe vq va rkgen:
-    gel:
-        sbe oybo va png(vq):
-            flf.fgqbhg.jevgr(oybo)
-    rkprcg XrlReebe, r:
-        flf.fgqbhg.syhfu()
-        ybt('reebe: %f\a' % r)
-        erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, reeab, fgng, gvzr, zngu
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc fnir [-gp] [-a anzr] <svyranzrf...>
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-g,gerr     bhgchg n gerr vq
-p,pbzzvg   bhgchg n pbzzvg vq
-a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-d,dhvrg    qba'g fubj cebterff zrgre
-fznyyre=   bayl onpx hc svyrf fznyyre guna a olgrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
-    b.sngny("hfr bar be zber bs -g, -p, -a")
-vs abg rkgen:
-    b.sngny("ab svyranzrf tvira")
-
-bcg.cebterff = (vfggl naq abg bcg.dhvrg)
-bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
-    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.erzbgr be vf_erirefr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
-    j = pyv.arj_cnpxjevgre()
-ryfr:
-    pyv = Abar
-    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
-    j = tvg.CnpxJevgre()
-
-unaqyr_pgey_p()
-
-
-qrs rngfynfu(qve):
-    vs qve.raqfjvgu('/'):
-        erghea qve[:-1]
-    ryfr:
-        erghea qve
-
-
-cnegf = ['']
-funyvfgf = [[]]
-
-qrs _chfu(cneg):
-    nffreg(cneg)
-    cnegf.nccraq(cneg)
-    funyvfgf.nccraq([])
-
-qrs _cbc(sbepr_gerr):
-    nffreg(yra(cnegf) >= 1)
-    cneg = cnegf.cbc()
-    funyvfg = funyvfgf.cbc()
-    gerr = sbepr_gerr be j.arj_gerr(funyvfg)
-    vs funyvfgf:
-        funyvfgf[-1].nccraq(('40000', cneg, gerr))
-    ryfr:  # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
-        funyvfgf.nccraq(funyvfg)
-    erghea gerr
-
-ynfgerznva = Abar
-qrs cebterff_ercbeg(a):
-    tybony pbhag, fhopbhag, ynfgerznva
-    fhopbhag += a
-    pp = pbhag + fhopbhag
-    cpg = gbgny naq (pp*100.0/gbgny) be 0
-    abj = gvzr.gvzr()
-    ryncfrq = abj - gfgneg
-    xcf = ryncfrq naq vag(pp/1024./ryncfrq)
-    xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
-    xcf = vag(xcf/xcf_senp)*xcf_senp
-    vs pp:
-        erznva = ryncfrq*1.0/pp * (gbgny-pp)
-    ryfr:
-        erznva = 0.0
-    vs (ynfgerznva naq (erznva > ynfgerznva)
-          naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
-        erznva = ynfgerznva
-    ryfr:
-        ynfgerznva = erznva
-    ubhef = vag(erznva/60/60)
-    zvaf = vag(erznva/60 - ubhef*60)
-    frpf = vag(erznva - ubhef*60*60 - zvaf*60)
-    vs ryncfrq < 30:
-        erznvafge = ''
-        xcffge = ''
-    ryfr:
-        xcffge = '%qx/f' % xcf
-        vs ubhef:
-            erznvafge = '%qu%qz' % (ubhef, zvaf)
-        ryvs zvaf:
-            erznvafge = '%qz%q' % (zvaf, frpf)
-        ryfr:
-            erznvafge = '%qf' % frpf
-    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
-             % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
-                erznvafge, xcffge))
-
-
-e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
-
-qrs nyernql_fnirq(rag):
-    erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
-
-qrs jnagerphefr_cer(rag):
-    erghea abg nyernql_fnirq(rag)
-
-qrs jnagerphefr_qhevat(rag):
-    erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
-
-gbgny = sgbgny = 0
-vs bcg.cebterff:
-    sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
-        vs abg (sgbgny % 10024):
-            cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
-        rkvfgf = rag.rkvfgf()
-        unfuinyvq = nyernql_fnirq(rag)
-        rag.frg_fun_zvffvat(abg unfuinyvq)
-        vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
-            vs rkvfgf naq abg unfuinyvq:
-                gbgny += rag.fvmr
-        sgbgny += 1
-    cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
-    unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
-
-gfgneg = gvzr.gvzr()
-pbhag = fhopbhag = spbhag = 0
-ynfgfxvc_anzr = Abar
-ynfgqve = ''
-sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
-    (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
-    rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
-    unfuinyvq = nyernql_fnirq(rag)
-    jnfzvffvat = rag.fun_zvffvat()
-    byqfvmr = rag.fvmr
-    vs bcg.ireobfr:
-        vs abg rkvfgf:
-            fgnghf = 'Q'
-        ryvs abg unfuinyvq:
-            vs rag.fun == vaqrk.RZCGL_FUN:
-                fgnghf = 'N'
-            ryfr:
-                fgnghf = 'Z'
-        ryfr:
-            fgnghf = ' '
-        vs bcg.ireobfr >= 2:
-            ybt('%f %-70f\a' % (fgnghf, rag.anzr))
-        ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
-            vs abg ynfgqve.fgnegfjvgu(qve):
-                ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
-            ynfgqve = qve
-
-    vs bcg.cebterff:
-        cebterff_ercbeg(0)
-    spbhag += 1
-    
-    vs abg rkvfgf:
-        pbagvahr
-    vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
-        vs rkvfgf naq abg unfuinyvq:
-            nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
-            ynfgfxvc_anzr = rag.anzr
-        pbagvahr
-
-    nffreg(qve.fgnegfjvgu('/'))
-    qvec = qve.fcyvg('/')
-    juvyr cnegf > qvec:
-        _cbc(sbepr_gerr = Abar)
-    vs qve != '/':
-        sbe cneg va qvec[yra(cnegf):]:
-            _chfu(cneg)
-
-    vs abg svyr:
-        # ab svyranzr cbegvba zrnaf guvf vf n fhoqve.  Ohg
-        # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
-        byqgerr = nyernql_fnirq(rag) # znl or Abar
-        arjgerr = _cbc(sbepr_gerr = byqgerr)
-        vs abg byqgerr:
-            vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
-                rag.vainyvqngr()
-            ryfr:
-                rag.inyvqngr(040000, arjgerr)
-            rag.ercnpx()
-        vs rkvfgf naq jnfzvffvat:
-            pbhag += byqfvmr
-        pbagvahr
-
-    # vg'f abg n qverpgbel
-    vq = Abar
-    vs unfuinyvq:
-        zbqr = '%b' % rag.tvgzbqr
-        vq = rag.fun
-        funyvfgf[-1].nccraq((zbqr, 
-                             tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
-                             vq))
-    ryfr:
-        vs fgng.F_VFERT(rag.zbqr):
-            gel:
-                s = unfufcyvg.bcra_abngvzr(rag.anzr)
-            rkprcg VBReebe, r:
-                nqq_reebe(r)
-                ynfgfxvc_anzr = rag.anzr
-            rkprcg BFReebe, r:
-                nqq_reebe(r)
-                ynfgfxvc_anzr = rag.anzr
-            ryfr:
-                (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
-        ryfr:
-            vs fgng.F_VFQVE(rag.zbqr):
-                nffreg(0)  # unaqyrq nobir
-            ryvs fgng.F_VFYAX(rag.zbqr):
-                gel:
-                    ey = bf.ernqyvax(rag.anzr)
-                rkprcg BFReebe, r:
-                    nqq_reebe(r)
-                    ynfgfxvc_anzr = rag.anzr
-                rkprcg VBReebe, r:
-                    nqq_reebe(r)
-                    ynfgfxvc_anzr = rag.anzr
-                ryfr:
-                    (zbqr, vq) = ('120000', j.arj_oybo(ey))
-            ryfr:
-                nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
-                ynfgfxvc_anzr = rag.anzr
-        vs vq:
-            rag.inyvqngr(vag(zbqr, 8), vq)
-            rag.ercnpx()
-            funyvfgf[-1].nccraq((zbqr,
-                                 tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
-                                 vq))
-    vs rkvfgf naq jnfzvffvat:
-        pbhag += byqfvmr
-        fhopbhag = 0
-
-
-vs bcg.cebterff:
-    cpg = gbgny naq pbhag*100.0/gbgny be 100
-    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar.    \a'
-             % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
-
-juvyr yra(cnegf) > 1:
-    _cbc(sbepr_gerr = Abar)
-nffreg(yra(funyvfgf) == 1)
-gerr = j.arj_gerr(funyvfgf[-1])
-vs bcg.gerr:
-    cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
-    zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
-    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
-    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
-    vs bcg.pbzzvg:
-        cevag pbzzvg.rapbqr('urk')
-
-j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
-        
-vs bcg.anzr:
-    vs pyv:
-        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
-    ryfr:
-        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
-    pyv.pybfr()
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc gvpx
-"""
-b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-g = gvzr.gvzr()
-gyrsg = 1 - (g - vag(g))
-gvzr.fyrrc(gyrsg)
-#!/hfe/ova/rai clguba
-vzcbeg bf, flf, fgng, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
-sebz ohc.urycref vzcbeg *
-
-
-qrs zretr_vaqrkrf(bhg, e1, e2):
-    sbe r va vaqrk.ZretrVgre([e1, e2]):
-        # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl?  Jura?
-        bhg.nqq_vkragel(r)
-
-
-pynff VgreUrycre:
-    qrs __vavg__(frys, y):
-        frys.v = vgre(y)
-        frys.phe = Abar
-        frys.arkg()
-
-    qrs arkg(frys):
-        gel:
-            frys.phe = frys.v.arkg()
-        rkprcg FgbcVgrengvba:
-            frys.phe = Abar
-        erghea frys.phe
-
-
-qrs purpx_vaqrk(ernqre):
-    gel:
-        ybt('purpx: purpxvat sbejneq vgrengvba...\a')
-        r = Abar
-        q = {}
-        sbe r va ernqre.sbejneq_vgre():
-            vs r.puvyqera_a:
-                vs bcg.ireobfr:
-                    ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
-                                            r.anzr))
-                nffreg(r.puvyqera_bsf)
-                nffreg(r.anzr.raqfjvgu('/'))
-                nffreg(abg q.trg(r.puvyqera_bsf))
-                q[r.puvyqera_bsf] = 1
-            vs r.syntf & vaqrk.VK_UNFUINYVQ:
-                nffreg(r.fun != vaqrk.RZCGL_FUN)
-                nffreg(r.tvgzbqr)
-        nffreg(abg r be r.anzr == '/')  # ynfg ragel vf *nyjnlf* /
-        ybt('purpx: purpxvat abezny vgrengvba...\a')
-        ynfg = Abar
-        sbe r va ernqre:
-            vs ynfg:
-                nffreg(ynfg > r.anzr)
-            ynfg = r.anzr
-    rkprcg:
-        ybt('vaqrk reebe! ng %e\a' % r)
-        envfr
-    ybt('purpx: cnffrq.\a')
-
-
-qrs hcqngr_vaqrk(gbc):
-    ev = vaqrk.Ernqre(vaqrksvyr)
-    jv = vaqrk.Jevgre(vaqrksvyr)
-    evt = VgreUrycre(ev.vgre(anzr=gbc))
-    gfgneg = vag(gvzr.gvzr())
-
-    unfutra = Abar
-    vs bcg.snxr_inyvq:
-        qrs unfutra(anzr):
-            erghea (0100644, vaqrk.SNXR_FUN)
-
-    gbgny = 0
-    sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
-        vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
-            flf.fgqbhg.jevgr('%f\a' % cngu)
-            flf.fgqbhg.syhfu()
-            cebterff('Vaqrkvat: %q\e' % gbgny)
-        ryvs abg (gbgny % 128):
-            cebterff('Vaqrkvat: %q\e' % gbgny)
-        gbgny += 1
-        juvyr evt.phe naq evt.phe.anzr > cngu:  # qryrgrq cnguf
-            vs evt.phe.rkvfgf():
-                evt.phe.frg_qryrgrq()
-                evt.phe.ercnpx()
-            evt.arkg()
-        vs evt.phe naq evt.phe.anzr == cngu:    # cnguf gung nyernql rkvfgrq
-            vs cfg:
-                evt.phe.sebz_fgng(cfg, gfgneg)
-            vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
-                vs unfutra:
-                    (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
-                    evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
-            vs bcg.snxr_vainyvq:
-                evt.phe.vainyvqngr()
-            evt.phe.ercnpx()
-            evt.arkg()
-        ryfr:  # arj cnguf
-            jv.nqq(cngu, cfg, unfutra = unfutra)
-    cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
-    
-    vs ev.rkvfgf():
-        ev.fnir()
-        jv.syhfu()
-        vs jv.pbhag:
-            je = jv.arj_ernqre()
-            vs bcg.purpx:
-                ybt('purpx: orsber zretvat: byqsvyr\a')
-                purpx_vaqrk(ev)
-                ybt('purpx: orsber zretvat: arjsvyr\a')
-                purpx_vaqrk(je)
-            zv = vaqrk.Jevgre(vaqrksvyr)
-            zretr_vaqrkrf(zv, ev, je)
-            ev.pybfr()
-            zv.pybfr()
-            je.pybfr()
-        jv.nobeg()
-    ryfr:
-        jv.pybfr()
-
-
-bcgfcrp = """
-ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
---
-c,cevag    cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
-z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
-f,fgnghf   cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
-U,unfu     cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
-y,ybat     cevag zber vasbezngvba nobhg rnpu svyr
-h,hcqngr   (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
-k,kqri,bar-svyr-flfgrz  qba'g pebff svyrflfgrz obhaqnevrf
-snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
-snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
-purpx      pnershyyl purpx vaqrk svyr vagrtevgl
-s,vaqrksvyr=  gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-"""
-b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
-    b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
-vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
-    b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
-vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
-    b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
-
-tvg.purpx_ercb_be_qvr()
-vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
-
-unaqyr_pgey_p()
-
-vs bcg.purpx:
-    ybt('purpx: fgnegvat vavgvny purpx.\a')
-    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-cnguf = vaqrk.erqhpr_cnguf(rkgen)
-
-vs bcg.hcqngr:
-    vs abg cnguf:
-        b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
-    sbe (ec,cngu) va cnguf:
-        hcqngr_vaqrk(ec)
-
-vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
-    sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
-        vs (bcg.zbqvsvrq 
-            naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
-            pbagvahr
-        yvar = ''
-        vs bcg.fgnghf:
-            vs rag.vf_qryrgrq():
-                yvar += 'Q '
-            ryvs abg rag.vf_inyvq():
-                vs rag.fun == vaqrk.RZCGL_FUN:
-                    yvar += 'N '
-                ryfr:
-                    yvar += 'Z '
-            ryfr:
-                yvar += '  '
-        vs bcg.unfu:
-            yvar += rag.fun.rapbqr('urk') + ' '
-        vs bcg.ybat:
-            yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
-        cevag yvar + (anzr be './')
-
-vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
-    ybt('purpx: fgnegvat svany purpx.\a')
-    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg
-sebz ohc vzcbeg bcgvbaf, urycref
-
-bcgfcrp = """
-ohc eonpxhc-freire
---
-    Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-# trg gur fhopbzznaq'f neti.
-# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
-# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
-# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
-ohs = flf.fgqva.ernq(4)
-fm = fgehpg.hacnpx('!V', ohs)[0]
-nffreg(fm > 0)
-nffreg(fm < 1000000)
-ohs = flf.fgqva.ernq(fm)
-nffreg(yra(ohs) == fm)
-neti = ohs.fcyvg('\0')
-
-# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
-# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
-# gb zvfhfr gurz.  Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
-# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
-#
-# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
-# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
-# fbpxrg.  Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
-# bs vg, ohg cebonoyl qvqa'g.  Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
-# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
-#
-# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
-# qrfpevcgbef.  Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
-# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
-bf.qhc2(0, 3)
-bf.qhc2(1, 4)
-bf.qhc2(2, 1)
-sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
-bf.qhc2(sq, 0)
-bf.pybfr(sq)
-
-bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
-bf.rkrpic(neti[0], neti)
-flf.rkvg(99)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo, fhocebprff, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-cne2_bx = 0
-ahyys = bcra('/qri/ahyy')
-
-qrs qroht(f):
-    vs bcg.ireobfr:
-        ybt(f)
-
-qrs eha(neti):
-    # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
-    # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
-    # rkrpvat sbe fbzr ernfba.  Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
-    # svefg.
-    sq = bf.qhc(2)  # pbcl fgqree
-    gel:
-        c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
-        erghea c.jnvg()
-    svanyyl:
-        bf.pybfr(sq)
-
-qrs cne2_frghc():
-    tybony cne2_bx
-    ei = 1
-    gel:
-        c = fhocebprff.Cbcra(['cne2', '--uryc'],
-                             fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
-        ei = c.jnvg()
-    rkprcg BFReebe:
-        ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
-    ryfr:
-        cne2_bx = 1
-
-qrs cnei(yiy):
-    vs bcg.ireobfr >= yiy:
-        vs vfggl:
-            erghea []
-        ryfr:
-            erghea ['-d']
-    ryfr:
-        erghea ['-dd']
-
-qrs cne2_trarengr(onfr):
-    erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
-               + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
-
-qrs cne2_irevsl(onfr):
-    erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
-
-qrs cne2_ercnve(onfr):
-    erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
-
-qrs dhvpx_irevsl(onfr):
-    s = bcra(onfr + '.cnpx', 'eo')
-    s.frrx(-20, 2)
-    jnagfhz = s.ernq(20)
-    nffreg(yra(jnagfhz) == 20)
-    s.frrx(0)
-    fhz = Fun1()
-    sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
-        fhz.hcqngr(o)
-    vs fhz.qvtrfg() != jnagfhz:
-        envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
-                                                  fhz.urkqvtrfg()))
-        
-
-qrs tvg_irevsl(onfr):
-    vs bcg.dhvpx:
-        gel:
-            dhvpx_irevsl(onfr)
-        rkprcg Rkprcgvba, r:
-            qroht('reebe: %f\a' % r)
-            erghea 1
-        erghea 0
-    ryfr:
-        erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
-    
-    
-qrs qb_cnpx(onfr, ynfg):
-    pbqr = 0
-    vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
-        ierfhyg = cne2_irevsl(onfr)
-        vs ierfhyg != 0:
-            vs bcg.ercnve:
-                eerfhyg = cne2_ercnve(onfr)
-                vs eerfhyg != 0:
-                    cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
-                    pbqr = eerfhyg
-                ryfr:
-                    cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
-                    pbqr = 100
-            ryfr:
-                cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
-                pbqr = ierfhyg
-        ryfr:
-            cevag '%f bx' % ynfg
-    ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
-        terfhyg = tvg_irevsl(onfr)
-        vs terfhyg != 0:
-            cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
-            pbqr = terfhyg
-        ryfr:
-            vs cne2_bx naq bcg.trarengr:
-                cerfhyg = cne2_trarengr(onfr)
-                vs cerfhyg != 0:
-                    cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
-                    pbqr = cerfhyg
-                ryfr:
-                    cevag '%f bx' % ynfg
-            ryfr:
-                cevag '%f bx' % ynfg
-    ryfr:
-        nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
-        qroht('    fxvccrq: cne2 svyr nyernql trarengrq.\a')
-    erghea pbqr
-
-
-bcgfcrp = """
-ohc sfpx [bcgvbaf...] [svyranzrf...]
---
-e,ercnve    nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
-t,trarengr  trarengr nhgb-ercnve vasbezngvba hfvat cne2
-i,ireobfr   vapernfr ireobfvgl (pna or hfrq zber guna bapr)
-dhvpx       whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
-w,wbof=     eha 'a' wbof va cnenyyry
-cne2-bx     vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
-qvfnoyr-cne2  vtaber cne2 rira vs vg vf ninvynoyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-cne2_frghc()
-vs bcg.cne2_bx:
-    vs cne2_bx:
-        flf.rkvg(0)  # 'gehr' va fu
-    ryfr:
-        flf.rkvg(1)
-vs bcg.qvfnoyr_cne2:
-    cne2_bx = 0
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
-    qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
-    rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
-
-pbqr = 0
-pbhag = 0
-bhgfgnaqvat = {}
-sbe anzr va rkgen:
-    vs anzr.raqfjvgu('.cnpx'):
-        onfr = anzr[:-5]
-    ryvs anzr.raqfjvgu('.vqk'):
-        onfr = anzr[:-4]
-    ryvs anzr.raqfjvgu('.cne2'):
-        onfr = anzr[:-5]
-    ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
-        onfr = anzr
-    ryfr:
-        envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
-    (qve,ynfg) = bf.cngu.fcyvg(onfr)
-    cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
-    vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
-        cne2_rkvfgf = 0
-    flf.fgqbhg.syhfu()
-    qroht('sfpx: purpxvat %f (%f)\a' 
-          % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
-    vs abg bcg.ireobfr:
-        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-    
-    vs abg bcg.wbof:
-        ap = qb_cnpx(onfr, ynfg)
-        pbqr = pbqr be ap
-        pbhag += 1
-    ryfr:
-        juvyr yra(bhgfgnaqvat) >= bcg.wbof:
-            (cvq,ap) = bf.jnvg()
-            ap >>= 8
-            vs cvq va bhgfgnaqvat:
-                qry bhgfgnaqvat[cvq]
-                pbqr = pbqr be ap
-                pbhag += 1
-        cvq = bf.sbex()
-        vs cvq:  # cnerag
-            bhgfgnaqvat[cvq] = 1
-        ryfr: # puvyq
-            gel:
-                flf.rkvg(qb_cnpx(onfr, ynfg))
-            rkprcg Rkprcgvba, r:
-                ybt('rkprcgvba: %e\a' % r)
-                flf.rkvg(99)
-                
-juvyr yra(bhgfgnaqvat):
-    (cvq,ap) = bf.jnvg()
-    ap >>= 8
-    vs cvq va bhgfgnaqvat:
-        qry bhgfgnaqvat[cvq]
-        pbqr = pbqr be ap
-        pbhag += 1
-    vs abg bcg.ireobfr:
-        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
-vs abg bcg.ireobfr naq vfggl:
-    ybt('sfpx qbar.           \a')
-flf.rkvg(pbqr)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
-sebz ohc vzcbeg bcgvbaf, ffu
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc eonpxhc <ubfganzr> vaqrk ...
-ohc eonpxhc <ubfganzr> fnir ...
-ohc eonpxhc <ubfganzr> fcyvg ...
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs yra(rkgen) < 2:
-    b.sngny('nethzragf rkcrpgrq')
-
-pynff FvtRkprcgvba(Rkprcgvba):
-    qrs __vavg__(frys, fvtahz):
-        frys.fvtahz = fvtahz
-        Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
-qrs unaqyre(fvtahz, senzr):
-    envfr FvtRkprcgvba(fvtahz)
-
-fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
-fvtany.fvtany(fvtany.FVTVAG, unaqyre)
-
-fc = Abar
-c = Abar
-erg = 99
-
-gel:
-    ubfganzr = rkgen[0]
-    neti = rkgen[1:]
-    c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
-
-    netif = '\0'.wbva(['ohc'] + neti)
-    c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
-    c.fgqva.syhfu()
-
-    znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
-    fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
-
-    c.fgqva.pybfr()
-    c.fgqbhg.pybfr()
-
-svanyyl:
-    juvyr 1:
-        # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
-        # va pnfr bhe puvyq qbrfa'g qvr.
-        gel:
-            erg = c.jnvg()
-            fc.jnvg()
-            oernx
-        rkprcg FvtRkprcgvba, r:
-            ybt('\aohc eonpxhc: %f\a' % r)
-            bf.xvyy(c.cvq, r.fvtahz)
-            erg = 84
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc arjyvare
-"""
-b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-e = er.pbzcvyr(e'([\e\a])')
-ynfgyra = 0
-nyy = ''
-juvyr 1:
-    y = e.fcyvg(nyy, 1)
-    vs yra(y) <= 1:
-        gel:
-            o = bf.ernq(flf.fgqva.svyrab(), 4096)
-        rkprcg XrlobneqVagreehcg:
-            oernx
-        vs abg o:
-            oernx
-        nyy += o
-    ryfr:
-        nffreg(yra(y) == 3)
-        (yvar, fcyvgpune, nyy) = y
-        #fcyvgpune = '\a'
-        flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
-        vs fcyvgpune == '\e':
-            ynfgyra = yra(yvar)
-        ryfr:
-            ynfgyra = 0
-        flf.fgqbhg.syhfu()
-
-vs ynfgyra be nyy:
-    flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
-#!/hfe/ova/rai clguba
-vzcbeg flf
-sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc znetva
-"""
-b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-#tvg.vtaber_zvqk = 1
-
-zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-ynfg = '\0'*20
-ybatzngpu = 0
-sbe v va zv:
-    vs v == ynfg:
-        pbagvahr
-    #nffreg(fge(v) >= ynfg)
-    cz = _unfufcyvg.ovgzngpu(ynfg, v)
-    ybatzngpu = znk(ybatzngpu, cz)
-    ynfg = v
-cevag ybatzngpu
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg bcgvbaf, qerphefr
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc qerphefr <cngu>
---
-k,kqri,bar-svyr-flfgrz   qba'g pebff svyrflfgrz obhaqnevrf
-d,dhvrg  qba'g npghnyyl cevag svyranzrf
-cebsvyr  eha haqre gur clguba cebsvyre
-"""
-b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar svyranzr rkcrpgrq")
-
-vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
-vs bcg.cebsvyr:
-    vzcbeg pCebsvyr
-    qrs qb_vg():
-        sbe v va vg:
-            cnff
-    pCebsvyr.eha('qb_vg()')
-ryfr:
-    vs bcg.dhvrg:
-        sbe v va vg:
-            cnff
-    ryfr:
-        sbe (anzr,fg) va vg:
-            cevag anzr
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-o,oybof    bhgchg n frevrf bs oybo vqf
-g,gerr     bhgchg n gerr vq
-p,pbzzvg   bhgchg n pbzzvg vq
-a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
-A,abbc     qba'g npghnyyl fnir gur qngn naljurer
-d,dhvrg    qba'g cevag cebterff zrffntrf
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-pbcl       whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
-orapu      cevag orapuznex gvzvatf gb fgqree
-znk-cnpx-fvmr=  znkvzhz olgrf va n fvatyr cnpx
-znk-cnpx-bowrpgf=  znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
-snabhg=  znkvzhz ahzore bs oybof va n fvatyr gerr
-"""
-b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
-        bcg.abbc be bcg.pbcl):
-    b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
-vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be 
-                               bcg.pbzzvg be bcg.anzr):
-    b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
-
-vs bcg.ireobfr >= 2:
-    tvg.ireobfr = bcg.ireobfr - 1
-    bcg.orapu = 1
-vs bcg.znk_cnpx_fvmr:
-    unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
-vs bcg.znk_cnpx_bowrpgf:
-    unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
-vs bcg.snabhg:
-    unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
-vs bcg.oybof:
-    unfufcyvg.snabhg = 0
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
-    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-fgneg_gvzr = gvzr.gvzr()
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.abbc be bcg.pbcl:
-    pyv = j = byqers = Abar
-ryvs bcg.erzbgr be vf_erirefr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
-    j = pyv.arj_cnpxjevgre()
-ryfr:
-    pyv = Abar
-    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
-    j = tvg.CnpxJevgre()
-
-svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
-vs j:
-    funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
-    gerr = j.arj_gerr(funyvfg)
-ryfr:
-    ynfg = 0
-    sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
-        unfufcyvg.gbgny_fcyvg += yra(oybo)
-        vs bcg.pbcl:
-            flf.fgqbhg.jevgr(fge(oybo))
-        zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
-        vs abg bcg.dhvrg naq ynfg != zrtf:
-            cebterff('%q Zolgrf ernq\e' % zrtf)
-            ynfg = zrtf
-    cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
-
-vs bcg.ireobfr:
-    ybt('\a')
-vs bcg.oybof:
-    sbe (zbqr,anzr,ova) va funyvfg:
-        cevag ova.rapbqr('urk')
-vs bcg.gerr:
-    cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
-    zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
-    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
-    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
-    vs bcg.pbzzvg:
-        cevag pbzzvg.rapbqr('urk')
-
-vs j:
-    j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
-        
-vs bcg.anzr:
-    vs pyv:
-        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
-    ryfr:
-        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
-    pyv.pybfr()
-
-frpf = gvzr.gvzr() - fgneg_gvzr
-fvmr = unfufcyvg.gbgny_fcyvg
-vs bcg.orapu:
-    ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
-        % (fvmr/1024., frpf, fvmr/1024./frpf))
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, fgehpg, zznc
-sebz ohc vzcbeg tvg, bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs f_sebz_olgrf(olgrf):
-    pyvfg = [pue(o) sbe o va olgrf]
-    erghea ''.wbva(pyvfg)
-
-
-qrs ercbeg(pbhag):
-    svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
-    q = {}
-    sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
-        y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
-        q[y[0]] = y[1]
-    vs pbhag >= 0:
-        r1 = pbhag
-        svryqf = [q[x] sbe x va svryqf]
-    ryfr:
-        r1 = ''
-    cevag ('%9f  ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
-    flf.fgqbhg.syhfu()
-
-
-bcgfcrp = """
-ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
---
-a,ahzore=  ahzore bs bowrpgf cre plpyr
-p,plpyrf=  ahzore bs plpyrf gb eha
-vtaber-zvqk  vtaber .zvqk svyrf, hfr bayl .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-tvg.vtaber_zvqk = bcg.vtaber_zvqk
-
-tvg.purpx_ercb_be_qvr()
-z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-
-plpyrf = bcg.plpyrf be 100
-ahzore = bcg.ahzore be 10000
-
-ercbeg(-1)
-s = bcra('/qri/henaqbz')
-n = zznc.zznc(-1, 20)
-ercbeg(0)
-sbe p va kenatr(plpyrf):
-    sbe a va kenatr(ahzore):
-        o = s.ernq(3)
-        vs 0:
-            olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
-            olgrf[2] &= 0ks0
-            ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
-        ryfr:
-            n[0:2] = o[0:2]
-            n[2] = pue(beq(o[2]) & 0ks0)
-            ova = fge(n[0:20])
-        #cevag ova.rapbqr('urk')
-        z.rkvfgf(ova)
-    ercbeg((p+1)*ahzore)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-qrs cevag_abqr(grkg, a):
-    cersvk = ''
-    vs bcg.unfu:
-        cersvk += "%f " % a.unfu.rapbqr('urk')
-    vs fgng.F_VFQVE(a.zbqr):
-        cevag '%f%f/' % (cersvk, grkg)
-    ryvs fgng.F_VFYAX(a.zbqr):
-        cevag '%f%f@' % (cersvk, grkg)
-    ryfr:
-        cevag '%f%f' % (cersvk, grkg)
-
-
-bcgfcrp = """
-ohc yf <qvef...>
---
-f,unfu   fubj unfu sbe rnpu svyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-
-vs abg rkgen:
-    rkgen = ['/']
-
-erg = 0
-sbe q va rkgen:
-    gel:
-        a = gbc.yerfbyir(q)
-        vs fgng.F_VFQVE(a.zbqr):
-            sbe fho va a:
-                cevag_abqr(fho.anzr, fho)
-        ryfr:
-            cevag_abqr(q, a)
-    rkprcg isf.AbqrReebe, r:
-        ybt('reebe: %f\a' % r)
-        erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
-sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
-sebz ohc.urycref vzcbeg *
-
-qrs abqr_anzr(grkg, a):
-    vs fgng.F_VFQVE(a.zbqr):
-        erghea '%f/' % grkg
-    ryvs fgng.F_VFYAX(a.zbqr):
-        erghea '%f@' % grkg
-    ryfr:
-        erghea '%f' % grkg
-
-
-qrs qb_yf(cngu, a):
-    y = []
-    vs fgng.F_VFQVE(a.zbqr):
-        sbe fho va a:
-            y.nccraq(abqr_anzr(fho.anzr, fho))
-    ryfr:
-        y.nccraq(abqr_anzr(cngu, a))
-    cevag pbyhzangr(y, '')
-    
-
-qrs jevgr_gb_svyr(vas, bhgs):
-    sbe oybo va puhaxlernqre(vas):
-        bhgs.jevgr(oybo)
-    
-
-qrs vachgvgre():
-    vs bf.vfnggl(flf.fgqva.svyrab()):
-        juvyr 1:
-            gel:
-                lvryq enj_vachg('ohc> ')
-            rkprcg RBSReebe:
-                oernx
-    ryfr:
-        sbe yvar va flf.fgqva:
-            lvryq yvar
-
-
-qrs _pbzcyrgre_trg_fhof(yvar):
-    (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
-    (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
-    #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
-    a = cjq.erfbyir(qve)
-    fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
-                       a.fhof()))
-    erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
-
-
-_ynfg_yvar = Abar
-_ynfg_erf = Abar
-qrs pbzcyrgre(grkg, fgngr):
-    tybony _ynfg_yvar
-    tybony _ynfg_erf
-    gel:
-        yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
-        vs _ynfg_yvar != yvar:
-            _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
-            _ynfg_yvar = yvar
-        (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
-        vs fgngr < yra(fhof):
-            fa = fhof[fgngr]
-            fa1 = fa.erfbyir('')  # qrers flzyvaxf
-            shyyanzr = bf.cngu.wbva(qve, fa.anzr)
-            vs fgng.F_VFQVE(fa1.zbqr):
-                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
-                                          grezvangr=Snyfr)
-            ryfr:
-                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
-                                          grezvangr=Gehr) + ' '
-            erghea grkg + erg
-    rkprcg Rkprcgvba, r:
-        ybt('\areebe va pbzcyrgvba: %f\a' % r)
-
-            
-bcgfcrp = """
-ohc sgc
-"""
-b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-gbc = isf.ErsYvfg(Abar)
-cjq = gbc
-
-vs rkgen:
-    yvarf = rkgen
-ryfr:
-    ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
-    ernqyvar.frg_pbzcyrgre(pbzcyrgre)
-    ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
-    yvarf = vachgvgre()
-
-sbe yvar va yvarf:
-    vs abg yvar.fgevc():
-        pbagvahr
-    jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
-    pzq = jbeqf[0].ybjre()
-    #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
-    gel:
-        vs pzq == 'yf':
-            sbe cnez va (jbeqf[1:] be ['.']):
-                qb_yf(cnez, cjq.erfbyir(cnez))
-        ryvs pzq == 'pq':
-            sbe cnez va jbeqf[1:]:
-                cjq = cjq.erfbyir(cnez)
-        ryvs pzq == 'cjq':
-            cevag cjq.shyyanzr()
-        ryvs pzq == 'png':
-            sbe cnez va jbeqf[1:]:
-                jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
-        ryvs pzq == 'trg':
-            vs yra(jbeqf) abg va [2,3]:
-                envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
-            eanzr = jbeqf[1]
-            (qve,onfr) = bf.cngu.fcyvg(eanzr)
-            yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
-            vas = cjq.erfbyir(eanzr).bcra()
-            ybt('Fnivat %e\a' % yanzr)
-            jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
-        ryvs pzq == 'ztrg':
-            sbe cnez va jbeqf[1:]:
-                (qve,onfr) = bf.cngu.fcyvg(cnez)
-                sbe a va cjq.erfbyir(qve).fhof():
-                    vs sazngpu.sazngpu(a.anzr, onfr):
-                        gel:
-                            ybt('Fnivat %e\a' % a.anzr)
-                            vas = a.bcra()
-                            bhgs = bcra(a.anzr, 'jo')
-                            jevgr_gb_svyr(vas, bhgs)
-                            bhgs.pybfr()
-                        rkprcg Rkprcgvba, r:
-                            ybt('  reebe: %f\a' % r)
-        ryvs pzq == 'uryc' be pzq == '?':
-            ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
-        ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
-            oernx
-        ryfr:
-            envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
-    rkprcg Rkprcgvba, r:
-        ybt('reebe: %f\a' % r)
-        #envfr
-#!/hfe/ova/rai clguba
-vzcbeg flf, zznc
-sebz ohc vzcbeg bcgvbaf, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc enaqbz [-F frrq] <ahzolgrf>
---
-F,frrq=   bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
-s,sbepr   cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
-"""
-b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-gbgny = cnefr_ahz(rkgen[0])
-
-vs bcg.sbepr be (abg bf.vfnggl(1) naq
-                 abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
-    _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
-ryfr:
-    ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc uryc <pbzznaq>
-"""
-b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) == 0:
-    # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
-    bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
-ryvs yra(rkgen) == 1:
-    qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
-    rkr = flf.neti[0]
-    (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
-    znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
-    t = tybo.tybo(znacngu)
-    vs t:
-        bf.rkrpic('zna', ['zna', '-y', t[0]])
-    ryfr:
-        bf.rkrpic('zna', ['zna', qbpanzr])
-ryfr:
-    b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-
-pynff Fgng(shfr.Fgng):
-    qrs __vavg__(frys):
-        frys.fg_zbqr = 0
-        frys.fg_vab = 0
-        frys.fg_qri = 0
-        frys.fg_ayvax = 0
-        frys.fg_hvq = 0
-        frys.fg_tvq = 0
-        frys.fg_fvmr = 0
-        frys.fg_ngvzr = 0
-        frys.fg_zgvzr = 0
-        frys.fg_pgvzr = 0
-        frys.fg_oybpxf = 0
-        frys.fg_oyxfvmr = 0
-        frys.fg_eqri = 0
-
-
-pnpur = {}
-qrs pnpur_trg(gbc, cngu):
-    cnegf = cngu.fcyvg('/')
-    pnpur[('',)] = gbc
-    p = Abar
-    znk = yra(cnegf)
-    #ybt('pnpur: %e\a' % pnpur.xrlf())
-    sbe v va enatr(znk):
-        cer = cnegf[:znk-v]
-        #ybt('pnpur gelvat: %e\a' % cer)
-        p = pnpur.trg(ghcyr(cer))
-        vs p:
-            erfg = cnegf[znk-v:]
-            sbe e va erfg:
-                #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
-                p = p.yerfbyir(e)
-                xrl = ghcyr(cer + [e])
-                #ybt('fnivat: %e\a' % (xrl,))
-                pnpur[xrl] = p
-            oernx
-    nffreg(p)
-    erghea p
-        
-    
-
-pynff OhcSf(shfr.Shfr):
-    qrs __vavg__(frys, gbc):
-        shfr.Shfr.__vavg__(frys)
-        frys.gbc = gbc
-    
-    qrs trgngge(frys, cngu):
-        ybt('--trgngge(%e)\a' % cngu)
-        gel:
-            abqr = pnpur_trg(frys.gbc, cngu)
-            fg = Fgng()
-            fg.fg_zbqr = abqr.zbqr
-            fg.fg_ayvax = abqr.ayvaxf()
-            fg.fg_fvmr = abqr.fvmr()
-            fg.fg_zgvzr = abqr.zgvzr
-            fg.fg_pgvzr = abqr.pgvzr
-            fg.fg_ngvzr = abqr.ngvzr
-            erghea fg
-        rkprcg isf.AbFhpuSvyr:
-            erghea -reeab.RABRAG
-
-    qrs ernqqve(frys, cngu, bssfrg):
-        ybt('--ernqqve(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        lvryq shfr.Qveragel('.')
-        lvryq shfr.Qveragel('..')
-        sbe fho va abqr.fhof():
-            lvryq shfr.Qveragel(fho.anzr)
-
-    qrs ernqyvax(frys, cngu):
-        ybt('--ernqyvax(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        erghea abqr.ernqyvax()
-
-    qrs bcra(frys, cngu, syntf):
-        ybt('--bcra(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
-        vs (syntf & nppzbqr) != bf.B_EQBAYL:
-            erghea -reeab.RNPPRF
-        abqr.bcra()
-
-    qrs eryrnfr(frys, cngu, syntf):
-        ybt('--eryrnfr(%e)\a' % cngu)
-
-    qrs ernq(frys, cngu, fvmr, bssfrg):
-        ybt('--ernq(%e)\a' % cngu)
-        a = pnpur_trg(frys.gbc, cngu)
-        b = a.bcra()
-        b.frrx(bssfrg)
-        erghea b.ernq(fvmr)
-
-
-vs abg unfngge(shfr, '__irefvba__'):
-    envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
-shfr.shfr_clguba_ncv = (0, 2)
-
-
-bcgfcrp = """
-ohc shfr [-q] [-s] <zbhagcbvag>
---
-q,qroht   vapernfr qroht yriry
-s,sbertebhaq  eha va sbertebhaq
-"""
-b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-s = OhcSf(gbc)
-s.shfr_netf.zbhagcbvag = rkgen[0]
-vs bcg.qroht:
-    s.shfr_netf.nqq('qroht')
-vs bcg.sbertebhaq:
-    s.shfr_netf.frgzbq('sbertebhaq')
-cevag s.zhygvguernqrq
-s.zhygvguernqrq = Snyfr
-
-s.znva()
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-
-vs bcg.erzbgr:
-    tvg.vavg_ercb()  # ybpny ercb
-    tvg.purpx_ercb_be_qvr()
-    pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
-    pyv.pybfr()
-ryfr:
-    tvg.vavg_ercb()
-#!/hfe/ova/rai clguba
-vzcbeg flf, zngu, fgehpg, tybo
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-CNTR_FVMR=4096
-FUN_CRE_CNTR=CNTR_FVMR/200.
-
-
-qrs zretr(vqkyvfg, ovgf, gnoyr):
-    pbhag = 0
-    sbe r va tvg.vqkzretr(vqkyvfg):
-        pbhag += 1
-        cersvk = tvg.rkgenpg_ovgf(r, ovgf)
-        gnoyr[cersvk] = pbhag
-        lvryq r
-
-
-qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
-    vs abg bhgsvyranzr:
-        nffreg(bhgqve)
-        fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
-        bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
-    
-    vac = []
-    gbgny = 0
-    sbe anzr va vasvyranzrf:
-        vk = tvg.CnpxVqk(anzr)
-        vac.nccraq(vk)
-        gbgny += yra(vk)
-
-    ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
-    vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
-       be (bcg.sbepr naq abg gbgny):
-        ybt('zvqk: abguvat gb qb.\a')
-        erghea
-
-    cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
-    ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
-    ragevrf = 2**ovgf
-    ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
-    
-    gnoyr = [0]*ragevrf
-
-    gel:
-        bf.hayvax(bhgsvyranzr)
-    rkprcg BFReebe:
-        cnff
-    s = bcra(bhgsvyranzr + '.gzc', 'j+')
-    s.jevgr('ZVQK\0\0\0\2')
-    s.jevgr(fgehpg.cnpx('!V', ovgf))
-    nffreg(s.gryy() == 12)
-    s.jevgr('\0'*4*ragevrf)
-    
-    sbe r va zretr(vac, ovgf, gnoyr):
-        s.jevgr(r)
-        
-    s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
-
-    s.frrx(12)
-    s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
-    s.pybfr()
-    bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
-
-    # guvf vf whfg sbe grfgvat
-    vs 0:
-        c = tvg.CnpxZvqk(bhgsvyranzr)
-        nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
-        cevag c.vqkanzrf
-        nffreg(yra(c) == gbgny)
-        cv = vgre(c)
-        sbe v va zretr(vac, gbgny, ovgf, gnoyr):
-            nffreg(v == cv.arkg())
-            nffreg(c.rkvfgf(v))
-
-    cevag bhgsvyranzr
-
-bcgfcrp = """
-ohc zvqk [bcgvbaf...] <vqkanzrf...>
---
-b,bhgchg=  bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
-n,nhgb     nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
-s,sbepr    nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen naq (bcg.nhgb be bcg.sbepr):
-    b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
-
-tvg.purpx_ercb_be_qvr()
-
-vs rkgen:
-    qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
-ryvs bcg.nhgb be bcg.sbepr:
-    cnguf = [tvg.ercb('bowrpgf/cnpx')]
-    cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
-    sbe cngu va cnguf:
-        ybt('zvqk: fpnaavat %f\a' % cngu)
-        vs bcg.sbepr:
-            qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
-        ryvs bcg.nhgb:
-            z = tvg.CnpxVqkYvfg(cngu)
-            arrqrq = {}
-            sbe cnpx va z.cnpxf:  # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
-                vs cnpx.anzr.raqfjvgu('.vqk'):
-                    arrqrq[cnpx.anzr] = 1
-            qry z
-            qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
-        ybt('\a')
-ryfr:
-    b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, enaqbz
-sebz ohc vzcbeg bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs enaqoybpx(a):
-    y = []
-    sbe v va kenatr(a):
-        y.nccraq(pue(enaqbz.enaqenatr(0,256)))
-    erghea ''.wbva(y)
-
-
-bcgfcrp = """
-ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
---
-   JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
-a,ahz=   ahzore bs oybpxf gb qnzntr
-f,fvmr=  znkvzhz fvmr bs rnpu qnzntrq oybpx
-creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
-rdhny    fcernq qnzntr rirayl guebhtubhg gur svyr
-F,frrq=  enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
-"""
-b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg rkgen:
-    b.sngny('svyranzrf rkcrpgrq')
-
-vs bcg.frrq != Abar:
-    enaqbz.frrq(bcg.frrq)
-
-sbe anzr va rkgen:
-    ybt('Qnzntvat "%f"...\a' % anzr)
-    s = bcra(anzr, 'e+o')
-    fg = bf.sfgng(s.svyrab())
-    fvmr = fg.fg_fvmr
-    vs bcg.creprag be bcg.fvmr:
-        zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
-        zf2 = bcg.fvmr be fvmr
-        znkfvmr = zva(zf1, zf2)
-    ryfr:
-        znkfvmr = 1
-    puhaxf = bcg.ahz be 10
-    puhaxfvmr = fvmr/puhaxf
-    sbe e va enatr(puhaxf):
-        fm = enaqbz.enaqenatr(1, znkfvmr+1)
-        vs fm > fvmr:
-            fm = fvmr
-        vs bcg.rdhny:
-            bsf = e*puhaxfvmr
-        ryfr:
-            bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
-        ybt('  %6q olgrf ng %q\a' % (fm, bsf))
-        s.frrx(bsf)
-        s.jevgr(enaqoybpx(fm))
-    s.pybfr()
-#!/hfe/ova/rai clguba
-vzcbeg flf, fgehpg, zznc
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-fhfcraqrq_j = Abar
-
-
-qrs vavg_qve(pbaa, net):
-    tvg.vavg_ercb(net)
-    ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
-    pbaa.bx()
-
-
-qrs frg_qve(pbaa, net):
-    tvg.purpx_ercb_be_qvr(net)
-    ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
-    pbaa.bx()
-
-    
-qrs yvfg_vaqrkrf(pbaa, whax):
-    tvg.purpx_ercb_be_qvr()
-    sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
-        vs s.raqfjvgu('.vqk'):
-            pbaa.jevgr('%f\a' % s)
-    pbaa.bx()
-
-
-qrs fraq_vaqrk(pbaa, anzr):
-    tvg.purpx_ercb_be_qvr()
-    nffreg(anzr.svaq('/') < 0)
-    nffreg(anzr.raqfjvgu('.vqk'))
-    vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
-    pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
-    pbaa.jevgr(vqk.znc)
-    pbaa.bx()
-
-
-qrs erprvir_bowrpgf(pbaa, whax):
-    tybony fhfcraqrq_j
-    tvg.purpx_ercb_be_qvr()
-    fhttrfgrq = {}
-    vs fhfcraqrq_j:
-        j = fhfcraqrq_j
-        fhfcraqrq_j = Abar
-    ryfr:
-        j = tvg.CnpxJevgre()
-    juvyr 1:
-        af = pbaa.ernq(4)
-        vs abg af:
-            j.nobeg()
-            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
-        a = fgehpg.hacnpx('!V', af)[0]
-        #ybt('rkcrpgvat %q olgrf\a' % a)
-        vs abg a:
-            ybt('ohc freire: erprvirq %q bowrpg%f.\a' 
-                % (j.pbhag, j.pbhag!=1 naq "f" be ''))
-            shyycngu = j.pybfr()
-            vs shyycngu:
-                (qve, anzr) = bf.cngu.fcyvg(shyycngu)
-                pbaa.jevgr('%f.vqk\a' % anzr)
-            pbaa.bx()
-            erghea
-        ryvs a == 0kssssssss:
-            ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
-            fhfcraqrq_j = j
-            pbaa.bx()
-            erghea
-            
-        ohs = pbaa.ernq(a)  # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
-        #ybt('ernq %q olgrf\a' % a)
-        vs yra(ohs) < a:
-            j.nobeg()
-            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
-                            % (a, yra(ohs)))
-        (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
-        fun = tvg.pnyp_unfu(glcr, pbagrag)
-        byqcnpx = j.rkvfgf(fun)
-        # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
-        # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
-        # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
-        # ba gur freire fvqr.
-        vs abg fhttrfgrq naq \
-          byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
-            # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
-            # ng guvf ynlre.  Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
-            # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
-            # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
-            # znxr gur svyrf ovttre.  Guvf zrgubq vf pregnvayl abg irel
-            # rssvpvrag.
-            j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
-            byqcnpx = j.bowpnpur.rkvfgf(fun)
-            ybt('arj fhttrfgvba: %e\a' % byqcnpx)
-            nffreg(byqcnpx)
-            nffreg(byqcnpx != Gehr)
-            nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
-            j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
-        vs abg fhttrfgrq naq byqcnpx:
-            nffreg(byqcnpx.raqfjvgu('.vqk'))
-            (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
-            vs abg (anzr va fhttrfgrq):
-                ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
-                pbaa.jevgr('vaqrk %f\a' % anzr)
-                fhttrfgrq[anzr] = 1
-        ryfr:
-            j._enj_jevgr([ohs])
-    # ABGERNPURQ
-
-
-qrs ernq_ers(pbaa, ersanzr):
-    tvg.purpx_ercb_be_qvr()
-    e = tvg.ernq_ers(ersanzr)
-    pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
-    pbaa.bx()
-
-
-qrs hcqngr_ers(pbaa, ersanzr):
-    tvg.purpx_ercb_be_qvr()
-    arjiny = pbaa.ernqyvar().fgevc()
-    byqiny = pbaa.ernqyvar().fgevc()
-    tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
-    pbaa.bx()
-
-
-qrs png(pbaa, vq):
-    tvg.purpx_ercb_be_qvr()
-    gel:
-        sbe oybo va tvg.png(vq):
-            pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
-            pbaa.jevgr(oybo)
-    rkprcg XrlReebe, r:
-        ybt('freire: reebe: %f\a' % r)
-        pbaa.jevgr('\0\0\0\0')
-        pbaa.reebe(r)
-    ryfr:
-        pbaa.jevgr('\0\0\0\0')
-        pbaa.bx()
-
-
-bcgfcrp = """
-ohc freire
-"""
-b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-ybt('ohc freire: ernqvat sebz fgqva.\a')
-
-pbzznaqf = {
-    'vavg-qve': vavg_qve,
-    'frg-qve': frg_qve,
-    'yvfg-vaqrkrf': yvfg_vaqrkrf,
-    'fraq-vaqrk': fraq_vaqrk,
-    'erprvir-bowrpgf': erprvir_bowrpgf,
-    'ernq-ers': ernq_ers,
-    'hcqngr-ers': hcqngr_ers,
-    'png': png,
-}
-
-# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
-# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
-pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
-ye = yvarernqre(pbaa)
-sbe _yvar va ye:
-    yvar = _yvar.fgevc()
-    vs abg yvar:
-        pbagvahr
-    ybt('ohc freire: pbzznaq: %e\a' % yvar)
-    jbeqf = yvar.fcyvg(' ', 1)
-    pzq = jbeqf[0]
-    erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
-    vs pzq == 'dhvg':
-        oernx
-    ryfr:
-        pzq = pbzznaqf.trg(pzq)
-        vs pzq:
-            pzq(pbaa, erfg)
-        ryfr:
-            envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
-
-ybt('ohc freire: qbar\a')
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
-    rkgen = yvarernqre(flf.fgqva)
-
-erg = 0
-
-vs bcg.erzbgr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    png = pyv.png
-ryfr:
-    pc = tvg.PngCvcr()
-    png = pc.wbva
-
-sbe vq va rkgen:
-    gel:
-        sbe oybo va png(vq):
-            flf.fgqbhg.jevgr(oybo)
-    rkprcg XrlReebe, r:
-        flf.fgqbhg.syhfu()
-        ybt('reebe: %f\a' % r)
-        erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, reeab, fgng, gvzr, zngu
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc fnir [-gp] [-a anzr] <svyranzrf...>
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-g,gerr     bhgchg n gerr vq
-p,pbzzvg   bhgchg n pbzzvg vq
-a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-d,dhvrg    qba'g fubj cebterff zrgre
-fznyyre=   bayl onpx hc svyrf fznyyre guna a olgrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
-    b.sngny("hfr bar be zber bs -g, -p, -a")
-vs abg rkgen:
-    b.sngny("ab svyranzrf tvira")
-
-bcg.cebterff = (vfggl naq abg bcg.dhvrg)
-bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
-    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.erzbgr be vf_erirefr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
-    j = pyv.arj_cnpxjevgre()
-ryfr:
-    pyv = Abar
-    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
-    j = tvg.CnpxJevgre()
-
-unaqyr_pgey_p()
-
-
-qrs rngfynfu(qve):
-    vs qve.raqfjvgu('/'):
-        erghea qve[:-1]
-    ryfr:
-        erghea qve
-
-
-cnegf = ['']
-funyvfgf = [[]]
-
-qrs _chfu(cneg):
-    nffreg(cneg)
-    cnegf.nccraq(cneg)
-    funyvfgf.nccraq([])
-
-qrs _cbc(sbepr_gerr):
-    nffreg(yra(cnegf) >= 1)
-    cneg = cnegf.cbc()
-    funyvfg = funyvfgf.cbc()
-    gerr = sbepr_gerr be j.arj_gerr(funyvfg)
-    vs funyvfgf:
-        funyvfgf[-1].nccraq(('40000', cneg, gerr))
-    ryfr:  # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
-        funyvfgf.nccraq(funyvfg)
-    erghea gerr
-
-ynfgerznva = Abar
-qrs cebterff_ercbeg(a):
-    tybony pbhag, fhopbhag, ynfgerznva
-    fhopbhag += a
-    pp = pbhag + fhopbhag
-    cpg = gbgny naq (pp*100.0/gbgny) be 0
-    abj = gvzr.gvzr()
-    ryncfrq = abj - gfgneg
-    xcf = ryncfrq naq vag(pp/1024./ryncfrq)
-    xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
-    xcf = vag(xcf/xcf_senp)*xcf_senp
-    vs pp:
-        erznva = ryncfrq*1.0/pp * (gbgny-pp)
-    ryfr:
-        erznva = 0.0
-    vs (ynfgerznva naq (erznva > ynfgerznva)
-          naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
-        erznva = ynfgerznva
-    ryfr:
-        ynfgerznva = erznva
-    ubhef = vag(erznva/60/60)
-    zvaf = vag(erznva/60 - ubhef*60)
-    frpf = vag(erznva - ubhef*60*60 - zvaf*60)
-    vs ryncfrq < 30:
-        erznvafge = ''
-        xcffge = ''
-    ryfr:
-        xcffge = '%qx/f' % xcf
-        vs ubhef:
-            erznvafge = '%qu%qz' % (ubhef, zvaf)
-        ryvs zvaf:
-            erznvafge = '%qz%q' % (zvaf, frpf)
-        ryfr:
-            erznvafge = '%qf' % frpf
-    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
-             % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
-                erznvafge, xcffge))
-
-
-e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
-
-qrs nyernql_fnirq(rag):
-    erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
-
-qrs jnagerphefr_cer(rag):
-    erghea abg nyernql_fnirq(rag)
-
-qrs jnagerphefr_qhevat(rag):
-    erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
-
-gbgny = sgbgny = 0
-vs bcg.cebterff:
-    sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
-        vs abg (sgbgny % 10024):
-            cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
-        rkvfgf = rag.rkvfgf()
-        unfuinyvq = nyernql_fnirq(rag)
-        rag.frg_fun_zvffvat(abg unfuinyvq)
-        vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
-            vs rkvfgf naq abg unfuinyvq:
-                gbgny += rag.fvmr
-        sgbgny += 1
-    cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
-    unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
-
-gfgneg = gvzr.gvzr()
-pbhag = fhopbhag = spbhag = 0
-ynfgfxvc_anzr = Abar
-ynfgqve = ''
-sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
-    (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
-    rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
-    unfuinyvq = nyernql_fnirq(rag)
-    jnfzvffvat = rag.fun_zvffvat()
-    byqfvmr = rag.fvmr
-    vs bcg.ireobfr:
-        vs abg rkvfgf:
-            fgnghf = 'Q'
-        ryvs abg unfuinyvq:
-            vs rag.fun == vaqrk.RZCGL_FUN:
-                fgnghf = 'N'
-            ryfr:
-                fgnghf = 'Z'
-        ryfr:
-            fgnghf = ' '
-        vs bcg.ireobfr >= 2:
-            ybt('%f %-70f\a' % (fgnghf, rag.anzr))
-        ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
-            vs abg ynfgqve.fgnegfjvgu(qve):
-                ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
-            ynfgqve = qve
-
-    vs bcg.cebterff:
-        cebterff_ercbeg(0)
-    spbhag += 1
-    
-    vs abg rkvfgf:
-        pbagvahr
-    vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
-        vs rkvfgf naq abg unfuinyvq:
-            nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
-            ynfgfxvc_anzr = rag.anzr
-        pbagvahr
-
-    nffreg(qve.fgnegfjvgu('/'))
-    qvec = qve.fcyvg('/')
-    juvyr cnegf > qvec:
-        _cbc(sbepr_gerr = Abar)
-    vs qve != '/':
-        sbe cneg va qvec[yra(cnegf):]:
-            _chfu(cneg)
-
-    vs abg svyr:
-        # ab svyranzr cbegvba zrnaf guvf vf n fhoqve.  Ohg
-        # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
-        byqgerr = nyernql_fnirq(rag) # znl or Abar
-        arjgerr = _cbc(sbepr_gerr = byqgerr)
-        vs abg byqgerr:
-            vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
-                rag.vainyvqngr()
-            ryfr:
-                rag.inyvqngr(040000, arjgerr)
-            rag.ercnpx()
-        vs rkvfgf naq jnfzvffvat:
-            pbhag += byqfvmr
-        pbagvahr
-
-    # vg'f abg n qverpgbel
-    vq = Abar
-    vs unfuinyvq:
-        zbqr = '%b' % rag.tvgzbqr
-        vq = rag.fun
-        funyvfgf[-1].nccraq((zbqr, 
-                             tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
-                             vq))
-    ryfr:
-        vs fgng.F_VFERT(rag.zbqr):
-            gel:
-                s = unfufcyvg.bcra_abngvzr(rag.anzr)
-            rkprcg VBReebe, r:
-                nqq_reebe(r)
-                ynfgfxvc_anzr = rag.anzr
-            rkprcg BFReebe, r:
-                nqq_reebe(r)
-                ynfgfxvc_anzr = rag.anzr
-            ryfr:
-                (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
-        ryfr:
-            vs fgng.F_VFQVE(rag.zbqr):
-                nffreg(0)  # unaqyrq nobir
-            ryvs fgng.F_VFYAX(rag.zbqr):
-                gel:
-                    ey = bf.ernqyvax(rag.anzr)
-                rkprcg BFReebe, r:
-                    nqq_reebe(r)
-                    ynfgfxvc_anzr = rag.anzr
-                rkprcg VBReebe, r:
-                    nqq_reebe(r)
-                    ynfgfxvc_anzr = rag.anzr
-                ryfr:
-                    (zbqr, vq) = ('120000', j.arj_oybo(ey))
-            ryfr:
-                nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
-                ynfgfxvc_anzr = rag.anzr
-        vs vq:
-            rag.inyvqngr(vag(zbqr, 8), vq)
-            rag.ercnpx()
-            funyvfgf[-1].nccraq((zbqr,
-                                 tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
-                                 vq))
-    vs rkvfgf naq jnfzvffvat:
-        pbhag += byqfvmr
-        fhopbhag = 0
-
-
-vs bcg.cebterff:
-    cpg = gbgny naq pbhag*100.0/gbgny be 100
-    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar.    \a'
-             % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
-
-juvyr yra(cnegf) > 1:
-    _cbc(sbepr_gerr = Abar)
-nffreg(yra(funyvfgf) == 1)
-gerr = j.arj_gerr(funyvfgf[-1])
-vs bcg.gerr:
-    cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
-    zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
-    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
-    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
-    vs bcg.pbzzvg:
-        cevag pbzzvg.rapbqr('urk')
-
-j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
-        
-vs bcg.anzr:
-    vs pyv:
-        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
-    ryfr:
-        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
-    pyv.pybfr()
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc gvpx
-"""
-b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-g = gvzr.gvzr()
-gyrsg = 1 - (g - vag(g))
-gvzr.fyrrc(gyrsg)
-#!/hfe/ova/rai clguba
-vzcbeg bf, flf, fgng, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
-sebz ohc.urycref vzcbeg *
-
-
-qrs zretr_vaqrkrf(bhg, e1, e2):
-    sbe r va vaqrk.ZretrVgre([e1, e2]):
-        # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl?  Jura?
-        bhg.nqq_vkragel(r)
-
-
-pynff VgreUrycre:
-    qrs __vavg__(frys, y):
-        frys.v = vgre(y)
-        frys.phe = Abar
-        frys.arkg()
-
-    qrs arkg(frys):
-        gel:
-            frys.phe = frys.v.arkg()
-        rkprcg FgbcVgrengvba:
-            frys.phe = Abar
-        erghea frys.phe
-
-
-qrs purpx_vaqrk(ernqre):
-    gel:
-        ybt('purpx: purpxvat sbejneq vgrengvba...\a')
-        r = Abar
-        q = {}
-        sbe r va ernqre.sbejneq_vgre():
-            vs r.puvyqera_a:
-                vs bcg.ireobfr:
-                    ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
-                                            r.anzr))
-                nffreg(r.puvyqera_bsf)
-                nffreg(r.anzr.raqfjvgu('/'))
-                nffreg(abg q.trg(r.puvyqera_bsf))
-                q[r.puvyqera_bsf] = 1
-            vs r.syntf & vaqrk.VK_UNFUINYVQ:
-                nffreg(r.fun != vaqrk.RZCGL_FUN)
-                nffreg(r.tvgzbqr)
-        nffreg(abg r be r.anzr == '/')  # ynfg ragel vf *nyjnlf* /
-        ybt('purpx: purpxvat abezny vgrengvba...\a')
-        ynfg = Abar
-        sbe r va ernqre:
-            vs ynfg:
-                nffreg(ynfg > r.anzr)
-            ynfg = r.anzr
-    rkprcg:
-        ybt('vaqrk reebe! ng %e\a' % r)
-        envfr
-    ybt('purpx: cnffrq.\a')
-
-
-qrs hcqngr_vaqrk(gbc):
-    ev = vaqrk.Ernqre(vaqrksvyr)
-    jv = vaqrk.Jevgre(vaqrksvyr)
-    evt = VgreUrycre(ev.vgre(anzr=gbc))
-    gfgneg = vag(gvzr.gvzr())
-
-    unfutra = Abar
-    vs bcg.snxr_inyvq:
-        qrs unfutra(anzr):
-            erghea (0100644, vaqrk.SNXR_FUN)
-
-    gbgny = 0
-    sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
-        vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
-            flf.fgqbhg.jevgr('%f\a' % cngu)
-            flf.fgqbhg.syhfu()
-            cebterff('Vaqrkvat: %q\e' % gbgny)
-        ryvs abg (gbgny % 128):
-            cebterff('Vaqrkvat: %q\e' % gbgny)
-        gbgny += 1
-        juvyr evt.phe naq evt.phe.anzr > cngu:  # qryrgrq cnguf
-            vs evt.phe.rkvfgf():
-                evt.phe.frg_qryrgrq()
-                evt.phe.ercnpx()
-            evt.arkg()
-        vs evt.phe naq evt.phe.anzr == cngu:    # cnguf gung nyernql rkvfgrq
-            vs cfg:
-                evt.phe.sebz_fgng(cfg, gfgneg)
-            vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
-                vs unfutra:
-                    (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
-                    evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
-            vs bcg.snxr_vainyvq:
-                evt.phe.vainyvqngr()
-            evt.phe.ercnpx()
-            evt.arkg()
-        ryfr:  # arj cnguf
-            jv.nqq(cngu, cfg, unfutra = unfutra)
-    cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
-    
-    vs ev.rkvfgf():
-        ev.fnir()
-        jv.syhfu()
-        vs jv.pbhag:
-            je = jv.arj_ernqre()
-            vs bcg.purpx:
-                ybt('purpx: orsber zretvat: byqsvyr\a')
-                purpx_vaqrk(ev)
-                ybt('purpx: orsber zretvat: arjsvyr\a')
-                purpx_vaqrk(je)
-            zv = vaqrk.Jevgre(vaqrksvyr)
-            zretr_vaqrkrf(zv, ev, je)
-            ev.pybfr()
-            zv.pybfr()
-            je.pybfr()
-        jv.nobeg()
-    ryfr:
-        jv.pybfr()
-
-
-bcgfcrp = """
-ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
---
-c,cevag    cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
-z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
-f,fgnghf   cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
-U,unfu     cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
-y,ybat     cevag zber vasbezngvba nobhg rnpu svyr
-h,hcqngr   (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
-k,kqri,bar-svyr-flfgrz  qba'g pebff svyrflfgrz obhaqnevrf
-snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
-snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
-purpx      pnershyyl purpx vaqrk svyr vagrtevgl
-s,vaqrksvyr=  gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-"""
-b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
-    b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
-vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
-    b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
-vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
-    b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
-
-tvg.purpx_ercb_be_qvr()
-vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
-
-unaqyr_pgey_p()
-
-vs bcg.purpx:
-    ybt('purpx: fgnegvat vavgvny purpx.\a')
-    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-cnguf = vaqrk.erqhpr_cnguf(rkgen)
-
-vs bcg.hcqngr:
-    vs abg cnguf:
-        b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
-    sbe (ec,cngu) va cnguf:
-        hcqngr_vaqrk(ec)
-
-vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
-    sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
-        vs (bcg.zbqvsvrq 
-            naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
-            pbagvahr
-        yvar = ''
-        vs bcg.fgnghf:
-            vs rag.vf_qryrgrq():
-                yvar += 'Q '
-            ryvs abg rag.vf_inyvq():
-                vs rag.fun == vaqrk.RZCGL_FUN:
-                    yvar += 'N '
-                ryfr:
-                    yvar += 'Z '
-            ryfr:
-                yvar += '  '
-        vs bcg.unfu:
-            yvar += rag.fun.rapbqr('urk') + ' '
-        vs bcg.ybat:
-            yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
-        cevag yvar + (anzr be './')
-
-vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
-    ybt('purpx: fgnegvat svany purpx.\a')
-    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg
-sebz ohc vzcbeg bcgvbaf, urycref
-
-bcgfcrp = """
-ohc eonpxhc-freire
---
-    Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-# trg gur fhopbzznaq'f neti.
-# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
-# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
-# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
-ohs = flf.fgqva.ernq(4)
-fm = fgehpg.hacnpx('!V', ohs)[0]
-nffreg(fm > 0)
-nffreg(fm < 1000000)
-ohs = flf.fgqva.ernq(fm)
-nffreg(yra(ohs) == fm)
-neti = ohs.fcyvg('\0')
-
-# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
-# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
-# gb zvfhfr gurz.  Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
-# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
-#
-# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
-# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
-# fbpxrg.  Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
-# bs vg, ohg cebonoyl qvqa'g.  Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
-# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
-#
-# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
-# qrfpevcgbef.  Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
-# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
-bf.qhc2(0, 3)
-bf.qhc2(1, 4)
-bf.qhc2(2, 1)
-sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
-bf.qhc2(sq, 0)
-bf.pybfr(sq)
-
-bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
-bf.rkrpic(neti[0], neti)
-flf.rkvg(99)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo, fhocebprff, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-cne2_bx = 0
-ahyys = bcra('/qri/ahyy')
-
-qrs qroht(f):
-    vs bcg.ireobfr:
-        ybt(f)
-
-qrs eha(neti):
-    # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
-    # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
-    # rkrpvat sbe fbzr ernfba.  Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
-    # svefg.
-    sq = bf.qhc(2)  # pbcl fgqree
-    gel:
-        c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
-        erghea c.jnvg()
-    svanyyl:
-        bf.pybfr(sq)
-
-qrs cne2_frghc():
-    tybony cne2_bx
-    ei = 1
-    gel:
-        c = fhocebprff.Cbcra(['cne2', '--uryc'],
-                             fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
-        ei = c.jnvg()
-    rkprcg BFReebe:
-        ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
-    ryfr:
-        cne2_bx = 1
-
-qrs cnei(yiy):
-    vs bcg.ireobfr >= yiy:
-        vs vfggl:
-            erghea []
-        ryfr:
-            erghea ['-d']
-    ryfr:
-        erghea ['-dd']
-
-qrs cne2_trarengr(onfr):
-    erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
-               + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
-
-qrs cne2_irevsl(onfr):
-    erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
-
-qrs cne2_ercnve(onfr):
-    erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
-
-qrs dhvpx_irevsl(onfr):
-    s = bcra(onfr + '.cnpx', 'eo')
-    s.frrx(-20, 2)
-    jnagfhz = s.ernq(20)
-    nffreg(yra(jnagfhz) == 20)
-    s.frrx(0)
-    fhz = Fun1()
-    sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
-        fhz.hcqngr(o)
-    vs fhz.qvtrfg() != jnagfhz:
-        envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
-                                                  fhz.urkqvtrfg()))
-        
-
-qrs tvg_irevsl(onfr):
-    vs bcg.dhvpx:
-        gel:
-            dhvpx_irevsl(onfr)
-        rkprcg Rkprcgvba, r:
-            qroht('reebe: %f\a' % r)
-            erghea 1
-        erghea 0
-    ryfr:
-        erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
-    
-    
-qrs qb_cnpx(onfr, ynfg):
-    pbqr = 0
-    vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
-        ierfhyg = cne2_irevsl(onfr)
-        vs ierfhyg != 0:
-            vs bcg.ercnve:
-                eerfhyg = cne2_ercnve(onfr)
-                vs eerfhyg != 0:
-                    cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
-                    pbqr = eerfhyg
-                ryfr:
-                    cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
-                    pbqr = 100
-            ryfr:
-                cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
-                pbqr = ierfhyg
-        ryfr:
-            cevag '%f bx' % ynfg
-    ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
-        terfhyg = tvg_irevsl(onfr)
-        vs terfhyg != 0:
-            cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
-            pbqr = terfhyg
-        ryfr:
-            vs cne2_bx naq bcg.trarengr:
-                cerfhyg = cne2_trarengr(onfr)
-                vs cerfhyg != 0:
-                    cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
-                    pbqr = cerfhyg
-                ryfr:
-                    cevag '%f bx' % ynfg
-            ryfr:
-                cevag '%f bx' % ynfg
-    ryfr:
-        nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
-        qroht('    fxvccrq: cne2 svyr nyernql trarengrq.\a')
-    erghea pbqr
-
-
-bcgfcrp = """
-ohc sfpx [bcgvbaf...] [svyranzrf...]
---
-e,ercnve    nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
-t,trarengr  trarengr nhgb-ercnve vasbezngvba hfvat cne2
-i,ireobfr   vapernfr ireobfvgl (pna or hfrq zber guna bapr)
-dhvpx       whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
-w,wbof=     eha 'a' wbof va cnenyyry
-cne2-bx     vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
-qvfnoyr-cne2  vtaber cne2 rira vs vg vf ninvynoyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-cne2_frghc()
-vs bcg.cne2_bx:
-    vs cne2_bx:
-        flf.rkvg(0)  # 'gehr' va fu
-    ryfr:
-        flf.rkvg(1)
-vs bcg.qvfnoyr_cne2:
-    cne2_bx = 0
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
-    qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
-    rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
-
-pbqr = 0
-pbhag = 0
-bhgfgnaqvat = {}
-sbe anzr va rkgen:
-    vs anzr.raqfjvgu('.cnpx'):
-        onfr = anzr[:-5]
-    ryvs anzr.raqfjvgu('.vqk'):
-        onfr = anzr[:-4]
-    ryvs anzr.raqfjvgu('.cne2'):
-        onfr = anzr[:-5]
-    ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
-        onfr = anzr
-    ryfr:
-        envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
-    (qve,ynfg) = bf.cngu.fcyvg(onfr)
-    cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
-    vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
-        cne2_rkvfgf = 0
-    flf.fgqbhg.syhfu()
-    qroht('sfpx: purpxvat %f (%f)\a' 
-          % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
-    vs abg bcg.ireobfr:
-        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-    
-    vs abg bcg.wbof:
-        ap = qb_cnpx(onfr, ynfg)
-        pbqr = pbqr be ap
-        pbhag += 1
-    ryfr:
-        juvyr yra(bhgfgnaqvat) >= bcg.wbof:
-            (cvq,ap) = bf.jnvg()
-            ap >>= 8
-            vs cvq va bhgfgnaqvat:
-                qry bhgfgnaqvat[cvq]
-                pbqr = pbqr be ap
-                pbhag += 1
-        cvq = bf.sbex()
-        vs cvq:  # cnerag
-            bhgfgnaqvat[cvq] = 1
-        ryfr: # puvyq
-            gel:
-                flf.rkvg(qb_cnpx(onfr, ynfg))
-            rkprcg Rkprcgvba, r:
-                ybt('rkprcgvba: %e\a' % r)
-                flf.rkvg(99)
-                
-juvyr yra(bhgfgnaqvat):
-    (cvq,ap) = bf.jnvg()
-    ap >>= 8
-    vs cvq va bhgfgnaqvat:
-        qry bhgfgnaqvat[cvq]
-        pbqr = pbqr be ap
-        pbhag += 1
-    vs abg bcg.ireobfr:
-        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
-vs abg bcg.ireobfr naq vfggl:
-    ybt('sfpx qbar.           \a')
-flf.rkvg(pbqr)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
-sebz ohc vzcbeg bcgvbaf, ffu
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc eonpxhc <ubfganzr> vaqrk ...
-ohc eonpxhc <ubfganzr> fnir ...
-ohc eonpxhc <ubfganzr> fcyvg ...
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs yra(rkgen) < 2:
-    b.sngny('nethzragf rkcrpgrq')
-
-pynff FvtRkprcgvba(Rkprcgvba):
-    qrs __vavg__(frys, fvtahz):
-        frys.fvtahz = fvtahz
-        Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
-qrs unaqyre(fvtahz, senzr):
-    envfr FvtRkprcgvba(fvtahz)
-
-fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
-fvtany.fvtany(fvtany.FVTVAG, unaqyre)
-
-fc = Abar
-c = Abar
-erg = 99
-
-gel:
-    ubfganzr = rkgen[0]
-    neti = rkgen[1:]
-    c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
-
-    netif = '\0'.wbva(['ohc'] + neti)
-    c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
-    c.fgqva.syhfu()
-
-    znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
-    fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
-
-    c.fgqva.pybfr()
-    c.fgqbhg.pybfr()
-
-svanyyl:
-    juvyr 1:
-        # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
-        # va pnfr bhe puvyq qbrfa'g qvr.
-        gel:
-            erg = c.jnvg()
-            fc.jnvg()
-            oernx
-        rkprcg FvtRkprcgvba, r:
-            ybt('\aohc eonpxhc: %f\a' % r)
-            bf.xvyy(c.cvq, r.fvtahz)
-            erg = 84
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc arjyvare
-"""
-b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-e = er.pbzcvyr(e'([\e\a])')
-ynfgyra = 0
-nyy = ''
-juvyr 1:
-    y = e.fcyvg(nyy, 1)
-    vs yra(y) <= 1:
-        gel:
-            o = bf.ernq(flf.fgqva.svyrab(), 4096)
-        rkprcg XrlobneqVagreehcg:
-            oernx
-        vs abg o:
-            oernx
-        nyy += o
-    ryfr:
-        nffreg(yra(y) == 3)
-        (yvar, fcyvgpune, nyy) = y
-        #fcyvgpune = '\a'
-        flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
-        vs fcyvgpune == '\e':
-            ynfgyra = yra(yvar)
-        ryfr:
-            ynfgyra = 0
-        flf.fgqbhg.syhfu()
-
-vs ynfgyra be nyy:
-    flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
-#!/hfe/ova/rai clguba
-vzcbeg flf
-sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc znetva
-"""
-b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-#tvg.vtaber_zvqk = 1
-
-zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-ynfg = '\0'*20
-ybatzngpu = 0
-sbe v va zv:
-    vs v == ynfg:
-        pbagvahr
-    #nffreg(fge(v) >= ynfg)
-    cz = _unfufcyvg.ovgzngpu(ynfg, v)
-    ybatzngpu = znk(ybatzngpu, cz)
-    ynfg = v
-cevag ybatzngpu
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg bcgvbaf, qerphefr
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc qerphefr <cngu>
---
-k,kqri,bar-svyr-flfgrz   qba'g pebff svyrflfgrz obhaqnevrf
-d,dhvrg  qba'g npghnyyl cevag svyranzrf
-cebsvyr  eha haqre gur clguba cebsvyre
-"""
-b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar svyranzr rkcrpgrq")
-
-vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
-vs bcg.cebsvyr:
-    vzcbeg pCebsvyr
-    qrs qb_vg():
-        sbe v va vg:
-            cnff
-    pCebsvyr.eha('qb_vg()')
-ryfr:
-    vs bcg.dhvrg:
-        sbe v va vg:
-            cnff
-    ryfr:
-        sbe (anzr,fg) va vg:
-            cevag anzr
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-o,oybof    bhgchg n frevrf bs oybo vqf
-g,gerr     bhgchg n gerr vq
-p,pbzzvg   bhgchg n pbzzvg vq
-a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
-A,abbc     qba'g npghnyyl fnir gur qngn naljurer
-d,dhvrg    qba'g cevag cebterff zrffntrf
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-pbcl       whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
-orapu      cevag orapuznex gvzvatf gb fgqree
-znk-cnpx-fvmr=  znkvzhz olgrf va n fvatyr cnpx
-znk-cnpx-bowrpgf=  znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
-snabhg=  znkvzhz ahzore bs oybof va n fvatyr gerr
-"""
-b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
-        bcg.abbc be bcg.pbcl):
-    b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
-vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be 
-                               bcg.pbzzvg be bcg.anzr):
-    b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
-
-vs bcg.ireobfr >= 2:
-    tvg.ireobfr = bcg.ireobfr - 1
-    bcg.orapu = 1
-vs bcg.znk_cnpx_fvmr:
-    unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
-vs bcg.znk_cnpx_bowrpgf:
-    unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
-vs bcg.snabhg:
-    unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
-vs bcg.oybof:
-    unfufcyvg.snabhg = 0
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
-    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-fgneg_gvzr = gvzr.gvzr()
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.abbc be bcg.pbcl:
-    pyv = j = byqers = Abar
-ryvs bcg.erzbgr be vf_erirefr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
-    j = pyv.arj_cnpxjevgre()
-ryfr:
-    pyv = Abar
-    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
-    j = tvg.CnpxJevgre()
-
-svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
-vs j:
-    funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
-    gerr = j.arj_gerr(funyvfg)
-ryfr:
-    ynfg = 0
-    sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
-        unfufcyvg.gbgny_fcyvg += yra(oybo)
-        vs bcg.pbcl:
-            flf.fgqbhg.jevgr(fge(oybo))
-        zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
-        vs abg bcg.dhvrg naq ynfg != zrtf:
-            cebterff('%q Zolgrf ernq\e' % zrtf)
-            ynfg = zrtf
-    cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
-
-vs bcg.ireobfr:
-    ybt('\a')
-vs bcg.oybof:
-    sbe (zbqr,anzr,ova) va funyvfg:
-        cevag ova.rapbqr('urk')
-vs bcg.gerr:
-    cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
-    zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
-    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
-    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
-    vs bcg.pbzzvg:
-        cevag pbzzvg.rapbqr('urk')
-
-vs j:
-    j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
-        
-vs bcg.anzr:
-    vs pyv:
-        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
-    ryfr:
-        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
-    pyv.pybfr()
-
-frpf = gvzr.gvzr() - fgneg_gvzr
-fvmr = unfufcyvg.gbgny_fcyvg
-vs bcg.orapu:
-    ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
-        % (fvmr/1024., frpf, fvmr/1024./frpf))
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, fgehpg, zznc
-sebz ohc vzcbeg tvg, bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs f_sebz_olgrf(olgrf):
-    pyvfg = [pue(o) sbe o va olgrf]
-    erghea ''.wbva(pyvfg)
-
-
-qrs ercbeg(pbhag):
-    svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
-    q = {}
-    sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
-        y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
-        q[y[0]] = y[1]
-    vs pbhag >= 0:
-        r1 = pbhag
-        svryqf = [q[x] sbe x va svryqf]
-    ryfr:
-        r1 = ''
-    cevag ('%9f  ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
-    flf.fgqbhg.syhfu()
-
-
-bcgfcrp = """
-ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
---
-a,ahzore=  ahzore bs bowrpgf cre plpyr
-p,plpyrf=  ahzore bs plpyrf gb eha
-vtaber-zvqk  vtaber .zvqk svyrf, hfr bayl .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-tvg.vtaber_zvqk = bcg.vtaber_zvqk
-
-tvg.purpx_ercb_be_qvr()
-z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-
-plpyrf = bcg.plpyrf be 100
-ahzore = bcg.ahzore be 10000
-
-ercbeg(-1)
-s = bcra('/qri/henaqbz')
-n = zznc.zznc(-1, 20)
-ercbeg(0)
-sbe p va kenatr(plpyrf):
-    sbe a va kenatr(ahzore):
-        o = s.ernq(3)
-        vs 0:
-            olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
-            olgrf[2] &= 0ks0
-            ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
-        ryfr:
-            n[0:2] = o[0:2]
-            n[2] = pue(beq(o[2]) & 0ks0)
-            ova = fge(n[0:20])
-        #cevag ova.rapbqr('urk')
-        z.rkvfgf(ova)
-    ercbeg((p+1)*ahzore)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-qrs cevag_abqr(grkg, a):
-    cersvk = ''
-    vs bcg.unfu:
-        cersvk += "%f " % a.unfu.rapbqr('urk')
-    vs fgng.F_VFQVE(a.zbqr):
-        cevag '%f%f/' % (cersvk, grkg)
-    ryvs fgng.F_VFYAX(a.zbqr):
-        cevag '%f%f@' % (cersvk, grkg)
-    ryfr:
-        cevag '%f%f' % (cersvk, grkg)
-
-
-bcgfcrp = """
-ohc yf <qvef...>
---
-f,unfu   fubj unfu sbe rnpu svyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-
-vs abg rkgen:
-    rkgen = ['/']
-
-erg = 0
-sbe q va rkgen:
-    gel:
-        a = gbc.yerfbyir(q)
-        vs fgng.F_VFQVE(a.zbqr):
-            sbe fho va a:
-                cevag_abqr(fho.anzr, fho)
-        ryfr:
-            cevag_abqr(q, a)
-    rkprcg isf.AbqrReebe, r:
-        ybt('reebe: %f\a' % r)
-        erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
-sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
-sebz ohc.urycref vzcbeg *
-
-qrs abqr_anzr(grkg, a):
-    vs fgng.F_VFQVE(a.zbqr):
-        erghea '%f/' % grkg
-    ryvs fgng.F_VFYAX(a.zbqr):
-        erghea '%f@' % grkg
-    ryfr:
-        erghea '%f' % grkg
-
-
-qrs qb_yf(cngu, a):
-    y = []
-    vs fgng.F_VFQVE(a.zbqr):
-        sbe fho va a:
-            y.nccraq(abqr_anzr(fho.anzr, fho))
-    ryfr:
-        y.nccraq(abqr_anzr(cngu, a))
-    cevag pbyhzangr(y, '')
-    
-
-qrs jevgr_gb_svyr(vas, bhgs):
-    sbe oybo va puhaxlernqre(vas):
-        bhgs.jevgr(oybo)
-    
-
-qrs vachgvgre():
-    vs bf.vfnggl(flf.fgqva.svyrab()):
-        juvyr 1:
-            gel:
-                lvryq enj_vachg('ohc> ')
-            rkprcg RBSReebe:
-                oernx
-    ryfr:
-        sbe yvar va flf.fgqva:
-            lvryq yvar
-
-
-qrs _pbzcyrgre_trg_fhof(yvar):
-    (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
-    (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
-    #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
-    a = cjq.erfbyir(qve)
-    fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
-                       a.fhof()))
-    erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
-
-
-_ynfg_yvar = Abar
-_ynfg_erf = Abar
-qrs pbzcyrgre(grkg, fgngr):
-    tybony _ynfg_yvar
-    tybony _ynfg_erf
-    gel:
-        yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
-        vs _ynfg_yvar != yvar:
-            _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
-            _ynfg_yvar = yvar
-        (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
-        vs fgngr < yra(fhof):
-            fa = fhof[fgngr]
-            fa1 = fa.erfbyir('')  # qrers flzyvaxf
-            shyyanzr = bf.cngu.wbva(qve, fa.anzr)
-            vs fgng.F_VFQVE(fa1.zbqr):
-                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
-                                          grezvangr=Snyfr)
-            ryfr:
-                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
-                                          grezvangr=Gehr) + ' '
-            erghea grkg + erg
-    rkprcg Rkprcgvba, r:
-        ybt('\areebe va pbzcyrgvba: %f\a' % r)
-
-            
-bcgfcrp = """
-ohc sgc
-"""
-b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-gbc = isf.ErsYvfg(Abar)
-cjq = gbc
-
-vs rkgen:
-    yvarf = rkgen
-ryfr:
-    ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
-    ernqyvar.frg_pbzcyrgre(pbzcyrgre)
-    ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
-    yvarf = vachgvgre()
-
-sbe yvar va yvarf:
-    vs abg yvar.fgevc():
-        pbagvahr
-    jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
-    pzq = jbeqf[0].ybjre()
-    #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
-    gel:
-        vs pzq == 'yf':
-            sbe cnez va (jbeqf[1:] be ['.']):
-                qb_yf(cnez, cjq.erfbyir(cnez))
-        ryvs pzq == 'pq':
-            sbe cnez va jbeqf[1:]:
-                cjq = cjq.erfbyir(cnez)
-        ryvs pzq == 'cjq':
-            cevag cjq.shyyanzr()
-        ryvs pzq == 'png':
-            sbe cnez va jbeqf[1:]:
-                jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
-        ryvs pzq == 'trg':
-            vs yra(jbeqf) abg va [2,3]:
-                envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
-            eanzr = jbeqf[1]
-            (qve,onfr) = bf.cngu.fcyvg(eanzr)
-            yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
-            vas = cjq.erfbyir(eanzr).bcra()
-            ybt('Fnivat %e\a' % yanzr)
-            jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
-        ryvs pzq == 'ztrg':
-            sbe cnez va jbeqf[1:]:
-                (qve,onfr) = bf.cngu.fcyvg(cnez)
-                sbe a va cjq.erfbyir(qve).fhof():
-                    vs sazngpu.sazngpu(a.anzr, onfr):
-                        gel:
-                            ybt('Fnivat %e\a' % a.anzr)
-                            vas = a.bcra()
-                            bhgs = bcra(a.anzr, 'jo')
-                            jevgr_gb_svyr(vas, bhgs)
-                            bhgs.pybfr()
-                        rkprcg Rkprcgvba, r:
-                            ybt('  reebe: %f\a' % r)
-        ryvs pzq == 'uryc' be pzq == '?':
-            ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
-        ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
-            oernx
-        ryfr:
-            envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
-    rkprcg Rkprcgvba, r:
-        ybt('reebe: %f\a' % r)
-        #envfr
-#!/hfe/ova/rai clguba
-vzcbeg flf, zznc
-sebz ohc vzcbeg bcgvbaf, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc enaqbz [-F frrq] <ahzolgrf>
---
-F,frrq=   bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
-s,sbepr   cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
-"""
-b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-gbgny = cnefr_ahz(rkgen[0])
-
-vs bcg.sbepr be (abg bf.vfnggl(1) naq
-                 abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
-    _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
-ryfr:
-    ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc uryc <pbzznaq>
-"""
-b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) == 0:
-    # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
-    bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
-ryvs yra(rkgen) == 1:
-    qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
-    rkr = flf.neti[0]
-    (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
-    znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
-    t = tybo.tybo(znacngu)
-    vs t:
-        bf.rkrpic('zna', ['zna', '-y', t[0]])
-    ryfr:
-        bf.rkrpic('zna', ['zna', qbpanzr])
-ryfr:
-    b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-
-pynff Fgng(shfr.Fgng):
-    qrs __vavg__(frys):
-        frys.fg_zbqr = 0
-        frys.fg_vab = 0
-        frys.fg_qri = 0
-        frys.fg_ayvax = 0
-        frys.fg_hvq = 0
-        frys.fg_tvq = 0
-        frys.fg_fvmr = 0
-        frys.fg_ngvzr = 0
-        frys.fg_zgvzr = 0
-        frys.fg_pgvzr = 0
-        frys.fg_oybpxf = 0
-        frys.fg_oyxfvmr = 0
-        frys.fg_eqri = 0
-
-
-pnpur = {}
-qrs pnpur_trg(gbc, cngu):
-    cnegf = cngu.fcyvg('/')
-    pnpur[('',)] = gbc
-    p = Abar
-    znk = yra(cnegf)
-    #ybt('pnpur: %e\a' % pnpur.xrlf())
-    sbe v va enatr(znk):
-        cer = cnegf[:znk-v]
-        #ybt('pnpur gelvat: %e\a' % cer)
-        p = pnpur.trg(ghcyr(cer))
-        vs p:
-            erfg = cnegf[znk-v:]
-            sbe e va erfg:
-                #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
-                p = p.yerfbyir(e)
-                xrl = ghcyr(cer + [e])
-                #ybt('fnivat: %e\a' % (xrl,))
-                pnpur[xrl] = p
-            oernx
-    nffreg(p)
-    erghea p
-        
-    
-
-pynff OhcSf(shfr.Shfr):
-    qrs __vavg__(frys, gbc):
-        shfr.Shfr.__vavg__(frys)
-        frys.gbc = gbc
-    
-    qrs trgngge(frys, cngu):
-        ybt('--trgngge(%e)\a' % cngu)
-        gel:
-            abqr = pnpur_trg(frys.gbc, cngu)
-            fg = Fgng()
-            fg.fg_zbqr = abqr.zbqr
-            fg.fg_ayvax = abqr.ayvaxf()
-            fg.fg_fvmr = abqr.fvmr()
-            fg.fg_zgvzr = abqr.zgvzr
-            fg.fg_pgvzr = abqr.pgvzr
-            fg.fg_ngvzr = abqr.ngvzr
-            erghea fg
-        rkprcg isf.AbFhpuSvyr:
-            erghea -reeab.RABRAG
-
-    qrs ernqqve(frys, cngu, bssfrg):
-        ybt('--ernqqve(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        lvryq shfr.Qveragel('.')
-        lvryq shfr.Qveragel('..')
-        sbe fho va abqr.fhof():
-            lvryq shfr.Qveragel(fho.anzr)
-
-    qrs ernqyvax(frys, cngu):
-        ybt('--ernqyvax(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        erghea abqr.ernqyvax()
-
-    qrs bcra(frys, cngu, syntf):
-        ybt('--bcra(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
-        vs (syntf & nppzbqr) != bf.B_EQBAYL:
-            erghea -reeab.RNPPRF
-        abqr.bcra()
-
-    qrs eryrnfr(frys, cngu, syntf):
-        ybt('--eryrnfr(%e)\a' % cngu)
-
-    qrs ernq(frys, cngu, fvmr, bssfrg):
-        ybt('--ernq(%e)\a' % cngu)
-        a = pnpur_trg(frys.gbc, cngu)
-        b = a.bcra()
-        b.frrx(bssfrg)
-        erghea b.ernq(fvmr)
-
-
-vs abg unfngge(shfr, '__irefvba__'):
-    envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
-shfr.shfr_clguba_ncv = (0, 2)
-
-
-bcgfcrp = """
-ohc shfr [-q] [-s] <zbhagcbvag>
---
-q,qroht   vapernfr qroht yriry
-s,sbertebhaq  eha va sbertebhaq
-"""
-b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-s = OhcSf(gbc)
-s.shfr_netf.zbhagcbvag = rkgen[0]
-vs bcg.qroht:
-    s.shfr_netf.nqq('qroht')
-vs bcg.sbertebhaq:
-    s.shfr_netf.frgzbq('sbertebhaq')
-cevag s.zhygvguernqrq
-s.zhygvguernqrq = Snyfr
-
-s.znva()
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-
-vs bcg.erzbgr:
-    tvg.vavg_ercb()  # ybpny ercb
-    tvg.purpx_ercb_be_qvr()
-    pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
-    pyv.pybfr()
-ryfr:
-    tvg.vavg_ercb()
-#!/hfe/ova/rai clguba
-vzcbeg flf, zngu, fgehpg, tybo
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-CNTR_FVMR=4096
-FUN_CRE_CNTR=CNTR_FVMR/200.
-
-
-qrs zretr(vqkyvfg, ovgf, gnoyr):
-    pbhag = 0
-    sbe r va tvg.vqkzretr(vqkyvfg):
-        pbhag += 1
-        cersvk = tvg.rkgenpg_ovgf(r, ovgf)
-        gnoyr[cersvk] = pbhag
-        lvryq r
-
-
-qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
-    vs abg bhgsvyranzr:
-        nffreg(bhgqve)
-        fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
-        bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
-    
-    vac = []
-    gbgny = 0
-    sbe anzr va vasvyranzrf:
-        vk = tvg.CnpxVqk(anzr)
-        vac.nccraq(vk)
-        gbgny += yra(vk)
-
-    ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
-    vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
-       be (bcg.sbepr naq abg gbgny):
-        ybt('zvqk: abguvat gb qb.\a')
-        erghea
-
-    cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
-    ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
-    ragevrf = 2**ovgf
-    ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
-    
-    gnoyr = [0]*ragevrf
-
-    gel:
-        bf.hayvax(bhgsvyranzr)
-    rkprcg BFReebe:
-        cnff
-    s = bcra(bhgsvyranzr + '.gzc', 'j+')
-    s.jevgr('ZVQK\0\0\0\2')
-    s.jevgr(fgehpg.cnpx('!V', ovgf))
-    nffreg(s.gryy() == 12)
-    s.jevgr('\0'*4*ragevrf)
-    
-    sbe r va zretr(vac, ovgf, gnoyr):
-        s.jevgr(r)
-        
-    s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
-
-    s.frrx(12)
-    s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
-    s.pybfr()
-    bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
-
-    # guvf vf whfg sbe grfgvat
-    vs 0:
-        c = tvg.CnpxZvqk(bhgsvyranzr)
-        nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
-        cevag c.vqkanzrf
-        nffreg(yra(c) == gbgny)
-        cv = vgre(c)
-        sbe v va zretr(vac, gbgny, ovgf, gnoyr):
-            nffreg(v == cv.arkg())
-            nffreg(c.rkvfgf(v))
-
-    cevag bhgsvyranzr
-
-bcgfcrp = """
-ohc zvqk [bcgvbaf...] <vqkanzrf...>
---
-b,bhgchg=  bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
-n,nhgb     nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
-s,sbepr    nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen naq (bcg.nhgb be bcg.sbepr):
-    b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
-
-tvg.purpx_ercb_be_qvr()
-
-vs rkgen:
-    qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
-ryvs bcg.nhgb be bcg.sbepr:
-    cnguf = [tvg.ercb('bowrpgf/cnpx')]
-    cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
-    sbe cngu va cnguf:
-        ybt('zvqk: fpnaavat %f\a' % cngu)
-        vs bcg.sbepr:
-            qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
-        ryvs bcg.nhgb:
-            z = tvg.CnpxVqkYvfg(cngu)
-            arrqrq = {}
-            sbe cnpx va z.cnpxf:  # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
-                vs cnpx.anzr.raqfjvgu('.vqk'):
-                    arrqrq[cnpx.anzr] = 1
-            qry z
-            qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
-        ybt('\a')
-ryfr:
-    b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, enaqbz
-sebz ohc vzcbeg bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs enaqoybpx(a):
-    y = []
-    sbe v va kenatr(a):
-        y.nccraq(pue(enaqbz.enaqenatr(0,256)))
-    erghea ''.wbva(y)
-
-
-bcgfcrp = """
-ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
---
-   JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
-a,ahz=   ahzore bs oybpxf gb qnzntr
-f,fvmr=  znkvzhz fvmr bs rnpu qnzntrq oybpx
-creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
-rdhny    fcernq qnzntr rirayl guebhtubhg gur svyr
-F,frrq=  enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
-"""
-b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg rkgen:
-    b.sngny('svyranzrf rkcrpgrq')
-
-vs bcg.frrq != Abar:
-    enaqbz.frrq(bcg.frrq)
-
-sbe anzr va rkgen:
-    ybt('Qnzntvat "%f"...\a' % anzr)
-    s = bcra(anzr, 'e+o')
-    fg = bf.sfgng(s.svyrab())
-    fvmr = fg.fg_fvmr
-    vs bcg.creprag be bcg.fvmr:
-        zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
-        zf2 = bcg.fvmr be fvmr
-        znkfvmr = zva(zf1, zf2)
-    ryfr:
-        znkfvmr = 1
-    puhaxf = bcg.ahz be 10
-    puhaxfvmr = fvmr/puhaxf
-    sbe e va enatr(puhaxf):
-        fm = enaqbz.enaqenatr(1, znkfvmr+1)
-        vs fm > fvmr:
-            fm = fvmr
-        vs bcg.rdhny:
-            bsf = e*puhaxfvmr
-        ryfr:
-            bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
-        ybt('  %6q olgrf ng %q\a' % (fm, bsf))
-        s.frrx(bsf)
-        s.jevgr(enaqoybpx(fm))
-    s.pybfr()
-#!/hfe/ova/rai clguba
-vzcbeg flf, fgehpg, zznc
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-fhfcraqrq_j = Abar
-
-
-qrs vavg_qve(pbaa, net):
-    tvg.vavg_ercb(net)
-    ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
-    pbaa.bx()
-
-
-qrs frg_qve(pbaa, net):
-    tvg.purpx_ercb_be_qvr(net)
-    ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
-    pbaa.bx()
-
-    
-qrs yvfg_vaqrkrf(pbaa, whax):
-    tvg.purpx_ercb_be_qvr()
-    sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
-        vs s.raqfjvgu('.vqk'):
-            pbaa.jevgr('%f\a' % s)
-    pbaa.bx()
-
-
-qrs fraq_vaqrk(pbaa, anzr):
-    tvg.purpx_ercb_be_qvr()
-    nffreg(anzr.svaq('/') < 0)
-    nffreg(anzr.raqfjvgu('.vqk'))
-    vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
-    pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
-    pbaa.jevgr(vqk.znc)
-    pbaa.bx()
-
-
-qrs erprvir_bowrpgf(pbaa, whax):
-    tybony fhfcraqrq_j
-    tvg.purpx_ercb_be_qvr()
-    fhttrfgrq = {}
-    vs fhfcraqrq_j:
-        j = fhfcraqrq_j
-        fhfcraqrq_j = Abar
-    ryfr:
-        j = tvg.CnpxJevgre()
-    juvyr 1:
-        af = pbaa.ernq(4)
-        vs abg af:
-            j.nobeg()
-            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
-        a = fgehpg.hacnpx('!V', af)[0]
-        #ybt('rkcrpgvat %q olgrf\a' % a)
-        vs abg a:
-            ybt('ohc freire: erprvirq %q bowrpg%f.\a' 
-                % (j.pbhag, j.pbhag!=1 naq "f" be ''))
-            shyycngu = j.pybfr()
-            vs shyycngu:
-                (qve, anzr) = bf.cngu.fcyvg(shyycngu)
-                pbaa.jevgr('%f.vqk\a' % anzr)
-            pbaa.bx()
-            erghea
-        ryvs a == 0kssssssss:
-            ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
-            fhfcraqrq_j = j
-            pbaa.bx()
-            erghea
-            
-        ohs = pbaa.ernq(a)  # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
-        #ybt('ernq %q olgrf\a' % a)
-        vs yra(ohs) < a:
-            j.nobeg()
-            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
-                            % (a, yra(ohs)))
-        (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
-        fun = tvg.pnyp_unfu(glcr, pbagrag)
-        byqcnpx = j.rkvfgf(fun)
-        # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
-        # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
-        # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
-        # ba gur freire fvqr.
-        vs abg fhttrfgrq naq \
-          byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
-            # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
-            # ng guvf ynlre.  Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
-            # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
-            # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
-            # znxr gur svyrf ovttre.  Guvf zrgubq vf pregnvayl abg irel
-            # rssvpvrag.
-            j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
-            byqcnpx = j.bowpnpur.rkvfgf(fun)
-            ybt('arj fhttrfgvba: %e\a' % byqcnpx)
-            nffreg(byqcnpx)
-            nffreg(byqcnpx != Gehr)
-            nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
-            j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
-        vs abg fhttrfgrq naq byqcnpx:
-            nffreg(byqcnpx.raqfjvgu('.vqk'))
-            (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
-            vs abg (anzr va fhttrfgrq):
-                ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
-                pbaa.jevgr('vaqrk %f\a' % anzr)
-                fhttrfgrq[anzr] = 1
-        ryfr:
-            j._enj_jevgr([ohs])
-    # ABGERNPURQ
-
-
-qrs ernq_ers(pbaa, ersanzr):
-    tvg.purpx_ercb_be_qvr()
-    e = tvg.ernq_ers(ersanzr)
-    pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
-    pbaa.bx()
-
-
-qrs hcqngr_ers(pbaa, ersanzr):
-    tvg.purpx_ercb_be_qvr()
-    arjiny = pbaa.ernqyvar().fgevc()
-    byqiny = pbaa.ernqyvar().fgevc()
-    tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
-    pbaa.bx()
-
-
-qrs png(pbaa, vq):
-    tvg.purpx_ercb_be_qvr()
-    gel:
-        sbe oybo va tvg.png(vq):
-            pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
-            pbaa.jevgr(oybo)
-    rkprcg XrlReebe, r:
-        ybt('freire: reebe: %f\a' % r)
-        pbaa.jevgr('\0\0\0\0')
-        pbaa.reebe(r)
-    ryfr:
-        pbaa.jevgr('\0\0\0\0')
-        pbaa.bx()
-
-
-bcgfcrp = """
-ohc freire
-"""
-b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-ybt('ohc freire: ernqvat sebz fgqva.\a')
-
-pbzznaqf = {
-    'vavg-qve': vavg_qve,
-    'frg-qve': frg_qve,
-    'yvfg-vaqrkrf': yvfg_vaqrkrf,
-    'fraq-vaqrk': fraq_vaqrk,
-    'erprvir-bowrpgf': erprvir_bowrpgf,
-    'ernq-ers': ernq_ers,
-    'hcqngr-ers': hcqngr_ers,
-    'png': png,
-}
-
-# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
-# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
-pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
-ye = yvarernqre(pbaa)
-sbe _yvar va ye:
-    yvar = _yvar.fgevc()
-    vs abg yvar:
-        pbagvahr
-    ybt('ohc freire: pbzznaq: %e\a' % yvar)
-    jbeqf = yvar.fcyvg(' ', 1)
-    pzq = jbeqf[0]
-    erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
-    vs pzq == 'dhvg':
-        oernx
-    ryfr:
-        pzq = pbzznaqf.trg(pzq)
-        vs pzq:
-            pzq(pbaa, erfg)
-        ryfr:
-            envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
-
-ybt('ohc freire: qbar\a')
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
-    rkgen = yvarernqre(flf.fgqva)
-
-erg = 0
-
-vs bcg.erzbgr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    png = pyv.png
-ryfr:
-    pc = tvg.PngCvcr()
-    png = pc.wbva
-
-sbe vq va rkgen:
-    gel:
-        sbe oybo va png(vq):
-            flf.fgqbhg.jevgr(oybo)
-    rkprcg XrlReebe, r:
-        flf.fgqbhg.syhfu()
-        ybt('reebe: %f\a' % r)
-        erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, reeab, fgng, gvzr, zngu
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc fnir [-gp] [-a anzr] <svyranzrf...>
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-g,gerr     bhgchg n gerr vq
-p,pbzzvg   bhgchg n pbzzvg vq
-a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-d,dhvrg    qba'g fubj cebterff zrgre
-fznyyre=   bayl onpx hc svyrf fznyyre guna a olgrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
-    b.sngny("hfr bar be zber bs -g, -p, -a")
-vs abg rkgen:
-    b.sngny("ab svyranzrf tvira")
-
-bcg.cebterff = (vfggl naq abg bcg.dhvrg)
-bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
-    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.erzbgr be vf_erirefr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
-    j = pyv.arj_cnpxjevgre()
-ryfr:
-    pyv = Abar
-    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
-    j = tvg.CnpxJevgre()
-
-unaqyr_pgey_p()
-
-
-qrs rngfynfu(qve):
-    vs qve.raqfjvgu('/'):
-        erghea qve[:-1]
-    ryfr:
-        erghea qve
-
-
-cnegf = ['']
-funyvfgf = [[]]
-
-qrs _chfu(cneg):
-    nffreg(cneg)
-    cnegf.nccraq(cneg)
-    funyvfgf.nccraq([])
-
-qrs _cbc(sbepr_gerr):
-    nffreg(yra(cnegf) >= 1)
-    cneg = cnegf.cbc()
-    funyvfg = funyvfgf.cbc()
-    gerr = sbepr_gerr be j.arj_gerr(funyvfg)
-    vs funyvfgf:
-        funyvfgf[-1].nccraq(('40000', cneg, gerr))
-    ryfr:  # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
-        funyvfgf.nccraq(funyvfg)
-    erghea gerr
-
-ynfgerznva = Abar
-qrs cebterff_ercbeg(a):
-    tybony pbhag, fhopbhag, ynfgerznva
-    fhopbhag += a
-    pp = pbhag + fhopbhag
-    cpg = gbgny naq (pp*100.0/gbgny) be 0
-    abj = gvzr.gvzr()
-    ryncfrq = abj - gfgneg
-    xcf = ryncfrq naq vag(pp/1024./ryncfrq)
-    xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
-    xcf = vag(xcf/xcf_senp)*xcf_senp
-    vs pp:
-        erznva = ryncfrq*1.0/pp * (gbgny-pp)
-    ryfr:
-        erznva = 0.0
-    vs (ynfgerznva naq (erznva > ynfgerznva)
-          naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
-        erznva = ynfgerznva
-    ryfr:
-        ynfgerznva = erznva
-    ubhef = vag(erznva/60/60)
-    zvaf = vag(erznva/60 - ubhef*60)
-    frpf = vag(erznva - ubhef*60*60 - zvaf*60)
-    vs ryncfrq < 30:
-        erznvafge = ''
-        xcffge = ''
-    ryfr:
-        xcffge = '%qx/f' % xcf
-        vs ubhef:
-            erznvafge = '%qu%qz' % (ubhef, zvaf)
-        ryvs zvaf:
-            erznvafge = '%qz%q' % (zvaf, frpf)
-        ryfr:
-            erznvafge = '%qf' % frpf
-    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
-             % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
-                erznvafge, xcffge))
-
-
-e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
-
-qrs nyernql_fnirq(rag):
-    erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
-
-qrs jnagerphefr_cer(rag):
-    erghea abg nyernql_fnirq(rag)
-
-qrs jnagerphefr_qhevat(rag):
-    erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
-
-gbgny = sgbgny = 0
-vs bcg.cebterff:
-    sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
-        vs abg (sgbgny % 10024):
-            cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
-        rkvfgf = rag.rkvfgf()
-        unfuinyvq = nyernql_fnirq(rag)
-        rag.frg_fun_zvffvat(abg unfuinyvq)
-        vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
-            vs rkvfgf naq abg unfuinyvq:
-                gbgny += rag.fvmr
-        sgbgny += 1
-    cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
-    unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
-
-gfgneg = gvzr.gvzr()
-pbhag = fhopbhag = spbhag = 0
-ynfgfxvc_anzr = Abar
-ynfgqve = ''
-sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
-    (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
-    rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
-    unfuinyvq = nyernql_fnirq(rag)
-    jnfzvffvat = rag.fun_zvffvat()
-    byqfvmr = rag.fvmr
-    vs bcg.ireobfr:
-        vs abg rkvfgf:
-            fgnghf = 'Q'
-        ryvs abg unfuinyvq:
-            vs rag.fun == vaqrk.RZCGL_FUN:
-                fgnghf = 'N'
-            ryfr:
-                fgnghf = 'Z'
-        ryfr:
-            fgnghf = ' '
-        vs bcg.ireobfr >= 2:
-            ybt('%f %-70f\a' % (fgnghf, rag.anzr))
-        ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
-            vs abg ynfgqve.fgnegfjvgu(qve):
-                ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
-            ynfgqve = qve
-
-    vs bcg.cebterff:
-        cebterff_ercbeg(0)
-    spbhag += 1
-    
-    vs abg rkvfgf:
-        pbagvahr
-    vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
-        vs rkvfgf naq abg unfuinyvq:
-            nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
-            ynfgfxvc_anzr = rag.anzr
-        pbagvahr
-
-    nffreg(qve.fgnegfjvgu('/'))
-    qvec = qve.fcyvg('/')
-    juvyr cnegf > qvec:
-        _cbc(sbepr_gerr = Abar)
-    vs qve != '/':
-        sbe cneg va qvec[yra(cnegf):]:
-            _chfu(cneg)
-
-    vs abg svyr:
-        # ab svyranzr cbegvba zrnaf guvf vf n fhoqve.  Ohg
-        # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
-        byqgerr = nyernql_fnirq(rag) # znl or Abar
-        arjgerr = _cbc(sbepr_gerr = byqgerr)
-        vs abg byqgerr:
-            vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
-                rag.vainyvqngr()
-            ryfr:
-                rag.inyvqngr(040000, arjgerr)
-            rag.ercnpx()
-        vs rkvfgf naq jnfzvffvat:
-            pbhag += byqfvmr
-        pbagvahr
-
-    # vg'f abg n qverpgbel
-    vq = Abar
-    vs unfuinyvq:
-        zbqr = '%b' % rag.tvgzbqr
-        vq = rag.fun
-        funyvfgf[-1].nccraq((zbqr, 
-                             tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
-                             vq))
-    ryfr:
-        vs fgng.F_VFERT(rag.zbqr):
-            gel:
-                s = unfufcyvg.bcra_abngvzr(rag.anzr)
-            rkprcg VBReebe, r:
-                nqq_reebe(r)
-                ynfgfxvc_anzr = rag.anzr
-            rkprcg BFReebe, r:
-                nqq_reebe(r)
-                ynfgfxvc_anzr = rag.anzr
-            ryfr:
-                (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
-        ryfr:
-            vs fgng.F_VFQVE(rag.zbqr):
-                nffreg(0)  # unaqyrq nobir
-            ryvs fgng.F_VFYAX(rag.zbqr):
-                gel:
-                    ey = bf.ernqyvax(rag.anzr)
-                rkprcg BFReebe, r:
-                    nqq_reebe(r)
-                    ynfgfxvc_anzr = rag.anzr
-                rkprcg VBReebe, r:
-                    nqq_reebe(r)
-                    ynfgfxvc_anzr = rag.anzr
-                ryfr:
-                    (zbqr, vq) = ('120000', j.arj_oybo(ey))
-            ryfr:
-                nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
-                ynfgfxvc_anzr = rag.anzr
-        vs vq:
-            rag.inyvqngr(vag(zbqr, 8), vq)
-            rag.ercnpx()
-            funyvfgf[-1].nccraq((zbqr,
-                                 tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
-                                 vq))
-    vs rkvfgf naq jnfzvffvat:
-        pbhag += byqfvmr
-        fhopbhag = 0
-
-
-vs bcg.cebterff:
-    cpg = gbgny naq pbhag*100.0/gbgny be 100
-    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar.    \a'
-             % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
-
-juvyr yra(cnegf) > 1:
-    _cbc(sbepr_gerr = Abar)
-nffreg(yra(funyvfgf) == 1)
-gerr = j.arj_gerr(funyvfgf[-1])
-vs bcg.gerr:
-    cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
-    zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
-    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
-    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
-    vs bcg.pbzzvg:
-        cevag pbzzvg.rapbqr('urk')
-
-j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
-        
-vs bcg.anzr:
-    vs pyv:
-        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
-    ryfr:
-        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
-    pyv.pybfr()
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc gvpx
-"""
-b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-g = gvzr.gvzr()
-gyrsg = 1 - (g - vag(g))
-gvzr.fyrrc(gyrsg)
-#!/hfe/ova/rai clguba
-vzcbeg bf, flf, fgng, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
-sebz ohc.urycref vzcbeg *
-
-
-qrs zretr_vaqrkrf(bhg, e1, e2):
-    sbe r va vaqrk.ZretrVgre([e1, e2]):
-        # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl?  Jura?
-        bhg.nqq_vkragel(r)
-
-
-pynff VgreUrycre:
-    qrs __vavg__(frys, y):
-        frys.v = vgre(y)
-        frys.phe = Abar
-        frys.arkg()
-
-    qrs arkg(frys):
-        gel:
-            frys.phe = frys.v.arkg()
-        rkprcg FgbcVgrengvba:
-            frys.phe = Abar
-        erghea frys.phe
-
-
-qrs purpx_vaqrk(ernqre):
-    gel:
-        ybt('purpx: purpxvat sbejneq vgrengvba...\a')
-        r = Abar
-        q = {}
-        sbe r va ernqre.sbejneq_vgre():
-            vs r.puvyqera_a:
-                vs bcg.ireobfr:
-                    ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
-                                            r.anzr))
-                nffreg(r.puvyqera_bsf)
-                nffreg(r.anzr.raqfjvgu('/'))
-                nffreg(abg q.trg(r.puvyqera_bsf))
-                q[r.puvyqera_bsf] = 1
-            vs r.syntf & vaqrk.VK_UNFUINYVQ:
-                nffreg(r.fun != vaqrk.RZCGL_FUN)
-                nffreg(r.tvgzbqr)
-        nffreg(abg r be r.anzr == '/')  # ynfg ragel vf *nyjnlf* /
-        ybt('purpx: purpxvat abezny vgrengvba...\a')
-        ynfg = Abar
-        sbe r va ernqre:
-            vs ynfg:
-                nffreg(ynfg > r.anzr)
-            ynfg = r.anzr
-    rkprcg:
-        ybt('vaqrk reebe! ng %e\a' % r)
-        envfr
-    ybt('purpx: cnffrq.\a')
-
-
-qrs hcqngr_vaqrk(gbc):
-    ev = vaqrk.Ernqre(vaqrksvyr)
-    jv = vaqrk.Jevgre(vaqrksvyr)
-    evt = VgreUrycre(ev.vgre(anzr=gbc))
-    gfgneg = vag(gvzr.gvzr())
-
-    unfutra = Abar
-    vs bcg.snxr_inyvq:
-        qrs unfutra(anzr):
-            erghea (0100644, vaqrk.SNXR_FUN)
-
-    gbgny = 0
-    sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
-        vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
-            flf.fgqbhg.jevgr('%f\a' % cngu)
-            flf.fgqbhg.syhfu()
-            cebterff('Vaqrkvat: %q\e' % gbgny)
-        ryvs abg (gbgny % 128):
-            cebterff('Vaqrkvat: %q\e' % gbgny)
-        gbgny += 1
-        juvyr evt.phe naq evt.phe.anzr > cngu:  # qryrgrq cnguf
-            vs evt.phe.rkvfgf():
-                evt.phe.frg_qryrgrq()
-                evt.phe.ercnpx()
-            evt.arkg()
-        vs evt.phe naq evt.phe.anzr == cngu:    # cnguf gung nyernql rkvfgrq
-            vs cfg:
-                evt.phe.sebz_fgng(cfg, gfgneg)
-            vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
-                vs unfutra:
-                    (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
-                    evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
-            vs bcg.snxr_vainyvq:
-                evt.phe.vainyvqngr()
-            evt.phe.ercnpx()
-            evt.arkg()
-        ryfr:  # arj cnguf
-            jv.nqq(cngu, cfg, unfutra = unfutra)
-    cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
-    
-    vs ev.rkvfgf():
-        ev.fnir()
-        jv.syhfu()
-        vs jv.pbhag:
-            je = jv.arj_ernqre()
-            vs bcg.purpx:
-                ybt('purpx: orsber zretvat: byqsvyr\a')
-                purpx_vaqrk(ev)
-                ybt('purpx: orsber zretvat: arjsvyr\a')
-                purpx_vaqrk(je)
-            zv = vaqrk.Jevgre(vaqrksvyr)
-            zretr_vaqrkrf(zv, ev, je)
-            ev.pybfr()
-            zv.pybfr()
-            je.pybfr()
-        jv.nobeg()
-    ryfr:
-        jv.pybfr()
-
-
-bcgfcrp = """
-ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
---
-c,cevag    cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
-z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
-f,fgnghf   cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
-U,unfu     cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
-y,ybat     cevag zber vasbezngvba nobhg rnpu svyr
-h,hcqngr   (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
-k,kqri,bar-svyr-flfgrz  qba'g pebff svyrflfgrz obhaqnevrf
-snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
-snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
-purpx      pnershyyl purpx vaqrk svyr vagrtevgl
-s,vaqrksvyr=  gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-"""
-b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
-    b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
-vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
-    b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
-vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
-    b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
-
-tvg.purpx_ercb_be_qvr()
-vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
-
-unaqyr_pgey_p()
-
-vs bcg.purpx:
-    ybt('purpx: fgnegvat vavgvny purpx.\a')
-    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-cnguf = vaqrk.erqhpr_cnguf(rkgen)
-
-vs bcg.hcqngr:
-    vs abg cnguf:
-        b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
-    sbe (ec,cngu) va cnguf:
-        hcqngr_vaqrk(ec)
-
-vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
-    sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
-        vs (bcg.zbqvsvrq 
-            naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
-            pbagvahr
-        yvar = ''
-        vs bcg.fgnghf:
-            vs rag.vf_qryrgrq():
-                yvar += 'Q '
-            ryvs abg rag.vf_inyvq():
-                vs rag.fun == vaqrk.RZCGL_FUN:
-                    yvar += 'N '
-                ryfr:
-                    yvar += 'Z '
-            ryfr:
-                yvar += '  '
-        vs bcg.unfu:
-            yvar += rag.fun.rapbqr('urk') + ' '
-        vs bcg.ybat:
-            yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
-        cevag yvar + (anzr be './')
-
-vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
-    ybt('purpx: fgnegvat svany purpx.\a')
-    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg
-sebz ohc vzcbeg bcgvbaf, urycref
-
-bcgfcrp = """
-ohc eonpxhc-freire
---
-    Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-# trg gur fhopbzznaq'f neti.
-# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
-# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
-# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
-ohs = flf.fgqva.ernq(4)
-fm = fgehpg.hacnpx('!V', ohs)[0]
-nffreg(fm > 0)
-nffreg(fm < 1000000)
-ohs = flf.fgqva.ernq(fm)
-nffreg(yra(ohs) == fm)
-neti = ohs.fcyvg('\0')
-
-# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
-# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
-# gb zvfhfr gurz.  Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
-# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
-#
-# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
-# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
-# fbpxrg.  Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
-# bs vg, ohg cebonoyl qvqa'g.  Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
-# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
-#
-# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
-# qrfpevcgbef.  Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
-# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
-bf.qhc2(0, 3)
-bf.qhc2(1, 4)
-bf.qhc2(2, 1)
-sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
-bf.qhc2(sq, 0)
-bf.pybfr(sq)
-
-bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
-bf.rkrpic(neti[0], neti)
-flf.rkvg(99)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo, fhocebprff, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-cne2_bx = 0
-ahyys = bcra('/qri/ahyy')
-
-qrs qroht(f):
-    vs bcg.ireobfr:
-        ybt(f)
-
-qrs eha(neti):
-    # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
-    # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
-    # rkrpvat sbe fbzr ernfba.  Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
-    # svefg.
-    sq = bf.qhc(2)  # pbcl fgqree
-    gel:
-        c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
-        erghea c.jnvg()
-    svanyyl:
-        bf.pybfr(sq)
-
-qrs cne2_frghc():
-    tybony cne2_bx
-    ei = 1
-    gel:
-        c = fhocebprff.Cbcra(['cne2', '--uryc'],
-                             fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
-        ei = c.jnvg()
-    rkprcg BFReebe:
-        ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
-    ryfr:
-        cne2_bx = 1
-
-qrs cnei(yiy):
-    vs bcg.ireobfr >= yiy:
-        vs vfggl:
-            erghea []
-        ryfr:
-            erghea ['-d']
-    ryfr:
-        erghea ['-dd']
-
-qrs cne2_trarengr(onfr):
-    erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
-               + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
-
-qrs cne2_irevsl(onfr):
-    erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
-
-qrs cne2_ercnve(onfr):
-    erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
-
-qrs dhvpx_irevsl(onfr):
-    s = bcra(onfr + '.cnpx', 'eo')
-    s.frrx(-20, 2)
-    jnagfhz = s.ernq(20)
-    nffreg(yra(jnagfhz) == 20)
-    s.frrx(0)
-    fhz = Fun1()
-    sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
-        fhz.hcqngr(o)
-    vs fhz.qvtrfg() != jnagfhz:
-        envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
-                                                  fhz.urkqvtrfg()))
-        
-
-qrs tvg_irevsl(onfr):
-    vs bcg.dhvpx:
-        gel:
-            dhvpx_irevsl(onfr)
-        rkprcg Rkprcgvba, r:
-            qroht('reebe: %f\a' % r)
-            erghea 1
-        erghea 0
-    ryfr:
-        erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
-    
-    
-qrs qb_cnpx(onfr, ynfg):
-    pbqr = 0
-    vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
-        ierfhyg = cne2_irevsl(onfr)
-        vs ierfhyg != 0:
-            vs bcg.ercnve:
-                eerfhyg = cne2_ercnve(onfr)
-                vs eerfhyg != 0:
-                    cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
-                    pbqr = eerfhyg
-                ryfr:
-                    cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
-                    pbqr = 100
-            ryfr:
-                cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
-                pbqr = ierfhyg
-        ryfr:
-            cevag '%f bx' % ynfg
-    ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
-        terfhyg = tvg_irevsl(onfr)
-        vs terfhyg != 0:
-            cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
-            pbqr = terfhyg
-        ryfr:
-            vs cne2_bx naq bcg.trarengr:
-                cerfhyg = cne2_trarengr(onfr)
-                vs cerfhyg != 0:
-                    cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
-                    pbqr = cerfhyg
-                ryfr:
-                    cevag '%f bx' % ynfg
-            ryfr:
-                cevag '%f bx' % ynfg
-    ryfr:
-        nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
-        qroht('    fxvccrq: cne2 svyr nyernql trarengrq.\a')
-    erghea pbqr
-
-
-bcgfcrp = """
-ohc sfpx [bcgvbaf...] [svyranzrf...]
---
-e,ercnve    nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
-t,trarengr  trarengr nhgb-ercnve vasbezngvba hfvat cne2
-i,ireobfr   vapernfr ireobfvgl (pna or hfrq zber guna bapr)
-dhvpx       whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
-w,wbof=     eha 'a' wbof va cnenyyry
-cne2-bx     vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
-qvfnoyr-cne2  vtaber cne2 rira vs vg vf ninvynoyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-cne2_frghc()
-vs bcg.cne2_bx:
-    vs cne2_bx:
-        flf.rkvg(0)  # 'gehr' va fu
-    ryfr:
-        flf.rkvg(1)
-vs bcg.qvfnoyr_cne2:
-    cne2_bx = 0
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
-    qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
-    rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
-
-pbqr = 0
-pbhag = 0
-bhgfgnaqvat = {}
-sbe anzr va rkgen:
-    vs anzr.raqfjvgu('.cnpx'):
-        onfr = anzr[:-5]
-    ryvs anzr.raqfjvgu('.vqk'):
-        onfr = anzr[:-4]
-    ryvs anzr.raqfjvgu('.cne2'):
-        onfr = anzr[:-5]
-    ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
-        onfr = anzr
-    ryfr:
-        envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
-    (qve,ynfg) = bf.cngu.fcyvg(onfr)
-    cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
-    vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
-        cne2_rkvfgf = 0
-    flf.fgqbhg.syhfu()
-    qroht('sfpx: purpxvat %f (%f)\a' 
-          % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
-    vs abg bcg.ireobfr:
-        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-    
-    vs abg bcg.wbof:
-        ap = qb_cnpx(onfr, ynfg)
-        pbqr = pbqr be ap
-        pbhag += 1
-    ryfr:
-        juvyr yra(bhgfgnaqvat) >= bcg.wbof:
-            (cvq,ap) = bf.jnvg()
-            ap >>= 8
-            vs cvq va bhgfgnaqvat:
-                qry bhgfgnaqvat[cvq]
-                pbqr = pbqr be ap
-                pbhag += 1
-        cvq = bf.sbex()
-        vs cvq:  # cnerag
-            bhgfgnaqvat[cvq] = 1
-        ryfr: # puvyq
-            gel:
-                flf.rkvg(qb_cnpx(onfr, ynfg))
-            rkprcg Rkprcgvba, r:
-                ybt('rkprcgvba: %e\a' % r)
-                flf.rkvg(99)
-                
-juvyr yra(bhgfgnaqvat):
-    (cvq,ap) = bf.jnvg()
-    ap >>= 8
-    vs cvq va bhgfgnaqvat:
-        qry bhgfgnaqvat[cvq]
-        pbqr = pbqr be ap
-        pbhag += 1
-    vs abg bcg.ireobfr:
-        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
-vs abg bcg.ireobfr naq vfggl:
-    ybt('sfpx qbar.           \a')
-flf.rkvg(pbqr)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
-sebz ohc vzcbeg bcgvbaf, ffu
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc eonpxhc <ubfganzr> vaqrk ...
-ohc eonpxhc <ubfganzr> fnir ...
-ohc eonpxhc <ubfganzr> fcyvg ...
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs yra(rkgen) < 2:
-    b.sngny('nethzragf rkcrpgrq')
-
-pynff FvtRkprcgvba(Rkprcgvba):
-    qrs __vavg__(frys, fvtahz):
-        frys.fvtahz = fvtahz
-        Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
-qrs unaqyre(fvtahz, senzr):
-    envfr FvtRkprcgvba(fvtahz)
-
-fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
-fvtany.fvtany(fvtany.FVTVAG, unaqyre)
-
-fc = Abar
-c = Abar
-erg = 99
-
-gel:
-    ubfganzr = rkgen[0]
-    neti = rkgen[1:]
-    c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
-
-    netif = '\0'.wbva(['ohc'] + neti)
-    c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
-    c.fgqva.syhfu()
-
-    znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
-    fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
-
-    c.fgqva.pybfr()
-    c.fgqbhg.pybfr()
-
-svanyyl:
-    juvyr 1:
-        # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
-        # va pnfr bhe puvyq qbrfa'g qvr.
-        gel:
-            erg = c.jnvg()
-            fc.jnvg()
-            oernx
-        rkprcg FvtRkprcgvba, r:
-            ybt('\aohc eonpxhc: %f\a' % r)
-            bf.xvyy(c.cvq, r.fvtahz)
-            erg = 84
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc arjyvare
-"""
-b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-e = er.pbzcvyr(e'([\e\a])')
-ynfgyra = 0
-nyy = ''
-juvyr 1:
-    y = e.fcyvg(nyy, 1)
-    vs yra(y) <= 1:
-        gel:
-            o = bf.ernq(flf.fgqva.svyrab(), 4096)
-        rkprcg XrlobneqVagreehcg:
-            oernx
-        vs abg o:
-            oernx
-        nyy += o
-    ryfr:
-        nffreg(yra(y) == 3)
-        (yvar, fcyvgpune, nyy) = y
-        #fcyvgpune = '\a'
-        flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
-        vs fcyvgpune == '\e':
-            ynfgyra = yra(yvar)
-        ryfr:
-            ynfgyra = 0
-        flf.fgqbhg.syhfu()
-
-vs ynfgyra be nyy:
-    flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
-#!/hfe/ova/rai clguba
-vzcbeg flf
-sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc znetva
-"""
-b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-#tvg.vtaber_zvqk = 1
-
-zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-ynfg = '\0'*20
-ybatzngpu = 0
-sbe v va zv:
-    vs v == ynfg:
-        pbagvahr
-    #nffreg(fge(v) >= ynfg)
-    cz = _unfufcyvg.ovgzngpu(ynfg, v)
-    ybatzngpu = znk(ybatzngpu, cz)
-    ynfg = v
-cevag ybatzngpu
diff --git a/t/sampledata/y/text b/t/sampledata/y/text
deleted file mode 100644 (file)
index d3c6dec..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-this is a text file.
-
-See me be texty!
diff --git a/t/sparse-test-data b/t/sparse-test-data
deleted file mode 100755 (executable)
index 096d042..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/../dev/bup-python" || exit $?
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-
-from __future__ import absolute_import, print_function
-from random import randint
-from sys import stderr, stdout
-import os, sys
-
-sys.path[:0] = [os.path.dirname(os.path.realpath(__file__)) + '/../lib']
-
-from bup.io import byte_stream
-
-def smaller_region(max_offset):
-    start = randint(0, max_offset)
-    return (start, min(max_offset, randint(start + 1, start + 5)))
-
-
-def possibly_larger_region(max_offset, min_sparse_len):
-    start = randint(0, max_offset)
-    return (start, min(max_offset, randint(start + 1,
-                                           start + 3 * min_sparse_len)))
-
-
-def initial_region(max_offset, min_sparse_len):
-    start = 0
-    return (start, min(max_offset, randint(start + 1,
-                                           start + 3 * min_sparse_len)))
-
-
-def final_region(max_offset, min_sparse_len):
-    start = max(0, randint(max_offset - 3 * min_sparse_len,
-                           max_offset - 1))
-    return (start, max_offset)
-
-
-def region_around_min_len(max_offset, min_sparse_len):
-    start = randint(0, max_offset)
-    return (start, min(max_offset, randint(start + min_sparse_len - 5,
-                                           start + min_sparse_len + 5)))
-
-
-generators = []
-
-def random_region():
-    global generators
-    return generators[randint(0, len(generators) - 1)]()
-
-if len(sys.argv) == 0:
-    stdout.flush()
-    out = byte_stream(stdout)
-if len(sys.argv) == 2:
-    out = open(sys.argv[1], 'wb')
-else:
-    print('Usage: sparse-test-data [FILE]', file=stderr)
-    sys.exit(2)
-
-bup_read_size = 2 ** 16
-bup_min_sparse_len = 512
-out_size = randint(0, bup_read_size * 10)
-
-generators = (lambda : smaller_region(out_size),
-              lambda : possibly_larger_region(out_size, bup_min_sparse_len),
-              lambda : initial_region(out_size, bup_min_sparse_len),
-              lambda : final_region(out_size, bup_min_sparse_len),
-              lambda : region_around_min_len(out_size, bup_min_sparse_len))
-
-sparse = []
-sparse.append(random_region())
-sparse.append(random_region())
-
-# Handle overlaps
-if sparse[1][0] < sparse[0][0]:
-    sparse[0], sparse[1] = sparse[1], sparse[0]
-
-sparse_offsets = []
-sparse_offsets.append(sparse[0][0])
-if sparse[1][0] <= sparse[0][1]:
-    sparse_offsets.append(max(sparse[0][1], sparse[1][1]))
-else:
-    sparse_offsets.extend((sparse[0][1], sparse[1][0], sparse[1][1]))
-
-if sparse[1][1] != out_size:
-    sparse_offsets.append(out_size)
-
-# Now sparse_offsets indicates where to start/stop zero runs
-data = b'x'
-pos = 0
-print('offsets:', sparse_offsets, file=stderr)
-for offset in sparse_offsets:
-    count = offset - pos
-    print('write:', 'x' if data == 'x' else '0', count, file=stderr)
-    out.write(data * (offset - pos))
-    pos += count
-    data = b'\0' if data == b'x' else b'x'
-
-out.close()
diff --git a/t/subtree-hash b/t/subtree-hash
deleted file mode 100755 (executable)
index 1077393..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/../dev/bup-python" || exit $?
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-# end of bup preamble
-
-from __future__ import absolute_import, print_function
-import os.path, sys
-
-sys.path[:0] = [os.path.dirname(os.path.realpath(__file__)) + '/../lib']
-
-from bup.compat import argv_bytes
-from bup.helpers import handle_ctrl_c, readpipe
-from bup.io import byte_stream
-from bup import options
-
-
-optspec = """
-subtree-hash ROOT_HASH [PATH_ITEM...]
---
-"""
-
-handle_ctrl_c()
-
-o = options.Options(optspec)
-(opt, flags, extra) = o.parse(sys.argv[1:])
-
-if len(extra) < 1:
-    o.fatal('must specify a root hash')
-
-tree_hash = argv_bytes(extra[0])
-path = [argv_bytes(x) for x in extra[1:]]
-
-while path:
-    target_name = path[0]
-    subtree_items = readpipe([b'git', b'ls-tree', b'-z', tree_hash])
-    target_hash = None
-    for entry in subtree_items.split(b'\0'):
-        if not entry:
-            break
-        info, name = entry.split(b'\t', 1)
-        if name == target_name:
-            _, _, target_hash = info.split(b' ')
-            break
-    if not target_hash:
-        print("Can't find %r in %s" % (target_name, tree_hash.decode('ascii')),
-              file=sys.stderr)
-        break
-    tree_hash = target_hash
-    path = path[1:]
-
-if path:
-    sys.exit(1)
-
-sys.stdout.flush()
-out = byte_stream(sys.stdout)
-out.write(tree_hash + b'\n')
diff --git a/t/sync-tree b/t/sync-tree
deleted file mode 100755 (executable)
index 11d4abe..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/usr/bin/env bash
-
-set -u
-
-usage() {
-cat <<EOF
-Usage: sync-tree [-h] [-c] [-x] SOURCE/ DEST/
-  Make the DEST tree match SOURCE as closely as possible
-OPTIONS:
-  -h
-    Display help
-EOF
-}
-
-while getopts "h" OPTION
-do
-    case "$OPTION" in
-        h) usage; exit 0;;
-        ?) usage 1>&2; exit 1;;
-    esac
-done
-
-shift $(($OPTIND - 1)) || exit $?
-
-if ! test $# -eq 2
-then
-    usage 1>&2
-    exit 1
-fi
-
-src="$1"
-dest="$2"
-
-rsync_opts="-aH --delete"
-
-rsync_version=$(rsync --version)
-if [[ ! "$rsync_version" =~ "ACLs" ]] || [[ "$rsync_version" =~ "no ACLs" ]]; then
-    echo "Not syncing ACLs (not supported by available rsync)" 1>&2
-else
-    case $OSTYPE in
-        cygwin|darwin|netbsd)
-            echo "Not syncing ACLs (not yet supported on $OSTYPE)" 1>&2
-            ;;
-        *)
-            rsync_opts="$rsync_opts -A"
-            ;;
-    esac
-fi
-
-xattrs_available=''
-if [[ ! "$rsync_version" =~ "xattrs" ]] || [[ "$rsync_version" =~ "no xattrs" ]]; then
-    echo "Not syncing xattrs (not supported by available rsync)" 1>&2
-else
-    xattrs_available=yes
-fi
-
-
-# rsync may fail if -X is specified and the filesystems don't support
-# xattrs.
-
-if test "$xattrs_available"; then
-    rsync $rsync_opts -X "$src" "$dest"
-    if test $? -ne 0; then
-        # Try again without -X
-        exec rsync $rsync_opts "$src" "$dest"
-    fi
-else
-    exec rsync $rsync_opts "$src" "$dest"
-fi
diff --git a/t/test-argv b/t/test-argv
deleted file mode 100755 (executable)
index 818619f..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/../config/bin/python" || exit $?
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-# end of bup preamble
-
-from __future__ import absolute_import, print_function
-
-from os.path import abspath, dirname
-from random import randint
-from subprocess import check_output
-from sys import stderr, stdout
-import sys
-
-script_home = abspath(dirname(__file__))
-sys.path[:0] = [abspath(script_home + '/../lib'), abspath(script_home + '/..')]
-
-from wvtest import wvcheck, wvfail, wvmsg, wvpass, wvpasseq, wvpassne, wvstart
-
-wvstart('command line arguments are not mangled')
-
-def rand_bytes(n):
-    return bytes([randint(1, 255) for x in range(n)])
-
-for trial in range(100):
-    cmd = [b't/echo-argv-bytes', rand_bytes(randint(1, 32))]
-    out = check_output(cmd)
-    wvpasseq(b'\0\n'.join(cmd) + b'\0\n', out)
diff --git a/t/test-cat-file.sh b/t/test-cat-file.sh
deleted file mode 100755 (executable)
index ec8610c..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS bup init
-WVPASS cd "$tmpdir"
-
-WVSTART "cat-file"
-WVPASS mkdir src
-WVPASS date > src/foo
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS bup cat-file "src/latest/$(pwd)/src/foo" > cat-foo
-WVPASS diff -u src/foo cat-foo
-
-WVSTART "cat-file --meta"
-WVPASS bup meta --create --no-paths src/foo > src-foo.meta
-WVPASS bup cat-file --meta "src/latest/$(pwd)/src/foo" > cat-foo.meta
-
-WVPASS bup meta -tvvf src-foo.meta | WVPASS grep -vE '^atime: ' > src-foo.list
-WVPASS bup meta -tvvf cat-foo.meta | WVPASS grep -vE '^atime: ' > cat-foo.list
-WVPASS diff -u src-foo.list cat-foo.list
-
-WVSTART "cat-file --bupm"
-WVPASS bup cat-file --bupm "src/latest/$(pwd)/src/" > bup-cat-bupm
-src_hash=$(WVPASS bup ls -s "src/latest/$(pwd)" | cut -d' ' -f 1) || exit $?
-bupm_hash=$(WVPASS git ls-tree "$src_hash" | grep -F .bupm | cut -d' ' -f 3) \
-    || exit $?
-bupm_hash=$(WVPASS echo "$bupm_hash" | cut -d' ' -f 1) || exit $?
-WVPASS "$top/t/git-cat-tree" "$bupm_hash" > git-cat-bupm
-if ! cmp git-cat-bupm bup-cat-bupm; then
-    cmp -l git-cat-bupm bup-cat-bupm
-    diff -uN <(bup meta -tvvf git-cat-bupm) <(bup meta -tvvf bup-cat-bupm)
-    WVPASS cmp git-cat-bupm bup-cat-bupm
-fi
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-command-without-init-fails.sh b/t/test-command-without-init-fails.sh
deleted file mode 100755 (executable)
index 32efe2c..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-
-set -o pipefail
-
-WVSTART 'all'
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS mkdir "$tmpdir/foo"
-
-bup index "$tmpdir/foo" &> /dev/null
-index_rc=$?
-WVPASSEQ "$index_rc" "15"
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-compression.sh b/t/test-compression.sh
deleted file mode 100755 (executable)
index b887f06..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-fs-size() { tar cf - "$@" | wc -c; }
-
-WVSTART "compression"
-WVPASS cd "$tmpdir"
-
-D=compression0.tmp
-WVPASS force-delete "$BUP_DIR"
-WVPASS bup init
-WVPASS mkdir $D
-WVPASS bup index "$top/Documentation"
-WVPASS bup save -n compression -0 --strip "$top/Documentation"
-# Some platforms set -A by default when root, so just use it everywhere.
-expected="$(WVPASS ls -A "$top/Documentation" | WVPASS sort)" || exit $?
-actual="$(WVPASS bup ls -A compression/latest/ | WVPASS sort)" || exit $?
-WVPASSEQ "$actual" "$expected"
-compression_0_size=$(WVPASS fs-size "$BUP_DIR") || exit $?
-
-D=compression9.tmp
-WVPASS force-delete "$BUP_DIR"
-WVPASS bup init
-WVPASS mkdir $D
-WVPASS bup index "$top/Documentation"
-WVPASS bup save -n compression -9 --strip "$top/Documentation"
-expected="$(ls -A "$top/Documentation" | sort)" || exit $?
-actual="$(bup ls -A compression/latest/ | sort)" || exit $?
-WVPASSEQ "$actual" "$expected"
-compression_9_size=$(WVPASS fs-size "$BUP_DIR") || exit $?
-
-WVPASS [ "$compression_9_size" -lt "$compression_0_size" ]
-
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-drecurse.sh b/t/test-drecurse.sh
deleted file mode 100755 (executable)
index f3e2542..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS cd "$tmpdir"
-
-# These tests aren't comprehensive, but test-save-restore-excludes.sh
-# exercises some of the same code more thoroughly via index, and
-# --xdev is handled in test-xdev.sh.
-
-WVSTART "drecurse"
-WVPASS bup init
-WVPASS mkdir src src/a src/b
-WVPASS touch src/a/1 src/a/2 src/b/1 src/b/2 src/c
-(cd src && WVPASS ln -s a a-link)
-WVPASSEQ "$(bup drecurse src)" "src/c
-src/b/2
-src/b/1
-src/b/
-src/a/2
-src/a/1
-src/a/
-src/a-link
-src/"
-
-WVSTART "drecurse --exclude (file)"
-WVPASSEQ "$(bup drecurse --exclude src/b/2 src)" "src/c
-src/b/1
-src/b/
-src/a/2
-src/a/1
-src/a/
-src/a-link
-src/"
-
-WVSTART "drecurse --exclude (dir)"
-WVPASSEQ "$(bup drecurse --exclude src/b/ src)" "src/c
-src/a/2
-src/a/1
-src/a/
-src/a-link
-src/"
-
-WVSTART "drecurse --exclude (symlink)"
-WVPASSEQ "$(bup drecurse --exclude src/a-link src)" "src/c
-src/b/2
-src/b/1
-src/b/
-src/a/2
-src/a/1
-src/a/
-src/"
-
-WVSTART "drecurse --exclude (absolute path)"
-WVPASSEQ "$(bup drecurse --exclude src/b/2 "$(pwd)/src")" "$(pwd)/src/c
-$(pwd)/src/b/1
-$(pwd)/src/b/
-$(pwd)/src/a/2
-$(pwd)/src/a/1
-$(pwd)/src/a/
-$(pwd)/src/a-link
-$(pwd)/src/"
-
-WVSTART "drecurse --exclude-from"
-WVPASS echo "src/b" > exclude-list
-WVPASSEQ "$(bup drecurse --exclude-from exclude-list src)" "src/c
-src/a/2
-src/a/1
-src/a/
-src/a-link
-src/"
-
-WVSTART "drecurse --exclude-rx (trivial)"
-WVPASSEQ "$(bup drecurse --exclude-rx '^src/b' src)" "src/c
-src/a/2
-src/a/1
-src/a/
-src/a-link
-src/"
-
-WVSTART "drecurse --exclude-rx (trivial - absolute path)"
-WVPASSEQ "$(bup drecurse --exclude-rx "^$(pwd)/src/b" "$(pwd)/src")" \
-"$(pwd)/src/c
-$(pwd)/src/a/2
-$(pwd)/src/a/1
-$(pwd)/src/a/
-$(pwd)/src/a-link
-$(pwd)/src/"
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-fsck.sh b/t/test-fsck.sh
deleted file mode 100755 (executable)
index 8f5b865..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS "$top/t/sync-tree" "$top/t/sampledata/" "$tmpdir/src/"
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-WVPASS bup init
-WVPASS cd "$tmpdir"
-
-WVSTART "fsck"
-
-WVPASS bup index src
-WVPASS bup save -n fsck-test src/b2
-WVPASS bup save -n fsck-test src/var/cmd
-WVPASS bup save -n fsck-test src/var/doc
-WVPASS bup save -n fsck-test src/var/lib
-WVPASS bup save -n fsck-test src/y
-WVPASS bup fsck
-WVPASS bup fsck "$BUP_DIR"/objects/pack/pack-*.pack
-WVPASS bup fsck --quick
-if bup fsck --par2-ok; then
-    WVSTART "fsck (par2)"
-else
-    WVSTART "fsck (PAR2 IS MISSING)"
-fi
-WVPASS bup fsck -g
-WVPASS bup fsck -r
-WVPASS bup damage "$BUP_DIR"/objects/pack/*.pack -n10 -s1 -S0
-WVFAIL bup fsck --quick
-WVFAIL bup fsck --quick --disable-par2
-WVPASS chmod u+w "$BUP_DIR"/objects/pack/*.idx
-WVPASS bup damage "$BUP_DIR"/objects/pack/*.idx -n10 -s1 -S0
-WVFAIL bup fsck --quick -j4
-WVPASS bup damage "$BUP_DIR"/objects/pack/*.pack -n10 -s1024 --percent 0.4 -S0
-WVFAIL bup fsck --quick
-WVFAIL bup fsck --quick -rvv -j99   # fails because repairs were needed
-if bup fsck --par2-ok; then
-    WVPASS bup fsck -r # ok because of repairs from last time
-    WVPASS bup damage "$BUP_DIR"/objects/pack/*.pack -n202 -s1 --equal -S0
-    WVFAIL bup fsck
-    WVFAIL bup fsck -rvv   # too many errors to be repairable
-    WVFAIL bup fsck -r   # too many errors to be repairable
-else
-    WVFAIL bup fsck --quick -r # still fails because par2 was missing
-fi
-
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-ftp b/t/test-ftp
deleted file mode 100755 (executable)
index a438241..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/../dev/bup-python" || exit $?
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-# end of bup preamble
-
-from __future__ import absolute_import, print_function
-from os import chdir, mkdir, symlink, unlink
-from os.path import abspath, dirname
-from subprocess import PIPE
-from time import localtime, strftime
-import os, sys
-
-# For buptest, wvtest, ...
-sys.path[:0] = (abspath(os.path.dirname(__file__) + '/..'),)
-sys.path[:0] = [os.path.dirname(os.path.realpath(__file__)) + '/../lib']
-
-from buptest import ex, exo, logcmd, test_tempdir
-from wvtest import wvfail, wvpass, wvpasseq, wvpassne, wvstart
-
-from bup.compat import environ
-from bup.helpers import unlink as unlink_if_exists
-import bup.path
-
-bup_cmd = bup.path.exe()
-
-def bup(*args, **kwargs):
-    if 'stdout' not in kwargs:
-        return exo((bup_cmd,) + args, **kwargs)
-    return ex((bup_cmd,) + args, **kwargs)
-
-def jl(*lines):
-    return b''.join(line + b'\n' for line in lines)
-
-environ[b'GIT_AUTHOR_NAME'] = b'bup test'
-environ[b'GIT_COMMITTER_NAME'] = b'bup test'
-environ[b'GIT_AUTHOR_EMAIL'] = b'bup@a425bc70a02811e49bdf73ee56450e6f'
-environ[b'GIT_COMMITTER_EMAIL'] = b'bup@a425bc70a02811e49bdf73ee56450e6f'
-
-with test_tempdir(b'ftp-') as tmpdir:
-    environ[b'BUP_DIR'] = tmpdir + b'/repo'
-    environ[b'GIT_DIR'] = tmpdir + b'/repo'
-
-    chdir(tmpdir)
-    mkdir(b'src')
-    chdir(b'src')
-    mkdir(b'dir')
-    with open(b'file-1', 'wb') as f:
-        f.write(b'excitement!\n')
-    with open(b'dir/file-2', 'wb') as f:
-        f.write(b'more excitement!\n')
-    symlink(b'file-1', b'file-symlink')
-    symlink(b'dir', b'dir-symlink')
-    symlink(b'not-there', b'bad-symlink')
-
-    chdir(tmpdir)    
-    bup(b'init')
-    bup(b'index', b'src')
-    bup(b'save', b'-n', b'src', b'--strip', b'src')
-    save_utc = int(exo((b'git', b'show',
-                        b'-s', b'--format=%at', b'src')).out.strip())
-    save_name = strftime('%Y-%m-%d-%H%M%S', localtime(save_utc)).encode('ascii')
-    
-    wvstart('help')
-    wvpasseq(b'Commands: ls cd pwd cat get mget help quit\n',
-             exo((bup_cmd, b'ftp'), input=b'help\n', stderr=PIPE).out)
-
-    wvstart('pwd/cd')
-    wvpasseq(b'/\n', bup(b'ftp', input=b'pwd\n').out)
-    wvpasseq(b'', bup(b'ftp', input=b'cd src\n').out)
-    wvpasseq(b'/src\n', bup(b'ftp', input=jl(b'cd src', b'pwd')).out)
-    wvpasseq(b'/src\n/\n', bup(b'ftp', input=jl(b'cd src', b'pwd',
-                                                b'cd ..', b'pwd')).out)
-    wvpasseq(b'/src\n/\n', bup(b'ftp', input=jl(b'cd src', b'pwd',
-                                                b'cd ..', b'cd ..',
-                                                b'pwd')).out)
-    wvpasseq(b'/src/%s/dir\n' % save_name,
-             bup(b'ftp', input=jl(b'cd src/latest/dir-symlink', b'pwd')).out)
-    wvpasseq(b'/src/%s/dir\n' % save_name,
-             bup(b'ftp', input=jl(b'cd src latest dir-symlink', b'pwd')).out)
-    wvpassne(0, bup(b'ftp',
-                    input=jl(b'cd src/latest/bad-symlink', b'pwd'),
-                    check=False, stdout=None).rc)
-    wvpassne(0, bup(b'ftp',
-                    input=jl(b'cd src/latest/not-there', b'pwd'),
-                    check=False, stdout=None).rc)
-
-    wvstart('ls')
-    # FIXME: elaborate
-    wvpasseq(b'src\n', bup(b'ftp', input=b'ls\n').out)
-    wvpasseq(save_name + b'\nlatest\n',
-             bup(b'ftp', input=b'ls src\n').out)
-
-    wvstart('cat')
-    wvpasseq(b'excitement!\n',
-             bup(b'ftp', input=b'cat src/latest/file-1\n').out)
-    wvpasseq(b'excitement!\nmore excitement!\n',
-             bup(b'ftp',
-                 input=b'cat src/latest/file-1 src/latest/dir/file-2\n').out)
-    
-    wvstart('get')
-    bup(b'ftp', input=jl(b'get src/latest/file-1 dest'))
-    with open(b'dest', 'rb') as f:
-        wvpasseq(b'excitement!\n', f.read())
-    unlink(b'dest')
-    bup(b'ftp', input=jl(b'get src/latest/file-symlink dest'))
-    with open(b'dest', 'rb') as f:
-        wvpasseq(b'excitement!\n', f.read())
-    unlink(b'dest')
-    wvpassne(0, bup(b'ftp',
-                    input=jl(b'get src/latest/bad-symlink dest'),
-                    check=False, stdout=None).rc)
-    wvpassne(0, bup(b'ftp',
-                    input=jl(b'get src/latest/not-there'),
-                    check=False, stdout=None).rc)
-    
-    wvstart('mget')
-    unlink_if_exists(b'file-1')
-    bup(b'ftp', input=jl(b'mget src/latest/file-1'))
-    with open(b'file-1', 'rb') as f:
-        wvpasseq(b'excitement!\n', f.read())
-    unlink_if_exists(b'file-1')
-    unlink_if_exists(b'file-2')
-    bup(b'ftp', input=jl(b'mget src/latest/file-1 src/latest/dir/file-2'))
-    with open(b'file-1', 'rb') as f:
-        wvpasseq(b'excitement!\n', f.read())
-    with open(b'file-2', 'rb') as f:
-        wvpasseq(b'more excitement!\n', f.read())
-    unlink_if_exists(b'file-symlink')
-    bup(b'ftp', input=jl(b'mget src/latest/file-symlink'))
-    with open(b'file-symlink', 'rb') as f:
-        wvpasseq(b'excitement!\n', f.read())
-    wvpassne(0, bup(b'ftp',
-                    input=jl(b'mget src/latest/bad-symlink dest'),
-                    check=False, stdout=None).rc)
-    # bup mget currently always does pattern matching
-    bup(b'ftp', input=b'mget src/latest/not-there\n')
diff --git a/t/test-fuse.sh b/t/test-fuse.sh
deleted file mode 100755 (executable)
index d219d55..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-unset BLOCKSIZE BLOCK_SIZE DF_BLOCK_SIZE
-
-root_status="$(t/root-status)" || exit $?
-
-if ! bup-python -c 'import fuse' 2> /dev/null; then
-    WVSTART 'unable to import fuse; skipping test'
-    exit 0
-fi
-
-if test -n "$(type -p modprobe)" && ! modprobe fuse; then
-    echo 'Unable to load fuse module; skipping dependent tests.' 1>&2
-    exit 0
-fi
-
-if ! fusermount -V; then
-    echo 'skipping FUSE tests: fusermount does not appear to work'
-    exit 0
-fi
-
-if ! groups | grep -q fuse && test "$root_status" != root; then
-    echo 'skipping FUSE tests: you are not root and not in the fuse group'
-    exit 0
-fi
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-# Some versions of bash's printf don't support the relevant date expansion.
-savename()
-{
-    readonly secs="$1"
-    WVPASS bup-cfg-py -c "from time import strftime, localtime; \
-       print(strftime('%Y-%m-%d-%H%M%S', localtime($secs)))"
-}
-
-export TZ=UTC
-
-WVPASS bup init
-WVPASS cd "$tmpdir"
-
-savestamp1=$(WVPASS bup-cfg-py -c 'import time; print(int(time.time()))') || exit $?
-savestamp2=$(($savestamp1 + 1))
-
-savename1="$(savename "$savestamp1")" || exit $?
-savename2="$(savename "$savestamp2")" || exit $?
-
-WVPASS mkdir src
-WVPASS echo content > src/foo
-WVPASS chmod 644 src/foo
-WVPASS touch -t 201111111111 src/foo
-# FUSE, python-fuse, something, can't handle negative epoch times.
-# Use pre-epoch to make sure bup properly "bottoms out" at 0 for now.
-WVPASS echo content > src/pre-epoch
-WVPASS chmod 644 src/pre-epoch
-WVPASS touch -t 196907202018 src/pre-epoch
-WVPASS bup index src
-WVPASS bup save -n src -d "$savestamp1" --strip src
-
-WVSTART "basics"
-WVPASS mkdir mnt
-WVPASS bup fuse mnt
-
-result=$(WVPASS ls mnt) || exit $?
-WVPASSEQ src "$result"
-
-result=$(WVPASS ls mnt/src) || exit $?
-WVPASSEQ "$result" "$savename1
-latest"
-
-result=$(WVPASS ls mnt/src/latest) || exit $?
-WVPASSEQ "$result" "foo
-pre-epoch"
-
-result=$(WVPASS cat mnt/src/latest/foo) || exit $?
-WVPASSEQ "$result" "content"
-
-# Right now we don't detect new saves.
-WVPASS bup save -n src -d "$savestamp2" --strip src
-result=$(WVPASS ls mnt/src) || exit $?
-WVPASSEQ "$result" "$savename1
-latest"
-
-WVPASS fusermount -uz mnt
-
-WVSTART "extended metadata"
-WVPASS bup fuse --meta mnt
-readonly user=$(WVPASS id -un) || $?
-readonly group=$(WVPASS id -gn) || $?
-result="$(stat --format='%A %U %G %x' mnt/src/latest/foo)"
-WVPASSEQ "$result" "-rw-r--r-- $user $group 2011-11-11 11:11:00.000000000 +0000"
-result="$(stat --format='%A %U %G %x' mnt/src/latest/pre-epoch)"
-WVPASSEQ "$result" "-rw-r--r-- $user $group 1970-01-01 00:00:00.000000000 +0000"
-
-WVPASS fusermount -uz mnt
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-gc.sh b/t/test-gc.sh
deleted file mode 100755 (executable)
index 2739ae7..0000000
+++ /dev/null
@@ -1,241 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-GC_OPTS=--unsafe
-
-bup() { "$top/bup" "$@"; }
-compare-trees() { "$top/t/compare-trees" "$@"; }
-data-size() { "$top/t/data-size" "$@"; }
-
-WVPASS cd "$tmpdir"
-WVPASS bup init
-
-
-WVSTART "gc (unchanged repo)"
-
-WVPASS mkdir src-1
-WVPASS bup random 1k > src-1/1
-WVPASS bup index src-1
-WVPASS bup save --strip -n src-1 src-1
-
-WVPASS bup gc $GC_OPTS -v
-
-WVPASS bup restore -C "$tmpdir/restore" /src-1/latest
-WVPASS compare-trees src-1/ "$tmpdir/restore/latest/"
-
-
-WVSTART "gc (unchanged, new branch)"
-
-WVPASS mkdir src-2
-WVPASS bup random 10M > src-2/1
-WVPASS bup index src-2
-WVPASS bup save --strip -n src-2 src-2
-
-WVPASS bup gc $GC_OPTS -v
-
-WVPASS rm -r "$tmpdir/restore"
-WVPASS bup restore -C "$tmpdir/restore" /src-1/latest
-WVPASS compare-trees src-1/ "$tmpdir/restore/latest/"
-
-WVPASS rm -r "$tmpdir/restore"
-WVPASS bup restore -C "$tmpdir/restore" /src-2/latest
-WVPASS compare-trees src-2/ "$tmpdir/restore/latest/"
-
-
-WVSTART "gc (removed branch)"
-
-size_before=$(WVPASS data-size "$BUP_DIR") || exit $?
-WVPASS rm "$BUP_DIR/refs/heads/src-2"
-WVPASS bup gc $GC_OPTS -v
-size_after=$(WVPASS data-size "$BUP_DIR") || exit $?
-
-WVPASS [ "$size_before" -gt 5000000 ]
-WVPASS [ "$size_after" -lt 50000 ]
-
-WVPASS rm -r "$tmpdir/restore"
-WVPASS bup restore -C "$tmpdir/restore" /src-1/latest
-WVPASS compare-trees src-1/ "$tmpdir/restore/latest/"
-
-WVPASS rm -r "$tmpdir/restore"
-WVFAIL bup restore -C "$tmpdir/restore" /src-2/latest
-
-WVPASS mkdir src-ab-clean src-ab-clean/a src-ab-clean/b
-WVPASS bup random 1k > src-ab-clean/a/1
-WVPASS bup random 10M > src-ab-clean/b/1
-
-
-WVSTART "gc (rewriting)"
-
-WVPASS rm -rf "$BUP_DIR"
-WVPASS bup init
-WVPASS rm -rf src-ab
-WVPASS cp -pPR src-ab-clean src-ab
-
-WVPASS bup index src-ab
-WVPASS bup save --strip -n src-ab src-ab
-WVPASS bup index --clear
-WVPASS bup index src-ab
-WVPASS bup save -vvv --strip -n a src-ab/a
-
-size_before=$(WVPASS data-size "$BUP_DIR") || exit $?
-WVPASS rm "$BUP_DIR/refs/heads/src-ab"
-WVPASS bup gc $GC_OPTS -v
-size_after=$(WVPASS data-size "$BUP_DIR") || exit $?
-
-WVPASS [ "$size_before" -gt 5000000 ]
-WVPASS [ "$size_after" -lt 100000 ]
-
-WVPASS rm -r "$tmpdir/restore"
-WVPASS bup restore -C "$tmpdir/restore" /a/latest
-WVPASS compare-trees src-ab/a/ "$tmpdir/restore/latest/"
-
-WVPASS rm -r "$tmpdir/restore"
-WVFAIL bup restore -C "$tmpdir/restore" /src-ab/latest
-
-
-WVSTART "gc (save -r after repo rewriting)"
-
-WVPASS rm -rf "$BUP_DIR"
-WVPASS bup init
-WVPASS bup -d bup-remote init
-WVPASS rm -rf src-ab
-WVPASS cp -pPR src-ab-clean src-ab
-
-WVPASS bup index src-ab
-WVPASS bup save -r :bup-remote --strip -n src-ab src-ab
-WVPASS bup index --clear
-WVPASS bup index src-ab
-WVPASS bup save -r :bup-remote -vvv --strip -n a src-ab/a
-
-size_before=$(WVPASS data-size bup-remote) || exit $?
-WVPASS rm bup-remote/refs/heads/src-ab
-WVPASS bup -d bup-remote gc $GC_OPTS -v
-size_after=$(WVPASS data-size bup-remote) || exit $?
-
-WVPASS [ "$size_before" -gt 5000000 ]
-WVPASS [ "$size_after" -lt 100000 ]
-
-WVPASS rm -rf "$tmpdir/restore"
-WVPASS bup -d bup-remote restore -C "$tmpdir/restore" /a/latest
-WVPASS compare-trees src-ab/a/ "$tmpdir/restore/latest/"
-
-WVPASS rm -r "$tmpdir/restore"
-WVFAIL bup -d bup-remote restore -C "$tmpdir/restore" /src-ab/latest
-
-# Make sure a post-gc index/save that includes gc-ed data works
-WVPASS bup index src-ab
-WVPASS bup save -r :bup-remote --strip -n src-ab src-ab
-WVPASS rm -r "$tmpdir/restore"
-WVPASS bup -d bup-remote restore -C "$tmpdir/restore" /src-ab/latest
-WVPASS compare-trees src-ab/ "$tmpdir/restore/latest/"
-
-
-WVSTART "gc (bup on after repo rewriting)"
-
-WVPASS rm -rf "$BUP_DIR"
-WVPASS bup init
-WVPASS rm -rf src-ab
-WVPASS cp -pPR src-ab-clean src-ab
-
-WVPASS bup on - index src-ab
-WVPASS bup on - save --strip -n src-ab src-ab
-WVPASS bup index --clear
-WVPASS bup on - index src-ab
-WVPASS bup on - save -vvv --strip -n a src-ab/a
-
-size_before=$(WVPASS data-size "$BUP_DIR") || exit $?
-WVPASS rm "$BUP_DIR/refs/heads/src-ab"
-WVPASS bup gc $GC_OPTS -v
-size_after=$(WVPASS data-size "$BUP_DIR") || exit $?
-
-WVPASS [ "$size_before" -gt 5000000 ]
-WVPASS [ "$size_after" -lt 100000 ]
-
-WVPASS rm -r "$tmpdir/restore"
-WVPASS bup restore -C "$tmpdir/restore" /a/latest
-WVPASS compare-trees src-ab/a/ "$tmpdir/restore/latest/"
-
-WVPASS rm -r "$tmpdir/restore"
-WVFAIL bup restore -C "$tmpdir/restore" /src-ab/latest
-
-# Make sure a post-gc index/save that includes gc-ed data works
-WVPASS bup on - index src-ab
-WVPASS bup on - save --strip -n src-ab src-ab
-WVPASS rm -r "$tmpdir/restore"
-WVPASS bup restore -C "$tmpdir/restore" /src-ab/latest
-WVPASS compare-trees src-ab/ "$tmpdir/restore/latest/"
-
-
-WVSTART "gc (threshold)"
-
-WVPASS rm -rf "$BUP_DIR"
-WVPASS bup init
-WVPASS rm -rf src && mkdir src
-WVPASS echo 0 > src/0
-WVPASS echo 1 > src/1
-
-WVPASS bup index src
-WVPASS bup save -n src-1 src
-WVPASS rm src/0
-WVPASS bup index src
-WVPASS bup save -n src-2 src
-
-WVPASS bup rm --unsafe src-1
-packs_before="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
-WVPASS bup gc -v $GC_OPTS --threshold 99 2>&1 | tee gc.log
-packs_after="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
-WVPASSEQ 0 "$(grep -cE '^rewriting ' gc.log)"
-WVPASSEQ "$packs_before" "$packs_after"
-
-WVPASS bup gc -v $GC_OPTS --threshold 1 2>&1 | tee gc.log
-packs_after="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
-WVPASSEQ 1 "$(grep -cE '^rewriting ' gc.log)"
-
-# Check that only one pack was rewritten
-
-# Accommodate some systems that apparently used to change the default
-# ls sort order which must match LC_COLLATE for comm to work.
-packs_before="$(sort <(echo "$packs_before"))" || die $?
-packs_after="$(sort <(echo "$packs_after"))" || die $?
-
-only_in_before="$(comm -2 -3 <(echo "$packs_before") <(echo "$packs_after"))" \
-    || die $?
-
-only_in_after="$(comm -1 -3 <(echo "$packs_before") <(echo "$packs_after"))" \
-    || die $?
-
-in_both="$(comm -1 -2 <(echo "$packs_before") <(echo "$packs_after"))" || die $?
-
-WVPASSEQ 1 $(echo "$only_in_before" | wc -l)
-WVPASSEQ 1 $(echo "$only_in_after" | wc -l)
-WVPASSEQ 1 $(echo "$in_both" | wc -l)
-
-WVSTART "gc (threshold 0)"
-
-WVPASS rm -rf "$BUP_DIR"
-WVPASS bup init
-WVPASS rm -rf src && mkdir src
-WVPASS echo 0 > src/0
-WVPASS echo 1 > src/1
-
-WVPASS bup index src
-WVPASS bup save -n src-1 src
-
-packs_before="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
-WVPASS bup gc -v $GC_OPTS --threshold 0 2>&1 | tee gc.log
-packs_after="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
-# Check that the pack was rewritten, but not removed (since the
-# result-pack is equal to the source pack)
-WVPASSEQ 1 "$(grep -cE '^rewriting ' gc.log)"
-WVPASSEQ "$packs_before" "$packs_after"
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-get b/t/test-get
deleted file mode 100755 (executable)
index 0c849ab..0000000
+++ /dev/null
@@ -1,1010 +0,0 @@
-#!/bin/sh
-"""": # -*-python-*-
-# https://sourceware.org/bugzilla/show_bug.cgi?id=26034
-export "BUP_ARGV_0"="$0"
-arg_i=1
-for arg in "$@"; do
-    export "BUP_ARGV_${arg_i}"="$arg"
-    shift
-    arg_i=$((arg_i + 1))
-done
-bup_python="$(dirname "$0")/../dev/bup-python" || exit $?
-exec "$bup_python" "$0"
-"""
-# end of bup preamble
-
-from __future__ import print_function
-from errno import ENOENT
-from os import chdir, mkdir, rename
-from os.path import abspath, dirname
-from shutil import rmtree
-from subprocess import PIPE
-import os, re, sys
-
-# For buptest, wvtest, ...
-sys.path[:0] = (abspath(os.path.dirname(__file__) + '/..'),)
-sys.path[:0] = [os.path.dirname(os.path.realpath(__file__)) + '/../lib']
-
-
-from bup import compat, path
-from bup.compat import environ, getcwd, items
-from bup.helpers import bquote, merge_dict, unlink
-from bup.io import byte_stream
-from buptest import ex, exo, test_tempdir
-from wvtest import wvcheck, wvfail, wvmsg, wvpass, wvpasseq, wvpassne, wvstart
-import bup.path
-
-sys.stdout.flush()
-stdout = byte_stream(sys.stdout)
-
-# FIXME: per-test function
-environ[b'GIT_AUTHOR_NAME'] = b'bup test-get'
-environ[b'GIT_COMMITTER_NAME'] = b'bup test-get'
-environ[b'GIT_AUTHOR_EMAIL'] = b'bup@85430dcca2b611e4b2c3-8f5691723476'
-environ[b'GIT_COMMITTER_EMAIL'] = b'bup@85430dcca2b611e4b2c3-8f5691723476'
-
-# The clean-repo test can probably be applied more broadly.  It was
-# initially just applied to test-pick to catch a bug.
-
-top = getcwd()
-bup_cmd = bup.path.exe()
-
-def rmrf(path):
-    err = []  # because python's scoping mess...
-    def onerror(function, path, excinfo):
-        err.append((function, path, excinfo))
-    rmtree(path, onerror=onerror)
-    if err:
-        function, path, excinfo = err[0]
-        ex_type, ex, traceback = excinfo
-        if (not isinstance(ex, OSError)) or ex.errno != ENOENT:
-            raise ex
-
-def verify_trees_match(path1, path2):
-    global top
-    exr = exo((top + b'/t/compare-trees', b'-c', path1, path2), check=False)
-    stdout.write(exr.out)
-    sys.stdout.flush()
-    wvcheck(exr.rc == 0, 'process exit %d == 0' % exr.rc)
-
-def verify_rcz(cmd, **kwargs):
-    assert not kwargs.get('check')
-    kwargs['check'] = False
-    result = exo(cmd, **kwargs)
-    stdout.write(result.out)
-    rc = result.proc.returncode
-    wvcheck(rc == 0, 'process exit %d == 0' % rc)
-    return result
-
-# FIXME: multline, or allow opts generally?
-
-def verify_rx(rx, string):
-    wvcheck(re.search(rx, string), 'rx %r matches %r' % (rx, string))
-
-def verify_nrx(rx, string):
-    wvcheck(not re.search(rx, string), "rx %r doesn't match %r" % (rx, string))
-
-def validate_clean_repo():
-    out = verify_rcz((b'git', b'--git-dir', b'get-dest', b'fsck')).out
-    verify_nrx(br'dangling|mismatch|missing|unreachable', out)
-    
-def validate_blob(src_id, dest_id):
-    global top
-    rmrf(b'restore-src')
-    rmrf(b'restore-dest')
-    cat_tree = top + b'/t/git-cat-tree'
-    src_blob = verify_rcz((cat_tree, b'--git-dir', b'get-src', src_id)).out
-    dest_blob = verify_rcz((cat_tree, b'--git-dir', b'get-src', src_id)).out
-    wvpasseq(src_blob, dest_blob)
-
-def validate_tree(src_id, dest_id):
-
-    rmrf(b'restore-src')
-    rmrf(b'restore-dest')
-    mkdir(b'restore-src')
-    mkdir(b'restore-dest')
-    
-    commit_env = merge_dict(environ, {b'GIT_COMMITTER_DATE': b'2014-01-01 01:01'})
-
-    # Create a commit so the archive contents will have matching timestamps.
-    src_c = exo((b'git', b'--git-dir', b'get-src',
-                 b'commit-tree', b'-m', b'foo', src_id),
-                env=commit_env).out.strip()
-    dest_c = exo((b'git', b'--git-dir', b'get-dest',
-                  b'commit-tree', b'-m', b'foo', dest_id),
-                 env=commit_env).out.strip()
-    exr = verify_rcz(b'git --git-dir get-src archive %s | tar xvf - -C restore-src'
-                     % bquote(src_c),
-                     shell=True)
-    if exr.rc != 0: return False
-    exr = verify_rcz(b'git --git-dir get-dest archive %s | tar xvf - -C restore-dest'
-                     % bquote(dest_c),
-                     shell=True)
-    if exr.rc != 0: return False
-    
-    # git archive doesn't include an entry for ./.
-    unlink(b'restore-src/pax_global_header')
-    unlink(b'restore-dest/pax_global_header')
-    ex((b'touch', b'-r', b'restore-src', b'restore-dest'))
-    verify_trees_match(b'restore-src/', b'restore-dest/')
-    rmrf(b'restore-src')
-    rmrf(b'restore-dest')
-
-def validate_commit(src_id, dest_id):
-    exr = verify_rcz((b'git', b'--git-dir', b'get-src', b'cat-file', b'commit', src_id))
-    if exr.rc != 0: return False
-    src_cat = exr.out
-    exr = verify_rcz((b'git', b'--git-dir', b'get-dest', b'cat-file', b'commit', dest_id))
-    if exr.rc != 0: return False
-    dest_cat = exr.out
-    wvpasseq(src_cat, dest_cat)
-    if src_cat != dest_cat: return False
-    
-    rmrf(b'restore-src')
-    rmrf(b'restore-dest')
-    mkdir(b'restore-src')
-    mkdir(b'restore-dest')
-    qsrc = bquote(src_id)
-    qdest = bquote(dest_id)
-    exr = verify_rcz((b'git --git-dir get-src archive ' + qsrc
-                      + b' | tar xf - -C restore-src'),
-                     shell=True)
-    if exr.rc != 0: return False
-    exr = verify_rcz((b'git --git-dir get-dest archive ' + qdest +
-                      b' | tar xf - -C restore-dest'),
-                     shell=True)
-    if exr.rc != 0: return False
-    
-    # git archive doesn't include an entry for ./.
-    ex((b'touch', b'-r', b'restore-src', b'restore-dest'))
-    verify_trees_match(b'restore-src/', b'restore-dest/')
-    rmrf(b'restore-src')
-    rmrf(b'restore-dest')
-
-def _validate_save(orig_dir, save_path, commit_id, tree_id):
-    global bup_cmd
-    rmrf(b'restore')
-    exr = verify_rcz((bup_cmd, b'-d', b'get-dest',
-                      b'restore', b'-C', b'restore', save_path + b'/.'))
-    if exr.rc: return False
-    verify_trees_match(orig_dir + b'/', b'restore/')
-    if tree_id:
-        # FIXME: double check that get-dest is correct
-        exr = verify_rcz((b'git', b'--git-dir', b'get-dest', b'ls-tree', tree_id))
-        if exr.rc: return False
-        cat = verify_rcz((b'git', b'--git-dir', b'get-dest',
-                          b'cat-file', b'commit', commit_id))
-        if cat.rc: return False
-        wvpasseq(b'tree ' + tree_id, cat.out.splitlines()[0])
-
-# FIXME: re-merge save and new_save?
-        
-def validate_save(dest_name, restore_subpath, commit_id, tree_id, orig_value,
-                  get_out):
-    out = get_out.splitlines()
-    print('blarg: out', repr(out), file=sys.stderr)
-    wvpasseq(2, len(out))
-    get_tree_id = out[0]
-    get_commit_id = out[1]
-    wvpasseq(tree_id, get_tree_id)
-    wvpasseq(commit_id, get_commit_id)
-    _validate_save(orig_value, dest_name + restore_subpath, commit_id, tree_id)
-
-def validate_new_save(dest_name, restore_subpath, commit_id, tree_id, orig_value,
-                      get_out):
-    out = get_out.splitlines()
-    wvpasseq(2, len(out))
-    get_tree_id = out[0]
-    get_commit_id = out[1]
-    wvpasseq(tree_id, get_tree_id)
-    wvpassne(commit_id, get_commit_id)
-    _validate_save(orig_value, dest_name + restore_subpath, get_commit_id, tree_id)
-        
-def validate_tagged_save(tag_name, restore_subpath,
-                         commit_id, tree_id, orig_value, get_out):
-    out = get_out.splitlines()
-    wvpasseq(1, len(out))
-    get_tag_id = out[0]
-    wvpasseq(commit_id, get_tag_id)
-    # Make sure tmp doesn't already exist.
-    exr = exo((b'git', b'--git-dir', b'get-dest', b'show-ref', b'tmp-branch-for-tag'),
-              check=False)
-    wvpasseq(1, exr.rc)
-
-    ex((b'git', b'--git-dir', b'get-dest', b'branch', b'tmp-branch-for-tag',
-        b'refs/tags/' + tag_name))
-    _validate_save(orig_value, b'tmp-branch-for-tag/latest' + restore_subpath,
-                   commit_id, tree_id)
-    ex((b'git', b'--git-dir', b'get-dest', b'branch', b'-D', b'tmp-branch-for-tag'))
-
-def validate_new_tagged_commit(tag_name, commit_id, tree_id, get_out):
-    out = get_out.splitlines()
-    wvpasseq(1, len(out))
-    get_tag_id = out[0]
-    wvpassne(commit_id, get_tag_id)
-    validate_tree(tree_id, tag_name + b':')
-
-
-get_cases_tested = 0
-
-def _run_get(disposition, method, what):
-    print('run_get:', repr((disposition, method, what)), file=sys.stderr)
-    global bup_cmd
-
-    if disposition == 'get':
-        get_cmd = (bup_cmd, b'-d', b'get-dest',
-                   b'get', b'-vvct', b'--print-tags', b'-s', b'get-src')
-    elif disposition == 'get-on':
-        get_cmd = (bup_cmd, b'-d', b'get-dest',
-                   b'on', b'-', b'get', b'-vvct', b'--print-tags', b'-s', b'get-src')
-    elif disposition == 'get-to':
-        get_cmd = (bup_cmd, b'-d', b'get-dest',
-                   b'get', b'-vvct', b'--print-tags', b'-s', b'get-src',
-                   b'-r', b'-:' + getcwd() + b'/get-dest')
-    else:
-        raise Exception('error: unexpected get disposition ' + repr(disposition))
-    
-    global get_cases_tested
-    if isinstance(what, bytes):
-        cmd = get_cmd + (method, what)
-    else:
-        assert not isinstance(what, str)  # python 3 sanity check
-        if method in (b'--ff', b'--append', b'--pick', b'--force-pick', b'--new-tag',
-                      b'--replace'):
-            method += b':'
-        src, dest = what
-        cmd = get_cmd + (method, src, dest)
-    result = exo(cmd, check=False, stderr=PIPE)
-    get_cases_tested += 1
-    fsck = ex((bup_cmd, b'-d', b'get-dest', b'fsck'), check=False)
-    wvpasseq(0, fsck.rc)
-    return result
-
-def run_get(disposition, method, what=None, given=None):
-    global bup_cmd
-    rmrf(b'get-dest')
-    ex((bup_cmd, b'-d', b'get-dest', b'init'))
-
-    if given:
-        # FIXME: replace bup-get with independent commands as is feasible
-        exr = _run_get(disposition, b'--replace', given)
-        assert not exr.rc
-    return _run_get(disposition, method, what)
-
-def test_universal_behaviors(get_disposition):
-    methods = (b'--ff', b'--append', b'--pick', b'--force-pick', b'--new-tag',
-               b'--replace', b'--unnamed')
-    for method in methods:
-        mmsg = method.decode('ascii')
-        wvstart(get_disposition + ' ' + mmsg + ', missing source, fails')
-        exr = run_get(get_disposition, method, b'not-there')
-        wvpassne(0, exr.rc)
-        verify_rx(br'cannot find source', exr.err)
-    for method in methods:
-        mmsg = method.decode('ascii')
-        wvstart(get_disposition + ' ' + mmsg + ' / fails')
-        exr = run_get(get_disposition, method, b'/')
-        wvpassne(0, exr.rc)
-        verify_rx(b'cannot fetch entire repository', exr.err)
-
-def verify_only_refs(**kwargs):
-    for kind, refs in items(kwargs):
-        if kind == 'heads':
-            abs_refs = [b'refs/heads/' + ref for ref in refs]
-            karg = b'--heads'
-        elif kind == 'tags':
-            abs_refs = [b'refs/tags/' + ref for ref in refs]
-            karg = b'--tags'
-        else:
-            raise TypeError('unexpected keyword argument %r' % kind)
-        if abs_refs:
-            verify_rcz([b'git', b'--git-dir', b'get-dest',
-                        b'show-ref', b'--verify', karg] + abs_refs)
-            exr = exo((b'git', b'--git-dir', b'get-dest', b'show-ref', karg),
-                      check=False)
-            wvpasseq(0, exr.rc)
-            expected_refs = sorted(abs_refs)
-            repo_refs = sorted([x.split()[1] for x in exr.out.splitlines()])
-            wvpasseq(expected_refs, repo_refs)
-        else:
-            # FIXME: can we just check "git show-ref --heads == ''"?
-            exr = exo((b'git', b'--git-dir', b'get-dest', b'show-ref', karg),
-                      check=False)
-            wvpasseq(1, exr.rc)
-            wvpasseq(b'', exr.out.strip())
-
-def test_replace(get_disposition, src_info):
-    print('blarg:', repr(src_info), file=sys.stderr)
-
-    wvstart(get_disposition + ' --replace to root fails')
-    for item in (b'.tag/tinyfile',
-                 b'src/latest' + src_info['tinyfile-path'],
-                 b'.tag/subtree',
-                 b'src/latest' + src_info['subtree-vfs-path'],
-                 b'.tag/commit-1',
-                 b'src/latest',
-                 b'src'):
-        exr = run_get(get_disposition, b'--replace', (item, b'/'))
-        wvpassne(0, exr.rc)
-        verify_rx(br'impossible; can only overwrite branch or tag', exr.err)
-
-    tinyfile_id = src_info['tinyfile-id']
-    tinyfile_path = src_info['tinyfile-path']
-    subtree_vfs_path = src_info['subtree-vfs-path']
-    subtree_id = src_info['subtree-id']
-    commit_2_id = src_info['commit-2-id']
-    tree_2_id = src_info['tree-2-id']
-
-    # Anything to tag
-    existing_items = {'nothing' : None,
-                      'blob' : (b'.tag/tinyfile', b'.tag/obj'),
-                      'tree' : (b'.tag/tree-1', b'.tag/obj'),
-                      'commit': (b'.tag/commit-1', b'.tag/obj')}
-    for ex_type, ex_ref in items(existing_items):
-        wvstart(get_disposition + ' --replace ' + ex_type + ' with blob tag')
-        for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
-            exr = run_get(get_disposition, b'--replace', (item ,b'.tag/obj'),
-                          given=ex_ref)
-            wvpasseq(0, exr.rc)        
-            validate_blob(tinyfile_id, tinyfile_id)
-            verify_only_refs(heads=[], tags=(b'obj',))
-        wvstart(get_disposition + ' --replace ' + ex_type + ' with tree tag')
-        for item in (b'.tag/subtree',  b'src/latest' + subtree_vfs_path):
-            exr = run_get(get_disposition, b'--replace', (item, b'.tag/obj'),
-                          given=ex_ref)
-            validate_tree(subtree_id, subtree_id)
-            verify_only_refs(heads=[], tags=(b'obj',))
-        wvstart(get_disposition + ' --replace ' + ex_type + ' with commitish tag')
-        for item in (b'.tag/commit-2', b'src/latest', b'src'):
-            exr = run_get(get_disposition, b'--replace', (item, b'.tag/obj'),
-                          given=ex_ref)
-            validate_tagged_save(b'obj', getcwd() + b'/src',
-                                 commit_2_id, tree_2_id, b'src-2', exr.out)
-            verify_only_refs(heads=[], tags=(b'obj',))
-
-        # Committish to branch.
-        existing_items = (('nothing', None),
-                          ('branch', (b'.tag/commit-1', b'obj')))
-        for ex_type, ex_ref in existing_items:
-            for item_type, item in (('commit', b'.tag/commit-2'),
-                                    ('save', b'src/latest'),
-                                    ('branch', b'src')):
-                wvstart(get_disposition + ' --replace '
-                        + ex_type + ' with ' + item_type)
-                exr = run_get(get_disposition, b'--replace', (item, b'obj'),
-                              given=ex_ref)
-                validate_save(b'obj/latest', getcwd() + b'/src',
-                              commit_2_id, tree_2_id, b'src-2', exr.out)
-                verify_only_refs(heads=(b'obj',), tags=[])
-
-        # Not committish to branch
-        existing_items = (('nothing', None),
-                          ('branch', (b'.tag/commit-1', b'obj')))
-        for ex_type, ex_ref in existing_items:
-            for item_type, item in (('blob', b'.tag/tinyfile'),
-                                    ('blob', b'src/latest' + tinyfile_path),
-                                    ('tree', b'.tag/subtree'),
-                                    ('tree', b'src/latest' + subtree_vfs_path)):
-                wvstart(get_disposition + ' --replace branch with '
-                        + item_type + ' given ' + ex_type + ' fails')
-
-                exr = run_get(get_disposition, b'--replace', (item, b'obj'),
-                              given=ex_ref)
-                wvpassne(0, exr.rc)
-                verify_rx(br'cannot overwrite branch with .+ for', exr.err)
-
-        wvstart(get_disposition + ' --replace, implicit destinations')
-
-        exr = run_get(get_disposition, b'--replace', b'src')
-        validate_save(b'src/latest', getcwd() + b'/src',
-                      commit_2_id, tree_2_id, b'src-2', exr.out)
-        verify_only_refs(heads=(b'src',), tags=[])
-
-        exr = run_get(get_disposition, b'--replace', b'.tag/commit-2')
-        validate_tagged_save(b'commit-2', getcwd() + b'/src',
-                             commit_2_id, tree_2_id, b'src-2', exr.out)
-        verify_only_refs(heads=[], tags=(b'commit-2',))
-
-def test_ff(get_disposition, src_info):
-
-    wvstart(get_disposition + ' --ff to root fails')
-    tinyfile_path = src_info['tinyfile-path']
-    for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
-        exr = run_get(get_disposition, b'--ff', (item, b'/'))
-        wvpassne(0, exr.rc)
-        verify_rx(br'source for .+ must be a branch, save, or commit', exr.err)
-    subtree_vfs_path = src_info['subtree-vfs-path']
-    for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
-        exr = run_get(get_disposition, b'--ff', (item, b'/'))
-        wvpassne(0, exr.rc)
-        verify_rx(br'is impossible; can only --append a tree to a branch',
-                  exr.err)    
-    for item in (b'.tag/commit-1', b'src/latest', b'src'):
-        exr = run_get(get_disposition, b'--ff', (item, b'/'))
-        wvpassne(0, exr.rc)
-        verify_rx(br'destination for .+ is a root, not a branch', exr.err)
-
-    wvstart(get_disposition + ' --ff of not-committish fails')
-    for src in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
-        # FIXME: use get_item elsewhere?
-        for given, get_item in ((None, (src, b'obj')),
-                                (None, (src, b'.tag/obj')),
-                                ((b'.tag/tinyfile', b'.tag/obj'), (src, b'.tag/obj')),
-                                ((b'.tag/tree-1', b'.tag/obj'), (src, b'.tag/obj')),
-                                ((b'.tag/commit-1', b'.tag/obj'), (src, b'.tag/obj')),
-                                ((b'.tag/commit-1', b'obj'), (src, b'obj'))):
-            exr = run_get(get_disposition, b'--ff', get_item, given=given)
-            wvpassne(0, exr.rc)
-            verify_rx(br'must be a branch, save, or commit', exr.err)
-    for src in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
-        for given, get_item in ((None, (src, b'obj')),
-                                (None, (src, b'.tag/obj')),
-                                ((b'.tag/tinyfile', b'.tag/obj'), (src, b'.tag/obj')),
-                                ((b'.tag/tree-1', b'.tag/obj'), (src, b'.tag/obj')),
-                                ((b'.tag/commit-1', b'.tag/obj'), (src, b'.tag/obj')),
-                                ((b'.tag/commit-1', b'obj'), (src, b'obj'))):
-            exr = run_get(get_disposition, b'--ff', get_item, given=given)
-            wvpassne(0, exr.rc)
-            verify_rx(br'can only --append a tree to a branch', exr.err)
-
-    wvstart(get_disposition + ' --ff committish, ff possible')
-    save_2 = src_info['save-2']
-    for src in (b'.tag/commit-2', b'src/' + save_2, b'src'):
-        for given, get_item, complaint in \
-            ((None, (src, b'.tag/obj'),
-              br'destination .+ must be a valid branch name'),
-             ((b'.tag/tinyfile', b'.tag/obj'), (src, b'.tag/obj'),
-              br'destination .+ is a blob, not a branch'),
-             ((b'.tag/tree-1', b'.tag/obj'), (src, b'.tag/obj'),
-              br'destination .+ is a tree, not a branch'),
-             ((b'.tag/commit-1', b'.tag/obj'), (src, b'.tag/obj'),
-              br'destination .+ is a tagged commit, not a branch'),
-             ((b'.tag/commit-2', b'.tag/obj'), (src, b'.tag/obj'),
-              br'destination .+ is a tagged commit, not a branch')):
-            exr = run_get(get_disposition, b'--ff', get_item, given=given)
-            wvpassne(0, exr.rc)
-            verify_rx(complaint, exr.err)
-    # FIXME: use src or item and given or existing consistently in loops...
-    commit_2_id = src_info['commit-2-id']
-    tree_2_id = src_info['tree-2-id']
-    for src in (b'.tag/commit-2', b'src/' + save_2, b'src'):
-        for given in (None, (b'.tag/commit-1', b'obj'), (b'.tag/commit-2', b'obj')):
-            exr = run_get(get_disposition, b'--ff', (src, b'obj'), given=given)
-            wvpasseq(0, exr.rc)
-            validate_save(b'obj/latest', getcwd() + b'/src',
-                          commit_2_id, tree_2_id, b'src-2', exr.out)
-            verify_only_refs(heads=(b'obj',), tags=[])
-            
-    wvstart(get_disposition + ' --ff, implicit destinations')
-    for item in (b'src', b'src/latest'):
-        exr = run_get(get_disposition, b'--ff', item)
-        wvpasseq(0, exr.rc)
-
-        ex((b'find', b'get-dest/refs'))
-        ex((bup_cmd, b'-d', b'get-dest', b'ls'))
-
-        validate_save(b'src/latest', getcwd() + b'/src',
-                     commit_2_id, tree_2_id, b'src-2', exr.out)
-        #verify_only_refs(heads=('src',), tags=[])
-
-    wvstart(get_disposition + ' --ff, ff impossible')
-    for given, get_item in (((b'unrelated-branch', b'src'), b'src'),
-                            ((b'.tag/commit-2', b'src'), (b'.tag/commit-1', b'src'))):
-        exr = run_get(get_disposition, b'--ff', get_item, given=given)
-        wvpassne(0, exr.rc)
-        verify_rx(br'destination is not an ancestor of source', exr.err)
-
-def test_append(get_disposition, src_info):
-    tinyfile_path = src_info['tinyfile-path']
-    subtree_vfs_path = src_info['subtree-vfs-path']
-
-    wvstart(get_disposition + ' --append to root fails')
-    for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
-        exr = run_get(get_disposition, b'--append', (item, b'/'))
-        wvpassne(0, exr.rc)
-        verify_rx(br'source for .+ must be a branch, save, commit, or tree',
-                  exr.err)
-    for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path,
-                 b'.tag/commit-1', b'src/latest', b'src'):
-        exr = run_get(get_disposition, b'--append', (item, b'/'))
-        wvpassne(0, exr.rc)
-        verify_rx(br'destination for .+ is a root, not a branch', exr.err)
-
-    wvstart(get_disposition + ' --append of not-treeish fails')
-    for src in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
-        for given, item in ((None, (src, b'obj')),
-                            (None, (src, b'.tag/obj')),
-                            ((b'.tag/tinyfile', b'.tag/obj'), (src, b'.tag/obj')),
-                            ((b'.tag/tree-1', b'.tag/obj'), (src, b'.tag/obj')),
-                            ((b'.tag/commit-1', b'.tag/obj'), (src, b'.tag/obj')),
-                            ((b'.tag/commit-1', b'obj'), (src, b'obj'))):
-            exr = run_get(get_disposition, b'--append', item, given=given)
-            wvpassne(0, exr.rc)
-            verify_rx(br'must be a branch, save, commit, or tree', exr.err)
-
-    wvstart(get_disposition + ' --append committish failure cases')
-    save_2 = src_info['save-2']
-    for src in (b'.tag/subtree', b'src/latest' + subtree_vfs_path,
-                b'.tag/commit-2', b'src/' + save_2, b'src'):
-        for given, item, complaint in \
-            ((None, (src, b'.tag/obj'),
-              br'destination .+ must be a valid branch name'),
-             ((b'.tag/tinyfile', b'.tag/obj'), (src, b'.tag/obj'),
-              br'destination .+ is a blob, not a branch'),
-             ((b'.tag/tree-1', b'.tag/obj'), (src, b'.tag/obj'),
-              br'destination .+ is a tree, not a branch'),
-             ((b'.tag/commit-1', b'.tag/obj'), (src, b'.tag/obj'),
-              br'destination .+ is a tagged commit, not a branch'),
-             ((b'.tag/commit-2', b'.tag/obj'), (src, b'.tag/obj'),
-              br'destination .+ is a tagged commit, not a branch')):
-            exr = run_get(get_disposition, b'--append', item, given=given)
-            wvpassne(0, exr.rc)
-            verify_rx(complaint, exr.err)
-
-    wvstart(get_disposition + ' --append committish')
-    commit_2_id = src_info['commit-2-id']
-    tree_2_id = src_info['tree-2-id']
-    for item in (b'.tag/commit-2', b'src/' + save_2, b'src'):
-        for existing in (None, (b'.tag/commit-1', b'obj'),
-                         (b'.tag/commit-2', b'obj'),
-                         (b'unrelated-branch', b'obj')):
-            exr = run_get(get_disposition, b'--append', (item, b'obj'),
-                          given=existing)
-            wvpasseq(0, exr.rc)
-            validate_new_save(b'obj/latest', getcwd() + b'/src',
-                              commit_2_id, tree_2_id, b'src-2', exr.out)
-            verify_only_refs(heads=(b'obj',), tags=[])
-    # Append ancestor
-    save_1 = src_info['save-1']
-    commit_1_id = src_info['commit-1-id']
-    tree_1_id = src_info['tree-1-id']
-    for item in (b'.tag/commit-1',  b'src/' + save_1, b'src-1'):
-        exr = run_get(get_disposition, b'--append', (item, b'obj'),
-                      given=(b'.tag/commit-2', b'obj'))
-        wvpasseq(0, exr.rc)
-        validate_new_save(b'obj/latest', getcwd() + b'/src',
-                          commit_1_id, tree_1_id, b'src-1', exr.out)
-        verify_only_refs(heads=(b'obj',), tags=[])
-
-    wvstart(get_disposition + ' --append tree')
-    subtree_path = src_info['subtree-path']
-    subtree_id = src_info['subtree-id']
-    for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
-        for existing in (None,
-                         (b'.tag/commit-1', b'obj'),
-                         (b'.tag/commit-2', b'obj')):
-            exr = run_get(get_disposition, b'--append', (item, b'obj'),
-                          given=existing)
-            wvpasseq(0, exr.rc)
-            validate_new_save(b'obj/latest', b'/', None, subtree_id, subtree_path,
-                              exr.out)
-            verify_only_refs(heads=(b'obj',), tags=[])
-
-    wvstart(get_disposition + ' --append, implicit destinations')
-
-    for item in (b'src', b'src/latest'):
-        exr = run_get(get_disposition, b'--append', item)
-        wvpasseq(0, exr.rc)
-        validate_new_save(b'src/latest', getcwd() + b'/src', commit_2_id, tree_2_id,
-                          b'src-2', exr.out)
-        verify_only_refs(heads=(b'src',), tags=[])
-
-def test_pick(get_disposition, src_info, force=False):
-    flavor = b'--force-pick' if force else b'--pick'
-    flavormsg = flavor.decode('ascii')
-    tinyfile_path = src_info['tinyfile-path']
-    subtree_vfs_path = src_info['subtree-vfs-path']
-    
-    wvstart(get_disposition + ' ' + flavormsg + ' to root fails')
-    for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path, b'src'):
-        exr = run_get(get_disposition, flavor, (item, b'/'))
-        wvpassne(0, exr.rc)
-        verify_rx(br'can only pick a commit or save', exr.err)
-    for item in (b'.tag/commit-1', b'src/latest'):
-        exr = run_get(get_disposition, flavor, (item, b'/'))
-        wvpassne(0, exr.rc)
-        verify_rx(br'destination is not a tag or branch', exr.err)
-    for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
-        exr = run_get(get_disposition, flavor, (item, b'/'))
-        wvpassne(0, exr.rc)
-        verify_rx(br'is impossible; can only --append a tree', exr.err)
-
-    wvstart(get_disposition + ' ' + flavormsg + ' of blob or branch fails')
-    for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path, b'src'):
-        for given, get_item in ((None, (item, b'obj')),
-                                (None, (item, b'.tag/obj')),
-                                ((b'.tag/tinyfile', b'.tag/obj'), (item, b'.tag/obj')),
-                                ((b'.tag/tree-1', b'.tag/obj'), (item, b'.tag/obj')),
-                                ((b'.tag/commit-1', b'.tag/obj'), (item, b'.tag/obj')),
-                                ((b'.tag/commit-1', b'obj'), (item, b'obj'))):
-            exr = run_get(get_disposition, flavor, get_item, given=given)
-            wvpassne(0, exr.rc)
-            verify_rx(br'impossible; can only pick a commit or save', exr.err)
-
-    wvstart(get_disposition + ' ' + flavormsg + ' of tree fails')
-    for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
-        for given, get_item in ((None, (item, b'obj')),
-                                (None, (item, b'.tag/obj')),
-                                ((b'.tag/tinyfile', b'.tag/obj'), (item, b'.tag/obj')),
-                                ((b'.tag/tree-1', b'.tag/obj'), (item, b'.tag/obj')),
-                                ((b'.tag/commit-1', b'.tag/obj'), (item, b'.tag/obj')),
-                                ((b'.tag/commit-1', b'obj'), (item, b'obj'))):
-            exr = run_get(get_disposition, flavor, get_item, given=given)
-            wvpassne(0, exr.rc)
-            verify_rx(br'impossible; can only --append a tree', exr.err)
-
-    save_2 = src_info['save-2']
-    commit_2_id = src_info['commit-2-id']
-    tree_2_id = src_info['tree-2-id']
-    # FIXME: these two wvstart texts?
-    if force:
-        wvstart(get_disposition + ' ' + flavormsg + ' commit/save to existing tag')
-        for item in (b'.tag/commit-2', b'src/' + save_2):
-            for given in ((b'.tag/tinyfile', b'.tag/obj'),
-                          (b'.tag/tree-1', b'.tag/obj'),
-                          (b'.tag/commit-1', b'.tag/obj')):
-                exr = run_get(get_disposition, flavor, (item, b'.tag/obj'),
-                              given=given)
-                wvpasseq(0, exr.rc)
-                validate_new_tagged_commit(b'obj', commit_2_id, tree_2_id,
-                                           exr.out)
-                verify_only_refs(heads=[], tags=(b'obj',))
-    else: # --pick
-        wvstart(get_disposition + ' ' + flavormsg
-                + ' commit/save to existing tag fails')
-        for item in (b'.tag/commit-2', b'src/' + save_2):
-            for given in ((b'.tag/tinyfile', b'.tag/obj'),
-                          (b'.tag/tree-1', b'.tag/obj'),
-                          (b'.tag/commit-1', b'.tag/obj')):
-                exr = run_get(get_disposition, flavor, (item, b'.tag/obj'), given=given)
-                wvpassne(0, exr.rc)
-                verify_rx(br'cannot overwrite existing tag', exr.err)
-            
-    wvstart(get_disposition + ' ' + flavormsg + ' commit/save to tag')
-    for item in (b'.tag/commit-2', b'src/' + save_2):
-        exr = run_get(get_disposition, flavor, (item, b'.tag/obj'))
-        wvpasseq(0, exr.rc)
-        validate_clean_repo()
-        validate_new_tagged_commit(b'obj', commit_2_id, tree_2_id, exr.out)
-        verify_only_refs(heads=[], tags=(b'obj',))
-         
-    wvstart(get_disposition + ' ' + flavormsg + ' commit/save to branch')
-    for item in (b'.tag/commit-2', b'src/' + save_2):
-        for given in (None, (b'.tag/commit-1', b'obj'), (b'.tag/commit-2', b'obj')):
-            exr = run_get(get_disposition, flavor, (item, b'obj'), given=given)
-            wvpasseq(0, exr.rc)
-            validate_clean_repo()
-            validate_new_save(b'obj/latest', getcwd() + b'/src',
-                              commit_2_id, tree_2_id, b'src-2', exr.out)
-            verify_only_refs(heads=(b'obj',), tags=[])
-
-    wvstart(get_disposition + ' ' + flavormsg
-            + ' commit/save unrelated commit to branch')
-    for item in(b'.tag/commit-2', b'src/' + save_2):
-        exr = run_get(get_disposition, flavor, (item, b'obj'),
-                      given=(b'unrelated-branch', b'obj'))
-        wvpasseq(0, exr.rc)
-        validate_clean_repo()
-        validate_new_save(b'obj/latest', getcwd() + b'/src',
-                          commit_2_id, tree_2_id, b'src-2', exr.out)
-        verify_only_refs(heads=(b'obj',), tags=[])
-
-    wvstart(get_disposition + ' ' + flavormsg + ' commit/save ancestor to branch')
-    save_1 = src_info['save-1']
-    commit_1_id = src_info['commit-1-id']
-    tree_1_id = src_info['tree-1-id']
-    for item in (b'.tag/commit-1', b'src/' + save_1):
-        exr = run_get(get_disposition, flavor, (item, b'obj'),
-                      given=(b'.tag/commit-2', b'obj'))
-        wvpasseq(0, exr.rc)
-        validate_clean_repo()
-        validate_new_save(b'obj/latest', getcwd() + b'/src',
-                          commit_1_id, tree_1_id, b'src-1', exr.out)
-        verify_only_refs(heads=(b'obj',), tags=[])
-
-
-    wvstart(get_disposition + ' ' + flavormsg + ', implicit destinations')
-    exr = run_get(get_disposition, flavor, b'.tag/commit-2')
-    wvpasseq(0, exr.rc)
-    validate_clean_repo()
-    validate_new_tagged_commit(b'commit-2', commit_2_id, tree_2_id, exr.out)
-    verify_only_refs(heads=[], tags=(b'commit-2',))
-
-    exr = run_get(get_disposition, flavor, b'src/latest')
-    wvpasseq(0, exr.rc)
-    validate_clean_repo()
-    validate_new_save(b'src/latest', getcwd() + b'/src',
-                      commit_2_id, tree_2_id, b'src-2', exr.out)
-    verify_only_refs(heads=(b'src',), tags=[])
-
-def test_new_tag(get_disposition, src_info):
-    tinyfile_id = src_info['tinyfile-id']
-    tinyfile_path = src_info['tinyfile-path']
-    commit_2_id = src_info['commit-2-id']
-    tree_2_id = src_info['tree-2-id']
-    subtree_id = src_info['subtree-id']
-    subtree_vfs_path = src_info['subtree-vfs-path']
-
-    wvstart(get_disposition + ' --new-tag to root fails')
-    for item in (b'.tag/tinyfile',
-                 b'src/latest' + tinyfile_path,
-                 b'.tag/subtree',
-                 b'src/latest' + subtree_vfs_path,
-                 b'.tag/commit-1',
-                 b'src/latest',
-                 b'src'):
-        exr = run_get(get_disposition, b'--new-tag', (item, b'/'))
-        wvpassne(0, exr.rc)
-        verify_rx(br'destination for .+ must be a VFS tag', exr.err)
-
-    # Anything to new tag.
-    wvstart(get_disposition + ' --new-tag, blob tag')
-    for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
-        exr = run_get(get_disposition, b'--new-tag', (item, b'.tag/obj'))
-        wvpasseq(0, exr.rc)        
-        validate_blob(tinyfile_id, tinyfile_id)
-        verify_only_refs(heads=[], tags=(b'obj',))
-
-    wvstart(get_disposition + ' --new-tag, tree tag')
-    for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
-        exr = run_get(get_disposition, b'--new-tag', (item, b'.tag/obj'))
-        wvpasseq(0, exr.rc)        
-        validate_tree(subtree_id, subtree_id)
-        verify_only_refs(heads=[], tags=(b'obj',))
-        
-    wvstart(get_disposition + ' --new-tag, committish tag')
-    for item in (b'.tag/commit-2', b'src/latest', b'src'):
-        exr = run_get(get_disposition, b'--new-tag', (item, b'.tag/obj'))
-        wvpasseq(0, exr.rc)        
-        validate_tagged_save(b'obj', getcwd() + b'/src/', commit_2_id, tree_2_id,
-                             b'src-2', exr.out)
-        verify_only_refs(heads=[], tags=(b'obj',))
-
-    # Anything to existing tag (fails).
-    for ex_type, ex_tag in (('blob', (b'.tag/tinyfile', b'.tag/obj')),
-                            ('tree', (b'.tag/tree-1', b'.tag/obj')),
-                            ('commit', (b'.tag/commit-1', b'.tag/obj'))):
-        for item_type, item in (('blob tag', b'.tag/tinyfile'),
-                                ('blob path', b'src/latest' + tinyfile_path),
-                                ('tree tag', b'.tag/subtree'),
-                                ('tree path', b'src/latest' + subtree_vfs_path),
-                                ('commit tag', b'.tag/commit-2'),
-                                ('save', b'src/latest'),
-                                ('branch', b'src')):
-            wvstart(get_disposition + ' --new-tag of ' + item_type
-                    + ', given existing ' + ex_type + ' tag, fails')
-            exr = run_get(get_disposition, b'--new-tag', (item, b'.tag/obj'),
-                          given=ex_tag)
-            wvpassne(0, exr.rc)
-            verify_rx(br'cannot overwrite existing tag .* \(requires --replace\)',
-                      exr.err)
-
-    # Anything to branch (fails).
-    for ex_type, ex_tag in (('nothing', None),
-                            ('blob', (b'.tag/tinyfile', b'.tag/obj')),
-                            ('tree', (b'.tag/tree-1', b'.tag/obj')),
-                            ('commit', (b'.tag/commit-1', b'.tag/obj'))):
-        for item_type, item in (('blob tag', b'.tag/tinyfile'),
-                ('blob path', b'src/latest' + tinyfile_path),
-                ('tree tag', b'.tag/subtree'),
-                ('tree path', b'src/latest' + subtree_vfs_path),
-                ('commit tag', b'.tag/commit-2'),
-                ('save', b'src/latest'),
-                ('branch', b'src')):
-            wvstart(get_disposition + ' --new-tag to branch of ' + item_type
-                    + ', given existing ' + ex_type + ' tag, fails')
-            exr = run_get(get_disposition, b'--new-tag', (item, b'obj'),
-                          given=ex_tag)
-            wvpassne(0, exr.rc)
-            verify_rx(br'destination for .+ must be a VFS tag', exr.err)
-
-    wvstart(get_disposition + ' --new-tag, implicit destinations')
-    exr = run_get(get_disposition, b'--new-tag', b'.tag/commit-2')
-    wvpasseq(0, exr.rc)        
-    validate_tagged_save(b'commit-2', getcwd() + b'/src/', commit_2_id, tree_2_id,
-                         b'src-2', exr.out)
-    verify_only_refs(heads=[], tags=(b'commit-2',))
-
-def test_unnamed(get_disposition, src_info):
-    tinyfile_id = src_info['tinyfile-id']
-    tinyfile_path = src_info['tinyfile-path']
-    subtree_vfs_path = src_info['subtree-vfs-path']
-    wvstart(get_disposition + ' --unnamed to root fails')
-    for item in (b'.tag/tinyfile',
-                 b'src/latest' + tinyfile_path,
-                 b'.tag/subtree',
-                 b'src/latest' + subtree_vfs_path,
-                 b'.tag/commit-1',
-                 b'src/latest',
-                 b'src'):
-        for ex_ref in (None, (item, b'.tag/obj')):
-            exr = run_get(get_disposition, b'--unnamed', (item, b'/'),
-                          given=ex_ref)
-            wvpassne(0, exr.rc)
-            verify_rx(br'usage: bup get ', exr.err)
-
-    wvstart(get_disposition + ' --unnamed file')
-    for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
-        exr = run_get(get_disposition, b'--unnamed', item)
-        wvpasseq(0, exr.rc)        
-        validate_blob(tinyfile_id, tinyfile_id)
-        verify_only_refs(heads=[], tags=[])
-
-        exr = run_get(get_disposition, b'--unnamed', item,
-                      given=(item, b'.tag/obj'))
-        wvpasseq(0, exr.rc)        
-        validate_blob(tinyfile_id, tinyfile_id)
-        verify_only_refs(heads=[], tags=(b'obj',))
-
-    wvstart(get_disposition + ' --unnamed tree')
-    subtree_id = src_info['subtree-id']
-    for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
-        exr = run_get(get_disposition, b'--unnamed', item)
-        wvpasseq(0, exr.rc)        
-        validate_tree(subtree_id, subtree_id)
-        verify_only_refs(heads=[], tags=[])
-        
-        exr = run_get(get_disposition, b'--unnamed', item,
-                      given=(item, b'.tag/obj'))
-        wvpasseq(0, exr.rc)        
-        validate_tree(subtree_id, subtree_id)
-        verify_only_refs(heads=[], tags=(b'obj',))
-        
-    wvstart(get_disposition + ' --unnamed committish')
-    save_2 = src_info['save-2']
-    commit_2_id = src_info['commit-2-id']
-    for item in (b'.tag/commit-2', b'src/' + save_2, b'src'):
-        exr = run_get(get_disposition, b'--unnamed', item)
-        wvpasseq(0, exr.rc)        
-        validate_commit(commit_2_id, commit_2_id)
-        verify_only_refs(heads=[], tags=[])
-
-        exr = run_get(get_disposition, b'--unnamed', item,
-                      given=(item, b'.tag/obj'))
-        wvpasseq(0, exr.rc)        
-        validate_commit(commit_2_id, commit_2_id)
-        verify_only_refs(heads=[], tags=(b'obj',))
-
-def create_get_src():
-    global bup_cmd, src_info
-    wvstart('preparing')
-    ex((bup_cmd, b'-d', b'get-src', b'init'))
-
-    mkdir(b'src')
-    open(b'src/unrelated', 'a').close()
-    ex((bup_cmd, b'-d', b'get-src', b'index', b'src'))
-    ex((bup_cmd, b'-d', b'get-src', b'save', b'-tcn', b'unrelated-branch', b'src'))
-
-    ex((bup_cmd, b'-d', b'get-src', b'index', b'--clear'))
-    rmrf(b'src')
-    mkdir(b'src')
-    open(b'src/zero', 'a').close()
-    ex((bup_cmd, b'-d', b'get-src', b'index', b'src'))
-    exr = exo((bup_cmd, b'-d', b'get-src', b'save', b'-tcn', b'src', b'src'))
-    out = exr.out.splitlines()
-    tree_0_id = out[0]
-    commit_0_id = out[-1]
-    exr = exo((bup_cmd, b'-d', b'get-src', b'ls', b'src'))
-    save_0 = exr.out.splitlines()[0]
-    ex((b'git', b'--git-dir', b'get-src', b'branch', b'src-0', b'src'))
-    ex((b'cp', b'-RPp', b'src', b'src-0'))
-    
-    rmrf(b'src')
-    mkdir(b'src')
-    mkdir(b'src/x')
-    mkdir(b'src/x/y')
-    ex((bup_cmd + b' -d get-src random 1k > src/1'), shell=True)
-    ex((bup_cmd + b' -d get-src random 1k > src/x/2'), shell=True)
-    ex((bup_cmd, b'-d', b'get-src', b'index', b'src'))
-    exr = exo((bup_cmd, b'-d', b'get-src', b'save', b'-tcn', b'src', b'src'))
-    out = exr.out.splitlines()
-    tree_1_id = out[0]
-    commit_1_id = out[-1]
-    exr = exo((bup_cmd, b'-d', b'get-src', b'ls', b'src'))
-    save_1 = exr.out.splitlines()[1]
-    ex((b'git', b'--git-dir', b'get-src', b'branch', b'src-1', b'src'))
-    ex((b'cp', b'-RPp', b'src', b'src-1'))
-    
-    # Make a copy the current state of src so we'll have an ancestor.
-    ex((b'cp', b'-RPp',
-         b'get-src/refs/heads/src', b'get-src/refs/heads/src-ancestor'))
-
-    with open(b'src/tiny-file', 'ab') as f: f.write(b'xyzzy')
-    ex((bup_cmd, b'-d', b'get-src', b'index', b'src'))
-    ex((bup_cmd, b'-d', b'get-src', b'tick'))  # Ensure the save names differ
-    exr = exo((bup_cmd, b'-d', b'get-src', b'save', b'-tcn', b'src', b'src'))
-    out = exr.out.splitlines()
-    tree_2_id = out[0]
-    commit_2_id = out[-1]
-    exr = exo((bup_cmd, b'-d', b'get-src', b'ls', b'src'))
-    save_2 = exr.out.splitlines()[2]
-    rename(b'src', b'src-2')
-
-    src_root = getcwd() + b'/src'
-
-    subtree_path = b'src-2/x'
-    subtree_vfs_path = src_root + b'/x'
-
-    # No support for "ls -d", so grep...
-    exr = exo((bup_cmd, b'-d', b'get-src', b'ls', b'-s', b'src/latest' + src_root))
-    out = exr.out.splitlines()
-    subtree_id = None
-    for line in out:
-        if b'x' in line:
-            subtree_id = line.split()[0]
-    assert(subtree_id)
-
-    # With a tiny file, we'll get a single blob, not a chunked tree
-    tinyfile_path = src_root + b'/tiny-file'
-    exr = exo((bup_cmd, b'-d', b'get-src', b'ls', b'-s', b'src/latest' + tinyfile_path))
-    tinyfile_id = exr.out.splitlines()[0].split()[0]
-
-    ex((bup_cmd, b'-d', b'get-src', b'tag', b'tinyfile', tinyfile_id))
-    ex((bup_cmd, b'-d', b'get-src', b'tag', b'subtree', subtree_id))
-    ex((bup_cmd, b'-d', b'get-src', b'tag', b'tree-0', tree_0_id))
-    ex((bup_cmd, b'-d', b'get-src', b'tag', b'tree-1', tree_1_id))
-    ex((bup_cmd, b'-d', b'get-src', b'tag', b'tree-2', tree_2_id))
-    ex((bup_cmd, b'-d', b'get-src', b'tag', b'commit-0', commit_0_id))
-    ex((bup_cmd, b'-d', b'get-src', b'tag', b'commit-1', commit_1_id))
-    ex((bup_cmd, b'-d', b'get-src', b'tag', b'commit-2', commit_2_id))
-    ex((b'git', b'--git-dir', b'get-src', b'branch', b'commit-1', commit_1_id))
-    ex((b'git', b'--git-dir', b'get-src', b'branch', b'commit-2', commit_2_id))
-
-    return {'tinyfile-path' : tinyfile_path,
-            'tinyfile-id' : tinyfile_id,
-            'subtree-id' : subtree_id,
-            'tree-0-id' : tree_0_id,
-            'tree-1-id' : tree_1_id,
-            'tree-2-id' : tree_2_id,
-            'commit-0-id' : commit_0_id,
-            'commit-1-id' : commit_1_id,
-            'commit-2-id' : commit_2_id,
-            'save-1' : save_1,
-            'save-2' : save_2,
-            'subtree-path' : subtree_path,
-            'subtree-vfs-path' : subtree_vfs_path}
-    
-# FIXME: this fails in a strange way:
-#   WVPASS given nothing get --ff not-there
-
-dispositions_to_test = ('get',)
-
-if int(environ.get(b'BUP_TEST_LEVEL', b'0')) >= 11:
-    dispositions_to_test += ('get-on', 'get-to')
-
-if len(compat.argv) == 1:
-    categories = ('replace', 'universal', 'ff', 'append', 'pick', 'new-tag',
-             'unnamed')
-else:
-    categories = compat.argv[1:]
-    
-with test_tempdir(b'get-') as tmpdir:
-    chdir(tmpdir)
-    try:
-        src_info = create_get_src()
-        for category in categories:
-            for disposition in dispositions_to_test:
-                # given=FOO depends on --replace, so test it early
-                if category == 'replace':
-                    test_replace(disposition, src_info)
-                elif category == 'universal':
-                    test_universal_behaviors(disposition)
-                elif category == 'ff':
-                    test_ff(disposition, src_info)
-                elif category == 'append':
-                    test_append(disposition, src_info)
-                elif category == 'pick':
-                    test_pick(disposition, src_info, force=False)
-                    test_pick(disposition, src_info, force=True)
-                elif category == 'new-tag':
-                    test_new_tag(disposition, src_info)
-                elif category == 'unnamed':
-                    test_unnamed(disposition, src_info)
-                else:
-                    raise Exception('unrecognized get test category')
-    except Exception as ex:
-        chdir(top)
-        raise
-    chdir(top)
-
-wvmsg('checked %d cases' % get_cases_tested)
diff --git a/t/test-help b/t/test-help
deleted file mode 100755 (executable)
index 56806a7..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-# FIXME: send help to stdout if requested (exit 0), stderr on error
-# (exit nonzero)
-
-bup -?
-rc=$?
-WVPASSEQ 99 "$rc"
-
-bup --help
-rc=$?
-WVPASSEQ 99 "$rc"
-
-if ! test -e Documentation/bup-save.1; then
-    WVPASS rm -rf "$tmpdir"
-    exit 0
-fi
-
-mkdir -p "$tmpdir/man"
-(cd "$tmpdir/man" && ln -s "$top/Documentation" man1)
-export MANPATH="$tmpdir/man"
-
-WVPASS bup help save
-WVPASS bup save --help
-WVPASSEQ 1 $(bup help save | head -1 | grep -cF 'bup-save(1)')
-WVPASSEQ 1 $(bup save --help | head -1 | grep -cF 'bup-save(1)')
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-import-duplicity.sh b/t/test-import-duplicity.sh
deleted file mode 100755 (executable)
index 593e565..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-
-set -o pipefail
-
-if ! [ "$(type -p duplicity)" != "" ]; then
-    # FIXME: add WVSKIP.
-    echo "Cannot find duplicity; skipping test)" 1>&2
-    exit 0
-fi
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-bup() { "$top/bup" "$@"; }
-dup() { duplicity --archive-dir "$tmpdir/dup-cache" "$@"; }
-
-WVSTART "import-duplicity"
-WVPASS "$top/t/sync-tree" "$top/t/sampledata/" "$tmpdir/src/"
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-export PASSPHRASE=bup_duplicity_passphrase
-
-WVPASS bup init
-WVPASS cd "$tmpdir"
-WVPASS mkdir duplicity
-WVPASS dup src file://duplicity
-WVPASS bup tick
-WVPASS touch src/new-file
-WVPASS dup src file://duplicity
-WVPASS bup import-duplicity "file://duplicity" import-duplicity
-WVPASSEQ $(bup ls import-duplicity/ | wc -l) 3
-WVPASSEQ "$(bup ls import-duplicity/latest/ | sort)" "$(ls src | sort)"
-WVPASS bup restore -C restore/ import-duplicity/latest/
-WVFAIL "$top/t/compare-trees" src/ restore/ > tmp-compare-trees
-WVPASSEQ $(cat tmp-compare-trees | wc -l) 4
-# Note: OS X rsync itemize output is currently only 9 chars, not 11.
-# FreeBSD may output 12 chars instead - accept 9-12
-# Expect something like this (without the leading spaces):
-#   .d..t...... ./
-#   .L..t...... abs-symlink -> /home/foo/bup/t/sampledata/var/abs-symlink-target
-#   .L..t...... b -> a
-#   .L..t...... c -> b
-expected_diff_rx='^\.d\.\.t\.{4,7} \./$|^\.L\.\.t\.{4,7} '
-if ! grep -qE "$expected_diff_rx" tmp-compare-trees; then
-    echo -n 'tmp-compare-trees: ' 1>&2
-    cat tmp-compare-trees 1>&2
-fi
-WVPASS grep -qE "$expected_diff_rx" tmp-compare-trees
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-import-rdiff-backup.sh b/t/test-import-rdiff-backup.sh
deleted file mode 100755 (executable)
index 359f081..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-if ! [ "$(type -p rdiff-backup)" != "" ]; then
-    # FIXME: add WVSKIP.
-    echo "Cannot find rdiff-backup; skipping test)" 1>&2
-    exit 0
-fi
-
-D=rdiff-backup.tmp
-WVSTART "import-rdiff-backup"
-WVPASS bup init
-WVPASS cd "$tmpdir"
-WVPASS mkdir rdiff-backup
-WVPASS rdiff-backup "$top/lib/cmd" rdiff-backup
-WVPASS bup tick
-WVPASS rdiff-backup "$top/Documentation" rdiff-backup
-WVPASS bup import-rdiff-backup rdiff-backup import-rdiff-backup
-WVPASSEQ $(bup ls import-rdiff-backup/ | wc -l) 3
-WVPASSEQ "$(bup ls -A import-rdiff-backup/latest/ | sort)" \
-    "$(ls -A "$top/Documentation" | sort)"
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-index-check-device.sh b/t/test-index-check-device.sh
deleted file mode 100755 (executable)
index 88a966a..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. ./t/lib.sh || exit $?
-
-set -o pipefail
-
-root_status="$(t/root-status)" || exit $?
-
-if [ "$root_status" != root ]; then
-    echo 'Not root: skipping --check-device tests.'
-    exit 0 # FIXME: add WVSKIP.
-fi
-
-if test -n "$(type -p modprobe)" && ! modprobe loop; then
-    echo 'Unable to load loopback module; skipping --check-device test.' 1>&2
-    exit 0
-fi
-
-if test -z "$(type -p losetup)"; then
-    echo 'Unable to find losetup: skipping --check-device tests.' 1>&2
-    exit 0 # FIXME: add WVSKIP.
-fi
-
-if test -z "$(type -p mke2fs)"; then
-    echo 'Unable to find mke2fs: skipping --check-device tests.' 1>&2
-    exit 0 # FIXME: add WVSKIP.
-fi
-
-WVSTART '--check-device'
-
-top="$(pwd)"
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-srcmnt="$(WVPASS wvmkmountpt)" || exit $?
-tmpmnt1="$(WVPASS wvmkmountpt)" || exit $?
-tmpmnt2="$(WVPASS wvmkmountpt)" || exit $?
-
-WVPASS cd "$tmpdir"
-
-WVPASS dd if=/dev/zero of=testfs.img bs=1M count=32
-WVPASS mke2fs -F -j -m 0 testfs.img
-WVPASS mount -o loop testfs.img "$tmpmnt1"
-# Hide, so that tests can't create risks.
-WVPASS chown root:root "$tmpmnt1"
-WVPASS chmod 0700 "$tmpmnt1"
-
-# Create trivial content.
-WVPASS date > "$tmpmnt1/foo"
-WVPASS umount "$tmpmnt1"
-
-# Mount twice, so we'll have the same content with different devices.
-WVPASS cp -pP testfs.img testfs2.img
-WVPASS mount -oro,loop testfs.img "$tmpmnt1"
-WVPASS mount -oro,loop testfs2.img "$tmpmnt2"
-
-# Test default behavior: --check-device.
-WVPASS mount -oro --bind "$tmpmnt1" "$srcmnt"
-WVPASS bup init
-WVPASS bup index --fake-valid "$srcmnt"
-WVPASS umount "$srcmnt"
-WVPASS mount -oro --bind "$tmpmnt2" "$srcmnt"
-WVPASS bup index "$srcmnt"
-WVPASSEQ "$(bup index --status "$srcmnt")" \
-"M $srcmnt/lost+found/
-M $srcmnt/foo
-M $srcmnt/"
-WVPASS umount "$srcmnt"
-
-WVSTART '--no-check-device'
-WVPASS mount -oro --bind "$tmpmnt1" "$srcmnt"
-WVPASS bup index --clear
-WVPASS bup index --fake-valid "$srcmnt"
-WVPASS umount "$srcmnt"
-WVPASS mount -oro --bind "$tmpmnt2" "$srcmnt"
-WVPASS bup index --no-check-device "$srcmnt"
-WVPASS bup index --status "$srcmnt"
-WVPASSEQ "$(bup index --status "$srcmnt")" \
-"  $srcmnt/lost+found/
-  $srcmnt/foo
-  $srcmnt/"
-
-WVPASS umount "$srcmnt"
-WVPASS umount "$tmpmnt1"
-WVPASS umount "$tmpmnt2"
-WVPASS rm -r "$tmpmnt1" "$tmpmnt2" "$tmpdir"
diff --git a/t/test-index-clear.sh b/t/test-index-clear.sh
deleted file mode 100755 (executable)
index 05cd848..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-
-WVPASS bup init
-WVPASS cd "$tmpdir"
-
-
-WVSTART "index --clear"
-WVPASS mkdir src
-WVPASS touch src/foo src/bar
-WVPASS bup index -u src
-WVPASSEQ "$(bup index -p)" "src/foo
-src/bar
-src/
-./"
-WVPASS rm src/foo
-WVPASS bup index --clear
-WVPASS bup index -u src
-expected="$(WVPASS bup index -p)" || exit $?
-WVPASSEQ "$expected" "src/bar
-src/
-./"
-
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-index.sh b/t/test-index.sh
deleted file mode 100755 (executable)
index f714f73..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-#!/usr/bin/env bash
-. wvtest.sh
-. wvtest-bup.sh
-. t/lib.sh
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS cd "$tmpdir"
-
-WVPASS bup init
-
-WVSTART "index"
-D=bupdata.tmp
-WVPASS force-delete $D
-WVPASS mkdir $D
-WVFAIL bup index --exclude-from $D/cannot-exist $D
-WVPASSEQ "$(bup index --check -p)" ""
-WVPASSEQ "$(bup index --check -p $D)" ""
-WVFAIL [ -e $D.fake ]
-WVFAIL bup index --check -u $D.fake
-WVPASS bup index --check -u $D
-WVPASSEQ "$(bup index --check -p $D)" "$D/"
-WVPASS touch $D/a
-WVPASS bup random 128k >$D/b
-WVPASS mkdir $D/d $D/d/e
-WVPASS bup random 512 >$D/f
-WVPASS ln -s non-existent-file $D/g
-WVPASSEQ "$(bup index -s $D/)" "A $D/"
-WVPASSEQ "$(bup index -s $D/b)" ""
-WVPASSEQ "$(bup index --check -us $D/b)" "A $D/b"
-WVPASSEQ "$(bup index --check -us $D/b $D/d)" \
-"A $D/d/e/
-A $D/d/
-A $D/b"
-WVPASS touch $D/d/z
-WVPASS bup tick
-WVPASSEQ "$(bup index --check -usx $D)" \
-"A $D/g
-A $D/f
-A $D/d/z
-A $D/d/e/
-A $D/d/
-A $D/b
-A $D/a
-A $D/"
-WVPASSEQ "$(bup index --check -us $D/a $D/b --fake-valid)" \
-"  $D/b
-  $D/a"
-WVPASSEQ "$(bup index --check -us $D/a)" "  $D/a"  # stays unmodified
-WVPASSEQ "$(bup index --check -us $D/d --fake-valid)" \
-"  $D/d/z
-  $D/d/e/
-  $D/d/"
-WVPASS touch $D/d/z
-WVPASS bup index -u $D/d/z  # becomes modified
-WVPASSEQ "$(bup index -s $D/a $D $D/b)" \
-"A $D/g
-A $D/f
-M $D/d/z
-  $D/d/e/
-M $D/d/
-  $D/b
-  $D/a
-A $D/"
-
-WVPASS bup index -u $D/d/e $D/a --fake-invalid
-WVPASSEQ "$(cd $D && bup index -m .)" \
-"./g
-./f
-./d/z
-./d/e/
-./d/
-./a
-./"
-WVPASSEQ "$(cd $D && bup index -m)" \
-"g
-f
-d/z
-d/e/
-d/
-a
-./"
-WVPASSEQ "$(cd $D && bup index -s .)" "$(cd $D && bup index -s .)"
-
-WVFAIL bup save -t $D/doesnt-exist-filename
-
-WVPASS mv "$BUP_DIR/bupindex" "$BUP_DIR/bi.old"
-WVFAIL bup save -t $D/d/e/fifotest
-WVPASS mkfifo $D/d/e/fifotest
-WVPASS bup index -u $D/d/e/fifotest
-WVPASS bup save -t $D/d/e/fifotest
-WVPASS bup save -t $D/d/e
-WVPASS rm -f $D/d/e/fifotest
-WVPASS bup index -u $D/d/e
-WVFAIL bup save -t $D/d/e/fifotest
-WVPASS mv "$BUP_DIR/bi.old" "$BUP_DIR/bupindex"
-
-WVPASS bup index -u $D/d/e
-WVPASS bup save -t $D/d/e
-WVPASSEQ "$(cd $D && bup index -m)" \
-"g
-f
-d/z
-d/
-a
-./"
-WVPASS bup save -t $D/d
-WVPASS bup index --fake-invalid $D/d/z
-WVPASS bup save -t $D/d/z
-WVPASS bup save -t $D/d/z  # test regenerating trees when no files are changed
-WVPASS bup save -t $D/d
-WVPASSEQ "$(cd $D && bup index -m)" \
-"g
-f
-a
-./"
-WVPASS bup save -r ":$BUP_DIR" -n r-test $D
-WVFAIL bup save -r ":$BUP_DIR/fake/path" -n r-test $D
-WVFAIL bup save -r ":$BUP_DIR" -n r-test $D/fake/path
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-list-idx.sh b/t/test-list-idx.sh
deleted file mode 100755 (executable)
index 276416f..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/usr/bin/env bash
-. wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-TOP="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-
-bup()
-{
-    "$TOP/bup" "$@"
-}
-
-WVSTART 'bup list-idx'
-
-WVPASS bup init
-WVPASS cd "$tmpdir"
-WVPASS mkdir src
-WVPASS bup random 1k > src/data
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS bup list-idx "$BUP_DIR"/objects/pack/*.idx
-hash1="$(WVPASS bup list-idx "$BUP_DIR"/objects/pack/*.idx)" || exit $?
-hash1="${hash1##* }"
-WVPASS bup list-idx --find "${hash1}" "$BUP_DIR"/objects/pack/*.idx \
-       > list-idx.log || exit $?
-found="$(cat list-idx.log)" || exit $?
-found="${found##* }"
-WVPASSEQ "$found" "$hash1"
-WVPASSEQ "$(wc -l < list-idx.log | tr -d ' ')" 1
-
-WVPASS rm -r "$tmpdir"
diff --git a/t/test-ls b/t/test-ls
deleted file mode 100755 (executable)
index 23e15d7..0000000
--- a/t/test-ls
+++ /dev/null
@@ -1,297 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-if test "$BUP_TEST_REMOTE_REPO"; then
-    ls_cmd_desc='ls -r'
-else
-    ls_cmd_desc='ls'
-fi
-    
-bup() { "$top/bup" "$@"; }
-
-bup-ls() {
-    if test "$BUP_TEST_REMOTE_REPO"; then
-        "$top/bup" ls -r "$BUP_DIR" "$@"
-    else
-        "$top/bup" ls "$@"
-    fi
-}
-
-
-export TZ=UTC
-
-WVPASS bup init
-WVPASS cd "$tmpdir"
-
-WVPASS mkdir src
-WVPASS touch src/.dotfile src/executable
-WVPASS mkfifo src/fifo
-WVPASS "$top"/t/mksock src/socket
-WVPASS bup random 1k > src/file
-WVPASS chmod u+x src/executable
-WVPASS chmod -R u=rwX,g-rwx,o-rwx .
-WVPASS touch -t 200910032348 src/.dotfile src/*
-(WVPASS cd src; WVPASS ln -s file symlink) || exit $?
-(WVPASS cd src; WVPASS ln -s not-there bad-symlink) || exit $?
-WVPASS touch -t 200910032348 src
-WVPASS touch -t 200910032348 .
-WVPASS bup index src
-# Include two saves to test multiple results per ref from rev_list.
-WVPASS bup save -n src -d 242312159 --strip src
-WVPASS bup save -n src -d 242312160 --strip src
-WVPASS bup tag some-tag src
-
-uid="$(WVPASS id -u)" || exit $?
-gid="$(WVPASS bup-cfg-py -c 'import os; print(os.stat("src").st_gid)')" || exit $?
-user="$(WVPASS id -un)" || exit $?
-group="$(WVPASS bup-cfg-py -c 'import grp, os;
-print(grp.getgrgid(os.stat("src").st_gid)[0])')" || exit $?
-src_commit_hash=$(git log --format=%H -n1 src)
-src_tree_hash=$(git log --format=%T -n1 src)
-
-
-WVSTART "$ls_cmd_desc (short)"
-
-(export BUP_FORCE_TTY=1; WVPASSEQ "$(WVPASS bup-ls | tr -d ' ')" src)
-
-WVPASSEQ "$(WVPASS bup-ls /)" "src"
-
-WVPASSEQ "$(WVPASS bup-ls -A /)" ".tag
-src"
-
-WVPASSEQ "$(WVPASS bup-ls -AF /)" ".tag/
-src/"
-
-WVPASSEQ "$(WVPASS bup-ls -a /)" ".
-..
-.tag
-src"
-
-WVPASSEQ "$(WVPASS bup-ls -aF /)" "./
-../
-.tag/
-src/"
-
-WVPASSEQ "$(WVPASS bup-ls /.tag)" "some-tag"
-
-WVPASSEQ "$(WVPASS bup-ls /src)" \
-"1977-09-05-125559
-1977-09-05-125600
-latest"
-
-WVPASSEQ "$(WVPASS bup-ls src/latest)" "bad-symlink
-executable
-fifo
-file
-socket
-symlink"
-
-WVPASSEQ "$(WVPASS bup-ls -A src/latest)" ".dotfile
-bad-symlink
-executable
-fifo
-file
-socket
-symlink"
-
-WVPASSEQ "$(WVPASS bup-ls -a src/latest)" ".
-..
-.dotfile
-bad-symlink
-executable
-fifo
-file
-socket
-symlink"
-
-WVPASSEQ "$(WVPASS bup-ls -F src/latest)" "bad-symlink@
-executable*
-fifo|
-file
-socket=
-symlink@"
-
-WVPASSEQ "$(WVPASS bup-ls --file-type src/latest)" "bad-symlink@
-executable
-fifo|
-file
-socket=
-symlink@"
-
-WVPASSEQ "$(WVPASS bup-ls -d src/latest)" "src/latest"
-
-
-WVSTART "$ls_cmd_desc (long)"
-
-WVPASSEQ "$(WVPASS bup-ls -l / | tr -s ' ' ' ')" \
-"drwx------ $user/$group 0 2009-10-03 23:48 src"
-
-WVPASSEQ "$(WVPASS bup-ls -lA / | tr -s ' ' ' ')" \
-"drwxr-xr-x ?/? 0 1970-01-01 00:00 .tag
-drwx------ $user/$group 0 2009-10-03 23:48 src"
-
-WVPASSEQ "$(WVPASS bup-ls -lAF / | tr -s ' ' ' ')" \
-"drwxr-xr-x ?/? 0 1970-01-01 00:00 .tag/
-drwx------ $user/$group 0 2009-10-03 23:48 src/"
-
-WVPASSEQ "$(WVPASS bup-ls -la / | tr -s ' ' ' ')" \
-"drwxr-xr-x ?/? 0 1970-01-01 00:00 .
-drwxr-xr-x ?/? 0 1970-01-01 00:00 ..
-drwxr-xr-x ?/? 0 1970-01-01 00:00 .tag
-drwx------ $user/$group 0 2009-10-03 23:48 src"
-
-WVPASSEQ "$(WVPASS bup-ls -laF / | tr -s ' ' ' ')" \
-"drwxr-xr-x ?/? 0 1970-01-01 00:00 ./
-drwxr-xr-x ?/? 0 1970-01-01 00:00 ../
-drwxr-xr-x ?/? 0 1970-01-01 00:00 .tag/
-drwx------ $user/$group 0 2009-10-03 23:48 src/"
-
-socket_mode="$(WVPASS ls -l src/socket | cut -b -10)" || exit $?
-
-
-bad_symlink_mode="$(WVPASS ls -l src/bad-symlink | cut -b -10)" || exit $?
-
-bad_symlink_bup_info="$(WVPASS bup-ls -l src/latest | grep bad-symlink)" \
-    || exit $?
-bad_symlink_date="$(WVPASS echo "$bad_symlink_bup_info" \
-  | WVPASS perl -ne 'm/.*? (\d+) (\d\d\d\d-\d\d-\d\d \d\d:\d\d)/ and print $2')" \
-    || exit $?
-
-test "$bad_symlink_date" || exit 1
-
-if test "$(uname -s)" != NetBSD; then
-    bad_symlink_size="$(WVPASS bup-cfg-py -c "import os
-print(os.lstat('src/bad-symlink').st_size)")" || exit $?
-else
-    # NetBSD appears to return varying sizes, so for now, just ignore it.
-    bad_symlink_size="$(WVPASS echo "$bad_symlink_bup_info" \
-      | WVPASS perl -ne 'm/.*? (\d+) (\d\d\d\d-\d\d-\d\d \d\d:\d\d)/ and print $1')" \
-        || exit $?
-fi
-
-
-symlink_mode="$(WVPASS ls -l src/symlink | cut -b -10)" || exit $?
-
-symlink_bup_info="$(WVPASS bup-ls -l src/latest | grep -E '[^-]symlink')" \
-    || exit $?
-symlink_date="$(WVPASS echo "$symlink_bup_info" \
-  | WVPASS perl -ne 'm/.*? (\d+) (\d\d\d\d-\d\d-\d\d \d\d:\d\d)/ and print $2')" \
-    || exit $?
-
-test "$symlink_date" || exit 1
-
-if test "$(uname -s)" != NetBSD; then
-    symlink_size="$(WVPASS bup-cfg-py -c "import os
-print(os.lstat('src/symlink').st_size)")" || exit $?
-else
-    # NetBSD appears to return varying sizes, so for now, just ignore it.
-    symlink_size="$(WVPASS echo "$symlink_bup_info" \
-      | WVPASS perl -ne 'm/.*? (\d+) (\d\d\d\d-\d\d-\d\d \d\d:\d\d)/ and print $1')" \
-        || exit $?
-fi
-
-WVPASSEQ "$(bup-ls -l src/latest | tr -s ' ' ' ')" \
-"$bad_symlink_mode $user/$group $bad_symlink_size $bad_symlink_date bad-symlink -> not-there
--rwx------ $user/$group 0 2009-10-03 23:48 executable
-prw------- $user/$group 0 2009-10-03 23:48 fifo
--rw------- $user/$group 1024 2009-10-03 23:48 file
-$socket_mode $user/$group 0 2009-10-03 23:48 socket
-$symlink_mode $user/$group $symlink_size $symlink_date symlink -> file"
-
-WVPASSEQ "$(bup-ls -la src/latest | tr -s ' ' ' ')" \
-"drwx------ $user/$group 0 2009-10-03 23:48 .
-drwx------ $user/$group 0 2009-10-03 23:48 ..
--rw------- $user/$group 0 2009-10-03 23:48 .dotfile
-$bad_symlink_mode $user/$group $bad_symlink_size $bad_symlink_date bad-symlink -> not-there
--rwx------ $user/$group 0 2009-10-03 23:48 executable
-prw------- $user/$group 0 2009-10-03 23:48 fifo
--rw------- $user/$group 1024 2009-10-03 23:48 file
-$socket_mode $user/$group 0 2009-10-03 23:48 socket
-$symlink_mode $user/$group $symlink_size $symlink_date symlink -> file"
-
-WVPASSEQ "$(bup-ls -lA src/latest | tr -s ' ' ' ')" \
-"-rw------- $user/$group 0 2009-10-03 23:48 .dotfile
-$bad_symlink_mode $user/$group $bad_symlink_size $bad_symlink_date bad-symlink -> not-there
--rwx------ $user/$group 0 2009-10-03 23:48 executable
-prw------- $user/$group 0 2009-10-03 23:48 fifo
--rw------- $user/$group 1024 2009-10-03 23:48 file
-$socket_mode $user/$group 0 2009-10-03 23:48 socket
-$symlink_mode $user/$group $symlink_size $symlink_date symlink -> file"
-
-WVPASSEQ "$(bup-ls -lF src/latest | tr -s ' ' ' ')" \
-"$bad_symlink_mode $user/$group $bad_symlink_size $bad_symlink_date bad-symlink@ -> not-there
--rwx------ $user/$group 0 2009-10-03 23:48 executable*
-prw------- $user/$group 0 2009-10-03 23:48 fifo|
--rw------- $user/$group 1024 2009-10-03 23:48 file
-$socket_mode $user/$group 0 2009-10-03 23:48 socket=
-$symlink_mode $user/$group $symlink_size $symlink_date symlink@ -> file"
-
-WVPASSEQ "$(bup-ls -l --file-type src/latest | tr -s ' ' ' ')" \
-"$bad_symlink_mode $user/$group $bad_symlink_size $bad_symlink_date bad-symlink@ -> not-there
--rwx------ $user/$group 0 2009-10-03 23:48 executable
-prw------- $user/$group 0 2009-10-03 23:48 fifo|
--rw------- $user/$group 1024 2009-10-03 23:48 file
-$socket_mode $user/$group 0 2009-10-03 23:48 socket=
-$symlink_mode $user/$group $symlink_size $symlink_date symlink@ -> file"
-
-WVPASSEQ "$(bup-ls -ln src/latest | tr -s ' ' ' ')" \
-"$bad_symlink_mode $uid/$gid $bad_symlink_size $bad_symlink_date bad-symlink -> not-there
--rwx------ $uid/$gid 0 2009-10-03 23:48 executable
-prw------- $uid/$gid 0 2009-10-03 23:48 fifo
--rw------- $uid/$gid 1024 2009-10-03 23:48 file
-$socket_mode $uid/$gid 0 2009-10-03 23:48 socket
-$symlink_mode $uid/$gid $symlink_size $symlink_date symlink -> file"
-
-WVPASSEQ "$(bup-ls -ld "src/latest" | tr -s ' ' ' ')" \
-"lrwxr-xr-x ?/? 17 1970-01-01 00:00 src/latest -> 1977-09-05-125600"
-
-
-WVSTART "$ls_cmd_desc (backup set - long)"
-WVPASSEQ "$(bup-ls -l --numeric-ids src | cut -d' ' -f 1-2)" \
-"drwx------ $uid/$gid
-drwx------ $uid/$gid
-lrwxr-xr-x ?/?"
-
-WVPASSEQ "$(bup-ls -ds "src/1977-09-05-125600" | tr -s ' ' ' ')" \
-"$src_tree_hash src/1977-09-05-125600"
-
-WVPASSEQ "$(bup-ls -ds --commit-hash "src/1977-09-05-125600" | tr -s ' ' ' ')" \
-"$src_commit_hash src/1977-09-05-125600"
-
-
-WVSTART "$ls_cmd_desc (dates TZ != UTC)"
-export TZ=America/Chicago
-bad_symlink_date_central="$(bup-ls -l src/latest | grep bad-symlink)"
-bad_symlink_date_central="$(echo "$bad_symlink_date_central" \
-  | perl -ne 'm/.*? (\d+) (\d\d\d\d-\d\d-\d\d \d\d:\d\d)/ and print $2')"
-symlink_date_central="$(bup-ls -l src/latest | grep -E '[^-]symlink')"
-symlink_date_central="$(echo "$symlink_date_central" \
-  | perl -ne 'm/.*? (\d+) (\d\d\d\d-\d\d-\d\d \d\d:\d\d)/ and print $2')"
-WVPASSEQ "$(bup-ls -ln src/latest | tr -s ' ' ' ')" \
-"$bad_symlink_mode $uid/$gid $bad_symlink_size $bad_symlink_date_central bad-symlink -> not-there
--rwx------ $uid/$gid 0 2009-10-03 18:48 executable
-prw------- $uid/$gid 0 2009-10-03 18:48 fifo
--rw------- $uid/$gid 1024 2009-10-03 18:48 file
-$socket_mode $uid/$gid 0 2009-10-03 18:48 socket
-$symlink_mode $uid/$gid $symlink_size $symlink_date_central symlink -> file"
-export TZ=UTC
-
-
-WVSTART "$ls_cmd_desc bad-symlink"
-WVPASSEQ "$(bup-ls "src/latest/bad-symlink")" "src/latest/bad-symlink"
-
-WVSTART "$ls_cmd_desc -l bad-symlink"
-WVPASSEQ "$(bup-ls -l src/latest/bad-symlink | tr -s ' ' ' ')" \
-"$bad_symlink_mode $user/$group $bad_symlink_size $bad_symlink_date src/latest/bad-symlink -> not-there"
-
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-ls-remote b/t/test-ls-remote
deleted file mode 100755 (executable)
index 8b34caf..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env bash
-
-BUP_TEST_REMOTE_REPO=t t/test-ls
diff --git a/t/test-main.sh b/t/test-main.sh
deleted file mode 100755 (executable)
index 81c536b..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/env bash
-. wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-TOP="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-
-bup()
-{
-    "$TOP/bup" "$@"
-}
-
-WVSTART 'main'
-
-bup
-rc=$?
-WVPASSEQ "$rc" 99
-
-WVPASS rm -r "$tmpdir"
diff --git a/t/test-meta.sh b/t/test-meta.sh
deleted file mode 100755 (executable)
index d705c64..0000000
+++ /dev/null
@@ -1,783 +0,0 @@
-#!/usr/bin/env bash
-. wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-root_status="$(t/root-status)" || exit $?
-
-TOP="$(WVPASS pwd)" || exit $?
-export PATH="$TOP/t/bin:$PATH"
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-
-# Assume that mvmktempdir will always use the same dir.
-timestamp_resolutions="$(t/ns-timestamp-resolutions "$tmpdir/canary")" \
-    || exit $?
-atime_resolution="$(echo $timestamp_resolutions | WVPASS cut -d' ' -f 1)" \
-    || exit $?
-mtime_resolution="$(echo $timestamp_resolutions | WVPASS cut -d' ' -f 2)" \
-    || exit $?
-WVPASS rm "$tmpdir/canary"
-
-bup()
-{
-    "$TOP/bup" "$@"
-}
-
-hardlink-sets()
-{
-    "$TOP/t/hardlink-sets" "$@"
-}
-
-id-other-than()
-{
-    "$TOP/t/id-other-than" "$@"
-}
-
-# Very simple metadata tests -- create a test tree then check that bup
-# meta can reproduce the metadata correctly (according to bup xstat)
-# via create, extract, start-extract, and finish-extract.  The current
-# tests are crude, and this does not fully test devices, varying
-# users/groups, acls, attrs, etc.
-
-genstat()
-{
-    (
-        export PATH="$TOP/bin:$PATH" # pick up bup
-        bup version
-        # Skip atime (test elsewhere) to avoid the observer effect.
-        WVPASS find . -print0 | WVPASS sort-z \
-            | WVPASS xargs -0 bup xstat \
-            --mtime-resolution "$mtime_resolution"ns \
-            --exclude-fields ctime,atime,size
-    )
-}
-
-test-src-create-extract()
-{
-    # Test bup meta create/extract for ./src -> ./src-restore.
-    # Also writes to ./src-stat and ./src-restore-stat.
-    (
-        (WVPASS cd src; WVPASS genstat) > src-stat || exit $?
-        WVPASS bup meta --create --recurse --file src.meta src
-        # Test extract.
-        WVPASS force-delete src-restore
-        WVPASS mkdir src-restore
-        WVPASS cd src-restore
-        WVPASS bup meta --extract --file ../src.meta
-        WVPASS test -d src
-        (WVPASS cd src; WVPASS genstat >../../src-restore-stat) || exit $?
-        WVPASS diff -U5 ../src-stat ../src-restore-stat
-        # Test start/finish extract.
-        WVPASS force-delete src
-        WVPASS bup meta --start-extract --file ../src.meta
-        WVPASS test -d src
-        WVPASS bup meta --finish-extract --file ../src.meta
-        (WVPASS cd src; WVPASS genstat >../../src-restore-stat) || exit $?
-        WVPASS diff -U5 ../src-stat ../src-restore-stat
-    )
-}
-
-test-src-save-restore()
-{
-    # Test bup save/restore metadata for ./src -> ./src-restore.  Also
-    # writes to BUP_DIR.  Note that for now this just tests the
-    # restore below src/, in order to avoid having to worry about
-    # operations that require root (like chown /home).
-    (
-        WVPASS rm -rf "$BUP_DIR"
-        WVPASS bup init
-        WVPASS bup index src
-        WVPASS bup save -t -n src src
-        # Test extract.
-        WVPASS force-delete src-restore
-        WVPASS mkdir src-restore
-        WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
-        WVPASS test -d src-restore/src
-        WVPASS "$TOP/t/compare-trees" -c src/ src-restore/src/
-        WVPASS rm -rf src.bup
-    )
-}
-
-setup-test-tree()
-{
-    WVPASS "$TOP/t/sync-tree" "$TOP/t/sampledata/" "$tmpdir/src/"
-
-    # Add some hard links for the general tests.
-    (
-        WVPASS cd "$tmpdir"/src
-        WVPASS touch hardlink-target
-        WVPASS ln hardlink-target hardlink-1
-        WVPASS ln hardlink-target hardlink-2
-        WVPASS ln hardlink-target hardlink-3
-    ) || exit $?
-
-    # Add some trivial files for the index, modify, save tests.
-    (
-        WVPASS cd "$tmpdir"/src
-        WVPASS mkdir volatile
-        WVPASS touch volatile/{1,2,3}
-    ) || exit $?
-
-    # Regression test for metadata sort order.  Previously, these two
-    # entries would sort in the wrong order because the metadata
-    # entries were being sorted by mangled name, but the index isn't.
-    WVPASS dd if=/dev/zero of="$tmpdir"/src/foo bs=1k count=33
-    WVPASS touch -t 201111111111 "$tmpdir"/src/foo
-    WVPASS touch -t 201112121111 "$tmpdir"/src/foo-bar
-
-    t/mksock "$tmpdir"/src/test-socket || true
-}
-
-# Use the test tree to check bup meta.
-WVSTART 'meta --create/--extract'
-(
-    tmpdir="$(WVPASS wvmktempdir)" || exit $?
-    export BUP_DIR="$tmpdir/bup"
-    WVPASS setup-test-tree
-    WVPASS cd "$tmpdir"
-    WVPASS test-src-create-extract
-
-    # Test a top-level file (not dir).
-    WVPASS touch src-file
-    WVPASS bup meta -cf src-file.meta src-file
-    WVPASS mkdir dest
-    WVPASS cd dest
-    WVPASS bup meta -xf ../src-file.meta
-    WVPASS rm -r "$tmpdir"
-) || exit $?
-
-# Use the test tree to check bup save/restore metadata.
-WVSTART 'metadata save/restore (general)'
-(
-    tmpdir="$(WVPASS wvmktempdir)" || exit $?
-    export BUP_DIR="$tmpdir/bup"
-    WVPASS setup-test-tree
-    WVPASS cd "$tmpdir"
-    WVPASS test-src-save-restore
-
-    # Test a deeper subdir/ to make sure top-level non-dir metadata is
-    # restored correctly.  We need at least one dir and one non-dir at
-    # the "top-level".
-    WVPASS test -d src/var/cmd
-    WVPASS test -f src/var/cmd/save-cmd.py
-    WVPASS rm -rf "$BUP_DIR"
-    WVPASS bup init
-    WVPASS touch -t 201111111111 src-restore # Make sure the top won't match.
-    WVPASS bup index src
-    WVPASS bup save -t -n src src
-    WVPASS force-delete src-restore
-    WVPASS bup restore -C src-restore "/src/latest$(pwd)/src/var/."
-    WVPASS touch -t 201211111111 src-restore # Make sure the top won't match.
-    # Check that the only difference is the top dir.
-    WVFAIL $TOP/t/compare-trees -c src/var/ src-restore/ > tmp-compare-trees
-    WVPASSEQ $(cat tmp-compare-trees | wc -l) 1
-    # The number of rsync status characters varies, so accept any
-    # number of trailing dots.  For example OS X native rsync produces
-    # 9, but Homebrew's produces 12, while on other platforms, 11 is
-    # common.
-    expected_diff_rx='^\.d\.\.t\.\.\.(\.)+ \./$'
-    if ! grep -qE "$expected_diff_rx" tmp-compare-trees; then
-        echo -n 'tmp-compare-trees: ' 1>&2
-        cat tmp-compare-trees 1>&2
-    fi
-    WVPASS grep -qE "$expected_diff_rx" tmp-compare-trees
-    WVPASS rm -r "$tmpdir"
-) || exit $?
-
-# Test that we pull the index (not filesystem) metadata for any
-# unchanged files whenever we're saving other files in a given
-# directory.
-WVSTART 'metadata save/restore (using index metadata)'
-(
-    tmpdir="$(WVPASS wvmktempdir)" || exit $?
-    export BUP_DIR="$tmpdir/bup"
-    WVPASS setup-test-tree
-    WVPASS cd "$tmpdir"
-
-    # ...for now -- might be a problem with hardlink restores that was
-    # causing noise wrt this test.
-    WVPASS rm -rf src/hardlink*
-
-    # Pause here to keep the filesystem changes far enough away from
-    # the first index run that bup won't cap their index timestamps
-    # (see "bup help index" for more information).  Without this
-    # sleep, the compare-trees test below "Bup should *not* pick up
-    # these metadata..." may fail.
-    WVPASS sleep 1
-
-    WVPASS rm -rf "$BUP_DIR"
-    WVPASS bup init
-    WVPASS bup index src
-    WVPASS bup save -t -n src src
-
-    WVPASS force-delete src-restore-1
-    WVPASS mkdir src-restore-1
-    WVPASS bup restore -C src-restore-1 "/src/latest$(pwd)/"
-    WVPASS test -d src-restore-1/src
-    WVPASS "$TOP/t/compare-trees" -c src/ src-restore-1/src/
-
-    WVPASS echo "blarg" > src/volatile/1
-    WVPASS cp -pP src/volatile/1 src-restore-1/src/volatile/
-    WVPASS bup index src
-
-    # Bup should *not* pick up these metadata changes.
-    WVPASS touch src/volatile/2
-
-    WVPASS bup save -t -n src src
-
-    WVPASS force-delete src-restore-2
-    WVPASS mkdir src-restore-2
-    WVPASS bup restore -C src-restore-2 "/src/latest$(pwd)/"
-    WVPASS test -d src-restore-2/src
-    WVPASS "$TOP/t/compare-trees" -c src-restore-1/src/ src-restore-2/src/
-
-    WVPASS rm -r "$tmpdir"
-
-) || exit $?
-
-
-setup-hardlink-test()
-{
-    WVPASS rm -rf "$tmpdir/src" "$BUP_DIR"
-    WVPASS bup init
-    WVPASS mkdir "$tmpdir/src"
-}
-
-hardlink-test-run-restore()
-{
-    WVPASS force-delete src-restore
-    WVPASS mkdir src-restore
-    WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
-    WVPASS test -d src-restore/src
-}
-
-# Test hardlinks more carefully.
-WVSTART 'metadata save/restore (hardlinks)'
-(
-    tmpdir="$(WVPASS wvmktempdir)" || exit $?    
-    export BUP_DIR="$tmpdir/bup"
-
-    WVPASS setup-hardlink-test
-    WVPASS cd "$tmpdir"
-    
-    # Test trivial case - single hardlink.
-    (
-        WVPASS cd src
-        WVPASS touch hardlink-target
-        WVPASS ln hardlink-target hardlink-1
-    ) || exit $?
-    WVPASS bup index src
-    WVPASS bup save -t -n src src
-    WVPASS hardlink-test-run-restore
-    WVPASS "$TOP/t/compare-trees" -c src/ src-restore/src/
-
-    # Test the case where the hardlink hasn't changed, but the tree
-    # needs to be saved again. i.e. the save-cmd.py "if hashvalid:"
-    # case.
-    (
-        WVPASS cd src
-        WVPASS echo whatever > something-new
-    ) || exit $?
-    WVPASS bup index src
-    WVPASS bup save -t -n src src
-    WVPASS hardlink-test-run-restore
-    WVPASS "$TOP/t/compare-trees" -c src/ src-restore/src/
-
-    # Test hardlink changes between index runs.
-    #
-    WVPASS setup-hardlink-test
-    WVPASS cd src
-    WVPASS touch hardlink-target-a
-    WVPASS touch hardlink-target-b
-    WVPASS ln hardlink-target-a hardlink-b-1
-    WVPASS ln hardlink-target-a hardlink-a-1
-    WVPASS cd ..
-    WVPASS bup index -vv src
-    WVPASS rm src/hardlink-b-1
-    WVPASS ln src/hardlink-target-b src/hardlink-b-1
-    WVPASS bup index -vv src
-    WVPASS bup save -t -n src src
-    WVPASS hardlink-test-run-restore
-    WVPASS echo ./src/hardlink-a-1 > hardlink-sets.expected
-    WVPASS echo ./src/hardlink-target-a >> hardlink-sets.expected
-    WVPASS echo >> hardlink-sets.expected
-    WVPASS echo ./src/hardlink-b-1 >> hardlink-sets.expected
-    WVPASS echo ./src/hardlink-target-b >> hardlink-sets.expected
-    (WVPASS cd src-restore; WVPASS hardlink-sets .) > hardlink-sets.restored \
-        || exit $?
-    WVPASS diff -u hardlink-sets.expected hardlink-sets.restored
-
-    # Test hardlink changes between index and save -- hardlink set [a
-    # b c d] changes to [a b] [c d].  At least right now bup should
-    # notice and recreate the latter.
-    WVPASS setup-hardlink-test
-    WVPASS cd "$tmpdir"/src
-    WVPASS touch a
-    WVPASS ln a b
-    WVPASS ln a c
-    WVPASS ln a d
-    WVPASS cd ..
-    WVPASS bup index -vv src
-    WVPASS rm src/c src/d
-    WVPASS touch src/c
-    WVPASS ln src/c src/d
-    WVPASS bup save -t -n src src
-    WVPASS hardlink-test-run-restore
-    WVPASS echo ./src/a > hardlink-sets.expected
-    WVPASS echo ./src/b >> hardlink-sets.expected
-    WVPASS echo >> hardlink-sets.expected
-    WVPASS echo ./src/c >> hardlink-sets.expected
-    WVPASS echo ./src/d >> hardlink-sets.expected
-    (WVPASS cd src-restore; WVPASS hardlink-sets .) > hardlink-sets.restored \
-        || exit $?
-    WVPASS diff -u hardlink-sets.expected hardlink-sets.restored
-
-    # Test that we don't link outside restore tree.
-    WVPASS setup-hardlink-test
-    WVPASS cd "$tmpdir"
-    WVPASS mkdir src/a src/b
-    WVPASS touch src/a/1
-    WVPASS ln src/a/1 src/b/1
-    WVPASS bup index -vv src
-    WVPASS bup save -t -n src src
-    WVPASS force-delete src-restore
-    WVPASS mkdir src-restore
-    WVPASS bup restore -C src-restore "/src/latest$(pwd)/src/a/"
-    WVPASS test -e src-restore/1
-    WVPASS echo -n > hardlink-sets.expected
-    (WVPASS cd src-restore; WVPASS hardlink-sets .) > hardlink-sets.restored \
-        || exit $?
-    WVPASS diff -u hardlink-sets.expected hardlink-sets.restored
-
-    # Test that we do link within separate sub-trees.
-    WVPASS setup-hardlink-test
-    WVPASS cd "$tmpdir"
-    WVPASS mkdir src/a src/b
-    WVPASS touch src/a/1
-    WVPASS ln src/a/1 src/b/1
-    WVPASS bup index -vv src/a src/b
-    WVPASS bup save -t -n src src/a src/b
-    WVPASS hardlink-test-run-restore
-    WVPASS echo ./src/a/1 > hardlink-sets.expected
-    WVPASS echo ./src/b/1 >> hardlink-sets.expected
-    (WVPASS cd src-restore; WVPASS hardlink-sets .) > hardlink-sets.restored \
-        || exit $?
-    WVPASS diff -u hardlink-sets.expected hardlink-sets.restored
-
-    WVPASS rm -r "$tmpdir"
-
-) || exit $?
-
-WVSTART 'meta --edit'
-(
-    tmpdir="$(WVPASS wvmktempdir)" || exit $?    
-    WVPASS cd "$tmpdir"
-    WVPASS mkdir src
-
-    WVPASS bup meta -cf src.meta src
-
-    WVPASS bup meta --edit --set-uid 0 src.meta | WVPASS bup meta -tvvf - \
-        | WVPASS grep -qE '^uid: 0'
-    WVPASS bup meta --edit --set-uid 1000 src.meta | WVPASS bup meta -tvvf - \
-        | WVPASS grep -qE '^uid: 1000'
-
-    WVPASS bup meta --edit --set-gid 0 src.meta | WVPASS bup meta -tvvf - \
-        | WVPASS grep -qE '^gid: 0'
-    WVPASS bup meta --edit --set-gid 1000 src.meta | WVPASS bup meta -tvvf - \
-        | WVPASS grep -qE '^gid: 1000'
-
-    WVPASS bup meta --edit --set-user foo src.meta | WVPASS bup meta -tvvf - \
-        | WVPASS grep -qE '^user: foo'
-    WVPASS bup meta --edit --set-user bar src.meta | WVPASS bup meta -tvvf - \
-        | WVPASS grep -qE '^user: bar'
-    WVPASS bup meta --edit --unset-user src.meta | WVPASS bup meta -tvvf - \
-        | WVPASS grep -qE '^user:'
-    WVPASS bup meta --edit --set-user bar --unset-user src.meta \
-        | WVPASS bup meta -tvvf - | WVPASS grep -qE '^user:'
-    WVPASS bup meta --edit --unset-user --set-user bar src.meta \
-        | WVPASS bup meta -tvvf - | WVPASS grep -qE '^user: bar'
-
-    WVPASS bup meta --edit --set-group foo src.meta | WVPASS bup meta -tvvf - \
-        | WVPASS grep -qE '^group: foo'
-    WVPASS bup meta --edit --set-group bar src.meta | WVPASS bup meta -tvvf - \
-        | WVPASS grep -qE '^group: bar'
-    WVPASS bup meta --edit --unset-group src.meta | WVPASS bup meta -tvvf - \
-        | WVPASS grep -qE '^group:'
-    WVPASS bup meta --edit --set-group bar --unset-group src.meta \
-        | WVPASS bup meta -tvvf - | WVPASS grep -qE '^group:'
-    WVPASS bup meta --edit --unset-group --set-group bar src.meta \
-        | WVPASS bup meta -tvvf - | grep -qE '^group: bar'
-
-    WVPASS rm -r "$tmpdir"
-
-) || exit $?
-
-WVSTART 'meta --no-recurse'
-(
-    tmpdir="$(WVPASS wvmktempdir)" || exit $?    
-    WVPASS cd "$tmpdir"
-    WVPASS mkdir src
-    WVPASS mkdir src/foo
-    WVPASS touch src/foo/{1,2,3}
-    WVPASS bup meta -cf src.meta src
-    WVPASSEQ "$(bup meta -tf src.meta | LC_ALL=C sort)" "src/
-src/foo/
-src/foo/1
-src/foo/2
-src/foo/3"
-    WVPASS bup meta --no-recurse -cf src.meta src
-    WVPASSEQ "$(bup meta -tf src.meta | LC_ALL=C sort)" "src/"
-    WVPASS rm -r "$tmpdir"
-) || exit $?
-
-# Test ownership restoration (when not root or fakeroot).
-(
-    if [ "$root_status" != none ]; then
-        exit 0
-    fi
-
-    tmpdir="$(WVPASS wvmktempdir)" || exit $?    
-
-    # FIXME: binary groups
-    first_group="$(WVPASS bup-cfg-py -c 'import os,grp; \
-      print(grp.getgrgid(os.getgroups()[0])[0])')" || exit $?
-    last_group="$(bup-cfg-py -c 'import os,grp; \
-      print(grp.getgrgid(os.getgroups()[-1])[0])')" || exit $?
-    last_group_erx="$(escape-erx "$last_group")"
-
-    WVSTART 'metadata (restoration of ownership)'
-    WVPASS cd "$tmpdir"
-    WVPASS touch src
-    # Some systems always assign the parent dir group to new paths
-    # (sgid).  Make sure the group is one we're in.
-    WVPASS chgrp -R "$first_group" src
-
-    WVPASS bup meta -cf src.meta src
-
-    WVPASS mkdir dest
-    WVPASS cd dest
-    # Make sure we don't change (or try to change) the user when not root.
-    WVPASS bup meta --edit --set-user root ../src.meta | WVPASS bup meta -x
-    WVPASS bup xstat src | WVPASS grep -qvE '^user: root'
-    WVPASS rm -rf src
-    WVPASS bup meta --edit --unset-user --set-uid 0 ../src.meta \
-        | WVPASS bup meta -x
-    WVPASS bup xstat src | WVPASS grep -qvE '^user: root'
-
-    # Make sure we can restore one of the user's groups.
-    WVPASS rm -rf src
-    WVPASS bup meta --edit --set-group "$last_group" ../src.meta \
-        | WVPASS bup meta -x
-    WVPASS bup xstat src | WVPASS grep -qE "^group: $last_group_erx"
-
-    # Make sure we can restore one of the user's gids.
-    user_gids="$(id -G)" || exit $?
-    last_gid="$(echo ${user_gids/* /})" || exit $?
-    WVPASS rm -rf src
-    WVPASS bup meta --edit --unset-group --set-gid "$last_gid" ../src.meta \
-        | WVPASS bup meta -x
-    WVPASS bup xstat src | WVPASS grep -qE "^gid: $last_gid"
-
-    # Test --numeric-ids (gid).
-    WVPASS rm -rf src
-    current_gidx=$(bup meta -tvvf ../src.meta | grep -ae '^gid:') || exit $?
-    WVPASS bup meta --edit --set-group "$last_group" ../src.meta \
-        | WVPASS bup meta -x --numeric-ids
-    new_gidx=$(bup xstat src | grep -ae '^gid:') || exit $?
-    WVPASSEQ "$current_gidx" "$new_gidx"
-
-    # Test that restoring an unknown user works.
-    unknown_user=$("$TOP"/t/unknown-owner --user) || exit $?
-    WVPASS rm -rf src
-    current_uidx=$(bup meta -tvvf ../src.meta | grep -ae '^uid:') || exit $?
-    WVPASS bup meta --edit --set-user "$unknown_user" ../src.meta \
-        | WVPASS bup meta -x
-    new_uidx=$(bup xstat src | grep -ae '^uid:') || exit $?
-    WVPASSEQ "$current_uidx" "$new_uidx"
-
-    # Test that restoring an unknown group works.
-    unknown_group=$("$TOP"/t/unknown-owner --group) || exit $?
-    WVPASS rm -rf src
-    current_gidx=$(bup meta -tvvf ../src.meta | grep -ae '^gid:') || exit $?
-    WVPASS bup meta --edit --set-group "$unknown_group" ../src.meta \
-        | WVPASS bup meta -x
-    new_gidx=$(bup xstat src | grep -ae '^gid:') || exit $?
-    WVPASSEQ "$current_gidx" "$new_gidx"
-
-    WVPASS rm -r "$tmpdir"
-
-) || exit $?
-
-# Test ownership restoration (when root or fakeroot).
-(
-    if [ "$root_status" = none ]; then
-        exit 0
-    fi
-
-    tmpdir="$(WVPASS wvmktempdir)" || exit $?    
-
-    uid=$(WVPASS id -un) || exit $?
-    gid=$(WVPASS id -gn) || exit $?
-
-    WVSTART 'metadata (restoration of ownership as root)'
-    WVPASS cd "$tmpdir"
-    WVPASS touch src
-    WVPASS chown "$uid:$gid" src # In case the parent dir is sgid, etc.
-    WVPASS bup meta -cf src.meta src
-
-    WVPASS mkdir dest
-    WVPASS chmod 700 dest # so we can't accidentally do something insecure
-    WVPASS cd dest
-
-    other_uinfo="$(id-other-than --user "$uid")" || exit $?
-    other_user="${other_uinfo%%:*}"
-    other_uid="${other_uinfo##*:}"
-
-    other_ginfo="$(id-other-than --group "$gid")" || exit $?
-    other_group="${other_ginfo%%:*}"
-    other_gid="${other_ginfo##*:}"
-
-    # Make sure we can restore a uid (must be in /etc/passwd b/c cygwin).
-    WVPASS bup meta --edit --unset-user --set-uid "$other_uid" ../src.meta \
-        | WVPASS bup meta -x
-    WVPASS bup xstat src | WVPASS grep -qE "^uid: $other_uid"
-
-    # Make sure we can restore a gid (must be in /etc/group b/c cygwin).
-    WVPASS bup meta --edit --unset-group --set-gid "$other_gid" ../src.meta \
-        | WVPASS bup meta -x
-    WVPASS bup xstat src | WVPASS grep -qE "^gid: $other_gid"
-
-    other_uinfo2="$(id-other-than --user "$(id -un)" "$other_user")" || exit $?
-    other_user2="${other_uinfo2%%:*}"
-    other_user2_erx="$(escape-erx "$other_user2")" || exit $?
-    other_uid2="${other_uinfo2##*:}"
-
-    other_ginfo2="$(id-other-than --group "$(id -gn)" "$other_group")" || exit $?
-    other_group2="${other_ginfo2%%:*}"
-    other_group2_erx="$(escape-erx "$other_group2")" || exit $?
-    other_gid2="${other_ginfo2##*:}"
-
-    # Try to restore a user (and see that user trumps uid when uid is not 0).
-    WVPASS bup meta --edit \
-        --set-uid "$other_uid" --set-user "$other_user2" ../src.meta \
-        | WVPASS bup meta -x
-    WVPASS bup xstat src | WVPASS grep -qE "^user: $other_user2_erx"
-
-    # Try to restore a group (and see that group trumps gid when gid is not 0).
-    WVPASS bup meta --edit \
-        --set-gid "$other_gid" --set-group "$other_group2" ../src.meta \
-        | WVPASS bup meta -x
-    WVPASS bup xstat src | WVPASS grep -qE "^group: $other_group2_erx"
-
-    # Test --numeric-ids (uid).  Note the name 'root' is not handled
-    # specially, so we use that here as the test user name.  We assume
-    # that the root user's uid is never 42.
-    WVPASS rm -rf src
-    WVPASS bup meta --edit --set-user root --set-uid "$other_uid" ../src.meta \
-        | WVPASS bup meta -x --numeric-ids
-    new_uidx=$(bup xstat src | grep -e '^uid:') || exit $?
-    WVPASSEQ "$new_uidx" "uid: $other_uid"
-
-    # Test --numeric-ids (gid).  Note the name 'root' is not handled
-    # specially, so we use that here as the test group name.  We
-    # assume that the root group's gid is never 42.
-    WVPASS rm -rf src
-    WVPASS bup meta --edit --set-group root --set-gid "$other_gid" ../src.meta \
-        | WVPASS bup meta -x --numeric-ids
-    new_gidx=$(bup xstat src | grep -e '^gid:') || exit $?
-    WVPASSEQ "$new_gidx" "gid: $other_gid"
-
-    # Test that restoring an unknown user works.
-    unknown_user=$("$TOP"/t/unknown-owner --user) || exit $?
-    WVPASS rm -rf src
-    WVPASS bup meta --edit \
-        --set-uid "$other_uid" --set-user "$unknown_user" ../src.meta \
-        | WVPASS bup meta -x
-    new_uidx=$(bup xstat src | grep -e '^uid:') || exit $?
-    WVPASSEQ "$new_uidx" "uid: $other_uid"
-
-    # Test that restoring an unknown group works.
-    unknown_group=$("$TOP"/t/unknown-owner --group) || exit $?
-    WVPASS rm -rf src
-    WVPASS bup meta --edit \
-        --set-gid "$other_gid" --set-group "$unknown_group" ../src.meta \
-        | WVPASS bup meta -x
-    new_gidx=$(bup xstat src | grep -e '^gid:') || exit $?
-    WVPASSEQ "$new_gidx" "gid: $other_gid"
-
-    if ! [[ $(uname) =~ CYGWIN ]]; then
-        # For now, skip these on Cygwin because it doesn't allow
-        # restoring an unknown uid/gid.
-
-        # Make sure a uid of 0 trumps a non-root user.
-        WVPASS bup meta --edit --set-user "$other_user2" ../src.meta \
-            | WVPASS bup meta -x
-        WVPASS bup xstat src | WVPASS grep -qvE "^user: $other_user2_erx"
-        WVPASS bup xstat src | WVPASS grep -qE "^uid: 0"
-
-        # Make sure a gid of 0 trumps a non-root group.
-        WVPASS bup meta --edit --set-group "$other_group2" ../src.meta \
-            | WVPASS bup meta -x
-        WVPASS bup xstat src | WVPASS grep -qvE "^group: $other_group2_erx"
-        WVPASS bup xstat src | WVPASS grep -qE "^gid: 0"
-    fi
-
-    WVPASS rm -r "$tmpdir"
-
-) || exit $?
-
-
-# Root-only tests that require an FS with all the trimmings: ACLs,
-# Linux attr, Linux xattr, etc.
-if [ "$root_status" = root ]; then
-    (
-        # Some cleanup handled in universal-cleanup() above.
-        # These tests are only likely to work under Linux for now
-        # (patches welcome).
-        [[ $(uname) =~ Linux ]] || exit 0
-
-        if ! modprobe loop; then
-            echo 'Unable to load loopback module; skipping dependent tests.' 1>&2
-            exit 0
-        fi
-
-        testfs="$(WVPASS wvmkmountpt)" || exit $?
-        testfs_limited="$(WVPASS wvmkmountpt)" || exit $?
-        tmpdir="$(WVPASS wvmktempdir)" || exit $?
-        export BUP_DIR="$tmpdir/bup"
-
-        WVSTART 'meta - general (as root)'
-        WVPASS setup-test-tree
-        WVPASS cd "$tmpdir"
-
-        umount "$testfs"
-        WVPASS dd if=/dev/zero of=testfs.img bs=1M count=32
-        # Make sure we have all the options the chattr test needs
-        # (i.e. create a "normal" ext4 filesystem).
-        WVPASS mke2fs -F -m 0 \
-            -I 256 \
-            -O has_journal,extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize \
-            testfs.img
-        WVPASS mount -o loop,acl,user_xattr testfs.img "$testfs"
-        # Hide, so that tests can't create risks.
-        WVPASS chown root:root "$testfs"
-        WVPASS chmod 0700 "$testfs"
-
-        umount "$testfs_limited"
-        WVPASS dd if=/dev/zero of=testfs-limited.img bs=1M count=32
-        WVPASS mkfs -t vfat testfs-limited.img
-        WVPASS mount -o loop,uid=root,gid=root,umask=0077 \
-            testfs-limited.img "$testfs_limited"
-
-        WVPASS cp -pPR src "$testfs"/src
-        (WVPASS cd "$testfs"; WVPASS test-src-create-extract) || exit $?
-
-        WVSTART 'meta - atime (as root)'
-        WVPASS force-delete "$testfs"/src
-        WVPASS mkdir "$testfs"/src
-        (
-            WVPASS mkdir "$testfs"/src/foo
-            WVPASS touch "$testfs"/src/bar
-            WVPASS bup-python -c "from bup import xstat; \
-                x = xstat.timespec_to_nsecs((42, 0));\
-                xstat.utime(b'$testfs/src/foo', (x, x));\
-                xstat.utime(b'$testfs/src/bar', (x, x));"
-            WVPASS cd "$testfs"
-            WVPASS bup meta -v --create --recurse --file src.meta src
-            WVPASS bup meta -tvf src.meta
-            # Test extract.
-            WVPASS force-delete src-restore
-            WVPASS mkdir src-restore
-            WVPASS cd src-restore
-            WVPASS bup meta --extract --file ../src.meta
-            WVPASSEQ "$(bup xstat --include-fields=atime src/foo)" "atime: 42"
-            WVPASSEQ "$(bup xstat --include-fields=atime src/bar)" "atime: 42"
-            # Test start/finish extract.
-            WVPASS force-delete src
-            WVPASS bup meta --start-extract --file ../src.meta
-            WVPASS test -d src
-            WVPASS bup meta --finish-extract --file ../src.meta
-            WVPASSEQ "$(bup xstat --include-fields=atime src/foo)" "atime: 42"
-            WVPASSEQ "$(bup xstat --include-fields=atime src/bar)" "atime: 42"
-        ) || exit $?
-
-        WVSTART 'meta - Linux attr (as root)'
-        WVPASS force-delete "$testfs"/src
-        WVPASS mkdir "$testfs"/src
-        (
-            WVPASS touch "$testfs"/src/foo
-            WVPASS mkdir "$testfs"/src/bar
-            WVPASS chattr +acdeijstuADS "$testfs"/src/foo
-            WVPASS chattr +acdeijstuADST "$testfs"/src/bar
-            (WVPASS cd "$testfs"; WVPASS test-src-create-extract) || exit $?
-            # Test restoration to a limited filesystem (vfat).
-            (
-                WVPASS bup meta --create --recurse --file "$testfs"/src.meta \
-                    "$testfs"/src
-                WVPASS force-delete "$testfs_limited"/src-restore
-                WVPASS mkdir "$testfs_limited"/src-restore
-                WVPASS cd "$testfs_limited"/src-restore
-                WVFAIL bup meta --extract --file "$testfs"/src.meta 2>&1 \
-                    | WVPASS grep -e '^Linux chattr:' \
-                    | WVPASS bup-cfg-py -c \
-                    'import sys; exit(not len(sys.stdin.readlines()) == 3)'
-            ) || exit $?
-        ) || exit $?
-
-        WVSTART 'meta - Linux xattr (as root)'
-        WVPASS force-delete "$testfs"/src
-        WVPASS mkdir "$testfs"/src
-        WVPASS touch "$testfs"/src/foo
-        WVPASS mkdir "$testfs"/src/bar
-        WVPASS attr -s foo -V bar "$testfs"/src/foo
-        WVPASS attr -s foo -V bar "$testfs"/src/bar
-        (WVPASS cd "$testfs"; WVPASS test-src-create-extract) || exit $?
-
-        # Test restoration to a limited filesystem (vfat).
-        (
-            WVPASS bup meta --create --recurse --file "$testfs"/src.meta \
-                "$testfs"/src
-            WVPASS force-delete "$testfs_limited"/src-restore
-            WVPASS mkdir "$testfs_limited"/src-restore
-            WVPASS cd "$testfs_limited"/src-restore
-            WVFAIL bup meta --extract --file "$testfs"/src.meta
-            WVFAIL bup meta --extract --file "$testfs"/src.meta 2>&1 \
-                | WVPASS grep -e "^xattr\.set u\?'" \
-                | WVPASS bup-cfg-py -c \
-                'import sys; exit(not len(sys.stdin.readlines()) == 2)'
-        ) || exit $?
-
-        WVSTART 'meta - POSIX.1e ACLs (as root)'
-        WVPASS force-delete "$testfs"/src
-        WVPASS mkdir "$testfs"/src
-        WVPASS touch "$testfs"/src/foo
-        WVPASS mkdir "$testfs"/src/bar
-        WVPASS setfacl -m u:root:r "$testfs"/src/foo
-        WVPASS setfacl -m u:root:r "$testfs"/src/bar
-        (WVPASS cd "$testfs"; WVPASS test-src-create-extract) || exit $?
-
-        # Test restoration to a limited filesystem (vfat).
-        (
-            WVPASS bup meta --create --recurse --file "$testfs"/src.meta \
-                "$testfs"/src
-            WVPASS force-delete "$testfs_limited"/src-restore
-            WVPASS mkdir "$testfs_limited"/src-restore
-            WVPASS cd "$testfs_limited"/src-restore
-            WVFAIL bup meta --extract --file "$testfs"/src.meta 2>&1 \
-                | WVPASS grep -e '^POSIX1e ACL applyto:' \
-                | WVPASS bup-cfg-py -c \
-                'import sys; exit(not len(sys.stdin.readlines()) == 2)'
-        ) || exit $?
-
-        WVPASS umount "$testfs"
-        WVPASS umount "$testfs_limited"
-        WVPASS rm -r "$testfs" "$testfs_limited"
-
-        WVPASS rm -r "$tmpdir"
-
-    ) || exit $?
-fi
-
-WVPASS rm -r "$tmpdir"
diff --git a/t/test-on.sh b/t/test-on.sh
deleted file mode 100755 (executable)
index 871bf2e..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. ./t/lib.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-compare-trees() { "$top/t/compare-trees" "$@"; }
-
-WVPASS bup init
-WVPASS cd "$tmpdir"
-
-WVSTART "index/save"
-WVPASS mkdir src src/foo
-WVPASS date > src/bar
-WVPASS bup random 1k > src/baz
-WVPASS bup on - index src
-WVPASS bup on - save -ctn src src > get.log
-WVPASSEQ $(WVPASS cat get.log | WVPASS wc -l) 2
-tree_id=$(WVPASS awk 'FNR == 1' get.log) || exit $?
-commit_id=$(WVPASS awk 'FNR == 2' get.log) || exit $?
-WVPASS git ls-tree "$tree_id"
-WVPASS git cat-file commit "$commit_id" | head -n 1 \
-    | WVPASS grep "^tree $tree_id\$"
-
-WVPASS bup restore -C restore "src/latest/$(pwd)/src/."
-WVPASS compare-trees src/ restore/
-WVPASS rm -r restore
-
-WVSTART "split"
-WVPASS bup on - split -ctn baz src/baz > get.log
-tree_id=$(WVPASS awk 'FNR == 1' get.log) || exit $?
-commit_id=$(WVPASS awk 'FNR == 2' get.log) || exit $?
-WVPASS git ls-tree "$tree_id"
-WVPASS git cat-file commit "$commit_id" | head -n 1 \
-    | WVPASS grep "^tree $tree_id\$"
-WVPASS bup join baz > restore-baz
-WVPASS cmp src/baz restore-baz
-
-WVSTART "index-cache"
-# the 'a-zA-Z0-9_' is '\w' from python,
-# the trailing _ is because there's no dir specified
-# and that should thus be empty
-hostname=$(uname -n)
-idxcache=$(echo "$hostname" | sed 's/[^@a-zA-Z0-9_]/_/g')_
-# there should be an index-cache now
-for idx in "$tmpdir"/bup/objects/pack/*.idx ; do
-    cachedidx="$tmpdir/bup/index-cache/$idxcache/$(basename "$idx")"
-    WVPASS cmp "$idx" "$cachedidx"
-done
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-packsizelimit b/t/test-packsizelimit
deleted file mode 100755 (executable)
index 6bd6a00..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/usr/bin/env bash
-. wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS cd "$tmpdir"
-
-WVSTART 'pack size limit'
-
-WVPASS bup init
-WVPASSEQ $(WVPASS find "$BUP_DIR"/objects/pack -name "*.pack" | wc -l) 0
-WVPASS bup random 50k | WVPASS bup split -n foo
-WVPASSEQ 1 $(WVPASS find "$BUP_DIR"/objects/pack/*.pack | wc -l)
-
-rm -rf "$BUP_DIR"
-WVPASS bup init
-WVPASS git config pack.packSizeLimit 10k
-WVPASSEQ $(WVPASS find "$BUP_DIR"/objects/pack -name "*.pack" | wc -l) 0
-WVPASS bup random 50k | WVPASS bup split -n foo
-WVPASS test $(WVPASS find "$BUP_DIR"/objects/pack/*.pack | wc -l) -gt 2
-
-WVPASS rm -r "$tmpdir"
diff --git a/t/test-prune-older b/t/test-prune-older
deleted file mode 100755 (executable)
index 068ba6f..0000000
+++ /dev/null
@@ -1,218 +0,0 @@
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/../dev/bup-python" || exit $?
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-# end of bup preamble
-
-from __future__ import absolute_import, print_function
-from collections import defaultdict
-from difflib import unified_diff
-from itertools import chain, dropwhile, groupby, takewhile
-from os import chdir
-from os.path import abspath, dirname
-from random import choice, randint
-from shutil import copytree, rmtree
-from subprocess import PIPE
-from sys import stderr
-from time import localtime, strftime, time
-import os, random, sys
-
-# For buptest, wvtest, ...
-sys.path[:0] = (abspath(os.path.dirname(__file__) + '/..'),)
-sys.path[:0] = [os.path.dirname(os.path.realpath(__file__)) + '/../lib']
-
-from buptest import ex, exo, test_tempdir
-from wvtest import wvfail, wvpass, wvpasseq, wvpassne, wvstart
-
-from bup import compat
-from bup.compat import environ
-from bup.helpers import partition, period_as_secs, readpipe
-import bup.path
-
-
-def create_older_random_saves(n, start_utc, end_utc):
-    with open(b'foo', 'wb') as f:
-        pass
-    ex([b'git', b'add', b'foo'])
-    utcs = set()
-    while len(utcs) != n:
-        utcs.add(randint(start_utc, end_utc))
-    utcs = sorted(utcs)
-    for utc in utcs:
-        with open(b'foo', 'wb') as f:
-            f.write(b'%d\n' % utc)
-        ex([b'git', b'commit', b'--date', b'%d' % utc, b'-qam', b'%d' % utc])
-    ex([b'git', b'gc', b'--aggressive'])
-    return utcs
-
-# There is corresponding code in bup for some of this, but the
-# computation method is different here, in part so that the test can
-# provide a more effective cross-check.
-
-period_kinds = [b'all', b'dailies', b'monthlies', b'yearlies']
-period_scale = {b's': 1,
-                b'min': 60,
-                b'h': 60 * 60,
-                b'd': 60 * 60 * 24,
-                b'w': 60 * 60 * 24 * 7,
-                b'm': 60 * 60 * 24 * 31,
-                b'y': 60 * 60 * 24 * 366}
-period_scale_kinds = list(period_scale.keys())
-
-def expected_retentions(utcs, utc_start, spec):
-    if not spec:
-        return utcs
-    utcs = sorted(utcs, reverse=True)
-    period_start = dict(spec)
-    for kind, duration in compat.items(period_start):
-        period_start[kind] = utc_start - period_as_secs(duration)
-    period_start = defaultdict(lambda: float('inf'), period_start)
-
-    all = list(takewhile(lambda x: x >= period_start[b'all'], utcs))
-    utcs = list(dropwhile(lambda x: x >= period_start[b'all'], utcs))
-
-    matches = takewhile(lambda x: x >= period_start[b'dailies'], utcs)
-    dailies = [max(day_utcs) for yday, day_utcs
-               in groupby(matches, lambda x: localtime(x).tm_yday)]
-    utcs = list(dropwhile(lambda x: x >= period_start[b'dailies'], utcs))
-
-    matches = takewhile(lambda x: x >= period_start[b'monthlies'], utcs)
-    monthlies = [max(month_utcs) for month, month_utcs
-                 in groupby(matches, lambda x: localtime(x).tm_mon)]
-    utcs = dropwhile(lambda x: x >= period_start[b'monthlies'], utcs)
-
-    matches = takewhile(lambda x: x >= period_start[b'yearlies'], utcs)
-    yearlies = [max(year_utcs) for year, year_utcs
-                in groupby(matches, lambda x: localtime(x).tm_year)]
-
-    return chain(all, dailies, monthlies, yearlies)
-
-def period_spec(start_utc, end_utc):
-    global period_kinds, period_scale, period_scale_kinds
-    result = []
-    desired_specs = randint(1, 2 * len(period_kinds))
-    assert(desired_specs >= 1)  # At least one --keep argument is required
-    while len(result) < desired_specs:
-        period = None
-        if randint(1, 100) <= 5:
-            period = b'forever'
-        else:
-            assert(end_utc > start_utc)
-            period_secs = randint(1, end_utc - start_utc)
-            scale = choice(period_scale_kinds)
-            mag = int(float(period_secs) / period_scale[scale])
-            if mag != 0:
-                period = (b'%d' % mag) + scale
-        if period:
-            result += [(choice(period_kinds), period)]
-    return tuple(result)
-
-def unique_period_specs(n, start_utc, end_utc):
-    invocations = set()
-    while len(invocations) < n:
-        invocations.add(period_spec(start_utc, end_utc))
-    return tuple(invocations)
-
-def period_spec_to_period_args(spec):
-    return tuple(chain(*((b'--keep-' + kind + b'-for', period)
-                         for kind, period in spec)))
-
-def result_diffline(x):
-    return (b'%d %s\n'
-            % (x, strftime(' %Y-%m-%d-%H%M%S', localtime(x)).encode('ascii')))
-
-def check_prune_result(expected):
-    actual = sorted([int(x)
-                     for x in exo([b'git', b'log',
-                                   b'--pretty=format:%at']).out.splitlines()])
-    if expected != actual:
-        for x in expected:
-            print('ex:', x, strftime('%Y-%m-%d-%H%M%S', localtime(x)),
-                  file=stderr)
-        for line in unified_diff([result_diffline(x) for x in expected],
-                                 [result_diffline(x) for x in actual],
-                                 fromfile='expected', tofile='actual'):
-            sys.stderr.write(line)
-    wvpass(expected == actual)
-
-
-environ[b'GIT_AUTHOR_NAME'] = b'bup test'
-environ[b'GIT_COMMITTER_NAME'] = b'bup test'
-environ[b'GIT_AUTHOR_EMAIL'] = b'bup@a425bc70a02811e49bdf73ee56450e6f'
-environ[b'GIT_COMMITTER_EMAIL'] = b'bup@a425bc70a02811e49bdf73ee56450e6f'
-
-seed = int(environ.get(b'BUP_TEST_SEED', time()))
-random.seed(seed)
-print('random seed:', seed, file=stderr)
-
-save_population = int(environ.get(b'BUP_TEST_PRUNE_OLDER_SAVES', 2000))
-prune_cycles = int(environ.get(b'BUP_TEST_PRUNE_OLDER_CYCLES', 20))
-prune_gc_cycles = int(environ.get(b'BUP_TEST_PRUNE_OLDER_GC_CYCLES', 10))
-
-bup_cmd = bup.path.exe()
-
-with test_tempdir(b'prune-older-') as tmpdir:
-    environ[b'BUP_DIR'] = tmpdir + b'/work/.git'
-    environ[b'GIT_DIR'] = tmpdir + b'/work/.git'
-    now = int(time())
-    three_years_ago = now - (60 * 60 * 24 * 366 * 3)
-    chdir(tmpdir)
-    ex([b'git', b'init', b'work'])
-    ex([b'git', b'config', b'gc.autoDetach', b'false'])
-
-    wvstart('generating ' + str(save_population) + ' random saves')
-    chdir(tmpdir + b'/work')
-    save_utcs = create_older_random_saves(save_population, three_years_ago, now)
-    chdir(tmpdir)
-    test_set_hash = exo([b'git', b'show-ref', b'-s', b'master']).out.rstrip()
-    ls_saves = exo((bup_cmd, b'ls', b'master')).out.splitlines()
-    wvpasseq(save_population + 1, len(ls_saves))
-
-    wvstart('ensure everything kept, if no keep arguments')
-    ex([b'git', b'reset', b'--hard', test_set_hash])
-    proc = ex((bup_cmd,
-               b'prune-older', b'-v', b'--unsafe', b'--no-gc',
-               b'--wrt', b'%d' % now) \
-              + (b'master',),
-              stdout=None, stderr=PIPE, check=False)
-    wvpassne(proc.rc, 0)
-    wvpass(b'at least one keep argument is required' in proc.err)
-    check_prune_result(save_utcs)
-
-
-    wvstart('running %d generative no-gc tests on %d saves' % (prune_cycles,
-                                                               save_population))
-    for spec in unique_period_specs(prune_cycles,
-                                    # Make it more likely we'll have
-                                    # some outside the save range.
-                                    three_years_ago - period_scale[b'm'],
-                                    now):
-        ex([b'git', b'reset', b'--hard', test_set_hash])
-        expected = sorted(expected_retentions(save_utcs, now, spec))
-        ex((bup_cmd,
-            b'prune-older', b'-v', b'--unsafe', b'--no-gc', b'--wrt',
-            b'%d' % now) \
-           + period_spec_to_period_args(spec) \
-           + (b'master',))
-        check_prune_result(expected)
-
-
-    # More expensive because we have to recreate the repo each time
-    wvstart('running %d generative gc tests on %d saves' % (prune_gc_cycles,
-                                                            save_population))
-    ex([b'git', b'reset', b'--hard', test_set_hash])
-    copytree(b'work/.git', b'clean-test-repo', symlinks=True)
-    for spec in unique_period_specs(prune_gc_cycles,
-                                    # Make it more likely we'll have
-                                    # some outside the save range.
-                                    three_years_ago - period_scale[b'm'],
-                                    now):
-        rmtree(b'work/.git')
-        copytree(b'clean-test-repo', b'work/.git')
-        expected = sorted(expected_retentions(save_utcs, now, spec))
-        ex((bup_cmd,
-            b'prune-older', b'-v', b'--unsafe', b'--wrt', b'%d' % now) \
-           + period_spec_to_period_args(spec) \
-           + (b'master',))
-        check_prune_result(expected)
diff --git a/t/test-redundant-saves.sh b/t/test-redundant-saves.sh
deleted file mode 100755 (executable)
index bdb56ae..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/usr/bin/env bash
-
-# Test that running save more than once with no other changes produces
-# the exact same tree.
-
-# Note: we can't compare the top-level hash (i.e. the output of "save
-# -t" because that currently pulls the metadata for unindexed parent
-# directories directly from the filesystem, and the relevant atimes
-# may change between runs.  So instead we extract the roots of the
-# indexed trees for comparison via t/subtree-hash.
-
-. ./wvtest-bup.sh || exit $?
-
-set -o pipefail
-
-WVSTART 'all'
-
-top="$(pwd)"
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$BUP_DIR"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS mkdir -p "$tmpdir/src"
-WVPASS mkdir -p "$tmpdir/src/d"
-WVPASS mkdir -p "$tmpdir/src/d/e"
-WVPASS touch "$tmpdir/src/"{f,b,a,d}
-WVPASS touch "$tmpdir/src/d/z"
-
-WVPASS bup init
-WVPASS bup index -u "$tmpdir/src"
-
-declare -a indexed_top
-IFS=/
-indexed_top="${tmpdir##/}"
-indexed_top=(${indexed_top%%/})
-unset IFS
-
-tree1=$(WVPASS bup save -t "$tmpdir/src") || exit $?
-indexed_tree1="$(WVPASS t/subtree-hash "$tree1" "${indexed_top[@]}" src)" \
-    || exit $?
-
-result="$(WVPASS cd "$tmpdir/src"; WVPASS bup index -m)" || exit $?
-WVPASSEQ "$result" ""
-
-tree2=$(WVPASS bup save -t "$tmpdir/src") || exit $?
-indexed_tree2="$(WVPASS t/subtree-hash "$tree2" "${indexed_top[@]}" src)" \
-    || exit $?
-
-WVPASSEQ "$indexed_tree1" "$indexed_tree2"
-
-result="$(WVPASS bup index -s / | WVFAIL grep ^D)" || exit $?
-WVPASSEQ "$result" ""
-
-tree3=$(WVPASS bup save -t /) || exit $?
-indexed_tree3="$(WVPASS t/subtree-hash "$tree3" "${indexed_top[@]}" src)" || exit $?
-WVPASSEQ "$indexed_tree1" "$indexed_tree3"
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-release-archive.sh b/t/test-release-archive.sh
deleted file mode 100755 (executable)
index 74ce474..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-bup_make=$(< config/config.var/bup-make)
-
-WVPASS git status > /dev/null
-
-if ! git diff-index --quiet HEAD; then
-    WVDIE "uncommitted changes; cannot continue"
-fi
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS cd "$tmpdir"
-
-WVPASS git clone "$top" clone
-
-for ver in 11.11 11.11.11; do
-    WVSTART "version $ver"
-    WVPASS cd clone
-    WVPASS git tag "$ver"
-    WVPASS git archive --prefix=bup-"$ver"/ -o "$tmpdir"/bup-"$ver".tgz "$ver"
-    WVPASS cd "$tmpdir"
-    WVPASS tar xzf bup-"$ver".tgz
-    WVPASS cd bup-"$ver"
-    WVPASS "$bup_make"
-    WVPASSEQ "$ver" "$(./bup version)"
-    WVPASS cd "$tmpdir"
-done
-
-WVSTART 'make check in unpacked archive'
-WVPASS cd bup-11.11.11
-if ! "$bup_make" -j5 check > archive-tests.log 2>&1; then
-    cat archive-tests.log 1>&2
-    WVPASS false
-fi
-
-WVPASS cd "$top"
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-restore-map-owner.sh b/t/test-restore-map-owner.sh
deleted file mode 100755 (executable)
index 4e67610..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-root_status="$(t/root-status)" || exit $?
-
-if [ "$root_status" != root ]; then
-    echo 'Not root: skipping restore --map-* tests.'
-    exit 0 # FIXME: add WVSKIP.
-fi
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-uid=$(WVPASS id -u) || exit $?
-user=$(WVPASS id -un) || exit $?
-gid=$(WVPASS id -g) || exit $?
-group=$(WVPASS id -gn) || exit $?
-
-other_uinfo=$(WVPASS t/id-other-than --user "$user") || exit $?
-other_user="${other_uinfo%%:*}"
-other_uid="${other_uinfo##*:}"
-
-other_ginfo=$(WVPASS t/id-other-than --group "$group" 0) || exit $?
-other_group="${other_ginfo%%:*}"
-other_gid="${other_ginfo##*:}"
-
-WVPASS bup init
-WVPASS cd "$tmpdir"
-
-WVSTART "restore --map-user/group/uid/gid (control)"
-WVPASS mkdir src
-WVPASS touch src/foo
-# Some systems assign the parent dir group to new paths.
-WVPASS chgrp -R "$group" src
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS bup restore -C dest "src/latest/$(pwd)/src/"
-WVPASS bup xstat dest/foo > foo-xstat
-WVPASS grep -qE "^user: $user\$" foo-xstat
-WVPASS grep -qE "^uid: $uid\$" foo-xstat
-WVPASS grep -qE "^group: $group\$" foo-xstat
-WVPASS grep -qE "^gid: $gid\$" foo-xstat
-
-WVSTART "restore --map-user/group/uid/gid (user/group)"
-WVPASS rm -rf dest
-# Have to remap uid/gid too because we're root and 0 would win).
-WVPASS bup restore -C dest \
-    --map-uid "$uid=$other_uid" --map-gid "$gid=$other_gid" \
-    --map-user "$user=$other_user" --map-group "$group=$other_group" \
-    "src/latest/$(pwd)/src/"
-WVPASS bup xstat dest/foo > foo-xstat
-WVPASS grep -qE "^user: $other_user\$" foo-xstat
-WVPASS grep -qE "^uid: $other_uid\$" foo-xstat
-WVPASS grep -qE "^group: $other_group\$" foo-xstat
-WVPASS grep -qE "^gid: $other_gid\$" foo-xstat
-
-WVSTART "restore --map-user/group/uid/gid (user/group trumps uid/gid)"
-WVPASS rm -rf dest
-WVPASS bup restore -C dest \
-    --map-uid "$uid=$other_uid" --map-gid "$gid=$other_gid" \
-    "src/latest/$(pwd)/src/"
-# Should be no changes.
-WVPASS bup xstat dest/foo > foo-xstat
-WVPASS grep -qE "^user: $user\$" foo-xstat
-WVPASS grep -qE "^uid: $uid\$" foo-xstat
-WVPASS grep -qE "^group: $group\$" foo-xstat
-WVPASS grep -qE "^gid: $gid\$" foo-xstat
-
-WVSTART "restore --map-user/group/uid/gid (uid/gid)"
-WVPASS rm -rf dest
-WVPASS bup restore -C dest \
-    --map-user "$user=" --map-group "$group=" \
-    --map-uid "$uid=$other_uid" --map-gid "$gid=$other_gid" \
-    "src/latest/$(pwd)/src/"
-WVPASS bup xstat dest/foo > foo-xstat
-WVPASS grep -qE "^user: $other_user\$" foo-xstat
-WVPASS grep -qE "^uid: $other_uid\$" foo-xstat
-WVPASS grep -qE "^group: $other_group\$" foo-xstat
-WVPASS grep -qE "^gid: $other_gid\$" foo-xstat
-
-has_uid_gid_0=$(WVPASS bup-cfg-py -c "
-import grp, pwd
-try:
-  pwd.getpwuid(0)
-  grp.getgrgid(0)
-  print('yes')
-except KeyError as ex:
-  pass
-") || exit $?
-if [ "$has_uid_gid_0" == yes ]
-then
-    WVSTART "restore --map-user/group/uid/gid (zero uid/gid trumps all)"
-    WVPASS rm -rf dest
-    WVPASS bup restore -C dest \
-        --map-user "$user=$other_user" --map-group "$group=$other_group" \
-        --map-uid "$uid=0" --map-gid "$gid=0" \
-        "src/latest/$(pwd)/src/"
-    WVPASS bup xstat dest/foo > foo-xstat
-    WVPASS grep -qE "^uid: 0\$" foo-xstat
-    WVPASS grep -qE "^gid: 0\$" foo-xstat
-
-    WVPASS rm -rf "$tmpdir"
-fi
diff --git a/t/test-restore-single-file.sh b/t/test-restore-single-file.sh
deleted file mode 100755 (executable)
index f211ebc..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-
-set -o pipefail
-
-WVSTART 'all'
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS mkdir "$tmpdir/foo"
-WVPASS mkdir "$tmpdir/foo/bar" # Make sure a dir sorts before baz (regression test).
-WVPASS touch "$tmpdir/foo/baz"
-WVPASS WVPASS bup init
-WVPASS WVPASS bup index "$tmpdir/foo"
-WVPASS bup save -n foo "$tmpdir/foo"
-# Make sure the timestamps will differ if metadata isn't being restored.
-WVPASS bup tick
-WVPASS bup restore -C "$tmpdir/restore" "foo/latest/$tmpdir/foo/baz"
-WVPASS "$top/t/compare-trees" "$tmpdir/foo/baz" "$tmpdir/restore/baz"
-
-WVPASS rm -rf "$tmpdir"
-
diff --git a/t/test-rm-between-index-and-save.sh b/t/test-rm-between-index-and-save.sh
deleted file mode 100755 (executable)
index 67c5b8a..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-D="$tmpdir/data"
-
-bup() { "$top/bup" "$@"; }
-
-WVSTART "remove file"
-# Fixed in commit 8585613c1f45f3e20feec00b24fc7e3a948fa23e ("Store
-# metadata in the index....")
-WVPASS mkdir "$D"
-WVPASS bup init
-WVPASS echo "content" > "$D"/foo
-WVPASS echo "content" > "$D"/bar
-WVPASS bup tick
-WVPASS bup index -ux "$D"
-WVPASS bup save -n save-fail-missing "$D"
-WVPASS echo "content" > "$D"/baz
-WVPASS bup tick
-WVPASS bup index -ux "$D"
-WVPASS rm "$D"/foo
-# When "bup tick" is removed above, this may fail (complete with warning),
-# since the ctime/mtime of "foo" might be pushed back:
-WVPASS bup save -n save-fail-missing "$D"
-# when the save-call failed, foo is missing from output, since only
-# then bup notices, that it was removed:
-WVPASSEQ "$(bup ls -A save-fail-missing/latest/$TOP/$D/)" "bar
-baz
-foo"
-# index/save again
-WVPASS bup tick
-WVPASS bup index -ux "$D"
-WVPASS bup save -n save-fail-missing "$D"
-# now foo is gone:
-WVPASSEQ "$(bup ls -A save-fail-missing/latest/$TOP/$D/)" "bar
-baz"
-
-
-# TODO: Test for racecondition between reading a file and reading its metadata?
-
-WVSTART "remove dir"
-WVPASS rm -r "$D"
-WVPASS mkdir "$D"
-WVPASS rm -r "$BUP_DIR"
-WVPASS bup init
-WVPASS mkdir "$D"/foo
-WVPASS mkdir "$D"/bar
-WVPASS bup tick
-WVPASS bup index -ux "$D"
-WVPASS bup save -n save-fail-missing "$D"
-WVPASS touch "$D"/bar
-WVPASS mkdir "$D"/baz
-WVPASS bup tick
-WVPASS bup index -ux "$D"
-WVPASS rmdir "$D"/foo
-# with directories, bup notices that foo is missing, so it fails
-# (complete with delayed error)
-WVFAIL bup save -n save-fail-missing "$D"
-# ...but foo is still saved since it was just fine in the index
-WVPASSEQ "$(bup ls -AF save-fail-missing/latest/$TOP/$D/)" "bar/
-baz/
-foo/"
-# Index again:
-WVPASS bup tick
-WVPASS bup index -ux "$D"
-# no non-zero-exitcode anymore:
-WVPASS bup save -n save-fail-missing "$D"
-# foo is now gone
-WVPASSEQ "$(bup ls -AF save-fail-missing/latest/$TOP/$D/)" "bar/
-baz/"
-
-WVPASS rm -rf "$tmpdir"
-
diff --git a/t/test-rm.sh b/t/test-rm.sh
deleted file mode 100755 (executable)
index 00a5a85..0000000
+++ /dev/null
@@ -1,256 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. ./t/lib.sh || exit $?
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-
-bup() { "$top/bup" "$@"; }
-compare-trees() { "$top/t/compare-trees" "$@"; }
-
-wv_matches_rx()
-{
-    local caller_file=${BASH_SOURCE[0]}
-    local caller_line=${BASH_LINENO[0]}
-    local src="$caller_file:$caller_line"
-    if test $# -ne 2; then
-        echo "! $src wv_matches_rx requires 2 arguments FAILED" 1>&2
-        return
-    fi
-    local str="$1"
-    local rx="$2"
-    echo "Matching:" 1>&2 || exit $?
-    echo "$str" | sed 's/^\(.*\)/  \1/' 1>&2 || exit $?
-    echo "Against:" 1>&2 || exit $?
-    echo "$rx" | sed 's/^\(.*\)/  \1/' 1>&2 || exit $?
-    if [[ "$str" =~ ^${rx}$ ]]; then
-        echo "! $src regex matches ok" 1>&2 || exit $?
-    else
-        echo "! $src regex doesn't match FAILED" 1>&2 || exit $?
-    fi
-}
-
-
-WVPASS bup init
-WVPASS cd "$tmpdir"
-
-
-WVSTART "rm /foo (lone branch)"
-WVPASS mkdir src src/foo
-WVPASS echo twisty-maze > src/1
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS "$top"/t/sync-tree bup/ bup-baseline/
-# FIXME: test -n
-WVPASS bup tick # Make sure we always get the timestamp changes below
-WVPASS bup rm --unsafe /src
-observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
-wv_matches_rx "$observed" \
-'\*deleting[ ]+logs/refs/heads/src
-\*deleting[ ]+refs/heads/src(
-\.d\.\.t\.\.\.[.]*[ ]+\./)?
-\.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
-\.d\.\.t\.\.\.[.]*[ ]+refs/heads/(
->f\+\+\+\+\+\+\+\+\+[ ]+packed-refs)?'
-
-
-WVSTART "rm /foo (one of many)"
-WVPASS rm -rf bup
-WVPASS mv bup-baseline bup
-WVPASS echo twisty-maze > src/2
-WVPASS bup index src
-WVPASS bup save -n src-2 src
-WVPASS echo twisty-maze > src/3
-WVPASS bup index src
-WVPASS bup save -n src-3 src
-WVPASS "$top"/t/sync-tree bup/ bup-baseline/
-WVPASS bup tick # Make sure we always get the timestamp changes below
-WVPASS bup rm --unsafe /src
-observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
-wv_matches_rx "$observed" \
-"\*deleting[ ]+logs/refs/heads/src
-\*deleting[ ]+refs/heads/src(
-\.d\.\.t\.\.\.[.]*[ ]+\./)?
-\.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
-\.d\.\.t\.\.\.[.]*[ ]+refs/heads/(
->f\+\+\+\+\+\+\+\+\+[ ]+packed-refs)?"
-
-
-WVSTART "rm /foo /bar (multiple of many)"
-WVPASS rm -rf bup
-WVPASS mv bup-baseline bup
-WVPASS echo twisty-maze > src/4
-WVPASS bup index src
-WVPASS bup save -n src-4 src
-WVPASS echo twisty-maze > src/5
-WVPASS bup index src
-WVPASS bup save -n src-5 src
-WVPASS "$top"/t/sync-tree bup/ bup-baseline/
-WVPASS bup tick # Make sure we always get the timestamp changes below
-WVPASS bup rm --unsafe /src-2 /src-4
-observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
-wv_matches_rx "$observed" \
-"\*deleting[ ]+logs/refs/heads/src-2
-\*deleting[ ]+logs/refs/heads/src-4
-\*deleting[ ]+refs/heads/src-2
-\*deleting[ ]+refs/heads/src-4(
-\.d\.\.t\.\.\.[.]*[ ]+\./)?
-\.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
-\.d\.\.t\.\.\.[.]*[ ]+refs/heads/(
->f\+\+\+\+\+\+\+\+\+[ ]+packed-refs)?"
-
-
-WVSTART "rm /foo /bar (all)"
-WVPASS rm -rf bup
-WVPASS mv bup-baseline bup
-WVPASS "$top"/t/sync-tree bup/ bup-baseline/
-WVPASS bup tick # Make sure we always get the timestamp changes below
-WVPASS bup rm --unsafe /src /src-2 /src-3 /src-4 /src-5
-observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
-wv_matches_rx "$observed" \
-"\*deleting[ ]+logs/refs/heads/src
-\*deleting[ ]+logs/refs/heads/src-2
-\*deleting[ ]+logs/refs/heads/src-3
-\*deleting[ ]+logs/refs/heads/src-4
-\*deleting[ ]+logs/refs/heads/src-5
-\*deleting[ ]+refs/heads/src
-\*deleting[ ]+refs/heads/src-2
-\*deleting[ ]+refs/heads/src-3
-\*deleting[ ]+refs/heads/src-4
-\*deleting[ ]+refs/heads/src-5(
-\.d\.\.t\.\.\.[.]*[ ]+\./)?
-\.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
-\.d\.\.t\.\.\.[.]*[ ]+refs/heads/(
->f\+\+\+\+\+\+\+\+\+[ ]+packed-refs)?"
-
-
-WVSTART "rm /foo/bar (lone save - equivalent to rm /foo)"
-WVPASS rm -rf bup bup-baseline src
-WVPASS bup init
-WVPASS mkdir src
-WVPASS echo twisty-maze > src/1
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS bup ls src > tmp-ls
-save1="$(WVPASS head -n 1 tmp-ls)" || exit $?
-WVPASS "$top"/t/sync-tree bup/ bup-baseline/
-WVPASS bup tick # Make sure we always get the timestamp changes below
-WVFAIL bup rm --unsafe /src/latest
-WVPASS bup rm --unsafe /src/"$save1"
-observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
-wv_matches_rx "$observed" \
-"\*deleting[ ]+logs/refs/heads/src
-\*deleting[ ]+refs/heads/src(
-\.d\.\.t\.\.\.[.]*[ ]+\./)?
-\.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
-\.d\.\.t\.\.\.[.]*[ ]+refs/heads/(
->f\+\+\+\+\+\+\+\+\+[ ]+packed-refs)?"
-
-
-verify-changes-caused-by-rewriting-save()
-{
-    local before="$1" after="$2" tmpdir
-    tmpdir="$(WVPASS wvmktempdir)" || exit $?
-    (WVPASS cd "$before" && WVPASS find . | WVPASS sort) \
-        > "$tmpdir/before" || exit $?
-    (WVPASS cd "$after" && WVPASS find . | WVPASS sort) \
-        > "$tmpdir/after" || exit $?
-    local new_paths new_idx new_pack observed
-    new_paths="$(WVPASS comm -13 "$tmpdir/before" "$tmpdir/after")" || exit $?
-    new_idx="$(echo "$new_paths" | WVPASS grep -E '^\./objects/pack/pack-.*\.idx$' | cut -b 3-)" || exit $?
-    new_pack="$(echo "$new_paths" | WVPASS grep -E '^\./objects/pack/pack-.*\.pack$' | cut -b 3-)" || exit $?
-    wv_matches_rx "$(compare-trees "$after/" "$before/")" \
-">fcst\.\.\.[.]*[ ]+logs/refs/heads/src
-\.d\.\.t\.\.\.[.]*[ ]+objects/
-\.d\.\.t\.\.\.[.]*[ ]+objects/pack/
->fcst\.\.\.[.]*[ ]+objects/pack/bup\.bloom
->f\+\+\+\+\+\+\+[+]*[ ]+$new_idx
->f\+\+\+\+\+\+\+[+]*[ ]+$new_pack
-\.d\.\.t\.\.\.[.]*[ ]+refs/heads/
->fc\.t\.\.\.[.]*[ ]+refs/heads/src"
-    WVPASS rm -rf "$tmpdir"
-}
-
-commit-hash-n()
-{
-    local n="$1" repo="$2" branch="$3"
-    GIT_DIR="$repo" WVPASS git rev-list --reverse "$branch" \
-        | WVPASS awk "FNR == $n"
-}
-
-rm-safe-cinfo()
-{
-    local n="$1" repo="$2" branch="$3" hash
-    hash="$(commit-hash-n "$n" "$repo" "$branch")" || exit $?
-    local fmt='Tree: %T%n'
-    fmt="${fmt}Author: %an <%ae> %ai%n"
-    fmt="${fmt}Committer: %cn <%ce> %ci%n"
-    fmt="${fmt}%n%s%n%b"
-    GIT_DIR="$repo" WVPASS git log -n1 --pretty=format:"$fmt" "$hash"
-}
-
-
-WVSTART 'rm /foo/BAR (setup)'
-WVPASS rm -rf bup bup-baseline src
-WVPASS bup init
-WVPASS mkdir src
-WVPASS echo twisty-maze > src/1
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS echo twisty-maze > src/2
-WVPASS bup index src
-WVPASS bup tick
-WVPASS bup save -n src src
-WVPASS echo twisty-maze > src/3
-WVPASS bup index src
-WVPASS bup tick
-WVPASS bup save -n src src
-WVPASS mv bup bup-baseline
-WVPASS bup tick # Make sure we always get the timestamp changes below
-
-
-WVSTART "rm /foo/BAR (first of many)"
-WVPASS "$top"/t/sync-tree bup-baseline/ bup/
-WVPASS bup ls src > tmp-ls
-victim="$(WVPASS head -n 1 tmp-ls)" || exit $?
-WVPASS bup rm --unsafe /src/"$victim"
-verify-changes-caused-by-rewriting-save bup-baseline bup
-observed=$(WVPASS git rev-list src | WVPASS wc -l) || exit $?
-WVPASSEQ 2 $observed
-WVPASSEQ "$(rm-safe-cinfo 1 bup src)" "$(rm-safe-cinfo 2 bup-baseline src)"
-WVPASSEQ "$(rm-safe-cinfo 2 bup src)" "$(rm-safe-cinfo 3 bup-baseline src)"
-
-
-WVSTART "rm /foo/BAR (one of many)"
-WVPASS "$top"/t/sync-tree bup-baseline/ bup/
-victim="$(WVPASS bup ls src | tail -n +2 | head -n 1)" || exit $?
-WVPASS bup rm --unsafe /src/"$victim"
-verify-changes-caused-by-rewriting-save bup-baseline bup
-observed=$(git rev-list src | wc -l) || exit $?
-WVPASSEQ 2 $observed
-WVPASSEQ "$(commit-hash-n 1 bup src)" "$(commit-hash-n 1 bup-baseline src)"
-WVPASSEQ "$(rm-safe-cinfo 2 bup src)" "$(rm-safe-cinfo 3 bup-baseline src)"
-
-
-WVSTART "rm /foo/BAR (last of many)"
-WVPASS "$top"/t/sync-tree bup-baseline/ bup/
-victim="$(WVPASS bup ls src | tail -n 2 | head -n 1)" || exit $?
-WVPASS bup rm --unsafe -vv /src/"$victim"
-observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
-wv_matches_rx "$observed" \
-"\.d\.\.t\.\.\.[.]*[ ]+refs/heads/
->fc\.t\.\.\.[.]*[ ]+refs/heads/src
->fcst\.\.\.[.]*[ ]+logs/refs/heads/src"
-observed=$(git rev-list src | wc -l) || exit $?
-WVPASSEQ 2 $observed
-WVPASSEQ "$(commit-hash-n 1 bup src)" "$(commit-hash-n 1 bup-baseline src)"
-WVPASSEQ "$(commit-hash-n 2 bup src)" "$(commit-hash-n 2 bup-baseline src)"
-
-
-# FIXME: test that committer changes when rewriting, when appropriate
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-save-creates-no-unrefs.sh b/t/test-save-creates-no-unrefs.sh
deleted file mode 100755 (executable)
index 38d9064..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-
-WVSTART 'all'
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$BUP_DIR"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS mkdir -p "$tmpdir/src"
-WVPASS touch "$tmpdir/src/foo"
-WVPASS bup init
-WVPASS bup index "$tmpdir/src"
-WVPASS bup save -n src "$tmpdir/src"
-WVPASSEQ "$(git fsck --unreachable)" ""
-WVPASS bup save -n src "$tmpdir/src"
-WVPASSEQ "$(git fsck --unreachable)" ""
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-save-errors b/t/test-save-errors
deleted file mode 100755 (executable)
index 14fd47f..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-#!/usr/bin/env bash
-. wvtest.sh
-. wvtest-bup.sh
-. t/lib.sh
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS cd "$tmpdir"
-
-# necessary for 0 == 1970-01-01 00:00
-export TZ=UTC
-
-WVSTART "init"
-WVPASS bup init
-
-mkdir "$tmpdir/save"
-for f in $(seq 9) ; do
-    touch -t 200${f}01010000 "$tmpdir/save/$f"
-done
-mkdir "$tmpdir/save/a"
-touch -t 199901010000 "$tmpdir/save/a/1"
-
-WVSTART "metadata read error for a file"
-WVPASS bup index "$tmpdir/save"
-
-# now do a hack to inject save errors while reading metadata
-# essentially, we create a bup-save command for ourselves
-# that gets an error for the .../5 file in metadata.from_path()
-cat > "$tmpdir/bup-save" << EOF
-#!/usr/bin/env $top/dev/bup-python
-from bup import metadata
-
-orig_from_path = metadata.from_path
-def from_path(path, *args, **kw):
-    if path.endswith(b'/5'):
-        raise IOError('intentionally failing metadata read for .../5')
-    return orig_from_path(path, *args, **kw)
-metadata.from_path = from_path
-
-exec(open("$top/lib/cmd/bup-save", "rb").read())
-EOF
-chmod +x "$tmpdir/bup-save"
-
-# use it to save the data
-"$tmpdir/bup-save" -n test "$tmpdir/save"
-
-# this should work anyway
-WVPASS bup ls -l "test/latest/$tmpdir/save"
-# also check the *right* data was returned
-lsout="$(bup ls -l "test/latest/$tmpdir/save")"
-for f in 1 2 3 4   6 7 8 9 ; do
-    if ! echo "$lsout" | grep "200${f}-01-01 00:00 $f" ; then
-        WVFAIL echo incorrect date for $f
-    fi
-done
-# and ensure we actually failed, and the above script/hack didn't break
-if ! echo "$lsout" | grep "1970-01-01 00:00 5" ; then
-    WVFAIL echo unexpected date for file 5
-fi
-
-
-WVSTART "metadata read error for a folder"
-WVPASS bup index --clear
-WVPASS bup index "$tmpdir/save"
-
-cat > "$tmpdir/bup-save" << EOF
-#!/usr/bin/env $top/dev/bup-python
-from bup import metadata
-
-orig_from_path = metadata.from_path
-def from_path(path, *args, **kw):
-    if path.endswith(b'/a'):
-        raise IOError('intentionally failing metadata read for .../a')
-    return orig_from_path(path, *args, **kw)
-metadata.from_path = from_path
-
-exec(open("$top/lib/cmd/bup-save", "rb").read())
-EOF
-chmod +x "$tmpdir/bup-save"
-
-# use it to save the data
-"$tmpdir/bup-save" -n test "$tmpdir/save"
-
-# this should work anyway
-WVPASS bup ls -l "test/latest/$tmpdir/save"
-if ! bup ls -l "test/latest/$tmpdir/save/a" | grep '1999-01-01 00:00 1' ; then
-    WVFAIL unexpected date for file a/1
-fi
-# and ensure we actually failed, and the above script/hack didn't break
-if ! bup ls -l "test/latest/$tmpdir/save" | grep "1970-01-01 00:00 a" ; then
-    WVFAIL unexpected date for directory a
-fi
-
-
-WVSTART "duplicate entries"
-WVPASS bup index --clear
-WVPASS bup index "$tmpdir/save"
-
-cat > "$tmpdir/bup-save" << EOF
-#!/usr/bin/env $top/dev/bup-python
-from bup import index
-
-Reader = index.Reader
-class DupReader(index.Reader):
-    def filter(self, *args, **kw):
-        for transname, ent in Reader.filter(self, *args, **kw):
-            # duplicate a file and a folder
-            if ent.name.endswith(b'/5') or ent.name.endswith(b'/a/'):
-                yield transname, ent
-            yield transname, ent
-index.Reader = DupReader
-
-exec(open("$top/lib/cmd/bup-save", "rb").read())
-EOF
-chmod +x "$tmpdir/bup-save"
-
-# use it to save the data
-"$tmpdir/bup-save" -n test "$tmpdir/save"
-
-# this should work
-WVPASS bup ls -l "test/latest/$tmpdir/save"
-
-# check that there are no duplicates
-lsout=$(bup ls -l "test/latest/$tmpdir/save")
-WVPASSEQ "$(echo "$lsout" | sort | uniq -d)" ""
-
-# and we should get the *right* data for each entry
-for f in $(seq 9) ; do
-    if ! echo "$lsout" | grep "200${f}-01-01 00:00 $f" ; then
-        WVFAIL echo incorrect metadata for $f
-    fi
-done
-
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-save-restore b/t/test-save-restore
deleted file mode 100755 (executable)
index e022243..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-#!/usr/bin/env bash
-. wvtest.sh
-. wvtest-bup.sh
-. t/lib.sh
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-validate-local-and-remote-restore()
-{
-    local src="$1" dest="$2" cmp_src="$3" cmp_dest="$4"
-    force-delete "$dest"
-    WVPASS bup restore -C "$dest" "$src"
-    WVPASS "$top/t/compare-trees" "$cmp_src" "$cmp_dest"
-    force-delete "$dest"
-    WVPASS bup restore -r ":$BUP_DIR" -C "$dest" "$src"
-    WVPASS "$top/t/compare-trees" "$cmp_src" "$cmp_dest"
-}
-
-
-WVPASS cd "$tmpdir"
-
-WVSTART "init"
-WVPASS bup init
-D=bupdata.tmp
-WVPASS force-delete $D
-WVPASS mkdir $D
-WVPASS touch $D/a
-WVPASS bup random 128k >$D/b
-WVPASS mkdir $D/d $D/d/e
-WVPASS bup random 512 >$D/f
-WVPASS touch $D/d/z
-WVPASS touch $D/d/z
-WVPASS bup index $D
-WVPASS bup save -t $D
-
-
-WVSTART "restore"
-WVPASS force-delete buprestore.tmp
-WVFAIL bup restore boink
-WVPASS touch "$tmpdir/$D/$D"
-WVPASS bup index -u "$tmpdir/$D"
-WVPASS bup save -n master /
-WVPASS bup restore -C buprestore.tmp "/master/latest/$tmpdir/$D"
-WVPASSEQ "$(ls buprestore.tmp)" "bupdata.tmp"
-WVPASS force-delete buprestore.tmp
-WVPASS bup restore -C buprestore.tmp "/master/latest/$tmpdir/$D/"
-WVPASS touch $D/non-existent-file buprestore.tmp/non-existent-file # else diff fails
-WVPASS diff -ur $D/ buprestore.tmp/
-WVPASS force-delete buprestore.tmp
-WVPASS echo -n "" | WVPASS bup split -n split_empty_string.tmp
-WVPASS bup restore -C buprestore.tmp split_empty_string.tmp/latest/
-WVPASSEQ "$(cat buprestore.tmp/data)" ""
-
-
-(
-    tmp=testrestore.tmp
-    WVPASS force-delete $tmp
-    WVPASS mkdir $tmp
-    export BUP_DIR="$(pwd)/$tmp/bup"
-    WVPASS WVPASS bup init
-    WVPASS mkdir -p $tmp/src/x/y/z
-    WVPASS bup random 8k > $tmp/src/x/y/random-1
-    WVPASS bup random 8k > $tmp/src/x/y/z/random-2
-    WVPASS bup index -u $tmp/src
-    WVPASS bup save --strip -n foo $tmp/src
-
-    WVSTART "restore /foo/latest"
-    validate-local-and-remote-restore \
-        /foo/latest  "$tmp/restore" \
-        "$tmp/src/" "$tmp/restore/latest/"
-
-    WVSTART "restore /foo/latest/."
-    WVPASS force-delete "$tmp/restore"
-    validate-local-and-remote-restore \
-        /foo/latest/.  "$tmp"/restore \
-        "$tmp"/src/ "$tmp"/restore
-
-    WVSTART "restore /foo/latest/x"
-    WVPASS force-delete "$tmp/restore"
-    validate-local-and-remote-restore \
-        /foo/latest/x  "$tmp"/restore \
-        "$tmp"/src/x/ "$tmp"/restore/x/
-
-    WVSTART "restore /foo/latest/x/"
-    WVPASS force-delete "$tmp/restore"  
-    WVPASS bup restore -C "$tmp"/restore /foo/latest/x/
-    for x in "$tmp"/src/x/*; do
-        WVPASS "$top/t/compare-trees" "$x/" "$tmp/restore/$(basename $x)"
-    done
-    WVPASS force-delete "$tmp/restore"  
-    WVPASS bup restore -r ":$BUP_DIR" -C "$tmp"/restore /foo/latest/x/
-    for x in "$tmp"/src/x/*; do
-        WVPASS "$top/t/compare-trees" "$x/" "$tmp/restore/$(basename $x)"
-    done
-
-    WVSTART "restore /foo/latest/x/."
-    WVPASS force-delete "$tmp/restore"
-    validate-local-and-remote-restore \
-        /foo/latest/x/.  "$tmp"/restore \
-        "$tmp"/src/x/ "$tmp"/restore/
-) || exit $?
-
-
-WVSTART "save (no index)"
-(
-    tmp=save-no-index.tmp
-    WVPASS force-delete $tmp
-    WVPASS mkdir $tmp
-    export BUP_DIR="$(WVPASS pwd)/$tmp/bup" || exit $?
-    WVPASS bup init
-    WVFAIL bup save -n nothing /
-    WVPASS rm -r "$tmp"
-) || exit $?
-
-
-WVSTART "save disjoint top-level directories"
-(
-    # Resolve any symlinks involving the top top-level dirs.
-    real_pwd="$(WVPASS resolve-parent .)" || exit $?
-    real_tmp="$(WVPASS resolve-parent /tmp/.)" || exit $?
-    pwd_top="$(echo $real_pwd | WVPASS awk -F "/" '{print $2}')" || exit $?
-    tmp_top="$(echo $real_tmp | WVPASS awk -F "/" '{print $2}')" || exit $?
-
-    if [ "$pwd_top" = "$tmp_top" ]; then
-        echo "(running from within /$tmp_top; skipping test)" 1>&2
-        exit 0
-    fi
-    D=bupdata.tmp
-    WVPASS force-delete $D
-    WVPASS mkdir -p $D/x
-    WVPASS date > $D/x/1
-    tmpdir2="$(WVPASS mktemp -d $real_tmp/bup-test-XXXXXXX)" || exit $?
-    cleanup() { WVPASS rm -r "$tmpdir2"; }
-    WVPASS trap cleanup EXIT
-    WVPASS date > "$tmpdir2/2"
-
-    export BUP_DIR="$tmpdir/bup"
-    WVPASS test -d "$BUP_DIR" && WVPASS rm -r "$BUP_DIR"
-
-    WVPASS bup init
-    WVPASS bup index -vu $(pwd)/$D/x "$tmpdir2"
-    WVPASS bup save -t -n src $(pwd)/$D/x "$tmpdir2"
-
-    # For now, assume that "ls -a" and "sort" use the same order.
-    actual="$(WVPASS bup ls -AF src/latest)" || exit $?
-    expected="$(echo -e "$pwd_top/\n$tmp_top/" | WVPASS sort)" || exit $?
-    WVPASSEQ "$actual" "$expected"
-) || exit $?
-
-
-WVPASS cd "$top"
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-save-restore-excludes.sh b/t/test-save-restore-excludes.sh
deleted file mode 100755 (executable)
index 0896877..0000000
+++ /dev/null
@@ -1,303 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS cd "$tmpdir"
-
-
-WVSTART "index excludes bupdir"
-WVPASS force-delete src "$BUP_DIR"
-WVPASS bup init
-WVPASS mkdir src
-WVPASS touch src/a
-WVPASS bup random 128k >src/b
-WVPASS mkdir src/d src/d/e
-WVPASS bup random 512 >src/f
-WVPASS bup index -ux src
-WVPASS bup save -n exclude-bupdir src
-WVPASSEQ "$(bup ls -AF "exclude-bupdir/latest/$tmpdir/src/")" "a
-b
-d/
-f"
-
-
-WVSTART "index --exclude"
-WVPASS force-delete src "$BUP_DIR"
-WVPASS bup init
-WVPASS mkdir src
-WVPASS touch src/a
-WVPASS bup random 128k >src/b
-WVPASS mkdir src/d src/d/e
-WVPASS bup random 512 >src/f
-WVPASS bup random 512 >src/j
-WVPASS bup index -ux --exclude src/d --exclude src/j src
-WVPASS bup save -n exclude src
-WVPASSEQ "$(bup ls "exclude/latest/$tmpdir/src/")" "a
-b
-f"
-WVPASS mkdir src/g src/h
-WVPASS bup index -ux --exclude src/d --exclude $tmpdir/src/g --exclude src/h \
-    --exclude "$tmpdir/src/j" src
-WVPASS bup save -n exclude src
-WVPASSEQ "$(bup ls "exclude/latest/$tmpdir/src/")" "a
-b
-f"
-
-
-WVSTART "index --exclude-from"
-WVPASS force-delete src "$BUP_DIR"
-WVPASS bup init
-WVPASS mkdir src
-WVPASS echo "src/d
- $tmpdir/src/g
-src/h
-src/i" > exclude-list
-WVPASS touch src/a
-WVPASS bup random 128k >src/b
-WVPASS mkdir src/d src/d/e
-WVPASS bup random 512 >src/f
-WVPASS mkdir src/g src/h
-WVPASS bup random 128k > src/i
-WVPASS bup index -ux --exclude-from exclude-list src
-WVPASS bup save -n exclude-from src
-WVPASSEQ "$(bup ls "exclude-from/latest/$tmpdir/src/")" "a
-b
-f"
-WVPASS rm exclude-list
-
-
-# bup index --exclude-rx ...
-# ==========================
-
-WVSTART "index --exclude-rx '^/foo' (root anchor)"
-WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
-WVPASS bup init
-WVPASS mkdir src
-WVPASS touch src/a
-WVPASS touch src/b
-WVPASS mkdir src/sub1
-WVPASS mkdir src/sub2
-WVPASS touch src/sub1/a
-WVPASS touch src/sub2/b
-WVPASS bup index -u src --exclude-rx "^$(pwd)/src/sub1/"
-WVPASS bup save --strip -n bupdir src
-WVPASS bup restore -C buprestore.tmp /bupdir/latest/
-actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
-WVPASSEQ "$actual" ".
-./a
-./b
-./sub2
-./sub2/b"
-
-WVSTART "index --exclude-rx '/foo$' (non-dir, tail anchor)"
-WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
-WVPASS bup init
-WVPASS mkdir src
-WVPASS touch src/a
-WVPASS touch src/b
-WVPASS touch src/foo
-WVPASS mkdir src/sub
-WVPASS mkdir src/sub/foo
-WVPASS touch src/sub/foo/a
-WVPASS bup index -u src --exclude-rx '/foo$'
-WVPASS bup save --strip -n bupdir src
-WVPASS bup restore -C buprestore.tmp /bupdir/latest/
-actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
-WVPASSEQ "$actual" ".
-./a
-./b
-./sub
-./sub/foo
-./sub/foo/a"
-
-WVSTART "index --exclude-rx '/foo/$' (dir, tail anchor)"
-WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
-WVPASS bup init
-WVPASS mkdir src
-WVPASS touch src/a
-WVPASS touch src/b
-WVPASS touch src/foo
-WVPASS mkdir src/sub
-WVPASS mkdir src/sub/foo
-WVPASS touch src/sub/foo/a
-WVPASS bup index -u src --exclude-rx '/foo/$'
-WVPASS bup save --strip -n bupdir src
-WVPASS bup restore -C buprestore.tmp /bupdir/latest/
-actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
-WVPASSEQ "$actual" ".
-./a
-./b
-./foo
-./sub"
-
-WVSTART "index --exclude-rx '/foo/.' (dir content)"
-WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
-WVPASS bup init
-WVPASS mkdir src
-WVPASS touch src/a
-WVPASS touch src/b
-WVPASS touch src/foo
-WVPASS mkdir src/sub
-WVPASS mkdir src/sub/foo
-WVPASS touch src/sub/foo/a
-WVPASS bup index -u src --exclude-rx '/foo/.'
-WVPASS bup save --strip -n bupdir src
-WVPASS bup restore -C buprestore.tmp /bupdir/latest/
-actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
-WVPASSEQ "$actual" ".
-./a
-./b
-./foo
-./sub
-./sub/foo"
-
-
-# bup index --exclude-rx-from ...
-# ===============================
-WVSTART "index --exclude-rx-from"
-WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
-WVPASS bup init
-WVPASS mkdir src
-WVPASS touch src/a
-WVPASS touch src/b
-WVPASS mkdir src/sub1
-WVPASS mkdir src/sub2
-WVPASS touch src/sub1/a
-WVPASS touch src/sub2/b
-# exclude-rx-file includes blank lines to check that we ignore them.
-WVPASS echo "^$(pwd)/src/sub1/
-
-" > exclude-rx-file
-WVPASS bup index -u src --exclude-rx-from exclude-rx-file
-WVPASS bup save --strip -n bupdir src
-WVPASS bup restore -C buprestore.tmp /bupdir/latest/
-actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
-WVPASSEQ "$actual" ".
-./a
-./b
-./sub2
-./sub2/b"
-
-
-# bup restore --exclude-rx ...
-# ============================
-
-WVSTART "restore --exclude-rx '^/foo' (root anchor)"
-WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
-WVPASS bup init
-WVPASS mkdir src
-WVPASS touch src/a
-WVPASS touch src/b
-WVPASS mkdir src/sub1
-WVPASS mkdir src/sub2
-WVPASS touch src/sub1/a
-WVPASS touch src/sub2/b
-WVPASS bup index -u src
-WVPASS bup save --strip -n bupdir src
-WVPASS bup restore -C buprestore.tmp --exclude-rx "^/sub1/" /bupdir/latest/
-actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
-WVPASSEQ "$actual" ".
-./a
-./b
-./sub2
-./sub2/b"
-
-WVSTART "restore --exclude-rx '/foo$' (non-dir, tail anchor)"
-WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
-WVPASS bup init
-WVPASS mkdir src
-WVPASS touch src/a
-WVPASS touch src/b
-WVPASS touch src/foo
-WVPASS mkdir src/sub
-WVPASS mkdir src/sub/foo
-WVPASS touch src/sub/foo/a
-WVPASS bup index -u src
-WVPASS bup save --strip -n bupdir src
-WVPASS bup restore -C buprestore.tmp --exclude-rx '/foo$' /bupdir/latest/
-actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
-WVPASSEQ "$actual" ".
-./a
-./b
-./sub
-./sub/foo
-./sub/foo/a"
-
-WVSTART "restore --exclude-rx '/foo/$' (dir, tail anchor)"
-WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
-WVPASS bup init
-WVPASS mkdir src
-WVPASS touch src/a
-WVPASS touch src/b
-WVPASS touch src/foo
-WVPASS mkdir src/sub
-WVPASS mkdir src/sub/foo
-WVPASS touch src/sub/foo/a
-WVPASS bup index -u src
-WVPASS bup save --strip -n bupdir src
-WVPASS bup restore -C buprestore.tmp --exclude-rx '/foo/$' /bupdir/latest/
-actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
-WVPASSEQ "$actual" ".
-./a
-./b
-./foo
-./sub"
-
-WVSTART "restore --exclude-rx '/foo/.' (dir content)"
-WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
-WVPASS bup init
-WVPASS mkdir src
-WVPASS touch src/a
-WVPASS touch src/b
-WVPASS touch src/foo
-WVPASS mkdir src/sub
-WVPASS mkdir src/sub/foo
-WVPASS touch src/sub/foo/a
-WVPASS bup index -u src
-WVPASS bup save --strip -n bupdir src
-WVPASS bup restore -C buprestore.tmp --exclude-rx '/foo/.' /bupdir/latest/
-actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
-WVPASSEQ "$actual" ".
-./a
-./b
-./foo
-./sub
-./sub/foo"
-
-
-# bup restore --exclude-rx-from ...
-# =================================
-
-WVSTART "restore --exclude-rx-from"
-WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
-WVPASS bup init
-WVPASS mkdir src
-WVPASS touch src/a
-WVPASS touch src/b
-WVPASS mkdir src/sub1
-WVPASS mkdir src/sub2
-WVPASS touch src/sub1/a
-WVPASS touch src/sub2/b
-WVPASS bup index -u src
-WVPASS bup save --strip -n bupdir src
-WVPASS echo "^/sub1/" > exclude-rx-file
-WVPASS bup restore -C buprestore.tmp \
-    --exclude-rx-from exclude-rx-file /bupdir/latest/
-actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
-WVPASSEQ "$actual" ".
-./a
-./b
-./sub2
-./sub2/b"
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-save-smaller b/t/test-save-smaller
deleted file mode 100755 (executable)
index 7018c84..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/usr/bin/env bash
-. wvtest.sh
-. wvtest-bup.sh
-. t/lib.sh
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS cd "$tmpdir"
-
-WVSTART "init"
-WVPASS bup init
-
-WVPASS mkdir "$tmpdir/save"
-WVPASS echo small0 > "$tmpdir/save/small"
-WVPASS echo bigbigbigbigbig01 > "$tmpdir/save/big1"
-big1sha="$(sha1sum < "$tmpdir/save/big1")"
-WVPASS bup index "$tmpdir/save"
-WVPASS bup save -vv -n test "$tmpdir/save"
-WVPASS mkdir "$tmpdir/restore1"
-WVPASS bup restore -v --outdir="$tmpdir/restore1/" "/test/latest$tmpdir/save/"
-WVPASS cmp "$tmpdir/restore1/small" "$tmpdir/save/small"
-WVPASS cmp "$tmpdir/restore1/big1" "$tmpdir/save/big1"
-
-WVSTART "save --smaller"
-WVPASS echo bigbigbigbigbig02 > "$tmpdir/save/big1"
-WVPASS echo bigbigbigbigbig03 > "$tmpdir/save/big2"
-WVPASS bup index "$tmpdir/save"
-WVPASS bup save -vv -n test --smaller=10 "$tmpdir/save"
-WVPASS mkdir "$tmpdir/restore2"
-WVPASS bup restore -v --outdir="$tmpdir/restore2/" "/test/latest$tmpdir/save/"
-WVPASS cmp "$tmpdir/restore2/small" "$tmpdir/save/small"
-# (per the original DESIGN document, we should've had the old version
-# of the modified large file, but really that isn't implemented)
-# must _not_ have this file at all
-WVFAIL test -f "$tmpdir/restore2/big1"
-# and not the new one either
-WVFAIL test -f "$tmpdir/restore2/big2"
-
-WVSTART "index --fake-valid / save"
-WVPASS echo bigbigbigbigbig02 > "$tmpdir/save/big1"
-WVPASS echo bigbigbigbigbig03 > "$tmpdir/save/big2"
-WVPASS bup index "$tmpdir/save"
-WVPASS bup index --fake-valid "$tmpdir/save/big1" "$tmpdir/save/big2"
-WVPASS bup save -vv -n test "$tmpdir/save"
-WVPASS mkdir "$tmpdir/restore3"
-WVPASS bup restore -v --outdir="$tmpdir/restore3/" "/test/latest$tmpdir/save/"
-WVPASS cmp "$tmpdir/restore3/small" "$tmpdir/save/small"
-WVPASSEQ "$(sha1sum < "$tmpdir/restore3/big1")" "$big1sha"
-WVPASS cmp "$tmpdir/restore3/big2" "$tmpdir/save/big2"
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-save-strip-graft.sh b/t/test-save-strip-graft.sh
deleted file mode 100755 (executable)
index 95883dd..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-compare-trees() { "$top/t/compare-trees" "$@"; }
-
-WVPASS cd "$tmpdir"
-
-
-WVSTART "save --strip"
-WVPASS force-delete "$BUP_DIR" src restore
-WVPASS bup init
-WVPASS mkdir -p src/x/y/z
-WVPASS bup random 8k > src/x/y/random-1
-WVPASS bup random 8k > src/x/y/z/random-2
-WVPASS bup index -u src
-WVPASS bup save --strip -n foo src/x/y
-WVPASS bup restore -C restore /foo/latest
-WVPASS compare-trees src/x/y/ restore/latest/
-
-
-WVSTART "save --strip-path (relative)"
-WVPASS force-delete "$BUP_DIR" src restore
-WVPASS bup init
-WVPASS mkdir -p src/x/y/z
-WVPASS bup random 8k > src/x/y/random-1
-WVPASS bup random 8k > src/x/y/z/random-2
-WVPASS bup index -u src
-WVPASS bup save --strip-path src -n foo src/x
-WVPASS bup restore -C restore /foo/latest
-WVPASS compare-trees src/ restore/latest/
-
-
-WVSTART "save --strip-path (absolute)"
-WVPASS force-delete "$BUP_DIR" src restore
-WVPASS bup init
-WVPASS mkdir -p src/x/y/z
-WVPASS bup random 8k > src/x/y/random-1
-WVPASS bup random 8k > src/x/y/z/random-2
-WVPASS bup index -u src
-WVPASS bup save --strip-path "$tmpdir" -n foo src
-WVPASS bup restore -C restore /foo/latest
-WVPASS compare-trees src/ "restore/latest/src/"
-
-
-WVSTART "save --strip-path (no match)"
-if test $(WVPASS path-filesystems . | WVPASS sort -u | WVPASS wc -l) -ne 1
-then
-    # Skip the test because the attempt to restore parent dirs to the
-    # current filesystem may fail -- i.e. running from
-    # /foo/ext4/bar/btrfs will fail when bup tries to restore linux
-    # attrs above btrfs to the restore tree *inside* btrfs.
-    # FIXME: add WVSKIP
-    echo "(running from tree with mixed filesystems; skipping test)" 1>&2
-    exit 0
-else
-    WVPASS force-delete "$BUP_DIR" src restore
-    WVPASS bup init
-    WVPASS mkdir -p src/x/y/z
-    WVPASS bup random 8k > src/x/y/random-1
-    WVPASS bup random 8k > src/x/y/z/random-2
-    WVPASS bup index -u src
-    WVPASS bup save --strip-path foo -n foo src/x
-    WVPASS bup restore -C restore /foo/latest
-    WVPASS compare-trees src/ "restore/latest/$tmpdir/src/"
-fi
-
-
-WVSTART "save --graft (empty graft points disallowed)"
-WVPASS force-delete "$BUP_DIR" src restore
-WVPASS bup init
-WVPASS mkdir src
-WVFAIL bup save --graft =/grafted -n graft-point-absolute src 2>&1 \
-    | WVPASS grep 'error: a graft point cannot be empty'
-WVFAIL bup save --graft $top/$tmp= -n graft-point-absolute src 2>&1 \
-    | WVPASS grep 'error: a graft point cannot be empty'
-
-
-WVSTART "save --graft /x/y=/a/b (relative paths)"
-WVPASS force-delete "$BUP_DIR" src restore
-WVPASS bup init
-WVPASS mkdir -p src/x/y/z
-WVPASS bup random 8k > src/x/y/random-1
-WVPASS bup random 8k > src/x/y/z/random-2
-WVPASS bup index -u src
-WVPASS bup save --graft src=x -n foo src
-WVPASS bup restore -C restore /foo/latest
-WVPASS compare-trees src/ "restore/latest/$tmpdir/x/"
-
-
-WVSTART "save --graft /x/y=/a/b (matching structure)"
-WVPASS force-delete "$BUP_DIR" src restore
-WVPASS bup init
-WVPASS mkdir -p src/x/y/z
-WVPASS bup random 8k > src/x/y/random-1
-WVPASS bup random 8k > src/x/y/z/random-2
-WVPASS bup index -u src
-WVPASS bup save -v --graft "$tmpdir/src/x/y=$tmpdir/src/a/b" -n foo src/x/y
-WVPASS bup restore -C restore /foo/latest
-WVPASS compare-trees src/x/y/ "restore/latest/$tmpdir/src/a/b/"
-
-
-WVSTART "save --graft /x/y=/a (shorter target)"
-WVPASS force-delete "$BUP_DIR" src restore
-WVPASS bup init
-WVPASS mkdir -p src/x/y/z
-WVPASS bup random 8k > src/x/y/random-1
-WVPASS bup random 8k > src/x/y/z/random-2
-WVPASS bup index -u src
-WVPASS bup save -v --graft "$tmpdir/src/x/y=/a" -n foo src/x/y
-WVPASS bup restore -C restore /foo/latest
-WVPASS compare-trees src/x/y/ "restore/latest/a/"
-
-
-WVSTART "save --graft /x=/a/b (longer target)"
-WVPASS force-delete "$BUP_DIR" src restore
-WVPASS bup init
-WVPASS mkdir -p src/x/y/z
-WVPASS bup random 8k > src/x/y/random-1
-WVPASS bup random 8k > src/x/y/z/random-2
-WVPASS bup index -u src
-WVPASS bup save -v --graft "$tmpdir/src=$tmpdir/src/a/b/c" -n foo src
-WVPASS bup restore -C restore /foo/latest
-WVPASS compare-trees src/ "restore/latest/$tmpdir/src/a/b/c/"
-
-
-WVSTART "save --graft /x=/ (root target)"
-WVPASS force-delete "$BUP_DIR" src restore
-WVPASS bup init
-WVPASS mkdir -p src/x/y/z
-WVPASS bup random 8k > src/x/y/random-1
-WVPASS bup random 8k > src/x/y/z/random-2
-WVPASS bup index -u src
-WVPASS bup save -v --graft "$tmpdir/src/x=/" -n foo src/x
-WVPASS bup restore -C restore /foo/latest
-WVPASS compare-trees src/x/ "restore/latest/"
-
-
-#WVSTART "save --graft /=/x/ (root source)"
-# FIXME: Not tested for now -- will require cleverness, or caution as root.
-
-
-WVSTART "save collision"
-WVPASS force-delete "$BUP_DIR" src restore
-WVPASS bup init
-WVPASS mkdir -p src/x/1 src/y/1
-WVPASS bup index -u src
-WVFAIL bup save --strip -n foo src/x src/y 2> tmp-err.log
-WVPASS grep -F "error: ignoring duplicate path 1 in /" tmp-err.log
-
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-save-with-valid-parent.sh b/t/test-save-with-valid-parent.sh
deleted file mode 100755 (executable)
index f817165..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-compare-trees() { "$top/t/compare-trees" "$@"; }
-
-WVPASS cd "$tmpdir"
-
-# Make sure that we can explicitly save a path whose parent is up to
-# date.
-
-WVSTART "save path with up to date parent"
-WVPASS bup init
-
-WVPASS mkdir -p src/a src/b
-WVPASS touch src/a/1 src/b/2
-WVPASS bup index -u src
-WVPASS bup save -n src src
-
-WVPASS bup save -n src src/b
-WVPASS bup restore -C restore "src/latest/$(pwd)/"
-WVPASS test ! -e restore/src/a
-WVPASS "$top/t/compare-trees" -c src/b/ restore/src/b/
-
-WVPASS bup save -n src src/a/1
-WVPASS rm -r restore
-WVPASS bup restore -C restore "src/latest/$(pwd)/"
-WVPASS test ! -e restore/src/b
-WVPASS "$top/t/compare-trees" -c src/a/ restore/src/a/
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-sparse-files.sh b/t/test-sparse-files.sh
deleted file mode 100755 (executable)
index 1a207e9..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-mb=1048576
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-readonly mb top tmpdir
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS cd "$tmpdir"
-
-# The 3MB guess is semi-arbitrary, but we've been informed that
-# Lustre, for example, uses 1MB, so guess higher than that, at least.
-block_size=$(bup-cfg-py -c \
-  "import os; print(getattr(os.stat('.'), 'st_blksize', 0)) or $mb * 3") \
-    || exit $?
-data_size=$((block_size * 10))
-readonly block_size data_size
-
-WVPASS dd if=/dev/zero of=test-sparse-probe seek="$data_size" bs=1 count=1
-probe_size=$(WVPASS du -k -s test-sparse-probe | WVPASS cut -f1) || exit $?
-if [ "$probe_size" -ge "$((data_size / 1024))" ]; then
-    WVSTART "no sparse support detected -- skipping tests"
-    exit 0
-fi
-
-WVSTART "sparse restore on $(current-filesystem), assuming ${block_size}B blocks"
-
-WVPASS bup init
-WVPASS mkdir src
-
-WVPASS dd if=/dev/zero of=src/foo seek="$data_size" bs=1 count=1
-WVPASS bup index src
-WVPASS bup save -n src src
-
-WVSTART "sparse file restore (all sparse)"
-WVPASS bup restore -C restore "src/latest/$(pwd)/"
-restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
-WVPASS [ "$restore_size" -ge "$((data_size / 1024))" ]
-WVPASS "$top/t/compare-trees" -c src/ restore/src/
-
-WVSTART "sparse file restore --no-sparse (all sparse)"
-WVPASS rm -r restore
-WVPASS bup restore --no-sparse -C restore "src/latest/$(pwd)/"
-restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
-WVPASS [ "$restore_size" -ge "$((data_size / 1024))" ]
-WVPASS "$top/t/compare-trees" -c src/ restore/src/
-
-WVSTART "sparse file restore --sparse (all sparse)"
-WVPASS rm -r restore
-WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
-restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
-WVPASS [ "$restore_size" -le "$((3 * (block_size / 1024)))" ]
-WVPASS "$top/t/compare-trees" -c src/ restore/src/
-
-WVSTART "sparse file restore --sparse (sparse end)"
-WVPASS echo "start" > src/foo
-WVPASS dd if=/dev/zero of=src/foo seek="$data_size" bs=1 count=1 conv=notrunc
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS rm -r restore
-WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
-restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
-WVPASS [ "$restore_size" -le "$((3 * (block_size / 1024)))" ]
-WVPASS "$top/t/compare-trees" -c src/ restore/src/
-
-WVSTART "sparse file restore --sparse (sparse middle)"
-WVPASS echo "end" >> src/foo
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS rm -r restore
-WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
-restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
-WVPASS [ "$restore_size" -le "$((5 * (block_size / 1024)))" ]
-WVPASS "$top/t/compare-trees" -c src/ restore/src/
-
-WVSTART "sparse file restore --sparse (bracketed zero run in buf)"
-WVPASS echo 'x' > src/foo
-WVPASS dd if=/dev/zero bs=1 count=512 >> src/foo
-WVPASS echo 'y' >> src/foo
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS rm -r restore
-WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
-WVPASS "$top/t/compare-trees" -c src/ restore/src/
-
-WVSTART "sparse file restore --sparse (sparse start)"
-WVPASS dd if=/dev/zero of=src/foo seek="$data_size" bs=1 count=1
-WVPASS echo "end" >> src/foo
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS rm -r restore
-WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
-restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
-WVPASS [ "$restore_size" -le "$((5 * (block_size / 1024)))" ]
-WVPASS "$top/t/compare-trees" -c src/ restore/src/
-
-WVSTART "sparse file restore --sparse (sparse start and end)"
-WVPASS dd if=/dev/zero of=src/foo seek="$data_size" bs=1 count=1
-WVPASS echo "middle" >> src/foo
-WVPASS dd if=/dev/zero of=src/foo seek=$((2 * data_size)) bs=1 count=1 conv=notrunc
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS rm -r restore
-WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
-restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
-WVPASS [ "$restore_size" -le "$((5 * (block_size / 1024)))" ]
-WVPASS "$top/t/compare-trees" -c src/ restore/src/
-
-if test "$block_size" -gt $mb; then
-    random_size="$block_size"
-else
-    random_size=1M
-fi
-WVSTART "sparse file restore --sparse (random $random_size)"
-WVPASS bup random --seed "$RANDOM" 1M > src/foo
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS rm -r restore
-WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
-WVPASS "$top/t/compare-trees" -c src/ restore/src/
-
-WVSTART "sparse file restore --sparse (random sparse regions)"
-WVPASS rm -rf "$BUP_DIR" src
-WVPASS bup init
-WVPASS mkdir src
-for sparse_dataset in 0 1 2 3 4 5 6 7 8 9
-do
-    WVPASS "$top/t/sparse-test-data" "src/foo-$sparse_dataset"
-done
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS rm -r restore
-WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
-WVPASS "$top/t/compare-trees" -c src/ restore/src/
-
-WVSTART "sparse file restore --sparse (short zero runs around boundary)"
-WVPASS bup-cfg-py > src/foo <<EOF
-from sys import stdout
-stdout.write("x" * 65535 + "\0")
-stdout.write("\0" + "x" * 65535)
-stdout.write("\0" + "x" * 65534 + "\0")
-stdout.write("x" * 65536)
-stdout.write("\0")
-EOF
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS rm -r restore
-WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
-WVPASS "$top/t/compare-trees" -c src/ restore/src/
-
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-split-join.sh b/t/test-split-join.sh
deleted file mode 100755 (executable)
index 1a5d659..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-#!/usr/bin/env bash
-. wvtest.sh
-. wvtest-bup.sh
-. t/lib.sh
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS cd "$tmpdir"
-
-WVPASS bup init
-
-WVSTART "split --noop"
-WVPASS bup split --noop <"$top/t/testfile1" >noop.tmp
-WVPASSEQ '' "$(<noop.tmp)"
-WVPASS bup split --noop -b <"$top/t/testfile1" >tags1n.tmp
-WVPASS bup split --noop -t <"$top/t/testfile2" >tags2tn.tmp
-WVPASSEQ $(find "$BUP_DIR/objects/pack" -name '*.pack' | wc -l) 0
-
-WVSTART "split"
-WVPASS echo a >a.tmp
-WVPASS echo b >b.tmp
-WVPASS bup split -b a.tmp >taga.tmp
-WVPASS bup split -b b.tmp >tagb.tmp
-WVPASS cat a.tmp b.tmp | WVPASS bup split -b >tagab.tmp
-WVPASSEQ $(cat taga.tmp | wc -l) 1
-WVPASSEQ $(cat tagb.tmp | wc -l) 1
-WVPASSEQ $(cat tagab.tmp | wc -l) 1
-WVPASSEQ $(cat tag[ab].tmp | wc -l) 2
-WVPASSEQ "$(bup split -b a.tmp b.tmp)" "$(cat tagab.tmp)"
-WVPASSEQ "$(bup split -b --keep-boundaries a.tmp b.tmp)" "$(cat tag[ab].tmp)"
-WVPASSEQ "$(cat tag[ab].tmp | bup split -b --keep-boundaries --git-ids)" \
-         "$(cat tag[ab].tmp)"
-WVPASSEQ "$(cat tag[ab].tmp | bup split -b --git-ids)" \
-         "$(cat tagab.tmp)"
-WVPASS bup split --bench -b <"$top/t/testfile1" >tags1.tmp
-WVPASS bup split -vvvv -b "$top/t/testfile2" >tags2.tmp
-WVPASS echo -n "" | WVPASS bup split -n split_empty_string.tmp
-WVPASS bup margin
-WVPASS bup midx -f
-WVPASS bup midx --check -a
-WVPASS bup midx -o "$BUP_DIR/objects/pack/test1.midx" \
-       "$BUP_DIR"/objects/pack/*.idx
-WVPASS bup midx --check -a
-WVPASS bup midx -o "$BUP_DIR"/objects/pack/test1.midx \
-       "$BUP_DIR"/objects/pack/*.idx \
-       "$BUP_DIR"/objects/pack/*.idx
-WVPASS bup midx --check -a
-all=$(echo "$BUP_DIR"/objects/pack/*.idx "$BUP_DIR"/objects/pack/*.midx)
-WVPASS bup midx -o "$BUP_DIR"/objects/pack/zzz.midx $all
-WVPASS bup tick
-WVPASS bup midx -o "$BUP_DIR"/objects/pack/yyy.midx $all
-WVPASS bup midx -a
-WVPASSEQ "$(echo "$BUP_DIR"/objects/pack/*.midx)" \
-       ""$BUP_DIR"/objects/pack/yyy.midx"
-WVPASS bup margin
-WVPASS bup split -t "$top/t/testfile2" >tags2t.tmp
-WVPASS bup split -t "$top/t/testfile2" --fanout 3 >tags2tf.tmp
-WVPASS bup split -r "$BUP_DIR" -c "$top/t/testfile2" >tags2c.tmp
-WVPASS bup split -r ":$BUP_DIR" -c "$top/t/testfile2" >tags2c.tmp
-WVPASS ls -lR \
-    | WVPASS bup split -r ":$BUP_DIR" -c --fanout 3 --max-pack-objects 3 -n lslr \
-    || exit $?
-WVPASS bup ls
-WVFAIL bup ls /does-not-exist
-WVPASS bup ls /lslr
-WVPASS bup ls /lslr/latest
-WVPASS bup ls /lslr/latest/
-#WVPASS bup ls /lslr/1971-01-01   # all dates always exist
-WVFAIL diff -u tags1.tmp tags2.tmp
-WVPASS diff -u tags1.tmp tags1n.tmp
-WVPASS diff -u tags2t.tmp tags2tn.tmp
-
-# fanout must be different from non-fanout
-WVFAIL diff tags2t.tmp tags2tf.tmp
-WVPASS wc -c "$top/t/testfile1" "$top/t/testfile2"
-WVPASS wc -l tags1.tmp tags2.tmp
-
-WVSTART "join"
-WVPASS bup join $(cat tags1.tmp) >out1.tmp
-WVPASS bup join <tags2.tmp >out2.tmp
-WVPASS bup join <tags2t.tmp -o out2t.tmp
-WVPASS bup join -r "$BUP_DIR" <tags2c.tmp >out2c.tmp
-WVPASS bup join -r ":$BUP_DIR" <tags2c.tmp >out2c.tmp
-WVPASS diff -u "$top/t/testfile1" out1.tmp
-WVPASS diff -u "$top/t/testfile2" out2.tmp
-WVPASS diff -u "$top/t/testfile2" out2t.tmp
-WVPASS diff -u "$top/t/testfile2" out2c.tmp
-WVPASSEQ "$(bup join split_empty_string.tmp)" ""
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-tz.sh b/t/test-tz.sh
deleted file mode 100755 (executable)
index 4b566b1..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVSTART "half hour TZ"
-
-export TZ=ACDT-10:30
-
-WVPASS bup init
-WVPASS cd "$tmpdir"
-
-WVPASS mkdir src
-WVPASS bup index src
-WVPASS bup save -n src -d 1420164180 src
-
-WVPASSEQ "$(WVPASS git cat-file commit src | sed -ne 's/^author .*> //p')" \
-"1420164180 +1030"
-
-WVPASSEQ "$(WVPASS bup ls /src)" \
-"2015-01-02-123300
-latest"
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/test-web.sh b/t/test-web.sh
deleted file mode 100755 (executable)
index 24a68a4..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-#!/usr/bin/env bash
-. wvtest-bup.sh || exit $?
-. t/lib.sh || exit $?
-
-set -o pipefail
-
-TOP="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-
-bup()
-{
-    "$TOP/bup" "$@"
-}
-
-wait-for-server-start()
-{
-    curl --unix-socket ./socket http://localhost/
-    curl_status=$?
-    while test $curl_status -eq 7; do
-        sleep 0.2
-        curl --unix-socket ./socket http://localhost/
-        curl_status=$?
-    done
-    WVPASSEQ $curl_status 0
-}
-
-WVPASS cd "$tmpdir"
-
-# FIXME: add WVSKIP
-if test -z "$(type -p curl)"; then
-    WVSTART 'curl does not appear to be installed; skipping  test'
-    exit 0
-fi
-    
-WVPASS bup-cfg-py -c "import socket as s; s.socket(s.AF_UNIX).bind('socket')"
-curl -s --unix-socket ./socket http://localhost/foo
-if test $? -ne 7; then
-    WVSTART 'curl does not appear to support --unix-socket; skipping test'
-    exit 0
-fi
-
-if ! bup-python -c 'import tornado' 2> /dev/null; then
-    WVSTART 'unable to import tornado; skipping test'
-    exit 0
-fi
-
-WVSTART 'web'
-WVPASS bup init
-WVPASS mkdir src
-WVPASS echo '¡excitement!' > src/data
-WVPASS echo -e 'whee \x80\x90\xff' > "$(echo -ne 'src/whee \x80\x90\xff')"
-WVPASS bup index src
-WVPASS bup save -n '¡excitement!' --strip src
-
-"$TOP/bup" web unix://socket &
-web_pid=$!
-wait-for-server-start
-
-WVPASS curl --unix-socket ./socket \
-       'http://localhost/%C2%A1excitement%21/latest/data' > result
-WVPASS curl --unix-socket ./socket \
-       'http://localhost/%C2%A1excitement%21/latest/whee%20%80%90%ff' > result2
-WVPASSEQ "$(curl --unix-socket ./socket http://localhost/static/styles.css)" \
-         "$(cat "$TOP/lib/web/static/styles.css")"
-
-WVPASSEQ '¡excitement!' "$(cat result)"
-WVPASS cmp "$(echo -ne 'src/whee \x80\x90\xff')" result2
-WVPASS kill -s TERM "$web_pid"
-WVPASS wait "$web_pid"
-
-WVPASS rm -r "$tmpdir"
diff --git a/t/test-xdev.sh b/t/test-xdev.sh
deleted file mode 100755 (executable)
index e981706..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-#!/usr/bin/env bash
-. ./wvtest-bup.sh || exit $?
-
-set -o pipefail
-
-root_status="$(t/root-status)" || exit $?
-
-if [ "$root_status" != root ]; then
-    WVSTART 'not root: skipping tests'
-    exit 0 # FIXME: add WVSKIP.
-fi
-
-if ! modprobe loop; then
-    WVSTART 'unable to load loopback module; skipping tests' 1>&2
-    exit 0
-fi
-
-# These tests are only likely to work under Linux for now
-# (patches welcome).
-if ! [[ $(uname) =~ Linux ]]; then
-    WVSTART 'not Linux: skipping tests'
-    exit 0 # FIXME: add WVSKIP.
-fi
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-
-export BUP_DIR="$tmpdir/bup"
-export GIT_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS bup init
-WVPASS pushd "$tmpdir"
-
-WVSTART 'drecurse'
-
-WVPASS dd if=/dev/zero of=testfs-1.img bs=1M count=32
-WVPASS dd if=/dev/zero of=testfs-2.img bs=1M count=32
-WVPASS mkfs -F testfs-1.img # Don't care what type (though must have symlinks)
-WVPASS mkfs -F testfs-2.img # Don't care what type (though must have symlinks)
-WVPASS mkdir -p src/mnt-1/hidden-1 src/mnt-2/hidden-2
-WVPASS mount -o loop testfs-1.img src/mnt-1
-WVPASS mount -o loop testfs-2.img src/mnt-2
-
-WVPASS touch src/1
-
-WVPASS mkdir -p src/mnt-1/x
-WVPASS touch src/mnt-1/2 src/mnt-1/x/3
-
-WVPASS touch src/mnt-2/4
-
-(WVPASS cd src && WVPASS ln -s mnt-2 mnt-link)
-(WVPASS cd src && WVPASS ln -s . top)
-
-WVPASSEQ "$(bup drecurse src | grep -vF lost+found)" "src/top
-src/mnt-link
-src/mnt-2/4
-src/mnt-2/
-src/mnt-1/x/3
-src/mnt-1/x/
-src/mnt-1/2
-src/mnt-1/
-src/1
-src/"
-
-WVPASSEQ "$(bup drecurse -x src)" "src/top
-src/mnt-link
-src/mnt-2/
-src/mnt-1/
-src/1
-src/"
-
-WVSTART 'index/save/restore'
-
-WVPASS bup index src
-WVPASS bup save -n src src
-WVPASS mkdir src-restore
-WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
-WVPASS test -d src-restore/src
-WVPASS "$top/t/compare-trees" -c src/ src-restore/src/
-
-# Test -x when none of the mount points are explicitly indexed
-WVPASS rm -r "$BUP_DIR" src-restore
-WVPASS bup init
-WVPASS bup index -x src
-WVPASS bup save -n src src
-WVPASS mkdir src-restore
-WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
-WVPASS test -d src-restore/src
-WVPASSEQ "$(cd src-restore/src && find . -not -name lost+found | LC_ALL=C sort)" \
-".
-./1
-./mnt-1
-./mnt-2
-./mnt-link
-./top"
-
-# Test -x when a mount point is explicitly indexed.  This should
-# include the mount.
-WVPASS rm -r "$BUP_DIR" src-restore
-WVPASS bup init
-WVPASS bup index -x src src/mnt-2
-WVPASS bup save -n src src
-WVPASS mkdir src-restore
-WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
-WVPASS test -d src-restore/src
-WVPASSEQ "$(cd src-restore/src && find . -not -name lost+found | LC_ALL=C sort)" \
-".
-./1
-./mnt-1
-./mnt-2
-./mnt-2/4
-./mnt-link
-./top"
-
-# Test -x when a direct link to a mount point is explicitly indexed.
-# This should *not* include the mount.
-WVPASS rm -r "$BUP_DIR" src-restore
-WVPASS bup init
-WVPASS bup index -x src src/mnt-link
-WVPASS bup save -n src src
-WVPASS mkdir src-restore
-WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
-WVPASS test -d src-restore/src
-WVPASSEQ "$(cd src-restore/src && find . -not -name lost+found | LC_ALL=C sort)" \
-".
-./1
-./mnt-1
-./mnt-2
-./mnt-link
-./top"
-
-# Test -x when a path that resolves to a mount point is explicitly
-# indexed (i.e. dir symlnks that redirect the leaf to a mount point).
-# This should include the mount.
-WVPASS rm -r "$BUP_DIR" src-restore
-WVPASS bup init
-WVPASS bup index -x src src/top/top/mnt-2
-WVPASS bup save -n src src
-WVPASS mkdir src-restore
-WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
-WVPASS test -d src-restore/src
-WVPASSEQ "$(cd src-restore/src && find . -not -name lost+found | LC_ALL=C sort)" \
-".
-./1
-./mnt-1
-./mnt-2
-./mnt-2/4
-./mnt-link
-./top"
-
-WVPASS cd "$top"
-WVPASS umount "$tmpdir/src/mnt-1"
-WVPASS umount "$tmpdir/src/mnt-2"
-WVPASS rm -r "$tmpdir"
diff --git a/t/test.sh b/t/test.sh
deleted file mode 100755 (executable)
index fb20023..0000000
--- a/t/test.sh
+++ /dev/null
@@ -1,132 +0,0 @@
-#!/usr/bin/env bash
-. wvtest.sh
-. wvtest-bup.sh
-. t/lib.sh
-
-set -o pipefail
-
-top="$(WVPASS pwd)" || exit $?
-tmpdir="$(WVPASS wvmktempdir)" || exit $?
-export BUP_DIR="$tmpdir/bup"
-
-bup() { "$top/bup" "$@"; }
-
-WVPASS cd "$tmpdir"
-
-WVSTART "init"
-WVPASS bup init
-D=bupdata.tmp
-WVPASS force-delete $D
-WVPASS mkdir $D
-WVPASS touch $D/a
-WVPASS bup random 128k >$D/b
-WVPASS mkdir $D/d $D/d/e
-WVPASS bup random 512 >$D/f
-WVPASS touch $D/d/z
-WVPASS touch $D/d/z
-WVPASS bup index $D
-WVPASS bup save -t $D
-
-
-WVSTART "bloom"
-WVPASS bup bloom -c $(ls -1 "$BUP_DIR"/objects/pack/*.idx|head -n1)
-WVPASS rm "$BUP_DIR"/objects/pack/bup.bloom
-WVPASS bup bloom -k 4
-WVPASS bup bloom -c $(ls -1 "$BUP_DIR"/objects/pack/*.idx|head -n1)
-WVPASS bup bloom -d "$BUP_DIR"/objects/pack --ruin --force
-WVFAIL bup bloom -c $(ls -1 "$BUP_DIR"/objects/pack/*.idx|head -n1)
-WVPASS bup bloom --force -k 5
-WVPASS bup bloom -c $(ls -1 "$BUP_DIR"/objects/pack/*.idx|head -n1)
-
-
-WVSTART "memtest"
-WVPASS bup memtest -c1 -n100
-WVPASS bup memtest -c1 -n100 --existing
-
-
-WVSTART "save/git-fsck"
-(
-    WVPASS cd "$BUP_DIR"
-    #git repack -Ad
-    #git prune
-    WVPASS bup random 4k | WVPASS bup split -b
-    (WVPASS cd "$top/t/sampledata" && WVPASS bup save -vvn master /) || exit $?
-    result="$(LC_ALL=C git fsck --full --strict 2>&1)" || exit $?
-    n=$(echo "$result" |
-        WVFAIL egrep -v 'dangling (commit|tree|blob)' |
-        WVPASS tee -a /dev/stderr |
-        WVPASS wc -l) || exit $?
-    WVPASS [ "$n" -eq 0 ]
-) || exit $?
-
-
-WVSTART "ftp"
-WVPASS bup ftp "cat /master/latest/$tmpdir/$D/b" >$D/b.new
-WVPASS bup ftp "cat /master/latest/$tmpdir/$D/f" >$D/f.new
-WVPASS bup ftp "cat /master/latest/$tmpdir/$D/f"{,} >$D/f2.new
-WVPASS bup ftp "cat /master/latest/$tmpdir/$D/a" >$D/a.new
-WVPASSEQ "$(sha1sum <$D/b)" "$(sha1sum <$D/b.new)"
-WVPASSEQ "$(sha1sum <$D/f)" "$(sha1sum <$D/f.new)"
-WVPASSEQ "$(cat $D/f.new{,} | sha1sum)" "$(sha1sum <$D/f2.new)"
-WVPASSEQ "$(sha1sum <$D/a)" "$(sha1sum <$D/a.new)"
-
-
-WVSTART "tag"
-WVFAIL bup tag -d v0.n 2>/dev/null
-WVFAIL bup tag v0.n non-existant 2>/dev/null
-WVPASSEQ "$(bup tag)" ""
-WVPASS bup tag v0.1 master
-WVPASSEQ "$(bup tag)" "v0.1"
-WVFAIL bup tag v0.1 master
-WVPASS bup tag -f v0.1 master
-WVPASS bup tag -d v0.1
-WVPASS bup tag -f -d v0.1
-WVFAIL bup tag -d v0.1
-
-
-WVSTART "indexfile"
-D=indexfile.tmp
-INDEXFILE=tmpindexfile.tmp
-WVPASS rm -f $INDEXFILE
-WVPASS force-delete $D
-WVPASS mkdir $D
-export BUP_DIR="$D/.bup"
-WVPASS bup init
-WVPASS touch $D/a
-WVPASS touch $D/b
-WVPASS mkdir $D/c
-WVPASS bup index -ux $D
-WVPASS bup save --strip -n bupdir $D
-WVPASSEQ "$(bup ls -F bupdir/latest/)" "a
-b
-c/"
-WVPASS bup index -f $INDEXFILE --exclude=$D/c -ux $D
-WVPASS bup save --strip -n indexfile -f $INDEXFILE $D
-WVPASSEQ "$(bup ls indexfile/latest/)" "a
-b"
-
-
-WVSTART "import-rsnapshot"
-D=rsnapshot.tmp
-export BUP_DIR="$tmpdir/$D/.bup"
-WVPASS force-delete $D
-WVPASS mkdir $D
-WVPASS bup init
-WVPASS mkdir -p $D/hourly.0/buptest/a
-WVPASS touch $D/hourly.0/buptest/a/b
-WVPASS mkdir -p $D/hourly.0/buptest/c/d
-WVPASS touch $D/hourly.0/buptest/c/d/e
-WVPASS true
-WVPASS bup import-rsnapshot $D/
-WVPASSEQ "$(bup ls -F buptest/latest/)" "a/
-c/"
-
-
-WVSTART features
-expect_py_ver=$(LC_CTYPE=C "$top/config/bin/python" \
-                        -c 'import platform; print(platform.python_version())') \
-    || exit $?
-actual_py_ver=$(bup features | grep Python: | sed -Ee 's/ +Python: //') || exit $?
-WVPASSEQ "$expect_py_ver" "$actual_py_ver"
-
-WVPASS rm -rf "$tmpdir"
diff --git a/t/testfile1 b/t/testfile1
deleted file mode 100644 (file)
index 31ee979..0000000
+++ /dev/null
@@ -1,5580 +0,0 @@
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg bcgvbaf, qerphefr
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc qerphefr <cngu>
---
-k,kqri,bar-svyr-flfgrz   qba'g pebff svyrflfgrz obhaqnevrf
-d,dhvrg  qba'g npghnyyl cevag svyranzrf
-cebsvyr  eha haqre gur clguba cebsvyre
-"""
-b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar svyranzr rkcrpgrq")
-
-vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
-vs bcg.cebsvyr:
-    vzcbeg pCebsvyr
-    qrs qb_vg():
-        sbe v va vg:
-            cnff
-    pCebsvyr.eha('qb_vg()')
-ryfr:
-    vs bcg.dhvrg:
-        sbe v va vg:
-            cnff
-    ryfr:
-        sbe (anzr,fg) va vg:
-            cevag anzr
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-o,oybof    bhgchg n frevrf bs oybo vqf
-g,gerr     bhgchg n gerr vq
-p,pbzzvg   bhgchg n pbzzvg vq
-a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
-A,abbc     qba'g npghnyyl fnir gur qngn naljurer
-d,dhvrg    qba'g cevag cebterff zrffntrf
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-pbcl       whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
-orapu      cevag orapuznex gvzvatf gb fgqree
-znk-cnpx-fvmr=  znkvzhz olgrf va n fvatyr cnpx
-znk-cnpx-bowrpgf=  znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
-snabhg=  znkvzhz ahzore bs oybof va n fvatyr gerr
-"""
-b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
-        bcg.abbc be bcg.pbcl):
-    b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
-vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be 
-                               bcg.pbzzvg be bcg.anzr):
-    b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
-
-vs bcg.ireobfr >= 2:
-    tvg.ireobfr = bcg.ireobfr - 1
-    bcg.orapu = 1
-vs bcg.znk_cnpx_fvmr:
-    unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
-vs bcg.znk_cnpx_bowrpgf:
-    unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
-vs bcg.snabhg:
-    unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
-vs bcg.oybof:
-    unfufcyvg.snabhg = 0
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
-    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-fgneg_gvzr = gvzr.gvzr()
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.abbc be bcg.pbcl:
-    pyv = j = byqers = Abar
-ryvs bcg.erzbgr be vf_erirefr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
-    j = pyv.arj_cnpxjevgre()
-ryfr:
-    pyv = Abar
-    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
-    j = tvg.CnpxJevgre()
-
-svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
-vs j:
-    funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
-    gerr = j.arj_gerr(funyvfg)
-ryfr:
-    ynfg = 0
-    sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
-        unfufcyvg.gbgny_fcyvg += yra(oybo)
-        vs bcg.pbcl:
-            flf.fgqbhg.jevgr(fge(oybo))
-        zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
-        vs abg bcg.dhvrg naq ynfg != zrtf:
-            cebterff('%q Zolgrf ernq\e' % zrtf)
-            ynfg = zrtf
-    cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
-
-vs bcg.ireobfr:
-    ybt('\a')
-vs bcg.oybof:
-    sbe (zbqr,anzr,ova) va funyvfg:
-        cevag ova.rapbqr('urk')
-vs bcg.gerr:
-    cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
-    zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
-    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
-    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
-    vs bcg.pbzzvg:
-        cevag pbzzvg.rapbqr('urk')
-
-vs j:
-    j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
-        
-vs bcg.anzr:
-    vs pyv:
-        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
-    ryfr:
-        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
-    pyv.pybfr()
-
-frpf = gvzr.gvzr() - fgneg_gvzr
-fvmr = unfufcyvg.gbgny_fcyvg
-vs bcg.orapu:
-    ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
-        % (fvmr/1024., frpf, fvmr/1024./frpf))
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, fgehpg, zznc
-sebz ohc vzcbeg tvg, bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs f_sebz_olgrf(olgrf):
-    pyvfg = [pue(o) sbe o va olgrf]
-    erghea ''.wbva(pyvfg)
-
-
-qrs ercbeg(pbhag):
-    svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
-    q = {}
-    sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
-        y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
-        q[y[0]] = y[1]
-    vs pbhag >= 0:
-        r1 = pbhag
-        svryqf = [q[x] sbe x va svryqf]
-    ryfr:
-        r1 = ''
-    cevag ('%9f  ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
-    flf.fgqbhg.syhfu()
-
-
-bcgfcrp = """
-ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
---
-a,ahzore=  ahzore bs bowrpgf cre plpyr
-p,plpyrf=  ahzore bs plpyrf gb eha
-vtaber-zvqk  vtaber .zvqk svyrf, hfr bayl .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-tvg.vtaber_zvqk = bcg.vtaber_zvqk
-
-tvg.purpx_ercb_be_qvr()
-z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-
-plpyrf = bcg.plpyrf be 100
-ahzore = bcg.ahzore be 10000
-
-ercbeg(-1)
-s = bcra('/qri/henaqbz')
-n = zznc.zznc(-1, 20)
-ercbeg(0)
-sbe p va kenatr(plpyrf):
-    sbe a va kenatr(ahzore):
-        o = s.ernq(3)
-        vs 0:
-            olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
-            olgrf[2] &= 0ks0
-            ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
-        ryfr:
-            n[0:2] = o[0:2]
-            n[2] = pue(beq(o[2]) & 0ks0)
-            ova = fge(n[0:20])
-        #cevag ova.rapbqr('urk')
-        z.rkvfgf(ova)
-    ercbeg((p+1)*ahzore)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-qrs cevag_abqr(grkg, a):
-    cersvk = ''
-    vs bcg.unfu:
-        cersvk += "%f " % a.unfu.rapbqr('urk')
-    vs fgng.F_VFQVE(a.zbqr):
-        cevag '%f%f/' % (cersvk, grkg)
-    ryvs fgng.F_VFYAX(a.zbqr):
-        cevag '%f%f@' % (cersvk, grkg)
-    ryfr:
-        cevag '%f%f' % (cersvk, grkg)
-
-
-bcgfcrp = """
-ohc yf <qvef...>
---
-f,unfu   fubj unfu sbe rnpu svyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-
-vs abg rkgen:
-    rkgen = ['/']
-
-erg = 0
-sbe q va rkgen:
-    gel:
-        a = gbc.yerfbyir(q)
-        vs fgng.F_VFQVE(a.zbqr):
-            sbe fho va a:
-                cevag_abqr(fho.anzr, fho)
-        ryfr:
-            cevag_abqr(q, a)
-    rkprcg isf.AbqrReebe, r:
-        ybt('reebe: %f\a' % r)
-        erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
-sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
-sebz ohc.urycref vzcbeg *
-
-qrs abqr_anzr(grkg, a):
-    vs fgng.F_VFQVE(a.zbqr):
-        erghea '%f/' % grkg
-    ryvs fgng.F_VFYAX(a.zbqr):
-        erghea '%f@' % grkg
-    ryfr:
-        erghea '%f' % grkg
-
-
-qrs qb_yf(cngu, a):
-    y = []
-    vs fgng.F_VFQVE(a.zbqr):
-        sbe fho va a:
-            y.nccraq(abqr_anzr(fho.anzr, fho))
-    ryfr:
-        y.nccraq(abqr_anzr(cngu, a))
-    cevag pbyhzangr(y, '')
-    
-
-qrs jevgr_gb_svyr(vas, bhgs):
-    sbe oybo va puhaxlernqre(vas):
-        bhgs.jevgr(oybo)
-    
-
-qrs vachgvgre():
-    vs bf.vfnggl(flf.fgqva.svyrab()):
-        juvyr 1:
-            gel:
-                lvryq enj_vachg('ohc> ')
-            rkprcg RBSReebe:
-                oernx
-    ryfr:
-        sbe yvar va flf.fgqva:
-            lvryq yvar
-
-
-qrs _pbzcyrgre_trg_fhof(yvar):
-    (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
-    (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
-    #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
-    a = cjq.erfbyir(qve)
-    fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
-                       a.fhof()))
-    erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
-
-
-_ynfg_yvar = Abar
-_ynfg_erf = Abar
-qrs pbzcyrgre(grkg, fgngr):
-    tybony _ynfg_yvar
-    tybony _ynfg_erf
-    gel:
-        yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
-        vs _ynfg_yvar != yvar:
-            _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
-            _ynfg_yvar = yvar
-        (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
-        vs fgngr < yra(fhof):
-            fa = fhof[fgngr]
-            fa1 = fa.erfbyir('')  # qrers flzyvaxf
-            shyyanzr = bf.cngu.wbva(qve, fa.anzr)
-            vs fgng.F_VFQVE(fa1.zbqr):
-                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
-                                          grezvangr=Snyfr)
-            ryfr:
-                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
-                                          grezvangr=Gehr) + ' '
-            erghea grkg + erg
-    rkprcg Rkprcgvba, r:
-        ybt('\areebe va pbzcyrgvba: %f\a' % r)
-
-            
-bcgfcrp = """
-ohc sgc
-"""
-b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-gbc = isf.ErsYvfg(Abar)
-cjq = gbc
-
-vs rkgen:
-    yvarf = rkgen
-ryfr:
-    ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
-    ernqyvar.frg_pbzcyrgre(pbzcyrgre)
-    ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
-    yvarf = vachgvgre()
-
-sbe yvar va yvarf:
-    vs abg yvar.fgevc():
-        pbagvahr
-    jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
-    pzq = jbeqf[0].ybjre()
-    #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
-    gel:
-        vs pzq == 'yf':
-            sbe cnez va (jbeqf[1:] be ['.']):
-                qb_yf(cnez, cjq.erfbyir(cnez))
-        ryvs pzq == 'pq':
-            sbe cnez va jbeqf[1:]:
-                cjq = cjq.erfbyir(cnez)
-        ryvs pzq == 'cjq':
-            cevag cjq.shyyanzr()
-        ryvs pzq == 'png':
-            sbe cnez va jbeqf[1:]:
-                jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
-        ryvs pzq == 'trg':
-            vs yra(jbeqf) abg va [2,3]:
-                envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
-            eanzr = jbeqf[1]
-            (qve,onfr) = bf.cngu.fcyvg(eanzr)
-            yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
-            vas = cjq.erfbyir(eanzr).bcra()
-            ybt('Fnivat %e\a' % yanzr)
-            jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
-        ryvs pzq == 'ztrg':
-            sbe cnez va jbeqf[1:]:
-                (qve,onfr) = bf.cngu.fcyvg(cnez)
-                sbe a va cjq.erfbyir(qve).fhof():
-                    vs sazngpu.sazngpu(a.anzr, onfr):
-                        gel:
-                            ybt('Fnivat %e\a' % a.anzr)
-                            vas = a.bcra()
-                            bhgs = bcra(a.anzr, 'jo')
-                            jevgr_gb_svyr(vas, bhgs)
-                            bhgs.pybfr()
-                        rkprcg Rkprcgvba, r:
-                            ybt('  reebe: %f\a' % r)
-        ryvs pzq == 'uryc' be pzq == '?':
-            ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
-        ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
-            oernx
-        ryfr:
-            envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
-    rkprcg Rkprcgvba, r:
-        ybt('reebe: %f\a' % r)
-        #envfr
-#!/hfe/ova/rai clguba
-vzcbeg flf, zznc
-sebz ohc vzcbeg bcgvbaf, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc enaqbz [-F frrq] <ahzolgrf>
---
-F,frrq=   bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
-s,sbepr   cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
-"""
-b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-gbgny = cnefr_ahz(rkgen[0])
-
-vs bcg.sbepr be (abg bf.vfnggl(1) naq
-                 abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
-    _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
-ryfr:
-    ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc uryc <pbzznaq>
-"""
-b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) == 0:
-    # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
-    bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
-ryvs yra(rkgen) == 1:
-    qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
-    rkr = flf.neti[0]
-    (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
-    znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
-    t = tybo.tybo(znacngu)
-    vs t:
-        bf.rkrpic('zna', ['zna', '-y', t[0]])
-    ryfr:
-        bf.rkrpic('zna', ['zna', qbpanzr])
-ryfr:
-    b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-
-pynff Fgng(shfr.Fgng):
-    qrs __vavg__(frys):
-        frys.fg_zbqr = 0
-        frys.fg_vab = 0
-        frys.fg_qri = 0
-        frys.fg_ayvax = 0
-        frys.fg_hvq = 0
-        frys.fg_tvq = 0
-        frys.fg_fvmr = 0
-        frys.fg_ngvzr = 0
-        frys.fg_zgvzr = 0
-        frys.fg_pgvzr = 0
-        frys.fg_oybpxf = 0
-        frys.fg_oyxfvmr = 0
-        frys.fg_eqri = 0
-
-
-pnpur = {}
-qrs pnpur_trg(gbc, cngu):
-    cnegf = cngu.fcyvg('/')
-    pnpur[('',)] = gbc
-    p = Abar
-    znk = yra(cnegf)
-    #ybt('pnpur: %e\a' % pnpur.xrlf())
-    sbe v va enatr(znk):
-        cer = cnegf[:znk-v]
-        #ybt('pnpur gelvat: %e\a' % cer)
-        p = pnpur.trg(ghcyr(cer))
-        vs p:
-            erfg = cnegf[znk-v:]
-            sbe e va erfg:
-                #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
-                p = p.yerfbyir(e)
-                xrl = ghcyr(cer + [e])
-                #ybt('fnivat: %e\a' % (xrl,))
-                pnpur[xrl] = p
-            oernx
-    nffreg(p)
-    erghea p
-        
-    
-
-pynff OhcSf(shfr.Shfr):
-    qrs __vavg__(frys, gbc):
-        shfr.Shfr.__vavg__(frys)
-        frys.gbc = gbc
-    
-    qrs trgngge(frys, cngu):
-        ybt('--trgngge(%e)\a' % cngu)
-        gel:
-            abqr = pnpur_trg(frys.gbc, cngu)
-            fg = Fgng()
-            fg.fg_zbqr = abqr.zbqr
-            fg.fg_ayvax = abqr.ayvaxf()
-            fg.fg_fvmr = abqr.fvmr()
-            fg.fg_zgvzr = abqr.zgvzr
-            fg.fg_pgvzr = abqr.pgvzr
-            fg.fg_ngvzr = abqr.ngvzr
-            erghea fg
-        rkprcg isf.AbFhpuSvyr:
-            erghea -reeab.RABRAG
-
-    qrs ernqqve(frys, cngu, bssfrg):
-        ybt('--ernqqve(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        lvryq shfr.Qveragel('.')
-        lvryq shfr.Qveragel('..')
-        sbe fho va abqr.fhof():
-            lvryq shfr.Qveragel(fho.anzr)
-
-    qrs ernqyvax(frys, cngu):
-        ybt('--ernqyvax(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        erghea abqr.ernqyvax()
-
-    qrs bcra(frys, cngu, syntf):
-        ybt('--bcra(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
-        vs (syntf & nppzbqr) != bf.B_EQBAYL:
-            erghea -reeab.RNPPRF
-        abqr.bcra()
-
-    qrs eryrnfr(frys, cngu, syntf):
-        ybt('--eryrnfr(%e)\a' % cngu)
-
-    qrs ernq(frys, cngu, fvmr, bssfrg):
-        ybt('--ernq(%e)\a' % cngu)
-        a = pnpur_trg(frys.gbc, cngu)
-        b = a.bcra()
-        b.frrx(bssfrg)
-        erghea b.ernq(fvmr)
-
-
-vs abg unfngge(shfr, '__irefvba__'):
-    envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
-shfr.shfr_clguba_ncv = (0, 2)
-
-
-bcgfcrp = """
-ohc shfr [-q] [-s] <zbhagcbvag>
---
-q,qroht   vapernfr qroht yriry
-s,sbertebhaq  eha va sbertebhaq
-"""
-b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-s = OhcSf(gbc)
-s.shfr_netf.zbhagcbvag = rkgen[0]
-vs bcg.qroht:
-    s.shfr_netf.nqq('qroht')
-vs bcg.sbertebhaq:
-    s.shfr_netf.frgzbq('sbertebhaq')
-cevag s.zhygvguernqrq
-s.zhygvguernqrq = Snyfr
-
-s.znva()
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-
-vs bcg.erzbgr:
-    tvg.vavg_ercb()  # ybpny ercb
-    tvg.purpx_ercb_be_qvr()
-    pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
-    pyv.pybfr()
-ryfr:
-    tvg.vavg_ercb()
-#!/hfe/ova/rai clguba
-vzcbeg flf, zngu, fgehpg, tybo
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-CNTR_FVMR=4096
-FUN_CRE_CNTR=CNTR_FVMR/200.
-
-
-qrs zretr(vqkyvfg, ovgf, gnoyr):
-    pbhag = 0
-    sbe r va tvg.vqkzretr(vqkyvfg):
-        pbhag += 1
-        cersvk = tvg.rkgenpg_ovgf(r, ovgf)
-        gnoyr[cersvk] = pbhag
-        lvryq r
-
-
-qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
-    vs abg bhgsvyranzr:
-        nffreg(bhgqve)
-        fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
-        bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
-    
-    vac = []
-    gbgny = 0
-    sbe anzr va vasvyranzrf:
-        vk = tvg.CnpxVqk(anzr)
-        vac.nccraq(vk)
-        gbgny += yra(vk)
-
-    ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
-    vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
-       be (bcg.sbepr naq abg gbgny):
-        ybt('zvqk: abguvat gb qb.\a')
-        erghea
-
-    cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
-    ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
-    ragevrf = 2**ovgf
-    ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
-    
-    gnoyr = [0]*ragevrf
-
-    gel:
-        bf.hayvax(bhgsvyranzr)
-    rkprcg BFReebe:
-        cnff
-    s = bcra(bhgsvyranzr + '.gzc', 'j+')
-    s.jevgr('ZVQK\0\0\0\2')
-    s.jevgr(fgehpg.cnpx('!V', ovgf))
-    nffreg(s.gryy() == 12)
-    s.jevgr('\0'*4*ragevrf)
-    
-    sbe r va zretr(vac, ovgf, gnoyr):
-        s.jevgr(r)
-        
-    s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
-
-    s.frrx(12)
-    s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
-    s.pybfr()
-    bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
-
-    # guvf vf whfg sbe grfgvat
-    vs 0:
-        c = tvg.CnpxZvqk(bhgsvyranzr)
-        nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
-        cevag c.vqkanzrf
-        nffreg(yra(c) == gbgny)
-        cv = vgre(c)
-        sbe v va zretr(vac, gbgny, ovgf, gnoyr):
-            nffreg(v == cv.arkg())
-            nffreg(c.rkvfgf(v))
-
-    cevag bhgsvyranzr
-
-bcgfcrp = """
-ohc zvqk [bcgvbaf...] <vqkanzrf...>
---
-b,bhgchg=  bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
-n,nhgb     nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
-s,sbepr    nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen naq (bcg.nhgb be bcg.sbepr):
-    b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
-
-tvg.purpx_ercb_be_qvr()
-
-vs rkgen:
-    qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
-ryvs bcg.nhgb be bcg.sbepr:
-    cnguf = [tvg.ercb('bowrpgf/cnpx')]
-    cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
-    sbe cngu va cnguf:
-        ybt('zvqk: fpnaavat %f\a' % cngu)
-        vs bcg.sbepr:
-            qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
-        ryvs bcg.nhgb:
-            z = tvg.CnpxVqkYvfg(cngu)
-            arrqrq = {}
-            sbe cnpx va z.cnpxf:  # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
-                vs cnpx.anzr.raqfjvgu('.vqk'):
-                    arrqrq[cnpx.anzr] = 1
-            qry z
-            qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
-        ybt('\a')
-ryfr:
-    b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, enaqbz
-sebz ohc vzcbeg bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs enaqoybpx(a):
-    y = []
-    sbe v va kenatr(a):
-        y.nccraq(pue(enaqbz.enaqenatr(0,256)))
-    erghea ''.wbva(y)
-
-
-bcgfcrp = """
-ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
---
-   JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
-a,ahz=   ahzore bs oybpxf gb qnzntr
-f,fvmr=  znkvzhz fvmr bs rnpu qnzntrq oybpx
-creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
-rdhny    fcernq qnzntr rirayl guebhtubhg gur svyr
-F,frrq=  enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
-"""
-b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg rkgen:
-    b.sngny('svyranzrf rkcrpgrq')
-
-vs bcg.frrq != Abar:
-    enaqbz.frrq(bcg.frrq)
-
-sbe anzr va rkgen:
-    ybt('Qnzntvat "%f"...\a' % anzr)
-    s = bcra(anzr, 'e+o')
-    fg = bf.sfgng(s.svyrab())
-    fvmr = fg.fg_fvmr
-    vs bcg.creprag be bcg.fvmr:
-        zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
-        zf2 = bcg.fvmr be fvmr
-        znkfvmr = zva(zf1, zf2)
-    ryfr:
-        znkfvmr = 1
-    puhaxf = bcg.ahz be 10
-    puhaxfvmr = fvmr/puhaxf
-    sbe e va enatr(puhaxf):
-        fm = enaqbz.enaqenatr(1, znkfvmr+1)
-        vs fm > fvmr:
-            fm = fvmr
-        vs bcg.rdhny:
-            bsf = e*puhaxfvmr
-        ryfr:
-            bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
-        ybt('  %6q olgrf ng %q\a' % (fm, bsf))
-        s.frrx(bsf)
-        s.jevgr(enaqoybpx(fm))
-    s.pybfr()
-#!/hfe/ova/rai clguba
-vzcbeg flf, fgehpg, zznc
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-fhfcraqrq_j = Abar
-
-
-qrs vavg_qve(pbaa, net):
-    tvg.vavg_ercb(net)
-    ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
-    pbaa.bx()
-
-
-qrs frg_qve(pbaa, net):
-    tvg.purpx_ercb_be_qvr(net)
-    ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
-    pbaa.bx()
-
-    
-qrs yvfg_vaqrkrf(pbaa, whax):
-    tvg.purpx_ercb_be_qvr()
-    sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
-        vs s.raqfjvgu('.vqk'):
-            pbaa.jevgr('%f\a' % s)
-    pbaa.bx()
-
-
-qrs fraq_vaqrk(pbaa, anzr):
-    tvg.purpx_ercb_be_qvr()
-    nffreg(anzr.svaq('/') < 0)
-    nffreg(anzr.raqfjvgu('.vqk'))
-    vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
-    pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
-    pbaa.jevgr(vqk.znc)
-    pbaa.bx()
-
-
-qrs erprvir_bowrpgf(pbaa, whax):
-    tybony fhfcraqrq_j
-    tvg.purpx_ercb_be_qvr()
-    fhttrfgrq = {}
-    vs fhfcraqrq_j:
-        j = fhfcraqrq_j
-        fhfcraqrq_j = Abar
-    ryfr:
-        j = tvg.CnpxJevgre()
-    juvyr 1:
-        af = pbaa.ernq(4)
-        vs abg af:
-            j.nobeg()
-            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
-        a = fgehpg.hacnpx('!V', af)[0]
-        #ybt('rkcrpgvat %q olgrf\a' % a)
-        vs abg a:
-            ybt('ohc freire: erprvirq %q bowrpg%f.\a' 
-                % (j.pbhag, j.pbhag!=1 naq "f" be ''))
-            shyycngu = j.pybfr()
-            vs shyycngu:
-                (qve, anzr) = bf.cngu.fcyvg(shyycngu)
-                pbaa.jevgr('%f.vqk\a' % anzr)
-            pbaa.bx()
-            erghea
-        ryvs a == 0kssssssss:
-            ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
-            fhfcraqrq_j = j
-            pbaa.bx()
-            erghea
-            
-        ohs = pbaa.ernq(a)  # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
-        #ybt('ernq %q olgrf\a' % a)
-        vs yra(ohs) < a:
-            j.nobeg()
-            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
-                            % (a, yra(ohs)))
-        (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
-        fun = tvg.pnyp_unfu(glcr, pbagrag)
-        byqcnpx = j.rkvfgf(fun)
-        # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
-        # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
-        # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
-        # ba gur freire fvqr.
-        vs abg fhttrfgrq naq \
-          byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
-            # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
-            # ng guvf ynlre.  Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
-            # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
-            # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
-            # znxr gur svyrf ovttre.  Guvf zrgubq vf pregnvayl abg irel
-            # rssvpvrag.
-            j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
-            byqcnpx = j.bowpnpur.rkvfgf(fun)
-            ybt('arj fhttrfgvba: %e\a' % byqcnpx)
-            nffreg(byqcnpx)
-            nffreg(byqcnpx != Gehr)
-            nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
-            j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
-        vs abg fhttrfgrq naq byqcnpx:
-            nffreg(byqcnpx.raqfjvgu('.vqk'))
-            (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
-            vs abg (anzr va fhttrfgrq):
-                ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
-                pbaa.jevgr('vaqrk %f\a' % anzr)
-                fhttrfgrq[anzr] = 1
-        ryfr:
-            j._enj_jevgr([ohs])
-    # ABGERNPURQ
-
-
-qrs ernq_ers(pbaa, ersanzr):
-    tvg.purpx_ercb_be_qvr()
-    e = tvg.ernq_ers(ersanzr)
-    pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
-    pbaa.bx()
-
-
-qrs hcqngr_ers(pbaa, ersanzr):
-    tvg.purpx_ercb_be_qvr()
-    arjiny = pbaa.ernqyvar().fgevc()
-    byqiny = pbaa.ernqyvar().fgevc()
-    tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
-    pbaa.bx()
-
-
-qrs png(pbaa, vq):
-    tvg.purpx_ercb_be_qvr()
-    gel:
-        sbe oybo va tvg.png(vq):
-            pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
-            pbaa.jevgr(oybo)
-    rkprcg XrlReebe, r:
-        ybt('freire: reebe: %f\a' % r)
-        pbaa.jevgr('\0\0\0\0')
-        pbaa.reebe(r)
-    ryfr:
-        pbaa.jevgr('\0\0\0\0')
-        pbaa.bx()
-
-
-bcgfcrp = """
-ohc freire
-"""
-b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-ybt('ohc freire: ernqvat sebz fgqva.\a')
-
-pbzznaqf = {
-    'vavg-qve': vavg_qve,
-    'frg-qve': frg_qve,
-    'yvfg-vaqrkrf': yvfg_vaqrkrf,
-    'fraq-vaqrk': fraq_vaqrk,
-    'erprvir-bowrpgf': erprvir_bowrpgf,
-    'ernq-ers': ernq_ers,
-    'hcqngr-ers': hcqngr_ers,
-    'png': png,
-}
-
-# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
-# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
-pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
-ye = yvarernqre(pbaa)
-sbe _yvar va ye:
-    yvar = _yvar.fgevc()
-    vs abg yvar:
-        pbagvahr
-    ybt('ohc freire: pbzznaq: %e\a' % yvar)
-    jbeqf = yvar.fcyvg(' ', 1)
-    pzq = jbeqf[0]
-    erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
-    vs pzq == 'dhvg':
-        oernx
-    ryfr:
-        pzq = pbzznaqf.trg(pzq)
-        vs pzq:
-            pzq(pbaa, erfg)
-        ryfr:
-            envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
-
-ybt('ohc freire: qbar\a')
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
-    rkgen = yvarernqre(flf.fgqva)
-
-erg = 0
-
-vs bcg.erzbgr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    png = pyv.png
-ryfr:
-    pc = tvg.PngCvcr()
-    png = pc.wbva
-
-sbe vq va rkgen:
-    gel:
-        sbe oybo va png(vq):
-            flf.fgqbhg.jevgr(oybo)
-    rkprcg XrlReebe, r:
-        flf.fgqbhg.syhfu()
-        ybt('reebe: %f\a' % r)
-        erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, reeab, fgng, gvzr, zngu
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc fnir [-gp] [-a anzr] <svyranzrf...>
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-g,gerr     bhgchg n gerr vq
-p,pbzzvg   bhgchg n pbzzvg vq
-a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-d,dhvrg    qba'g fubj cebterff zrgre
-fznyyre=   bayl onpx hc svyrf fznyyre guna a olgrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
-    b.sngny("hfr bar be zber bs -g, -p, -a")
-vs abg rkgen:
-    b.sngny("ab svyranzrf tvira")
-
-bcg.cebterff = (vfggl naq abg bcg.dhvrg)
-bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
-    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.erzbgr be vf_erirefr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
-    j = pyv.arj_cnpxjevgre()
-ryfr:
-    pyv = Abar
-    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
-    j = tvg.CnpxJevgre()
-
-unaqyr_pgey_p()
-
-
-qrs rngfynfu(qve):
-    vs qve.raqfjvgu('/'):
-        erghea qve[:-1]
-    ryfr:
-        erghea qve
-
-
-cnegf = ['']
-funyvfgf = [[]]
-
-qrs _chfu(cneg):
-    nffreg(cneg)
-    cnegf.nccraq(cneg)
-    funyvfgf.nccraq([])
-
-qrs _cbc(sbepr_gerr):
-    nffreg(yra(cnegf) >= 1)
-    cneg = cnegf.cbc()
-    funyvfg = funyvfgf.cbc()
-    gerr = sbepr_gerr be j.arj_gerr(funyvfg)
-    vs funyvfgf:
-        funyvfgf[-1].nccraq(('40000', cneg, gerr))
-    ryfr:  # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
-        funyvfgf.nccraq(funyvfg)
-    erghea gerr
-
-ynfgerznva = Abar
-qrs cebterff_ercbeg(a):
-    tybony pbhag, fhopbhag, ynfgerznva
-    fhopbhag += a
-    pp = pbhag + fhopbhag
-    cpg = gbgny naq (pp*100.0/gbgny) be 0
-    abj = gvzr.gvzr()
-    ryncfrq = abj - gfgneg
-    xcf = ryncfrq naq vag(pp/1024./ryncfrq)
-    xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
-    xcf = vag(xcf/xcf_senp)*xcf_senp
-    vs pp:
-        erznva = ryncfrq*1.0/pp * (gbgny-pp)
-    ryfr:
-        erznva = 0.0
-    vs (ynfgerznva naq (erznva > ynfgerznva)
-          naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
-        erznva = ynfgerznva
-    ryfr:
-        ynfgerznva = erznva
-    ubhef = vag(erznva/60/60)
-    zvaf = vag(erznva/60 - ubhef*60)
-    frpf = vag(erznva - ubhef*60*60 - zvaf*60)
-    vs ryncfrq < 30:
-        erznvafge = ''
-        xcffge = ''
-    ryfr:
-        xcffge = '%qx/f' % xcf
-        vs ubhef:
-            erznvafge = '%qu%qz' % (ubhef, zvaf)
-        ryvs zvaf:
-            erznvafge = '%qz%q' % (zvaf, frpf)
-        ryfr:
-            erznvafge = '%qf' % frpf
-    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
-             % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
-                erznvafge, xcffge))
-
-
-e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
-
-qrs nyernql_fnirq(rag):
-    erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
-
-qrs jnagerphefr_cer(rag):
-    erghea abg nyernql_fnirq(rag)
-
-qrs jnagerphefr_qhevat(rag):
-    erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
-
-gbgny = sgbgny = 0
-vs bcg.cebterff:
-    sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
-        vs abg (sgbgny % 10024):
-            cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
-        rkvfgf = rag.rkvfgf()
-        unfuinyvq = nyernql_fnirq(rag)
-        rag.frg_fun_zvffvat(abg unfuinyvq)
-        vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
-            vs rkvfgf naq abg unfuinyvq:
-                gbgny += rag.fvmr
-        sgbgny += 1
-    cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
-    unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
-
-gfgneg = gvzr.gvzr()
-pbhag = fhopbhag = spbhag = 0
-ynfgfxvc_anzr = Abar
-ynfgqve = ''
-sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
-    (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
-    rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
-    unfuinyvq = nyernql_fnirq(rag)
-    jnfzvffvat = rag.fun_zvffvat()
-    byqfvmr = rag.fvmr
-    vs bcg.ireobfr:
-        vs abg rkvfgf:
-            fgnghf = 'Q'
-        ryvs abg unfuinyvq:
-            vs rag.fun == vaqrk.RZCGL_FUN:
-                fgnghf = 'N'
-            ryfr:
-                fgnghf = 'Z'
-        ryfr:
-            fgnghf = ' '
-        vs bcg.ireobfr >= 2:
-            ybt('%f %-70f\a' % (fgnghf, rag.anzr))
-        ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
-            vs abg ynfgqve.fgnegfjvgu(qve):
-                ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
-            ynfgqve = qve
-
-    vs bcg.cebterff:
-        cebterff_ercbeg(0)
-    spbhag += 1
-    
-    vs abg rkvfgf:
-        pbagvahr
-    vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
-        vs rkvfgf naq abg unfuinyvq:
-            nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
-            ynfgfxvc_anzr = rag.anzr
-        pbagvahr
-
-    nffreg(qve.fgnegfjvgu('/'))
-    qvec = qve.fcyvg('/')
-    juvyr cnegf > qvec:
-        _cbc(sbepr_gerr = Abar)
-    vs qve != '/':
-        sbe cneg va qvec[yra(cnegf):]:
-            _chfu(cneg)
-
-    vs abg svyr:
-        # ab svyranzr cbegvba zrnaf guvf vf n fhoqve.  Ohg
-        # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
-        byqgerr = nyernql_fnirq(rag) # znl or Abar
-        arjgerr = _cbc(sbepr_gerr = byqgerr)
-        vs abg byqgerr:
-            vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
-                rag.vainyvqngr()
-            ryfr:
-                rag.inyvqngr(040000, arjgerr)
-            rag.ercnpx()
-        vs rkvfgf naq jnfzvffvat:
-            pbhag += byqfvmr
-        pbagvahr
-
-    # vg'f abg n qverpgbel
-    vq = Abar
-    vs unfuinyvq:
-        zbqr = '%b' % rag.tvgzbqr
-        vq = rag.fun
-        funyvfgf[-1].nccraq((zbqr, 
-                             tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
-                             vq))
-    ryfr:
-        vs fgng.F_VFERT(rag.zbqr):
-            gel:
-                s = unfufcyvg.bcra_abngvzr(rag.anzr)
-            rkprcg VBReebe, r:
-                nqq_reebe(r)
-                ynfgfxvc_anzr = rag.anzr
-            rkprcg BFReebe, r:
-                nqq_reebe(r)
-                ynfgfxvc_anzr = rag.anzr
-            ryfr:
-                (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
-        ryfr:
-            vs fgng.F_VFQVE(rag.zbqr):
-                nffreg(0)  # unaqyrq nobir
-            ryvs fgng.F_VFYAX(rag.zbqr):
-                gel:
-                    ey = bf.ernqyvax(rag.anzr)
-                rkprcg BFReebe, r:
-                    nqq_reebe(r)
-                    ynfgfxvc_anzr = rag.anzr
-                rkprcg VBReebe, r:
-                    nqq_reebe(r)
-                    ynfgfxvc_anzr = rag.anzr
-                ryfr:
-                    (zbqr, vq) = ('120000', j.arj_oybo(ey))
-            ryfr:
-                nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
-                ynfgfxvc_anzr = rag.anzr
-        vs vq:
-            rag.inyvqngr(vag(zbqr, 8), vq)
-            rag.ercnpx()
-            funyvfgf[-1].nccraq((zbqr,
-                                 tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
-                                 vq))
-    vs rkvfgf naq jnfzvffvat:
-        pbhag += byqfvmr
-        fhopbhag = 0
-
-
-vs bcg.cebterff:
-    cpg = gbgny naq pbhag*100.0/gbgny be 100
-    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar.    \a'
-             % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
-
-juvyr yra(cnegf) > 1:
-    _cbc(sbepr_gerr = Abar)
-nffreg(yra(funyvfgf) == 1)
-gerr = j.arj_gerr(funyvfgf[-1])
-vs bcg.gerr:
-    cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
-    zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
-    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
-    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
-    vs bcg.pbzzvg:
-        cevag pbzzvg.rapbqr('urk')
-
-j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
-        
-vs bcg.anzr:
-    vs pyv:
-        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
-    ryfr:
-        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
-    pyv.pybfr()
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc gvpx
-"""
-b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-g = gvzr.gvzr()
-gyrsg = 1 - (g - vag(g))
-gvzr.fyrrc(gyrsg)
-#!/hfe/ova/rai clguba
-vzcbeg bf, flf, fgng, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
-sebz ohc.urycref vzcbeg *
-
-
-qrs zretr_vaqrkrf(bhg, e1, e2):
-    sbe r va vaqrk.ZretrVgre([e1, e2]):
-        # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl?  Jura?
-        bhg.nqq_vkragel(r)
-
-
-pynff VgreUrycre:
-    qrs __vavg__(frys, y):
-        frys.v = vgre(y)
-        frys.phe = Abar
-        frys.arkg()
-
-    qrs arkg(frys):
-        gel:
-            frys.phe = frys.v.arkg()
-        rkprcg FgbcVgrengvba:
-            frys.phe = Abar
-        erghea frys.phe
-
-
-qrs purpx_vaqrk(ernqre):
-    gel:
-        ybt('purpx: purpxvat sbejneq vgrengvba...\a')
-        r = Abar
-        q = {}
-        sbe r va ernqre.sbejneq_vgre():
-            vs r.puvyqera_a:
-                vs bcg.ireobfr:
-                    ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
-                                            r.anzr))
-                nffreg(r.puvyqera_bsf)
-                nffreg(r.anzr.raqfjvgu('/'))
-                nffreg(abg q.trg(r.puvyqera_bsf))
-                q[r.puvyqera_bsf] = 1
-            vs r.syntf & vaqrk.VK_UNFUINYVQ:
-                nffreg(r.fun != vaqrk.RZCGL_FUN)
-                nffreg(r.tvgzbqr)
-        nffreg(abg r be r.anzr == '/')  # ynfg ragel vf *nyjnlf* /
-        ybt('purpx: purpxvat abezny vgrengvba...\a')
-        ynfg = Abar
-        sbe r va ernqre:
-            vs ynfg:
-                nffreg(ynfg > r.anzr)
-            ynfg = r.anzr
-    rkprcg:
-        ybt('vaqrk reebe! ng %e\a' % r)
-        envfr
-    ybt('purpx: cnffrq.\a')
-
-
-qrs hcqngr_vaqrk(gbc):
-    ev = vaqrk.Ernqre(vaqrksvyr)
-    jv = vaqrk.Jevgre(vaqrksvyr)
-    evt = VgreUrycre(ev.vgre(anzr=gbc))
-    gfgneg = vag(gvzr.gvzr())
-
-    unfutra = Abar
-    vs bcg.snxr_inyvq:
-        qrs unfutra(anzr):
-            erghea (0100644, vaqrk.SNXR_FUN)
-
-    gbgny = 0
-    sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
-        vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
-            flf.fgqbhg.jevgr('%f\a' % cngu)
-            flf.fgqbhg.syhfu()
-            cebterff('Vaqrkvat: %q\e' % gbgny)
-        ryvs abg (gbgny % 128):
-            cebterff('Vaqrkvat: %q\e' % gbgny)
-        gbgny += 1
-        juvyr evt.phe naq evt.phe.anzr > cngu:  # qryrgrq cnguf
-            vs evt.phe.rkvfgf():
-                evt.phe.frg_qryrgrq()
-                evt.phe.ercnpx()
-            evt.arkg()
-        vs evt.phe naq evt.phe.anzr == cngu:    # cnguf gung nyernql rkvfgrq
-            vs cfg:
-                evt.phe.sebz_fgng(cfg, gfgneg)
-            vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
-                vs unfutra:
-                    (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
-                    evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
-            vs bcg.snxr_vainyvq:
-                evt.phe.vainyvqngr()
-            evt.phe.ercnpx()
-            evt.arkg()
-        ryfr:  # arj cnguf
-            jv.nqq(cngu, cfg, unfutra = unfutra)
-    cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
-    
-    vs ev.rkvfgf():
-        ev.fnir()
-        jv.syhfu()
-        vs jv.pbhag:
-            je = jv.arj_ernqre()
-            vs bcg.purpx:
-                ybt('purpx: orsber zretvat: byqsvyr\a')
-                purpx_vaqrk(ev)
-                ybt('purpx: orsber zretvat: arjsvyr\a')
-                purpx_vaqrk(je)
-            zv = vaqrk.Jevgre(vaqrksvyr)
-            zretr_vaqrkrf(zv, ev, je)
-            ev.pybfr()
-            zv.pybfr()
-            je.pybfr()
-        jv.nobeg()
-    ryfr:
-        jv.pybfr()
-
-
-bcgfcrp = """
-ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
---
-c,cevag    cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
-z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
-f,fgnghf   cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
-U,unfu     cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
-y,ybat     cevag zber vasbezngvba nobhg rnpu svyr
-h,hcqngr   (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
-k,kqri,bar-svyr-flfgrz  qba'g pebff svyrflfgrz obhaqnevrf
-snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
-snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
-purpx      pnershyyl purpx vaqrk svyr vagrtevgl
-s,vaqrksvyr=  gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-"""
-b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
-    b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
-vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
-    b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
-vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
-    b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
-
-tvg.purpx_ercb_be_qvr()
-vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
-
-unaqyr_pgey_p()
-
-vs bcg.purpx:
-    ybt('purpx: fgnegvat vavgvny purpx.\a')
-    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-cnguf = vaqrk.erqhpr_cnguf(rkgen)
-
-vs bcg.hcqngr:
-    vs abg cnguf:
-        b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
-    sbe (ec,cngu) va cnguf:
-        hcqngr_vaqrk(ec)
-
-vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
-    sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
-        vs (bcg.zbqvsvrq 
-            naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
-            pbagvahr
-        yvar = ''
-        vs bcg.fgnghf:
-            vs rag.vf_qryrgrq():
-                yvar += 'Q '
-            ryvs abg rag.vf_inyvq():
-                vs rag.fun == vaqrk.RZCGL_FUN:
-                    yvar += 'N '
-                ryfr:
-                    yvar += 'Z '
-            ryfr:
-                yvar += '  '
-        vs bcg.unfu:
-            yvar += rag.fun.rapbqr('urk') + ' '
-        vs bcg.ybat:
-            yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
-        cevag yvar + (anzr be './')
-
-vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
-    ybt('purpx: fgnegvat svany purpx.\a')
-    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg
-sebz ohc vzcbeg bcgvbaf, urycref
-
-bcgfcrp = """
-ohc eonpxhc-freire
---
-    Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-# trg gur fhopbzznaq'f neti.
-# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
-# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
-# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
-ohs = flf.fgqva.ernq(4)
-fm = fgehpg.hacnpx('!V', ohs)[0]
-nffreg(fm > 0)
-nffreg(fm < 1000000)
-ohs = flf.fgqva.ernq(fm)
-nffreg(yra(ohs) == fm)
-neti = ohs.fcyvg('\0')
-
-# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
-# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
-# gb zvfhfr gurz.  Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
-# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
-#
-# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
-# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
-# fbpxrg.  Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
-# bs vg, ohg cebonoyl qvqa'g.  Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
-# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
-#
-# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
-# qrfpevcgbef.  Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
-# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
-bf.qhc2(0, 3)
-bf.qhc2(1, 4)
-bf.qhc2(2, 1)
-sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
-bf.qhc2(sq, 0)
-bf.pybfr(sq)
-
-bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
-bf.rkrpic(neti[0], neti)
-flf.rkvg(99)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo, fhocebprff, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-cne2_bx = 0
-ahyys = bcra('/qri/ahyy')
-
-qrs qroht(f):
-    vs bcg.ireobfr:
-        ybt(f)
-
-qrs eha(neti):
-    # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
-    # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
-    # rkrpvat sbe fbzr ernfba.  Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
-    # svefg.
-    sq = bf.qhc(2)  # pbcl fgqree
-    gel:
-        c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
-        erghea c.jnvg()
-    svanyyl:
-        bf.pybfr(sq)
-
-qrs cne2_frghc():
-    tybony cne2_bx
-    ei = 1
-    gel:
-        c = fhocebprff.Cbcra(['cne2', '--uryc'],
-                             fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
-        ei = c.jnvg()
-    rkprcg BFReebe:
-        ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
-    ryfr:
-        cne2_bx = 1
-
-qrs cnei(yiy):
-    vs bcg.ireobfr >= yiy:
-        vs vfggl:
-            erghea []
-        ryfr:
-            erghea ['-d']
-    ryfr:
-        erghea ['-dd']
-
-qrs cne2_trarengr(onfr):
-    erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
-               + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
-
-qrs cne2_irevsl(onfr):
-    erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
-
-qrs cne2_ercnve(onfr):
-    erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
-
-qrs dhvpx_irevsl(onfr):
-    s = bcra(onfr + '.cnpx', 'eo')
-    s.frrx(-20, 2)
-    jnagfhz = s.ernq(20)
-    nffreg(yra(jnagfhz) == 20)
-    s.frrx(0)
-    fhz = Fun1()
-    sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
-        fhz.hcqngr(o)
-    vs fhz.qvtrfg() != jnagfhz:
-        envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
-                                                  fhz.urkqvtrfg()))
-        
-
-qrs tvg_irevsl(onfr):
-    vs bcg.dhvpx:
-        gel:
-            dhvpx_irevsl(onfr)
-        rkprcg Rkprcgvba, r:
-            qroht('reebe: %f\a' % r)
-            erghea 1
-        erghea 0
-    ryfr:
-        erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
-    
-    
-qrs qb_cnpx(onfr, ynfg):
-    pbqr = 0
-    vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
-        ierfhyg = cne2_irevsl(onfr)
-        vs ierfhyg != 0:
-            vs bcg.ercnve:
-                eerfhyg = cne2_ercnve(onfr)
-                vs eerfhyg != 0:
-                    cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
-                    pbqr = eerfhyg
-                ryfr:
-                    cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
-                    pbqr = 100
-            ryfr:
-                cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
-                pbqr = ierfhyg
-        ryfr:
-            cevag '%f bx' % ynfg
-    ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
-        terfhyg = tvg_irevsl(onfr)
-        vs terfhyg != 0:
-            cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
-            pbqr = terfhyg
-        ryfr:
-            vs cne2_bx naq bcg.trarengr:
-                cerfhyg = cne2_trarengr(onfr)
-                vs cerfhyg != 0:
-                    cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
-                    pbqr = cerfhyg
-                ryfr:
-                    cevag '%f bx' % ynfg
-            ryfr:
-                cevag '%f bx' % ynfg
-    ryfr:
-        nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
-        qroht('    fxvccrq: cne2 svyr nyernql trarengrq.\a')
-    erghea pbqr
-
-
-bcgfcrp = """
-ohc sfpx [bcgvbaf...] [svyranzrf...]
---
-e,ercnve    nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
-t,trarengr  trarengr nhgb-ercnve vasbezngvba hfvat cne2
-i,ireobfr   vapernfr ireobfvgl (pna or hfrq zber guna bapr)
-dhvpx       whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
-w,wbof=     eha 'a' wbof va cnenyyry
-cne2-bx     vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
-qvfnoyr-cne2  vtaber cne2 rira vs vg vf ninvynoyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-cne2_frghc()
-vs bcg.cne2_bx:
-    vs cne2_bx:
-        flf.rkvg(0)  # 'gehr' va fu
-    ryfr:
-        flf.rkvg(1)
-vs bcg.qvfnoyr_cne2:
-    cne2_bx = 0
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
-    qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
-    rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
-
-pbqr = 0
-pbhag = 0
-bhgfgnaqvat = {}
-sbe anzr va rkgen:
-    vs anzr.raqfjvgu('.cnpx'):
-        onfr = anzr[:-5]
-    ryvs anzr.raqfjvgu('.vqk'):
-        onfr = anzr[:-4]
-    ryvs anzr.raqfjvgu('.cne2'):
-        onfr = anzr[:-5]
-    ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
-        onfr = anzr
-    ryfr:
-        envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
-    (qve,ynfg) = bf.cngu.fcyvg(onfr)
-    cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
-    vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
-        cne2_rkvfgf = 0
-    flf.fgqbhg.syhfu()
-    qroht('sfpx: purpxvat %f (%f)\a' 
-          % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
-    vs abg bcg.ireobfr:
-        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-    
-    vs abg bcg.wbof:
-        ap = qb_cnpx(onfr, ynfg)
-        pbqr = pbqr be ap
-        pbhag += 1
-    ryfr:
-        juvyr yra(bhgfgnaqvat) >= bcg.wbof:
-            (cvq,ap) = bf.jnvg()
-            ap >>= 8
-            vs cvq va bhgfgnaqvat:
-                qry bhgfgnaqvat[cvq]
-                pbqr = pbqr be ap
-                pbhag += 1
-        cvq = bf.sbex()
-        vs cvq:  # cnerag
-            bhgfgnaqvat[cvq] = 1
-        ryfr: # puvyq
-            gel:
-                flf.rkvg(qb_cnpx(onfr, ynfg))
-            rkprcg Rkprcgvba, r:
-                ybt('rkprcgvba: %e\a' % r)
-                flf.rkvg(99)
-                
-juvyr yra(bhgfgnaqvat):
-    (cvq,ap) = bf.jnvg()
-    ap >>= 8
-    vs cvq va bhgfgnaqvat:
-        qry bhgfgnaqvat[cvq]
-        pbqr = pbqr be ap
-        pbhag += 1
-    vs abg bcg.ireobfr:
-        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
-vs abg bcg.ireobfr naq vfggl:
-    ybt('sfpx qbar.           \a')
-flf.rkvg(pbqr)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
-sebz ohc vzcbeg bcgvbaf, ffu
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc eonpxhc <ubfganzr> vaqrk ...
-ohc eonpxhc <ubfganzr> fnir ...
-ohc eonpxhc <ubfganzr> fcyvg ...
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs yra(rkgen) < 2:
-    b.sngny('nethzragf rkcrpgrq')
-
-pynff FvtRkprcgvba(Rkprcgvba):
-    qrs __vavg__(frys, fvtahz):
-        frys.fvtahz = fvtahz
-        Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
-qrs unaqyre(fvtahz, senzr):
-    envfr FvtRkprcgvba(fvtahz)
-
-fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
-fvtany.fvtany(fvtany.FVTVAG, unaqyre)
-
-fc = Abar
-c = Abar
-erg = 99
-
-gel:
-    ubfganzr = rkgen[0]
-    neti = rkgen[1:]
-    c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
-
-    netif = '\0'.wbva(['ohc'] + neti)
-    c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
-    c.fgqva.syhfu()
-
-    znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
-    fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
-
-    c.fgqva.pybfr()
-    c.fgqbhg.pybfr()
-
-svanyyl:
-    juvyr 1:
-        # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
-        # va pnfr bhe puvyq qbrfa'g qvr.
-        gel:
-            erg = c.jnvg()
-            fc.jnvg()
-            oernx
-        rkprcg FvtRkprcgvba, r:
-            ybt('\aohc eonpxhc: %f\a' % r)
-            bf.xvyy(c.cvq, r.fvtahz)
-            erg = 84
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc arjyvare
-"""
-b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-e = er.pbzcvyr(e'([\e\a])')
-ynfgyra = 0
-nyy = ''
-juvyr 1:
-    y = e.fcyvg(nyy, 1)
-    vs yra(y) <= 1:
-        gel:
-            o = bf.ernq(flf.fgqva.svyrab(), 4096)
-        rkprcg XrlobneqVagreehcg:
-            oernx
-        vs abg o:
-            oernx
-        nyy += o
-    ryfr:
-        nffreg(yra(y) == 3)
-        (yvar, fcyvgpune, nyy) = y
-        #fcyvgpune = '\a'
-        flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
-        vs fcyvgpune == '\e':
-            ynfgyra = yra(yvar)
-        ryfr:
-            ynfgyra = 0
-        flf.fgqbhg.syhfu()
-
-vs ynfgyra be nyy:
-    flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
-#!/hfe/ova/rai clguba
-vzcbeg flf
-sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc znetva
-"""
-b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-#tvg.vtaber_zvqk = 1
-
-zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-ynfg = '\0'*20
-ybatzngpu = 0
-sbe v va zv:
-    vs v == ynfg:
-        pbagvahr
-    #nffreg(fge(v) >= ynfg)
-    cz = _unfufcyvg.ovgzngpu(ynfg, v)
-    ybatzngpu = znk(ybatzngpu, cz)
-    ynfg = v
-cevag ybatzngpu
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg bcgvbaf, qerphefr
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc qerphefr <cngu>
---
-k,kqri,bar-svyr-flfgrz   qba'g pebff svyrflfgrz obhaqnevrf
-d,dhvrg  qba'g npghnyyl cevag svyranzrf
-cebsvyr  eha haqre gur clguba cebsvyre
-"""
-b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar svyranzr rkcrpgrq")
-
-vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
-vs bcg.cebsvyr:
-    vzcbeg pCebsvyr
-    qrs qb_vg():
-        sbe v va vg:
-            cnff
-    pCebsvyr.eha('qb_vg()')
-ryfr:
-    vs bcg.dhvrg:
-        sbe v va vg:
-            cnff
-    ryfr:
-        sbe (anzr,fg) va vg:
-            cevag anzr
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-o,oybof    bhgchg n frevrf bs oybo vqf
-g,gerr     bhgchg n gerr vq
-p,pbzzvg   bhgchg n pbzzvg vq
-a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
-A,abbc     qba'g npghnyyl fnir gur qngn naljurer
-d,dhvrg    qba'g cevag cebterff zrffntrf
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-pbcl       whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
-orapu      cevag orapuznex gvzvatf gb fgqree
-znk-cnpx-fvmr=  znkvzhz olgrf va n fvatyr cnpx
-znk-cnpx-bowrpgf=  znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
-snabhg=  znkvzhz ahzore bs oybof va n fvatyr gerr
-"""
-b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
-        bcg.abbc be bcg.pbcl):
-    b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
-vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be 
-                               bcg.pbzzvg be bcg.anzr):
-    b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
-
-vs bcg.ireobfr >= 2:
-    tvg.ireobfr = bcg.ireobfr - 1
-    bcg.orapu = 1
-vs bcg.znk_cnpx_fvmr:
-    unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
-vs bcg.znk_cnpx_bowrpgf:
-    unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
-vs bcg.snabhg:
-    unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
-vs bcg.oybof:
-    unfufcyvg.snabhg = 0
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
-    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-fgneg_gvzr = gvzr.gvzr()
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.abbc be bcg.pbcl:
-    pyv = j = byqers = Abar
-ryvs bcg.erzbgr be vf_erirefr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
-    j = pyv.arj_cnpxjevgre()
-ryfr:
-    pyv = Abar
-    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
-    j = tvg.CnpxJevgre()
-
-svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
-vs j:
-    funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
-    gerr = j.arj_gerr(funyvfg)
-ryfr:
-    ynfg = 0
-    sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
-        unfufcyvg.gbgny_fcyvg += yra(oybo)
-        vs bcg.pbcl:
-            flf.fgqbhg.jevgr(fge(oybo))
-        zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
-        vs abg bcg.dhvrg naq ynfg != zrtf:
-            cebterff('%q Zolgrf ernq\e' % zrtf)
-            ynfg = zrtf
-    cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
-
-vs bcg.ireobfr:
-    ybt('\a')
-vs bcg.oybof:
-    sbe (zbqr,anzr,ova) va funyvfg:
-        cevag ova.rapbqr('urk')
-vs bcg.gerr:
-    cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
-    zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
-    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
-    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
-    vs bcg.pbzzvg:
-        cevag pbzzvg.rapbqr('urk')
-
-vs j:
-    j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
-        
-vs bcg.anzr:
-    vs pyv:
-        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
-    ryfr:
-        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
-    pyv.pybfr()
-
-frpf = gvzr.gvzr() - fgneg_gvzr
-fvmr = unfufcyvg.gbgny_fcyvg
-vs bcg.orapu:
-    ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
-        % (fvmr/1024., frpf, fvmr/1024./frpf))
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, fgehpg, zznc
-sebz ohc vzcbeg tvg, bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs f_sebz_olgrf(olgrf):
-    pyvfg = [pue(o) sbe o va olgrf]
-    erghea ''.wbva(pyvfg)
-
-
-qrs ercbeg(pbhag):
-    svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
-    q = {}
-    sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
-        y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
-        q[y[0]] = y[1]
-    vs pbhag >= 0:
-        r1 = pbhag
-        svryqf = [q[x] sbe x va svryqf]
-    ryfr:
-        r1 = ''
-    cevag ('%9f  ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
-    flf.fgqbhg.syhfu()
-
-
-bcgfcrp = """
-ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
---
-a,ahzore=  ahzore bs bowrpgf cre plpyr
-p,plpyrf=  ahzore bs plpyrf gb eha
-vtaber-zvqk  vtaber .zvqk svyrf, hfr bayl .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-tvg.vtaber_zvqk = bcg.vtaber_zvqk
-
-tvg.purpx_ercb_be_qvr()
-z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-
-plpyrf = bcg.plpyrf be 100
-ahzore = bcg.ahzore be 10000
-
-ercbeg(-1)
-s = bcra('/qri/henaqbz')
-n = zznc.zznc(-1, 20)
-ercbeg(0)
-sbe p va kenatr(plpyrf):
-    sbe a va kenatr(ahzore):
-        o = s.ernq(3)
-        vs 0:
-            olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
-            olgrf[2] &= 0ks0
-            ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
-        ryfr:
-            n[0:2] = o[0:2]
-            n[2] = pue(beq(o[2]) & 0ks0)
-            ova = fge(n[0:20])
-        #cevag ova.rapbqr('urk')
-        z.rkvfgf(ova)
-    ercbeg((p+1)*ahzore)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-qrs cevag_abqr(grkg, a):
-    cersvk = ''
-    vs bcg.unfu:
-        cersvk += "%f " % a.unfu.rapbqr('urk')
-    vs fgng.F_VFQVE(a.zbqr):
-        cevag '%f%f/' % (cersvk, grkg)
-    ryvs fgng.F_VFYAX(a.zbqr):
-        cevag '%f%f@' % (cersvk, grkg)
-    ryfr:
-        cevag '%f%f' % (cersvk, grkg)
-
-
-bcgfcrp = """
-ohc yf <qvef...>
---
-f,unfu   fubj unfu sbe rnpu svyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-
-vs abg rkgen:
-    rkgen = ['/']
-
-erg = 0
-sbe q va rkgen:
-    gel:
-        a = gbc.yerfbyir(q)
-        vs fgng.F_VFQVE(a.zbqr):
-            sbe fho va a:
-                cevag_abqr(fho.anzr, fho)
-        ryfr:
-            cevag_abqr(q, a)
-    rkprcg isf.AbqrReebe, r:
-        ybt('reebe: %f\a' % r)
-        erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
-sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
-sebz ohc.urycref vzcbeg *
-
-qrs abqr_anzr(grkg, a):
-    vs fgng.F_VFQVE(a.zbqr):
-        erghea '%f/' % grkg
-    ryvs fgng.F_VFYAX(a.zbqr):
-        erghea '%f@' % grkg
-    ryfr:
-        erghea '%f' % grkg
-
-
-qrs qb_yf(cngu, a):
-    y = []
-    vs fgng.F_VFQVE(a.zbqr):
-        sbe fho va a:
-            y.nccraq(abqr_anzr(fho.anzr, fho))
-    ryfr:
-        y.nccraq(abqr_anzr(cngu, a))
-    cevag pbyhzangr(y, '')
-    
-
-qrs jevgr_gb_svyr(vas, bhgs):
-    sbe oybo va puhaxlernqre(vas):
-        bhgs.jevgr(oybo)
-    
-
-qrs vachgvgre():
-    vs bf.vfnggl(flf.fgqva.svyrab()):
-        juvyr 1:
-            gel:
-                lvryq enj_vachg('ohc> ')
-            rkprcg RBSReebe:
-                oernx
-    ryfr:
-        sbe yvar va flf.fgqva:
-            lvryq yvar
-
-
-qrs _pbzcyrgre_trg_fhof(yvar):
-    (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
-    (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
-    #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
-    a = cjq.erfbyir(qve)
-    fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
-                       a.fhof()))
-    erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
-
-
-_ynfg_yvar = Abar
-_ynfg_erf = Abar
-qrs pbzcyrgre(grkg, fgngr):
-    tybony _ynfg_yvar
-    tybony _ynfg_erf
-    gel:
-        yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
-        vs _ynfg_yvar != yvar:
-            _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
-            _ynfg_yvar = yvar
-        (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
-        vs fgngr < yra(fhof):
-            fa = fhof[fgngr]
-            fa1 = fa.erfbyir('')  # qrers flzyvaxf
-            shyyanzr = bf.cngu.wbva(qve, fa.anzr)
-            vs fgng.F_VFQVE(fa1.zbqr):
-                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
-                                          grezvangr=Snyfr)
-            ryfr:
-                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
-                                          grezvangr=Gehr) + ' '
-            erghea grkg + erg
-    rkprcg Rkprcgvba, r:
-        ybt('\areebe va pbzcyrgvba: %f\a' % r)
-
-            
-bcgfcrp = """
-ohc sgc
-"""
-b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-gbc = isf.ErsYvfg(Abar)
-cjq = gbc
-
-vs rkgen:
-    yvarf = rkgen
-ryfr:
-    ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
-    ernqyvar.frg_pbzcyrgre(pbzcyrgre)
-    ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
-    yvarf = vachgvgre()
-
-sbe yvar va yvarf:
-    vs abg yvar.fgevc():
-        pbagvahr
-    jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
-    pzq = jbeqf[0].ybjre()
-    #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
-    gel:
-        vs pzq == 'yf':
-            sbe cnez va (jbeqf[1:] be ['.']):
-                qb_yf(cnez, cjq.erfbyir(cnez))
-        ryvs pzq == 'pq':
-            sbe cnez va jbeqf[1:]:
-                cjq = cjq.erfbyir(cnez)
-        ryvs pzq == 'cjq':
-            cevag cjq.shyyanzr()
-        ryvs pzq == 'png':
-            sbe cnez va jbeqf[1:]:
-                jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
-        ryvs pzq == 'trg':
-            vs yra(jbeqf) abg va [2,3]:
-                envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
-            eanzr = jbeqf[1]
-            (qve,onfr) = bf.cngu.fcyvg(eanzr)
-            yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
-            vas = cjq.erfbyir(eanzr).bcra()
-            ybt('Fnivat %e\a' % yanzr)
-            jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
-        ryvs pzq == 'ztrg':
-            sbe cnez va jbeqf[1:]:
-                (qve,onfr) = bf.cngu.fcyvg(cnez)
-                sbe a va cjq.erfbyir(qve).fhof():
-                    vs sazngpu.sazngpu(a.anzr, onfr):
-                        gel:
-                            ybt('Fnivat %e\a' % a.anzr)
-                            vas = a.bcra()
-                            bhgs = bcra(a.anzr, 'jo')
-                            jevgr_gb_svyr(vas, bhgs)
-                            bhgs.pybfr()
-                        rkprcg Rkprcgvba, r:
-                            ybt('  reebe: %f\a' % r)
-        ryvs pzq == 'uryc' be pzq == '?':
-            ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
-        ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
-            oernx
-        ryfr:
-            envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
-    rkprcg Rkprcgvba, r:
-        ybt('reebe: %f\a' % r)
-        #envfr
-#!/hfe/ova/rai clguba
-vzcbeg flf, zznc
-sebz ohc vzcbeg bcgvbaf, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc enaqbz [-F frrq] <ahzolgrf>
---
-F,frrq=   bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
-s,sbepr   cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
-"""
-b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-gbgny = cnefr_ahz(rkgen[0])
-
-vs bcg.sbepr be (abg bf.vfnggl(1) naq
-                 abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
-    _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
-ryfr:
-    ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc uryc <pbzznaq>
-"""
-b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) == 0:
-    # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
-    bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
-ryvs yra(rkgen) == 1:
-    qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
-    rkr = flf.neti[0]
-    (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
-    znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
-    t = tybo.tybo(znacngu)
-    vs t:
-        bf.rkrpic('zna', ['zna', '-y', t[0]])
-    ryfr:
-        bf.rkrpic('zna', ['zna', qbpanzr])
-ryfr:
-    b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-
-pynff Fgng(shfr.Fgng):
-    qrs __vavg__(frys):
-        frys.fg_zbqr = 0
-        frys.fg_vab = 0
-        frys.fg_qri = 0
-        frys.fg_ayvax = 0
-        frys.fg_hvq = 0
-        frys.fg_tvq = 0
-        frys.fg_fvmr = 0
-        frys.fg_ngvzr = 0
-        frys.fg_zgvzr = 0
-        frys.fg_pgvzr = 0
-        frys.fg_oybpxf = 0
-        frys.fg_oyxfvmr = 0
-        frys.fg_eqri = 0
-
-
-pnpur = {}
-qrs pnpur_trg(gbc, cngu):
-    cnegf = cngu.fcyvg('/')
-    pnpur[('',)] = gbc
-    p = Abar
-    znk = yra(cnegf)
-    #ybt('pnpur: %e\a' % pnpur.xrlf())
-    sbe v va enatr(znk):
-        cer = cnegf[:znk-v]
-        #ybt('pnpur gelvat: %e\a' % cer)
-        p = pnpur.trg(ghcyr(cer))
-        vs p:
-            erfg = cnegf[znk-v:]
-            sbe e va erfg:
-                #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
-                p = p.yerfbyir(e)
-                xrl = ghcyr(cer + [e])
-                #ybt('fnivat: %e\a' % (xrl,))
-                pnpur[xrl] = p
-            oernx
-    nffreg(p)
-    erghea p
-        
-    
-
-pynff OhcSf(shfr.Shfr):
-    qrs __vavg__(frys, gbc):
-        shfr.Shfr.__vavg__(frys)
-        frys.gbc = gbc
-    
-    qrs trgngge(frys, cngu):
-        ybt('--trgngge(%e)\a' % cngu)
-        gel:
-            abqr = pnpur_trg(frys.gbc, cngu)
-            fg = Fgng()
-            fg.fg_zbqr = abqr.zbqr
-            fg.fg_ayvax = abqr.ayvaxf()
-            fg.fg_fvmr = abqr.fvmr()
-            fg.fg_zgvzr = abqr.zgvzr
-            fg.fg_pgvzr = abqr.pgvzr
-            fg.fg_ngvzr = abqr.ngvzr
-            erghea fg
-        rkprcg isf.AbFhpuSvyr:
-            erghea -reeab.RABRAG
-
-    qrs ernqqve(frys, cngu, bssfrg):
-        ybt('--ernqqve(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        lvryq shfr.Qveragel('.')
-        lvryq shfr.Qveragel('..')
-        sbe fho va abqr.fhof():
-            lvryq shfr.Qveragel(fho.anzr)
-
-    qrs ernqyvax(frys, cngu):
-        ybt('--ernqyvax(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        erghea abqr.ernqyvax()
-
-    qrs bcra(frys, cngu, syntf):
-        ybt('--bcra(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
-        vs (syntf & nppzbqr) != bf.B_EQBAYL:
-            erghea -reeab.RNPPRF
-        abqr.bcra()
-
-    qrs eryrnfr(frys, cngu, syntf):
-        ybt('--eryrnfr(%e)\a' % cngu)
-
-    qrs ernq(frys, cngu, fvmr, bssfrg):
-        ybt('--ernq(%e)\a' % cngu)
-        a = pnpur_trg(frys.gbc, cngu)
-        b = a.bcra()
-        b.frrx(bssfrg)
-        erghea b.ernq(fvmr)
-
-
-vs abg unfngge(shfr, '__irefvba__'):
-    envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
-shfr.shfr_clguba_ncv = (0, 2)
-
-
-bcgfcrp = """
-ohc shfr [-q] [-s] <zbhagcbvag>
---
-q,qroht   vapernfr qroht yriry
-s,sbertebhaq  eha va sbertebhaq
-"""
-b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-s = OhcSf(gbc)
-s.shfr_netf.zbhagcbvag = rkgen[0]
-vs bcg.qroht:
-    s.shfr_netf.nqq('qroht')
-vs bcg.sbertebhaq:
-    s.shfr_netf.frgzbq('sbertebhaq')
-cevag s.zhygvguernqrq
-s.zhygvguernqrq = Snyfr
-
-s.znva()
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-
-vs bcg.erzbgr:
-    tvg.vavg_ercb()  # ybpny ercb
-    tvg.purpx_ercb_be_qvr()
-    pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
-    pyv.pybfr()
-ryfr:
-    tvg.vavg_ercb()
-#!/hfe/ova/rai clguba
-vzcbeg flf, zngu, fgehpg, tybo
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-CNTR_FVMR=4096
-FUN_CRE_CNTR=CNTR_FVMR/200.
-
-
-qrs zretr(vqkyvfg, ovgf, gnoyr):
-    pbhag = 0
-    sbe r va tvg.vqkzretr(vqkyvfg):
-        pbhag += 1
-        cersvk = tvg.rkgenpg_ovgf(r, ovgf)
-        gnoyr[cersvk] = pbhag
-        lvryq r
-
-
-qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
-    vs abg bhgsvyranzr:
-        nffreg(bhgqve)
-        fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
-        bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
-    
-    vac = []
-    gbgny = 0
-    sbe anzr va vasvyranzrf:
-        vk = tvg.CnpxVqk(anzr)
-        vac.nccraq(vk)
-        gbgny += yra(vk)
-
-    ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
-    vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
-       be (bcg.sbepr naq abg gbgny):
-        ybt('zvqk: abguvat gb qb.\a')
-        erghea
-
-    cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
-    ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
-    ragevrf = 2**ovgf
-    ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
-    
-    gnoyr = [0]*ragevrf
-
-    gel:
-        bf.hayvax(bhgsvyranzr)
-    rkprcg BFReebe:
-        cnff
-    s = bcra(bhgsvyranzr + '.gzc', 'j+')
-    s.jevgr('ZVQK\0\0\0\2')
-    s.jevgr(fgehpg.cnpx('!V', ovgf))
-    nffreg(s.gryy() == 12)
-    s.jevgr('\0'*4*ragevrf)
-    
-    sbe r va zretr(vac, ovgf, gnoyr):
-        s.jevgr(r)
-        
-    s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
-
-    s.frrx(12)
-    s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
-    s.pybfr()
-    bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
-
-    # guvf vf whfg sbe grfgvat
-    vs 0:
-        c = tvg.CnpxZvqk(bhgsvyranzr)
-        nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
-        cevag c.vqkanzrf
-        nffreg(yra(c) == gbgny)
-        cv = vgre(c)
-        sbe v va zretr(vac, gbgny, ovgf, gnoyr):
-            nffreg(v == cv.arkg())
-            nffreg(c.rkvfgf(v))
-
-    cevag bhgsvyranzr
-
-bcgfcrp = """
-ohc zvqk [bcgvbaf...] <vqkanzrf...>
---
-b,bhgchg=  bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
-n,nhgb     nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
-s,sbepr    nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen naq (bcg.nhgb be bcg.sbepr):
-    b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
-
-tvg.purpx_ercb_be_qvr()
-
-vs rkgen:
-    qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
-ryvs bcg.nhgb be bcg.sbepr:
-    cnguf = [tvg.ercb('bowrpgf/cnpx')]
-    cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
-    sbe cngu va cnguf:
-        ybt('zvqk: fpnaavat %f\a' % cngu)
-        vs bcg.sbepr:
-            qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
-        ryvs bcg.nhgb:
-            z = tvg.CnpxVqkYvfg(cngu)
-            arrqrq = {}
-            sbe cnpx va z.cnpxf:  # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
-                vs cnpx.anzr.raqfjvgu('.vqk'):
-                    arrqrq[cnpx.anzr] = 1
-            qry z
-            qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
-        ybt('\a')
-ryfr:
-    b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, enaqbz
-sebz ohc vzcbeg bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs enaqoybpx(a):
-    y = []
-    sbe v va kenatr(a):
-        y.nccraq(pue(enaqbz.enaqenatr(0,256)))
-    erghea ''.wbva(y)
-
-
-bcgfcrp = """
-ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
---
-   JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
-a,ahz=   ahzore bs oybpxf gb qnzntr
-f,fvmr=  znkvzhz fvmr bs rnpu qnzntrq oybpx
-creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
-rdhny    fcernq qnzntr rirayl guebhtubhg gur svyr
-F,frrq=  enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
-"""
-b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg rkgen:
-    b.sngny('svyranzrf rkcrpgrq')
-
-vs bcg.frrq != Abar:
-    enaqbz.frrq(bcg.frrq)
-
-sbe anzr va rkgen:
-    ybt('Qnzntvat "%f"...\a' % anzr)
-    s = bcra(anzr, 'e+o')
-    fg = bf.sfgng(s.svyrab())
-    fvmr = fg.fg_fvmr
-    vs bcg.creprag be bcg.fvmr:
-        zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
-        zf2 = bcg.fvmr be fvmr
-        znkfvmr = zva(zf1, zf2)
-    ryfr:
-        znkfvmr = 1
-    puhaxf = bcg.ahz be 10
-    puhaxfvmr = fvmr/puhaxf
-    sbe e va enatr(puhaxf):
-        fm = enaqbz.enaqenatr(1, znkfvmr+1)
-        vs fm > fvmr:
-            fm = fvmr
-        vs bcg.rdhny:
-            bsf = e*puhaxfvmr
-        ryfr:
-            bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
-        ybt('  %6q olgrf ng %q\a' % (fm, bsf))
-        s.frrx(bsf)
-        s.jevgr(enaqoybpx(fm))
-    s.pybfr()
-#!/hfe/ova/rai clguba
-vzcbeg flf, fgehpg, zznc
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-fhfcraqrq_j = Abar
-
-
-qrs vavg_qve(pbaa, net):
-    tvg.vavg_ercb(net)
-    ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
-    pbaa.bx()
-
-
-qrs frg_qve(pbaa, net):
-    tvg.purpx_ercb_be_qvr(net)
-    ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
-    pbaa.bx()
-
-    
-qrs yvfg_vaqrkrf(pbaa, whax):
-    tvg.purpx_ercb_be_qvr()
-    sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
-        vs s.raqfjvgu('.vqk'):
-            pbaa.jevgr('%f\a' % s)
-    pbaa.bx()
-
-
-qrs fraq_vaqrk(pbaa, anzr):
-    tvg.purpx_ercb_be_qvr()
-    nffreg(anzr.svaq('/') < 0)
-    nffreg(anzr.raqfjvgu('.vqk'))
-    vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
-    pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
-    pbaa.jevgr(vqk.znc)
-    pbaa.bx()
-
-
-qrs erprvir_bowrpgf(pbaa, whax):
-    tybony fhfcraqrq_j
-    tvg.purpx_ercb_be_qvr()
-    fhttrfgrq = {}
-    vs fhfcraqrq_j:
-        j = fhfcraqrq_j
-        fhfcraqrq_j = Abar
-    ryfr:
-        j = tvg.CnpxJevgre()
-    juvyr 1:
-        af = pbaa.ernq(4)
-        vs abg af:
-            j.nobeg()
-            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
-        a = fgehpg.hacnpx('!V', af)[0]
-        #ybt('rkcrpgvat %q olgrf\a' % a)
-        vs abg a:
-            ybt('ohc freire: erprvirq %q bowrpg%f.\a' 
-                % (j.pbhag, j.pbhag!=1 naq "f" be ''))
-            shyycngu = j.pybfr()
-            vs shyycngu:
-                (qve, anzr) = bf.cngu.fcyvg(shyycngu)
-                pbaa.jevgr('%f.vqk\a' % anzr)
-            pbaa.bx()
-            erghea
-        ryvs a == 0kssssssss:
-            ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
-            fhfcraqrq_j = j
-            pbaa.bx()
-            erghea
-            
-        ohs = pbaa.ernq(a)  # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
-        #ybt('ernq %q olgrf\a' % a)
-        vs yra(ohs) < a:
-            j.nobeg()
-            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
-                            % (a, yra(ohs)))
-        (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
-        fun = tvg.pnyp_unfu(glcr, pbagrag)
-        byqcnpx = j.rkvfgf(fun)
-        # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
-        # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
-        # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
-        # ba gur freire fvqr.
-        vs abg fhttrfgrq naq \
-          byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
-            # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
-            # ng guvf ynlre.  Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
-            # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
-            # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
-            # znxr gur svyrf ovttre.  Guvf zrgubq vf pregnvayl abg irel
-            # rssvpvrag.
-            j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
-            byqcnpx = j.bowpnpur.rkvfgf(fun)
-            ybt('arj fhttrfgvba: %e\a' % byqcnpx)
-            nffreg(byqcnpx)
-            nffreg(byqcnpx != Gehr)
-            nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
-            j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
-        vs abg fhttrfgrq naq byqcnpx:
-            nffreg(byqcnpx.raqfjvgu('.vqk'))
-            (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
-            vs abg (anzr va fhttrfgrq):
-                ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
-                pbaa.jevgr('vaqrk %f\a' % anzr)
-                fhttrfgrq[anzr] = 1
-        ryfr:
-            j._enj_jevgr([ohs])
-    # ABGERNPURQ
-
-
-qrs ernq_ers(pbaa, ersanzr):
-    tvg.purpx_ercb_be_qvr()
-    e = tvg.ernq_ers(ersanzr)
-    pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
-    pbaa.bx()
-
-
-qrs hcqngr_ers(pbaa, ersanzr):
-    tvg.purpx_ercb_be_qvr()
-    arjiny = pbaa.ernqyvar().fgevc()
-    byqiny = pbaa.ernqyvar().fgevc()
-    tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
-    pbaa.bx()
-
-
-qrs png(pbaa, vq):
-    tvg.purpx_ercb_be_qvr()
-    gel:
-        sbe oybo va tvg.png(vq):
-            pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
-            pbaa.jevgr(oybo)
-    rkprcg XrlReebe, r:
-        ybt('freire: reebe: %f\a' % r)
-        pbaa.jevgr('\0\0\0\0')
-        pbaa.reebe(r)
-    ryfr:
-        pbaa.jevgr('\0\0\0\0')
-        pbaa.bx()
-
-
-bcgfcrp = """
-ohc freire
-"""
-b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-ybt('ohc freire: ernqvat sebz fgqva.\a')
-
-pbzznaqf = {
-    'vavg-qve': vavg_qve,
-    'frg-qve': frg_qve,
-    'yvfg-vaqrkrf': yvfg_vaqrkrf,
-    'fraq-vaqrk': fraq_vaqrk,
-    'erprvir-bowrpgf': erprvir_bowrpgf,
-    'ernq-ers': ernq_ers,
-    'hcqngr-ers': hcqngr_ers,
-    'png': png,
-}
-
-# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
-# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
-pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
-ye = yvarernqre(pbaa)
-sbe _yvar va ye:
-    yvar = _yvar.fgevc()
-    vs abg yvar:
-        pbagvahr
-    ybt('ohc freire: pbzznaq: %e\a' % yvar)
-    jbeqf = yvar.fcyvg(' ', 1)
-    pzq = jbeqf[0]
-    erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
-    vs pzq == 'dhvg':
-        oernx
-    ryfr:
-        pzq = pbzznaqf.trg(pzq)
-        vs pzq:
-            pzq(pbaa, erfg)
-        ryfr:
-            envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
-
-ybt('ohc freire: qbar\a')
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
-    rkgen = yvarernqre(flf.fgqva)
-
-erg = 0
-
-vs bcg.erzbgr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    png = pyv.png
-ryfr:
-    pc = tvg.PngCvcr()
-    png = pc.wbva
-
-sbe vq va rkgen:
-    gel:
-        sbe oybo va png(vq):
-            flf.fgqbhg.jevgr(oybo)
-    rkprcg XrlReebe, r:
-        flf.fgqbhg.syhfu()
-        ybt('reebe: %f\a' % r)
-        erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, reeab, fgng, gvzr, zngu
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc fnir [-gp] [-a anzr] <svyranzrf...>
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-g,gerr     bhgchg n gerr vq
-p,pbzzvg   bhgchg n pbzzvg vq
-a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-d,dhvrg    qba'g fubj cebterff zrgre
-fznyyre=   bayl onpx hc svyrf fznyyre guna a olgrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
-    b.sngny("hfr bar be zber bs -g, -p, -a")
-vs abg rkgen:
-    b.sngny("ab svyranzrf tvira")
-
-bcg.cebterff = (vfggl naq abg bcg.dhvrg)
-bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
-    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.erzbgr be vf_erirefr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
-    j = pyv.arj_cnpxjevgre()
-ryfr:
-    pyv = Abar
-    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
-    j = tvg.CnpxJevgre()
-
-unaqyr_pgey_p()
-
-
-qrs rngfynfu(qve):
-    vs qve.raqfjvgu('/'):
-        erghea qve[:-1]
-    ryfr:
-        erghea qve
-
-
-cnegf = ['']
-funyvfgf = [[]]
-
-qrs _chfu(cneg):
-    nffreg(cneg)
-    cnegf.nccraq(cneg)
-    funyvfgf.nccraq([])
-
-qrs _cbc(sbepr_gerr):
-    nffreg(yra(cnegf) >= 1)
-    cneg = cnegf.cbc()
-    funyvfg = funyvfgf.cbc()
-    gerr = sbepr_gerr be j.arj_gerr(funyvfg)
-    vs funyvfgf:
-        funyvfgf[-1].nccraq(('40000', cneg, gerr))
-    ryfr:  # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
-        funyvfgf.nccraq(funyvfg)
-    erghea gerr
-
-ynfgerznva = Abar
-qrs cebterff_ercbeg(a):
-    tybony pbhag, fhopbhag, ynfgerznva
-    fhopbhag += a
-    pp = pbhag + fhopbhag
-    cpg = gbgny naq (pp*100.0/gbgny) be 0
-    abj = gvzr.gvzr()
-    ryncfrq = abj - gfgneg
-    xcf = ryncfrq naq vag(pp/1024./ryncfrq)
-    xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
-    xcf = vag(xcf/xcf_senp)*xcf_senp
-    vs pp:
-        erznva = ryncfrq*1.0/pp * (gbgny-pp)
-    ryfr:
-        erznva = 0.0
-    vs (ynfgerznva naq (erznva > ynfgerznva)
-          naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
-        erznva = ynfgerznva
-    ryfr:
-        ynfgerznva = erznva
-    ubhef = vag(erznva/60/60)
-    zvaf = vag(erznva/60 - ubhef*60)
-    frpf = vag(erznva - ubhef*60*60 - zvaf*60)
-    vs ryncfrq < 30:
-        erznvafge = ''
-        xcffge = ''
-    ryfr:
-        xcffge = '%qx/f' % xcf
-        vs ubhef:
-            erznvafge = '%qu%qz' % (ubhef, zvaf)
-        ryvs zvaf:
-            erznvafge = '%qz%q' % (zvaf, frpf)
-        ryfr:
-            erznvafge = '%qf' % frpf
-    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
-             % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
-                erznvafge, xcffge))
-
-
-e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
-
-qrs nyernql_fnirq(rag):
-    erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
-
-qrs jnagerphefr_cer(rag):
-    erghea abg nyernql_fnirq(rag)
-
-qrs jnagerphefr_qhevat(rag):
-    erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
-
-gbgny = sgbgny = 0
-vs bcg.cebterff:
-    sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
-        vs abg (sgbgny % 10024):
-            cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
-        rkvfgf = rag.rkvfgf()
-        unfuinyvq = nyernql_fnirq(rag)
-        rag.frg_fun_zvffvat(abg unfuinyvq)
-        vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
-            vs rkvfgf naq abg unfuinyvq:
-                gbgny += rag.fvmr
-        sgbgny += 1
-    cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
-    unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
-
-gfgneg = gvzr.gvzr()
-pbhag = fhopbhag = spbhag = 0
-ynfgfxvc_anzr = Abar
-ynfgqve = ''
-sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
-    (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
-    rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
-    unfuinyvq = nyernql_fnirq(rag)
-    jnfzvffvat = rag.fun_zvffvat()
-    byqfvmr = rag.fvmr
-    vs bcg.ireobfr:
-        vs abg rkvfgf:
-            fgnghf = 'Q'
-        ryvs abg unfuinyvq:
-            vs rag.fun == vaqrk.RZCGL_FUN:
-                fgnghf = 'N'
-            ryfr:
-                fgnghf = 'Z'
-        ryfr:
-            fgnghf = ' '
-        vs bcg.ireobfr >= 2:
-            ybt('%f %-70f\a' % (fgnghf, rag.anzr))
-        ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
-            vs abg ynfgqve.fgnegfjvgu(qve):
-                ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
-            ynfgqve = qve
-
-    vs bcg.cebterff:
-        cebterff_ercbeg(0)
-    spbhag += 1
-    
-    vs abg rkvfgf:
-        pbagvahr
-    vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
-        vs rkvfgf naq abg unfuinyvq:
-            nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
-            ynfgfxvc_anzr = rag.anzr
-        pbagvahr
-
-    nffreg(qve.fgnegfjvgu('/'))
-    qvec = qve.fcyvg('/')
-    juvyr cnegf > qvec:
-        _cbc(sbepr_gerr = Abar)
-    vs qve != '/':
-        sbe cneg va qvec[yra(cnegf):]:
-            _chfu(cneg)
-
-    vs abg svyr:
-        # ab svyranzr cbegvba zrnaf guvf vf n fhoqve.  Ohg
-        # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
-        byqgerr = nyernql_fnirq(rag) # znl or Abar
-        arjgerr = _cbc(sbepr_gerr = byqgerr)
-        vs abg byqgerr:
-            vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
-                rag.vainyvqngr()
-            ryfr:
-                rag.inyvqngr(040000, arjgerr)
-            rag.ercnpx()
-        vs rkvfgf naq jnfzvffvat:
-            pbhag += byqfvmr
-        pbagvahr
-
-    # vg'f abg n qverpgbel
-    vq = Abar
-    vs unfuinyvq:
-        zbqr = '%b' % rag.tvgzbqr
-        vq = rag.fun
-        funyvfgf[-1].nccraq((zbqr, 
-                             tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
-                             vq))
-    ryfr:
-        vs fgng.F_VFERT(rag.zbqr):
-            gel:
-                s = unfufcyvg.bcra_abngvzr(rag.anzr)
-            rkprcg VBReebe, r:
-                nqq_reebe(r)
-                ynfgfxvc_anzr = rag.anzr
-            rkprcg BFReebe, r:
-                nqq_reebe(r)
-                ynfgfxvc_anzr = rag.anzr
-            ryfr:
-                (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
-        ryfr:
-            vs fgng.F_VFQVE(rag.zbqr):
-                nffreg(0)  # unaqyrq nobir
-            ryvs fgng.F_VFYAX(rag.zbqr):
-                gel:
-                    ey = bf.ernqyvax(rag.anzr)
-                rkprcg BFReebe, r:
-                    nqq_reebe(r)
-                    ynfgfxvc_anzr = rag.anzr
-                rkprcg VBReebe, r:
-                    nqq_reebe(r)
-                    ynfgfxvc_anzr = rag.anzr
-                ryfr:
-                    (zbqr, vq) = ('120000', j.arj_oybo(ey))
-            ryfr:
-                nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
-                ynfgfxvc_anzr = rag.anzr
-        vs vq:
-            rag.inyvqngr(vag(zbqr, 8), vq)
-            rag.ercnpx()
-            funyvfgf[-1].nccraq((zbqr,
-                                 tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
-                                 vq))
-    vs rkvfgf naq jnfzvffvat:
-        pbhag += byqfvmr
-        fhopbhag = 0
-
-
-vs bcg.cebterff:
-    cpg = gbgny naq pbhag*100.0/gbgny be 100
-    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar.    \a'
-             % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
-
-juvyr yra(cnegf) > 1:
-    _cbc(sbepr_gerr = Abar)
-nffreg(yra(funyvfgf) == 1)
-gerr = j.arj_gerr(funyvfgf[-1])
-vs bcg.gerr:
-    cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
-    zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
-    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
-    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
-    vs bcg.pbzzvg:
-        cevag pbzzvg.rapbqr('urk')
-
-j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
-        
-vs bcg.anzr:
-    vs pyv:
-        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
-    ryfr:
-        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
-    pyv.pybfr()
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc gvpx
-"""
-b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-g = gvzr.gvzr()
-gyrsg = 1 - (g - vag(g))
-gvzr.fyrrc(gyrsg)
-#!/hfe/ova/rai clguba
-vzcbeg bf, flf, fgng, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
-sebz ohc.urycref vzcbeg *
-
-
-qrs zretr_vaqrkrf(bhg, e1, e2):
-    sbe r va vaqrk.ZretrVgre([e1, e2]):
-        # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl?  Jura?
-        bhg.nqq_vkragel(r)
-
-
-pynff VgreUrycre:
-    qrs __vavg__(frys, y):
-        frys.v = vgre(y)
-        frys.phe = Abar
-        frys.arkg()
-
-    qrs arkg(frys):
-        gel:
-            frys.phe = frys.v.arkg()
-        rkprcg FgbcVgrengvba:
-            frys.phe = Abar
-        erghea frys.phe
-
-
-qrs purpx_vaqrk(ernqre):
-    gel:
-        ybt('purpx: purpxvat sbejneq vgrengvba...\a')
-        r = Abar
-        q = {}
-        sbe r va ernqre.sbejneq_vgre():
-            vs r.puvyqera_a:
-                vs bcg.ireobfr:
-                    ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
-                                            r.anzr))
-                nffreg(r.puvyqera_bsf)
-                nffreg(r.anzr.raqfjvgu('/'))
-                nffreg(abg q.trg(r.puvyqera_bsf))
-                q[r.puvyqera_bsf] = 1
-            vs r.syntf & vaqrk.VK_UNFUINYVQ:
-                nffreg(r.fun != vaqrk.RZCGL_FUN)
-                nffreg(r.tvgzbqr)
-        nffreg(abg r be r.anzr == '/')  # ynfg ragel vf *nyjnlf* /
-        ybt('purpx: purpxvat abezny vgrengvba...\a')
-        ynfg = Abar
-        sbe r va ernqre:
-            vs ynfg:
-                nffreg(ynfg > r.anzr)
-            ynfg = r.anzr
-    rkprcg:
-        ybt('vaqrk reebe! ng %e\a' % r)
-        envfr
-    ybt('purpx: cnffrq.\a')
-
-
-qrs hcqngr_vaqrk(gbc):
-    ev = vaqrk.Ernqre(vaqrksvyr)
-    jv = vaqrk.Jevgre(vaqrksvyr)
-    evt = VgreUrycre(ev.vgre(anzr=gbc))
-    gfgneg = vag(gvzr.gvzr())
-
-    unfutra = Abar
-    vs bcg.snxr_inyvq:
-        qrs unfutra(anzr):
-            erghea (0100644, vaqrk.SNXR_FUN)
-
-    gbgny = 0
-    sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
-        vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
-            flf.fgqbhg.jevgr('%f\a' % cngu)
-            flf.fgqbhg.syhfu()
-            cebterff('Vaqrkvat: %q\e' % gbgny)
-        ryvs abg (gbgny % 128):
-            cebterff('Vaqrkvat: %q\e' % gbgny)
-        gbgny += 1
-        juvyr evt.phe naq evt.phe.anzr > cngu:  # qryrgrq cnguf
-            vs evt.phe.rkvfgf():
-                evt.phe.frg_qryrgrq()
-                evt.phe.ercnpx()
-            evt.arkg()
-        vs evt.phe naq evt.phe.anzr == cngu:    # cnguf gung nyernql rkvfgrq
-            vs cfg:
-                evt.phe.sebz_fgng(cfg, gfgneg)
-            vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
-                vs unfutra:
-                    (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
-                    evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
-            vs bcg.snxr_vainyvq:
-                evt.phe.vainyvqngr()
-            evt.phe.ercnpx()
-            evt.arkg()
-        ryfr:  # arj cnguf
-            jv.nqq(cngu, cfg, unfutra = unfutra)
-    cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
-    
-    vs ev.rkvfgf():
-        ev.fnir()
-        jv.syhfu()
-        vs jv.pbhag:
-            je = jv.arj_ernqre()
-            vs bcg.purpx:
-                ybt('purpx: orsber zretvat: byqsvyr\a')
-                purpx_vaqrk(ev)
-                ybt('purpx: orsber zretvat: arjsvyr\a')
-                purpx_vaqrk(je)
-            zv = vaqrk.Jevgre(vaqrksvyr)
-            zretr_vaqrkrf(zv, ev, je)
-            ev.pybfr()
-            zv.pybfr()
-            je.pybfr()
-        jv.nobeg()
-    ryfr:
-        jv.pybfr()
-
-
-bcgfcrp = """
-ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
---
-c,cevag    cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
-z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
-f,fgnghf   cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
-U,unfu     cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
-y,ybat     cevag zber vasbezngvba nobhg rnpu svyr
-h,hcqngr   (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
-k,kqri,bar-svyr-flfgrz  qba'g pebff svyrflfgrz obhaqnevrf
-snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
-snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
-purpx      pnershyyl purpx vaqrk svyr vagrtevgl
-s,vaqrksvyr=  gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-"""
-b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
-    b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
-vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
-    b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
-vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
-    b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
-
-tvg.purpx_ercb_be_qvr()
-vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
-
-unaqyr_pgey_p()
-
-vs bcg.purpx:
-    ybt('purpx: fgnegvat vavgvny purpx.\a')
-    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-cnguf = vaqrk.erqhpr_cnguf(rkgen)
-
-vs bcg.hcqngr:
-    vs abg cnguf:
-        b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
-    sbe (ec,cngu) va cnguf:
-        hcqngr_vaqrk(ec)
-
-vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
-    sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
-        vs (bcg.zbqvsvrq 
-            naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
-            pbagvahr
-        yvar = ''
-        vs bcg.fgnghf:
-            vs rag.vf_qryrgrq():
-                yvar += 'Q '
-            ryvs abg rag.vf_inyvq():
-                vs rag.fun == vaqrk.RZCGL_FUN:
-                    yvar += 'N '
-                ryfr:
-                    yvar += 'Z '
-            ryfr:
-                yvar += '  '
-        vs bcg.unfu:
-            yvar += rag.fun.rapbqr('urk') + ' '
-        vs bcg.ybat:
-            yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
-        cevag yvar + (anzr be './')
-
-vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
-    ybt('purpx: fgnegvat svany purpx.\a')
-    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg
-sebz ohc vzcbeg bcgvbaf, urycref
-
-bcgfcrp = """
-ohc eonpxhc-freire
---
-    Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-# trg gur fhopbzznaq'f neti.
-# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
-# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
-# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
-ohs = flf.fgqva.ernq(4)
-fm = fgehpg.hacnpx('!V', ohs)[0]
-nffreg(fm > 0)
-nffreg(fm < 1000000)
-ohs = flf.fgqva.ernq(fm)
-nffreg(yra(ohs) == fm)
-neti = ohs.fcyvg('\0')
-
-# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
-# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
-# gb zvfhfr gurz.  Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
-# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
-#
-# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
-# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
-# fbpxrg.  Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
-# bs vg, ohg cebonoyl qvqa'g.  Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
-# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
-#
-# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
-# qrfpevcgbef.  Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
-# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
-bf.qhc2(0, 3)
-bf.qhc2(1, 4)
-bf.qhc2(2, 1)
-sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
-bf.qhc2(sq, 0)
-bf.pybfr(sq)
-
-bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
-bf.rkrpic(neti[0], neti)
-flf.rkvg(99)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo, fhocebprff, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-cne2_bx = 0
-ahyys = bcra('/qri/ahyy')
-
-qrs qroht(f):
-    vs bcg.ireobfr:
-        ybt(f)
-
-qrs eha(neti):
-    # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
-    # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
-    # rkrpvat sbe fbzr ernfba.  Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
-    # svefg.
-    sq = bf.qhc(2)  # pbcl fgqree
-    gel:
-        c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
-        erghea c.jnvg()
-    svanyyl:
-        bf.pybfr(sq)
-
-qrs cne2_frghc():
-    tybony cne2_bx
-    ei = 1
-    gel:
-        c = fhocebprff.Cbcra(['cne2', '--uryc'],
-                             fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
-        ei = c.jnvg()
-    rkprcg BFReebe:
-        ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
-    ryfr:
-        cne2_bx = 1
-
-qrs cnei(yiy):
-    vs bcg.ireobfr >= yiy:
-        vs vfggl:
-            erghea []
-        ryfr:
-            erghea ['-d']
-    ryfr:
-        erghea ['-dd']
-
-qrs cne2_trarengr(onfr):
-    erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
-               + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
-
-qrs cne2_irevsl(onfr):
-    erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
-
-qrs cne2_ercnve(onfr):
-    erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
-
-qrs dhvpx_irevsl(onfr):
-    s = bcra(onfr + '.cnpx', 'eo')
-    s.frrx(-20, 2)
-    jnagfhz = s.ernq(20)
-    nffreg(yra(jnagfhz) == 20)
-    s.frrx(0)
-    fhz = Fun1()
-    sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
-        fhz.hcqngr(o)
-    vs fhz.qvtrfg() != jnagfhz:
-        envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
-                                                  fhz.urkqvtrfg()))
-        
-
-qrs tvg_irevsl(onfr):
-    vs bcg.dhvpx:
-        gel:
-            dhvpx_irevsl(onfr)
-        rkprcg Rkprcgvba, r:
-            qroht('reebe: %f\a' % r)
-            erghea 1
-        erghea 0
-    ryfr:
-        erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
-    
-    
-qrs qb_cnpx(onfr, ynfg):
-    pbqr = 0
-    vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
-        ierfhyg = cne2_irevsl(onfr)
-        vs ierfhyg != 0:
-            vs bcg.ercnve:
-                eerfhyg = cne2_ercnve(onfr)
-                vs eerfhyg != 0:
-                    cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
-                    pbqr = eerfhyg
-                ryfr:
-                    cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
-                    pbqr = 100
-            ryfr:
-                cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
-                pbqr = ierfhyg
-        ryfr:
-            cevag '%f bx' % ynfg
-    ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
-        terfhyg = tvg_irevsl(onfr)
-        vs terfhyg != 0:
-            cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
-            pbqr = terfhyg
-        ryfr:
-            vs cne2_bx naq bcg.trarengr:
-                cerfhyg = cne2_trarengr(onfr)
-                vs cerfhyg != 0:
-                    cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
-                    pbqr = cerfhyg
-                ryfr:
-                    cevag '%f bx' % ynfg
-            ryfr:
-                cevag '%f bx' % ynfg
-    ryfr:
-        nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
-        qroht('    fxvccrq: cne2 svyr nyernql trarengrq.\a')
-    erghea pbqr
-
-
-bcgfcrp = """
-ohc sfpx [bcgvbaf...] [svyranzrf...]
---
-e,ercnve    nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
-t,trarengr  trarengr nhgb-ercnve vasbezngvba hfvat cne2
-i,ireobfr   vapernfr ireobfvgl (pna or hfrq zber guna bapr)
-dhvpx       whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
-w,wbof=     eha 'a' wbof va cnenyyry
-cne2-bx     vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
-qvfnoyr-cne2  vtaber cne2 rira vs vg vf ninvynoyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-cne2_frghc()
-vs bcg.cne2_bx:
-    vs cne2_bx:
-        flf.rkvg(0)  # 'gehr' va fu
-    ryfr:
-        flf.rkvg(1)
-vs bcg.qvfnoyr_cne2:
-    cne2_bx = 0
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
-    qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
-    rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
-
-pbqr = 0
-pbhag = 0
-bhgfgnaqvat = {}
-sbe anzr va rkgen:
-    vs anzr.raqfjvgu('.cnpx'):
-        onfr = anzr[:-5]
-    ryvs anzr.raqfjvgu('.vqk'):
-        onfr = anzr[:-4]
-    ryvs anzr.raqfjvgu('.cne2'):
-        onfr = anzr[:-5]
-    ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
-        onfr = anzr
-    ryfr:
-        envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
-    (qve,ynfg) = bf.cngu.fcyvg(onfr)
-    cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
-    vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
-        cne2_rkvfgf = 0
-    flf.fgqbhg.syhfu()
-    qroht('sfpx: purpxvat %f (%f)\a' 
-          % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
-    vs abg bcg.ireobfr:
-        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-    
-    vs abg bcg.wbof:
-        ap = qb_cnpx(onfr, ynfg)
-        pbqr = pbqr be ap
-        pbhag += 1
-    ryfr:
-        juvyr yra(bhgfgnaqvat) >= bcg.wbof:
-            (cvq,ap) = bf.jnvg()
-            ap >>= 8
-            vs cvq va bhgfgnaqvat:
-                qry bhgfgnaqvat[cvq]
-                pbqr = pbqr be ap
-                pbhag += 1
-        cvq = bf.sbex()
-        vs cvq:  # cnerag
-            bhgfgnaqvat[cvq] = 1
-        ryfr: # puvyq
-            gel:
-                flf.rkvg(qb_cnpx(onfr, ynfg))
-            rkprcg Rkprcgvba, r:
-                ybt('rkprcgvba: %e\a' % r)
-                flf.rkvg(99)
-                
-juvyr yra(bhgfgnaqvat):
-    (cvq,ap) = bf.jnvg()
-    ap >>= 8
-    vs cvq va bhgfgnaqvat:
-        qry bhgfgnaqvat[cvq]
-        pbqr = pbqr be ap
-        pbhag += 1
-    vs abg bcg.ireobfr:
-        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
-vs abg bcg.ireobfr naq vfggl:
-    ybt('sfpx qbar.           \a')
-flf.rkvg(pbqr)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
-sebz ohc vzcbeg bcgvbaf, ffu
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc eonpxhc <ubfganzr> vaqrk ...
-ohc eonpxhc <ubfganzr> fnir ...
-ohc eonpxhc <ubfganzr> fcyvg ...
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs yra(rkgen) < 2:
-    b.sngny('nethzragf rkcrpgrq')
-
-pynff FvtRkprcgvba(Rkprcgvba):
-    qrs __vavg__(frys, fvtahz):
-        frys.fvtahz = fvtahz
-        Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
-qrs unaqyre(fvtahz, senzr):
-    envfr FvtRkprcgvba(fvtahz)
-
-fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
-fvtany.fvtany(fvtany.FVTVAG, unaqyre)
-
-fc = Abar
-c = Abar
-erg = 99
-
-gel:
-    ubfganzr = rkgen[0]
-    neti = rkgen[1:]
-    c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
-
-    netif = '\0'.wbva(['ohc'] + neti)
-    c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
-    c.fgqva.syhfu()
-
-    znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
-    fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
-
-    c.fgqva.pybfr()
-    c.fgqbhg.pybfr()
-
-svanyyl:
-    juvyr 1:
-        # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
-        # va pnfr bhe puvyq qbrfa'g qvr.
-        gel:
-            erg = c.jnvg()
-            fc.jnvg()
-            oernx
-        rkprcg FvtRkprcgvba, r:
-            ybt('\aohc eonpxhc: %f\a' % r)
-            bf.xvyy(c.cvq, r.fvtahz)
-            erg = 84
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc arjyvare
-"""
-b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-e = er.pbzcvyr(e'([\e\a])')
-ynfgyra = 0
-nyy = ''
-juvyr 1:
-    y = e.fcyvg(nyy, 1)
-    vs yra(y) <= 1:
-        gel:
-            o = bf.ernq(flf.fgqva.svyrab(), 4096)
-        rkprcg XrlobneqVagreehcg:
-            oernx
-        vs abg o:
-            oernx
-        nyy += o
-    ryfr:
-        nffreg(yra(y) == 3)
-        (yvar, fcyvgpune, nyy) = y
-        #fcyvgpune = '\a'
-        flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
-        vs fcyvgpune == '\e':
-            ynfgyra = yra(yvar)
-        ryfr:
-            ynfgyra = 0
-        flf.fgqbhg.syhfu()
-
-vs ynfgyra be nyy:
-    flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
-#!/hfe/ova/rai clguba
-vzcbeg flf
-sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc znetva
-"""
-b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-#tvg.vtaber_zvqk = 1
-
-zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-ynfg = '\0'*20
-ybatzngpu = 0
-sbe v va zv:
-    vs v == ynfg:
-        pbagvahr
-    #nffreg(fge(v) >= ynfg)
-    cz = _unfufcyvg.ovgzngpu(ynfg, v)
-    ybatzngpu = znk(ybatzngpu, cz)
-    ynfg = v
-cevag ybatzngpu
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg bcgvbaf, qerphefr
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc qerphefr <cngu>
---
-k,kqri,bar-svyr-flfgrz   qba'g pebff svyrflfgrz obhaqnevrf
-d,dhvrg  qba'g npghnyyl cevag svyranzrf
-cebsvyr  eha haqre gur clguba cebsvyre
-"""
-b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar svyranzr rkcrpgrq")
-
-vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
-vs bcg.cebsvyr:
-    vzcbeg pCebsvyr
-    qrs qb_vg():
-        sbe v va vg:
-            cnff
-    pCebsvyr.eha('qb_vg()')
-ryfr:
-    vs bcg.dhvrg:
-        sbe v va vg:
-            cnff
-    ryfr:
-        sbe (anzr,fg) va vg:
-            cevag anzr
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-o,oybof    bhgchg n frevrf bs oybo vqf
-g,gerr     bhgchg n gerr vq
-p,pbzzvg   bhgchg n pbzzvg vq
-a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
-A,abbc     qba'g npghnyyl fnir gur qngn naljurer
-d,dhvrg    qba'g cevag cebterff zrffntrf
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-pbcl       whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
-orapu      cevag orapuznex gvzvatf gb fgqree
-znk-cnpx-fvmr=  znkvzhz olgrf va n fvatyr cnpx
-znk-cnpx-bowrpgf=  znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
-snabhg=  znkvzhz ahzore bs oybof va n fvatyr gerr
-"""
-b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
-        bcg.abbc be bcg.pbcl):
-    b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
-vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be 
-                               bcg.pbzzvg be bcg.anzr):
-    b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
-
-vs bcg.ireobfr >= 2:
-    tvg.ireobfr = bcg.ireobfr - 1
-    bcg.orapu = 1
-vs bcg.znk_cnpx_fvmr:
-    unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
-vs bcg.znk_cnpx_bowrpgf:
-    unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
-vs bcg.snabhg:
-    unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
-vs bcg.oybof:
-    unfufcyvg.snabhg = 0
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
-    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-fgneg_gvzr = gvzr.gvzr()
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.abbc be bcg.pbcl:
-    pyv = j = byqers = Abar
-ryvs bcg.erzbgr be vf_erirefr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
-    j = pyv.arj_cnpxjevgre()
-ryfr:
-    pyv = Abar
-    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
-    j = tvg.CnpxJevgre()
-
-svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
-vs j:
-    funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
-    gerr = j.arj_gerr(funyvfg)
-ryfr:
-    ynfg = 0
-    sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
-        unfufcyvg.gbgny_fcyvg += yra(oybo)
-        vs bcg.pbcl:
-            flf.fgqbhg.jevgr(fge(oybo))
-        zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
-        vs abg bcg.dhvrg naq ynfg != zrtf:
-            cebterff('%q Zolgrf ernq\e' % zrtf)
-            ynfg = zrtf
-    cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
-
-vs bcg.ireobfr:
-    ybt('\a')
-vs bcg.oybof:
-    sbe (zbqr,anzr,ova) va funyvfg:
-        cevag ova.rapbqr('urk')
-vs bcg.gerr:
-    cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
-    zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
-    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
-    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
-    vs bcg.pbzzvg:
-        cevag pbzzvg.rapbqr('urk')
-
-vs j:
-    j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
-        
-vs bcg.anzr:
-    vs pyv:
-        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
-    ryfr:
-        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
-    pyv.pybfr()
-
-frpf = gvzr.gvzr() - fgneg_gvzr
-fvmr = unfufcyvg.gbgny_fcyvg
-vs bcg.orapu:
-    ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
-        % (fvmr/1024., frpf, fvmr/1024./frpf))
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, fgehpg, zznc
-sebz ohc vzcbeg tvg, bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs f_sebz_olgrf(olgrf):
-    pyvfg = [pue(o) sbe o va olgrf]
-    erghea ''.wbva(pyvfg)
-
-
-qrs ercbeg(pbhag):
-    svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
-    q = {}
-    sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
-        y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
-        q[y[0]] = y[1]
-    vs pbhag >= 0:
-        r1 = pbhag
-        svryqf = [q[x] sbe x va svryqf]
-    ryfr:
-        r1 = ''
-    cevag ('%9f  ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
-    flf.fgqbhg.syhfu()
-
-
-bcgfcrp = """
-ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
---
-a,ahzore=  ahzore bs bowrpgf cre plpyr
-p,plpyrf=  ahzore bs plpyrf gb eha
-vtaber-zvqk  vtaber .zvqk svyrf, hfr bayl .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-tvg.vtaber_zvqk = bcg.vtaber_zvqk
-
-tvg.purpx_ercb_be_qvr()
-z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-
-plpyrf = bcg.plpyrf be 100
-ahzore = bcg.ahzore be 10000
-
-ercbeg(-1)
-s = bcra('/qri/henaqbz')
-n = zznc.zznc(-1, 20)
-ercbeg(0)
-sbe p va kenatr(plpyrf):
-    sbe a va kenatr(ahzore):
-        o = s.ernq(3)
-        vs 0:
-            olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
-            olgrf[2] &= 0ks0
-            ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
-        ryfr:
-            n[0:2] = o[0:2]
-            n[2] = pue(beq(o[2]) & 0ks0)
-            ova = fge(n[0:20])
-        #cevag ova.rapbqr('urk')
-        z.rkvfgf(ova)
-    ercbeg((p+1)*ahzore)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-qrs cevag_abqr(grkg, a):
-    cersvk = ''
-    vs bcg.unfu:
-        cersvk += "%f " % a.unfu.rapbqr('urk')
-    vs fgng.F_VFQVE(a.zbqr):
-        cevag '%f%f/' % (cersvk, grkg)
-    ryvs fgng.F_VFYAX(a.zbqr):
-        cevag '%f%f@' % (cersvk, grkg)
-    ryfr:
-        cevag '%f%f' % (cersvk, grkg)
-
-
-bcgfcrp = """
-ohc yf <qvef...>
---
-f,unfu   fubj unfu sbe rnpu svyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-
-vs abg rkgen:
-    rkgen = ['/']
-
-erg = 0
-sbe q va rkgen:
-    gel:
-        a = gbc.yerfbyir(q)
-        vs fgng.F_VFQVE(a.zbqr):
-            sbe fho va a:
-                cevag_abqr(fho.anzr, fho)
-        ryfr:
-            cevag_abqr(q, a)
-    rkprcg isf.AbqrReebe, r:
-        ybt('reebe: %f\a' % r)
-        erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
-sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
-sebz ohc.urycref vzcbeg *
-
-qrs abqr_anzr(grkg, a):
-    vs fgng.F_VFQVE(a.zbqr):
-        erghea '%f/' % grkg
-    ryvs fgng.F_VFYAX(a.zbqr):
-        erghea '%f@' % grkg
-    ryfr:
-        erghea '%f' % grkg
-
-
-qrs qb_yf(cngu, a):
-    y = []
-    vs fgng.F_VFQVE(a.zbqr):
-        sbe fho va a:
-            y.nccraq(abqr_anzr(fho.anzr, fho))
-    ryfr:
-        y.nccraq(abqr_anzr(cngu, a))
-    cevag pbyhzangr(y, '')
-    
-
-qrs jevgr_gb_svyr(vas, bhgs):
-    sbe oybo va puhaxlernqre(vas):
-        bhgs.jevgr(oybo)
-    
-
-qrs vachgvgre():
-    vs bf.vfnggl(flf.fgqva.svyrab()):
-        juvyr 1:
-            gel:
-                lvryq enj_vachg('ohc> ')
-            rkprcg RBSReebe:
-                oernx
-    ryfr:
-        sbe yvar va flf.fgqva:
-            lvryq yvar
-
-
-qrs _pbzcyrgre_trg_fhof(yvar):
-    (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
-    (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
-    #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
-    a = cjq.erfbyir(qve)
-    fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
-                       a.fhof()))
-    erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
-
-
-_ynfg_yvar = Abar
-_ynfg_erf = Abar
-qrs pbzcyrgre(grkg, fgngr):
-    tybony _ynfg_yvar
-    tybony _ynfg_erf
-    gel:
-        yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
-        vs _ynfg_yvar != yvar:
-            _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
-            _ynfg_yvar = yvar
-        (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
-        vs fgngr < yra(fhof):
-            fa = fhof[fgngr]
-            fa1 = fa.erfbyir('')  # qrers flzyvaxf
-            shyyanzr = bf.cngu.wbva(qve, fa.anzr)
-            vs fgng.F_VFQVE(fa1.zbqr):
-                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
-                                          grezvangr=Snyfr)
-            ryfr:
-                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
-                                          grezvangr=Gehr) + ' '
-            erghea grkg + erg
-    rkprcg Rkprcgvba, r:
-        ybt('\areebe va pbzcyrgvba: %f\a' % r)
-
-            
-bcgfcrp = """
-ohc sgc
-"""
-b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-gbc = isf.ErsYvfg(Abar)
-cjq = gbc
-
-vs rkgen:
-    yvarf = rkgen
-ryfr:
-    ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
-    ernqyvar.frg_pbzcyrgre(pbzcyrgre)
-    ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
-    yvarf = vachgvgre()
-
-sbe yvar va yvarf:
-    vs abg yvar.fgevc():
-        pbagvahr
-    jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
-    pzq = jbeqf[0].ybjre()
-    #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
-    gel:
-        vs pzq == 'yf':
-            sbe cnez va (jbeqf[1:] be ['.']):
-                qb_yf(cnez, cjq.erfbyir(cnez))
-        ryvs pzq == 'pq':
-            sbe cnez va jbeqf[1:]:
-                cjq = cjq.erfbyir(cnez)
-        ryvs pzq == 'cjq':
-            cevag cjq.shyyanzr()
-        ryvs pzq == 'png':
-            sbe cnez va jbeqf[1:]:
-                jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
-        ryvs pzq == 'trg':
-            vs yra(jbeqf) abg va [2,3]:
-                envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
-            eanzr = jbeqf[1]
-            (qve,onfr) = bf.cngu.fcyvg(eanzr)
-            yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
-            vas = cjq.erfbyir(eanzr).bcra()
-            ybt('Fnivat %e\a' % yanzr)
-            jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
-        ryvs pzq == 'ztrg':
-            sbe cnez va jbeqf[1:]:
-                (qve,onfr) = bf.cngu.fcyvg(cnez)
-                sbe a va cjq.erfbyir(qve).fhof():
-                    vs sazngpu.sazngpu(a.anzr, onfr):
-                        gel:
-                            ybt('Fnivat %e\a' % a.anzr)
-                            vas = a.bcra()
-                            bhgs = bcra(a.anzr, 'jo')
-                            jevgr_gb_svyr(vas, bhgs)
-                            bhgs.pybfr()
-                        rkprcg Rkprcgvba, r:
-                            ybt('  reebe: %f\a' % r)
-        ryvs pzq == 'uryc' be pzq == '?':
-            ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
-        ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
-            oernx
-        ryfr:
-            envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
-    rkprcg Rkprcgvba, r:
-        ybt('reebe: %f\a' % r)
-        #envfr
-#!/hfe/ova/rai clguba
-vzcbeg flf, zznc
-sebz ohc vzcbeg bcgvbaf, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc enaqbz [-F frrq] <ahzolgrf>
---
-F,frrq=   bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
-s,sbepr   cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
-"""
-b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-gbgny = cnefr_ahz(rkgen[0])
-
-vs bcg.sbepr be (abg bf.vfnggl(1) naq
-                 abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
-    _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
-ryfr:
-    ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc uryc <pbzznaq>
-"""
-b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) == 0:
-    # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
-    bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
-ryvs yra(rkgen) == 1:
-    qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
-    rkr = flf.neti[0]
-    (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
-    znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
-    t = tybo.tybo(znacngu)
-    vs t:
-        bf.rkrpic('zna', ['zna', '-y', t[0]])
-    ryfr:
-        bf.rkrpic('zna', ['zna', qbpanzr])
-ryfr:
-    b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-
-pynff Fgng(shfr.Fgng):
-    qrs __vavg__(frys):
-        frys.fg_zbqr = 0
-        frys.fg_vab = 0
-        frys.fg_qri = 0
-        frys.fg_ayvax = 0
-        frys.fg_hvq = 0
-        frys.fg_tvq = 0
-        frys.fg_fvmr = 0
-        frys.fg_ngvzr = 0
-        frys.fg_zgvzr = 0
-        frys.fg_pgvzr = 0
-        frys.fg_oybpxf = 0
-        frys.fg_oyxfvmr = 0
-        frys.fg_eqri = 0
-
-
-pnpur = {}
-qrs pnpur_trg(gbc, cngu):
-    cnegf = cngu.fcyvg('/')
-    pnpur[('',)] = gbc
-    p = Abar
-    znk = yra(cnegf)
-    #ybt('pnpur: %e\a' % pnpur.xrlf())
-    sbe v va enatr(znk):
-        cer = cnegf[:znk-v]
-        #ybt('pnpur gelvat: %e\a' % cer)
-        p = pnpur.trg(ghcyr(cer))
-        vs p:
-            erfg = cnegf[znk-v:]
-            sbe e va erfg:
-                #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
-                p = p.yerfbyir(e)
-                xrl = ghcyr(cer + [e])
-                #ybt('fnivat: %e\a' % (xrl,))
-                pnpur[xrl] = p
-            oernx
-    nffreg(p)
-    erghea p
-        
-    
-
-pynff OhcSf(shfr.Shfr):
-    qrs __vavg__(frys, gbc):
-        shfr.Shfr.__vavg__(frys)
-        frys.gbc = gbc
-    
-    qrs trgngge(frys, cngu):
-        ybt('--trgngge(%e)\a' % cngu)
-        gel:
-            abqr = pnpur_trg(frys.gbc, cngu)
-            fg = Fgng()
-            fg.fg_zbqr = abqr.zbqr
-            fg.fg_ayvax = abqr.ayvaxf()
-            fg.fg_fvmr = abqr.fvmr()
-            fg.fg_zgvzr = abqr.zgvzr
-            fg.fg_pgvzr = abqr.pgvzr
-            fg.fg_ngvzr = abqr.ngvzr
-            erghea fg
-        rkprcg isf.AbFhpuSvyr:
-            erghea -reeab.RABRAG
-
-    qrs ernqqve(frys, cngu, bssfrg):
-        ybt('--ernqqve(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        lvryq shfr.Qveragel('.')
-        lvryq shfr.Qveragel('..')
-        sbe fho va abqr.fhof():
-            lvryq shfr.Qveragel(fho.anzr)
-
-    qrs ernqyvax(frys, cngu):
-        ybt('--ernqyvax(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        erghea abqr.ernqyvax()
-
-    qrs bcra(frys, cngu, syntf):
-        ybt('--bcra(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
-        vs (syntf & nppzbqr) != bf.B_EQBAYL:
-            erghea -reeab.RNPPRF
-        abqr.bcra()
-
-    qrs eryrnfr(frys, cngu, syntf):
-        ybt('--eryrnfr(%e)\a' % cngu)
-
-    qrs ernq(frys, cngu, fvmr, bssfrg):
-        ybt('--ernq(%e)\a' % cngu)
-        a = pnpur_trg(frys.gbc, cngu)
-        b = a.bcra()
-        b.frrx(bssfrg)
-        erghea b.ernq(fvmr)
-
-
-vs abg unfngge(shfr, '__irefvba__'):
-    envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
-shfr.shfr_clguba_ncv = (0, 2)
-
-
-bcgfcrp = """
-ohc shfr [-q] [-s] <zbhagcbvag>
---
-q,qroht   vapernfr qroht yriry
-s,sbertebhaq  eha va sbertebhaq
-"""
-b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-s = OhcSf(gbc)
-s.shfr_netf.zbhagcbvag = rkgen[0]
-vs bcg.qroht:
-    s.shfr_netf.nqq('qroht')
-vs bcg.sbertebhaq:
-    s.shfr_netf.frgzbq('sbertebhaq')
-cevag s.zhygvguernqrq
-s.zhygvguernqrq = Snyfr
-
-s.znva()
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-
-vs bcg.erzbgr:
-    tvg.vavg_ercb()  # ybpny ercb
-    tvg.purpx_ercb_be_qvr()
-    pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
-    pyv.pybfr()
-ryfr:
-    tvg.vavg_ercb()
-#!/hfe/ova/rai clguba
-vzcbeg flf, zngu, fgehpg, tybo
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-CNTR_FVMR=4096
-FUN_CRE_CNTR=CNTR_FVMR/200.
-
-
-qrs zretr(vqkyvfg, ovgf, gnoyr):
-    pbhag = 0
-    sbe r va tvg.vqkzretr(vqkyvfg):
-        pbhag += 1
-        cersvk = tvg.rkgenpg_ovgf(r, ovgf)
-        gnoyr[cersvk] = pbhag
-        lvryq r
-
-
-qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
-    vs abg bhgsvyranzr:
-        nffreg(bhgqve)
-        fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
-        bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
-    
-    vac = []
-    gbgny = 0
-    sbe anzr va vasvyranzrf:
-        vk = tvg.CnpxVqk(anzr)
-        vac.nccraq(vk)
-        gbgny += yra(vk)
-
-    ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
-    vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
-       be (bcg.sbepr naq abg gbgny):
-        ybt('zvqk: abguvat gb qb.\a')
-        erghea
-
-    cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
-    ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
-    ragevrf = 2**ovgf
-    ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
-    
-    gnoyr = [0]*ragevrf
-
-    gel:
-        bf.hayvax(bhgsvyranzr)
-    rkprcg BFReebe:
-        cnff
-    s = bcra(bhgsvyranzr + '.gzc', 'j+')
-    s.jevgr('ZVQK\0\0\0\2')
-    s.jevgr(fgehpg.cnpx('!V', ovgf))
-    nffreg(s.gryy() == 12)
-    s.jevgr('\0'*4*ragevrf)
-    
-    sbe r va zretr(vac, ovgf, gnoyr):
-        s.jevgr(r)
-        
-    s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
-
-    s.frrx(12)
-    s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
-    s.pybfr()
-    bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
-
-    # guvf vf whfg sbe grfgvat
-    vs 0:
-        c = tvg.CnpxZvqk(bhgsvyranzr)
-        nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
-        cevag c.vqkanzrf
-        nffreg(yra(c) == gbgny)
-        cv = vgre(c)
-        sbe v va zretr(vac, gbgny, ovgf, gnoyr):
-            nffreg(v == cv.arkg())
-            nffreg(c.rkvfgf(v))
-
-    cevag bhgsvyranzr
-
-bcgfcrp = """
-ohc zvqk [bcgvbaf...] <vqkanzrf...>
---
-b,bhgchg=  bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
-n,nhgb     nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
-s,sbepr    nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen naq (bcg.nhgb be bcg.sbepr):
-    b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
-
-tvg.purpx_ercb_be_qvr()
-
-vs rkgen:
-    qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
-ryvs bcg.nhgb be bcg.sbepr:
-    cnguf = [tvg.ercb('bowrpgf/cnpx')]
-    cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
-    sbe cngu va cnguf:
-        ybt('zvqk: fpnaavat %f\a' % cngu)
-        vs bcg.sbepr:
-            qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
-        ryvs bcg.nhgb:
-            z = tvg.CnpxVqkYvfg(cngu)
-            arrqrq = {}
-            sbe cnpx va z.cnpxf:  # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
-                vs cnpx.anzr.raqfjvgu('.vqk'):
-                    arrqrq[cnpx.anzr] = 1
-            qry z
-            qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
-        ybt('\a')
-ryfr:
-    b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, enaqbz
-sebz ohc vzcbeg bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs enaqoybpx(a):
-    y = []
-    sbe v va kenatr(a):
-        y.nccraq(pue(enaqbz.enaqenatr(0,256)))
-    erghea ''.wbva(y)
-
-
-bcgfcrp = """
-ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
---
-   JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
-a,ahz=   ahzore bs oybpxf gb qnzntr
-f,fvmr=  znkvzhz fvmr bs rnpu qnzntrq oybpx
-creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
-rdhny    fcernq qnzntr rirayl guebhtubhg gur svyr
-F,frrq=  enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
-"""
-b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg rkgen:
-    b.sngny('svyranzrf rkcrpgrq')
-
-vs bcg.frrq != Abar:
-    enaqbz.frrq(bcg.frrq)
-
-sbe anzr va rkgen:
-    ybt('Qnzntvat "%f"...\a' % anzr)
-    s = bcra(anzr, 'e+o')
-    fg = bf.sfgng(s.svyrab())
-    fvmr = fg.fg_fvmr
-    vs bcg.creprag be bcg.fvmr:
-        zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
-        zf2 = bcg.fvmr be fvmr
-        znkfvmr = zva(zf1, zf2)
-    ryfr:
-        znkfvmr = 1
-    puhaxf = bcg.ahz be 10
-    puhaxfvmr = fvmr/puhaxf
-    sbe e va enatr(puhaxf):
-        fm = enaqbz.enaqenatr(1, znkfvmr+1)
-        vs fm > fvmr:
-            fm = fvmr
-        vs bcg.rdhny:
-            bsf = e*puhaxfvmr
-        ryfr:
-            bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
-        ybt('  %6q olgrf ng %q\a' % (fm, bsf))
-        s.frrx(bsf)
-        s.jevgr(enaqoybpx(fm))
-    s.pybfr()
-#!/hfe/ova/rai clguba
-vzcbeg flf, fgehpg, zznc
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-fhfcraqrq_j = Abar
-
-
-qrs vavg_qve(pbaa, net):
-    tvg.vavg_ercb(net)
-    ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
-    pbaa.bx()
-
-
-qrs frg_qve(pbaa, net):
-    tvg.purpx_ercb_be_qvr(net)
-    ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
-    pbaa.bx()
-
-    
-qrs yvfg_vaqrkrf(pbaa, whax):
-    tvg.purpx_ercb_be_qvr()
-    sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
-        vs s.raqfjvgu('.vqk'):
-            pbaa.jevgr('%f\a' % s)
-    pbaa.bx()
-
-
-qrs fraq_vaqrk(pbaa, anzr):
-    tvg.purpx_ercb_be_qvr()
-    nffreg(anzr.svaq('/') < 0)
-    nffreg(anzr.raqfjvgu('.vqk'))
-    vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
-    pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
-    pbaa.jevgr(vqk.znc)
-    pbaa.bx()
-
-
-qrs erprvir_bowrpgf(pbaa, whax):
-    tybony fhfcraqrq_j
-    tvg.purpx_ercb_be_qvr()
-    fhttrfgrq = {}
-    vs fhfcraqrq_j:
-        j = fhfcraqrq_j
-        fhfcraqrq_j = Abar
-    ryfr:
-        j = tvg.CnpxJevgre()
-    juvyr 1:
-        af = pbaa.ernq(4)
-        vs abg af:
-            j.nobeg()
-            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
-        a = fgehpg.hacnpx('!V', af)[0]
-        #ybt('rkcrpgvat %q olgrf\a' % a)
-        vs abg a:
-            ybt('ohc freire: erprvirq %q bowrpg%f.\a' 
-                % (j.pbhag, j.pbhag!=1 naq "f" be ''))
-            shyycngu = j.pybfr()
-            vs shyycngu:
-                (qve, anzr) = bf.cngu.fcyvg(shyycngu)
-                pbaa.jevgr('%f.vqk\a' % anzr)
-            pbaa.bx()
-            erghea
-        ryvs a == 0kssssssss:
-            ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
-            fhfcraqrq_j = j
-            pbaa.bx()
-            erghea
-            
-        ohs = pbaa.ernq(a)  # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
-        #ybt('ernq %q olgrf\a' % a)
-        vs yra(ohs) < a:
-            j.nobeg()
-            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
-                            % (a, yra(ohs)))
-        (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
-        fun = tvg.pnyp_unfu(glcr, pbagrag)
-        byqcnpx = j.rkvfgf(fun)
-        # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
-        # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
-        # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
-        # ba gur freire fvqr.
-        vs abg fhttrfgrq naq \
-          byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
-            # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
-            # ng guvf ynlre.  Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
-            # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
-            # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
-            # znxr gur svyrf ovttre.  Guvf zrgubq vf pregnvayl abg irel
-            # rssvpvrag.
-            j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
-            byqcnpx = j.bowpnpur.rkvfgf(fun)
-            ybt('arj fhttrfgvba: %e\a' % byqcnpx)
-            nffreg(byqcnpx)
-            nffreg(byqcnpx != Gehr)
-            nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
-            j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
-        vs abg fhttrfgrq naq byqcnpx:
-            nffreg(byqcnpx.raqfjvgu('.vqk'))
-            (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
-            vs abg (anzr va fhttrfgrq):
-                ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
-                pbaa.jevgr('vaqrk %f\a' % anzr)
-                fhttrfgrq[anzr] = 1
-        ryfr:
-            j._enj_jevgr([ohs])
-    # ABGERNPURQ
-
-
-qrs ernq_ers(pbaa, ersanzr):
-    tvg.purpx_ercb_be_qvr()
-    e = tvg.ernq_ers(ersanzr)
-    pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
-    pbaa.bx()
-
-
-qrs hcqngr_ers(pbaa, ersanzr):
-    tvg.purpx_ercb_be_qvr()
-    arjiny = pbaa.ernqyvar().fgevc()
-    byqiny = pbaa.ernqyvar().fgevc()
-    tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
-    pbaa.bx()
-
-
-qrs png(pbaa, vq):
-    tvg.purpx_ercb_be_qvr()
-    gel:
-        sbe oybo va tvg.png(vq):
-            pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
-            pbaa.jevgr(oybo)
-    rkprcg XrlReebe, r:
-        ybt('freire: reebe: %f\a' % r)
-        pbaa.jevgr('\0\0\0\0')
-        pbaa.reebe(r)
-    ryfr:
-        pbaa.jevgr('\0\0\0\0')
-        pbaa.bx()
-
-
-bcgfcrp = """
-ohc freire
-"""
-b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-ybt('ohc freire: ernqvat sebz fgqva.\a')
-
-pbzznaqf = {
-    'vavg-qve': vavg_qve,
-    'frg-qve': frg_qve,
-    'yvfg-vaqrkrf': yvfg_vaqrkrf,
-    'fraq-vaqrk': fraq_vaqrk,
-    'erprvir-bowrpgf': erprvir_bowrpgf,
-    'ernq-ers': ernq_ers,
-    'hcqngr-ers': hcqngr_ers,
-    'png': png,
-}
-
-# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
-# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
-pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
-ye = yvarernqre(pbaa)
-sbe _yvar va ye:
-    yvar = _yvar.fgevc()
-    vs abg yvar:
-        pbagvahr
-    ybt('ohc freire: pbzznaq: %e\a' % yvar)
-    jbeqf = yvar.fcyvg(' ', 1)
-    pzq = jbeqf[0]
-    erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
-    vs pzq == 'dhvg':
-        oernx
-    ryfr:
-        pzq = pbzznaqf.trg(pzq)
-        vs pzq:
-            pzq(pbaa, erfg)
-        ryfr:
-            envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
-
-ybt('ohc freire: qbar\a')
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
-    rkgen = yvarernqre(flf.fgqva)
-
-erg = 0
-
-vs bcg.erzbgr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    png = pyv.png
-ryfr:
-    pc = tvg.PngCvcr()
-    png = pc.wbva
-
-sbe vq va rkgen:
-    gel:
-        sbe oybo va png(vq):
-            flf.fgqbhg.jevgr(oybo)
-    rkprcg XrlReebe, r:
-        flf.fgqbhg.syhfu()
-        ybt('reebe: %f\a' % r)
-        erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, reeab, fgng, gvzr, zngu
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc fnir [-gp] [-a anzr] <svyranzrf...>
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-g,gerr     bhgchg n gerr vq
-p,pbzzvg   bhgchg n pbzzvg vq
-a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-d,dhvrg    qba'g fubj cebterff zrgre
-fznyyre=   bayl onpx hc svyrf fznyyre guna a olgrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
-    b.sngny("hfr bar be zber bs -g, -p, -a")
-vs abg rkgen:
-    b.sngny("ab svyranzrf tvira")
-
-bcg.cebterff = (vfggl naq abg bcg.dhvrg)
-bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
-    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.erzbgr be vf_erirefr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
-    j = pyv.arj_cnpxjevgre()
-ryfr:
-    pyv = Abar
-    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
-    j = tvg.CnpxJevgre()
-
-unaqyr_pgey_p()
-
-
-qrs rngfynfu(qve):
-    vs qve.raqfjvgu('/'):
-        erghea qve[:-1]
-    ryfr:
-        erghea qve
-
-
-cnegf = ['']
-funyvfgf = [[]]
-
-qrs _chfu(cneg):
-    nffreg(cneg)
-    cnegf.nccraq(cneg)
-    funyvfgf.nccraq([])
-
-qrs _cbc(sbepr_gerr):
-    nffreg(yra(cnegf) >= 1)
-    cneg = cnegf.cbc()
-    funyvfg = funyvfgf.cbc()
-    gerr = sbepr_gerr be j.arj_gerr(funyvfg)
-    vs funyvfgf:
-        funyvfgf[-1].nccraq(('40000', cneg, gerr))
-    ryfr:  # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
-        funyvfgf.nccraq(funyvfg)
-    erghea gerr
-
-ynfgerznva = Abar
-qrs cebterff_ercbeg(a):
-    tybony pbhag, fhopbhag, ynfgerznva
-    fhopbhag += a
-    pp = pbhag + fhopbhag
-    cpg = gbgny naq (pp*100.0/gbgny) be 0
-    abj = gvzr.gvzr()
-    ryncfrq = abj - gfgneg
-    xcf = ryncfrq naq vag(pp/1024./ryncfrq)
-    xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
-    xcf = vag(xcf/xcf_senp)*xcf_senp
-    vs pp:
-        erznva = ryncfrq*1.0/pp * (gbgny-pp)
-    ryfr:
-        erznva = 0.0
-    vs (ynfgerznva naq (erznva > ynfgerznva)
-          naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
-        erznva = ynfgerznva
-    ryfr:
-        ynfgerznva = erznva
-    ubhef = vag(erznva/60/60)
-    zvaf = vag(erznva/60 - ubhef*60)
-    frpf = vag(erznva - ubhef*60*60 - zvaf*60)
-    vs ryncfrq < 30:
-        erznvafge = ''
-        xcffge = ''
-    ryfr:
-        xcffge = '%qx/f' % xcf
-        vs ubhef:
-            erznvafge = '%qu%qz' % (ubhef, zvaf)
-        ryvs zvaf:
-            erznvafge = '%qz%q' % (zvaf, frpf)
-        ryfr:
-            erznvafge = '%qf' % frpf
-    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
-             % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
-                erznvafge, xcffge))
-
-
-e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
-
-qrs nyernql_fnirq(rag):
-    erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
-
-qrs jnagerphefr_cer(rag):
-    erghea abg nyernql_fnirq(rag)
-
-qrs jnagerphefr_qhevat(rag):
-    erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
-
-gbgny = sgbgny = 0
-vs bcg.cebterff:
-    sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
-        vs abg (sgbgny % 10024):
-            cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
-        rkvfgf = rag.rkvfgf()
-        unfuinyvq = nyernql_fnirq(rag)
-        rag.frg_fun_zvffvat(abg unfuinyvq)
-        vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
-            vs rkvfgf naq abg unfuinyvq:
-                gbgny += rag.fvmr
-        sgbgny += 1
-    cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
-    unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
-
-gfgneg = gvzr.gvzr()
-pbhag = fhopbhag = spbhag = 0
-ynfgfxvc_anzr = Abar
-ynfgqve = ''
-sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
-    (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
-    rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
-    unfuinyvq = nyernql_fnirq(rag)
-    jnfzvffvat = rag.fun_zvffvat()
-    byqfvmr = rag.fvmr
-    vs bcg.ireobfr:
-        vs abg rkvfgf:
-            fgnghf = 'Q'
-        ryvs abg unfuinyvq:
-            vs rag.fun == vaqrk.RZCGL_FUN:
-                fgnghf = 'N'
-            ryfr:
-                fgnghf = 'Z'
-        ryfr:
-            fgnghf = ' '
-        vs bcg.ireobfr >= 2:
-            ybt('%f %-70f\a' % (fgnghf, rag.anzr))
-        ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
-            vs abg ynfgqve.fgnegfjvgu(qve):
-                ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
-            ynfgqve = qve
-
-    vs bcg.cebterff:
-        cebterff_ercbeg(0)
-    spbhag += 1
-    
-    vs abg rkvfgf:
-        pbagvahr
-    vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
-        vs rkvfgf naq abg unfuinyvq:
-            nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
-            ynfgfxvc_anzr = rag.anzr
-        pbagvahr
-
-    nffreg(qve.fgnegfjvgu('/'))
-    qvec = qve.fcyvg('/')
-    juvyr cnegf > qvec:
-        _cbc(sbepr_gerr = Abar)
-    vs qve != '/':
-        sbe cneg va qvec[yra(cnegf):]:
-            _chfu(cneg)
-
-    vs abg svyr:
-        # ab svyranzr cbegvba zrnaf guvf vf n fhoqve.  Ohg
-        # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
-        byqgerr = nyernql_fnirq(rag) # znl or Abar
-        arjgerr = _cbc(sbepr_gerr = byqgerr)
-        vs abg byqgerr:
-            vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
-                rag.vainyvqngr()
-            ryfr:
-                rag.inyvqngr(040000, arjgerr)
-            rag.ercnpx()
-        vs rkvfgf naq jnfzvffvat:
-            pbhag += byqfvmr
-        pbagvahr
-
-    # vg'f abg n qverpgbel
-    vq = Abar
-    vs unfuinyvq:
-        zbqr = '%b' % rag.tvgzbqr
-        vq = rag.fun
-        funyvfgf[-1].nccraq((zbqr, 
-                             tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
-                             vq))
-    ryfr:
-        vs fgng.F_VFERT(rag.zbqr):
-            gel:
-                s = unfufcyvg.bcra_abngvzr(rag.anzr)
-            rkprcg VBReebe, r:
-                nqq_reebe(r)
-                ynfgfxvc_anzr = rag.anzr
-            rkprcg BFReebe, r:
-                nqq_reebe(r)
-                ynfgfxvc_anzr = rag.anzr
-            ryfr:
-                (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
-        ryfr:
-            vs fgng.F_VFQVE(rag.zbqr):
-                nffreg(0)  # unaqyrq nobir
-            ryvs fgng.F_VFYAX(rag.zbqr):
-                gel:
-                    ey = bf.ernqyvax(rag.anzr)
-                rkprcg BFReebe, r:
-                    nqq_reebe(r)
-                    ynfgfxvc_anzr = rag.anzr
-                rkprcg VBReebe, r:
-                    nqq_reebe(r)
-                    ynfgfxvc_anzr = rag.anzr
-                ryfr:
-                    (zbqr, vq) = ('120000', j.arj_oybo(ey))
-            ryfr:
-                nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
-                ynfgfxvc_anzr = rag.anzr
-        vs vq:
-            rag.inyvqngr(vag(zbqr, 8), vq)
-            rag.ercnpx()
-            funyvfgf[-1].nccraq((zbqr,
-                                 tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
-                                 vq))
-    vs rkvfgf naq jnfzvffvat:
-        pbhag += byqfvmr
-        fhopbhag = 0
-
-
-vs bcg.cebterff:
-    cpg = gbgny naq pbhag*100.0/gbgny be 100
-    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar.    \a'
-             % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
-
-juvyr yra(cnegf) > 1:
-    _cbc(sbepr_gerr = Abar)
-nffreg(yra(funyvfgf) == 1)
-gerr = j.arj_gerr(funyvfgf[-1])
-vs bcg.gerr:
-    cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
-    zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
-    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
-    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
-    vs bcg.pbzzvg:
-        cevag pbzzvg.rapbqr('urk')
-
-j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
-        
-vs bcg.anzr:
-    vs pyv:
-        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
-    ryfr:
-        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
-    pyv.pybfr()
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc gvpx
-"""
-b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-g = gvzr.gvzr()
-gyrsg = 1 - (g - vag(g))
-gvzr.fyrrc(gyrsg)
-#!/hfe/ova/rai clguba
-vzcbeg bf, flf, fgng, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
-sebz ohc.urycref vzcbeg *
-
-
-qrs zretr_vaqrkrf(bhg, e1, e2):
-    sbe r va vaqrk.ZretrVgre([e1, e2]):
-        # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl?  Jura?
-        bhg.nqq_vkragel(r)
-
-
-pynff VgreUrycre:
-    qrs __vavg__(frys, y):
-        frys.v = vgre(y)
-        frys.phe = Abar
-        frys.arkg()
-
-    qrs arkg(frys):
-        gel:
-            frys.phe = frys.v.arkg()
-        rkprcg FgbcVgrengvba:
-            frys.phe = Abar
-        erghea frys.phe
-
-
-qrs purpx_vaqrk(ernqre):
-    gel:
-        ybt('purpx: purpxvat sbejneq vgrengvba...\a')
-        r = Abar
-        q = {}
-        sbe r va ernqre.sbejneq_vgre():
-            vs r.puvyqera_a:
-                vs bcg.ireobfr:
-                    ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
-                                            r.anzr))
-                nffreg(r.puvyqera_bsf)
-                nffreg(r.anzr.raqfjvgu('/'))
-                nffreg(abg q.trg(r.puvyqera_bsf))
-                q[r.puvyqera_bsf] = 1
-            vs r.syntf & vaqrk.VK_UNFUINYVQ:
-                nffreg(r.fun != vaqrk.RZCGL_FUN)
-                nffreg(r.tvgzbqr)
-        nffreg(abg r be r.anzr == '/')  # ynfg ragel vf *nyjnlf* /
-        ybt('purpx: purpxvat abezny vgrengvba...\a')
-        ynfg = Abar
-        sbe r va ernqre:
-            vs ynfg:
-                nffreg(ynfg > r.anzr)
-            ynfg = r.anzr
-    rkprcg:
-        ybt('vaqrk reebe! ng %e\a' % r)
-        envfr
-    ybt('purpx: cnffrq.\a')
-
-
-qrs hcqngr_vaqrk(gbc):
-    ev = vaqrk.Ernqre(vaqrksvyr)
-    jv = vaqrk.Jevgre(vaqrksvyr)
-    evt = VgreUrycre(ev.vgre(anzr=gbc))
-    gfgneg = vag(gvzr.gvzr())
-
-    unfutra = Abar
-    vs bcg.snxr_inyvq:
-        qrs unfutra(anzr):
-            erghea (0100644, vaqrk.SNXR_FUN)
-
-    gbgny = 0
-    sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
-        vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
-            flf.fgqbhg.jevgr('%f\a' % cngu)
-            flf.fgqbhg.syhfu()
-            cebterff('Vaqrkvat: %q\e' % gbgny)
-        ryvs abg (gbgny % 128):
-            cebterff('Vaqrkvat: %q\e' % gbgny)
-        gbgny += 1
-        juvyr evt.phe naq evt.phe.anzr > cngu:  # qryrgrq cnguf
-            vs evt.phe.rkvfgf():
-                evt.phe.frg_qryrgrq()
-                evt.phe.ercnpx()
-            evt.arkg()
-        vs evt.phe naq evt.phe.anzr == cngu:    # cnguf gung nyernql rkvfgrq
-            vs cfg:
-                evt.phe.sebz_fgng(cfg, gfgneg)
-            vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
-                vs unfutra:
-                    (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
-                    evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
-            vs bcg.snxr_vainyvq:
-                evt.phe.vainyvqngr()
-            evt.phe.ercnpx()
-            evt.arkg()
-        ryfr:  # arj cnguf
-            jv.nqq(cngu, cfg, unfutra = unfutra)
-    cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
-    
-    vs ev.rkvfgf():
-        ev.fnir()
-        jv.syhfu()
-        vs jv.pbhag:
-            je = jv.arj_ernqre()
-            vs bcg.purpx:
-                ybt('purpx: orsber zretvat: byqsvyr\a')
-                purpx_vaqrk(ev)
-                ybt('purpx: orsber zretvat: arjsvyr\a')
-                purpx_vaqrk(je)
-            zv = vaqrk.Jevgre(vaqrksvyr)
-            zretr_vaqrkrf(zv, ev, je)
-            ev.pybfr()
-            zv.pybfr()
-            je.pybfr()
-        jv.nobeg()
-    ryfr:
-        jv.pybfr()
-
-
-bcgfcrp = """
-ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
---
-c,cevag    cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
-z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
-f,fgnghf   cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
-U,unfu     cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
-y,ybat     cevag zber vasbezngvba nobhg rnpu svyr
-h,hcqngr   (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
-k,kqri,bar-svyr-flfgrz  qba'g pebff svyrflfgrz obhaqnevrf
-snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
-snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
-purpx      pnershyyl purpx vaqrk svyr vagrtevgl
-s,vaqrksvyr=  gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-"""
-b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
-    b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
-vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
-    b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
-vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
-    b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
-
-tvg.purpx_ercb_be_qvr()
-vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
-
-unaqyr_pgey_p()
-
-vs bcg.purpx:
-    ybt('purpx: fgnegvat vavgvny purpx.\a')
-    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-cnguf = vaqrk.erqhpr_cnguf(rkgen)
-
-vs bcg.hcqngr:
-    vs abg cnguf:
-        b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
-    sbe (ec,cngu) va cnguf:
-        hcqngr_vaqrk(ec)
-
-vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
-    sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
-        vs (bcg.zbqvsvrq 
-            naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
-            pbagvahr
-        yvar = ''
-        vs bcg.fgnghf:
-            vs rag.vf_qryrgrq():
-                yvar += 'Q '
-            ryvs abg rag.vf_inyvq():
-                vs rag.fun == vaqrk.RZCGL_FUN:
-                    yvar += 'N '
-                ryfr:
-                    yvar += 'Z '
-            ryfr:
-                yvar += '  '
-        vs bcg.unfu:
-            yvar += rag.fun.rapbqr('urk') + ' '
-        vs bcg.ybat:
-            yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
-        cevag yvar + (anzr be './')
-
-vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
-    ybt('purpx: fgnegvat svany purpx.\a')
-    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg
-sebz ohc vzcbeg bcgvbaf, urycref
-
-bcgfcrp = """
-ohc eonpxhc-freire
---
-    Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-# trg gur fhopbzznaq'f neti.
-# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
-# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
-# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
-ohs = flf.fgqva.ernq(4)
-fm = fgehpg.hacnpx('!V', ohs)[0]
-nffreg(fm > 0)
-nffreg(fm < 1000000)
-ohs = flf.fgqva.ernq(fm)
-nffreg(yra(ohs) == fm)
-neti = ohs.fcyvg('\0')
-
-# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
-# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
-# gb zvfhfr gurz.  Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
-# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
-#
-# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
-# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
-# fbpxrg.  Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
-# bs vg, ohg cebonoyl qvqa'g.  Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
-# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
-#
-# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
-# qrfpevcgbef.  Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
-# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
-bf.qhc2(0, 3)
-bf.qhc2(1, 4)
-bf.qhc2(2, 1)
-sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
-bf.qhc2(sq, 0)
-bf.pybfr(sq)
-
-bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
-bf.rkrpic(neti[0], neti)
-flf.rkvg(99)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo, fhocebprff, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-cne2_bx = 0
-ahyys = bcra('/qri/ahyy')
-
-qrs qroht(f):
-    vs bcg.ireobfr:
-        ybt(f)
-
-qrs eha(neti):
-    # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
-    # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
-    # rkrpvat sbe fbzr ernfba.  Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
-    # svefg.
-    sq = bf.qhc(2)  # pbcl fgqree
-    gel:
-        c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
-        erghea c.jnvg()
-    svanyyl:
-        bf.pybfr(sq)
-
-qrs cne2_frghc():
-    tybony cne2_bx
-    ei = 1
-    gel:
-        c = fhocebprff.Cbcra(['cne2', '--uryc'],
-                             fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
-        ei = c.jnvg()
-    rkprcg BFReebe:
-        ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
-    ryfr:
-        cne2_bx = 1
-
-qrs cnei(yiy):
-    vs bcg.ireobfr >= yiy:
-        vs vfggl:
-            erghea []
-        ryfr:
-            erghea ['-d']
-    ryfr:
-        erghea ['-dd']
-
-qrs cne2_trarengr(onfr):
-    erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
-               + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
-
-qrs cne2_irevsl(onfr):
-    erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
-
-qrs cne2_ercnve(onfr):
-    erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
-
-qrs dhvpx_irevsl(onfr):
-    s = bcra(onfr + '.cnpx', 'eo')
-    s.frrx(-20, 2)
-    jnagfhz = s.ernq(20)
-    nffreg(yra(jnagfhz) == 20)
-    s.frrx(0)
-    fhz = Fun1()
-    sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
-        fhz.hcqngr(o)
-    vs fhz.qvtrfg() != jnagfhz:
-        envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
-                                                  fhz.urkqvtrfg()))
-        
-
-qrs tvg_irevsl(onfr):
-    vs bcg.dhvpx:
-        gel:
-            dhvpx_irevsl(onfr)
-        rkprcg Rkprcgvba, r:
-            qroht('reebe: %f\a' % r)
-            erghea 1
-        erghea 0
-    ryfr:
-        erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
-    
-    
-qrs qb_cnpx(onfr, ynfg):
-    pbqr = 0
-    vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
-        ierfhyg = cne2_irevsl(onfr)
-        vs ierfhyg != 0:
-            vs bcg.ercnve:
-                eerfhyg = cne2_ercnve(onfr)
-                vs eerfhyg != 0:
-                    cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
-                    pbqr = eerfhyg
-                ryfr:
-                    cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
-                    pbqr = 100
-            ryfr:
-                cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
-                pbqr = ierfhyg
-        ryfr:
-            cevag '%f bx' % ynfg
-    ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
-        terfhyg = tvg_irevsl(onfr)
-        vs terfhyg != 0:
-            cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
-            pbqr = terfhyg
-        ryfr:
-            vs cne2_bx naq bcg.trarengr:
-                cerfhyg = cne2_trarengr(onfr)
-                vs cerfhyg != 0:
-                    cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
-                    pbqr = cerfhyg
-                ryfr:
-                    cevag '%f bx' % ynfg
-            ryfr:
-                cevag '%f bx' % ynfg
-    ryfr:
-        nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
-        qroht('    fxvccrq: cne2 svyr nyernql trarengrq.\a')
-    erghea pbqr
-
-
-bcgfcrp = """
-ohc sfpx [bcgvbaf...] [svyranzrf...]
---
-e,ercnve    nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
-t,trarengr  trarengr nhgb-ercnve vasbezngvba hfvat cne2
-i,ireobfr   vapernfr ireobfvgl (pna or hfrq zber guna bapr)
-dhvpx       whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
-w,wbof=     eha 'a' wbof va cnenyyry
-cne2-bx     vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
-qvfnoyr-cne2  vtaber cne2 rira vs vg vf ninvynoyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-cne2_frghc()
-vs bcg.cne2_bx:
-    vs cne2_bx:
-        flf.rkvg(0)  # 'gehr' va fu
-    ryfr:
-        flf.rkvg(1)
-vs bcg.qvfnoyr_cne2:
-    cne2_bx = 0
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
-    qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
-    rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
-
-pbqr = 0
-pbhag = 0
-bhgfgnaqvat = {}
-sbe anzr va rkgen:
-    vs anzr.raqfjvgu('.cnpx'):
-        onfr = anzr[:-5]
-    ryvs anzr.raqfjvgu('.vqk'):
-        onfr = anzr[:-4]
-    ryvs anzr.raqfjvgu('.cne2'):
-        onfr = anzr[:-5]
-    ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
-        onfr = anzr
-    ryfr:
-        envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
-    (qve,ynfg) = bf.cngu.fcyvg(onfr)
-    cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
-    vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
-        cne2_rkvfgf = 0
-    flf.fgqbhg.syhfu()
-    qroht('sfpx: purpxvat %f (%f)\a' 
-          % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
-    vs abg bcg.ireobfr:
-        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-    
-    vs abg bcg.wbof:
-        ap = qb_cnpx(onfr, ynfg)
-        pbqr = pbqr be ap
-        pbhag += 1
-    ryfr:
-        juvyr yra(bhgfgnaqvat) >= bcg.wbof:
-            (cvq,ap) = bf.jnvg()
-            ap >>= 8
-            vs cvq va bhgfgnaqvat:
-                qry bhgfgnaqvat[cvq]
-                pbqr = pbqr be ap
-                pbhag += 1
-        cvq = bf.sbex()
-        vs cvq:  # cnerag
-            bhgfgnaqvat[cvq] = 1
-        ryfr: # puvyq
-            gel:
-                flf.rkvg(qb_cnpx(onfr, ynfg))
-            rkprcg Rkprcgvba, r:
-                ybt('rkprcgvba: %e\a' % r)
-                flf.rkvg(99)
-                
-juvyr yra(bhgfgnaqvat):
-    (cvq,ap) = bf.jnvg()
-    ap >>= 8
-    vs cvq va bhgfgnaqvat:
-        qry bhgfgnaqvat[cvq]
-        pbqr = pbqr be ap
-        pbhag += 1
-    vs abg bcg.ireobfr:
-        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
-vs abg bcg.ireobfr naq vfggl:
-    ybt('sfpx qbar.           \a')
-flf.rkvg(pbqr)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
-sebz ohc vzcbeg bcgvbaf, ffu
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc eonpxhc <ubfganzr> vaqrk ...
-ohc eonpxhc <ubfganzr> fnir ...
-ohc eonpxhc <ubfganzr> fcyvg ...
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs yra(rkgen) < 2:
-    b.sngny('nethzragf rkcrpgrq')
-
-pynff FvtRkprcgvba(Rkprcgvba):
-    qrs __vavg__(frys, fvtahz):
-        frys.fvtahz = fvtahz
-        Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
-qrs unaqyre(fvtahz, senzr):
-    envfr FvtRkprcgvba(fvtahz)
-
-fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
-fvtany.fvtany(fvtany.FVTVAG, unaqyre)
-
-fc = Abar
-c = Abar
-erg = 99
-
-gel:
-    ubfganzr = rkgen[0]
-    neti = rkgen[1:]
-    c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
-
-    netif = '\0'.wbva(['ohc'] + neti)
-    c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
-    c.fgqva.syhfu()
-
-    znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
-    fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
-
-    c.fgqva.pybfr()
-    c.fgqbhg.pybfr()
-
-svanyyl:
-    juvyr 1:
-        # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
-        # va pnfr bhe puvyq qbrfa'g qvr.
-        gel:
-            erg = c.jnvg()
-            fc.jnvg()
-            oernx
-        rkprcg FvtRkprcgvba, r:
-            ybt('\aohc eonpxhc: %f\a' % r)
-            bf.xvyy(c.cvq, r.fvtahz)
-            erg = 84
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc arjyvare
-"""
-b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-e = er.pbzcvyr(e'([\e\a])')
-ynfgyra = 0
-nyy = ''
-juvyr 1:
-    y = e.fcyvg(nyy, 1)
-    vs yra(y) <= 1:
-        gel:
-            o = bf.ernq(flf.fgqva.svyrab(), 4096)
-        rkprcg XrlobneqVagreehcg:
-            oernx
-        vs abg o:
-            oernx
-        nyy += o
-    ryfr:
-        nffreg(yra(y) == 3)
-        (yvar, fcyvgpune, nyy) = y
-        #fcyvgpune = '\a'
-        flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
-        vs fcyvgpune == '\e':
-            ynfgyra = yra(yvar)
-        ryfr:
-            ynfgyra = 0
-        flf.fgqbhg.syhfu()
-
-vs ynfgyra be nyy:
-    flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
-#!/hfe/ova/rai clguba
-vzcbeg flf
-sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc znetva
-"""
-b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-#tvg.vtaber_zvqk = 1
-
-zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-ynfg = '\0'*20
-ybatzngpu = 0
-sbe v va zv:
-    vs v == ynfg:
-        pbagvahr
-    #nffreg(fge(v) >= ynfg)
-    cz = _unfufcyvg.ovgzngpu(ynfg, v)
-    ybatzngpu = znk(ybatzngpu, cz)
-    ynfg = v
-cevag ybatzngpu
diff --git a/t/testfile2 b/t/testfile2
deleted file mode 100644 (file)
index f57a3e5..0000000
+++ /dev/null
@@ -1,5580 +0,0 @@
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg bcgvbaf, qerphefr
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc qerphefr <cngu>
---
-k,kqri,bar-svyr-flfgrz   qba'g pebff svyrflfgrz obhaqnevrf
-d,dhvrg  qba'g npghnyyl cevag svyranzrf
-cebsvyr  eha haqre gur clguba cebsvyre
-"""
-b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar svyranzr rkcrpgrq")
-
-vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
-vs bcg.cebsvyr:
-    vzcbeg pCebsvyr
-    qrs qb_vg():
-        sbe v va vg:
-            cnff
-    pCebsvyr.eha('qb_vg()')
-ryfr:
-    vs bcg.dhvrg:
-        sbe v va vg:
-            cnff
-    ryfr:
-        sbe (anzr,fg) va vg:
-            cevag anzr
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-o,oybof    bhgchg n frevrf bs oybo vqf
-g,gerr     bhgchg n gerr vq
-p,pbzzvg   bhgchg n pbzzvg vq
-a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
-A,abbc     qba'g npghnyyl fnir gur qngn naljurer
-d,dhvrg    qba'g cevag cebterff zrffntrf
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-pbcl       whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
-orapu      cevag orapuznex gvzvatf gb fgqree
-znk-cnpx-fvmr=  znkvzhz olgrf va n fvatyr cnpx
-znk-cnpx-bowrpgf=  znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
-snabhg=  znkvzhz ahzore bs oybof va n fvatyr gerr
-"""
-b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
-        bcg.abbc be bcg.pbcl):
-    b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
-vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be 
-                               bcg.pbzzvg be bcg.anzr):
-    b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
-
-vs bcg.ireobfr >= 2:
-    tvg.ireobfr = bcg.ireobfr - 1
-    bcg.orapu = 1
-vs bcg.znk_cnpx_fvmr:
-    unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
-vs bcg.znk_cnpx_bowrpgf:
-    unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
-vs bcg.snabhg:
-    unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
-vs bcg.oybof:
-    unfufcyvg.snabhg = 0
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
-    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-fgneg_gvzr = gvzr.gvzr()
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.abbc be bcg.pbcl:
-    pyv = j = byqers = Abar
-ryvs bcg.erzbgr be vf_erirefr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
-    j = pyv.arj_cnpxjevgre()
-ryfr:
-    pyv = Abar
-    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
-    j = tvg.CnpxJevgre()
-
-svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
-vs j:
-    funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
-    gerr = j.arj_gerr(funyvfg)
-ryfr:
-    ynfg = 0
-    sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
-        unfufcyvg.gbgny_fcyvg += yra(oybo)
-        vs bcg.pbcl:
-            flf.fgqbhg.jevgr(fge(oybo))
-        zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
-        vs abg bcg.dhvrg naq ynfg != zrtf:
-            cebterff('%q Zolgrf ernq\e' % zrtf)
-            ynfg = zrtf
-    cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
-
-vs bcg.ireobfr:
-    ybt('\a')
-vs bcg.oybof:
-    sbe (zbqr,anzr,ova) va funyvfg:
-        cevag ova.rapbqr('urk')
-vs bcg.gerr:
-    cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
-    zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
-    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
-    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
-    vs bcg.pbzzvg:
-        cevag pbzzvg.rapbqr('urk')
-
-vs j:
-    j.pwba vf punatvat fbzr enaqbz olgrf urer naq gurers
-        
-vs bcg.anzr:
-    vs pyv:
-        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
-    ryfr:
-        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
-    pyv.pybfr()
-
-frpf = gvzr.gvzr() - fgneg_gvzr
-fvmr = unfufcyvg.gbgny_fcyvg
-vs bcg.orapu:
-    ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
-        % (fvmr/1024., frpf, fvmr/1024./frpf))
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, fgehpg, zznc
-sebz ohc vzcbeg tvg, bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs f_sebz_olgrf(olgrf):
-    pyvfg = [pue(o) sbe o va olgrf]
-    erghea ''.wbva(pyvfg)
-
-
-qrs ercbeg(pbhag):
-    svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
-    q = {}
-    sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
-        y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
-        q[y[0]] = y[1]
-    vs pbhag >= 0:
-        r1 = pbhag
-        svryqf = [q[x] sbe x va svryqf]
-    ryfr:
-        r1 = ''
-    cevag ('%9f  ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
-    flf.fgqbhg.syhfu()
-
-
-bcgfcrp = """
-ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
---
-a,ahzore=  ahzore bs bowrpgf cre plpyr
-p,plpyrf=  ahzore bs plpyrf gb eha
-vtaber-zvqk  vtaber .zvqk svyrf, hfr bayl .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-tvg.vtaber_zvqk = bcg.vtaber_zvqk
-
-tvg.purpx_ercb_be_qvr()
-z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-
-plpyrf = bcg.plpyrf be 100
-ahzore = bcg.ahzore be 10000
-
-ercbeg(-1)
-s = bcra('/qri/henaqbz')
-n = zznc.zznc(-1, 20)
-ercbeg(0)
-sbe p va kenatr(plpyrf):
-    sbe a va kenatr(ahzore):
-        o = s.ernq(3)
-        vs 0:
-            olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
-            olgrf[2] &= 0ks0
-            ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
-        ryfr:
-            n[0:2] = o[0:2]
-            n[2] = pue(beq(o[2]) & 0ks0)
-            ova = fge(n[0:20])
-        #cevag ova.rapbqr('urk')
-        z.rkvfgf(ova)
-    ercbeg((p+1)*ahzore)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-qrs cevag_abqr(grkg, a):
-    cersvk = ''
-    vs bcg.unfu:
-        cersvk += "%f " % a.unfu.rapbqr('urk')
-    vs fgng.F_VFQVE(a.zbqr):
-        cevag '%f%f/' % (cersvk, grkg)
-    ryvs fgng.F_VFYAX(a.zbqr):
-        cevag '%f%f@' % (cersvk, grkg)
-    ryfr:
-        cevag '%f%f' % (cersvk, grkg)
-
-
-bcgfcrp = """
-ohc yf <qvef...>
---
-f,unfu   fubj unfu sbe rnpu svyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-
-vs abg rkgen:
-    rkgen = ['/']
-
-erg = 0
-sbe q va rkgen:
-    gel:
-        a = gbc.yerfbyir(q)
-        vs fgng.F_VFQVE(a.zbqr):
-            sbe fho va a:
-                cevag_abqr(fho.anzr, fho)
-        ryfr:
-            cevag_abqr(q, a)
-    rkprcg isf.AbqrReebe, r:
-        ybt('reebe: %f\a' % r)
-        erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
-sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
-sebz ohc.urycref vzcbeg *
-
-qrs abqr_anzr(grkg, a):
-    vs fgng.F_VFQVE(a.zbqr):
-        erghea '%f/' % grkg
-    ryvs fgng.F_VFYAX(a.zbqr):
-        erghea '%f@' % grkg
-    ryfr:
-        erghea '%f' % grkg
-
-
-qrs qb_yf(cngu, a):
-    y = []
-    vs fgng.F_VFQVE(a.zbqr):
-        sbe fho va a:
-            y.nccraq(abqr_anzr(fho.anzr, fho))
-    ryfr:
-        y.nccraq(abqr_anzr(cngu, a))
-    cevag pbyhzangr(y, '')
-    
-
-qrs jevgr_gb_svyr(vas, bhgs):
-    sbe oybo va puhaxlernqre(vas):
-        bhgs.jevgr(oybo)
-    
-
-qrs vachgvgre():
-    vs bf.vfnggl(flf.fgqva.svyrab()):
-        juvyr 1:
-            gel:
-                lvryq enj_vachg('ohc> ')
-            rkprcg RBSReebe:
-                oernx
-    ryfr:
-        sbe yvar va flf.fgqva:
-            lvryq yvar
-
-
-qrs _pbzcyrgre_trg_fhof(yvar):
-    (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
-    (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
-    #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
-    a = cjq.erfbyir(qve)
-    fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
-                       a.fhof()))
-    erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
-
-
-_ynfg_yvar = Abar
-_ynfg_erf = Abar
-qrs pbzcyrgre(grkg, fgngr):
-    tybony _ynfg_yvar
-    tybony _ynfg_erf
-    gel:
-        yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
-        vs _ynfg_yvar != yvar:
-            _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
-            _ynfg_yvar = yvar
-        (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
-        vs fgngr < yra(fhof):
-            fa = fhof[fgngr]
-            fa1 = fa.erfbyir('')  # qrers flzyvaxf
-            shyyanzr = bf.cngu.wbva(qve, fa.anzr)
-            vs fgng.F_VFQVE(fa1.zbqr):
-                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
-                                          grezvangr=Snyfr)
-            ryfr:
-                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
-                                          grezvangr=Gehr) + ' '
-            erghea grkg + erg
-    rkprcg Rkprcgvba, r:
-        ybt('\areebe va pbzcyrgvba: %f\a' % r)
-
-            
-bcgfcrp = """
-ohc sgc
-"""
-b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-gbc = isf.ErsYvfg(Abar)
-cjq = gbc
-
-vs rkgen:
-    yvarf = rkgen
-ryfr:
-    ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
-    ernqyvar.frg_pbzcyrgre(pbzcyrgre)
-    ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
-    yvarf = vachgvgre()
-
-sbe yvar va yvarf:
-    vs abg yvar.fgevc():
-        pbagvahr
-    jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
-    pzq = jbeqf[0].ybjre()
-    #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
-    gel:
-        vs pzq == 'yf':
-            sbe cnez va (jbeqf[1:] be ['.']):
-                qb_yf(cnez, cjq.erfbyir(cnez))
-        ryvs pzq == 'pq':
-            sbe cnez va jbeqf[1:]:
-                cjq = cjq.erfbyir(cnez)
-        ryvs pzq == 'cjq':
-            cevag cjq.shyyanzr()
-        ryvs pzq == 'png':
-            sbe cnez va jbeqf[1:]:
-                jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
-        ryvs pzq == 'trg':
-            vs yra(jbeqf) abg va [2,3]:
-                envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
-            eanzr = jbeqf[1]
-            (qve,onfr) = bf.cngu.fcyvg(eanzr)
-            yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
-            vas = cjq.erfbyir(eanzr).bcra()
-            ybt('Fnivat %e\a' % yanzr)
-            jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
-        ryvs pzq == 'ztrg':
-            sbe cnez va jbeqf[1:]:
-                (qve,onfr) = bf.cngu.fcyvg(cnez)
-                sbe a va cjq.erfbyir(qve).fhof():
-                    vs sazngpu.sazngpu(a.anzr, onfr):
-                        gel:
-                            ybt('Fnivat %e\a' % a.anzr)
-                            vas = a.bcra()
-                            bhgs = bcra(a.anzr, 'jo')
-                            jevgr_gb_svyr(vas, bhgs)
-                            bhgs.pybfr()
-                        rkprcg Rkprcgvba, r:
-                            ybt('  reebe: %f\a' % r)
-        ryvs pzq == 'uryc' be pzq == '?':
-            ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
-        ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
-            oernx
-        ryfr:
-            envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
-    rkprcg Rkprcgvba, r:
-        ybt('reebe: %f\a' % r)
-        #envfr
-#!/hfe/ova/rai clguba
-vzcbeg flf, zznc
-sebz ohc vzcbeg bcgvbaf, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc enaqbz [-F frrq] <ahzolgrf>
---
-F,frrq=   bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
-s,sbepr   cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
-"""
-b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-gbgny = cnefr_ahz(rkgen[0])
-
-vs bcg.sbepr be (abg bf.vfnggl(1) naq
-                 abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
-    _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
-ryfr:
-    ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc uryc <pbzznaq>
-"""
-b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) == 0:
-    # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
-    bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
-ryvs yra(rkgen) == 1:
-    qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
-    rkr = flf.neti[0]
-    (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
-    znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
-    t = tybo.tybo(znacngu)
-    vs t:
-        bf.rkrpic('zna', ['zna', '-y', t[0]])
-    ryfr:
-        bf.rkrpic('zna', ['zna', qbpanzr])
-ryfr:
-    b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-
-pynff Fgng(shfr.Fgng):
-    qrs __vavg__(frys):
-        frys.fg_zbqr = 0
-        frys.fg_vab = 0
-        frys.fg_qri = 0
-        frys.fg_ayvax = 0
-        frys.fg_hvq = 0
-        frys.fg_tvq = 0
-        frys.fg_fvmr = 0
-        frys.fg_ngvzr = 0
-        frys.fg_zgvzr = 0
-        frys.fg_pgvzr = 0
-        frys.fg_oybpxf = 0
-        frys.fg_oyxfvmr = 0
-        frys.fg_eqri = 0
-
-
-pnpur = {}
-qrs pnpur_trg(gbc, cngu):
-    cnegf = cngu.fcyvg('/')
-    pnpur[('',)] = gbc
-    p = Abar
-    znk = yra(cnegf)
-    #ybt('pnpur: %e\a' % pnpur.xrlf())
-    sbe v va enatr(znk):
-        cer = cnegf[:znk-v]
-        #ybt('pnpur gelvat: %e\a' % cer)
-        p = pnpur.trg(ghcyr(cer))
-        vs p:
-            erfg = cnegf[znk-v:]
-            sbe e va erfg:
-                #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
-                p = p.yerfbyir(e)
-                xrl = ghcyr(cer + [e])
-                #ybt('fnivat: %e\a' % (xrl,))
-                pnpur[xrl] = p
-            oernx
-    nffreg(p)
-    erghea p
-        
-    
-
-pynff OhcSf(shfr.Shfr):
-    qrs __vavg__(frys, gbc):
-        shfr.Shfr.__vavg__(frys)
-        frys.gbc = gbc
-    
-    qrs trgngge(frys, cngu):
-        ybt('--trgngge(%e)\a' % cngu)
-        gel:
-            abqr = pnpur_trg(frys.gbc, cngu)
-            fg = Fgng()
-            fg.fg_zbqr = abqr.zbqr
-            fg.fg_ayvax = abqr.ayvaxf()
-            fg.fg_fvmr = abqr.fvmr()
-            fg.fg_zgvzr = abqr.zgvzr
-            fg.fg_pgvzr = abqr.pgvzr
-            fg.fg_ngvzr = abqr.ngvzr
-            erghea fg
-        rkprcg isf.AbFhpuSvyr:
-            erghea -reeab.RABRAG
-
-    qrs ernqqve(frys, cngu, bssfrg):
-        ybt('--ernqqve(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        lvryq shfr.Qveragel('.')
-        lvryq shfr.Qveragel('..')
-        sbe fho va abqr.fhof():
-            lvryq shfr.Qveragel(fho.anzr)
-
-    qrs ernqyvax(frys, cngu):
-        ybt('--ernqyvax(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        erghea abqr.ernqyvax()
-
-    qrs bcra(frys, cngu, syntf):
-        ybt('--bcra(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
-        vs (syntf & nppzbqr) != bf.B_EQBAYL:
-            erghea -reeab.RNPPRF
-        abqr.bcra()
-
-    qrs eryrnfr(frys, cngu, syntf):
-        ybt('--eryrnfr(%e)\a' % cngu)
-
-    qrs ernq(frys, cngu, fvmr, bssfrg):
-        ybt('--ernq(%e)\a' % cngu)
-        a = pnpur_trg(frys.gbc, cngu)
-        b = a.bcra()
-        b.frrx(bssfrg)
-        erghea b.ernq(fvmr)
-
-
-vs abg unfngge(shfr, '__irefvba__'):
-    envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
-shfr.shfr_clguba_ncv = (0, 2)
-
-
-bcgfcrp = """
-ohc shfr [-q] [-s] <zbhagcbvag>
---
-q,qroht   vapernfr qroht yriry
-s,sbertebhaq  eha va sbertebhaq
-"""
-b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-s = OhcSf(gbc)
-s.shfr_netf.zbhagcbvag = rkgen[0]
-vs bcg.qroht:
-    s.shfr_netf.nqq('qroht')
-vs bcg.sbertebhaq:
-    s.shfr_netf.frgzbq('sbertebhaq')
-cevag s.zhygvguernqrq
-s.zhygvguernqrq = Snyfr
-
-s.znva()
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-
-vs bcg.erzbgr:
-    tvg.vavg_ercb()  # ybpny ercb
-    tvg.purpx_ercb_be_qvr()
-    pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
-    pyv.pybfr()
-ryfr:
-    tvg.vavg_ercb()
-#!/hfe/ova/rai clguba
-vzcbeg flf, zngu, fgehpg, tybo
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-CNTR_FVMR=4096
-FUN_CRE_CNTR=CNTR_FVMR/200.
-
-
-qrs zretr(vqkyvfg, ovgf, gnoyr):
-    pbhag = 0
-    sbe r va tvg.vqkzretr(vqkyvfg):
-        pbhag += 1
-        cersvk = tvg.rkgenpg_ovgf(r, ovgf)
-        gnoyr[cersvk] = pbhag
-        lvryq r
-
-
-qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
-    vs abg bhgsvyranzr:
-        nffreg(bhgqve)
-        fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
-        bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
-    
-    vac = []
-    gbgny = 0
-    sbe anzr va vasvyranzrf:
-        vk = tvg.CnpxVqk(anzr)
-        vac.nccraq(vk)
-        gbgny += yra(vk)
-
-    ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
-    vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
-       be (bcg.sbepr naq abg gbgny):
-        ybt('zvqk: abguvat gb qb.\a')
-        erghea
-
-    cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
-    ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
-    ragevrf = 2**ovgf
-    ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
-    
-    gnoyr = [0]*ragevrf
-
-    gel:
-        bf.hayvax(bhgsvyranzr)
-    rkprcg BFReebe:
-        cnff
-    s = bcra(bhgsvyranzr + '.gzc', 'j+')
-    s.jevgr('ZVQK\0\0\0\2')
-    s.jevgr(fgehpg.cnpx('!V', ovgf))
-    nffreg(s.gryy() == 12)
-    s.jevgr('\0'*4*ragevrf)
-    
-    sbe r va zretr(vac, ovgf, gnoyr):
-        s.jevgr(r)
-        
-    s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
-
-    s.frrx(12)
-    s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
-    s.pybfr()
-    bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
-
-    # guvf vf whfg sbe grfgvat
-    vs 0:
-        c = tvg.CnpxZvqk(bhgsvyranzr)
-        nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
-        cevag c.vqkanzrf
-        nffreg(yra(c) == gbgny)
-        cv = vgre(c)
-        sbe v va zretr(vac, gbgny, ovgf, gnoyr):
-            nffreg(v == cv.arkg())
-            nffreg(c.rkvfgf(v))
-
-    cevag bhgsvyranzr
-
-bcgfcrp = """
-ohc zvqk [bcgvbaf...] <vqkanzrf...>
---
-b,bhgchg=  bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
-n,nhgb     nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
-s,sbepr    nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen naq (bcg.nhgb be bcg.sbepr):
-    b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
-
-tvg.purpx_ercb_be_qvr()
-
-vs rkgen:
-    qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
-ryvs bcg.nhgb be bcg.sbepr:
-    cnguf = [tvg.ercb('bowrpgf/cnpx')]
-    cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
-    sbe cngu va cnguf:
-        ybt('zvqk: fpnaavat %f\a' % cngu)
-        vs bcg.sbepr:
-            qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
-        ryvs bcg.nhgb:
-            z = tvg.CnpxVqkYvfg(cngu)
-            arrqrq = {}
-            sbe cnpx va z.cnpxf:  # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
-                vs cnpx.anzr.raqfjvgu('.vqk'):
-                    arrqrq[cnpx.anzr] = 1
-            qry z
-            qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
-        ybt('\a')
-ryfr:
-    b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, enaqbz
-sebz ohc vzcbeg bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs enaqoybpx(a):
-    y = []
-    sbe v va kenatr(a):
-        y.nccraq(pue(enaqbz.enaqenatr(0,256)))
-    erghea ''.wbva(y)
-
-
-bcgfcrp = """
-ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
---
-   JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
-a,ahz=   ahzore bs oybpxf gb qnzntr
-f,fvmr=  znkvzhz fvmr bs rnpu qnzntrq oybpx
-creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
-rdhny    fcernq qnzntr rirayl guebhtubhg gur svyr
-F,frrq=  enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
-"""
-b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg rkgen:
-    b.sngny('svyranzrf rkcrpgrq')
-
-vs bcg.frrq != Abar:
-    enaqbz.frrq(bcg.frrq)
-
-sbe anzr va rkgen:
-    ybt('Qnzntvat "%f"...\a' % anzr)
-    s = bcra(anzr, 'e+o')
-    fg = bf.sfgng(s.svyrab())
-    fvmr = fg.fg_fvmr
-    vs bcg.creprag be bcg.fvmr:
-        zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
-        zf2 = bcg.fvmr be fvmr
-        znkfvmr = zva(zf1, zf2)
-    ryfr:
-        znkfvmr = 1
-    puhaxf = bcg.ahz be 10
-    puhaxfvmr = fvmr/puhaxf
-    sbe e va enatr(puhaxf):
-        fm = enaqbz.enaqenatr(1, znkfvmr+1)
-        vs fm > fvmr:
-            fm = fvmr
-        vs bcg.rdhny:
-            bsf = e*puhaxfvmr
-        ryfr:
-            bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
-        ybt('  %6q olgrf ng %q\a' % (fm, bsf))
-        s.frrx(bsf)
-        s.jevgr(enaqoybpx(fm))
-    s.pybfr()
-#!/hfe/ova/rai clguba
-vzcbeg flf, fgehpg, zznc
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-fhfcraqrq_j = Abar
-
-
-qrs vavg_qve(pbaa, net):
-    tvg.vavg_ercb(net)
-    ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
-    pbaa.bx()
-
-
-qrs frg_qve(pbaa, net):
-    tvg.purpx_ercb_be_qvr(net)
-    ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
-    pbaa.bx()
-
-    
-qrs yvfg_vaqrkrf(pbaa, whax):
-    tvg.purpx_ercb_be_qvr()
-    sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
-        vs s.raqfjvgu('.vqk'):
-            pbaa.jevgr('%f\a' % s)
-    pbaa.bx()
-
-
-qrs fraq_vaqrk(pbaa, anzr):
-    tvg.purpx_ercb_be_qvr()
-    nffreg(anzr.svaq('/') < 0)
-    nffreg(anzr.raqfjvgu('.vqk'))
-    vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
-    pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
-    pbaa.jevgr(vqk.znc)
-    pbaa.bx()
-
-
-qrs erprvir_bowrpgf(pbaa, whax):
-    tybony fhfcraqrq_j
-    tvg.purpx_ercb_be_qvr()
-    fhttrfgrq = {}
-    vs fhfcraqrq_j:
-        j = fhfcraqrq_j
-        fhfcraqrq_j = Abar
-    ryfr:
-        j = tvg.CnpxJevgre()
-    juvyr 1:
-        af = pbaa.ernq(4)
-        vs abg af:
-            j.nobeg()
-            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
-        a = fgehpg.hacnpx('!V', af)[0]
-        #ybt('rkcrpgvat %q olgrf\a' % a)
-        vs abg a:
-            ybt('ohc freire: erprvirq %q bowrpg%f.\a' 
-                % (j.pbhag, j.pbhag!=1 naq "f" be ''))
-            shyycngu = j.pybfr()
-            vs shyycngu:
-                (qve, anzr) = bf.cngu.fcyvg(shyycngu)
-                pbaa.jevgr('%f.vqk\a' % anzr)
-            pbaa.bx()
-            erghea
-        ryvs a == 0kssssssss:
-            ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
-            fhfcraqrq_j = j
-            pbaa.bx()
-            erghea
-            
-        ohs = pbaa.ernq(a)  # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
-        #ybt('ernq %q olgrf\a' % a)
-        vs yra(ohs) < a:
-            j.nobeg()
-            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
-                            % (a, yra(ohs)))
-        (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
-        fun = tvg.pnyp_unfu(glcr, pbagrag)
-        byqcnpx = j.rkvfgf(fun)
-        # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
-        # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
-        # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
-        # ba gur freire fvqr.
-        vs abg fhttrfgrq naq \
-          byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
-            # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
-            # ng guvf ynlre.  Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
-            # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
-            # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
-            # znxr gur svyrf ovttre.  Guvf zrgubq vf pregnvayl abg irel
-            # rssvpvrag.
-            j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
-            byqcnpx = j.bowpnpur.rkvfgf(fun)
-            ybt('arj fhttrfgvba: %e\a' % byqcnpx)
-            nffreg(byqcnpx)
-            nffreg(byqcnpx != Gehr)
-            nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
-            j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
-        vs abg fhttrfgrq naq byqcnpx:
-            nffreg(byqcnpx.raqfjvgu('.vqk'))
-            (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
-            vs abg (anzr va fhttrfgrq):
-                ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
-                pbaa.jevgr('vaqrk %f\a' % anzr)
-                fhttrfgrq[anzr] = 1
-        ryfr:
-            j._enj_jevgr([ohs])
-    # ABGERNPURQ
-
-
-qrs ernq_ers(pbaa, ersanzr):
-    tvg.purpx_ercb_be_qvr()
-    e = tvg.ernq_ers(ersanzr)
-    pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
-    pbaa.bx()
-
-
-qrs hcqngr_ers(pbaa, ersanzr):
-    tvg.purpx_ercb_be_qvr()
-    arjiny = pbaa.ernqyvar().fgevc()
-    byqiny = pbaa.ernqyvar().fgevc()
-    tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
-    pbaa.bx()
-
-
-qrs png(pbaa, vq):
-    tvg.purpx_ercb_be_qvr()
-    gel:
-        sbe oybo va tvg.png(vq):
-            pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
-            pbaa.jevgr(oybo)
-    rkprcg XrlReebe, r:
-        ybt('freire: reebe: %f\a' % r)
-        pbaa.jevgr('\0\0\0\0')
-        pbaa.reebe(r)
-    ryfr:
-        pbaa.jevgr('\0\0\0\0')
-        pbaa.bx()
-
-
-bcgfcrp = """
-ohc freire
-"""
-b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-ybt('ohc freire: ernqvat sebz fgqva.\a')
-
-pbzznaqf = {
-    'vavg-qve': vavg_qve,
-    'frg-qve': frg_qve,
-    'yvfg-vaqrkrf': yvfg_vaqrkrf,
-    'fraq-vaqrk': fraq_vaqrk,
-    'erprvir-bowrpgf': erprvir_bowrpgf,
-    'ernq-ers': ernq_ers,
-    'hcqngr-ers': hcqngr_ers,
-    'png': png,
-}
-
-# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
-# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
-pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
-ye = yvarernqre(pbaa)
-sbe _yvar va ye:
-    yvar = _yvar.fgevc()
-    vs abg yvar:
-        pbagvahr
-    ybt('ohc freire: pbzznaq: %e\a' % yvar)
-    jbeqf = yvar.fcyvg(' ', 1)
-    pzq = jbeqf[0]
-    erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
-    vs pzq == 'dhvg':
-        oernx
-    ryfr:
-        pzq = pbzznaqf.trg(pzq)
-        vs pzq:
-            pzq(pbaa, erfg)
-        ryfr:
-            envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
-
-ybt('ohc freire: qbar\a')
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
-    rkgen = yvarernqre(flf.fgqva)
-
-erg = 0
-
-vs bcg.erzbgr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    png = pyv.png
-ryfr:
-    pc = tvg.PngCvcr()
-    png = pc.wbva
-
-sbe vq va rkgen:
-    gel:
-        sbe oybo va png(vq):
-            flf.fgqbhg.jevgr(oybo)
-    rkprcg XrlReebe, r:
-        flf.fgqbhg.syhfu()
-        ybt('reebe: %f\a' % r)
-        erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, reeab, fgng, gvzr, zngu
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc fnir [-gp] [-a anzr] <svyranzrf...>
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-g,gerr     bhgchg n gerr vq
-p,pbzzvg   bhgchg n pbzzvg vq
-a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-d,dhvrg    qba'g fubj cebterff zrgre
-fznyyre=   bayl onpx hc svyrf fznyyre guna a olgrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
-    b.sngny("hfr bar be zber bs -g, -p, -a")
-vs abg rkgen:
-    b.sngny("ab svyranzrf tvira")
-
-bcg.cebterff = (vfggl naq abg bcg.dhvrg)
-bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
-    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.erzbgr be vf_erirefr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
-    j = pyv.arj_cnpxjevgre()
-ryfr:
-    pyv = Abar
-    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
-    j = tvg.CnpxJevgre()
-
-unaqyr_pgey_p()
-
-
-qrs rngfynfu(qve):
-    vs qve.raqfjvgu('/'):
-        erghea qve[:-1]
-    ryfr:
-        erghea qve
-
-
-cnegf = ['']
-funyvfgf = [[]]
-
-qrs _chfu(cneg):
-    nffreg(cneg)
-    cnegf.nccraq(cneg)
-    funyvfgf.nccraq([])
-
-qrs _cbc(sbepr_gerr):
-    nffreg(yra(cnegf) >= 1)
-    cneg = cnegf.cbc()
-    funyvfg = funyvfgf.cbc()
-    gerr = sbepr_gerr be j.arj_gerr(funyvfg)
-    vs funyvfgf:
-        funyvfgf[-1].nccraq(('40000', cneg, gerr))
-    ryfr:  # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
-        funyvfgf.nccraq(funyvfg)
-    erghea gerr
-
-ynfgerznva = Abar
-qrs cebterff_ercbeg(a):
-    tybony pbhag, fhopbhag, ynfgerznva
-    fhopbhag += a
-    pp = pbhag + fhopbhag
-    cpg = gbgny naq (pp*100.0/gbgny) be 0
-    abj = gvzr.gvzr()
-    ryncfrq = abj - gfgneg
-    xcf = ryncfrq naq vag(pp/1024./ryncfrq)
-    xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
-    xcf = vag(xcf/xcf_senp)*xcf_senp
-    vs pp:
-        erznva = ryncfrq*1.0/pp * (gbgny-pp)
-    ryfr:
-        erznva = 0.0
-    vs (ynfgerznva naq (erznva > ynfgerznva)
-          naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
-        erznva = ynfgerznva
-    ryfr:
-        ynfgerznva = erznva
-    ubhef = vag(erznva/60/60)
-    zvaf = vag(erznva/60 - ubhef*60)
-    frpf = vag(erznva - ubhef*60*60 - zvaf*60)
-    vs ryncfrq < 30:
-        erznvafge = ''
-        xcffge = ''
-    ryfr:
-        xcffge = '%qx/f' % xcf
-        vs ubhef:
-            erznvafge = '%qu%qz' % (ubhef, zvaf)
-        ryvs zvaf:
-            erznvafge = '%qz%q' % (zvaf, frpf)
-        ryfr:
-            erznvafge = '%qf' % frpf
-    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
-             % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
-                erznvafge, xcffge))
-
-
-e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
-
-qrs nyernql_fnirq(rag):
-    erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
-
-qrs jnagerphefr_cer(rag):
-    erghea abg nyernql_fnirq(rag)
-
-qrs jnagerphefr_qhevat(rag):
-    erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
-
-gbgny = sgbgny = 0
-vs bcg.cebterff:
-    sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
-        vs abg (sgbgny % 10024):
-            cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
-        rkvfgf = rag.rkvfgf()
-        unfuinyvq = nyernql_fnirq(rag)
-        rag.frg_fun_zvffvat(abg unfuinyvq)
-        vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
-            vs rkvfgf naq abg unfuinyvq:
-                gbgny += rag.fvmr
-        sgbgny += 1
-    cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
-    unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
-
-gfgneg = gvzr.gvzr()
-pbhag = fhopbhag = spbhag = 0
-ynfgfxvc_anzr = Abar
-ynfgqve = ''
-sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
-    (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
-    rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
-    unfuinyvq = nyernql_fnirq(rag)
-    jnfzvffvat = rag.fun_zvffvat()
-    byqfvmr = rag.fvmr
-    vs bcg.ireobfr:
-        vs abg rkvfgf:
-            fgnghf = 'Q'
-        ryvs abg unfuinyvq:
-            vs rag.fun == vaqrk.RZCGL_FUN:
-                fgnghf = 'N'
-            ryfr:
-                fgnghf = 'Z'
-        ryfr:
-            fgnghf = ' '
-        vs bcg.ireobfr >= 2:
-            ybt('%f %-70f\a' % (fgnghf, rag.anzr))
-        ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
-            vs abg ynfgqve.fgnegfjvgu(qve):
-                ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
-            ynfgqve = qve
-
-    vs bcg.cebterff:
-        cebterff_ercbeg(0)
-    spbhag += 1
-    
-    vs abg rkvfgf:
-        pbagvahr
-    vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
-        vs rkvfgf naq abg unfuinyvq:
-            nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
-            ynfgfxvc_anzr = rag.anzr
-        pbagvahr
-
-    nffreg(qve.fgnegfjvgu('/'))
-    qvec = qve.fcyvg('/')
-    juvyr cnegf > qvec:
-        _cbc(sbepr_gerr = Abar)
-    vs qve != '/':
-        sbe cneg va qvec[yra(cnegf):]:
-            _chfu(cneg)
-
-    vs abg svyr:
-        # ab svyranzr cbegvba zrnaf guvf vf n fhoqve.  Ohg
-        # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
-        byqgerr = nyernql_fnirq(rag) # znl or Abar
-        arjgerr = _cbc(sbepr_gerr = byqgerr)
-        vs abg byqgerr:
-            vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
-                rag.vainyvqngr()
-            ryfr:
-                rag.inyvqngr(040000, arjgerr)
-            rag.ercnpx()
-        vs rkvfgf naq jnfzvffvat:
-            pbhag += byqfvmr
-        pbagvahr
-
-    # vg'f abg n qverpgbel
-    vq = Abar
-    vs unfuinyvq:
-        zbqr = '%b' % rag.tvgzbqr
-        vq = rag.fun
-        funyvfgf[-1].nccraq((zbqr, 
-                             tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
-                             vq))
-    ryfr:
-        vs fgng.F_VFERT(rag.zbqr):
-            gel:
-                s = unfufcyvg.bcra_abngvzr(rag.anzr)
-            rkprcg VBReebe, r:
-                nqq_reebe(r)
-                ynfgfxvc_anzr = rag.anzr
-            rkprcg BFReebe, r:
-                nqq_reebe(r)
-                ynfgfxvc_anzr = rag.anzr
-            ryfr:
-                (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
-        ryfr:
-            vs fgng.F_VFQVE(rag.zbqr):
-                nffreg(0)  # unaqyrq nobir
-            ryvs fgng.F_VFYAX(rag.zbqr):
-                gel:
-                    ey = bf.ernqyvax(rag.anzr)
-                rkprcg BFReebe, r:
-                    nqq_reebe(r)
-                    ynfgfxvc_anzr = rag.anzr
-                rkprcg VBReebe, r:
-                    nqq_reebe(r)
-                    ynfgfxvc_anzr = rag.anzr
-                ryfr:
-                    (zbqr, vq) = ('120000', j.arj_oybo(ey))
-            ryfr:
-                nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
-                ynfgfxvc_anzr = rag.anzr
-        vs vq:
-            rag.inyvqngr(vag(zbqr, 8), vq)
-            rag.ercnpx()
-            funyvfgf[-1].nccraq((zbqr,
-                                 tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
-                                 vq))
-    vs rkvfgf naq jnfzvffvat:
-        pbhag += byqfvmr
-        fhopbhag = 0
-
-
-vs bcg.cebterff:
-    cpg = gbgny naq pbhag*100.0/gbgny be 100
-    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar.    \a'
-             % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
-
-juvyr yra(cnegf) > 1:
-    _cbc(sbepr_gerr = Abar)
-nffreg(yra(funyvfgf) == 1)
-gerr = j.arj_gerr(funyvfgf[-1])
-vs bcg.gerr:
-    cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
-    zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
-    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
-    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
-    vs bcg.pbzzvg:
-        cevag pbzzvg.rapbqr('urk')
-
-j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
-        
-vs bcg.anzr:
-    vs pyv:
-        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
-    ryfr:
-        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
-    pyv.pybfr()
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc gvpx
-"""
-b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-g = gvzr.gvzr()
-gyrsg = 1 - (g - vag(g))
-gvzr.fyrrc(gyrsg)
-#!/hfe/ova/rai clguba
-vzcbeg bf, flf, fgng, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
-sebz ohc.urycref vzcbeg *
-
-
-qrs zretr_vaqrkrf(bhg, e1, e2):
-    sbe r va vaqrk.ZretrVgre([e1, e2]):
-        # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl?  Jura?
-        bhg.nqq_vkragel(r)
-
-
-pynff VgreUrycre:
-    qrs __vavg__(frys, y):
-        frys.v = vgre(y)
-        frys.phe = Abar
-        frys.arkg()
-
-    qrs arkg(frys):
-        gel:
-            frys.phe = frys.v.arkg()
-        rkprcg FgbcVgrengvba:
-            frys.phe = Abar
-        erghea frys.phe
-
-
-qrs purpx_vaqrk(ernqre):
-    gel:
-        ybt('purpx: purpxvat sbejneq vgrengvba...\a')
-        r = Abar
-        q = {}
-        sbe r va ernqre.sbejneq_vgre():
-            vs r.puvyqera_a:
-                vs bcg.ireobfr:
-                    ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
-                                            r.anzr))
-                nffreg(r.puvyqera_bsf)
-                nffreg(r.anzr.raqfjvgu('/'))
-                nffreg(abg q.trg(r.puvyqera_bsf))
-                q[r.puvyqera_bsf] = 1
-            vs r.syntf & vaqrk.VK_UNFUINYVQ:
-                nffreg(r.fun != vaqrk.RZCGL_FUN)
-                nffreg(r.tvgzbqr)
-        nffreg(abg r be r.anzr == '/')  # ynfg ragel vf *nyjnlf* /
-        ybt('purpx: purpxvat abezny vgrengvba...\a')
-        ynfg = Abar
-        sbe r va ernqre:
-            vs ynfg:
-                nffreg(ynfg > r.anzr)
-            ynfg = r.anzr
-    rkprcg:
-        ybt('vaqrk reebe! ng %e\a' % r)
-        envfr
-    ybt('purpx: cnffrq.\a')
-
-
-qrs hcqngr_vaqrk(gbc):
-    ev = vaqrk.Ernqre(vaqrksvyr)
-    jv = vaqrk.Jevgre(vaqrksvyr)
-    evt = VgreUrycre(ev.vgre(anzr=gbc))
-    gfgneg = vag(gvzr.gvzr())
-
-    unfutra = Abar
-    vs bcg.snxr_inyvq:
-        qrs unfutra(anzr):
-            erghea (0100644, vaqrk.SNXR_FUN)
-
-    gbgny = 0
-    sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
-        vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
-            flf.fgqbhg.jevgr('%f\a' % cngu)
-            flf.fgqbhg.syhfu()
-            cebterff('Vaqrkvat: %q\e' % gbgny)
-        ryvs abg (gbgny % 128):
-            cebterff('Vaqrkvat: %q\e' % gbgny)
-        gbgny += 1
-        juvyr evt.phe naq evt.phe.anzr > cngu:  # qryrgrq cnguf
-            vs evt.phe.rkvfgf():
-                evt.phe.frg_qryrgrq()
-                evt.phe.ercnpx()
-            evt.arkg()
-        vs evt.phe naq evt.phe.anzr == cngu:    # cnguf gung nyernql rkvfgrq
-            vs cfg:
-                evt.phe.sebz_fgng(cfg, gfgneg)
-            vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
-                vs unfutra:
-                    (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
-                    evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
-            vs bcg.snxr_vainyvq:
-                evt.phe.vainyvqngr()
-            evt.phe.ercnpx()
-            evt.arkg()
-        ryfr:  # arj cnguf
-            jv.nqq(cngu, cfg, unfutra = unfutra)
-    cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
-    
-    vs ev.rkvfgf():
-        ev.fnir()
-        jv.syhfu()
-        vs jv.pbhag:
-            je = jv.arj_ernqre()
-            vs bcg.purpx:
-                ybt('purpx: orsber zretvat: byqsvyr\a')
-                purpx_vaqrk(ev)
-                ybt('purpx: orsber zretvat: arjsvyr\a')
-                purpx_vaqrk(je)
-            zv = vaqrk.Jevgre(vaqrksvyr)
-            zretr_vaqrkrf(zv, ev, je)
-            ev.pybfr()
-            zv.pybfr()
-            je.pybfr()
-        jv.nobeg()
-    ryfr:
-        jv.pybfr()
-
-
-bcgfcrp = """
-ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
---
-c,cevag    cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
-z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
-f,fgnghf   cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
-U,unfu     cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
-y,ybat     cevag zber vasbezngvba nobhg rnpu svyr
-h,hcqngr   (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
-k,kqri,bar-svyr-flfgrz  qba'g pebff svyrflfgrz obhaqnevrf
-snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
-snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
-purpx      pnershyyl purpx vaqrk svyr vagrtevgl
-s,vaqrksvyr=  gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-"""
-b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
-    b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
-vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
-    b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
-vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
-    b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
-
-tvg.purpx_ercb_be_qvr()
-vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
-
-unaqyr_pgey_p()
-
-vs bcg.purpx:
-    ybt('purpx: fgnegvat vavgvny purpx.\a')
-    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-cnguf = vaqrk.erqhpr_cnguf(rkgen)
-
-vs bcg.hcqngr:
-    vs abg cnguf:
-        b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
-    sbe (ec,cngu) va cnguf:
-        hcqngr_vaqrk(ec)
-
-vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
-    sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
-        vs (bcg.zbqvsvrq 
-            naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
-            pbagvahr
-        yvar = ''
-        vs bcg.fgnghf:
-            vs rag.vf_qryrgrq():
-                yvar += 'Q '
-            ryvs abg rag.vf_inyvq():
-                vs rag.fun == vaqrk.RZCGL_FUN:
-                    yvar += 'N '
-                ryfr:
-                    yvar += 'Z '
-            ryfr:
-                yvar += '  '
-        vs bcg.unfu:
-            yvar += rag.fun.rapbqr('urk') + ' '
-        vs bcg.ybat:
-            yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
-        cevag yvar + (anzr be './')
-
-vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
-    ybt('purpx: fgnegvat svany purpx.\a')
-    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg
-sebz ohc vzcbeg bcgvbaf, urycref
-
-bcgfcrp = """
-ohc eonpxhc-freire
---
-    Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-# trg gur fhopbzznaq'f neti.
-# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
-# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
-# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
-ohs = flf.fgqva.ernq(4)
-fm = fgehpg.hacnpx('!V', ohs)[0]
-nffreg(fm > 0)
-nffreg(fm < 1000000)
-ohs = flf.fgqva.ernq(fm)
-nffreg(yra(ohs) == fm)
-neti = ohs.fcyvg('\0')
-
-# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
-# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
-# gb zvfhfr gurz.  Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
-# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
-#
-# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
-# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
-# fbpxrg.  Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
-# bs vg, ohg cebonoyl qvqa'g.  Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
-# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
-#
-# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
-# qrfpevcgbef.  Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
-# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
-bf.qhc2(0, 3)
-bf.qhc2(1, 4)
-bf.qhc2(2, 1)
-va nccebkvzngryl gur fnzr cynprEQBAYL)
-naq qvfgevo-0)
-hgvba nf(sq)
-
-va gur bevtvany grfg svyrfREFR'] = urycref.ubfganzr()
-bf.rkrpic(neti[0], neti)
-flf.rkvg(99)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo, fhocebprff, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-cne2_bx = 0
-ahyys = bcra('/qri/ahyy')
-
-qrs qroht(f):
-    vs bcg.ireobfr:
-        ybt(f)
-
-qrs eha(neti):
-    # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
-    # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
-    # rkrpvat sbe fbzr ernfba.  Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
-    # svefg.
-    sq = bf.qhc(2)  # pbcl fgqree
-    gel:
-        c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
-        erghea c.jnvg()
-    svanyyl:
-        bf.pybfr(sq)
-
-qrs cne2_frghc():
-    tybony cne2_bx
-    ei = 1
-    gel:
-        c = fhocebprff.Cbcra(['cne2', '--uryc'],
-                             fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
-        ei = c.jnvg()
-    rkprcg BFReebe:
-        ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
-    ryfr:
-        cne2_bx = 1
-
-qrs cnei(yiy):
-    vs bcg.ireobfr >= yiy:
-        vs vfggl:
-            erghea []
-        ryfr:
-            erghea ['-d']
-    ryfr:
-        erghea ['-dd']
-
-qrs cne2_trarengr(onfr):
-    erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
-               + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
-
-qrs cne2_irevsl(onfr):
-    erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
-
-qrs cne2_ercnve(onfr):
-    erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
-
-qrs dhvpx_irevsl(onfr):
-    s = bcra(onfr + '.cnpx', 'eo')
-    s.frrx(-20, 2)
-    jnagfhz = s.ernq(20)
-    nffreg(yra(jnagfhz) == 20)
-    s.frrx(0)
-    fhz = Fun1()
-    sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
-        fhz.hcqngr(o)
-    vs fhz.qvtrfg() != jnagfhz:
-        envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
-                                                  fhz.urkqvtrfg()))
-        
-
-qrs tvg_irevsl(onfr):
-    vs bcg.dhvpx:
-        gel:
-            dhvpx_irevsl(onfr)
-        rkprcg Rkprcgvba, r:
-            qroht('reebe: %f\a' % r)
-            erghea 1
-        erghea 0
-    ryfr:
-        erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
-    
-    
-qrs qb_cnpx(onfr, ynfg):
-    pbqr = 0
-    vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
-        ierfhyg = cne2_irevsl(onfr)
-        vs ierfhyg != 0:
-            vs bcg.ercnve:
-                eerfhyg = cne2_ercnve(onfr)
-                vs eerfhyg != 0:
-                    cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
-                    pbqr = eerfhyg
-                ryfr:
-                    cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
-                    pbqr = 100
-            ryfr:
-                cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
-                pbqr = ierfhyg
-        ryfr:
-            cevag '%f bx' % ynfg
-    ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
-        terfhyg = tvg_irevsl(onfr)
-        vs terfhyg != 0:
-            cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
-            pbqr = terfhyg
-        ryfr:
-            vs cne2_bx naq bcg.trarengr:
-                cerfhyg = cne2_trarengr(onfr)
-                vs cerfhyg != 0:
-                    cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
-                    pbqr = cerfhyg
-                ryfr:
-                    cevag '%f bx' % ynfg
-            ryfr:
-                cevag '%f bx' % ynfg
-    ryfr:
-        nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
-        qroht('    fxvccrq: cne2 svyr nyernql trarengrq.\a')
-    erghea pbqr
-
-
-bcgfcrp = """
-ohc sfpx [bcgvbaf...] [svyranzrf...]
---
-e,ercnve    nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
-t,trarengr  trarengr nhgb-ercnve vasbezngvba hfvat cne2
-i,ireobfr   vapernfr ireobfvgl (pna or hfrq zber guna bapr)
-dhvpx       whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
-w,wbof=     eha 'a' wbof va cnenyyry
-cne2-bx     vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
-qvfnoyr-cne2  vtaber cne2 rira vs vg vf ninvynoyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-cne2_frghc()
-vs bcg.cne2_bx:
-    vs cne2_bx:
-        flf.rkvg(0)  # 'gehr' va fu
-    ryfr:
-        flf.rkvg(1)
-vs bcg.qvfnoyr_cne2:
-    cne2_bx = 0
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
-    qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
-    rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
-
-pbqr = 0
-pbhag = 0
-bhgfgnaqvat = {}
-sbe anzr va rkgen:
-    vs anzr.raqfjvgu('.cnpx'):
-        onfr = anzr[:-5]
-    ryvs anzr.raqfjvgu('.vqk'):
-        onfr = anzr[:-4]
-    ryvs anzr.raqfjvgu('.cne2'):
-        onfr = anzr[:-5]
-    ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
-        onfr = anzr
-    ryfr:
-        envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
-    (qve,ynfg) = bf.cngu.fcyvg(onfr)
-    cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
-    vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
-        cne2_rkvfgf = 0
-    flf.fgqbhg.syhfu()
-    qroht('sfpx: purpxvat %f (%f)\a' 
-          % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
-    vs abg bcg.ireobfr:
-        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-    
-    vs abg bcg.wbof:
-        ap = qb_cnpx(onfr, ynfg)
-        pbqr = pbqr be ap
-        pbhag += 1
-    ryfr:
-        juvyr yra(bhgfgnaqvat) >= bcg.wbof:
-            (cvq,ap) = bf.jnvg()
-            ap >>= 8
-            vs cvq va bhgfgnaqvat:
-                qry bhgfgnaqvat[cvq]
-                pbqr = pbqr be ap
-                pbhag += 1
-        cvq = bf.sbex()
-        vs cvq:  # cnerag
-            bhgfgnaqvat[cvq] = 1
-        ryfr: # puvyq
-            gel:
-                flf.rkvg(qb_cnpx(onfr, ynfg))
-            rkprcg Rkprcgvba, r:
-                ybt('rkprcgvba: %e\a' % r)
-                flf.rkvg(99)
-                
-juvyr yra(bhgfgnaqvat):
-    (cvq,ap) = bf.jnvg()
-    ap >>= 8
-    vs cvq va bhgfgnaqvat:
-        qry bhgfgnaqvat[cvq]
-        pbqr = pbqr be ap
-        pbhag += 1
-    vs abg bcg.ireobfr:
-        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
-vs abg bcg.ireobfr naq vfggl:
-    ybt('sfpx qbar.           \a')
-flf.rkvg(pbqr)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
-sebz ohc vzcbeg bcgvbaf, ffu
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc eonpxhc <ubfganzr> vaqrk ...
-ohc eonpxhc <ubfganzr> fnir ...
-ohc eonpxhc <ubfganzr> fcyvg ...
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs yra(rkgen) < 2:
-    b.sngny('nethzragf rkcrpgrq')
-
-pynff FvtRkprcgvba(Rkprcgvba):
-    qrs __vavg__(frys, fvtahz):
-        frys.fvtahz = fvtahz
-        Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
-qrs unaqyre(fvtahz, senzr):
-    envfr FvtRkprcgvba(fvtahz)
-
-fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
-fvtany.fvtany(fvtany.FVTVAG, unaqyre)
-
-fc = Abar
-c = Abar
-erg = 99
-
-gel:
-    ubfganzr = rkgen[0]
-    neti = rkgen[1:]
-    c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
-
-    netif = '\0'.wbva(['ohc'] + neti)
-    c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
-    c.fgqva.syhfu()
-
-    znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
-    fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
-
-    c.fgqva.pybfr()
-    c.fgqbhg.pybfr()
-
-svanyyl:
-    juvyr 1:
-        # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
-        # va pnfr bhe puvyq qbrfa'g qvr.
-        gel:
-            erg = c.jnvg()
-            fc.jnvg()
-            oernx
-        rkprcg FvtRkprcgvba, r:
-            ybt('\aohc eonpxhc: %f\a' % r)
-            bf.xvyy(c.cvq, r.fvtahz)
-            erg = 84
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc arjyvare
-"""
-b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-e = er.pbzcvyr(e'([\e\a])')
-ynfgyra = 0
-nyy = ''
-juvyr 1:
-    y = e.fcyvg(nyy, 1)
-    vs yra(y) <= 1:
-        gel:
-            o = bf.ernq(flf.fgqva.svyrab(), 4096)
-        rkprcg XrlobneqVagreehcg:
-            oernx
-        vs abg o:
-            oernx
-        nyy += o
-    ryfr:
-        nffreg(yra(y) == 3)
-        (yvar, fcyvgpune, nyy) = y
-        #fcyvgpune = '\a'
-        flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
-        vs fcyvgpune == '\e':
-            ynfgyra = yra(yvar)
-        ryfr:
-            ynfgyra = 0
-        flf.fgqbhg.syhfu()
-
-vs ynfgyra be nyy:
-    flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
-#!/hfe/ova/rai clguba
-vzcbeg flf
-sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc znetva
-"""
-b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-#tvg.vtaber_zvqk = 1
-
-zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-ynfg = '\0'*20
-ybatzngpu = 0
-sbe v va zv:
-    vs v == ynfg:
-        pbagvahr
-    #nffreg(fge(v) >= ynfg)
-    cz = _unfufcyvg.ovgzngpu(ynfg, v)
-    ybatzngpu = znk(ybatzngpu, cz)
-    ynfg = v
-cevag ybatzngpu
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg bcgvbaf, qerphefr
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc qerphefr <cngu>
---
-k,kqri,bar-svyr-flfgrz   qba'g pebff svyrflfgrz obhaqnevrf
-d,dhvrg  qba'g npghnyyl cevag svyranzrf
-cebsvyr  eha haqre gur clguba cebsvyre
-"""
-b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar svyranzr rkcrpgrq")
-
-vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
-vs bcg.cebsvyr:
-    vzcbeg pCebsvyr
-    qrs qb_vg():
-        sbe v va vg:
-            cnff
-    pCebsvyr.eha('qb_vg()')
-ryfr:
-    vs bcg.dhvrg:
-        sbe v va vg:
-            cnff
-    ryfr:
-        sbe (anzr,fg) va vg:
-            cevag anzr
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-o,oybof    bhgchg n frevrf bs oybo vqf
-g,gerr     bhgchg n gerr vq
-p,pbzzvg   bhgchg n pbzzvg vq
-a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
-A,abbc     qba'g npghnyyl fnir gur qngn naljurer
-d,dhvrg    qba'g cevag cebterff zrffntrf
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-pbcl       whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
-orapu      cevag orapuznex gvzvatf gb fgqree
-znk-cnpx-fvmr=  znkvzhz olgrf va n fvatyr cnpx
-znk-cnpx-bowrpgf=  znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
-snabhg=  znkvzhz ahzore bs oybof va n fvatyr gerr
-"""
-b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
-        bcg.abbc be bcg.pbcl):
-    b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
-vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be 
-                               bcg.pbzzvg be bcg.anzr):
-    b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
-
-vs bcg.ireobfr >= 2:
-    tvg.ireobfr = bcg.ireobfr - 1
-    bcg.orapu = 1
-vs bcg.znk_cnpx_fvmr:
-    unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
-vs bcg.znk_cnpx_bowrpgf:
-    unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
-vs bcg.snabhg:
-    unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
-vs bcg.oybof:
-    unfufcyvg.snabhg = 0
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
-    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-fgneg_gvzr = gvzr.gvzr()
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.abbc be bcg.pbcl:
-    pyv = j = byqers = Abar
-ryvs bcg.erzbgr be vf_erirefr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
-    j = pyv.arj_cnpxjevgre()
-ryfr:
-    pyv = Abar
-    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
-    j = tvg.CnpxJevgre()
-
-svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
-vs j:
-    funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
-    gerr = j.arj_gerr(funyvfg)
-ryfr:
-    ynfg = 0
-    sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
-        unfufcyvg.gbgny_fcyvg += yra(oybo)
-        vs bcg.pbcl:
-            flf.fgqbhg.jevgr(fge(oybo))
-        zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
-        vs abg bcg.dhvrg naq ynfg != zrtf:
-            cebterff('%q Zolgrf ernq\e' % zrtf)
-            ynfg = zrtf
-    cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
-
-vs bcg.ireobfr:
-    ybt('\a')
-vs bcg.oybof:
-    sbe (zbqr,anzr,ova) va funyvfg:
-        cevag ova.rapbqr('urk')
-vs bcg.gerr:
-    cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
-    zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
-    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
-    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
-    vs bcg.pbzzvg:
-        cevag pbzzvg.rapbqr('urk')
-
-vs j:
-    j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
-        
-vs bcg.anzr:
-    vs pyv:
-        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
-    ryfr:
-        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
-    pyv.pybfr()
-
-frpf = gvzr.gvzr() - fgneg_gvzr
-fvmr = unfufcyvg.gbgny_fcyvg
-vs bcg.orapu:
-    ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
-        % (fvmr/1024., frpf, fvmr/1024./frpf))
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, fgehpg, zznc
-sebz ohc vzcbeg tvg, bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs f_sebz_olgrf(olgrf):
-    pyvfg = [pue(o) sbe o va olgrf]
-    erghea ''.wbva(pyvfg)
-
-
-qrs ercbeg(pbhag):
-    svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
-    q = {}
-    sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
-        y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
-        q[y[0]] = y[1]
-    vs pbhag >= 0:
-        r1 = pbhag
-        svryqf = [q[x] sbe x va svryqf]
-    ryfr:
-        r1 = ''
-    cevag ('%9f  ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
-    flf.fgqbhg.syhfu()
-
-
-bcgfcrp = """
-ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
---
-a,ahzore=  ahzore bs bowrpgf cre plpyr
-p,plpyrf=  ahzore bs plpyrf gb eha
-vtaber-zvqk  vtaber .zvqk svyrf, hfr bayl .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-tvg.vtaber_zvqk = bcg.vtaber_zvqk
-
-tvg.purpx_ercb_be_qvr()
-z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-
-plpyrf = bcg.plpyrf be 100
-ahzore = bcg.ahzore be 10000
-
-ercbeg(-1)
-s = bcra('/qri/henaqbz')
-n = zznc.zznc(-1, 20)
-ercbeg(0)
-sbe p va kenatr(plpyrf):
-    sbe a va kenatr(ahzore):
-        o = s.ernq(3)
-        vs 0:
-            olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
-            olgrf[2] &= 0ks0
-            ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
-        ryfr:
-            n[0:2] = o[0:2]
-            n[2] = pue(beq(o[2]) & 0ks0)
-            ova = fge(n[0:20])
-        #cevag ova.rapbqr('urk')
-        z.rkvfgf(ova)
-    ercbeg((p+1)*ahzore)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-qrs cevag_abqr(grkg, a):
-    cersvk = ''
-    vs bcg.unfu:
-        cersvk += "%f " % a.unfu.rapbqr('urk')
-    vs fgng.F_VFQVE(a.zbqr):
-        cevag '%f%f/' % (cersvk, grkg)
-    ryvs fgng.F_VFYAX(a.zbqr):
-        cevag '%f%f@' % (cersvk, grkg)
-    ryfr:
-        cevag '%f%f' % (cersvk, grkg)
-
-
-bcgfcrp = """
-ohc yf <qvef...>
---
-f,unfu   fubj unfu sbe rnpu svyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-
-vs abg rkgen:
-    rkgen = ['/']
-
-erg = 0
-sbe q va rkgen:
-    gel:
-        a = gbc.yerfbyir(q)
-        vs fgng.F_VFQVE(a.zbqr):
-            sbe fho va a:
-                cevag_abqr(fho.anzr, fho)
-        ryfr:
-            cevag_abqr(q, a)
-    rkprcg isf.AbqrReebe, r:
-        ybt('reebe: %f\a' % r)
-        erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
-sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
-sebz ohc.urycref vzcbeg *
-
-qrs abqr_anzr(grkg, a):
-    vs fgng.F_VFQVE(a.zbqr):
-        erghea '%f/' % grkg
-    ryvs fgng.F_VFYAX(a.zbqr):
-        erghea '%f@' % grkg
-    ryfr:
-        erghea '%f' % grkg
-
-
-qrs qb_yf(cngu, a):
-    y = []
-    vs fgng.F_VFQVE(a.zbqr):
-        sbe fho va a:
-            y.nccraq(abqr_anzr(fho.anzr, fho))
-    ryfr:
-        y.nccraq(abqr_anzr(cngu, a))
-    cevag pbyhzangr(y, '')
-    
-
-qrs jevgr_gb_svyr(vas, bhgs):
-    sbe oybo va puhaxlernqre(vas):
-        bhgs.jevgr(oybo)
-    
-
-qrs vachgvgre():
-    vs bf.vfnggl(flf.fgqva.svyrab()):
-        juvyr 1:
-            gel:
-                lvryq enj_vachg('ohc> ')
-            rkprcg RBSReebe:
-                oernx
-    ryfr:
-        sbe yvar va flf.fgqva:
-            lvryq yvar
-
-
-qrs _pbzcyrgre_trg_fhof(yvar):
-    (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
-    (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
-    #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
-    a = cjq.erfbyir(qve)
-    fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
-                       a.fhof()))
-    erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
-
-
-_ynfg_yvar = Abar
-_ynfg_erf = Abar
-qrs pbzcyrgre(grkg, fgngr):
-    tybony _ynfg_yvar
-    tybony _ynfg_erf
-    gel:
-        yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
-        vs _ynfg_yvar != yvar:
-            _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
-            _ynfg_yvar = yvar
-        (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
-        vs fgngr < yra(fhof):
-            fa = fhof[fgngr]
-            fa1 = fa.erfbyir('')  # qrers flzyvaxf
-            shyyanzr = bf.cngu.wbva(qve, fa.anzr)
-            vs fgng.F_VFQVE(fa1.zbqr):
-                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
-                                          grezvangr=Snyfr)
-            ryfr:
-                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
-                                          grezvangr=Gehr) + ' '
-            erghea grkg + erg
-    rkprcg Rkprcgvba, r:
-        ybt('\areebe va pbzcyrgvba: %f\a' % r)
-
-            
-bcgfcrp = """
-ohc sgc
-"""
-b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-gbc = isf.ErsYvfg(Abar)
-cjq = gbc
-
-vs rkgen:
-    yvarf = rkgen
-ryfr:
-    ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
-    ernqyvar.frg_pbzcyrgre(pbzcyrgre)
-    ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
-    yvarf = vachgvgre()
-
-sbe yvar va yvarf:
-    vs abg yvar.fgevc():
-        pbagvahr
-    jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
-    pzq = jbeqf[0].ybjre()
-    #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
-    gel:
-        vs pzq == 'yf':
-            sbe cnez va (jbeqf[1:] be ['.']):
-                qb_yf(cnez, cjq.erfbyir(cnez))
-        ryvs pzq == 'pq':
-            sbe cnez va jbeqf[1:]:
-                cjq = cjq.erfbyir(cnez)
-        ryvs pzq == 'cjq':
-            cevag cjq.shyyanzr()
-        ryvs pzq == 'png':
-            sbe cnez va jbeqf[1:]:
-                tvir be gnxr n ovgerfbyir(cnez).bcra(), flf.fgqbhg)
-        ryvs pzq == 'trg':
-            vs yra(jbeqf) abg va [2,3]:
-                envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
-            eanzr = jbeqf[1]
-            (qve,onfr) = bf.cngu.fcyvg(eanzr)
-            yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
-            vas = cjq.erfbyir(eanzr).bcra()
-            ybt('Fnivat %e\a' % yanzr)
-            jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
-        ryvs pzq == 'ztrg':
-            sbe cnez va jbeqf[1:]:
-                (qve,onfr) = bf.cngu.fcyvg(cnez)
-                sbe a va cjq.erfbyir(qve).fhof():
-                    vs sazngpu.sazngpu(a.anzr, onfr):
-                        gel:
-                            ybt('Fnivat %e\a' % a.anzr)
-                            vas = a.bcra()
-                            bhgs = bcra(a.anzr, 'jo')
-                            jevgr_gb_svyr(vas, bhgs)
-                            bhgs.pybfr()
-                        rkprcg Rkprcgvba, r:
-                            ybt('  reebe: %f\a' % r)
-        ryvs pzq == 'uryc' be pzq == '?':
-            ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
-        ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
-            oernx
-        ryfr:
-            envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
-    rkprcg Rkprcgvba, r:
-        ybt('reebe: %f\a' % r)
-        #envfr
-#!/hfe/ova/rai clguba
-vzcbeg flf, zznc
-sebz ohc vzcbeg bcgvbaf, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc enaqbz [-F frrq] <ahzolgrf>
---
-F,frrq=   bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
-s,sbepr   cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
-"""
-b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-gbgny = cnefr_ahz(rkgen[0])
-
-vs bcg.sbepr be (abg bf.vfnggl(1) naq
-                 abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
-    _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
-ryfr:
-    ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc uryc <pbzznaq>
-"""
-b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) == 0:
-    # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
-    bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
-ryvs yra(rkgen) == 1:
-    qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
-    rkr = flf.neti[0]
-    (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
-    znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
-    t = tybo.tybo(znacngu)
-    vs t:
-        bf.rkrpic('zna', ['zna', '-y', t[0]])
-    ryfr:
-        bf.rkrpic('zna', ['zna', qbpanzr])
-ryfr:
-    b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-
-pynff Fgng(shfr.Fgng):
-    qrs __vavg__(frys):
-        frys.fg_zbqr = 0
-        frys.fg_vab = 0
-        frys.fg_qri = 0
-        frys.fg_ayvax = 0
-        frys.fg_hvq = 0
-        frys.fg_tvq = 0
-        frys.fg_fvmr = 0
-        frys.fg_ngvzr = 0
-        frys.fg_zgvzr = 0
-        frys.fg_pgvzr = 0
-        frys.fg_oybpxf = 0
-        frys.fg_oyxfvmr = 0
-        frys.fg_eqri = 0
-
-
-pnpur = {}
-qrs pnpur_trg(gbc, cngu):
-    cnegf = cngu.fcyvg('/')
-    pnpur[('',)] = gbc
-    p = Abar
-    znk = yra(cnegf)
-    #ybt('pnpur: %e\a' % pnpur.xrlf())
-    sbe v va enatr(znk):
-        cer = cnegf[:znk-v]
-        #ybt('pnpur gelvat: %e\a' % cer)
-        p = pnpur.trg(ghcyr(cer))
-        vs p:
-            erfg = cnegf[znk-v:]
-            sbe e va erfg:
-                #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
-                p = p.yerfbyir(e)
-                xrl = ghcyr(cer + [e])
-                #ybt('fnivat: %e\a' % (xrl,))
-                pnpur[xrl] = p
-            oernx
-    nffreg(p)
-    erghea p
-        
-    
-
-pynff OhcSf(shfr.Shfr):
-    qrs __vavg__(frys, gbc):
-        shfr.Shfr.__vavg__(frys)
-        frys.gbc = gbc
-    
-    qrs trgngge(frys, cngu):
-        ybt('--trgngge(%e)\a' % cngu)
-        gel:
-            abqr = pnpur_trg(frys.gbc, cngu)
-            fg = Fgng()
-            fg.fg_zbqr = abqr.zbqr
-            fg.fg_ayvax = abqr.ayvaxf()
-            fg.fg_fvmr = abqr.fvmr()
-            fg.fg_zgvzr = abqr.zgvzr
-            fg.fg_pgvzr = abqr.pgvzr
-            fg.fg_ngvzr = abqr.ngvzr
-            erghea fg
-        rkprcg isf.AbFhpuSvyr:
-            erghea -reeab.RABRAG
-
-    qrs ernqqve(frys, cngu, bssfrg):
-        ybt('--ernqqve(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        lvryq shfr.Qveragel('.')
-        lvryq shfr.Qveragel('..')
-        sbe fho va abqr.fhof():
-            lvryq shfr.Qveragel(fho.anzr)
-
-    qrs ernqyvax(frys, cngu):
-        ybt('--ernqyvax(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        erghea abqr.ernqyvax()
-
-    qrs bcra(frys, cngu, syntf):
-        ybt('--bcra(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
-        vs (syntf & nppzbqr) != bf.B_EQBAYL:
-            erghea -reeab.RNPPRF
-        abqr.bcra()
-
-    qrs eryrnfr(frys, cngu, syntf):
-        ybt('--eryrnfr(%e)\a' % cngu)
-
-    qrs ernq(frys, cngu, fvmr, bssfrg):
-        ybt('--ernq(%e)\a' % cngu)
-        a = pnpur_trg(frys.gbc, cngu)
-        b = a.bcra()
-        b.frrx(bssfrg)
-        erghea b.ernq(fvmr)
-
-
-vs abg unfngge(shfr, '__irefvba__'):
-    envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
-shfr.shfr_clguba_ncv = (0, 2)
-
-
-bcgfcrp = """
-ohc shfr [-q] [-s] <zbhagcbvag>
---
-q,qroht   vapernfr qroht yriry
-s,sbertebhaq  eha va sbertebhaq
-"""
-b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-s = OhcSf(gbc)
-s.shfr_netf.zbhagcbvag = rkgen[0]
-vs bcg.qroht:
-    s.shfr_netf.nqq('qroht')
-vs bcg.sbertebhaq:
-    s.shfr_netf.frgzbq('sbertebhaq')
-cevag s.zhygvguernqrq
-s.zhygvguernqrq = Snyfr
-
-s.znva()
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-
-vs bcg.erzbgr:
-    tvg.vavg_ercb()  # ybpny ercb
-    tvg.purpx_ercb_be_qvr()
-    pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
-    pyv.pybfr()
-ryfr:
-    tvg.vavg_ercb()
-#!/hfe/ova/rai clguba
-vzcbeg flf, zngu, fgehpg, tybo
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-CNTR_FVMR=4096
-FUN_CRE_CNTR=CNTR_FVMR/200.
-
-
-qrs zretr(vqkyvfg, ovgf, gnoyr):
-    pbhag = 0
-    sbe r va tvg.vqkzretr(vqkyvfg):
-        pbhag += 1
-        cersvk = tvg.rkgenpg_ovgf(r, ovgf)
-        gnoyr[cersvk] = pbhag
-        lvryq r
-
-
-qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
-    vs abg bhgsvyranzr:
-        nffreg(bhgqve)
-        fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
-        bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
-    
-    vac = []
-    gbgny = 0
-    sbe anzr va vasvyranzrf:
-        vk = tvg.CnpxVqk(anzr)
-        vac.nccraq(vk)
-        gbgny += yra(vk)
-
-    ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
-    vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
-       be (bcg.sbepr naq abg gbgny):
-        ybt('zvqk: abguvat gb qb.\a')
-        erghea
-
-    cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
-    ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
-    ragevrf = 2**ovgf
-    ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
-    
-    gnoyr = [0]*ragevrf
-
-    gel:
-        bf.hayvax(bhgsvyranzr)
-    rkprcg BFReebe:
-        cnff
-    s = bcra(bhgsvyranzr + '.gzc', 'j+')
-    s.jevgr('ZVQK\0\0\0\2')
-    s.jevgr(fgehpg.cnpx('!V', ovgf))
-    nffreg(s.gryy() == 12)
-    s.jevgr('\0'*4*ragevrf)
-    
-    sbe r va zretr(vac, ovgf, gnoyr):
-        s.jevgr(r)
-        
-    s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
-
-    s.frrx(12)
-    s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
-    s.pybfr()
-    bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
-
-    # guvf vf whfg sbe grfgvat
-    vs 0:
-        c = tvg.CnpxZvqk(bhgsvyranzr)
-        nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
-        cevag c.vqkanzrf
-        nffreg(yra(c) == gbgny)
-        cv = vgre(c)
-        sbe v va zretr(vac, gbgny, ovgf, gnoyr):
-            nffreg(v == cv.arkg())
-            nffreg(c.rkvfgf(v))
-
-    cevag bhgsvyranzr
-
-bcgfcrp = """
-ohc zvqk [bcgvbaf...] <vqkanzrf...>
---
-b,bhgchg=  bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
-n,nhgb     nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
-s,sbepr    nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen naq (bcg.nhgb be bcg.sbepr):
-    b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
-
-tvg.purpx_ercb_be_qvr()
-
-vs rkgen:
-    qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
-ryvs bcg.nhgb be bcg.sbepr:
-    cnguf = [tvg.ercb('bowrpgf/cnpx')]
-    cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
-    sbe cngu va cnguf:
-        ybt('zvqk: fpnaavat %f\a' % cngu)
-        vs bcg.sbepr:
-            qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
-        ryvs bcg.nhgb:
-            z = tvg.CnpxVqkYvfg(cngu)
-            arrqrq = {}
-            sbe cnpx va z.cnpxf:  # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
-                vs cnpx.anzr.raqfjvgu('.vqk'):
-                    arrqrq[cnpx.anzr] = 1
-            qry z
-            qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
-        ybt('\a')
-ryfr:
-    b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, enaqbz
-sebz ohc vzcbeg bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs enaqoybpx(a):
-    y = []
-    sbe v va kenatr(a):
-        y.nccraq(pue(enaqbz.enaqenatr(0,256)))
-    erghea ''.wbva(y)
-
-
-bcgfcrp = """
-ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
---
-   JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
-a,ahz=   ahzore bs oybpxf gb qnzntr
-f,fvmr=  znkvzhz fvmr bs rnpu qnzntrq oybpx
-creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
-rdhny    fcernq qnzntr rirayl guebhtubhg gur svyr
-F,frrq=  enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
-"""
-b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg rkgen:
-    b.sngny('svyranzrf rkcrpgrq')
-
-vs bcg.frrq != Abar:
-    enaqbz.frrq(bcg.frrq)
-
-sbe anzr va rkgen:
-    ybt('Qnzntvat "%f"...\a' % anzr)
-    s = bcra(anzr, 'e+o')
-    fg = bf.sfgng(s.svyrab())
-    fvmr = fg.fg_fvmr
-    vs bcg.creprag be bcg.fvmr:
-        zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
-        zf2 = bcg.fvmr be fvmr
-        znkfvmr = zva(zf1, zf2)
-    ryfr:
-        znkfvmr = 1
-    puhaxf = bcg.ahz be 10
-    puhaxfvmr = fvmr/puhaxf
-    sbe e va enatr(puhaxf):
-        fm = enaqbz.enaqenatr(1, znkfvmr+1)
-        vs fm > fvmr:
-            fm = fvmr
-        vs bcg.rdhny:
-            bsf = e*puhaxfvmr
-        ryfr:
-            bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
-        ybt('  %6q olgrf ng %q\a' % (fm, bsf))
-        s.frrx(bsf)
-        s.jevgr(enaqoybpx(fm))
-    s.pybfr()
-#!/hfe/ova/rai clguba
-vzcbeg flf, fgehpg, zznc
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-fhfcraqrq_j = Abar
-
-
-qrs vavg_qve(pbaa, net):
-    tvg.vavg_ercb(net)
-    ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
-    pbaa.bx()
-
-
-qrs frg_qve(pbaa, net):
-    tvg.purpx_ercb_be_qvr(net)
-    ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
-    pbaa.bx()
-
-    
-qrs yvfg_vaqrkrf(pbaa, whax):
-    tvg.purpx_ercb_be_qvr()
-    sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
-        vs s.raqfjvgu('.vqk'):
-            pbaa.jevgr('%f\a' % s)
-    pbaa.bx()
-
-
-qrs fraq_vaqrk(pbaa, anzr):
-    tvg.purpx_ercb_be_qvr()
-    nffreg(anzr.svaq('/') < 0)
-    nffreg(anzr.raqfjvgu('.vqk'))
-    vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
-    pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
-    pbaa.jevgr(vqk.znc)
-    pbaa.bx()
-
-
-qrs erprvir_bowrpgf(pbaa, whax):
-    tybony fhfcraqrq_j
-    tvg.purpx_ercb_be_qvr()
-    fhttrfgrq = {}
-    vs fhfcraqrq_j:
-        j = fhfcraqrq_j
-        fhfcraqrq_j = Abar
-    ryfr:
-        j = tvg.CnpxJevgre()
-    juvyr 1:
-        af = pbaa.ernq(4)
-        vs abg af:
-            j.nobeg()
-            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
-        a = fgehpg.hacnpx('!V', af)[0]
-        #ybt('rkcrpgvat %q olgrf\a' % a)
-        vs abg a:
-            ybt('ohc freire: erprvirq %q bowrpg%f.\a' 
-                % (j.pbhag, j.pbhag!=1 naq "f" be ''))
-            shyycngu = j.pybfr()
-            vs shyycngu:
-                (qve, anzr) = bf.cngu.fcyvg(shyycngu)
-                pbaa.jevgr('%f.vqk\a' % anzr)
-            pbaa.bx()
-            erghea
-        ryvs a == 0kssssssss:
-            ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
-            fhfcraqrq_j = j
-            pbaa.bx()
-            erghea
-            
-        ohs = pbaa.ernq(a)  # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
-        #ybt('ernq %q olgrf\a' % a)
-        vs yra(ohs) < a:
-            j.nobeg()
-            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
-                            % (a, yra(ohs)))
-        (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
-        fun = tvg.pnyp_unfu(glcr, pbagrag)
-        byqcnpx = j.rkvfgf(fun)
-        # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
-        # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
-        # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
-        # ba gur freire fvqr.
-        vs abg fhttrfgrq naq \
-          byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
-            # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
-            # ng guvf ynlre.  Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
-            # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
-            # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
-            # znxr gur svyrf ovttre.  Guvf zrgubq vf pregnvayl abg irel
-            # rssvpvrag.
-            j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
-            byqcnpx = j.bowpnpur.rkvfgf(fun)
-            ybt('arj fhttrfgvba: %e\a' % byqcnpx)
-            nffreg(byqcnpx)
-            nffreg(byqcnpx != Gehr)
-            nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
-            j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
-        vs abg fhttrfgrq naq byqcnpx:
-            nffreg(byqcnpx.raqfjvgu('.vqk'))
-            (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
-            vs abg (anzr va fhttrfgrq):
-                ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
-                pbaa.jevgr('vaqrk %f\a' % anzr)
-                fhttrfgrq[anzr] = 1
-        ryfr:
-            j._enj_jevgr([ohs])
-    # ABGERNPURQ
-
-
-qrs ernq_ers(pbaa, ersanzr):
-    tvg.purpx_ercb_be_qvr()
-    e = tvg.ernq_ers(ersanzr)
-    pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
-    pbaa.bx()
-
-
-qrs hcqngr_ers(pbaa, ersanzr):
-    tvg.purpx_ercb_be_qvr()
-    arjiny = pbaa.ernqyvar().fgevc()
-    byqiny = pbaa.ernqyvar().fgevc()
-    tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
-    pbaa.bx()
-
-
-qrs png(pbaa, vq):
-    tvg.purpx_ercb_be_qvr()
-    gel:
-        sbe oybo va tvg.png(vq):
-            pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
-            pbaa.jevgr(oybo)
-    rkprcg XrlReebe, r:
-        ybt('freire: reebe: %f\a' % r)
-        pbaa.jevgr('\0\0\0\0')
-        pbaa.reebe(r)
-    ryfr:
-        pbaa.jevgr('\0\0\0\0')
-        pbaa.bx()
-
-
-bcgfcrp = """
-ohc freire
-"""
-b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-ybt('ohc freire: ernqvat sebz fgqva.\a')
-
-pbzznaqf = {
-    'vavg-qve': vavg_qve,
-    'frg-qve': frg_qve,
-    'yvfg-vaqrkrf': yvfg_vaqrkrf,
-    'fraq-vaqrk': fraq_vaqrk,
-    'erprvir-bowrpgf': erprvir_bowrpgf,
-    'ernq-ers': ernq_ers,
-    'hcqngr-ers': hcqngr_ers,
-    'png': png,
-}
-
-# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
-# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
-pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
-ye = yvarernqre(pbaa)
-sbe _yvar va ye:
-    yvar = _yvar.fgevc()
-    vs abg yvar:
-        pbagvahr
-    ybt('ohc freire: pbzznaq: %e\a' % yvar)
-    jbeqf = yvar.fcyvg(' ', 1)
-    pzq = jbeqf[0]
-    erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
-    vs pzq == 'dhvg':
-        oernx
-    ryfr:
-        pzq = pbzznaqf.trg(pzq)
-        vs pzq:
-            pzq(pbaa, erfg)
-        ryfr:
-            envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
-
-ybt('ohc freire: qbar\a')
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
-    rkgen = yvarernqre(flf.fgqva)
-
-erg = 0
-
-vs bcg.erzbgr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    png = pyv.png
-ryfr:
-    pc = tvg.PngCvcr()
-    png = pc.wbva
-
-sbe vq va rkgen:
-    gel:
-        sbe oybo va png(vq):
-            flf.fgqbhg.jevgr(oybo)
-    rkprcg XrlReebe, r:
-        flf.fgqbhg.syhfu()
-        ybt('reebe: %f\a' % r)
-        erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, reeab, fgng, gvzr, zngu
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc fnir [-gp] [-a anzr] <svyranzrf...>
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-g,gerr     bhgchg n gerr vq
-p,pbzzvg   bhgchg n pbzzvg vq
-a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-d,dhvrg    qba'g fubj cebterff zrgre
-fznyyre=   bayl onpx hc svyrf fznyyre guna a olgrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
-    b.sngny("hfr bar be zber bs -g, -p, -a")
-vs abg rkgen:
-    b.sngny("ab svyranzrf tvira")
-
-bcg.cebterff = (vfggl naq abg bcg.dhvrg)
-bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
-    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.erzbgr be vf_erirefr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
-    j = pyv.arj_cnpxjevgre()
-ryfr:
-    pyv = Abar
-    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
-    j = tvg.CnpxJevgre()
-
-unaqyr_pgey_p()
-
-
-qrs rngfynfu(qve):
-    vs qve.raqfjvgu('/'):
-        erghea qve[:-1]
-    ryfr:
-        erghea qve
-
-
-cnegf = ['']
-funyvfgf = [[]]
-
-qrs _chfu(cneg):
-    nffreg(cneg)
-    cnegf.nccraq(cneg)
-    funyvfgf.nccraq([])
-
-qrs _cbc(sbepr_gerr):
-    nffreg(yra(cnegf) >= 1)
-    cneg = cnegf.cbc()
-    funyvfg = funyvfgf.cbc()
-    gerr = sbepr_gerr be j.arj_gerr(funyvfg)
-    vs funyvfgf:
-        funyvfgf[-1].nccraq(('40000', cneg, gerr))
-    ryfr:  # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
-        funyvfgf.nccraq(funyvfg)
-    erghea gerr
-
-ynfgerznva = Abar
-qrs cebterff_ercbeg(a):
-    tybony pbhag, fhopbhag, ynfgerznva
-    fhopbhag += a
-    pp = pbhag + fhopbhag
-    cpg = gbgny naq (pp*100.0/gbgny) be 0
-    abj = gvzr.gvzr()
-    ryncfrq = abj - gfgneg
-    xcf = ryncfrq naq vag(pp/1024./ryncfrq)
-    xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
-    xcf = vag(xcf/xcf_senp)*xcf_senp
-    vs pp:
-        erznva = ryncfrq*1.0/pp * (gbgny-pp)
-    ryfr:
-        erznva = 0.0
-    vs (ynfgerznva naq (erznva > ynfgerznva)
-          naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
-        erznva = ynfgerznva
-    ryfr:
-        ynfgerznva = erznva
-    ubhef = vag(erznva/60/60)
-    zvaf = vag(erznva/60 - ubhef*60)
-    frpf = vag(erznva - ubhef*60*60 - zvaf*60)
-    vs ryncfrq < 30:
-        erznvafge = ''
-        xcffge = ''
-    ryfr:
-        xcffge = '%qx/f' % xcf
-        vs ubhef:
-            erznvafge = '%qu%qz' % (ubhef, zvaf)
-        ryvs zvaf:
-            erznvafge = '%qz%q' % (zvaf, frpf)
-        ryfr:
-            erznvafge = '%qf' % frpf
-    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
-             % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
-                erznvafge, xcffge))
-
-
-e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
-
-qrs nyernql_fnirq(rag):
-    erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
-
-qrs jnagerphefr_cer(rag):
-    erghea abg nyernql_fnirq(rag)
-
-qrs jnagerphefr_qhevat(rag):
-    erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
-
-gbgny = sgbgny = 0
-vs bcg.cebterff:
-    sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
-        vs abg (sgbgny % 10024):
-            cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
-        rkvfgf = rag.rkvfgf()
-        unfuinyvq = nyernql_fnirq(rag)
-        rag.frg_fun_zvffvat(abg unfuinyvq)
-        vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
-            vs rkvfgf naq abg unfuinyvq:
-                gbgny += rag.fvmr
-        sgbgny += 1
-    cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
-    unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
-
-gfgneg = gvzr.gvzr()
-pbhag = fhopbhag = spbhag = 0
-ynfgfxvc_anzr = Abar
-ynfgqve = ''
-sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
-    (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
-    rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
-    unfuinyvq = nyernql_fnirq(rag)
-    jnfzvffvat = rag.fun_zvffvat()
-    byqfvmr = rag.fvmr
-    vs bcg.ireobfr:
-        vs abg rkvfgf:
-            fgnghf = 'Q'
-        ryvs abg unfuinyvq:
-            vs rag.fun == vaqrk.RZCGL_FUN:
-                fgnghf = 'N'
-            ryfr:
-                fgnghf = 'Z'
-        ryfr:
-            fgnghf = ' '
-        vs bcg.ireobfr >= 2:
-            ybt('%f %-70f\a' % (fgnghf, rag.anzr))
-        ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
-            vs abg ynfgqve.fgnegfjvgu(qve):
-                ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
-            ynfgqve = qve
-
-    vs bcg.cebterff:
-        cebterff_ercbeg(0)
-    spbhag += 1
-    
-    vs abg rkvfgf:
-        pbagvahr
-    vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
-        vs rkvfgf naq abg unfuinyvq:
-            nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
-            ynfgfxvc_anzr = rag.anzr
-        pbagvahr
-
-    nffreg(qve.fgnegfjvgu('/'))
-    qvec = qve.fcyvg('/')
-    juvyr cnegf > qvec:
-        _cbc(sbepr_gerr = Abar)
-    vs qve != '/':
-        sbe cneg va qvec[yra(cnegf):]:
-            _chfu(cneg)
-
-    vs abg svyr:
-        # ab svyranzr cbegvba zrnaf guvf vf n fhoqve.  Ohg
-        # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
-        byqgerr = nyernql_fnirq(rag) # znl or Abar
-        arjgerr = _cbc(sbepr_gerr = byqgerr)
-        vs abg byqgerr:
-            vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
-                rag.vainyvqngr()
-            ryfr:
-                rag.inyvqngr(040000, arjgerr)
-            rag.ercnpx()
-        vs rkvfgf naq jnfzvffvat:
-            pbhag += byqfvmr
-        pbagvahr
-
-    # vg'f abg n qverpgbel
-    vq = Abar
-    vs unfuinyvq:
-        zbqr = '%b' % rag.tvgzbqr
-        vq = rag.fun
-        funyvfgf[-1].nccraq((zbqr, 
-                             tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
-                             vq))
-    ryfr:
-        vs fgng.F_VFERT(rag.zbqr):
-            gel:
-                s = unfufcyvg.bcra_abngvzr(rag.anzr)
-            rkprcg VBReebe, r:
-                nqq_reebe(r)
-                ynfgfxvc_anzr = rag.anzr
-            rkprcg BFReebe, r:
-                nqq_reebe(r)
-                ynfgfxvc_anzr = rag.anzr
-            ryfr:
-                (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
-        ryfr:
-            vs fgng.F_VFQVE(rag.zbqr):
-                nffreg(0)  # unaqyrq nobir
-            ryvs fgng.F_VFYAX(rag.zbqr):
-                gel:
-                    ey = bf.ernqyvax(rag.anzr)
-                rkprcg BFReebe, r:
-                    nqq_reebe(r)
-                    ynfgfxvc_anzr = rag.anzr
-                rkprcg VBReebe, r:
-                    nqq_reebe(r)
-                    ynfgfxvc_anzr = rag.anzr
-                ryfr:
-                    (zbqr, vq) = ('120000', j.arj_oybo(ey))
-            ryfr:
-                nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
-                ynfgfxvc_anzr = rag.anzr
-        vs vq:
-            rag.inyvqngr(vag(zbqr, 8), vq)
-            rag.ercnpx()
-            funyvfgf[-1].nccraq((zbqr,
-                                 tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
-                                 vq))
-    vs rkvfgf naq jnfzvffvat:
-        pbhag += byqfvmr
-        fhopbhag = 0
-
-
-vs bcg.cebterff:
-    cpg = gbgny naq pbhag*100.0/gbgny be 100
-    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar.    \a'
-             % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
-
-juvyr yra(cnegf) > 1:
-    _cbc(sbepr_gerr = Abar)
-nffreg(yra(funyvfgf) == 1)
-gerr = j.arj_gerr(funyvfgf[-1])
-vs bcg.gerr:
-    cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
-    zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
-    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
-    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
-    vs bcg.pbzzvg:
-        cevag pbzzvg.rapbqr('urk')
-
-j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
-        
-vs bcg.anzr:
-    vs pyv:
-        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
-    ryfr:
-        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
-    pyv.pybfr()
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc gvpx
-"""
-b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-g = gvzr.gvzr()
-gyrsg = 1 - (g - vag(g))
-gvzr.fyrrc(gyrsg)
-#!/hfe/ova/rai clguba
-vzcbeg bf, flf, fgng, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
-sebz ohc.urycref vzcbeg *
-
-
-qrs zretr_vaqrkrf(bhg, e1, e2):
-    sbe r va vaqrk.ZretrVgre([e1, e2]):
-        # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl?  Jura?
-        bhg.nqq_vkragel(r)
-
-
-pynff VgreUrycre:
-    qrs __vavg__(frys, y):
-        frys.v = vgre(y)
-        frys.phe = Abar
-        frys.arkg()
-
-    qrs arkg(frys):
-        gel:
-            frys.phe = frys.v.arkg()
-        rkprcg FgbcVgrengvba:
-            frys.phe = Abar
-        erghea frys.phe
-
-
-qrs purpx_vaqrk(ernqre):
-    gel:
-        ybt('purpx: purpxvat sbejneq vgrengvba...\a')
-        r = Abar
-        q = {}
-        sbe r va ernqre.sbejneq_vgre():
-            vs r.puvyqera_a:
-                vs bcg.ireobfr:
-                    ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
-                                            r.anzr))
-                nffreg(r.puvyqera_bsf)
-                nffreg(r.anzr.raqfjvgu('/'))
-                nffreg(abg q.trg(r.puvyqera_bsf))
-                q[r.puvyqera_bsf] = 1
-            vs r.syntf & vaqrk.VK_UNFUINYVQ:
-                nffreg(r.fun != vaqrk.RZCGL_FUN)
-                nffreg(r.tvgzbqr)
-        nffreg(abg r be r.anzr == '/')  # ynfg ragel vf *nyjnlf* /
-        ybt('purpx: purpxvat abezny vgrengvba...\a')
-        ynfg = Abar
-        sbe r va ernqre:
-            vs ynfg:
-                nffreg(ynfg > r.anzr)
-            ynfg = r.anzr
-    rkprcg:
-        ybt('vaqrk reebe! ng %e\a' % r)
-        envfr
-    ybt('purpx: cnffrq.\a')
-
-
-qrs hcqngr_vaqrk(gbc):
-    ev = vaqrk.Ernqre(vaqrksvyr)
-    jv = vaqrk.Jevgre(vaqrksvyr)
-    evt = VgreUrycre(ev.vgre(anzr=gbc))
-    gfgneg = vag(gvzr.gvzr())
-
-    unfutra = Abar
-    vs bcg.snxr_inyvq:
-        qrs unfutra(anzr):
-            erghea (0100644, vaqrk.SNXR_FUN)
-
-    gbgny = 0
-    sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
-        vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
-            flf.fgqbhg.jevgr('%f\a' % cngu)
-            flf.fgqbhg.syhfu()
-            cebterff('Vaqrkvat: %q\e' % gbgny)
-        ryvs abg (gbgny % 128):
-            cebterff('Vaqrkvat: %q\e' % gbgny)
-        gbgny += 1
-        juvyr evt.phe naq evt.phe.anzr > cngu:  # qryrgrq cnguf
-            vs evt.phe.rkvfgf():
-                evt.phe.frg_qryrgrq()
-                evt.phe.ercnpx()
-            evt.arkg()
-        vs evt.phe naq evt.phe.anzr == cngu:    # cnguf gung nyernql rkvfgrq
-            vs cfg:
-                evt.phe.sebz_fgng(cfg, gfgneg)
-            vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
-                vs unfutra:
-                    (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
-                    evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
-            vs bcg.snxr_vainyvq:
-                evt.phe.vainyvqngr()
-            evt.phe.ercnpx()
-            evt.arkg()
-        ryfr:  # arj cnguf
-            jv.nqq(cngu, cfg, unfutra = unfutra)
-    cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
-    
-    vs ev.rkvfgf():
-        ev.fnir()
-        jv.syhfu()
-        vs jv.pbhag:
-            je = jv.arj_ernqre()
-            vs bcg.purpx:
-                ybt('purpx: orsber zretvat: byqsvyr\a')
-                purpx_vaqrk(ev)
-                ybt('purpx: orsber zretvat: arjsvyr\a')
-                purpx_vaqrk(je)
-            zv = vaqrk.Jevgre(vaqrksvyr)
-            zretr_vaqrkrf(zv, ev, je)
-            ev.pybfr()
-            zv.pybfr()
-            je.pybfr()
-        jv.nobeg()
-    ryfr:
-        jv.pybfr()
-
-
-bcgfcrp = """
-ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
---
-c,cevag    cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
-z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
-f,fgnghf   cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
-U,unfu     cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
-y,ybat     cevag zber vasbezngvba nobhg rnpu svyr
-h,hcqngr   (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
-k,kqri,bar-svyr-flfgrz  qba'g pebff svyrflfgrz obhaqnevrf
-snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
-snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
-purpx      pnershyyl purpx vaqrk svyr vagrtevgl
-s,vaqrksvyr=  gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-"""
-b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
-    b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
-vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
-    b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
-vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
-    b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
-
-tvg.purpx_ercb_be_qvr()
-vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
-
-unaqyr_pgey_p()
-
-vs bcg.purpx:
-    ybt('purpx: fgnegvat vavgvny purpx.\a')
-    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-cnguf = vaqrk.erqhpr_cnguf(rkgen)
-
-vs bcg.hcqngr:
-    vs abg cnguf:
-        b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
-    sbe (ec,cngu) va cnguf:
-        hcqngr_vaqrk(ec)
-
-vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
-    sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
-        vs (bcg.zbqvsvrq 
-            naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
-            pbagvahr
-        yvar = ''
-        vs bcg.fgnghf:
-            vs rag.vf_qryrgrq():
-                yvar += 'Q '
-            ryvs abg rag.vf_inyvq():
-                vs rag.fun == vaqrk.RZCGL_FUN:
-                    yvar += 'N '
-                ryfr:
-                    yvar += 'Z '
-            ryfr:
-                yvar += '  '
-        vs bcg.unfu:
-            yvar += rag.fun.rapbqr('urk') + ' '
-        vs bcg.ybat:
-            yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
-        cevag yvar + (anzr be './')
-
-vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
-    ybt('purpx: fgnegvat svany purpx.\a')
-    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg
-sebz ohc vzcbeg bcgvbaf, urycref
-
-bcgfcrp = """
-ohc eonpxhc-freire
---
-    Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-# trg gur fhopbzznaq'f neti.
-# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
-# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
-# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
-ohs = flf.fgqva.ernq(4)
-fm = fgehpg.hacnpx('!V', ohs)[0]
-nffreg(fm > 0)
-nffreg(fm < 1000000)
-ohs = flf.fgqva.ernq(fm)
-nffreg(yra(ohs) == fm)
-neti = ohs.fcyvg('\0')
-
-# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
-# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
-# gb zvfhfr gurz.  Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
-# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
-#
-# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
-# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
-# fbpxrg.  Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
-# bs vg, ohg cebonoyl qvqa'g.  Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
-# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
-#
-# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
-# qrfpevcgbef.  Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
-# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
-bf.qhc2(0, 3)
-bf.qhc2(1, 4)
-bf.qhc2(2, 1)
-sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
-bf.qhc2(sq, 0)
-bf.pybfr(sq)
-
-bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
-bf.rkrpic(neti[0], neti)
-flf.rkvg(99)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo, fhocebprff, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-cne2_bx = 0
-ahyys = bcra('/qri/ahyy')
-
-qrs qroht(f):
-    vs bcg.ireobfr:
-        ybt(f)
-
-qrs eha(neti):
-    # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
-    # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
-    # rkrpvat sbe fbzr ernfba.  Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
-    # svefg.
-    sq = bf.qhc(2)  # pbcl fgqree
-    gel:
-        c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
-        erghea c.jnvg()
-    svanyyl:
-        bf.pybfr(sq)
-
-qrs cne2_frghc():
-    tybony cne2_bx
-    ei = 1
-    gel:
-        c = fhocebprff.Cbcra(['cne2', '--uryc'],
-                             fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
-        ei = c.jnvg()
-    rkprcg BFReebe:
-        ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
-    ryfr:
-        cne2_bx = 1
-
-qrs cnei(yiy):
-    vs bcg.ireobfr >= yiy:
-        vs vfggl:
-            erghea []
-        ryfr:
-            erghea ['-d']
-    ryfr:
-        erghea ['-dd']
-
-qrs cne2_trarengr(onfr):
-    erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
-               + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
-
-qrs cne2_irevsl(onfr):
-    erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
-
-qrs cne2_ercnve(onfr):
-    erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
-
-qrs dhvpx_irevsl(onfr):
-    s = bcra(onfr + '.cnpx', 'eo')
-    s.frrx(-20, 2)
-    jnagfhz = s.ernq(20)
-    nffreg(yra(jnagfhz) == 20)
-    s.frrx(0)
-    fhz = Fun1()
-    sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
-        fhz.hcqngr(o)
-    vs fhz.qvtrfg() != jnagfhz:
-        envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
-                                                  fhz.urkqvtrfg()))
-        
-
-qrs tvg_irevsl(onfr):
-    vs bcg.dhvpx:
-        gel:
-            dhvpx_irevsl(onfr)
-        rkprcg Rkprcgvba, r:
-            qroht('reebe: %f\a' % r)
-            erghea 1
-        erghea 0
-    ryfr:
-        erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
-    
-    
-qrs qb_cnpx(onfr, ynfg):
-    pbqr = 0
-    vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
-        ierfhyg = cne2_irevsl(onfr)
-        vs ierfhyg != 0:
-            vs bcg.ercnve:
-                eerfhyg = cne2_ercnve(onfr)
-                vs eerfhyg != 0:
-                    cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
-                    pbqr = eerfhyg
-                ryfr:
-                    cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
-                    pbqr = 100
-            ryfr:
-                cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
-                pbqr = ierfhyg
-        ryfr:
-            cevag '%f bx' % ynfg
-    ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
-        terfhyg = tvg_irevsl(onfr)
-        vs terfhyg != 0:
-            cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
-            pbqr = terfhyg
-        ryfr:
-            vs cne2_bx naq bcg.trarengr:
-                cerfhyg = cne2_trarengr(onfr)
-                vs cerfhyg != 0:
-                    cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
-                    pbqr = cerfhyg
-                ryfr:
-                    cevag '%f bx' % ynfg
-            ryfr:
-                cevag '%f bx' % ynfg
-    ryfr:
-        nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
-        qroht('    fxvccrq: cne2 svyr nyernql trarengrq.\a')
-    erghea pbqr
-
-
-bcgfcrp = """
-ohc sfpx [bcgvbaf...] [svyranzrf...]
---
-e,ercnve    nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
-t,trarengr  trarengr nhgb-ercnve vasbezngvba hfvat cne2
-i,ireobfr   vapernfr ireobfvgl (pna or hfrq zber guna bapr)
-dhvpx       whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
-w,wbof=     eha 'a' wbof va cnenyyry
-cne2-bx     vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
-qvfnoyr-cne2  vtaber cne2 rira vs vg vf ninvynoyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-cne2_frghc()
-vs bcg.cne2_bx:
-    vs cne2_bx:
-        flf.rkvg(0)  # 'gehr' va fu
-    ryfr:
-        flf.rkvg(1)
-vs bcg.qvfnoyr_cne2:
-    cne2_bx = 0
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
-    qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
-    rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
-
-pbqr = 0
-pbhag = 0
-bhgfgnaqvat = {}
-sbe anzr va rkgen:
-    vs anzr.raqfjvgu('.cnpx'):
-        onfr = anzr[:-5]
-    ryvs anzr.raqfjvgu('.vqk'):
-        onfr = anzr[:-4]
-    ryvs anzr.raqfjvgu('.cne2'):
-        onfr = anzr[:-5]
-    ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
-        onfr = anzr
-    ryfr:
-        envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
-    (qve,ynfg) = bf.cngu.fcyvg(onfr)
-    cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
-    vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
-        cne2_rkvfgf = 0
-    flf.fgqbhg.syhfu()
-    qroht('sfpx: purpxvat %f (%f)\a' 
-          % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
-    vs abg bcg.ireobfr:
-        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-    
-    vs abg bcg.wbof:
-        ap = qb_cnpx(onfr, ynfg)
-        pbqr = pbqr be ap
-        pbhag += 1
-    ryfr:
-        juvyr yra(bhgfgnaqvat) >= bcg.wbof:
-            (cvq,ap) = bf.jnvg()
-            ap >>= 8
-            vs cvq va bhgfgnaqvat:
-                qry bhgfgnaqvat[cvq]
-                pbqr = pbqr be ap
-                pbhag += 1
-        cvq = bf.sbex()
-        vs cvq:  # cnerag
-            bhgfgnaqvat[cvq] = 1
-        ryfr: # puvyq
-            gel:
-                flf.rkvg(qb_cnpx(onfr, ynfg))
-            rkprcg Rkprcgvba, r:
-                ybt('rkprcgvba: %e\a' % r)
-                flf.rkvg(99)
-                
-juvyr yra(bhgfgnaqvat):
-    (cvq,ap) = bf.jnvg()
-    ap >>= 8
-    vs cvq va bhgfgnaqvat:
-        qry bhgfgnaqvat[cvq]
-        pbqr = pbqr be ap
-        pbhag += 1
-    vs abg bcg.ireobfr:
-        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
-vs abg bcg.ireobfr naq vfggl:
-    ybt('sfpx qbar.           \a')
-flf.rkvg(pbqr)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
-sebz ohc vzcbeg bcgvbaf, ffu
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc eonpxhc <ubfganzr> vaqrk ...
-ohc eonpxhc <ubfganzr> fnir ...
-ohc eonpxhc <ubfganzr> fcyvg ...
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs yra(rkgen) < 2:
-    b.sngny('nethzragf rkcrpgrq')
-
-pynff FvtRkprcgvba(Rkprcgvba):
-    qrs __vavg__(frys, fvtahz):
-        frys.fvtahz = fvtahz
-        Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
-qrs unaqyre(fvtahz, senzr):
-    envfr FvtRkprcgvba(fvtahz)
-
-fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
-fvtany.fvtany(fvtany.FVTVAG, unaqyre)
-
-fc = Abar
-c = Abar
-erg = 99
-
-gel:
-    ubfganzr = rkgen[0]
-    neti = rkgen[1:]
-    c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
-
-    netif = '\0'.wbva(['ohc'] + neti)
-    c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
-    c.fgqva.syhfu()
-
-    znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
-    fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
-
-    c.fgqva.pybfr()
-    c.fgqbhg.pybfr()
-
-svanyyl:
-    juvyr 1:
-        # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
-        # va pnfr bhe puvyq qbrfa'g qvr.
-        gel:
-            erg = c.jnvg()
-            fc.jnvg()
-            oernx
-        rkprcg FvtRkprcgvba, r:
-            ybt('\aohc eonpxhc: %f\a' % r)
-            bf.xvyy(c.cvq, r.fvtahz)
-            erg = 84
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc arjyvare
-"""
-b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-e = er.pbzcvyr(e'([\e\a])')
-ynfgyra = 0
-nyy = ''
-juvyr 1:
-    y = e.fcyvg(nyy, 1)
-    vs yra(y) <= 1:
-        gel:
-            o = bf.ernq(flf.fgqva.svyrab(), 4096)
-        rkprcg XrlobneqVagreehcg:
-            oernx
-        vs abg o:
-            oernx
-        nyy += o
-    ryfr:
-        nffreg(yra(y) == 3)
-        (yvar, fcyvgpune, nyy) = y
-        #fcyvgpune = '\a'
-        flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
-        vs fcyvgpune == '\e':
-            ynfgyra = yra(yvar)
-        ryfr:
-            ynfgyra = 0
-        flf.fgqbhg.syhfu()
-
-vs ynfgyra be nyy:
-    flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
-#!/hfe/ova/rai clguba
-vzcbeg flf
-sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc znetva
-"""
-b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-#tvg.vtaber_zvqk = 1
-
-zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-ynfg = '\0'*20
-ybatzngpu = 0
-sbe v va zv:
-    vs v == ynfg:
-        pbagvahr
-    #nffreg(fge(v) >= ynfg)
-    cz = _unfufcyvg.ovgzngpu(ynfg, v)
-    ybatzngpu = znk(ybatzngpu, cz)
-    ynfg = v
-cevag ybatzngpu
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg bcgvbaf, qerphefr
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc qerphefr <cngu>
---
-k,kqri,bar-svyr-flfgrz   qba'g pebff svyrflfgrz obhaqnevrf
-d,dhvrg  qba'g npghnyyl cevag svyranzrf
-cebsvyr  eha haqre gur clguba cebsvyre
-"""
-b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar svyranzr rkcrpgrq")
-
-vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
-vs bcg.cebsvyr:
-    vzcbeg pCebsvyr
-    qrs qb_vg():
-        sbe v va vg:
-            cnff
-    pCebsvyr.eha('qb_vg()')
-ryfr:
-    vs bcg.dhvrg:
-        sbe v va vg:
-            cnff
-    ryfr:
-        sbe (anzr,fg) va vg:
-            cevag anzr
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-o,oybof    bhgchg n frevrf bs oybo vqf
-g,gerr     bhgchg n gerr vq
-p,pbzzvg   bhgchg n pbzzvg vq
-a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
-A,abbc     qba'g npghnyyl fnir gur qngn naljurer
-d,dhvrg    qba'g cevag cebterff zrffntrf
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-pbcl       whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
-orapu      cevag orapuznex gvzvatf gb fgqree
-znk-cnpx-fvmr=  znkvzhz olgrf va n fvatyr cnpx
-znk-cnpx-bowrpgf=  znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
-snabhg=  znkvzhz ahzore bs oybof va n fvatyr gerr
-"""
-b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
-        bcg.abbc be bcg.pbcl):
-    b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
-vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be 
-                               bcg.pbzzvg be bcg.anzr):
-    b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
-
-vs bcg.ireobfr >= 2:
-    tvg.ireobfr = bcg.ireobfr - 1
-    bcg.orapu = 1
-vs bcg.znk_cnpx_fvmr:
-    unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
-vs bcg.znk_cnpx_bowrpgf:
-    unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
-vs bcg.snabhg:
-    unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
-vs bcg.oybof:
-    unfufcyvg.snabhg = 0
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
-    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-fgneg_gvzr = gvzr.gvzr()
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.abbc be bcg.pbcl:
-    pyv = j = byqers = Abar
-ryvs bcg.erzbgr be vf_erirefr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
-    j = pyv.arj_cnpxjevgre()
-ryfr:
-    pyv = Abar
-    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
-    j = tvg.CnpxJevgre()
-
-svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
-vs j:
-    funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
-    gerr = j.arj_gerr(funyvfg)
-ryfr:
-    ynfg = 0
-    sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
-        unfufcyvg.gbgny_fcyvg += yra(oybo)
-        vs bcg.pbcl:
-            flf.fgqbhg.jevgr(fge(oybo))
-        zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
-        vs abg bcg.dhvrg naq ynfg != zrtf:
-            cebterff('%q Zolgrf ernq\e' % zrtf)
-            ynfg = zrtf
-    cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
-
-vs bcg.ireobfr:
-    ybt('\a')
-vs bcg.oybof:
-    sbe (zbqr,anzr,ova) va funyvfg:
-        cevag ova.rapbqr('urk')
-vs bcg.gerr:
-    cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
-    zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
-    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
-    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
-    vs bcg.pbzzvg:
-        cevag pbzzvg.rapbqr('urk')
-
-vs j:
-    j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
-        
-vs bcg.anzr:
-    vs pyv:
-        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
-    ryfr:
-        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
-    pyv.pybfr()
-
-frpf = gvzr.gvzr() - fgneg_gvzr
-fvmr = unfufcyvg.gbgny_fcyvg
-vs bcg.orapu:
-    ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
-        % (fvmr/1024., frpf, fvmr/1024./frpf))
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, fgehpg, zznc
-sebz ohc vzcbeg tvg, bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs f_sebz_olgrf(olgrf):
-    pyvfg = [pue(o) sbe o va olgrf]
-    erghea ''.wbva(pyvfg)
-
-
-qrs ercbeg(pbhag):
-    svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
-    q = {}
-    sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
-        y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
-        q[y[0]] = y[1]
-    vs pbhag >= 0:
-        r1 = pbhag
-        svryqf = [q[x] sbe x va svryqf]
-    ryfr:
-        r1 = ''
-    cevag ('%9f  ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
-    flf.fgqbhg.syhfu()
-
-
-bcgfcrp = """
-ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
---
-a,ahzore=  ahzore bs bowrpgf cre plpyr
-p,plpyrf=  ahzore bs plpyrf gb eha
-vtaber-zvqk  vtaber .zvqk svyrf, hfr bayl .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-tvg.vtaber_zvqk = bcg.vtaber_zvqk
-
-tvg.purpx_ercb_be_qvr()
-z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-
-plpyrf = bcg.plpyrf be 100
-ahzore = bcg.ahzore be 10000
-
-ercbeg(-1)
-s = bcra('/qri/henaqbz')
-n = zznc.zznc(-1, 20)
-ercbeg(0)
-sbe p va kenatr(plpyrf):
-    sbe a va kenatr(ahzore):
-        o = s.ernq(3)
-        vs 0:
-            olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
-            olgrf[2] &= 0ks0
-            ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
-        ryfr:
-            n[0:2] = o[0:2]
-            n[2] = pue(beq(o[2]) & 0ks0)
-            ova = fge(n[0:20])
-        #cevag ova.rapbqr('urk')
-        z.rkvfgf(ova)
-    ercbeg((p+1)*ahzore)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-qrs cevag_abqr(grkg, a):
-    cersvk = ''
-    vs bcg.unfu:
-        cersvk += "%f " % a.unfu.rapbqr('urk')
-    vs fgng.F_VFQVE(a.zbqr):
-        cevag '%f%f/' % (cersvk, grkg)
-    ryvs fgng.F_VFYAX(a.zbqr):
-        cevag '%f%f@' % (cersvk, grkg)
-    ryfr:
-        cevag '%f%f' % (cersvk, grkg)
-
-
-bcgfcrp = """
-ohc yf <qvef...>
---
-f,unfu   fubj unfu sbe rnpu svyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-
-vs abg rkgen:
-    rkgen = ['/']
-
-erg = 0
-sbe q va rkgen:
-    gel:
-        a = gbc.yerfbyir(q)
-        vs fgng.F_VFQVE(a.zbqr):
-            sbe fho va a:
-                cevag_abqr(fho.anzr, fho)
-        ryfr:
-            cevag_abqr(q, a)
-    rkprcg isf.AbqrReebe, r:
-        ybt('reebe: %f\a' % r)
-        erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
-sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
-sebz ohc.urycref vzcbeg *
-
-qrs abqr_anzr(grkg, a):
-    vs fgng.F_VFQVE(a.zbqr):
-        erghea '%f/' % grkg
-    ryvs fgng.F_VFYAX(a.zbqr):
-        erghea '%f@' % grkg
-    ryfr:
-        erghea '%f' % grkg
-
-
-qrs qb_yf(cngu, a):
-    y = []
-    vs fgng.F_VFQVE(a.zbqr):
-        sbe fho va a:
-            y.nccraq(abqr_anzr(fho.anzr, fho))
-    ryfr:
-        y.nccraq(abqr_anzr(cngu, a))
-    cevag pbyhzangr(y, '')
-    
-
-qrs jevgr_gb_svyr(vas, bhgs):
-    sbe oybo va puhaxlernqre(vas):
-        bhgs.jevgr(oybo)
-    
-
-qrs vachgvgre():
-    vs bf.vfnggl(flf.fgqva.svyrab()):
-        juvyr 1:
-            gel:
-                lvryq enj_vachg('ohc> ')
-            rkprcg RBSReebe:
-                oernx
-    ryfr:
-        sbe yvar va flf.fgqva:
-            lvryq yvar
-
-
-qrs _pbzcyrgre_trg_fhof(yvar):
-    (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
-    (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
-    #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
-    a = cjq.erfbyir(qve)
-    fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
-                       a.fhof()))
-    erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
-
-
-_ynfg_yvar = Abar
-_ynfg_erf = Abar
-qrs pbzcyrgre(grkg, fgngr):
-    tybony _ynfg_yvar
-    tybony _ynfg_erf
-    gel:
-        yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
-        vs _ynfg_yvar != yvar:
-            _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
-            _ynfg_yvar = yvar
-        (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
-        vs fgngr < yra(fhof):
-            fa = fhof[fgngr]
-            fa1 = fa.erfbyir('')  # qrers flzyvaxf
-            shyyanzr = bf.cngu.wbva(qve, fa.anzr)
-            vs fgng.F_VFQVE(fa1.zbqr):
-                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
-                                          grezvangr=Snyfr)
-            ryfr:
-                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
-                                          grezvangr=Gehr) + ' '
-            erghea grkg + erg
-    rkprcg Rkprcgvba, r:
-        ybt('\areebe va pbzcyrgvba: %f\a' % r)
-
-            
-bcgfcrp = """
-ohc sgc
-"""
-b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-gbc = isf.ErsYvfg(Abar)
-cjq = gbc
-
-vs rkgen:
-    yvarf = rkgen
-ryfr:
-    ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
-    ernqyvar.frg_pbzcyrgre(pbzcyrgre)
-    ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
-    yvarf = vachgvgre()
-
-sbe yvar va yvarf:
-    vs abg yvar.fgevc():
-        pbagvahr
-    jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
-    pzq = jbeqf[0].ybjre()
-    #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
-    gel:
-        vs pzq == 'yf':
-            sbe cnez va (jbeqf[1:] be ['.']):
-                qb_yf(cnez, cjq.erfbyir(cnez))
-        ryvs pzq == 'pq':
-            sbe cnez va jbeqf[1:]:
-                cjq = cjq.erfbyir(cnez)
-        ryvs pzq == 'cjq':
-            cevag cjq.shyyanzr()
-        ryvs pzq == 'png':
-            sbe cnez va jbeqf[1:]:
-                jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
-        ryvs pzq == 'trg':
-            vs yra(jbeqf) abg va [2,3]:
-                envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
-            eanzr = jbeqf[1]
-            (qve,onfr) = bf.cngu.fcyvg(eanzr)
-            yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
-            vas = cjq.erfbyir(eanzr).bcra()
-            ybt('Fnivat %e\a' % yanzr)
-            jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
-        ryvs pzq == 'ztrg':
-            sbe cnez va jbeqf[1:]:
-                (qve,onfr) = bf.cngu.fcyvg(cnez)
-                sbe a va cjq.erfbyir(qve).fhof():
-                    vs sazngpu.sazngpu(a.anzr, onfr):
-                        gel:
-                            ybt('Fnivat %e\a' % a.anzr)
-                            vas = a.bcra()
-                            bhgs = bcra(a.anzr, 'jo')
-                            jevgr_gb_svyr(vas, bhgs)
-                            bhgs.pybfr()
-                        rkprcg Rkprcgvba, r:
-                            ybt('  reebe: %f\a' % r)
-        ryvs pzq == 'uryc' be pzq == '?':
-            ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
-        ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
-            oernx
-        ryfr:
-            envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
-    rkprcg Rkprcgvba, r:
-        ybt('reebe: %f\a' % r)
-        #envfr
-#!/hfe/ova/rai clguba
-vzcbeg flf, zznc
-sebz ohc vzcbeg bcgvbaf, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc enaqbz [-F frrq] <ahzolgrf>
---
-F,frrq=   bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
-s,sbepr   cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
-"""
-b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-gbgny = cnefr_ahz(rkgen[0])
-
-vs bcg.sbepr be (abg bf.vfnggl(1) naq
-                 abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
-    _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
-ryfr:
-    ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc uryc <pbzznaq>
-"""
-b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) == 0:
-    # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
-    bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
-ryvs yra(rkgen) == 1:
-    qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
-    rkr = flf.neti[0]
-    (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
-    znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
-    t = tybo.tybo(znacngu)
-    vs t:
-        bf.rkrpic('zna', ['zna', '-y', t[0]])
-    ryfr:
-        bf.rkrpic('zna', ['zna', qbpanzr])
-ryfr:
-    b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
-sebz ohc vzcbeg bcgvbaf, tvg, isf
-sebz ohc.urycref vzcbeg *
-
-
-pynff Fgng(shfr.Fgng):
-    qrs __vavg__(frys):
-        frys.fg_zbqr = 0
-        frys.fg_vab = 0
-        frys.fg_qri = 0
-        frys.fg_ayvax = 0
-        frys.fg_hvq = 0
-        frys.fg_tvq = 0
-        frys.fg_fvmr = 0
-        frys.fg_ngvzr = 0
-        frys.fg_zgvzr = 0
-        frys.fg_pgvzr = 0
-        frys.fg_oybpxf = 0
-        frys.fg_oyxfvmr = 0
-        frys.fg_eqri = 0
-
-
-pnpur = {}
-qrs pnpur_trg(gbc, cngu):
-    cnegf = cngu.fcyvg('/')
-    pnpur[('',)] = gbc
-    p = Abar
-    znk = yra(cnegf)
-    #ybt('pnpur: %e\a' % pnpur.xrlf())
-    sbe v va enatr(znk):
-        cer = cnegf[:znk-v]
-        #ybt('pnpur gelvat: %e\a' % cer)
-        p = pnpur.trg(ghcyr(cer))
-        vs p:
-            erfg = cnegf[znk-v:]
-            sbe e va erfg:
-                #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
-                p = p.yerfbyir(e)
-                xrl = ghcyr(cer + [e])
-                #ybt('fnivat: %e\a' % (xrl,))
-                pnpur[xrl] = p
-            oernx
-    nffreg(p)
-    erghea p
-        
-    
-
-pynff OhcSf(shfr.Shfr):
-    qrs __vavg__(frys, gbc):
-        shfr.Shfr.__vavg__(frys)
-        frys.gbc = gbc
-    
-    qrs trgngge(frys, cngu):
-        ybt('--trgngge(%e)\a' % cngu)
-        gel:
-            abqr = pnpur_trg(frys.gbc, cngu)
-            fg = Fgng()
-            fg.fg_zbqr = abqr.zbqr
-            fg.fg_ayvax = abqr.ayvaxf()
-            fg.fg_fvmr = abqr.fvmr()
-            fg.fg_zgvzr = abqr.zgvzr
-            fg.fg_pgvzr = abqr.pgvzr
-            fg.fg_ngvzr = abqr.ngvzr
-            erghea fg
-        rkprcg isf.AbFhpuSvyr:
-            erghea -reeab.RABRAG
-
-    qrs ernqqve(frys, cngu, bssfrg):
-        ybt('--ernqqve(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        lvryq shfr.Qveragel('.')
-        lvryq shfr.Qveragel('..')
-        sbe fho va abqr.fhof():
-            lvryq shfr.Qveragel(fho.anzr)
-
-    qrs ernqyvax(frys, cngu):
-        ybt('--ernqyvax(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        erghea abqr.ernqyvax()
-
-    qrs bcra(frys, cngu, syntf):
-        ybt('--bcra(%e)\a' % cngu)
-        abqr = pnpur_trg(frys.gbc, cngu)
-        nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
-        vs (syntf & nppzbqr) != bf.B_EQBAYL:
-            erghea -reeab.RNPPRF
-        abqr.bcra()
-
-    qrs eryrnfr(frys, cngu, syntf):
-        ybt('--eryrnfr(%e)\a' % cngu)
-
-    qrs ernq(frys, cngu, fvmr, bssfrg):
-        ybt('--ernq(%e)\a' % cngu)
-        a = pnpur_trg(frys.gbc, cngu)
-        b = a.bcra()
-        b.frrx(bssfrg)
-        erghea b.ernq(fvmr)
-
-
-vs abg unfngge(shfr, '__irefvba__'):
-    envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
-shfr.shfr_clguba_ncv = (0, 2)
-
-
-bcgfcrp = """
-ohc shfr [-q] [-s] <zbhagcbvag>
---
-q,qroht   vapernfr qroht yriry
-s,sbertebhaq  eha va sbertebhaq
-"""
-b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs yra(rkgen) != 1:
-    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-gbc = isf.ErsYvfg(Abar)
-s = OhcSf(gbc)
-s.shfr_netf.zbhagcbvag = rkgen[0]
-vs bcg.qroht:
-    s.shfr_netf.nqq('qroht')
-vs bcg.sbertebhaq:
-    s.shfr_netf.frgzbq('sbertebhaq')
-cevag s.zhygvguernqrq
-s.zhygvguernqrq = Snyfr
-
-s.znva()
-#!/hfe/ova/rai clguba
-sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-
-vs bcg.erzbgr:
-    tvg.vavg_ercb()  # ybpny ercb
-    tvg.purpx_ercb_be_qvr()
-    pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
-    pyv.pybfr()
-ryfr:
-    tvg.vavg_ercb()
-#!/hfe/ova/rai clguba
-vzcbeg flf, zngu, fgehpg, tybo
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-CNTR_FVMR=4096
-FUN_CRE_CNTR=CNTR_FVMR/200.
-
-
-qrs zretr(vqkyvfg, ovgf, gnoyr):
-    pbhag = 0
-    sbe r va tvg.vqkzretr(vqkyvfg):
-        pbhag += 1
-        cersvk = tvg.rkgenpg_ovgf(r, ovgf)
-        gnoyr[cersvk] = pbhag
-        lvryq r
-
-
-qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
-    vs abg bhgsvyranzr:
-        nffreg(bhgqve)
-        fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
-        bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
-    
-    vac = []
-    gbgny = 0
-    sbe anzr va vasvyranzrf:
-        vk = tvg.CnpxVqk(anzr)
-        vac.nccraq(vk)
-        gbgny += yra(vk)
-
-    ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
-    vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
-       be (bcg.sbepr naq abg gbgny):
-        ybt('zvqk: abguvat gb qb.\a')
-        erghea
-
-    cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
-    ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
-    ragevrf = 2**ovgf
-    ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
-    
-    gnoyr = [0]*ragevrf
-
-    gel:
-        bf.hayvax(bhgsvyranzr)
-    rkprcg BFReebe:
-        cnff
-    s = bcra(bhgsvyranzr + '.gzc', 'j+')
-    s.jevgr('ZVQK\0\0\0\2')
-    s.jevgr(fgehpg.cnpx('!V', ovgf))
-    nffreg(s.gryy() == 12)
-    s.jevgr('\0'*4*ragevrf)
-    
-    sbe r va zretr(vac, ovgf, gnoyr):
-        s.jevgr(r)
-        
-    s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
-
-    s.frrx(12)
-    s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
-    s.pybfr()
-    bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
-
-    # guvf vf whfg sbe grfgvat
-    vs 0:
-        c = tvg.CnpxZvqk(bhgsvyranzr)
-        nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
-        cevag c.vqkanzrf
-        nffreg(yra(c) == gbgny)
-        cv = vgre(c)
-        sbe v va zretr(vac, gbgny, ovgf, gnoyr):
-            nffreg(v == cv.arkg())
-            nffreg(c.rkvfgf(v))
-
-    cevag bhgsvyranzr
-
-bcgfcrp = """
-ohc zvqk [bcgvbaf...] <vqkanzrf...>
---
-b,bhgchg=  bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
-n,nhgb     nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
-s,sbepr    nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen naq (bcg.nhgb be bcg.sbepr):
-    b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
-
-tvg.purpx_ercb_be_qvr()
-
-vs rkgen:
-    qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
-ryvs bcg.nhgb be bcg.sbepr:
-    cnguf = [tvg.ercb('bowrpgf/cnpx')]
-    cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
-    sbe cngu va cnguf:
-        ybt('zvqk: fpnaavat %f\a' % cngu)
-        vs bcg.sbepr:
-            qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
-        ryvs bcg.nhgb:
-            z = tvg.CnpxVqkYvfg(cngu)
-            arrqrq = {}
-            sbe cnpx va z.cnpxf:  # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
-                vs cnpx.anzr.raqfjvgu('.vqk'):
-                    arrqrq[cnpx.anzr] = 1
-            qry z
-            qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
-        ybt('\a')
-ryfr:
-    b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, enaqbz
-sebz ohc vzcbeg bcgvbaf
-sebz ohc.urycref vzcbeg *
-
-
-qrs enaqoybpx(a):
-    y = []
-    sbe v va kenatr(a):
-        y.nccraq(pue(enaqbz.enaqenatr(0,256)))
-    erghea ''.wbva(y)
-
-
-bcgfcrp = """
-ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
---
-   JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
-a,ahz=   ahzore bs oybpxf gb qnzntr
-f,fvmr=  znkvzhz fvmr bs rnpu qnzntrq oybpx
-creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
-rdhny    fcernq qnzntr rirayl guebhtubhg gur svyr
-F,frrq=  enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
-"""
-b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg rkgen:
-    b.sngny('svyranzrf rkcrpgrq')
-
-vs bcg.frrq != Abar:
-    enaqbz.frrq(bcg.frrq)
-
-sbe anzr va rkgen:
-    ybt('Qnzntvat "%f"...\a' % anzr)
-    s = bcra(anzr, 'e+o')
-    fg = bf.sfgng(s.svyrab())
-    fvmr = fg.fg_fvmr
-    vs bcg.creprag be bcg.fvmr:
-        zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
-        zf2 = bcg.fvmr be fvmr
-        znkfvmr = zva(zf1, zf2)
-    ryfr:
-        znkfvmr = 1
-    puhaxf = bcg.ahz be 10
-    puhaxfvmr = fvmr/puhaxf
-    sbe e va enatr(puhaxf):
-        fm = enaqbz.enaqenatr(1, znkfvmr+1)
-        vs fm > fvmr:
-            fm = fvmr
-        vs bcg.rdhny:
-            bsf = e*puhaxfvmr
-        ryfr:
-            bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
-        ybt('  %6q olgrf ng %q\a' % (fm, bsf))
-        s.frrx(bsf)
-        s.jevgr(enaqoybpx(fm))
-    s.pybfr()
-#!/hfe/ova/rai clguba
-vzcbeg flf, fgehpg, zznc
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-fhfcraqrq_j = Abar
-
-
-qrs vavg_qve(pbaa, net):
-    tvg.vavg_ercb(net)
-    ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
-    pbaa.bx()
-
-
-qrs frg_qve(pbaa, net):
-    tvg.purpx_ercb_be_qvr(net)
-    ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
-    pbaa.bx()
-
-    
-qrs yvfg_vaqrkrf(pbaa, whax):
-    tvg.purpx_ercb_be_qvr()
-    sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
-        vs s.raqfjvgu('.vqk'):
-            pbaa.jevgr('%f\a' % s)
-    pbaa.bx()
-
-
-qrs fraq_vaqrk(pbaa, anzr):
-    tvg.purpx_ercb_be_qvr()
-    nffreg(anzr.svaq('/') < 0)
-    nffreg(anzr.raqfjvgu('.vqk'))
-    vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
-    pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
-    pbaa.jevgr(vqk.znc)
-    pbaa.bx()
-
-
-qrs erprvir_bowrpgf(pbaa, whax):
-    tybony fhfcraqrq_j
-    tvg.purpx_ercb_be_qvr()
-    fhttrfgrq = {}
-    vs fhfcraqrq_j:
-        j = fhfcraqrq_j
-        fhfcraqrq_j = Abar
-    ryfr:
-        j = tvg.CnpxJevgre()
-    juvyr 1:
-        af = pbaa.ernq(4)
-        vs abg af:
-            j.nobeg()
-            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
-        a = fgehpg.hacnpx('!V', af)[0]
-        #ybt('rkcrpgvat %q olgrf\a' % a)
-        vs abg a:
-            ybt('ohc freire: erprvirq %q bowrpg%f.\a' 
-                % (j.pbhag, j.pbhag!=1 naq "f" be ''))
-            shyycngu = j.pybfr()
-            vs shyycngu:
-                (qve, anzr) = bf.cngu.fcyvg(shyycngu)
-                pbaa.jevgr('%f.vqk\a' % anzr)
-            pbaa.bx()
-            erghea
-        ryvs a == 0kssssssss:
-            ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
-            fhfcraqrq_j = j
-            pbaa.bx()
-            erghea
-            
-        ohs = pbaa.ernq(a)  # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
-        #ybt('ernq %q olgrf\a' % a)
-        vs yra(ohs) < a:
-            j.nobeg()
-            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
-                            % (a, yra(ohs)))
-        (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
-        fun = tvg.pnyp_unfu(glcr, pbagrag)
-        byqcnpx = j.rkvfgf(fun)
-        # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
-        # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
-        # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
-        # ba gur freire fvqr.
-        vs abg fhttrfgrq naq \
-          byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
-            # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
-            # ng guvf ynlre.  Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
-            # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
-            # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
-            # znxr gur svyrf ovttre.  Guvf zrgubq vf pregnvayl abg irel
-            # rssvpvrag.
-            j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
-            byqcnpx = j.bowpnpur.rkvfgf(fun)
-            ybt('arj fhttrfgvba: %e\a' % byqcnpx)
-            nffreg(byqcnpx)
-            nffreg(byqcnpx != Gehr)
-            nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
-            j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
-        vs abg fhttrfgrq naq byqcnpx:
-            nffreg(byqcnpx.raqfjvgu('.vqk'))
-            (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
-            vs abg (anzr va fhttrfgrq):
-                ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
-                pbaa.jevgr('vaqrk %f\a' % anzr)
-                fhttrfgrq[anzr] = 1
-        ryfr:
-            j._enj_jevgr([ohs])
-    # ABGERNPURQ
-
-
-qrs ernq_ers(pbaa, ersanzr):
-    tvg.purpx_ercb_be_qvr()
-    e = tvg.ernq_ers(ersanzr)
-    pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
-    pbaa.bx()
-
-
-qrs hcqngr_ers(pbaa, ersanzr):
-    tvg.purpx_ercb_be_qvr()
-    arjiny = pbaa.ernqyvar().fgevc()
-    byqiny = pbaa.ernqyvar().fgevc()
-    tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
-    pbaa.bx()
-
-
-qrs png(pbaa, vq):
-    tvg.purpx_ercb_be_qvr()
-    gel:
-        sbe oybo va tvg.png(vq):
-            pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
-            pbaa.jevgr(oybo)
-    rkprcg XrlReebe, r:
-        ybt('freire: reebe: %f\a' % r)
-        pbaa.jevgr('\0\0\0\0')
-        pbaa.reebe(r)
-    ryfr:
-        pbaa.jevgr('\0\0\0\0')
-        pbaa.bx()
-
-
-bcgfcrp = """
-ohc freire
-"""
-b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-ybt('ohc freire: ernqvat sebz fgqva.\a')
-
-pbzznaqf = {
-    'vavg-qve': vavg_qve,
-    'frg-qve': frg_qve,
-    'yvfg-vaqrkrf': yvfg_vaqrkrf,
-    'fraq-vaqrk': fraq_vaqrk,
-    'erprvir-bowrpgf': erprvir_bowrpgf,
-    'ernq-ers': ernq_ers,
-    'hcqngr-ers': hcqngr_ers,
-    'png': png,
-}
-
-# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
-# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
-pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
-ye = yvarernqre(pbaa)
-sbe _yvar va ye:
-    yvar = _yvar.fgevc()
-    vs abg yvar:
-        pbagvahr
-    ybt('ohc freire: pbzznaq: %e\a' % yvar)
-    jbeqf = yvar.fcyvg(' ', 1)
-    pzq = jbeqf[0]
-    erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
-    vs pzq == 'dhvg':
-        oernx
-    ryfr:
-        pzq = pbzznaqf.trg(pzq)
-        vs pzq:
-            pzq(pbaa, erfg)
-        ryfr:
-            envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
-
-ybt('ohc freire: qbar\a')
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr, fgehpg
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
-sebz ohc.urycref vzcbeg *
-sebz fhocebprff vzcbeg CVCR
-
-
-bcgfcrp = """
-ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-"""
-b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
-    rkgen = yvarernqre(flf.fgqva)
-
-erg = 0
-
-vs bcg.erzbgr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    png = pyv.png
-ryfr:
-    pc = tvg.PngCvcr()
-    png = pc.wbva
-
-sbe vq va rkgen:
-    gel:
-        sbe oybo va png(vq):
-            flf.fgqbhg.jevgr(oybo)
-    rkprcg XrlReebe, r:
-        flf.fgqbhg.syhfu()
-        ybt('reebe: %f\a' % r)
-        erg = 1
-
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, er, reeab, fgng, gvzr, zngu
-sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc fnir [-gp] [-a anzr] <svyranzrf...>
---
-e,erzbgr=  erzbgr ercbfvgbel cngu
-g,gerr     bhgchg n gerr vq
-p,pbzzvg   bhgchg n pbzzvg vq
-a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-d,dhvrg    qba'g fubj cebterff zrgre
-fznyyre=   bayl onpx hc svyrf fznyyre guna a olgrf
-"""
-b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-tvg.purpx_ercb_be_qvr()
-vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
-    b.sngny("hfr bar be zber bs -g, -p, -a")
-vs abg rkgen:
-    b.sngny("ab svyranzrf tvira")
-
-bcg.cebterff = (vfggl naq abg bcg.dhvrg)
-bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
-
-vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
-vs vf_erirefr naq bcg.erzbgr:
-    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
-
-ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
-vs bcg.erzbgr be vf_erirefr:
-    pyv = pyvrag.Pyvrag(bcg.erzbgr)
-    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
-    j = pyv.arj_cnpxjevgre()
-ryfr:
-    pyv = Abar
-    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
-    j = tvg.CnpxJevgre()
-
-unaqyr_pgey_p()
-
-
-qrs rngfynfu(qve):
-    vs qve.raqfjvgu('/'):
-        erghea qve[:-1]
-    ryfr:
-        erghea qve
-
-
-cnegf = ['']
-funyvfgf = [[]]
-
-qrs _chfu(cneg):
-    nffreg(cneg)
-    cnegf.nccraq(cneg)
-    funyvfgf.nccraq([])
-
-qrs _cbc(sbepr_gerr):
-    nffreg(yra(cnegf) >= 1)
-    cneg = cnegf.cbc()
-    funyvfg = funyvfgf.cbc()
-    gerr = sbepr_gerr be j.arj_gerr(funyvfg)
-    vs funyvfgf:
-        funyvfgf[-1].nccraq(('40000', cneg, gerr))
-    ryfr:  # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
-        funyvfgf.nccraq(funyvfg)
-    erghea gerr
-
-ynfgerznva = Abar
-qrs cebterff_ercbeg(a):
-    tybony pbhag, fhopbhag, ynfgerznva
-    fhopbhag += a
-    pp = pbhag + fhopbhag
-    cpg = gbgny naq (pp*100.0/gbgny) be 0
-    abj = gvzr.gvzr()
-    ryncfrq = abj - gfgneg
-    xcf = ryncfrq naq vag(pp/1024./ryncfrq)
-    xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
-    xcf = vag(xcf/xcf_senp)*xcf_senp
-    vs pp:
-        erznva = ryncfrq*1.0/pp * (gbgny-pp)
-    ryfr:
-        erznva = 0.0
-    vs (ynfgerznva naq (erznva > ynfgerznva)
-          naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
-        erznva = ynfgerznva
-    ryfr:
-        ynfgerznva = erznva
-    ubhef = vag(erznva/60/60)
-    zvaf = vag(erznva/60 - ubhef*60)
-    frpf = vag(erznva - ubhef*60*60 - zvaf*60)
-    vs ryncfrq < 30:
-        erznvafge = ''
-        xcffge = ''
-    ryfr:
-        xcffge = '%qx/f' % xcf
-        vs ubhef:
-            erznvafge = '%qu%qz' % (ubhef, zvaf)
-        ryvs zvaf:
-            erznvafge = '%qz%q' % (zvaf, frpf)
-        ryfr:
-            erznvafge = '%qf' % frpf
-    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
-             % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
-                erznvafge, xcffge))
-
-
-e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
-
-qrs nyernql_fnirq(rag):
-    erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
-
-qrs jnagerphefr_cer(rag):
-    erghea abg nyernql_fnirq(rag)
-
-qrs jnagerphefr_qhevat(rag):
-    erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
-
-gbgny = sgbgny = 0
-vs bcg.cebterff:
-    sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
-        vs abg (sgbgny % 10024):
-            cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
-        rkvfgf = rag.rkvfgf()
-        unfuinyvq = nyernql_fnirq(rag)
-        rag.frg_fun_zvffvat(abg unfuinyvq)
-        vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
-            vs rkvfgf naq abg unfuinyvq:
-                gbgny += rag.fvmr
-        sgbgny += 1
-    cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
-    unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
-
-gfgneg = gvzr.gvzr()
-pbhag = fhopbhag = spbhag = 0
-ynfgfxvc_anzr = Abar
-ynfgqve = ''
-sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
-    (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
-    rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
-    unfuinyvq = nyernql_fnirq(rag)
-    jnfzvffvat = rag.fun_zvffvat()
-    byqfvmr = rag.fvmr
-    vs bcg.ireobfr:
-        vs abg rkvfgf:
-            fgnghf = 'Q'
-        ryvs abg unfuinyvq:
-            vs rag.fun == vaqrk.RZCGL_FUN:
-                fgnghf = 'N'
-            ryfr:
-                fgnghf = 'Z'
-        ryfr:
-            fgnghf = ' '
-        vs bcg.ireobfr >= 2:
-            ybt('%f %-70f\a' % (fgnghf, rag.anzr))
-        ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
-            vs abg ynfgqve.fgnegfjvgu(qve):
-                ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
-            ynfgqve = qve
-
-    vs bcg.cebterff:
-        cebterff_ercbeg(0)
-    spbhag += 1
-    
-    vs abg rkvfgf:
-        pbagvahr
-    vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
-        vs rkvfgf naq abg unfuinyvq:
-            nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
-            ynfgfxvc_anzr = rag.anzr
-        pbagvahr
-
-    nffreg(qve.fgnegfjvgu('/'))
-    qvec = qve.fcyvg('/')
-    juvyr cnegf > qvec:
-        _cbc(sbepr_gerr = Abar)
-    vs qve != '/':
-        sbe cneg va qvec[yra(cnegf):]:
-            _chfu(cneg)
-
-    vs abg svyr:
-        # ab svyranzr cbegvba zrnaf guvf vf n fhoqve.  Ohg
-        # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
-        byqgerr = nyernql_fnirq(rag) # znl or Abar
-        arjgerr = _cbc(sbepr_gerr = byqgerr)
-        vs abg byqgerr:
-            vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
-                rag.vainyvqngr()
-            ryfr:
-                rag.inyvqngr(040000, arjgerr)
-            rag.ercnpx()
-        vs rkvfgf naq jnfzvffvat:
-            pbhag += byqfvmr
-        pbagvahr
-
-    # vg'f abg n qverpgbel
-    vq = Abar
-    vs unfuinyvq:
-        zbqr = '%b' % rag.tvgzbqr
-        vq = rag.fun
-        funyvfgf[-1].nccraq((zbqr, 
-                             tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
-                             vq))
-    ryfr:
-        vs fgng.F_VFERT(rag.zbqr):
-            gel:
-                s = unfufcyvg.bcra_abngvzr(rag.anzr)
-            rkprcg VBReebe, r:
-                nqq_reebe(r)
-                ynfgfxvc_anzr = rag.anzr
-            rkprcg BFReebe, r:
-                nqq_reebe(r)
-                ynfgfxvc_anzr = rag.anzr
-            ryfr:
-                (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
-        ryfr:
-            vs fgng.F_VFQVE(rag.zbqr):
-                nffreg(0)  # unaqyrq nobir
-            ryvs fgng.F_VFYAX(rag.zbqr):
-                gel:
-                    ey = bf.ernqyvax(rag.anzr)
-                rkprcg BFReebe, r:
-                    nqq_reebe(r)
-                    ynfgfxvc_anzr = rag.anzr
-                rkprcg VBReebe, r:
-                    nqq_reebe(r)
-                    ynfgfxvc_anzr = rag.anzr
-                ryfr:
-                    (zbqr, vq) = ('120000', j.arj_oybo(ey))
-            ryfr:
-                nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
-                ynfgfxvc_anzr = rag.anzr
-        vs vq:
-            rag.inyvqngr(vag(zbqr, 8), vq)
-            rag.ercnpx()
-            funyvfgf[-1].nccraq((zbqr,
-                                 tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
-                                 vq))
-    vs rkvfgf naq jnfzvffvat:
-        pbhag += byqfvmr
-        fhopbhag = 0
-
-
-vs bcg.cebterff:
-    cpg = gbgny naq pbhag*100.0/gbgny be 100
-    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar.    \a'
-             % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
-
-juvyr yra(cnegf) > 1:
-    _cbc(sbepr_gerr = Abar)
-nffreg(yra(funyvfgf) == 1)
-gerr = j.arj_gerr(funyvfgf[-1])
-vs bcg.gerr:
-    cevag gerr.rapbqr('urk')
-vs bcg.pbzzvg be bcg.anzr:
-    zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
-    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
-    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
-    vs bcg.pbzzvg:
-        cevag pbzzvg.rapbqr('urk')
-
-j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
-        
-vs bcg.anzr:
-    vs pyv:
-        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
-    ryfr:
-        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
-
-vs pyv:
-    pyv.pybfr()
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, gvzr
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc gvpx
-"""
-b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-g = gvzr.gvzr()
-gyrsg = 1 - (g - vag(g))
-gvzr.fyrrc(gyrsg)
-#!/hfe/ova/rai clguba
-vzcbeg bf, flf, fgng, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
-sebz ohc.urycref vzcbeg *
-
-
-qrs zretr_vaqrkrf(bhg, e1, e2):
-    sbe r va vaqrk.ZretrVgre([e1, e2]):
-        # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl?  Jura?
-        bhg.nqq_vkragel(r)
-
-
-pynff VgreUrycre:
-    qrs __vavg__(frys, y):
-        frys.v = vgre(y)
-        frys.phe = Abar
-        frys.arkg()
-
-    qrs arkg(frys):
-        gel:
-            frys.phe = frys.v.arkg()
-        rkprcg FgbcVgrengvba:
-            frys.phe = Abar
-        erghea frys.phe
-
-
-qrs purpx_vaqrk(ernqre):
-    gel:
-        ybt('purpx: purpxvat sbejneq vgrengvba...\a')
-        r = Abar
-        q = {}
-        sbe r va ernqre.sbejneq_vgre():
-            vs r.puvyqera_a:
-                vs bcg.ireobfr:
-                    ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
-                                            r.anzr))
-                nffreg(r.puvyqera_bsf)
-                nffreg(r.anzr.raqfjvgu('/'))
-                nffreg(abg q.trg(r.puvyqera_bsf))
-                q[r.puvyqera_bsf] = 1
-            vs r.syntf & vaqrk.VK_UNFUINYVQ:
-                nffreg(r.fun != vaqrk.RZCGL_FUN)
-                nffreg(r.tvgzbqr)
-        nffreg(abg r be r.anzr == '/')  # ynfg ragel vf *nyjnlf* /
-        ybt('purpx: purpxvat abezny vgrengvba...\a')
-        ynfg = Abar
-        sbe r va ernqre:
-            vs ynfg:
-                nffreg(ynfg > r.anzr)
-            ynfg = r.anzr
-    rkprcg:
-        ybt('vaqrk reebe! ng %e\a' % r)
-        envfr
-    ybt('purpx: cnffrq.\a')
-
-
-qrs hcqngr_vaqrk(gbc):
-    ev = vaqrk.Ernqre(vaqrksvyr)
-    jv = vaqrk.Jevgre(vaqrksvyr)
-    evt = VgreUrycre(ev.vgre(anzr=gbc))
-    gfgneg = vag(gvzr.gvzr())
-
-    unfutra = Abar
-    vs bcg.snxr_inyvq:
-        qrs unfutra(anzr):
-            erghea (0100644, vaqrk.SNXR_FUN)
-
-    gbgny = 0
-    sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
-        vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
-            flf.fgqbhg.jevgr('%f\a' % cngu)
-            flf.fgqbhg.syhfu()
-            cebterff('Vaqrkvat: %q\e' % gbgny)
-        ryvs abg (gbgny % 128):
-            cebterff('Vaqrkvat: %q\e' % gbgny)
-        gbgny += 1
-        juvyr evt.phe naq evt.phe.anzr > cngu:  # qryrgrq cnguf
-            vs evt.phe.rkvfgf():
-                evt.phe.frg_qryrgrq()
-                evt.phe.ercnpx()
-            evt.arkg()
-        vs evt.phe naq evt.phe.anzr == cngu:    # cnguf gung nyernql rkvfgrq
-            vs cfg:
-                evt.phe.sebz_fgng(cfg, gfgneg)
-            vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
-                vs unfutra:
-                    (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
-                    evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
-            vs bcg.snxr_vainyvq:
-                evt.phe.vainyvqngr()
-            evt.phe.ercnpx()
-            evt.arkg()
-        ryfr:  # arj cnguf
-            jv.nqq(cngu, cfg, unfutra = unfutra)
-    cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
-    
-    vs ev.rkvfgf():
-        ev.fnir()
-        jv.syhfu()
-        vs jv.pbhag:
-            je = jv.arj_ernqre()
-            vs bcg.purpx:
-                ybt('purpx: orsber zretvat: byqsvyr\a')
-                purpx_vaqrk(ev)
-                ybt('purpx: orsber zretvat: arjsvyr\a')
-                purpx_vaqrk(je)
-            zv = vaqrk.Jevgre(vaqrksvyr)
-            zretr_vaqrkrf(zv, ev, je)
-            ev.pybfr()
-            zv.pybfr()
-            je.pybfr()
-        jv.nobeg()
-    ryfr:
-        jv.pybfr()
-
-
-bcgfcrp = """
-ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
---
-c,cevag    cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
-z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
-f,fgnghf   cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
-U,unfu     cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
-y,ybat     cevag zber vasbezngvba nobhg rnpu svyr
-h,hcqngr   (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
-k,kqri,bar-svyr-flfgrz  qba'g pebff svyrflfgrz obhaqnevrf
-snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
-snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
-purpx      pnershyyl purpx vaqrk svyr vagrtevgl
-s,vaqrksvyr=  gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
-i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
-"""
-b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
-    b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
-vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
-    b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
-vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
-    b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
-
-tvg.purpx_ercb_be_qvr()
-vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
-
-unaqyr_pgey_p()
-
-vs bcg.purpx:
-    ybt('purpx: fgnegvat vavgvny purpx.\a')
-    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-cnguf = vaqrk.erqhpr_cnguf(rkgen)
-
-vs bcg.hcqngr:
-    vs abg cnguf:
-        b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
-    sbe (ec,cngu) va cnguf:
-        hcqngr_vaqrk(ec)
-
-vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
-    sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
-        vs (bcg.zbqvsvrq 
-            naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
-            pbagvahr
-        yvar = ''
-        vs bcg.fgnghf:
-            vs rag.vf_qryrgrq():
-                yvar += 'Q '
-            ryvs abg rag.vf_inyvq():
-                vs rag.fun == vaqrk.RZCGL_FUN:
-                    yvar += 'N '
-                ryfr:
-                    yvar += 'Z '
-            ryfr:
-                yvar += '  '
-        vs bcg.unfu:
-            yvar += rag.fun.rapbqr('urk') + ' '
-        vs bcg.ybat:
-            yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
-        cevag yvar + (anzr be './')
-
-vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
-    ybt('purpx: fgnegvat svany purpx.\a')
-    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
-
-vs fnirq_reebef:
-    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
-    flf.rkvg(1)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg
-sebz ohc vzcbeg bcgvbaf, urycref
-
-bcgfcrp = """
-ohc eonpxhc-freire
---
-    Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs rkgen:
-    b.sngny('ab nethzragf rkcrpgrq')
-
-# trg gur fhopbzznaq'f neti.
-# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
-# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
-# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
-ohs = flf.fgqva.ernq(4)
-fm = fgehpg.hacnpx('!V', ohs)[0]
-nffreg(fm > 0)
-nffreg(fm < 1000000)
-ohs = flf.fgqva.ernq(fm)
-nffreg(yra(ohs) == fm)
-neti = ohs.fcyvg('\0')
-
-# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
-# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
-# gb zvfhfr gurz.  Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
-# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
-#
-# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
-# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
-# fbpxrg.  Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
-# bs vg, ohg cebonoyl qvqa'g.  Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
-# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
-#
-# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
-# qrfpevcgbef.  Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
-# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
-bf.qhc2(0, 3)
-bf.qhc2(1, 4)
-bf.qhc2(2, 1)
-sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
-bf.qhc2(sq, 0)
-bf.pybfr(sq)
-
-bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
-bf.rkrpic(neti[0], neti)
-flf.rkvg(99)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, tybo, fhocebprff, gvzr
-sebz ohc vzcbeg bcgvbaf, tvg
-sebz ohc.urycref vzcbeg *
-
-cne2_bx = 0
-ahyys = bcra('/qri/ahyy')
-
-qrs qroht(f):
-    vs bcg.ireobfr:
-        ybt(f)
-
-qrs eha(neti):
-    # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
-    # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
-    # rkrpvat sbe fbzr ernfba.  Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
-    # svefg.
-    sq = bf.qhc(2)  # pbcl fgqree
-    gel:
-        c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
-        erghea c.jnvg()
-    svanyyl:
-        bf.pybfr(sq)
-
-qrs cne2_frghc():
-    tybony cne2_bx
-    ei = 1
-    gel:
-        c = fhocebprff.Cbcra(['cne2', '--uryc'],
-                             fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
-        ei = c.jnvg()
-    rkprcg BFReebe:
-        ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
-    ryfr:
-        cne2_bx = 1
-
-qrs cnei(yiy):
-    vs bcg.ireobfr >= yiy:
-        vs vfggl:
-            erghea []
-        ryfr:
-            erghea ['-d']
-    ryfr:
-        erghea ['-dd']
-
-qrs cne2_trarengr(onfr):
-    erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
-               + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
-
-qrs cne2_irevsl(onfr):
-    erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
-
-qrs cne2_ercnve(onfr):
-    erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
-
-qrs dhvpx_irevsl(onfr):
-    s = bcra(onfr + '.cnpx', 'eo')
-    s.frrx(-20, 2)
-    jnagfhz = s.ernq(20)
-    nffreg(yra(jnagfhz) == 20)
-    s.frrx(0)
-    fhz = Fun1()
-    sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
-        fhz.hcqngr(o)
-    vs fhz.qvtrfg() != jnagfhz:
-        envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
-                                                  fhz.urkqvtrfg()))
-        
-
-qrs tvg_irevsl(onfr):
-    vs bcg.dhvpx:
-        gel:
-            dhvpx_irevsl(onfr)
-        rkprcg Rkprcgvba, r:
-            qroht('reebe: %f\a' % r)
-            erghea 1
-        erghea 0
-    ryfr:
-        erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
-    
-    
-qrs qb_cnpx(onfr, ynfg):
-    pbqr = 0
-    vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
-        ierfhyg = cne2_irevsl(onfr)
-        vs ierfhyg != 0:
-            vs bcg.ercnve:
-                eerfhyg = cne2_ercnve(onfr)
-                vs eerfhyg != 0:
-                    cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
-                    pbqr = eerfhyg
-                ryfr:
-                    cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
-                    pbqr = 100
-            ryfr:
-                cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
-                pbqr = ierfhyg
-        ryfr:
-            cevag '%f bx' % ynfg
-    ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
-        terfhyg = tvg_irevsl(onfr)
-        vs terfhyg != 0:
-            cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
-            pbqr = terfhyg
-        ryfr:
-            vs cne2_bx naq bcg.trarengr:
-                cerfhyg = cne2_trarengr(onfr)
-                vs cerfhyg != 0:
-                    cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
-                    pbqr = cerfhyg
-                ryfr:
-                    cevag '%f bx' % ynfg
-            ryfr:
-                cevag '%f bx' % ynfg
-    ryfr:
-        nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
-        qroht('    fxvccrq: cne2 svyr nyernql trarengrq.\a')
-    erghea pbqr
-
-
-bcgfcrp = """
-ohc sfpx [bcgvbaf...] [svyranzrf...]
---
-e,ercnve    nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
-t,trarengr  trarengr nhgb-ercnve vasbezngvba hfvat cne2
-i,ireobfr   vapernfr ireobfvgl (pna or hfrq zber guna bapr)
-dhvpx       whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
-w,wbof=     eha 'a' wbof va cnenyyry
-cne2-bx     vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
-qvfnoyr-cne2  vtaber cne2 rira vs vg vf ninvynoyr
-"""
-b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-cne2_frghc()
-vs bcg.cne2_bx:
-    vs cne2_bx:
-        flf.rkvg(0)  # 'gehr' va fu
-    ryfr:
-        flf.rkvg(1)
-vs bcg.qvfnoyr_cne2:
-    cne2_bx = 0
-
-tvg.purpx_ercb_be_qvr()
-
-vs abg rkgen:
-    qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
-    rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
-
-pbqr = 0
-pbhag = 0
-bhgfgnaqvat = {}
-sbe anzr va rkgen:
-    vs anzr.raqfjvgu('.cnpx'):
-        onfr = anzr[:-5]
-    ryvs anzr.raqfjvgu('.vqk'):
-        onfr = anzr[:-4]
-    ryvs anzr.raqfjvgu('.cne2'):
-        onfr = anzr[:-5]
-    ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
-        onfr = anzr
-    ryfr:
-        envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
-    (qve,ynfg) = bf.cngu.fcyvg(onfr)
-    cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
-    vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
-        cne2_rkvfgf = 0
-    flf.fgqbhg.syhfu()
-    qroht('sfpx: purpxvat %f (%f)\a' 
-          % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
-    vs abg bcg.ireobfr:
-        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-    
-    vs abg bcg.wbof:
-        ap = qb_cnpx(onfr, ynfg)
-        pbqr = pbqr be ap
-        pbhag += 1
-    ryfr:
-        juvyr yra(bhgfgnaqvat) >= bcg.wbof:
-            (cvq,ap) = bf.jnvg()
-            ap >>= 8
-            vs cvq va bhgfgnaqvat:
-                qry bhgfgnaqvat[cvq]
-                pbqr = pbqr be ap
-                pbhag += 1
-        cvq = bf.sbex()
-        vs cvq:  # cnerag
-            bhgfgnaqvat[cvq] = 1
-        ryfr: # puvyq
-            gel:
-                flf.rkvg(qb_cnpx(onfr, ynfg))
-            rkprcg Rkprcgvba, r:
-                ybt('rkprcgvba: %e\a' % r)
-                flf.rkvg(99)
-                
-juvyr yra(bhgfgnaqvat):
-    (cvq,ap) = bf.jnvg()
-    ap >>= 8
-    vs cvq va bhgfgnaqvat:
-        qry bhgfgnaqvat[cvq]
-        pbqr = pbqr be ap
-        pbhag += 1
-    vs abg bcg.ireobfr:
-        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
-
-vs abg bcg.ireobfr naq vfggl:
-    ybt('sfpx qbar.           \a')
-flf.rkvg(pbqr)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
-sebz ohc vzcbeg bcgvbaf, ffu
-sebz ohc.urycref vzcbeg *
-
-bcgfcrp = """
-ohc eonpxhc <ubfganzr> vaqrk ...
-ohc eonpxhc <ubfganzr> fnir ...
-ohc eonpxhc <ubfganzr> fcyvg ...
-"""
-b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-vs yra(rkgen) < 2:
-    b.sngny('nethzragf rkcrpgrq')
-
-pynff FvtRkprcgvba(Rkprcgvba):
-    qrs __vavg__(frys, fvtahz):
-        frys.fvtahz = fvtahz
-        Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
-qrs unaqyre(fvtahz, senzr):
-    envfr FvtRkprcgvba(fvtahz)
-
-fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
-fvtany.fvtany(fvtany.FVTVAG, unaqyre)
-
-fc = Abar
-c = Abar
-erg = 99
-
-gel:
-    ubfganzr = rkgen[0]
-    neti = rkgen[1:]
-    c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
-
-    netif = '\0'.wbva(['ohc'] + neti)
-    c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
-    c.fgqva.syhfu()
-
-    znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
-    fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
-
-    c.fgqva.pybfr()
-    c.fgqbhg.pybfr()
-
-svanyyl:
-    juvyr 1:
-        # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
-        # va pnfr bhe puvyq qbrfa'g qvr.
-        gel:
-            erg = c.jnvg()
-            fc.jnvg()
-            oernx
-        rkprcg FvtRkprcgvba, r:
-            ybt('\aohc eonpxhc: %f\a' % r)
-            bf.xvyy(c.cvq, r.fvtahz)
-            erg = 84
-flf.rkvg(erg)
-#!/hfe/ova/rai clguba
-vzcbeg flf, bf, er
-sebz ohc vzcbeg bcgvbaf
-
-bcgfcrp = """
-ohc arjyvare
-"""
-b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-e = er.pbzcvyr(e'([\e\a])')
-ynfgyra = 0
-nyy = ''
-juvyr 1:
-    y = e.fcyvg(nyy, 1)
-    vs yra(y) <= 1:
-        gel:
-            o = bf.ernq(flf.fgqva.svyrab(), 4096)
-        rkprcg XrlobneqVagreehcg:
-            oernx
-        vs abg o:
-            oernx
-        nyy += o
-    ryfr:
-        nffreg(yra(y) == 3)
-        (yvar, fcyvgpune, nyy) = y
-        #fcyvgpune = '\a'
-        flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
-        vs fcyvgpune == '\e':
-            ynfgyra = yra(yvar)
-        ryfr:
-            ynfgyra = 0
-        flf.fgqbhg.syhfu()
-
-vs ynfgyra be nyy:
-    flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
-#!/hfe/ova/rai clguba
-vzcbeg flf
-sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
-sebz ohc.urycref vzcbeg *
-
-
-bcgfcrp = """
-ohc znetva
-"""
-b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
-(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
-
-vs rkgen:
-    b.sngny("ab nethzragf rkcrpgrq")
-
-tvg.purpx_ercb_be_qvr()
-#tvg.vtaber_zvqk = 1
-
-zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
-ynfg = '\0'*20
-ybatzngpu = 0
-sbe v va zv:
-    vs v == ynfg:
-        pbagvahr
-    #nffreg(fge(v) >= ynfg)
-    cz = _unfufcyvg.ovgzngpu(ynfg, v)
-    ybatzngpu = znk(ybatzngpu, cz)
-    ynfg = v
-cevag ybatzngpu
diff --git a/t/unknown-owner b/t/unknown-owner
deleted file mode 100755 (executable)
index 937e708..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/bin/sh
-"""": # -*-python-*-
-bup_python="$(dirname "$0")/../config/bin/python" || exit $?
-exec "$bup_python" "$0" ${1+"$@"}
-"""
-# end of bup preamble
-
-from __future__ import absolute_import, print_function
-
-import grp
-import pwd
-import sys
-
-def usage():
-    print("Usage: unknown-owner (--user | --group)", file=sys.stderr)
-
-if len(sys.argv) != 2:
-    usage()
-    sys.exit(1)
-
-if sys.argv[1] == '--user':
-    max_name_len = max([len(x.pw_name) for x in pwd.getpwall()])
-elif sys.argv[1] == '--group':
-    max_name_len = max([len(x.gr_name) for x in grp.getgrall()])
-else:
-    usage()
-    sys.exit(1)
-
-print('x' * (max_name_len + 1))
diff --git a/test/__init__.py b/test/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/test/ext/bin/sort-z b/test/ext/bin/sort-z
new file mode 120000 (symlink)
index 0000000..adde19f
--- /dev/null
@@ -0,0 +1 @@
+../../../dev/sort-z
\ No newline at end of file
diff --git a/test/ext/test-argv b/test/ext/test-argv
new file mode 100755 (executable)
index 0000000..6fc3249
--- /dev/null
@@ -0,0 +1,29 @@
+#!/bin/sh
+"""": # -*-python-*-
+bup_python="$(dirname "$0")/../../config/bin/python" || exit $?
+exec "$bup_python" "$0" ${1+"$@"}
+"""
+# end of bup preamble
+
+from __future__ import absolute_import, print_function
+
+from os.path import abspath, dirname
+from random import randint
+from subprocess import check_output
+from sys import stderr, stdout
+import sys
+
+script_home = abspath(dirname(__file__))
+sys.path[:0] = [abspath(script_home + '/../../lib'), abspath(script_home + '/../..')]
+
+from wvtest import wvcheck, wvfail, wvmsg, wvpass, wvpasseq, wvpassne, wvstart
+
+wvstart('command line arguments are not mangled')
+
+def rand_bytes(n):
+    return bytes([randint(1, 255) for x in range(n)])
+
+for trial in range(100):
+    cmd = [b'dev/echo-argv-bytes', rand_bytes(randint(1, 32))]
+    out = check_output(cmd)
+    wvpasseq(b'\0\n'.join(cmd) + b'\0\n', out)
diff --git a/test/ext/test-cat-file.sh b/test/ext/test-cat-file.sh
new file mode 100755 (executable)
index 0000000..055ade0
--- /dev/null
@@ -0,0 +1,46 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS bup init
+WVPASS cd "$tmpdir"
+
+WVSTART "cat-file"
+WVPASS mkdir src
+WVPASS date > src/foo
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS bup cat-file "src/latest/$(pwd)/src/foo" > cat-foo
+WVPASS diff -u src/foo cat-foo
+
+WVSTART "cat-file --meta"
+WVPASS bup meta --create --no-paths src/foo > src-foo.meta
+WVPASS bup cat-file --meta "src/latest/$(pwd)/src/foo" > cat-foo.meta
+
+WVPASS bup meta -tvvf src-foo.meta | WVPASS grep -vE '^atime: ' > src-foo.list
+WVPASS bup meta -tvvf cat-foo.meta | WVPASS grep -vE '^atime: ' > cat-foo.list
+WVPASS diff -u src-foo.list cat-foo.list
+
+WVSTART "cat-file --bupm"
+WVPASS bup cat-file --bupm "src/latest/$(pwd)/src/" > bup-cat-bupm
+src_hash=$(WVPASS bup ls -s "src/latest/$(pwd)" | cut -d' ' -f 1) || exit $?
+bupm_hash=$(WVPASS git ls-tree "$src_hash" | grep -F .bupm | cut -d' ' -f 3) \
+    || exit $?
+bupm_hash=$(WVPASS echo "$bupm_hash" | cut -d' ' -f 1) || exit $?
+WVPASS "$top/dev/git-cat-tree" "$bupm_hash" > git-cat-bupm
+if ! cmp git-cat-bupm bup-cat-bupm; then
+    cmp -l git-cat-bupm bup-cat-bupm
+    diff -uN <(bup meta -tvvf git-cat-bupm) <(bup meta -tvvf bup-cat-bupm)
+    WVPASS cmp git-cat-bupm bup-cat-bupm
+fi
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-command-without-init-fails.sh b/test/ext/test-command-without-init-fails.sh
new file mode 100755 (executable)
index 0000000..32efe2c
--- /dev/null
@@ -0,0 +1,21 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+
+set -o pipefail
+
+WVSTART 'all'
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS mkdir "$tmpdir/foo"
+
+bup index "$tmpdir/foo" &> /dev/null
+index_rc=$?
+WVPASSEQ "$index_rc" "15"
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-compression.sh b/test/ext/test-compression.sh
new file mode 100755 (executable)
index 0000000..7ca49b4
--- /dev/null
@@ -0,0 +1,45 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+fs-size() { tar cf - "$@" | wc -c; }
+
+WVSTART "compression"
+WVPASS cd "$tmpdir"
+
+D=compression0.tmp
+WVPASS force-delete "$BUP_DIR"
+WVPASS bup init
+WVPASS mkdir $D
+WVPASS bup index "$top/Documentation"
+WVPASS bup save -n compression -0 --strip "$top/Documentation"
+# Some platforms set -A by default when root, so just use it everywhere.
+expected="$(WVPASS ls -A "$top/Documentation" | WVPASS sort)" || exit $?
+actual="$(WVPASS bup ls -A compression/latest/ | WVPASS sort)" || exit $?
+WVPASSEQ "$actual" "$expected"
+compression_0_size=$(WVPASS fs-size "$BUP_DIR") || exit $?
+
+D=compression9.tmp
+WVPASS force-delete "$BUP_DIR"
+WVPASS bup init
+WVPASS mkdir $D
+WVPASS bup index "$top/Documentation"
+WVPASS bup save -n compression -9 --strip "$top/Documentation"
+expected="$(ls -A "$top/Documentation" | sort)" || exit $?
+actual="$(bup ls -A compression/latest/ | sort)" || exit $?
+WVPASSEQ "$actual" "$expected"
+compression_9_size=$(WVPASS fs-size "$BUP_DIR") || exit $?
+
+WVPASS [ "$compression_9_size" -lt "$compression_0_size" ]
+
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-drecurse.sh b/test/ext/test-drecurse.sh
new file mode 100755 (executable)
index 0000000..1611384
--- /dev/null
@@ -0,0 +1,100 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+# These tests aren't comprehensive, but test-save-restore-excludes.sh
+# exercises some of the same code more thoroughly via index, and
+# --xdev is handled in test-xdev.sh.
+
+WVSTART "drecurse"
+WVPASS bup init
+WVPASS mkdir src src/a src/b
+WVPASS touch src/a/1 src/a/2 src/b/1 src/b/2 src/c
+(cd src && WVPASS ln -s a a-link)
+WVPASSEQ "$(bup drecurse src)" "src/c
+src/b/2
+src/b/1
+src/b/
+src/a/2
+src/a/1
+src/a/
+src/a-link
+src/"
+
+WVSTART "drecurse --exclude (file)"
+WVPASSEQ "$(bup drecurse --exclude src/b/2 src)" "src/c
+src/b/1
+src/b/
+src/a/2
+src/a/1
+src/a/
+src/a-link
+src/"
+
+WVSTART "drecurse --exclude (dir)"
+WVPASSEQ "$(bup drecurse --exclude src/b/ src)" "src/c
+src/a/2
+src/a/1
+src/a/
+src/a-link
+src/"
+
+WVSTART "drecurse --exclude (symlink)"
+WVPASSEQ "$(bup drecurse --exclude src/a-link src)" "src/c
+src/b/2
+src/b/1
+src/b/
+src/a/2
+src/a/1
+src/a/
+src/"
+
+WVSTART "drecurse --exclude (absolute path)"
+WVPASSEQ "$(bup drecurse --exclude src/b/2 "$(pwd)/src")" "$(pwd)/src/c
+$(pwd)/src/b/1
+$(pwd)/src/b/
+$(pwd)/src/a/2
+$(pwd)/src/a/1
+$(pwd)/src/a/
+$(pwd)/src/a-link
+$(pwd)/src/"
+
+WVSTART "drecurse --exclude-from"
+WVPASS echo "src/b" > exclude-list
+WVPASSEQ "$(bup drecurse --exclude-from exclude-list src)" "src/c
+src/a/2
+src/a/1
+src/a/
+src/a-link
+src/"
+
+WVSTART "drecurse --exclude-rx (trivial)"
+WVPASSEQ "$(bup drecurse --exclude-rx '^src/b' src)" "src/c
+src/a/2
+src/a/1
+src/a/
+src/a-link
+src/"
+
+WVSTART "drecurse --exclude-rx (trivial - absolute path)"
+WVPASSEQ "$(bup drecurse --exclude-rx "^$(pwd)/src/b" "$(pwd)/src")" \
+"$(pwd)/src/c
+$(pwd)/src/a/2
+$(pwd)/src/a/1
+$(pwd)/src/a/
+$(pwd)/src/a-link
+$(pwd)/src/"
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-fsck.sh b/test/ext/test-fsck.sh
new file mode 100755 (executable)
index 0000000..0531814
--- /dev/null
@@ -0,0 +1,57 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS "$top/dev/sync-tree" "$top/test/sampledata/" "$tmpdir/src/"
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+WVPASS bup init
+WVPASS cd "$tmpdir"
+
+WVSTART "fsck"
+
+WVPASS bup index src
+WVPASS bup save -n fsck-test src/b2
+WVPASS bup save -n fsck-test src/var/cmd
+WVPASS bup save -n fsck-test src/var/doc
+WVPASS bup save -n fsck-test src/var/lib
+WVPASS bup save -n fsck-test src/y
+WVPASS bup fsck
+WVPASS bup fsck "$BUP_DIR"/objects/pack/pack-*.pack
+WVPASS bup fsck --quick
+if bup fsck --par2-ok; then
+    WVSTART "fsck (par2)"
+else
+    WVSTART "fsck (PAR2 IS MISSING)"
+fi
+WVPASS bup fsck -g
+WVPASS bup fsck -r
+WVPASS bup damage "$BUP_DIR"/objects/pack/*.pack -n10 -s1 -S0
+WVFAIL bup fsck --quick
+WVFAIL bup fsck --quick --disable-par2
+WVPASS chmod u+w "$BUP_DIR"/objects/pack/*.idx
+WVPASS bup damage "$BUP_DIR"/objects/pack/*.idx -n10 -s1 -S0
+WVFAIL bup fsck --quick -j4
+WVPASS bup damage "$BUP_DIR"/objects/pack/*.pack -n10 -s1024 --percent 0.4 -S0
+WVFAIL bup fsck --quick
+WVFAIL bup fsck --quick -rvv -j99   # fails because repairs were needed
+if bup fsck --par2-ok; then
+    WVPASS bup fsck -r # ok because of repairs from last time
+    WVPASS bup damage "$BUP_DIR"/objects/pack/*.pack -n202 -s1 --equal -S0
+    WVFAIL bup fsck
+    WVFAIL bup fsck -rvv   # too many errors to be repairable
+    WVFAIL bup fsck -r   # too many errors to be repairable
+else
+    WVFAIL bup fsck --quick -r # still fails because par2 was missing
+fi
+
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-ftp b/test/ext/test-ftp
new file mode 100755 (executable)
index 0000000..2ffa301
--- /dev/null
@@ -0,0 +1,139 @@
+#!/bin/sh
+"""": # -*-python-*-
+bup_python="$(dirname "$0")/../../dev/bup-python" || exit $?
+exec "$bup_python" "$0" ${1+"$@"}
+"""
+# end of bup preamble
+
+from __future__ import absolute_import, print_function
+from os import chdir, mkdir, symlink, unlink
+from os.path import abspath, dirname
+from subprocess import PIPE
+from time import localtime, strftime
+import os, sys
+
+# For buptest, wvtest, ...
+sys.path[:0] = (abspath(os.path.dirname(__file__) + '/../..'),)
+sys.path[:0] = (abspath(os.path.dirname(__file__) + '/../../test/lib'),)
+sys.path[:0] = [os.path.dirname(os.path.realpath(__file__)) + '/../../lib']
+
+from buptest import ex, exo, logcmd, test_tempdir
+from wvtest import wvfail, wvpass, wvpasseq, wvpassne, wvstart
+
+from bup.compat import environ
+from bup.helpers import unlink as unlink_if_exists
+import bup.path
+
+bup_cmd = bup.path.exe()
+
+def bup(*args, **kwargs):
+    if 'stdout' not in kwargs:
+        return exo((bup_cmd,) + args, **kwargs)
+    return ex((bup_cmd,) + args, **kwargs)
+
+def jl(*lines):
+    return b''.join(line + b'\n' for line in lines)
+
+environ[b'GIT_AUTHOR_NAME'] = b'bup test'
+environ[b'GIT_COMMITTER_NAME'] = b'bup test'
+environ[b'GIT_AUTHOR_EMAIL'] = b'bup@a425bc70a02811e49bdf73ee56450e6f'
+environ[b'GIT_COMMITTER_EMAIL'] = b'bup@a425bc70a02811e49bdf73ee56450e6f'
+
+with test_tempdir(b'ftp-') as tmpdir:
+    environ[b'BUP_DIR'] = tmpdir + b'/repo'
+    environ[b'GIT_DIR'] = tmpdir + b'/repo'
+
+    chdir(tmpdir)
+    mkdir(b'src')
+    chdir(b'src')
+    mkdir(b'dir')
+    with open(b'file-1', 'wb') as f:
+        f.write(b'excitement!\n')
+    with open(b'dir/file-2', 'wb') as f:
+        f.write(b'more excitement!\n')
+    symlink(b'file-1', b'file-symlink')
+    symlink(b'dir', b'dir-symlink')
+    symlink(b'not-there', b'bad-symlink')
+
+    chdir(tmpdir)    
+    bup(b'init')
+    bup(b'index', b'src')
+    bup(b'save', b'-n', b'src', b'--strip', b'src')
+    save_utc = int(exo((b'git', b'show',
+                        b'-s', b'--format=%at', b'src')).out.strip())
+    save_name = strftime('%Y-%m-%d-%H%M%S', localtime(save_utc)).encode('ascii')
+    
+    wvstart('help')
+    wvpasseq(b'Commands: ls cd pwd cat get mget help quit\n',
+             exo((bup_cmd, b'ftp'), input=b'help\n', stderr=PIPE).out)
+
+    wvstart('pwd/cd')
+    wvpasseq(b'/\n', bup(b'ftp', input=b'pwd\n').out)
+    wvpasseq(b'', bup(b'ftp', input=b'cd src\n').out)
+    wvpasseq(b'/src\n', bup(b'ftp', input=jl(b'cd src', b'pwd')).out)
+    wvpasseq(b'/src\n/\n', bup(b'ftp', input=jl(b'cd src', b'pwd',
+                                                b'cd ..', b'pwd')).out)
+    wvpasseq(b'/src\n/\n', bup(b'ftp', input=jl(b'cd src', b'pwd',
+                                                b'cd ..', b'cd ..',
+                                                b'pwd')).out)
+    wvpasseq(b'/src/%s/dir\n' % save_name,
+             bup(b'ftp', input=jl(b'cd src/latest/dir-symlink', b'pwd')).out)
+    wvpasseq(b'/src/%s/dir\n' % save_name,
+             bup(b'ftp', input=jl(b'cd src latest dir-symlink', b'pwd')).out)
+    wvpassne(0, bup(b'ftp',
+                    input=jl(b'cd src/latest/bad-symlink', b'pwd'),
+                    check=False, stdout=None).rc)
+    wvpassne(0, bup(b'ftp',
+                    input=jl(b'cd src/latest/not-there', b'pwd'),
+                    check=False, stdout=None).rc)
+
+    wvstart('ls')
+    # FIXME: elaborate
+    wvpasseq(b'src\n', bup(b'ftp', input=b'ls\n').out)
+    wvpasseq(save_name + b'\nlatest\n',
+             bup(b'ftp', input=b'ls src\n').out)
+
+    wvstart('cat')
+    wvpasseq(b'excitement!\n',
+             bup(b'ftp', input=b'cat src/latest/file-1\n').out)
+    wvpasseq(b'excitement!\nmore excitement!\n',
+             bup(b'ftp',
+                 input=b'cat src/latest/file-1 src/latest/dir/file-2\n').out)
+    
+    wvstart('get')
+    bup(b'ftp', input=jl(b'get src/latest/file-1 dest'))
+    with open(b'dest', 'rb') as f:
+        wvpasseq(b'excitement!\n', f.read())
+    unlink(b'dest')
+    bup(b'ftp', input=jl(b'get src/latest/file-symlink dest'))
+    with open(b'dest', 'rb') as f:
+        wvpasseq(b'excitement!\n', f.read())
+    unlink(b'dest')
+    wvpassne(0, bup(b'ftp',
+                    input=jl(b'get src/latest/bad-symlink dest'),
+                    check=False, stdout=None).rc)
+    wvpassne(0, bup(b'ftp',
+                    input=jl(b'get src/latest/not-there'),
+                    check=False, stdout=None).rc)
+    
+    wvstart('mget')
+    unlink_if_exists(b'file-1')
+    bup(b'ftp', input=jl(b'mget src/latest/file-1'))
+    with open(b'file-1', 'rb') as f:
+        wvpasseq(b'excitement!\n', f.read())
+    unlink_if_exists(b'file-1')
+    unlink_if_exists(b'file-2')
+    bup(b'ftp', input=jl(b'mget src/latest/file-1 src/latest/dir/file-2'))
+    with open(b'file-1', 'rb') as f:
+        wvpasseq(b'excitement!\n', f.read())
+    with open(b'file-2', 'rb') as f:
+        wvpasseq(b'more excitement!\n', f.read())
+    unlink_if_exists(b'file-symlink')
+    bup(b'ftp', input=jl(b'mget src/latest/file-symlink'))
+    with open(b'file-symlink', 'rb') as f:
+        wvpasseq(b'excitement!\n', f.read())
+    wvpassne(0, bup(b'ftp',
+                    input=jl(b'mget src/latest/bad-symlink dest'),
+                    check=False, stdout=None).rc)
+    # bup mget currently always does pattern matching
+    bup(b'ftp', input=b'mget src/latest/not-there\n')
diff --git a/test/ext/test-fuse.sh b/test/ext/test-fuse.sh
new file mode 100755 (executable)
index 0000000..08d7e2e
--- /dev/null
@@ -0,0 +1,106 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+unset BLOCKSIZE BLOCK_SIZE DF_BLOCK_SIZE
+
+root_status="$(dev/root-status)" || exit $?
+
+if ! bup-python -c 'import fuse' 2> /dev/null; then
+    WVSTART 'unable to import fuse; skipping test'
+    exit 0
+fi
+
+if test -n "$(type -p modprobe)" && ! modprobe fuse; then
+    echo 'Unable to load fuse module; skipping dependent tests.' 1>&2
+    exit 0
+fi
+
+if ! fusermount -V; then
+    echo 'skipping FUSE tests: fusermount does not appear to work'
+    exit 0
+fi
+
+if ! groups | grep -q fuse && test "$root_status" != root; then
+    echo 'skipping FUSE tests: you are not root and not in the fuse group'
+    exit 0
+fi
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+# Some versions of bash's printf don't support the relevant date expansion.
+savename()
+{
+    readonly secs="$1"
+    WVPASS bup-cfg-py -c "from time import strftime, localtime; \
+       print(strftime('%Y-%m-%d-%H%M%S', localtime($secs)))"
+}
+
+export TZ=UTC
+
+WVPASS bup init
+WVPASS cd "$tmpdir"
+
+savestamp1=$(WVPASS bup-cfg-py -c 'import time; print(int(time.time()))') || exit $?
+savestamp2=$(($savestamp1 + 1))
+
+savename1="$(savename "$savestamp1")" || exit $?
+savename2="$(savename "$savestamp2")" || exit $?
+
+WVPASS mkdir src
+WVPASS echo content > src/foo
+WVPASS chmod 644 src/foo
+WVPASS touch -t 201111111111 src/foo
+# FUSE, python-fuse, something, can't handle negative epoch times.
+# Use pre-epoch to make sure bup properly "bottoms out" at 0 for now.
+WVPASS echo content > src/pre-epoch
+WVPASS chmod 644 src/pre-epoch
+WVPASS touch -t 196907202018 src/pre-epoch
+WVPASS bup index src
+WVPASS bup save -n src -d "$savestamp1" --strip src
+
+WVSTART "basics"
+WVPASS mkdir mnt
+WVPASS bup fuse mnt
+
+result=$(WVPASS ls mnt) || exit $?
+WVPASSEQ src "$result"
+
+result=$(WVPASS ls mnt/src) || exit $?
+WVPASSEQ "$result" "$savename1
+latest"
+
+result=$(WVPASS ls mnt/src/latest) || exit $?
+WVPASSEQ "$result" "foo
+pre-epoch"
+
+result=$(WVPASS cat mnt/src/latest/foo) || exit $?
+WVPASSEQ "$result" "content"
+
+# Right now we don't detect new saves.
+WVPASS bup save -n src -d "$savestamp2" --strip src
+result=$(WVPASS ls mnt/src) || exit $?
+WVPASSEQ "$result" "$savename1
+latest"
+
+WVPASS fusermount -uz mnt
+
+WVSTART "extended metadata"
+WVPASS bup fuse --meta mnt
+readonly user=$(WVPASS id -un) || $?
+readonly group=$(WVPASS id -gn) || $?
+result="$(stat --format='%A %U %G %x' mnt/src/latest/foo)"
+WVPASSEQ "$result" "-rw-r--r-- $user $group 2011-11-11 11:11:00.000000000 +0000"
+result="$(stat --format='%A %U %G %x' mnt/src/latest/pre-epoch)"
+WVPASSEQ "$result" "-rw-r--r-- $user $group 1970-01-01 00:00:00.000000000 +0000"
+
+WVPASS fusermount -uz mnt
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-gc.sh b/test/ext/test-gc.sh
new file mode 100755 (executable)
index 0000000..e29370d
--- /dev/null
@@ -0,0 +1,241 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+GC_OPTS=--unsafe
+
+bup() { "$top/bup" "$@"; }
+compare-trees() { "$top/dev/compare-trees" "$@"; }
+data-size() { "$top/dev/data-size" "$@"; }
+
+WVPASS cd "$tmpdir"
+WVPASS bup init
+
+
+WVSTART "gc (unchanged repo)"
+
+WVPASS mkdir src-1
+WVPASS bup random 1k > src-1/1
+WVPASS bup index src-1
+WVPASS bup save --strip -n src-1 src-1
+
+WVPASS bup gc $GC_OPTS -v
+
+WVPASS bup restore -C "$tmpdir/restore" /src-1/latest
+WVPASS compare-trees src-1/ "$tmpdir/restore/latest/"
+
+
+WVSTART "gc (unchanged, new branch)"
+
+WVPASS mkdir src-2
+WVPASS bup random 10M > src-2/1
+WVPASS bup index src-2
+WVPASS bup save --strip -n src-2 src-2
+
+WVPASS bup gc $GC_OPTS -v
+
+WVPASS rm -r "$tmpdir/restore"
+WVPASS bup restore -C "$tmpdir/restore" /src-1/latest
+WVPASS compare-trees src-1/ "$tmpdir/restore/latest/"
+
+WVPASS rm -r "$tmpdir/restore"
+WVPASS bup restore -C "$tmpdir/restore" /src-2/latest
+WVPASS compare-trees src-2/ "$tmpdir/restore/latest/"
+
+
+WVSTART "gc (removed branch)"
+
+size_before=$(WVPASS data-size "$BUP_DIR") || exit $?
+WVPASS rm "$BUP_DIR/refs/heads/src-2"
+WVPASS bup gc $GC_OPTS -v
+size_after=$(WVPASS data-size "$BUP_DIR") || exit $?
+
+WVPASS [ "$size_before" -gt 5000000 ]
+WVPASS [ "$size_after" -lt 50000 ]
+
+WVPASS rm -r "$tmpdir/restore"
+WVPASS bup restore -C "$tmpdir/restore" /src-1/latest
+WVPASS compare-trees src-1/ "$tmpdir/restore/latest/"
+
+WVPASS rm -r "$tmpdir/restore"
+WVFAIL bup restore -C "$tmpdir/restore" /src-2/latest
+
+WVPASS mkdir src-ab-clean src-ab-clean/a src-ab-clean/b
+WVPASS bup random 1k > src-ab-clean/a/1
+WVPASS bup random 10M > src-ab-clean/b/1
+
+
+WVSTART "gc (rewriting)"
+
+WVPASS rm -rf "$BUP_DIR"
+WVPASS bup init
+WVPASS rm -rf src-ab
+WVPASS cp -pPR src-ab-clean src-ab
+
+WVPASS bup index src-ab
+WVPASS bup save --strip -n src-ab src-ab
+WVPASS bup index --clear
+WVPASS bup index src-ab
+WVPASS bup save -vvv --strip -n a src-ab/a
+
+size_before=$(WVPASS data-size "$BUP_DIR") || exit $?
+WVPASS rm "$BUP_DIR/refs/heads/src-ab"
+WVPASS bup gc $GC_OPTS -v
+size_after=$(WVPASS data-size "$BUP_DIR") || exit $?
+
+WVPASS [ "$size_before" -gt 5000000 ]
+WVPASS [ "$size_after" -lt 100000 ]
+
+WVPASS rm -r "$tmpdir/restore"
+WVPASS bup restore -C "$tmpdir/restore" /a/latest
+WVPASS compare-trees src-ab/a/ "$tmpdir/restore/latest/"
+
+WVPASS rm -r "$tmpdir/restore"
+WVFAIL bup restore -C "$tmpdir/restore" /src-ab/latest
+
+
+WVSTART "gc (save -r after repo rewriting)"
+
+WVPASS rm -rf "$BUP_DIR"
+WVPASS bup init
+WVPASS bup -d bup-remote init
+WVPASS rm -rf src-ab
+WVPASS cp -pPR src-ab-clean src-ab
+
+WVPASS bup index src-ab
+WVPASS bup save -r :bup-remote --strip -n src-ab src-ab
+WVPASS bup index --clear
+WVPASS bup index src-ab
+WVPASS bup save -r :bup-remote -vvv --strip -n a src-ab/a
+
+size_before=$(WVPASS data-size bup-remote) || exit $?
+WVPASS rm bup-remote/refs/heads/src-ab
+WVPASS bup -d bup-remote gc $GC_OPTS -v
+size_after=$(WVPASS data-size bup-remote) || exit $?
+
+WVPASS [ "$size_before" -gt 5000000 ]
+WVPASS [ "$size_after" -lt 100000 ]
+
+WVPASS rm -rf "$tmpdir/restore"
+WVPASS bup -d bup-remote restore -C "$tmpdir/restore" /a/latest
+WVPASS compare-trees src-ab/a/ "$tmpdir/restore/latest/"
+
+WVPASS rm -r "$tmpdir/restore"
+WVFAIL bup -d bup-remote restore -C "$tmpdir/restore" /src-ab/latest
+
+# Make sure a post-gc index/save that includes gc-ed data works
+WVPASS bup index src-ab
+WVPASS bup save -r :bup-remote --strip -n src-ab src-ab
+WVPASS rm -r "$tmpdir/restore"
+WVPASS bup -d bup-remote restore -C "$tmpdir/restore" /src-ab/latest
+WVPASS compare-trees src-ab/ "$tmpdir/restore/latest/"
+
+
+WVSTART "gc (bup on after repo rewriting)"
+
+WVPASS rm -rf "$BUP_DIR"
+WVPASS bup init
+WVPASS rm -rf src-ab
+WVPASS cp -pPR src-ab-clean src-ab
+
+WVPASS bup on - index src-ab
+WVPASS bup on - save --strip -n src-ab src-ab
+WVPASS bup index --clear
+WVPASS bup on - index src-ab
+WVPASS bup on - save -vvv --strip -n a src-ab/a
+
+size_before=$(WVPASS data-size "$BUP_DIR") || exit $?
+WVPASS rm "$BUP_DIR/refs/heads/src-ab"
+WVPASS bup gc $GC_OPTS -v
+size_after=$(WVPASS data-size "$BUP_DIR") || exit $?
+
+WVPASS [ "$size_before" -gt 5000000 ]
+WVPASS [ "$size_after" -lt 100000 ]
+
+WVPASS rm -r "$tmpdir/restore"
+WVPASS bup restore -C "$tmpdir/restore" /a/latest
+WVPASS compare-trees src-ab/a/ "$tmpdir/restore/latest/"
+
+WVPASS rm -r "$tmpdir/restore"
+WVFAIL bup restore -C "$tmpdir/restore" /src-ab/latest
+
+# Make sure a post-gc index/save that includes gc-ed data works
+WVPASS bup on - index src-ab
+WVPASS bup on - save --strip -n src-ab src-ab
+WVPASS rm -r "$tmpdir/restore"
+WVPASS bup restore -C "$tmpdir/restore" /src-ab/latest
+WVPASS compare-trees src-ab/ "$tmpdir/restore/latest/"
+
+
+WVSTART "gc (threshold)"
+
+WVPASS rm -rf "$BUP_DIR"
+WVPASS bup init
+WVPASS rm -rf src && mkdir src
+WVPASS echo 0 > src/0
+WVPASS echo 1 > src/1
+
+WVPASS bup index src
+WVPASS bup save -n src-1 src
+WVPASS rm src/0
+WVPASS bup index src
+WVPASS bup save -n src-2 src
+
+WVPASS bup rm --unsafe src-1
+packs_before="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
+WVPASS bup gc -v $GC_OPTS --threshold 99 2>&1 | tee gc.log
+packs_after="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
+WVPASSEQ 0 "$(grep -cE '^rewriting ' gc.log)"
+WVPASSEQ "$packs_before" "$packs_after"
+
+WVPASS bup gc -v $GC_OPTS --threshold 1 2>&1 | tee gc.log
+packs_after="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
+WVPASSEQ 1 "$(grep -cE '^rewriting ' gc.log)"
+
+# Check that only one pack was rewritten
+
+# Accommodate some systems that apparently used to change the default
+# ls sort order which must match LC_COLLATE for comm to work.
+packs_before="$(sort <(echo "$packs_before"))" || die $?
+packs_after="$(sort <(echo "$packs_after"))" || die $?
+
+only_in_before="$(comm -2 -3 <(echo "$packs_before") <(echo "$packs_after"))" \
+    || die $?
+
+only_in_after="$(comm -1 -3 <(echo "$packs_before") <(echo "$packs_after"))" \
+    || die $?
+
+in_both="$(comm -1 -2 <(echo "$packs_before") <(echo "$packs_after"))" || die $?
+
+WVPASSEQ 1 $(echo "$only_in_before" | wc -l)
+WVPASSEQ 1 $(echo "$only_in_after" | wc -l)
+WVPASSEQ 1 $(echo "$in_both" | wc -l)
+
+WVSTART "gc (threshold 0)"
+
+WVPASS rm -rf "$BUP_DIR"
+WVPASS bup init
+WVPASS rm -rf src && mkdir src
+WVPASS echo 0 > src/0
+WVPASS echo 1 > src/1
+
+WVPASS bup index src
+WVPASS bup save -n src-1 src
+
+packs_before="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
+WVPASS bup gc -v $GC_OPTS --threshold 0 2>&1 | tee gc.log
+packs_after="$(ls "$BUP_DIR/objects/pack/"*.pack)" || exit $?
+# Check that the pack was rewritten, but not removed (since the
+# result-pack is equal to the source pack)
+WVPASSEQ 1 "$(grep -cE '^rewriting ' gc.log)"
+WVPASSEQ "$packs_before" "$packs_after"
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-get b/test/ext/test-get
new file mode 100755 (executable)
index 0000000..1dad1d4
--- /dev/null
@@ -0,0 +1,1010 @@
+#!/bin/sh
+"""": # -*-python-*-
+# https://sourceware.org/bugzilla/show_bug.cgi?id=26034
+export "BUP_ARGV_0"="$0"
+arg_i=1
+for arg in "$@"; do
+    export "BUP_ARGV_${arg_i}"="$arg"
+    shift
+    arg_i=$((arg_i + 1))
+done
+bup_python="$(dirname "$0")/../../dev/bup-python" || exit $?
+exec "$bup_python" "$0"
+"""
+# end of bup preamble
+
+from __future__ import print_function
+from errno import ENOENT
+from os import chdir, mkdir, rename
+from os.path import abspath, dirname
+from shutil import rmtree
+from subprocess import PIPE
+import os, re, sys
+
+# For buptest, wvtest, ...
+sys.path[:0] = (abspath(os.path.dirname(__file__) + '/../..'),)
+sys.path[:0] = (abspath(os.path.dirname(__file__) + '/../../test/lib'),)
+sys.path[:0] = [os.path.dirname(os.path.realpath(__file__)) + '/../../lib']
+
+from bup import compat, path
+from bup.compat import environ, getcwd, items
+from bup.helpers import bquote, merge_dict, unlink
+from bup.io import byte_stream
+from buptest import ex, exo, test_tempdir
+from wvtest import wvcheck, wvfail, wvmsg, wvpass, wvpasseq, wvpassne, wvstart
+import bup.path
+
+sys.stdout.flush()
+stdout = byte_stream(sys.stdout)
+
+# FIXME: per-test function
+environ[b'GIT_AUTHOR_NAME'] = b'bup test-get'
+environ[b'GIT_COMMITTER_NAME'] = b'bup test-get'
+environ[b'GIT_AUTHOR_EMAIL'] = b'bup@85430dcca2b611e4b2c3-8f5691723476'
+environ[b'GIT_COMMITTER_EMAIL'] = b'bup@85430dcca2b611e4b2c3-8f5691723476'
+
+# The clean-repo test can probably be applied more broadly.  It was
+# initially just applied to test-pick to catch a bug.
+
+top = getcwd()
+bup_cmd = bup.path.exe()
+
+def rmrf(path):
+    err = []  # because python's scoping mess...
+    def onerror(function, path, excinfo):
+        err.append((function, path, excinfo))
+    rmtree(path, onerror=onerror)
+    if err:
+        function, path, excinfo = err[0]
+        ex_type, ex, traceback = excinfo
+        if (not isinstance(ex, OSError)) or ex.errno != ENOENT:
+            raise ex
+
+def verify_trees_match(path1, path2):
+    global top
+    exr = exo((top + b'/dev/compare-trees', b'-c', path1, path2), check=False)
+    stdout.write(exr.out)
+    sys.stdout.flush()
+    wvcheck(exr.rc == 0, 'process exit %d == 0' % exr.rc)
+
+def verify_rcz(cmd, **kwargs):
+    assert not kwargs.get('check')
+    kwargs['check'] = False
+    result = exo(cmd, **kwargs)
+    stdout.write(result.out)
+    rc = result.proc.returncode
+    wvcheck(rc == 0, 'process exit %d == 0' % rc)
+    return result
+
+# FIXME: multline, or allow opts generally?
+
+def verify_rx(rx, string):
+    wvcheck(re.search(rx, string), 'rx %r matches %r' % (rx, string))
+
+def verify_nrx(rx, string):
+    wvcheck(not re.search(rx, string), "rx %r doesn't match %r" % (rx, string))
+
+def validate_clean_repo():
+    out = verify_rcz((b'git', b'--git-dir', b'get-dest', b'fsck')).out
+    verify_nrx(br'dangling|mismatch|missing|unreachable', out)
+    
+def validate_blob(src_id, dest_id):
+    global top
+    rmrf(b'restore-src')
+    rmrf(b'restore-dest')
+    cat_tree = top + b'/dev/git-cat-tree'
+    src_blob = verify_rcz((cat_tree, b'--git-dir', b'get-src', src_id)).out
+    dest_blob = verify_rcz((cat_tree, b'--git-dir', b'get-src', src_id)).out
+    wvpasseq(src_blob, dest_blob)
+
+def validate_tree(src_id, dest_id):
+
+    rmrf(b'restore-src')
+    rmrf(b'restore-dest')
+    mkdir(b'restore-src')
+    mkdir(b'restore-dest')
+    
+    commit_env = merge_dict(environ, {b'GIT_COMMITTER_DATE': b'2014-01-01 01:01'})
+
+    # Create a commit so the archive contents will have matching timestamps.
+    src_c = exo((b'git', b'--git-dir', b'get-src',
+                 b'commit-tree', b'-m', b'foo', src_id),
+                env=commit_env).out.strip()
+    dest_c = exo((b'git', b'--git-dir', b'get-dest',
+                  b'commit-tree', b'-m', b'foo', dest_id),
+                 env=commit_env).out.strip()
+    exr = verify_rcz(b'git --git-dir get-src archive %s | tar xvf - -C restore-src'
+                     % bquote(src_c),
+                     shell=True)
+    if exr.rc != 0: return False
+    exr = verify_rcz(b'git --git-dir get-dest archive %s | tar xvf - -C restore-dest'
+                     % bquote(dest_c),
+                     shell=True)
+    if exr.rc != 0: return False
+    
+    # git archive doesn't include an entry for ./.
+    unlink(b'restore-src/pax_global_header')
+    unlink(b'restore-dest/pax_global_header')
+    ex((b'touch', b'-r', b'restore-src', b'restore-dest'))
+    verify_trees_match(b'restore-src/', b'restore-dest/')
+    rmrf(b'restore-src')
+    rmrf(b'restore-dest')
+
+def validate_commit(src_id, dest_id):
+    exr = verify_rcz((b'git', b'--git-dir', b'get-src', b'cat-file', b'commit', src_id))
+    if exr.rc != 0: return False
+    src_cat = exr.out
+    exr = verify_rcz((b'git', b'--git-dir', b'get-dest', b'cat-file', b'commit', dest_id))
+    if exr.rc != 0: return False
+    dest_cat = exr.out
+    wvpasseq(src_cat, dest_cat)
+    if src_cat != dest_cat: return False
+    
+    rmrf(b'restore-src')
+    rmrf(b'restore-dest')
+    mkdir(b'restore-src')
+    mkdir(b'restore-dest')
+    qsrc = bquote(src_id)
+    qdest = bquote(dest_id)
+    exr = verify_rcz((b'git --git-dir get-src archive ' + qsrc
+                      + b' | tar xf - -C restore-src'),
+                     shell=True)
+    if exr.rc != 0: return False
+    exr = verify_rcz((b'git --git-dir get-dest archive ' + qdest +
+                      b' | tar xf - -C restore-dest'),
+                     shell=True)
+    if exr.rc != 0: return False
+    
+    # git archive doesn't include an entry for ./.
+    ex((b'touch', b'-r', b'restore-src', b'restore-dest'))
+    verify_trees_match(b'restore-src/', b'restore-dest/')
+    rmrf(b'restore-src')
+    rmrf(b'restore-dest')
+
+def _validate_save(orig_dir, save_path, commit_id, tree_id):
+    global bup_cmd
+    rmrf(b'restore')
+    exr = verify_rcz((bup_cmd, b'-d', b'get-dest',
+                      b'restore', b'-C', b'restore', save_path + b'/.'))
+    if exr.rc: return False
+    verify_trees_match(orig_dir + b'/', b'restore/')
+    if tree_id:
+        # FIXME: double check that get-dest is correct
+        exr = verify_rcz((b'git', b'--git-dir', b'get-dest', b'ls-tree', tree_id))
+        if exr.rc: return False
+        cat = verify_rcz((b'git', b'--git-dir', b'get-dest',
+                          b'cat-file', b'commit', commit_id))
+        if cat.rc: return False
+        wvpasseq(b'tree ' + tree_id, cat.out.splitlines()[0])
+
+# FIXME: re-merge save and new_save?
+        
+def validate_save(dest_name, restore_subpath, commit_id, tree_id, orig_value,
+                  get_out):
+    out = get_out.splitlines()
+    print('blarg: out', repr(out), file=sys.stderr)
+    wvpasseq(2, len(out))
+    get_tree_id = out[0]
+    get_commit_id = out[1]
+    wvpasseq(tree_id, get_tree_id)
+    wvpasseq(commit_id, get_commit_id)
+    _validate_save(orig_value, dest_name + restore_subpath, commit_id, tree_id)
+
+def validate_new_save(dest_name, restore_subpath, commit_id, tree_id, orig_value,
+                      get_out):
+    out = get_out.splitlines()
+    wvpasseq(2, len(out))
+    get_tree_id = out[0]
+    get_commit_id = out[1]
+    wvpasseq(tree_id, get_tree_id)
+    wvpassne(commit_id, get_commit_id)
+    _validate_save(orig_value, dest_name + restore_subpath, get_commit_id, tree_id)
+        
+def validate_tagged_save(tag_name, restore_subpath,
+                         commit_id, tree_id, orig_value, get_out):
+    out = get_out.splitlines()
+    wvpasseq(1, len(out))
+    get_tag_id = out[0]
+    wvpasseq(commit_id, get_tag_id)
+    # Make sure tmp doesn't already exist.
+    exr = exo((b'git', b'--git-dir', b'get-dest', b'show-ref', b'tmp-branch-for-tag'),
+              check=False)
+    wvpasseq(1, exr.rc)
+
+    ex((b'git', b'--git-dir', b'get-dest', b'branch', b'tmp-branch-for-tag',
+        b'refs/tags/' + tag_name))
+    _validate_save(orig_value, b'tmp-branch-for-tag/latest' + restore_subpath,
+                   commit_id, tree_id)
+    ex((b'git', b'--git-dir', b'get-dest', b'branch', b'-D', b'tmp-branch-for-tag'))
+
+def validate_new_tagged_commit(tag_name, commit_id, tree_id, get_out):
+    out = get_out.splitlines()
+    wvpasseq(1, len(out))
+    get_tag_id = out[0]
+    wvpassne(commit_id, get_tag_id)
+    validate_tree(tree_id, tag_name + b':')
+
+
+get_cases_tested = 0
+
+def _run_get(disposition, method, what):
+    print('run_get:', repr((disposition, method, what)), file=sys.stderr)
+    global bup_cmd
+
+    if disposition == 'get':
+        get_cmd = (bup_cmd, b'-d', b'get-dest',
+                   b'get', b'-vvct', b'--print-tags', b'-s', b'get-src')
+    elif disposition == 'get-on':
+        get_cmd = (bup_cmd, b'-d', b'get-dest',
+                   b'on', b'-', b'get', b'-vvct', b'--print-tags', b'-s', b'get-src')
+    elif disposition == 'get-to':
+        get_cmd = (bup_cmd, b'-d', b'get-dest',
+                   b'get', b'-vvct', b'--print-tags', b'-s', b'get-src',
+                   b'-r', b'-:' + getcwd() + b'/get-dest')
+    else:
+        raise Exception('error: unexpected get disposition ' + repr(disposition))
+    
+    global get_cases_tested
+    if isinstance(what, bytes):
+        cmd = get_cmd + (method, what)
+    else:
+        assert not isinstance(what, str)  # python 3 sanity check
+        if method in (b'--ff', b'--append', b'--pick', b'--force-pick', b'--new-tag',
+                      b'--replace'):
+            method += b':'
+        src, dest = what
+        cmd = get_cmd + (method, src, dest)
+    result = exo(cmd, check=False, stderr=PIPE)
+    get_cases_tested += 1
+    fsck = ex((bup_cmd, b'-d', b'get-dest', b'fsck'), check=False)
+    wvpasseq(0, fsck.rc)
+    return result
+
+def run_get(disposition, method, what=None, given=None):
+    global bup_cmd
+    rmrf(b'get-dest')
+    ex((bup_cmd, b'-d', b'get-dest', b'init'))
+
+    if given:
+        # FIXME: replace bup-get with independent commands as is feasible
+        exr = _run_get(disposition, b'--replace', given)
+        assert not exr.rc
+    return _run_get(disposition, method, what)
+
+def test_universal_behaviors(get_disposition):
+    methods = (b'--ff', b'--append', b'--pick', b'--force-pick', b'--new-tag',
+               b'--replace', b'--unnamed')
+    for method in methods:
+        mmsg = method.decode('ascii')
+        wvstart(get_disposition + ' ' + mmsg + ', missing source, fails')
+        exr = run_get(get_disposition, method, b'not-there')
+        wvpassne(0, exr.rc)
+        verify_rx(br'cannot find source', exr.err)
+    for method in methods:
+        mmsg = method.decode('ascii')
+        wvstart(get_disposition + ' ' + mmsg + ' / fails')
+        exr = run_get(get_disposition, method, b'/')
+        wvpassne(0, exr.rc)
+        verify_rx(b'cannot fetch entire repository', exr.err)
+
+def verify_only_refs(**kwargs):
+    for kind, refs in items(kwargs):
+        if kind == 'heads':
+            abs_refs = [b'refs/heads/' + ref for ref in refs]
+            karg = b'--heads'
+        elif kind == 'tags':
+            abs_refs = [b'refs/tags/' + ref for ref in refs]
+            karg = b'--tags'
+        else:
+            raise TypeError('unexpected keyword argument %r' % kind)
+        if abs_refs:
+            verify_rcz([b'git', b'--git-dir', b'get-dest',
+                        b'show-ref', b'--verify', karg] + abs_refs)
+            exr = exo((b'git', b'--git-dir', b'get-dest', b'show-ref', karg),
+                      check=False)
+            wvpasseq(0, exr.rc)
+            expected_refs = sorted(abs_refs)
+            repo_refs = sorted([x.split()[1] for x in exr.out.splitlines()])
+            wvpasseq(expected_refs, repo_refs)
+        else:
+            # FIXME: can we just check "git show-ref --heads == ''"?
+            exr = exo((b'git', b'--git-dir', b'get-dest', b'show-ref', karg),
+                      check=False)
+            wvpasseq(1, exr.rc)
+            wvpasseq(b'', exr.out.strip())
+
+def test_replace(get_disposition, src_info):
+    print('blarg:', repr(src_info), file=sys.stderr)
+
+    wvstart(get_disposition + ' --replace to root fails')
+    for item in (b'.tag/tinyfile',
+                 b'src/latest' + src_info['tinyfile-path'],
+                 b'.tag/subtree',
+                 b'src/latest' + src_info['subtree-vfs-path'],
+                 b'.tag/commit-1',
+                 b'src/latest',
+                 b'src'):
+        exr = run_get(get_disposition, b'--replace', (item, b'/'))
+        wvpassne(0, exr.rc)
+        verify_rx(br'impossible; can only overwrite branch or tag', exr.err)
+
+    tinyfile_id = src_info['tinyfile-id']
+    tinyfile_path = src_info['tinyfile-path']
+    subtree_vfs_path = src_info['subtree-vfs-path']
+    subtree_id = src_info['subtree-id']
+    commit_2_id = src_info['commit-2-id']
+    tree_2_id = src_info['tree-2-id']
+
+    # Anything to tag
+    existing_items = {'nothing' : None,
+                      'blob' : (b'.tag/tinyfile', b'.tag/obj'),
+                      'tree' : (b'.tag/tree-1', b'.tag/obj'),
+                      'commit': (b'.tag/commit-1', b'.tag/obj')}
+    for ex_type, ex_ref in items(existing_items):
+        wvstart(get_disposition + ' --replace ' + ex_type + ' with blob tag')
+        for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
+            exr = run_get(get_disposition, b'--replace', (item ,b'.tag/obj'),
+                          given=ex_ref)
+            wvpasseq(0, exr.rc)        
+            validate_blob(tinyfile_id, tinyfile_id)
+            verify_only_refs(heads=[], tags=(b'obj',))
+        wvstart(get_disposition + ' --replace ' + ex_type + ' with tree tag')
+        for item in (b'.tag/subtree',  b'src/latest' + subtree_vfs_path):
+            exr = run_get(get_disposition, b'--replace', (item, b'.tag/obj'),
+                          given=ex_ref)
+            validate_tree(subtree_id, subtree_id)
+            verify_only_refs(heads=[], tags=(b'obj',))
+        wvstart(get_disposition + ' --replace ' + ex_type + ' with commitish tag')
+        for item in (b'.tag/commit-2', b'src/latest', b'src'):
+            exr = run_get(get_disposition, b'--replace', (item, b'.tag/obj'),
+                          given=ex_ref)
+            validate_tagged_save(b'obj', getcwd() + b'/src',
+                                 commit_2_id, tree_2_id, b'src-2', exr.out)
+            verify_only_refs(heads=[], tags=(b'obj',))
+
+        # Committish to branch.
+        existing_items = (('nothing', None),
+                          ('branch', (b'.tag/commit-1', b'obj')))
+        for ex_type, ex_ref in existing_items:
+            for item_type, item in (('commit', b'.tag/commit-2'),
+                                    ('save', b'src/latest'),
+                                    ('branch', b'src')):
+                wvstart(get_disposition + ' --replace '
+                        + ex_type + ' with ' + item_type)
+                exr = run_get(get_disposition, b'--replace', (item, b'obj'),
+                              given=ex_ref)
+                validate_save(b'obj/latest', getcwd() + b'/src',
+                              commit_2_id, tree_2_id, b'src-2', exr.out)
+                verify_only_refs(heads=(b'obj',), tags=[])
+
+        # Not committish to branch
+        existing_items = (('nothing', None),
+                          ('branch', (b'.tag/commit-1', b'obj')))
+        for ex_type, ex_ref in existing_items:
+            for item_type, item in (('blob', b'.tag/tinyfile'),
+                                    ('blob', b'src/latest' + tinyfile_path),
+                                    ('tree', b'.tag/subtree'),
+                                    ('tree', b'src/latest' + subtree_vfs_path)):
+                wvstart(get_disposition + ' --replace branch with '
+                        + item_type + ' given ' + ex_type + ' fails')
+
+                exr = run_get(get_disposition, b'--replace', (item, b'obj'),
+                              given=ex_ref)
+                wvpassne(0, exr.rc)
+                verify_rx(br'cannot overwrite branch with .+ for', exr.err)
+
+        wvstart(get_disposition + ' --replace, implicit destinations')
+
+        exr = run_get(get_disposition, b'--replace', b'src')
+        validate_save(b'src/latest', getcwd() + b'/src',
+                      commit_2_id, tree_2_id, b'src-2', exr.out)
+        verify_only_refs(heads=(b'src',), tags=[])
+
+        exr = run_get(get_disposition, b'--replace', b'.tag/commit-2')
+        validate_tagged_save(b'commit-2', getcwd() + b'/src',
+                             commit_2_id, tree_2_id, b'src-2', exr.out)
+        verify_only_refs(heads=[], tags=(b'commit-2',))
+
+def test_ff(get_disposition, src_info):
+
+    wvstart(get_disposition + ' --ff to root fails')
+    tinyfile_path = src_info['tinyfile-path']
+    for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
+        exr = run_get(get_disposition, b'--ff', (item, b'/'))
+        wvpassne(0, exr.rc)
+        verify_rx(br'source for .+ must be a branch, save, or commit', exr.err)
+    subtree_vfs_path = src_info['subtree-vfs-path']
+    for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
+        exr = run_get(get_disposition, b'--ff', (item, b'/'))
+        wvpassne(0, exr.rc)
+        verify_rx(br'is impossible; can only --append a tree to a branch',
+                  exr.err)    
+    for item in (b'.tag/commit-1', b'src/latest', b'src'):
+        exr = run_get(get_disposition, b'--ff', (item, b'/'))
+        wvpassne(0, exr.rc)
+        verify_rx(br'destination for .+ is a root, not a branch', exr.err)
+
+    wvstart(get_disposition + ' --ff of not-committish fails')
+    for src in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
+        # FIXME: use get_item elsewhere?
+        for given, get_item in ((None, (src, b'obj')),
+                                (None, (src, b'.tag/obj')),
+                                ((b'.tag/tinyfile', b'.tag/obj'), (src, b'.tag/obj')),
+                                ((b'.tag/tree-1', b'.tag/obj'), (src, b'.tag/obj')),
+                                ((b'.tag/commit-1', b'.tag/obj'), (src, b'.tag/obj')),
+                                ((b'.tag/commit-1', b'obj'), (src, b'obj'))):
+            exr = run_get(get_disposition, b'--ff', get_item, given=given)
+            wvpassne(0, exr.rc)
+            verify_rx(br'must be a branch, save, or commit', exr.err)
+    for src in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
+        for given, get_item in ((None, (src, b'obj')),
+                                (None, (src, b'.tag/obj')),
+                                ((b'.tag/tinyfile', b'.tag/obj'), (src, b'.tag/obj')),
+                                ((b'.tag/tree-1', b'.tag/obj'), (src, b'.tag/obj')),
+                                ((b'.tag/commit-1', b'.tag/obj'), (src, b'.tag/obj')),
+                                ((b'.tag/commit-1', b'obj'), (src, b'obj'))):
+            exr = run_get(get_disposition, b'--ff', get_item, given=given)
+            wvpassne(0, exr.rc)
+            verify_rx(br'can only --append a tree to a branch', exr.err)
+
+    wvstart(get_disposition + ' --ff committish, ff possible')
+    save_2 = src_info['save-2']
+    for src in (b'.tag/commit-2', b'src/' + save_2, b'src'):
+        for given, get_item, complaint in \
+            ((None, (src, b'.tag/obj'),
+              br'destination .+ must be a valid branch name'),
+             ((b'.tag/tinyfile', b'.tag/obj'), (src, b'.tag/obj'),
+              br'destination .+ is a blob, not a branch'),
+             ((b'.tag/tree-1', b'.tag/obj'), (src, b'.tag/obj'),
+              br'destination .+ is a tree, not a branch'),
+             ((b'.tag/commit-1', b'.tag/obj'), (src, b'.tag/obj'),
+              br'destination .+ is a tagged commit, not a branch'),
+             ((b'.tag/commit-2', b'.tag/obj'), (src, b'.tag/obj'),
+              br'destination .+ is a tagged commit, not a branch')):
+            exr = run_get(get_disposition, b'--ff', get_item, given=given)
+            wvpassne(0, exr.rc)
+            verify_rx(complaint, exr.err)
+    # FIXME: use src or item and given or existing consistently in loops...
+    commit_2_id = src_info['commit-2-id']
+    tree_2_id = src_info['tree-2-id']
+    for src in (b'.tag/commit-2', b'src/' + save_2, b'src'):
+        for given in (None, (b'.tag/commit-1', b'obj'), (b'.tag/commit-2', b'obj')):
+            exr = run_get(get_disposition, b'--ff', (src, b'obj'), given=given)
+            wvpasseq(0, exr.rc)
+            validate_save(b'obj/latest', getcwd() + b'/src',
+                          commit_2_id, tree_2_id, b'src-2', exr.out)
+            verify_only_refs(heads=(b'obj',), tags=[])
+            
+    wvstart(get_disposition + ' --ff, implicit destinations')
+    for item in (b'src', b'src/latest'):
+        exr = run_get(get_disposition, b'--ff', item)
+        wvpasseq(0, exr.rc)
+
+        ex((b'find', b'get-dest/refs'))
+        ex((bup_cmd, b'-d', b'get-dest', b'ls'))
+
+        validate_save(b'src/latest', getcwd() + b'/src',
+                     commit_2_id, tree_2_id, b'src-2', exr.out)
+        #verify_only_refs(heads=('src',), tags=[])
+
+    wvstart(get_disposition + ' --ff, ff impossible')
+    for given, get_item in (((b'unrelated-branch', b'src'), b'src'),
+                            ((b'.tag/commit-2', b'src'), (b'.tag/commit-1', b'src'))):
+        exr = run_get(get_disposition, b'--ff', get_item, given=given)
+        wvpassne(0, exr.rc)
+        verify_rx(br'destination is not an ancestor of source', exr.err)
+
+def test_append(get_disposition, src_info):
+    tinyfile_path = src_info['tinyfile-path']
+    subtree_vfs_path = src_info['subtree-vfs-path']
+
+    wvstart(get_disposition + ' --append to root fails')
+    for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
+        exr = run_get(get_disposition, b'--append', (item, b'/'))
+        wvpassne(0, exr.rc)
+        verify_rx(br'source for .+ must be a branch, save, commit, or tree',
+                  exr.err)
+    for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path,
+                 b'.tag/commit-1', b'src/latest', b'src'):
+        exr = run_get(get_disposition, b'--append', (item, b'/'))
+        wvpassne(0, exr.rc)
+        verify_rx(br'destination for .+ is a root, not a branch', exr.err)
+
+    wvstart(get_disposition + ' --append of not-treeish fails')
+    for src in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
+        for given, item in ((None, (src, b'obj')),
+                            (None, (src, b'.tag/obj')),
+                            ((b'.tag/tinyfile', b'.tag/obj'), (src, b'.tag/obj')),
+                            ((b'.tag/tree-1', b'.tag/obj'), (src, b'.tag/obj')),
+                            ((b'.tag/commit-1', b'.tag/obj'), (src, b'.tag/obj')),
+                            ((b'.tag/commit-1', b'obj'), (src, b'obj'))):
+            exr = run_get(get_disposition, b'--append', item, given=given)
+            wvpassne(0, exr.rc)
+            verify_rx(br'must be a branch, save, commit, or tree', exr.err)
+
+    wvstart(get_disposition + ' --append committish failure cases')
+    save_2 = src_info['save-2']
+    for src in (b'.tag/subtree', b'src/latest' + subtree_vfs_path,
+                b'.tag/commit-2', b'src/' + save_2, b'src'):
+        for given, item, complaint in \
+            ((None, (src, b'.tag/obj'),
+              br'destination .+ must be a valid branch name'),
+             ((b'.tag/tinyfile', b'.tag/obj'), (src, b'.tag/obj'),
+              br'destination .+ is a blob, not a branch'),
+             ((b'.tag/tree-1', b'.tag/obj'), (src, b'.tag/obj'),
+              br'destination .+ is a tree, not a branch'),
+             ((b'.tag/commit-1', b'.tag/obj'), (src, b'.tag/obj'),
+              br'destination .+ is a tagged commit, not a branch'),
+             ((b'.tag/commit-2', b'.tag/obj'), (src, b'.tag/obj'),
+              br'destination .+ is a tagged commit, not a branch')):
+            exr = run_get(get_disposition, b'--append', item, given=given)
+            wvpassne(0, exr.rc)
+            verify_rx(complaint, exr.err)
+
+    wvstart(get_disposition + ' --append committish')
+    commit_2_id = src_info['commit-2-id']
+    tree_2_id = src_info['tree-2-id']
+    for item in (b'.tag/commit-2', b'src/' + save_2, b'src'):
+        for existing in (None, (b'.tag/commit-1', b'obj'),
+                         (b'.tag/commit-2', b'obj'),
+                         (b'unrelated-branch', b'obj')):
+            exr = run_get(get_disposition, b'--append', (item, b'obj'),
+                          given=existing)
+            wvpasseq(0, exr.rc)
+            validate_new_save(b'obj/latest', getcwd() + b'/src',
+                              commit_2_id, tree_2_id, b'src-2', exr.out)
+            verify_only_refs(heads=(b'obj',), tags=[])
+    # Append ancestor
+    save_1 = src_info['save-1']
+    commit_1_id = src_info['commit-1-id']
+    tree_1_id = src_info['tree-1-id']
+    for item in (b'.tag/commit-1',  b'src/' + save_1, b'src-1'):
+        exr = run_get(get_disposition, b'--append', (item, b'obj'),
+                      given=(b'.tag/commit-2', b'obj'))
+        wvpasseq(0, exr.rc)
+        validate_new_save(b'obj/latest', getcwd() + b'/src',
+                          commit_1_id, tree_1_id, b'src-1', exr.out)
+        verify_only_refs(heads=(b'obj',), tags=[])
+
+    wvstart(get_disposition + ' --append tree')
+    subtree_path = src_info['subtree-path']
+    subtree_id = src_info['subtree-id']
+    for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
+        for existing in (None,
+                         (b'.tag/commit-1', b'obj'),
+                         (b'.tag/commit-2', b'obj')):
+            exr = run_get(get_disposition, b'--append', (item, b'obj'),
+                          given=existing)
+            wvpasseq(0, exr.rc)
+            validate_new_save(b'obj/latest', b'/', None, subtree_id, subtree_path,
+                              exr.out)
+            verify_only_refs(heads=(b'obj',), tags=[])
+
+    wvstart(get_disposition + ' --append, implicit destinations')
+
+    for item in (b'src', b'src/latest'):
+        exr = run_get(get_disposition, b'--append', item)
+        wvpasseq(0, exr.rc)
+        validate_new_save(b'src/latest', getcwd() + b'/src', commit_2_id, tree_2_id,
+                          b'src-2', exr.out)
+        verify_only_refs(heads=(b'src',), tags=[])
+
+def test_pick(get_disposition, src_info, force=False):
+    flavor = b'--force-pick' if force else b'--pick'
+    flavormsg = flavor.decode('ascii')
+    tinyfile_path = src_info['tinyfile-path']
+    subtree_vfs_path = src_info['subtree-vfs-path']
+    
+    wvstart(get_disposition + ' ' + flavormsg + ' to root fails')
+    for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path, b'src'):
+        exr = run_get(get_disposition, flavor, (item, b'/'))
+        wvpassne(0, exr.rc)
+        verify_rx(br'can only pick a commit or save', exr.err)
+    for item in (b'.tag/commit-1', b'src/latest'):
+        exr = run_get(get_disposition, flavor, (item, b'/'))
+        wvpassne(0, exr.rc)
+        verify_rx(br'destination is not a tag or branch', exr.err)
+    for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
+        exr = run_get(get_disposition, flavor, (item, b'/'))
+        wvpassne(0, exr.rc)
+        verify_rx(br'is impossible; can only --append a tree', exr.err)
+
+    wvstart(get_disposition + ' ' + flavormsg + ' of blob or branch fails')
+    for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path, b'src'):
+        for given, get_item in ((None, (item, b'obj')),
+                                (None, (item, b'.tag/obj')),
+                                ((b'.tag/tinyfile', b'.tag/obj'), (item, b'.tag/obj')),
+                                ((b'.tag/tree-1', b'.tag/obj'), (item, b'.tag/obj')),
+                                ((b'.tag/commit-1', b'.tag/obj'), (item, b'.tag/obj')),
+                                ((b'.tag/commit-1', b'obj'), (item, b'obj'))):
+            exr = run_get(get_disposition, flavor, get_item, given=given)
+            wvpassne(0, exr.rc)
+            verify_rx(br'impossible; can only pick a commit or save', exr.err)
+
+    wvstart(get_disposition + ' ' + flavormsg + ' of tree fails')
+    for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
+        for given, get_item in ((None, (item, b'obj')),
+                                (None, (item, b'.tag/obj')),
+                                ((b'.tag/tinyfile', b'.tag/obj'), (item, b'.tag/obj')),
+                                ((b'.tag/tree-1', b'.tag/obj'), (item, b'.tag/obj')),
+                                ((b'.tag/commit-1', b'.tag/obj'), (item, b'.tag/obj')),
+                                ((b'.tag/commit-1', b'obj'), (item, b'obj'))):
+            exr = run_get(get_disposition, flavor, get_item, given=given)
+            wvpassne(0, exr.rc)
+            verify_rx(br'impossible; can only --append a tree', exr.err)
+
+    save_2 = src_info['save-2']
+    commit_2_id = src_info['commit-2-id']
+    tree_2_id = src_info['tree-2-id']
+    # FIXME: these two wvstart texts?
+    if force:
+        wvstart(get_disposition + ' ' + flavormsg + ' commit/save to existing tag')
+        for item in (b'.tag/commit-2', b'src/' + save_2):
+            for given in ((b'.tag/tinyfile', b'.tag/obj'),
+                          (b'.tag/tree-1', b'.tag/obj'),
+                          (b'.tag/commit-1', b'.tag/obj')):
+                exr = run_get(get_disposition, flavor, (item, b'.tag/obj'),
+                              given=given)
+                wvpasseq(0, exr.rc)
+                validate_new_tagged_commit(b'obj', commit_2_id, tree_2_id,
+                                           exr.out)
+                verify_only_refs(heads=[], tags=(b'obj',))
+    else: # --pick
+        wvstart(get_disposition + ' ' + flavormsg
+                + ' commit/save to existing tag fails')
+        for item in (b'.tag/commit-2', b'src/' + save_2):
+            for given in ((b'.tag/tinyfile', b'.tag/obj'),
+                          (b'.tag/tree-1', b'.tag/obj'),
+                          (b'.tag/commit-1', b'.tag/obj')):
+                exr = run_get(get_disposition, flavor, (item, b'.tag/obj'), given=given)
+                wvpassne(0, exr.rc)
+                verify_rx(br'cannot overwrite existing tag', exr.err)
+            
+    wvstart(get_disposition + ' ' + flavormsg + ' commit/save to tag')
+    for item in (b'.tag/commit-2', b'src/' + save_2):
+        exr = run_get(get_disposition, flavor, (item, b'.tag/obj'))
+        wvpasseq(0, exr.rc)
+        validate_clean_repo()
+        validate_new_tagged_commit(b'obj', commit_2_id, tree_2_id, exr.out)
+        verify_only_refs(heads=[], tags=(b'obj',))
+         
+    wvstart(get_disposition + ' ' + flavormsg + ' commit/save to branch')
+    for item in (b'.tag/commit-2', b'src/' + save_2):
+        for given in (None, (b'.tag/commit-1', b'obj'), (b'.tag/commit-2', b'obj')):
+            exr = run_get(get_disposition, flavor, (item, b'obj'), given=given)
+            wvpasseq(0, exr.rc)
+            validate_clean_repo()
+            validate_new_save(b'obj/latest', getcwd() + b'/src',
+                              commit_2_id, tree_2_id, b'src-2', exr.out)
+            verify_only_refs(heads=(b'obj',), tags=[])
+
+    wvstart(get_disposition + ' ' + flavormsg
+            + ' commit/save unrelated commit to branch')
+    for item in(b'.tag/commit-2', b'src/' + save_2):
+        exr = run_get(get_disposition, flavor, (item, b'obj'),
+                      given=(b'unrelated-branch', b'obj'))
+        wvpasseq(0, exr.rc)
+        validate_clean_repo()
+        validate_new_save(b'obj/latest', getcwd() + b'/src',
+                          commit_2_id, tree_2_id, b'src-2', exr.out)
+        verify_only_refs(heads=(b'obj',), tags=[])
+
+    wvstart(get_disposition + ' ' + flavormsg + ' commit/save ancestor to branch')
+    save_1 = src_info['save-1']
+    commit_1_id = src_info['commit-1-id']
+    tree_1_id = src_info['tree-1-id']
+    for item in (b'.tag/commit-1', b'src/' + save_1):
+        exr = run_get(get_disposition, flavor, (item, b'obj'),
+                      given=(b'.tag/commit-2', b'obj'))
+        wvpasseq(0, exr.rc)
+        validate_clean_repo()
+        validate_new_save(b'obj/latest', getcwd() + b'/src',
+                          commit_1_id, tree_1_id, b'src-1', exr.out)
+        verify_only_refs(heads=(b'obj',), tags=[])
+
+
+    wvstart(get_disposition + ' ' + flavormsg + ', implicit destinations')
+    exr = run_get(get_disposition, flavor, b'.tag/commit-2')
+    wvpasseq(0, exr.rc)
+    validate_clean_repo()
+    validate_new_tagged_commit(b'commit-2', commit_2_id, tree_2_id, exr.out)
+    verify_only_refs(heads=[], tags=(b'commit-2',))
+
+    exr = run_get(get_disposition, flavor, b'src/latest')
+    wvpasseq(0, exr.rc)
+    validate_clean_repo()
+    validate_new_save(b'src/latest', getcwd() + b'/src',
+                      commit_2_id, tree_2_id, b'src-2', exr.out)
+    verify_only_refs(heads=(b'src',), tags=[])
+
+def test_new_tag(get_disposition, src_info):
+    tinyfile_id = src_info['tinyfile-id']
+    tinyfile_path = src_info['tinyfile-path']
+    commit_2_id = src_info['commit-2-id']
+    tree_2_id = src_info['tree-2-id']
+    subtree_id = src_info['subtree-id']
+    subtree_vfs_path = src_info['subtree-vfs-path']
+
+    wvstart(get_disposition + ' --new-tag to root fails')
+    for item in (b'.tag/tinyfile',
+                 b'src/latest' + tinyfile_path,
+                 b'.tag/subtree',
+                 b'src/latest' + subtree_vfs_path,
+                 b'.tag/commit-1',
+                 b'src/latest',
+                 b'src'):
+        exr = run_get(get_disposition, b'--new-tag', (item, b'/'))
+        wvpassne(0, exr.rc)
+        verify_rx(br'destination for .+ must be a VFS tag', exr.err)
+
+    # Anything to new tag.
+    wvstart(get_disposition + ' --new-tag, blob tag')
+    for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
+        exr = run_get(get_disposition, b'--new-tag', (item, b'.tag/obj'))
+        wvpasseq(0, exr.rc)        
+        validate_blob(tinyfile_id, tinyfile_id)
+        verify_only_refs(heads=[], tags=(b'obj',))
+
+    wvstart(get_disposition + ' --new-tag, tree tag')
+    for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
+        exr = run_get(get_disposition, b'--new-tag', (item, b'.tag/obj'))
+        wvpasseq(0, exr.rc)        
+        validate_tree(subtree_id, subtree_id)
+        verify_only_refs(heads=[], tags=(b'obj',))
+        
+    wvstart(get_disposition + ' --new-tag, committish tag')
+    for item in (b'.tag/commit-2', b'src/latest', b'src'):
+        exr = run_get(get_disposition, b'--new-tag', (item, b'.tag/obj'))
+        wvpasseq(0, exr.rc)        
+        validate_tagged_save(b'obj', getcwd() + b'/src/', commit_2_id, tree_2_id,
+                             b'src-2', exr.out)
+        verify_only_refs(heads=[], tags=(b'obj',))
+
+    # Anything to existing tag (fails).
+    for ex_type, ex_tag in (('blob', (b'.tag/tinyfile', b'.tag/obj')),
+                            ('tree', (b'.tag/tree-1', b'.tag/obj')),
+                            ('commit', (b'.tag/commit-1', b'.tag/obj'))):
+        for item_type, item in (('blob tag', b'.tag/tinyfile'),
+                                ('blob path', b'src/latest' + tinyfile_path),
+                                ('tree tag', b'.tag/subtree'),
+                                ('tree path', b'src/latest' + subtree_vfs_path),
+                                ('commit tag', b'.tag/commit-2'),
+                                ('save', b'src/latest'),
+                                ('branch', b'src')):
+            wvstart(get_disposition + ' --new-tag of ' + item_type
+                    + ', given existing ' + ex_type + ' tag, fails')
+            exr = run_get(get_disposition, b'--new-tag', (item, b'.tag/obj'),
+                          given=ex_tag)
+            wvpassne(0, exr.rc)
+            verify_rx(br'cannot overwrite existing tag .* \(requires --replace\)',
+                      exr.err)
+
+    # Anything to branch (fails).
+    for ex_type, ex_tag in (('nothing', None),
+                            ('blob', (b'.tag/tinyfile', b'.tag/obj')),
+                            ('tree', (b'.tag/tree-1', b'.tag/obj')),
+                            ('commit', (b'.tag/commit-1', b'.tag/obj'))):
+        for item_type, item in (('blob tag', b'.tag/tinyfile'),
+                ('blob path', b'src/latest' + tinyfile_path),
+                ('tree tag', b'.tag/subtree'),
+                ('tree path', b'src/latest' + subtree_vfs_path),
+                ('commit tag', b'.tag/commit-2'),
+                ('save', b'src/latest'),
+                ('branch', b'src')):
+            wvstart(get_disposition + ' --new-tag to branch of ' + item_type
+                    + ', given existing ' + ex_type + ' tag, fails')
+            exr = run_get(get_disposition, b'--new-tag', (item, b'obj'),
+                          given=ex_tag)
+            wvpassne(0, exr.rc)
+            verify_rx(br'destination for .+ must be a VFS tag', exr.err)
+
+    wvstart(get_disposition + ' --new-tag, implicit destinations')
+    exr = run_get(get_disposition, b'--new-tag', b'.tag/commit-2')
+    wvpasseq(0, exr.rc)        
+    validate_tagged_save(b'commit-2', getcwd() + b'/src/', commit_2_id, tree_2_id,
+                         b'src-2', exr.out)
+    verify_only_refs(heads=[], tags=(b'commit-2',))
+
+def test_unnamed(get_disposition, src_info):
+    tinyfile_id = src_info['tinyfile-id']
+    tinyfile_path = src_info['tinyfile-path']
+    subtree_vfs_path = src_info['subtree-vfs-path']
+    wvstart(get_disposition + ' --unnamed to root fails')
+    for item in (b'.tag/tinyfile',
+                 b'src/latest' + tinyfile_path,
+                 b'.tag/subtree',
+                 b'src/latest' + subtree_vfs_path,
+                 b'.tag/commit-1',
+                 b'src/latest',
+                 b'src'):
+        for ex_ref in (None, (item, b'.tag/obj')):
+            exr = run_get(get_disposition, b'--unnamed', (item, b'/'),
+                          given=ex_ref)
+            wvpassne(0, exr.rc)
+            verify_rx(br'usage: bup get ', exr.err)
+
+    wvstart(get_disposition + ' --unnamed file')
+    for item in (b'.tag/tinyfile', b'src/latest' + tinyfile_path):
+        exr = run_get(get_disposition, b'--unnamed', item)
+        wvpasseq(0, exr.rc)        
+        validate_blob(tinyfile_id, tinyfile_id)
+        verify_only_refs(heads=[], tags=[])
+
+        exr = run_get(get_disposition, b'--unnamed', item,
+                      given=(item, b'.tag/obj'))
+        wvpasseq(0, exr.rc)        
+        validate_blob(tinyfile_id, tinyfile_id)
+        verify_only_refs(heads=[], tags=(b'obj',))
+
+    wvstart(get_disposition + ' --unnamed tree')
+    subtree_id = src_info['subtree-id']
+    for item in (b'.tag/subtree', b'src/latest' + subtree_vfs_path):
+        exr = run_get(get_disposition, b'--unnamed', item)
+        wvpasseq(0, exr.rc)        
+        validate_tree(subtree_id, subtree_id)
+        verify_only_refs(heads=[], tags=[])
+        
+        exr = run_get(get_disposition, b'--unnamed', item,
+                      given=(item, b'.tag/obj'))
+        wvpasseq(0, exr.rc)        
+        validate_tree(subtree_id, subtree_id)
+        verify_only_refs(heads=[], tags=(b'obj',))
+        
+    wvstart(get_disposition + ' --unnamed committish')
+    save_2 = src_info['save-2']
+    commit_2_id = src_info['commit-2-id']
+    for item in (b'.tag/commit-2', b'src/' + save_2, b'src'):
+        exr = run_get(get_disposition, b'--unnamed', item)
+        wvpasseq(0, exr.rc)        
+        validate_commit(commit_2_id, commit_2_id)
+        verify_only_refs(heads=[], tags=[])
+
+        exr = run_get(get_disposition, b'--unnamed', item,
+                      given=(item, b'.tag/obj'))
+        wvpasseq(0, exr.rc)        
+        validate_commit(commit_2_id, commit_2_id)
+        verify_only_refs(heads=[], tags=(b'obj',))
+
+def create_get_src():
+    global bup_cmd, src_info
+    wvstart('preparing')
+    ex((bup_cmd, b'-d', b'get-src', b'init'))
+
+    mkdir(b'src')
+    open(b'src/unrelated', 'a').close()
+    ex((bup_cmd, b'-d', b'get-src', b'index', b'src'))
+    ex((bup_cmd, b'-d', b'get-src', b'save', b'-tcn', b'unrelated-branch', b'src'))
+
+    ex((bup_cmd, b'-d', b'get-src', b'index', b'--clear'))
+    rmrf(b'src')
+    mkdir(b'src')
+    open(b'src/zero', 'a').close()
+    ex((bup_cmd, b'-d', b'get-src', b'index', b'src'))
+    exr = exo((bup_cmd, b'-d', b'get-src', b'save', b'-tcn', b'src', b'src'))
+    out = exr.out.splitlines()
+    tree_0_id = out[0]
+    commit_0_id = out[-1]
+    exr = exo((bup_cmd, b'-d', b'get-src', b'ls', b'src'))
+    save_0 = exr.out.splitlines()[0]
+    ex((b'git', b'--git-dir', b'get-src', b'branch', b'src-0', b'src'))
+    ex((b'cp', b'-RPp', b'src', b'src-0'))
+    
+    rmrf(b'src')
+    mkdir(b'src')
+    mkdir(b'src/x')
+    mkdir(b'src/x/y')
+    ex((bup_cmd + b' -d get-src random 1k > src/1'), shell=True)
+    ex((bup_cmd + b' -d get-src random 1k > src/x/2'), shell=True)
+    ex((bup_cmd, b'-d', b'get-src', b'index', b'src'))
+    exr = exo((bup_cmd, b'-d', b'get-src', b'save', b'-tcn', b'src', b'src'))
+    out = exr.out.splitlines()
+    tree_1_id = out[0]
+    commit_1_id = out[-1]
+    exr = exo((bup_cmd, b'-d', b'get-src', b'ls', b'src'))
+    save_1 = exr.out.splitlines()[1]
+    ex((b'git', b'--git-dir', b'get-src', b'branch', b'src-1', b'src'))
+    ex((b'cp', b'-RPp', b'src', b'src-1'))
+    
+    # Make a copy the current state of src so we'll have an ancestor.
+    ex((b'cp', b'-RPp',
+         b'get-src/refs/heads/src', b'get-src/refs/heads/src-ancestor'))
+
+    with open(b'src/tiny-file', 'ab') as f: f.write(b'xyzzy')
+    ex((bup_cmd, b'-d', b'get-src', b'index', b'src'))
+    ex((bup_cmd, b'-d', b'get-src', b'tick'))  # Ensure the save names differ
+    exr = exo((bup_cmd, b'-d', b'get-src', b'save', b'-tcn', b'src', b'src'))
+    out = exr.out.splitlines()
+    tree_2_id = out[0]
+    commit_2_id = out[-1]
+    exr = exo((bup_cmd, b'-d', b'get-src', b'ls', b'src'))
+    save_2 = exr.out.splitlines()[2]
+    rename(b'src', b'src-2')
+
+    src_root = getcwd() + b'/src'
+
+    subtree_path = b'src-2/x'
+    subtree_vfs_path = src_root + b'/x'
+
+    # No support for "ls -d", so grep...
+    exr = exo((bup_cmd, b'-d', b'get-src', b'ls', b'-s', b'src/latest' + src_root))
+    out = exr.out.splitlines()
+    subtree_id = None
+    for line in out:
+        if b'x' in line:
+            subtree_id = line.split()[0]
+    assert(subtree_id)
+
+    # With a tiny file, we'll get a single blob, not a chunked tree
+    tinyfile_path = src_root + b'/tiny-file'
+    exr = exo((bup_cmd, b'-d', b'get-src', b'ls', b'-s', b'src/latest' + tinyfile_path))
+    tinyfile_id = exr.out.splitlines()[0].split()[0]
+
+    ex((bup_cmd, b'-d', b'get-src', b'tag', b'tinyfile', tinyfile_id))
+    ex((bup_cmd, b'-d', b'get-src', b'tag', b'subtree', subtree_id))
+    ex((bup_cmd, b'-d', b'get-src', b'tag', b'tree-0', tree_0_id))
+    ex((bup_cmd, b'-d', b'get-src', b'tag', b'tree-1', tree_1_id))
+    ex((bup_cmd, b'-d', b'get-src', b'tag', b'tree-2', tree_2_id))
+    ex((bup_cmd, b'-d', b'get-src', b'tag', b'commit-0', commit_0_id))
+    ex((bup_cmd, b'-d', b'get-src', b'tag', b'commit-1', commit_1_id))
+    ex((bup_cmd, b'-d', b'get-src', b'tag', b'commit-2', commit_2_id))
+    ex((b'git', b'--git-dir', b'get-src', b'branch', b'commit-1', commit_1_id))
+    ex((b'git', b'--git-dir', b'get-src', b'branch', b'commit-2', commit_2_id))
+
+    return {'tinyfile-path' : tinyfile_path,
+            'tinyfile-id' : tinyfile_id,
+            'subtree-id' : subtree_id,
+            'tree-0-id' : tree_0_id,
+            'tree-1-id' : tree_1_id,
+            'tree-2-id' : tree_2_id,
+            'commit-0-id' : commit_0_id,
+            'commit-1-id' : commit_1_id,
+            'commit-2-id' : commit_2_id,
+            'save-1' : save_1,
+            'save-2' : save_2,
+            'subtree-path' : subtree_path,
+            'subtree-vfs-path' : subtree_vfs_path}
+    
+# FIXME: this fails in a strange way:
+#   WVPASS given nothing get --ff not-there
+
+dispositions_to_test = ('get',)
+
+if int(environ.get(b'BUP_TEST_LEVEL', b'0')) >= 11:
+    dispositions_to_test += ('get-on', 'get-to')
+
+if len(compat.argv) == 1:
+    categories = ('replace', 'universal', 'ff', 'append', 'pick', 'new-tag',
+             'unnamed')
+else:
+    categories = compat.argv[1:]
+    
+with test_tempdir(b'get-') as tmpdir:
+    chdir(tmpdir)
+    try:
+        src_info = create_get_src()
+        for category in categories:
+            for disposition in dispositions_to_test:
+                # given=FOO depends on --replace, so test it early
+                if category == 'replace':
+                    test_replace(disposition, src_info)
+                elif category == 'universal':
+                    test_universal_behaviors(disposition)
+                elif category == 'ff':
+                    test_ff(disposition, src_info)
+                elif category == 'append':
+                    test_append(disposition, src_info)
+                elif category == 'pick':
+                    test_pick(disposition, src_info, force=False)
+                    test_pick(disposition, src_info, force=True)
+                elif category == 'new-tag':
+                    test_new_tag(disposition, src_info)
+                elif category == 'unnamed':
+                    test_unnamed(disposition, src_info)
+                else:
+                    raise Exception('unrecognized get test category')
+    except Exception as ex:
+        chdir(top)
+        raise
+    chdir(top)
+
+wvmsg('checked %d cases' % get_cases_tested)
diff --git a/test/ext/test-help b/test/ext/test-help
new file mode 100755 (executable)
index 0000000..56806a7
--- /dev/null
@@ -0,0 +1,38 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+# FIXME: send help to stdout if requested (exit 0), stderr on error
+# (exit nonzero)
+
+bup -?
+rc=$?
+WVPASSEQ 99 "$rc"
+
+bup --help
+rc=$?
+WVPASSEQ 99 "$rc"
+
+if ! test -e Documentation/bup-save.1; then
+    WVPASS rm -rf "$tmpdir"
+    exit 0
+fi
+
+mkdir -p "$tmpdir/man"
+(cd "$tmpdir/man" && ln -s "$top/Documentation" man1)
+export MANPATH="$tmpdir/man"
+
+WVPASS bup help save
+WVPASS bup save --help
+WVPASSEQ 1 $(bup help save | head -1 | grep -cF 'bup-save(1)')
+WVPASSEQ 1 $(bup save --help | head -1 | grep -cF 'bup-save(1)')
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-import-duplicity.sh b/test/ext/test-import-duplicity.sh
new file mode 100755 (executable)
index 0000000..9374f9a
--- /dev/null
@@ -0,0 +1,52 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+
+set -o pipefail
+
+if ! [ "$(type -p duplicity)" != "" ]; then
+    # FIXME: add WVSKIP.
+    echo "Cannot find duplicity; skipping test)" 1>&2
+    exit 0
+fi
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+bup() { "$top/bup" "$@"; }
+dup() { duplicity --archive-dir "$tmpdir/dup-cache" "$@"; }
+
+WVSTART "import-duplicity"
+WVPASS "$top/dev/sync-tree" "$top/test/sampledata/" "$tmpdir/src/"
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+export PASSPHRASE=bup_duplicity_passphrase
+
+WVPASS bup init
+WVPASS cd "$tmpdir"
+WVPASS mkdir duplicity
+WVPASS dup src file://duplicity
+WVPASS bup tick
+WVPASS touch src/new-file
+WVPASS dup src file://duplicity
+WVPASS bup import-duplicity "file://duplicity" import-duplicity
+WVPASSEQ $(bup ls import-duplicity/ | wc -l) 3
+WVPASSEQ "$(bup ls import-duplicity/latest/ | sort)" "$(ls src | sort)"
+WVPASS bup restore -C restore/ import-duplicity/latest/
+WVFAIL "$top/dev/compare-trees" src/ restore/ > tmp-compare-trees
+WVPASSEQ $(cat tmp-compare-trees | wc -l) 4
+# Note: OS X rsync itemize output is currently only 9 chars, not 11.
+# FreeBSD may output 12 chars instead - accept 9-12
+# Expect something like this (without the leading spaces):
+#   .d..t...... ./
+#   .L..t...... abs-symlink -> /home/foo/bup/test/sampledata/var/abs-symlink-target
+#   .L..t...... b -> a
+#   .L..t...... c -> b
+expected_diff_rx='^\.d\.\.t\.{4,7} \./$|^\.L\.\.t\.{4,7} '
+if ! grep -qE "$expected_diff_rx" tmp-compare-trees; then
+    echo -n 'tmp-compare-trees: ' 1>&2
+    cat tmp-compare-trees 1>&2
+fi
+WVPASS grep -qE "$expected_diff_rx" tmp-compare-trees
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-import-rdiff-backup.sh b/test/ext/test-import-rdiff-backup.sh
new file mode 100755 (executable)
index 0000000..359f081
--- /dev/null
@@ -0,0 +1,33 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+if ! [ "$(type -p rdiff-backup)" != "" ]; then
+    # FIXME: add WVSKIP.
+    echo "Cannot find rdiff-backup; skipping test)" 1>&2
+    exit 0
+fi
+
+D=rdiff-backup.tmp
+WVSTART "import-rdiff-backup"
+WVPASS bup init
+WVPASS cd "$tmpdir"
+WVPASS mkdir rdiff-backup
+WVPASS rdiff-backup "$top/lib/cmd" rdiff-backup
+WVPASS bup tick
+WVPASS rdiff-backup "$top/Documentation" rdiff-backup
+WVPASS bup import-rdiff-backup rdiff-backup import-rdiff-backup
+WVPASSEQ $(bup ls import-rdiff-backup/ | wc -l) 3
+WVPASSEQ "$(bup ls -A import-rdiff-backup/latest/ | sort)" \
+    "$(ls -A "$top/Documentation" | sort)"
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-index-check-device.sh b/test/ext/test-index-check-device.sh
new file mode 100755 (executable)
index 0000000..1326df1
--- /dev/null
@@ -0,0 +1,89 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. ./dev/lib.sh || exit $?
+
+set -o pipefail
+
+root_status="$(dev/root-status)" || exit $?
+
+if [ "$root_status" != root ]; then
+    echo 'Not root: skipping --check-device tests.'
+    exit 0 # FIXME: add WVSKIP.
+fi
+
+if test -n "$(type -p modprobe)" && ! modprobe loop; then
+    echo 'Unable to load loopback module; skipping --check-device test.' 1>&2
+    exit 0
+fi
+
+if test -z "$(type -p losetup)"; then
+    echo 'Unable to find losetup: skipping --check-device tests.' 1>&2
+    exit 0 # FIXME: add WVSKIP.
+fi
+
+if test -z "$(type -p mke2fs)"; then
+    echo 'Unable to find mke2fs: skipping --check-device tests.' 1>&2
+    exit 0 # FIXME: add WVSKIP.
+fi
+
+WVSTART '--check-device'
+
+top="$(pwd)"
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+srcmnt="$(WVPASS wvmkmountpt)" || exit $?
+tmpmnt1="$(WVPASS wvmkmountpt)" || exit $?
+tmpmnt2="$(WVPASS wvmkmountpt)" || exit $?
+
+WVPASS cd "$tmpdir"
+
+WVPASS dd if=/dev/zero of=testfs.img bs=1M count=32
+WVPASS mke2fs -F -j -m 0 testfs.img
+WVPASS mount -o loop testfs.img "$tmpmnt1"
+# Hide, so that tests can't create risks.
+WVPASS chown root:root "$tmpmnt1"
+WVPASS chmod 0700 "$tmpmnt1"
+
+# Create trivial content.
+WVPASS date > "$tmpmnt1/foo"
+WVPASS umount "$tmpmnt1"
+
+# Mount twice, so we'll have the same content with different devices.
+WVPASS cp -pP testfs.img testfs2.img
+WVPASS mount -oro,loop testfs.img "$tmpmnt1"
+WVPASS mount -oro,loop testfs2.img "$tmpmnt2"
+
+# Test default behavior: --check-device.
+WVPASS mount -oro --bind "$tmpmnt1" "$srcmnt"
+WVPASS bup init
+WVPASS bup index --fake-valid "$srcmnt"
+WVPASS umount "$srcmnt"
+WVPASS mount -oro --bind "$tmpmnt2" "$srcmnt"
+WVPASS bup index "$srcmnt"
+WVPASSEQ "$(bup index --status "$srcmnt")" \
+"M $srcmnt/lost+found/
+M $srcmnt/foo
+M $srcmnt/"
+WVPASS umount "$srcmnt"
+
+WVSTART '--no-check-device'
+WVPASS mount -oro --bind "$tmpmnt1" "$srcmnt"
+WVPASS bup index --clear
+WVPASS bup index --fake-valid "$srcmnt"
+WVPASS umount "$srcmnt"
+WVPASS mount -oro --bind "$tmpmnt2" "$srcmnt"
+WVPASS bup index --no-check-device "$srcmnt"
+WVPASS bup index --status "$srcmnt"
+WVPASSEQ "$(bup index --status "$srcmnt")" \
+"  $srcmnt/lost+found/
+  $srcmnt/foo
+  $srcmnt/"
+
+WVPASS umount "$srcmnt"
+WVPASS umount "$tmpmnt1"
+WVPASS umount "$tmpmnt2"
+WVPASS rm -r "$tmpmnt1" "$tmpmnt2" "$tmpdir"
diff --git a/test/ext/test-index-clear.sh b/test/ext/test-index-clear.sh
new file mode 100755 (executable)
index 0000000..05cd848
--- /dev/null
@@ -0,0 +1,36 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+
+WVPASS bup init
+WVPASS cd "$tmpdir"
+
+
+WVSTART "index --clear"
+WVPASS mkdir src
+WVPASS touch src/foo src/bar
+WVPASS bup index -u src
+WVPASSEQ "$(bup index -p)" "src/foo
+src/bar
+src/
+./"
+WVPASS rm src/foo
+WVPASS bup index --clear
+WVPASS bup index -u src
+expected="$(WVPASS bup index -p)" || exit $?
+WVPASSEQ "$expected" "src/bar
+src/
+./"
+
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-index.sh b/test/ext/test-index.sh
new file mode 100755 (executable)
index 0000000..6504f9c
--- /dev/null
@@ -0,0 +1,127 @@
+#!/usr/bin/env bash
+. wvtest.sh
+. wvtest-bup.sh
+. dev/lib.sh
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+WVPASS bup init
+
+WVSTART "index"
+D=bupdata.tmp
+WVPASS force-delete $D
+WVPASS mkdir $D
+WVFAIL bup index --exclude-from $D/cannot-exist $D
+WVPASSEQ "$(bup index --check -p)" ""
+WVPASSEQ "$(bup index --check -p $D)" ""
+WVFAIL [ -e $D.fake ]
+WVFAIL bup index --check -u $D.fake
+WVPASS bup index --check -u $D
+WVPASSEQ "$(bup index --check -p $D)" "$D/"
+WVPASS touch $D/a
+WVPASS bup random 128k >$D/b
+WVPASS mkdir $D/d $D/d/e
+WVPASS bup random 512 >$D/f
+WVPASS ln -s non-existent-file $D/g
+WVPASSEQ "$(bup index -s $D/)" "A $D/"
+WVPASSEQ "$(bup index -s $D/b)" ""
+WVPASSEQ "$(bup index --check -us $D/b)" "A $D/b"
+WVPASSEQ "$(bup index --check -us $D/b $D/d)" \
+"A $D/d/e/
+A $D/d/
+A $D/b"
+WVPASS touch $D/d/z
+WVPASS bup tick
+WVPASSEQ "$(bup index --check -usx $D)" \
+"A $D/g
+A $D/f
+A $D/d/z
+A $D/d/e/
+A $D/d/
+A $D/b
+A $D/a
+A $D/"
+WVPASSEQ "$(bup index --check -us $D/a $D/b --fake-valid)" \
+"  $D/b
+  $D/a"
+WVPASSEQ "$(bup index --check -us $D/a)" "  $D/a"  # stays unmodified
+WVPASSEQ "$(bup index --check -us $D/d --fake-valid)" \
+"  $D/d/z
+  $D/d/e/
+  $D/d/"
+WVPASS touch $D/d/z
+WVPASS bup index -u $D/d/z  # becomes modified
+WVPASSEQ "$(bup index -s $D/a $D $D/b)" \
+"A $D/g
+A $D/f
+M $D/d/z
+  $D/d/e/
+M $D/d/
+  $D/b
+  $D/a
+A $D/"
+
+WVPASS bup index -u $D/d/e $D/a --fake-invalid
+WVPASSEQ "$(cd $D && bup index -m .)" \
+"./g
+./f
+./d/z
+./d/e/
+./d/
+./a
+./"
+WVPASSEQ "$(cd $D && bup index -m)" \
+"g
+f
+d/z
+d/e/
+d/
+a
+./"
+WVPASSEQ "$(cd $D && bup index -s .)" "$(cd $D && bup index -s .)"
+
+WVFAIL bup save -t $D/doesnt-exist-filename
+
+WVPASS mv "$BUP_DIR/bupindex" "$BUP_DIR/bi.old"
+WVFAIL bup save -t $D/d/e/fifotest
+WVPASS mkfifo $D/d/e/fifotest
+WVPASS bup index -u $D/d/e/fifotest
+WVPASS bup save -t $D/d/e/fifotest
+WVPASS bup save -t $D/d/e
+WVPASS rm -f $D/d/e/fifotest
+WVPASS bup index -u $D/d/e
+WVFAIL bup save -t $D/d/e/fifotest
+WVPASS mv "$BUP_DIR/bi.old" "$BUP_DIR/bupindex"
+
+WVPASS bup index -u $D/d/e
+WVPASS bup save -t $D/d/e
+WVPASSEQ "$(cd $D && bup index -m)" \
+"g
+f
+d/z
+d/
+a
+./"
+WVPASS bup save -t $D/d
+WVPASS bup index --fake-invalid $D/d/z
+WVPASS bup save -t $D/d/z
+WVPASS bup save -t $D/d/z  # test regenerating trees when no files are changed
+WVPASS bup save -t $D/d
+WVPASSEQ "$(cd $D && bup index -m)" \
+"g
+f
+a
+./"
+WVPASS bup save -r ":$BUP_DIR" -n r-test $D
+WVFAIL bup save -r ":$BUP_DIR/fake/path" -n r-test $D
+WVFAIL bup save -r ":$BUP_DIR" -n r-test $D/fake/path
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-list-idx.sh b/test/ext/test-list-idx.sh
new file mode 100755 (executable)
index 0000000..ad72ab4
--- /dev/null
@@ -0,0 +1,34 @@
+#!/usr/bin/env bash
+. wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+TOP="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+bup()
+{
+    "$TOP/bup" "$@"
+}
+
+WVSTART 'bup list-idx'
+
+WVPASS bup init
+WVPASS cd "$tmpdir"
+WVPASS mkdir src
+WVPASS bup random 1k > src/data
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS bup list-idx "$BUP_DIR"/objects/pack/*.idx
+hash1="$(WVPASS bup list-idx "$BUP_DIR"/objects/pack/*.idx)" || exit $?
+hash1="${hash1##* }"
+WVPASS bup list-idx --find "${hash1}" "$BUP_DIR"/objects/pack/*.idx \
+       > list-idx.log || exit $?
+found="$(cat list-idx.log)" || exit $?
+found="${found##* }"
+WVPASSEQ "$found" "$hash1"
+WVPASSEQ "$(wc -l < list-idx.log | tr -d ' ')" 1
+
+WVPASS rm -r "$tmpdir"
diff --git a/test/ext/test-ls b/test/ext/test-ls
new file mode 100755 (executable)
index 0000000..8a93c39
--- /dev/null
@@ -0,0 +1,297 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+if test "$BUP_TEST_REMOTE_REPO"; then
+    ls_cmd_desc='ls -r'
+else
+    ls_cmd_desc='ls'
+fi
+    
+bup() { "$top/bup" "$@"; }
+
+bup-ls() {
+    if test "$BUP_TEST_REMOTE_REPO"; then
+        "$top/bup" ls -r "$BUP_DIR" "$@"
+    else
+        "$top/bup" ls "$@"
+    fi
+}
+
+
+export TZ=UTC
+
+WVPASS bup init
+WVPASS cd "$tmpdir"
+
+WVPASS mkdir src
+WVPASS touch src/.dotfile src/executable
+WVPASS mkfifo src/fifo
+WVPASS "$top"/dev/mksock src/socket
+WVPASS bup random 1k > src/file
+WVPASS chmod u+x src/executable
+WVPASS chmod -R u=rwX,g-rwx,o-rwx .
+WVPASS touch -t 200910032348 src/.dotfile src/*
+(WVPASS cd src; WVPASS ln -s file symlink) || exit $?
+(WVPASS cd src; WVPASS ln -s not-there bad-symlink) || exit $?
+WVPASS touch -t 200910032348 src
+WVPASS touch -t 200910032348 .
+WVPASS bup index src
+# Include two saves to test multiple results per ref from rev_list.
+WVPASS bup save -n src -d 242312159 --strip src
+WVPASS bup save -n src -d 242312160 --strip src
+WVPASS bup tag some-tag src
+
+uid="$(WVPASS id -u)" || exit $?
+gid="$(WVPASS bup-cfg-py -c 'import os; print(os.stat("src").st_gid)')" || exit $?
+user="$(WVPASS id -un)" || exit $?
+group="$(WVPASS bup-cfg-py -c 'import grp, os;
+print(grp.getgrgid(os.stat("src").st_gid)[0])')" || exit $?
+src_commit_hash=$(git log --format=%H -n1 src)
+src_tree_hash=$(git log --format=%T -n1 src)
+
+
+WVSTART "$ls_cmd_desc (short)"
+
+(export BUP_FORCE_TTY=1; WVPASSEQ "$(WVPASS bup-ls | tr -d ' ')" src)
+
+WVPASSEQ "$(WVPASS bup-ls /)" "src"
+
+WVPASSEQ "$(WVPASS bup-ls -A /)" ".tag
+src"
+
+WVPASSEQ "$(WVPASS bup-ls -AF /)" ".tag/
+src/"
+
+WVPASSEQ "$(WVPASS bup-ls -a /)" ".
+..
+.tag
+src"
+
+WVPASSEQ "$(WVPASS bup-ls -aF /)" "./
+../
+.tag/
+src/"
+
+WVPASSEQ "$(WVPASS bup-ls /.tag)" "some-tag"
+
+WVPASSEQ "$(WVPASS bup-ls /src)" \
+"1977-09-05-125559
+1977-09-05-125600
+latest"
+
+WVPASSEQ "$(WVPASS bup-ls src/latest)" "bad-symlink
+executable
+fifo
+file
+socket
+symlink"
+
+WVPASSEQ "$(WVPASS bup-ls -A src/latest)" ".dotfile
+bad-symlink
+executable
+fifo
+file
+socket
+symlink"
+
+WVPASSEQ "$(WVPASS bup-ls -a src/latest)" ".
+..
+.dotfile
+bad-symlink
+executable
+fifo
+file
+socket
+symlink"
+
+WVPASSEQ "$(WVPASS bup-ls -F src/latest)" "bad-symlink@
+executable*
+fifo|
+file
+socket=
+symlink@"
+
+WVPASSEQ "$(WVPASS bup-ls --file-type src/latest)" "bad-symlink@
+executable
+fifo|
+file
+socket=
+symlink@"
+
+WVPASSEQ "$(WVPASS bup-ls -d src/latest)" "src/latest"
+
+
+WVSTART "$ls_cmd_desc (long)"
+
+WVPASSEQ "$(WVPASS bup-ls -l / | tr -s ' ' ' ')" \
+"drwx------ $user/$group 0 2009-10-03 23:48 src"
+
+WVPASSEQ "$(WVPASS bup-ls -lA / | tr -s ' ' ' ')" \
+"drwxr-xr-x ?/? 0 1970-01-01 00:00 .tag
+drwx------ $user/$group 0 2009-10-03 23:48 src"
+
+WVPASSEQ "$(WVPASS bup-ls -lAF / | tr -s ' ' ' ')" \
+"drwxr-xr-x ?/? 0 1970-01-01 00:00 .tag/
+drwx------ $user/$group 0 2009-10-03 23:48 src/"
+
+WVPASSEQ "$(WVPASS bup-ls -la / | tr -s ' ' ' ')" \
+"drwxr-xr-x ?/? 0 1970-01-01 00:00 .
+drwxr-xr-x ?/? 0 1970-01-01 00:00 ..
+drwxr-xr-x ?/? 0 1970-01-01 00:00 .tag
+drwx------ $user/$group 0 2009-10-03 23:48 src"
+
+WVPASSEQ "$(WVPASS bup-ls -laF / | tr -s ' ' ' ')" \
+"drwxr-xr-x ?/? 0 1970-01-01 00:00 ./
+drwxr-xr-x ?/? 0 1970-01-01 00:00 ../
+drwxr-xr-x ?/? 0 1970-01-01 00:00 .tag/
+drwx------ $user/$group 0 2009-10-03 23:48 src/"
+
+socket_mode="$(WVPASS ls -l src/socket | cut -b -10)" || exit $?
+
+
+bad_symlink_mode="$(WVPASS ls -l src/bad-symlink | cut -b -10)" || exit $?
+
+bad_symlink_bup_info="$(WVPASS bup-ls -l src/latest | grep bad-symlink)" \
+    || exit $?
+bad_symlink_date="$(WVPASS echo "$bad_symlink_bup_info" \
+  | WVPASS perl -ne 'm/.*? (\d+) (\d\d\d\d-\d\d-\d\d \d\d:\d\d)/ and print $2')" \
+    || exit $?
+
+test "$bad_symlink_date" || exit 1
+
+if test "$(uname -s)" != NetBSD; then
+    bad_symlink_size="$(WVPASS bup-cfg-py -c "import os
+print(os.lstat('src/bad-symlink').st_size)")" || exit $?
+else
+    # NetBSD appears to return varying sizes, so for now, just ignore it.
+    bad_symlink_size="$(WVPASS echo "$bad_symlink_bup_info" \
+      | WVPASS perl -ne 'm/.*? (\d+) (\d\d\d\d-\d\d-\d\d \d\d:\d\d)/ and print $1')" \
+        || exit $?
+fi
+
+
+symlink_mode="$(WVPASS ls -l src/symlink | cut -b -10)" || exit $?
+
+symlink_bup_info="$(WVPASS bup-ls -l src/latest | grep -E '[^-]symlink')" \
+    || exit $?
+symlink_date="$(WVPASS echo "$symlink_bup_info" \
+  | WVPASS perl -ne 'm/.*? (\d+) (\d\d\d\d-\d\d-\d\d \d\d:\d\d)/ and print $2')" \
+    || exit $?
+
+test "$symlink_date" || exit 1
+
+if test "$(uname -s)" != NetBSD; then
+    symlink_size="$(WVPASS bup-cfg-py -c "import os
+print(os.lstat('src/symlink').st_size)")" || exit $?
+else
+    # NetBSD appears to return varying sizes, so for now, just ignore it.
+    symlink_size="$(WVPASS echo "$symlink_bup_info" \
+      | WVPASS perl -ne 'm/.*? (\d+) (\d\d\d\d-\d\d-\d\d \d\d:\d\d)/ and print $1')" \
+        || exit $?
+fi
+
+WVPASSEQ "$(bup-ls -l src/latest | tr -s ' ' ' ')" \
+"$bad_symlink_mode $user/$group $bad_symlink_size $bad_symlink_date bad-symlink -> not-there
+-rwx------ $user/$group 0 2009-10-03 23:48 executable
+prw------- $user/$group 0 2009-10-03 23:48 fifo
+-rw------- $user/$group 1024 2009-10-03 23:48 file
+$socket_mode $user/$group 0 2009-10-03 23:48 socket
+$symlink_mode $user/$group $symlink_size $symlink_date symlink -> file"
+
+WVPASSEQ "$(bup-ls -la src/latest | tr -s ' ' ' ')" \
+"drwx------ $user/$group 0 2009-10-03 23:48 .
+drwx------ $user/$group 0 2009-10-03 23:48 ..
+-rw------- $user/$group 0 2009-10-03 23:48 .dotfile
+$bad_symlink_mode $user/$group $bad_symlink_size $bad_symlink_date bad-symlink -> not-there
+-rwx------ $user/$group 0 2009-10-03 23:48 executable
+prw------- $user/$group 0 2009-10-03 23:48 fifo
+-rw------- $user/$group 1024 2009-10-03 23:48 file
+$socket_mode $user/$group 0 2009-10-03 23:48 socket
+$symlink_mode $user/$group $symlink_size $symlink_date symlink -> file"
+
+WVPASSEQ "$(bup-ls -lA src/latest | tr -s ' ' ' ')" \
+"-rw------- $user/$group 0 2009-10-03 23:48 .dotfile
+$bad_symlink_mode $user/$group $bad_symlink_size $bad_symlink_date bad-symlink -> not-there
+-rwx------ $user/$group 0 2009-10-03 23:48 executable
+prw------- $user/$group 0 2009-10-03 23:48 fifo
+-rw------- $user/$group 1024 2009-10-03 23:48 file
+$socket_mode $user/$group 0 2009-10-03 23:48 socket
+$symlink_mode $user/$group $symlink_size $symlink_date symlink -> file"
+
+WVPASSEQ "$(bup-ls -lF src/latest | tr -s ' ' ' ')" \
+"$bad_symlink_mode $user/$group $bad_symlink_size $bad_symlink_date bad-symlink@ -> not-there
+-rwx------ $user/$group 0 2009-10-03 23:48 executable*
+prw------- $user/$group 0 2009-10-03 23:48 fifo|
+-rw------- $user/$group 1024 2009-10-03 23:48 file
+$socket_mode $user/$group 0 2009-10-03 23:48 socket=
+$symlink_mode $user/$group $symlink_size $symlink_date symlink@ -> file"
+
+WVPASSEQ "$(bup-ls -l --file-type src/latest | tr -s ' ' ' ')" \
+"$bad_symlink_mode $user/$group $bad_symlink_size $bad_symlink_date bad-symlink@ -> not-there
+-rwx------ $user/$group 0 2009-10-03 23:48 executable
+prw------- $user/$group 0 2009-10-03 23:48 fifo|
+-rw------- $user/$group 1024 2009-10-03 23:48 file
+$socket_mode $user/$group 0 2009-10-03 23:48 socket=
+$symlink_mode $user/$group $symlink_size $symlink_date symlink@ -> file"
+
+WVPASSEQ "$(bup-ls -ln src/latest | tr -s ' ' ' ')" \
+"$bad_symlink_mode $uid/$gid $bad_symlink_size $bad_symlink_date bad-symlink -> not-there
+-rwx------ $uid/$gid 0 2009-10-03 23:48 executable
+prw------- $uid/$gid 0 2009-10-03 23:48 fifo
+-rw------- $uid/$gid 1024 2009-10-03 23:48 file
+$socket_mode $uid/$gid 0 2009-10-03 23:48 socket
+$symlink_mode $uid/$gid $symlink_size $symlink_date symlink -> file"
+
+WVPASSEQ "$(bup-ls -ld "src/latest" | tr -s ' ' ' ')" \
+"lrwxr-xr-x ?/? 17 1970-01-01 00:00 src/latest -> 1977-09-05-125600"
+
+
+WVSTART "$ls_cmd_desc (backup set - long)"
+WVPASSEQ "$(bup-ls -l --numeric-ids src | cut -d' ' -f 1-2)" \
+"drwx------ $uid/$gid
+drwx------ $uid/$gid
+lrwxr-xr-x ?/?"
+
+WVPASSEQ "$(bup-ls -ds "src/1977-09-05-125600" | tr -s ' ' ' ')" \
+"$src_tree_hash src/1977-09-05-125600"
+
+WVPASSEQ "$(bup-ls -ds --commit-hash "src/1977-09-05-125600" | tr -s ' ' ' ')" \
+"$src_commit_hash src/1977-09-05-125600"
+
+
+WVSTART "$ls_cmd_desc (dates TZ != UTC)"
+export TZ=America/Chicago
+bad_symlink_date_central="$(bup-ls -l src/latest | grep bad-symlink)"
+bad_symlink_date_central="$(echo "$bad_symlink_date_central" \
+  | perl -ne 'm/.*? (\d+) (\d\d\d\d-\d\d-\d\d \d\d:\d\d)/ and print $2')"
+symlink_date_central="$(bup-ls -l src/latest | grep -E '[^-]symlink')"
+symlink_date_central="$(echo "$symlink_date_central" \
+  | perl -ne 'm/.*? (\d+) (\d\d\d\d-\d\d-\d\d \d\d:\d\d)/ and print $2')"
+WVPASSEQ "$(bup-ls -ln src/latest | tr -s ' ' ' ')" \
+"$bad_symlink_mode $uid/$gid $bad_symlink_size $bad_symlink_date_central bad-symlink -> not-there
+-rwx------ $uid/$gid 0 2009-10-03 18:48 executable
+prw------- $uid/$gid 0 2009-10-03 18:48 fifo
+-rw------- $uid/$gid 1024 2009-10-03 18:48 file
+$socket_mode $uid/$gid 0 2009-10-03 18:48 socket
+$symlink_mode $uid/$gid $symlink_size $symlink_date_central symlink -> file"
+export TZ=UTC
+
+
+WVSTART "$ls_cmd_desc bad-symlink"
+WVPASSEQ "$(bup-ls "src/latest/bad-symlink")" "src/latest/bad-symlink"
+
+WVSTART "$ls_cmd_desc -l bad-symlink"
+WVPASSEQ "$(bup-ls -l src/latest/bad-symlink | tr -s ' ' ' ')" \
+"$bad_symlink_mode $user/$group $bad_symlink_size $bad_symlink_date src/latest/bad-symlink -> not-there"
+
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-ls-remote b/test/ext/test-ls-remote
new file mode 100755 (executable)
index 0000000..1c59c53
--- /dev/null
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+
+BUP_TEST_REMOTE_REPO=t test/ext/test-ls
diff --git a/test/ext/test-main.sh b/test/ext/test-main.sh
new file mode 100755 (executable)
index 0000000..60700ec
--- /dev/null
@@ -0,0 +1,22 @@
+#!/usr/bin/env bash
+. wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+TOP="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+bup()
+{
+    "$TOP/bup" "$@"
+}
+
+WVSTART 'main'
+
+bup
+rc=$?
+WVPASSEQ "$rc" 99
+
+WVPASS rm -r "$tmpdir"
diff --git a/test/ext/test-meta.sh b/test/ext/test-meta.sh
new file mode 100755 (executable)
index 0000000..b5b8568
--- /dev/null
@@ -0,0 +1,783 @@
+#!/usr/bin/env bash
+. wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+root_status="$(dev/root-status)" || exit $?
+
+TOP="$(WVPASS pwd)" || exit $?
+export PATH="$TOP/test/ext/bin:$PATH"
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+# Assume that mvmktempdir will always use the same dir.
+timestamp_resolutions="$(dev/ns-timestamp-resolutions "$tmpdir/canary")" \
+    || exit $?
+atime_resolution="$(echo $timestamp_resolutions | WVPASS cut -d' ' -f 1)" \
+    || exit $?
+mtime_resolution="$(echo $timestamp_resolutions | WVPASS cut -d' ' -f 2)" \
+    || exit $?
+WVPASS rm "$tmpdir/canary"
+
+bup()
+{
+    "$TOP/bup" "$@"
+}
+
+hardlink-sets()
+{
+    "$TOP/dev/hardlink-sets" "$@"
+}
+
+id-other-than()
+{
+    "$TOP/dev/id-other-than" "$@"
+}
+
+# Very simple metadata tests -- create a test tree then check that bup
+# meta can reproduce the metadata correctly (according to bup xstat)
+# via create, extract, start-extract, and finish-extract.  The current
+# tests are crude, and this does not fully test devices, varying
+# users/groups, acls, attrs, etc.
+
+genstat()
+{
+    (
+        export PATH="$TOP/bin:$PATH" # pick up bup
+        bup version
+        # Skip atime (test elsewhere) to avoid the observer effect.
+        WVPASS find . -print0 | WVPASS sort-z \
+            | WVPASS xargs -0 bup xstat \
+            --mtime-resolution "$mtime_resolution"ns \
+            --exclude-fields ctime,atime,size
+    )
+}
+
+test-src-create-extract()
+{
+    # Test bup meta create/extract for ./src -> ./src-restore.
+    # Also writes to ./src-stat and ./src-restore-stat.
+    (
+        (WVPASS cd src; WVPASS genstat) > src-stat || exit $?
+        WVPASS bup meta --create --recurse --file src.meta src
+        # Test extract.
+        WVPASS force-delete src-restore
+        WVPASS mkdir src-restore
+        WVPASS cd src-restore
+        WVPASS bup meta --extract --file ../src.meta
+        WVPASS test -d src
+        (WVPASS cd src; WVPASS genstat >../../src-restore-stat) || exit $?
+        WVPASS diff -U5 ../src-stat ../src-restore-stat
+        # Test start/finish extract.
+        WVPASS force-delete src
+        WVPASS bup meta --start-extract --file ../src.meta
+        WVPASS test -d src
+        WVPASS bup meta --finish-extract --file ../src.meta
+        (WVPASS cd src; WVPASS genstat >../../src-restore-stat) || exit $?
+        WVPASS diff -U5 ../src-stat ../src-restore-stat
+    )
+}
+
+test-src-save-restore()
+{
+    # Test bup save/restore metadata for ./src -> ./src-restore.  Also
+    # writes to BUP_DIR.  Note that for now this just tests the
+    # restore below src/, in order to avoid having to worry about
+    # operations that require root (like chown /home).
+    (
+        WVPASS rm -rf "$BUP_DIR"
+        WVPASS bup init
+        WVPASS bup index src
+        WVPASS bup save -t -n src src
+        # Test extract.
+        WVPASS force-delete src-restore
+        WVPASS mkdir src-restore
+        WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
+        WVPASS test -d src-restore/src
+        WVPASS "$TOP/dev/compare-trees" -c src/ src-restore/src/
+        WVPASS rm -rf src.bup
+    )
+}
+
+setup-test-tree()
+{
+    WVPASS "$TOP/dev/sync-tree" "$TOP/test/sampledata/" "$tmpdir/src/"
+
+    # Add some hard links for the general tests.
+    (
+        WVPASS cd "$tmpdir"/src
+        WVPASS touch hardlink-target
+        WVPASS ln hardlink-target hardlink-1
+        WVPASS ln hardlink-target hardlink-2
+        WVPASS ln hardlink-target hardlink-3
+    ) || exit $?
+
+    # Add some trivial files for the index, modify, save tests.
+    (
+        WVPASS cd "$tmpdir"/src
+        WVPASS mkdir volatile
+        WVPASS touch volatile/{1,2,3}
+    ) || exit $?
+
+    # Regression test for metadata sort order.  Previously, these two
+    # entries would sort in the wrong order because the metadata
+    # entries were being sorted by mangled name, but the index isn't.
+    WVPASS dd if=/dev/zero of="$tmpdir"/src/foo bs=1k count=33
+    WVPASS touch -t 201111111111 "$tmpdir"/src/foo
+    WVPASS touch -t 201112121111 "$tmpdir"/src/foo-bar
+
+    dev/mksock "$tmpdir"/src/test-socket || true
+}
+
+# Use the test tree to check bup meta.
+WVSTART 'meta --create/--extract'
+(
+    tmpdir="$(WVPASS wvmktempdir)" || exit $?
+    export BUP_DIR="$tmpdir/bup"
+    WVPASS setup-test-tree
+    WVPASS cd "$tmpdir"
+    WVPASS test-src-create-extract
+
+    # Test a top-level file (not dir).
+    WVPASS touch src-file
+    WVPASS bup meta -cf src-file.meta src-file
+    WVPASS mkdir dest
+    WVPASS cd dest
+    WVPASS bup meta -xf ../src-file.meta
+    WVPASS rm -r "$tmpdir"
+) || exit $?
+
+# Use the test tree to check bup save/restore metadata.
+WVSTART 'metadata save/restore (general)'
+(
+    tmpdir="$(WVPASS wvmktempdir)" || exit $?
+    export BUP_DIR="$tmpdir/bup"
+    WVPASS setup-test-tree
+    WVPASS cd "$tmpdir"
+    WVPASS test-src-save-restore
+
+    # Test a deeper subdir/ to make sure top-level non-dir metadata is
+    # restored correctly.  We need at least one dir and one non-dir at
+    # the "top-level".
+    WVPASS test -d src/var/cmd
+    WVPASS test -f src/var/cmd/save-cmd.py
+    WVPASS rm -rf "$BUP_DIR"
+    WVPASS bup init
+    WVPASS touch -t 201111111111 src-restore # Make sure the top won't match.
+    WVPASS bup index src
+    WVPASS bup save -t -n src src
+    WVPASS force-delete src-restore
+    WVPASS bup restore -C src-restore "/src/latest$(pwd)/src/var/."
+    WVPASS touch -t 201211111111 src-restore # Make sure the top won't match.
+    # Check that the only difference is the top dir.
+    WVFAIL $TOP/dev/compare-trees -c src/var/ src-restore/ > tmp-compare-trees
+    WVPASSEQ $(cat tmp-compare-trees | wc -l) 1
+    # The number of rsync status characters varies, so accept any
+    # number of trailing dots.  For example OS X native rsync produces
+    # 9, but Homebrew's produces 12, while on other platforms, 11 is
+    # common.
+    expected_diff_rx='^\.d\.\.t\.\.\.(\.)+ \./$'
+    if ! grep -qE "$expected_diff_rx" tmp-compare-trees; then
+        echo -n 'tmp-compare-trees: ' 1>&2
+        cat tmp-compare-trees 1>&2
+    fi
+    WVPASS grep -qE "$expected_diff_rx" tmp-compare-trees
+    WVPASS rm -r "$tmpdir"
+) || exit $?
+
+# Test that we pull the index (not filesystem) metadata for any
+# unchanged files whenever we're saving other files in a given
+# directory.
+WVSTART 'metadata save/restore (using index metadata)'
+(
+    tmpdir="$(WVPASS wvmktempdir)" || exit $?
+    export BUP_DIR="$tmpdir/bup"
+    WVPASS setup-test-tree
+    WVPASS cd "$tmpdir"
+
+    # ...for now -- might be a problem with hardlink restores that was
+    # causing noise wrt this test.
+    WVPASS rm -rf src/hardlink*
+
+    # Pause here to keep the filesystem changes far enough away from
+    # the first index run that bup won't cap their index timestamps
+    # (see "bup help index" for more information).  Without this
+    # sleep, the compare-trees test below "Bup should *not* pick up
+    # these metadata..." may fail.
+    WVPASS sleep 1
+
+    WVPASS rm -rf "$BUP_DIR"
+    WVPASS bup init
+    WVPASS bup index src
+    WVPASS bup save -t -n src src
+
+    WVPASS force-delete src-restore-1
+    WVPASS mkdir src-restore-1
+    WVPASS bup restore -C src-restore-1 "/src/latest$(pwd)/"
+    WVPASS test -d src-restore-1/src
+    WVPASS "$TOP/dev/compare-trees" -c src/ src-restore-1/src/
+
+    WVPASS echo "blarg" > src/volatile/1
+    WVPASS cp -pP src/volatile/1 src-restore-1/src/volatile/
+    WVPASS bup index src
+
+    # Bup should *not* pick up these metadata changes.
+    WVPASS touch src/volatile/2
+
+    WVPASS bup save -t -n src src
+
+    WVPASS force-delete src-restore-2
+    WVPASS mkdir src-restore-2
+    WVPASS bup restore -C src-restore-2 "/src/latest$(pwd)/"
+    WVPASS test -d src-restore-2/src
+    WVPASS "$TOP/dev/compare-trees" -c src-restore-1/src/ src-restore-2/src/
+
+    WVPASS rm -r "$tmpdir"
+
+) || exit $?
+
+
+setup-hardlink-test()
+{
+    WVPASS rm -rf "$tmpdir/src" "$BUP_DIR"
+    WVPASS bup init
+    WVPASS mkdir "$tmpdir/src"
+}
+
+hardlink-test-run-restore()
+{
+    WVPASS force-delete src-restore
+    WVPASS mkdir src-restore
+    WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
+    WVPASS test -d src-restore/src
+}
+
+# Test hardlinks more carefully.
+WVSTART 'metadata save/restore (hardlinks)'
+(
+    tmpdir="$(WVPASS wvmktempdir)" || exit $?    
+    export BUP_DIR="$tmpdir/bup"
+
+    WVPASS setup-hardlink-test
+    WVPASS cd "$tmpdir"
+    
+    # Test trivial case - single hardlink.
+    (
+        WVPASS cd src
+        WVPASS touch hardlink-target
+        WVPASS ln hardlink-target hardlink-1
+    ) || exit $?
+    WVPASS bup index src
+    WVPASS bup save -t -n src src
+    WVPASS hardlink-test-run-restore
+    WVPASS "$TOP/dev/compare-trees" -c src/ src-restore/src/
+
+    # Test the case where the hardlink hasn't changed, but the tree
+    # needs to be saved again. i.e. the save-cmd.py "if hashvalid:"
+    # case.
+    (
+        WVPASS cd src
+        WVPASS echo whatever > something-new
+    ) || exit $?
+    WVPASS bup index src
+    WVPASS bup save -t -n src src
+    WVPASS hardlink-test-run-restore
+    WVPASS "$TOP/dev/compare-trees" -c src/ src-restore/src/
+
+    # Test hardlink changes between index runs.
+    #
+    WVPASS setup-hardlink-test
+    WVPASS cd src
+    WVPASS touch hardlink-target-a
+    WVPASS touch hardlink-target-b
+    WVPASS ln hardlink-target-a hardlink-b-1
+    WVPASS ln hardlink-target-a hardlink-a-1
+    WVPASS cd ..
+    WVPASS bup index -vv src
+    WVPASS rm src/hardlink-b-1
+    WVPASS ln src/hardlink-target-b src/hardlink-b-1
+    WVPASS bup index -vv src
+    WVPASS bup save -t -n src src
+    WVPASS hardlink-test-run-restore
+    WVPASS echo ./src/hardlink-a-1 > hardlink-sets.expected
+    WVPASS echo ./src/hardlink-target-a >> hardlink-sets.expected
+    WVPASS echo >> hardlink-sets.expected
+    WVPASS echo ./src/hardlink-b-1 >> hardlink-sets.expected
+    WVPASS echo ./src/hardlink-target-b >> hardlink-sets.expected
+    (WVPASS cd src-restore; WVPASS hardlink-sets .) > hardlink-sets.restored \
+        || exit $?
+    WVPASS diff -u hardlink-sets.expected hardlink-sets.restored
+
+    # Test hardlink changes between index and save -- hardlink set [a
+    # b c d] changes to [a b] [c d].  At least right now bup should
+    # notice and recreate the latter.
+    WVPASS setup-hardlink-test
+    WVPASS cd "$tmpdir"/src
+    WVPASS touch a
+    WVPASS ln a b
+    WVPASS ln a c
+    WVPASS ln a d
+    WVPASS cd ..
+    WVPASS bup index -vv src
+    WVPASS rm src/c src/d
+    WVPASS touch src/c
+    WVPASS ln src/c src/d
+    WVPASS bup save -t -n src src
+    WVPASS hardlink-test-run-restore
+    WVPASS echo ./src/a > hardlink-sets.expected
+    WVPASS echo ./src/b >> hardlink-sets.expected
+    WVPASS echo >> hardlink-sets.expected
+    WVPASS echo ./src/c >> hardlink-sets.expected
+    WVPASS echo ./src/d >> hardlink-sets.expected
+    (WVPASS cd src-restore; WVPASS hardlink-sets .) > hardlink-sets.restored \
+        || exit $?
+    WVPASS diff -u hardlink-sets.expected hardlink-sets.restored
+
+    # Test that we don't link outside restore tree.
+    WVPASS setup-hardlink-test
+    WVPASS cd "$tmpdir"
+    WVPASS mkdir src/a src/b
+    WVPASS touch src/a/1
+    WVPASS ln src/a/1 src/b/1
+    WVPASS bup index -vv src
+    WVPASS bup save -t -n src src
+    WVPASS force-delete src-restore
+    WVPASS mkdir src-restore
+    WVPASS bup restore -C src-restore "/src/latest$(pwd)/src/a/"
+    WVPASS test -e src-restore/1
+    WVPASS echo -n > hardlink-sets.expected
+    (WVPASS cd src-restore; WVPASS hardlink-sets .) > hardlink-sets.restored \
+        || exit $?
+    WVPASS diff -u hardlink-sets.expected hardlink-sets.restored
+
+    # Test that we do link within separate sub-trees.
+    WVPASS setup-hardlink-test
+    WVPASS cd "$tmpdir"
+    WVPASS mkdir src/a src/b
+    WVPASS touch src/a/1
+    WVPASS ln src/a/1 src/b/1
+    WVPASS bup index -vv src/a src/b
+    WVPASS bup save -t -n src src/a src/b
+    WVPASS hardlink-test-run-restore
+    WVPASS echo ./src/a/1 > hardlink-sets.expected
+    WVPASS echo ./src/b/1 >> hardlink-sets.expected
+    (WVPASS cd src-restore; WVPASS hardlink-sets .) > hardlink-sets.restored \
+        || exit $?
+    WVPASS diff -u hardlink-sets.expected hardlink-sets.restored
+
+    WVPASS rm -r "$tmpdir"
+
+) || exit $?
+
+WVSTART 'meta --edit'
+(
+    tmpdir="$(WVPASS wvmktempdir)" || exit $?    
+    WVPASS cd "$tmpdir"
+    WVPASS mkdir src
+
+    WVPASS bup meta -cf src.meta src
+
+    WVPASS bup meta --edit --set-uid 0 src.meta | WVPASS bup meta -tvvf - \
+        | WVPASS grep -qE '^uid: 0'
+    WVPASS bup meta --edit --set-uid 1000 src.meta | WVPASS bup meta -tvvf - \
+        | WVPASS grep -qE '^uid: 1000'
+
+    WVPASS bup meta --edit --set-gid 0 src.meta | WVPASS bup meta -tvvf - \
+        | WVPASS grep -qE '^gid: 0'
+    WVPASS bup meta --edit --set-gid 1000 src.meta | WVPASS bup meta -tvvf - \
+        | WVPASS grep -qE '^gid: 1000'
+
+    WVPASS bup meta --edit --set-user foo src.meta | WVPASS bup meta -tvvf - \
+        | WVPASS grep -qE '^user: foo'
+    WVPASS bup meta --edit --set-user bar src.meta | WVPASS bup meta -tvvf - \
+        | WVPASS grep -qE '^user: bar'
+    WVPASS bup meta --edit --unset-user src.meta | WVPASS bup meta -tvvf - \
+        | WVPASS grep -qE '^user:'
+    WVPASS bup meta --edit --set-user bar --unset-user src.meta \
+        | WVPASS bup meta -tvvf - | WVPASS grep -qE '^user:'
+    WVPASS bup meta --edit --unset-user --set-user bar src.meta \
+        | WVPASS bup meta -tvvf - | WVPASS grep -qE '^user: bar'
+
+    WVPASS bup meta --edit --set-group foo src.meta | WVPASS bup meta -tvvf - \
+        | WVPASS grep -qE '^group: foo'
+    WVPASS bup meta --edit --set-group bar src.meta | WVPASS bup meta -tvvf - \
+        | WVPASS grep -qE '^group: bar'
+    WVPASS bup meta --edit --unset-group src.meta | WVPASS bup meta -tvvf - \
+        | WVPASS grep -qE '^group:'
+    WVPASS bup meta --edit --set-group bar --unset-group src.meta \
+        | WVPASS bup meta -tvvf - | WVPASS grep -qE '^group:'
+    WVPASS bup meta --edit --unset-group --set-group bar src.meta \
+        | WVPASS bup meta -tvvf - | grep -qE '^group: bar'
+
+    WVPASS rm -r "$tmpdir"
+
+) || exit $?
+
+WVSTART 'meta --no-recurse'
+(
+    tmpdir="$(WVPASS wvmktempdir)" || exit $?    
+    WVPASS cd "$tmpdir"
+    WVPASS mkdir src
+    WVPASS mkdir src/foo
+    WVPASS touch src/foo/{1,2,3}
+    WVPASS bup meta -cf src.meta src
+    WVPASSEQ "$(bup meta -tf src.meta | LC_ALL=C sort)" "src/
+src/foo/
+src/foo/1
+src/foo/2
+src/foo/3"
+    WVPASS bup meta --no-recurse -cf src.meta src
+    WVPASSEQ "$(bup meta -tf src.meta | LC_ALL=C sort)" "src/"
+    WVPASS rm -r "$tmpdir"
+) || exit $?
+
+# Test ownership restoration (when not root or fakeroot).
+(
+    if [ "$root_status" != none ]; then
+        exit 0
+    fi
+
+    tmpdir="$(WVPASS wvmktempdir)" || exit $?    
+
+    # FIXME: binary groups
+    first_group="$(WVPASS bup-cfg-py -c 'import os,grp; \
+      print(grp.getgrgid(os.getgroups()[0])[0])')" || exit $?
+    last_group="$(bup-cfg-py -c 'import os,grp; \
+      print(grp.getgrgid(os.getgroups()[-1])[0])')" || exit $?
+    last_group_erx="$(escape-erx "$last_group")"
+
+    WVSTART 'metadata (restoration of ownership)'
+    WVPASS cd "$tmpdir"
+    WVPASS touch src
+    # Some systems always assign the parent dir group to new paths
+    # (sgid).  Make sure the group is one we're in.
+    WVPASS chgrp -R "$first_group" src
+
+    WVPASS bup meta -cf src.meta src
+
+    WVPASS mkdir dest
+    WVPASS cd dest
+    # Make sure we don't change (or try to change) the user when not root.
+    WVPASS bup meta --edit --set-user root ../src.meta | WVPASS bup meta -x
+    WVPASS bup xstat src | WVPASS grep -qvE '^user: root'
+    WVPASS rm -rf src
+    WVPASS bup meta --edit --unset-user --set-uid 0 ../src.meta \
+        | WVPASS bup meta -x
+    WVPASS bup xstat src | WVPASS grep -qvE '^user: root'
+
+    # Make sure we can restore one of the user's groups.
+    WVPASS rm -rf src
+    WVPASS bup meta --edit --set-group "$last_group" ../src.meta \
+        | WVPASS bup meta -x
+    WVPASS bup xstat src | WVPASS grep -qE "^group: $last_group_erx"
+
+    # Make sure we can restore one of the user's gids.
+    user_gids="$(id -G)" || exit $?
+    last_gid="$(echo ${user_gids/* /})" || exit $?
+    WVPASS rm -rf src
+    WVPASS bup meta --edit --unset-group --set-gid "$last_gid" ../src.meta \
+        | WVPASS bup meta -x
+    WVPASS bup xstat src | WVPASS grep -qE "^gid: $last_gid"
+
+    # Test --numeric-ids (gid).
+    WVPASS rm -rf src
+    current_gidx=$(bup meta -tvvf ../src.meta | grep -ae '^gid:') || exit $?
+    WVPASS bup meta --edit --set-group "$last_group" ../src.meta \
+        | WVPASS bup meta -x --numeric-ids
+    new_gidx=$(bup xstat src | grep -ae '^gid:') || exit $?
+    WVPASSEQ "$current_gidx" "$new_gidx"
+
+    # Test that restoring an unknown user works.
+    unknown_user=$("$TOP"/dev/unknown-owner --user) || exit $?
+    WVPASS rm -rf src
+    current_uidx=$(bup meta -tvvf ../src.meta | grep -ae '^uid:') || exit $?
+    WVPASS bup meta --edit --set-user "$unknown_user" ../src.meta \
+        | WVPASS bup meta -x
+    new_uidx=$(bup xstat src | grep -ae '^uid:') || exit $?
+    WVPASSEQ "$current_uidx" "$new_uidx"
+
+    # Test that restoring an unknown group works.
+    unknown_group=$("$TOP"/dev/unknown-owner --group) || exit $?
+    WVPASS rm -rf src
+    current_gidx=$(bup meta -tvvf ../src.meta | grep -ae '^gid:') || exit $?
+    WVPASS bup meta --edit --set-group "$unknown_group" ../src.meta \
+        | WVPASS bup meta -x
+    new_gidx=$(bup xstat src | grep -ae '^gid:') || exit $?
+    WVPASSEQ "$current_gidx" "$new_gidx"
+
+    WVPASS rm -r "$tmpdir"
+
+) || exit $?
+
+# Test ownership restoration (when root or fakeroot).
+(
+    if [ "$root_status" = none ]; then
+        exit 0
+    fi
+
+    tmpdir="$(WVPASS wvmktempdir)" || exit $?    
+
+    uid=$(WVPASS id -un) || exit $?
+    gid=$(WVPASS id -gn) || exit $?
+
+    WVSTART 'metadata (restoration of ownership as root)'
+    WVPASS cd "$tmpdir"
+    WVPASS touch src
+    WVPASS chown "$uid:$gid" src # In case the parent dir is sgid, etc.
+    WVPASS bup meta -cf src.meta src
+
+    WVPASS mkdir dest
+    WVPASS chmod 700 dest # so we can't accidentally do something insecure
+    WVPASS cd dest
+
+    other_uinfo="$(id-other-than --user "$uid")" || exit $?
+    other_user="${other_uinfo%%:*}"
+    other_uid="${other_uinfo##*:}"
+
+    other_ginfo="$(id-other-than --group "$gid")" || exit $?
+    other_group="${other_ginfo%%:*}"
+    other_gid="${other_ginfo##*:}"
+
+    # Make sure we can restore a uid (must be in /etc/passwd b/c cygwin).
+    WVPASS bup meta --edit --unset-user --set-uid "$other_uid" ../src.meta \
+        | WVPASS bup meta -x
+    WVPASS bup xstat src | WVPASS grep -qE "^uid: $other_uid"
+
+    # Make sure we can restore a gid (must be in /etc/group b/c cygwin).
+    WVPASS bup meta --edit --unset-group --set-gid "$other_gid" ../src.meta \
+        | WVPASS bup meta -x
+    WVPASS bup xstat src | WVPASS grep -qE "^gid: $other_gid"
+
+    other_uinfo2="$(id-other-than --user "$(id -un)" "$other_user")" || exit $?
+    other_user2="${other_uinfo2%%:*}"
+    other_user2_erx="$(escape-erx "$other_user2")" || exit $?
+    other_uid2="${other_uinfo2##*:}"
+
+    other_ginfo2="$(id-other-than --group "$(id -gn)" "$other_group")" || exit $?
+    other_group2="${other_ginfo2%%:*}"
+    other_group2_erx="$(escape-erx "$other_group2")" || exit $?
+    other_gid2="${other_ginfo2##*:}"
+
+    # Try to restore a user (and see that user trumps uid when uid is not 0).
+    WVPASS bup meta --edit \
+        --set-uid "$other_uid" --set-user "$other_user2" ../src.meta \
+        | WVPASS bup meta -x
+    WVPASS bup xstat src | WVPASS grep -qE "^user: $other_user2_erx"
+
+    # Try to restore a group (and see that group trumps gid when gid is not 0).
+    WVPASS bup meta --edit \
+        --set-gid "$other_gid" --set-group "$other_group2" ../src.meta \
+        | WVPASS bup meta -x
+    WVPASS bup xstat src | WVPASS grep -qE "^group: $other_group2_erx"
+
+    # Test --numeric-ids (uid).  Note the name 'root' is not handled
+    # specially, so we use that here as the test user name.  We assume
+    # that the root user's uid is never 42.
+    WVPASS rm -rf src
+    WVPASS bup meta --edit --set-user root --set-uid "$other_uid" ../src.meta \
+        | WVPASS bup meta -x --numeric-ids
+    new_uidx=$(bup xstat src | grep -e '^uid:') || exit $?
+    WVPASSEQ "$new_uidx" "uid: $other_uid"
+
+    # Test --numeric-ids (gid).  Note the name 'root' is not handled
+    # specially, so we use that here as the test group name.  We
+    # assume that the root group's gid is never 42.
+    WVPASS rm -rf src
+    WVPASS bup meta --edit --set-group root --set-gid "$other_gid" ../src.meta \
+        | WVPASS bup meta -x --numeric-ids
+    new_gidx=$(bup xstat src | grep -e '^gid:') || exit $?
+    WVPASSEQ "$new_gidx" "gid: $other_gid"
+
+    # Test that restoring an unknown user works.
+    unknown_user=$("$TOP"/dev/unknown-owner --user) || exit $?
+    WVPASS rm -rf src
+    WVPASS bup meta --edit \
+        --set-uid "$other_uid" --set-user "$unknown_user" ../src.meta \
+        | WVPASS bup meta -x
+    new_uidx=$(bup xstat src | grep -e '^uid:') || exit $?
+    WVPASSEQ "$new_uidx" "uid: $other_uid"
+
+    # Test that restoring an unknown group works.
+    unknown_group=$("$TOP"/dev/unknown-owner --group) || exit $?
+    WVPASS rm -rf src
+    WVPASS bup meta --edit \
+        --set-gid "$other_gid" --set-group "$unknown_group" ../src.meta \
+        | WVPASS bup meta -x
+    new_gidx=$(bup xstat src | grep -e '^gid:') || exit $?
+    WVPASSEQ "$new_gidx" "gid: $other_gid"
+
+    if ! [[ $(uname) =~ CYGWIN ]]; then
+        # For now, skip these on Cygwin because it doesn't allow
+        # restoring an unknown uid/gid.
+
+        # Make sure a uid of 0 trumps a non-root user.
+        WVPASS bup meta --edit --set-user "$other_user2" ../src.meta \
+            | WVPASS bup meta -x
+        WVPASS bup xstat src | WVPASS grep -qvE "^user: $other_user2_erx"
+        WVPASS bup xstat src | WVPASS grep -qE "^uid: 0"
+
+        # Make sure a gid of 0 trumps a non-root group.
+        WVPASS bup meta --edit --set-group "$other_group2" ../src.meta \
+            | WVPASS bup meta -x
+        WVPASS bup xstat src | WVPASS grep -qvE "^group: $other_group2_erx"
+        WVPASS bup xstat src | WVPASS grep -qE "^gid: 0"
+    fi
+
+    WVPASS rm -r "$tmpdir"
+
+) || exit $?
+
+
+# Root-only tests that require an FS with all the trimmings: ACLs,
+# Linux attr, Linux xattr, etc.
+if [ "$root_status" = root ]; then
+    (
+        # Some cleanup handled in universal-cleanup() above.
+        # These tests are only likely to work under Linux for now
+        # (patches welcome).
+        [[ $(uname) =~ Linux ]] || exit 0
+
+        if ! modprobe loop; then
+            echo 'Unable to load loopback module; skipping dependent tests.' 1>&2
+            exit 0
+        fi
+
+        testfs="$(WVPASS wvmkmountpt)" || exit $?
+        testfs_limited="$(WVPASS wvmkmountpt)" || exit $?
+        tmpdir="$(WVPASS wvmktempdir)" || exit $?
+        export BUP_DIR="$tmpdir/bup"
+
+        WVSTART 'meta - general (as root)'
+        WVPASS setup-test-tree
+        WVPASS cd "$tmpdir"
+
+        umount "$testfs"
+        WVPASS dd if=/dev/zero of=testfs.img bs=1M count=32
+        # Make sure we have all the options the chattr test needs
+        # (i.e. create a "normal" ext4 filesystem).
+        WVPASS mke2fs -F -m 0 \
+            -I 256 \
+            -O has_journal,extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize \
+            testfs.img
+        WVPASS mount -o loop,acl,user_xattr testfs.img "$testfs"
+        # Hide, so that tests can't create risks.
+        WVPASS chown root:root "$testfs"
+        WVPASS chmod 0700 "$testfs"
+
+        umount "$testfs_limited"
+        WVPASS dd if=/dev/zero of=testfs-limited.img bs=1M count=32
+        WVPASS mkfs -t vfat testfs-limited.img
+        WVPASS mount -o loop,uid=root,gid=root,umask=0077 \
+            testfs-limited.img "$testfs_limited"
+
+        WVPASS cp -pPR src "$testfs"/src
+        (WVPASS cd "$testfs"; WVPASS test-src-create-extract) || exit $?
+
+        WVSTART 'meta - atime (as root)'
+        WVPASS force-delete "$testfs"/src
+        WVPASS mkdir "$testfs"/src
+        (
+            WVPASS mkdir "$testfs"/src/foo
+            WVPASS touch "$testfs"/src/bar
+            WVPASS bup-python -c "from bup import xstat; \
+                x = xstat.timespec_to_nsecs((42, 0));\
+                xstat.utime(b'$testfs/src/foo', (x, x));\
+                xstat.utime(b'$testfs/src/bar', (x, x));"
+            WVPASS cd "$testfs"
+            WVPASS bup meta -v --create --recurse --file src.meta src
+            WVPASS bup meta -tvf src.meta
+            # Test extract.
+            WVPASS force-delete src-restore
+            WVPASS mkdir src-restore
+            WVPASS cd src-restore
+            WVPASS bup meta --extract --file ../src.meta
+            WVPASSEQ "$(bup xstat --include-fields=atime src/foo)" "atime: 42"
+            WVPASSEQ "$(bup xstat --include-fields=atime src/bar)" "atime: 42"
+            # Test start/finish extract.
+            WVPASS force-delete src
+            WVPASS bup meta --start-extract --file ../src.meta
+            WVPASS test -d src
+            WVPASS bup meta --finish-extract --file ../src.meta
+            WVPASSEQ "$(bup xstat --include-fields=atime src/foo)" "atime: 42"
+            WVPASSEQ "$(bup xstat --include-fields=atime src/bar)" "atime: 42"
+        ) || exit $?
+
+        WVSTART 'meta - Linux attr (as root)'
+        WVPASS force-delete "$testfs"/src
+        WVPASS mkdir "$testfs"/src
+        (
+            WVPASS touch "$testfs"/src/foo
+            WVPASS mkdir "$testfs"/src/bar
+            WVPASS chattr +acdeijstuADS "$testfs"/src/foo
+            WVPASS chattr +acdeijstuADST "$testfs"/src/bar
+            (WVPASS cd "$testfs"; WVPASS test-src-create-extract) || exit $?
+            # Test restoration to a limited filesystem (vfat).
+            (
+                WVPASS bup meta --create --recurse --file "$testfs"/src.meta \
+                    "$testfs"/src
+                WVPASS force-delete "$testfs_limited"/src-restore
+                WVPASS mkdir "$testfs_limited"/src-restore
+                WVPASS cd "$testfs_limited"/src-restore
+                WVFAIL bup meta --extract --file "$testfs"/src.meta 2>&1 \
+                    | WVPASS grep -e '^Linux chattr:' \
+                    | WVPASS bup-cfg-py -c \
+                    'import sys; exit(not len(sys.stdin.readlines()) == 3)'
+            ) || exit $?
+        ) || exit $?
+
+        WVSTART 'meta - Linux xattr (as root)'
+        WVPASS force-delete "$testfs"/src
+        WVPASS mkdir "$testfs"/src
+        WVPASS touch "$testfs"/src/foo
+        WVPASS mkdir "$testfs"/src/bar
+        WVPASS attr -s foo -V bar "$testfs"/src/foo
+        WVPASS attr -s foo -V bar "$testfs"/src/bar
+        (WVPASS cd "$testfs"; WVPASS test-src-create-extract) || exit $?
+
+        # Test restoration to a limited filesystem (vfat).
+        (
+            WVPASS bup meta --create --recurse --file "$testfs"/src.meta \
+                "$testfs"/src
+            WVPASS force-delete "$testfs_limited"/src-restore
+            WVPASS mkdir "$testfs_limited"/src-restore
+            WVPASS cd "$testfs_limited"/src-restore
+            WVFAIL bup meta --extract --file "$testfs"/src.meta
+            WVFAIL bup meta --extract --file "$testfs"/src.meta 2>&1 \
+                | WVPASS grep -e "^xattr\.set u\?'" \
+                | WVPASS bup-cfg-py -c \
+                'import sys; exit(not len(sys.stdin.readlines()) == 2)'
+        ) || exit $?
+
+        WVSTART 'meta - POSIX.1e ACLs (as root)'
+        WVPASS force-delete "$testfs"/src
+        WVPASS mkdir "$testfs"/src
+        WVPASS touch "$testfs"/src/foo
+        WVPASS mkdir "$testfs"/src/bar
+        WVPASS setfacl -m u:root:r "$testfs"/src/foo
+        WVPASS setfacl -m u:root:r "$testfs"/src/bar
+        (WVPASS cd "$testfs"; WVPASS test-src-create-extract) || exit $?
+
+        # Test restoration to a limited filesystem (vfat).
+        (
+            WVPASS bup meta --create --recurse --file "$testfs"/src.meta \
+                "$testfs"/src
+            WVPASS force-delete "$testfs_limited"/src-restore
+            WVPASS mkdir "$testfs_limited"/src-restore
+            WVPASS cd "$testfs_limited"/src-restore
+            WVFAIL bup meta --extract --file "$testfs"/src.meta 2>&1 \
+                | WVPASS grep -e '^POSIX1e ACL applyto:' \
+                | WVPASS bup-cfg-py -c \
+                'import sys; exit(not len(sys.stdin.readlines()) == 2)'
+        ) || exit $?
+
+        WVPASS umount "$testfs"
+        WVPASS umount "$testfs_limited"
+        WVPASS rm -r "$testfs" "$testfs_limited"
+
+        WVPASS rm -r "$tmpdir"
+
+    ) || exit $?
+fi
+
+WVPASS rm -r "$tmpdir"
diff --git a/test/ext/test-on.sh b/test/ext/test-on.sh
new file mode 100755 (executable)
index 0000000..a4384c3
--- /dev/null
@@ -0,0 +1,58 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. ./dev/lib.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+compare-trees() { "$top/dev/compare-trees" "$@"; }
+
+WVPASS bup init
+WVPASS cd "$tmpdir"
+
+WVSTART "index/save"
+WVPASS mkdir src src/foo
+WVPASS date > src/bar
+WVPASS bup random 1k > src/baz
+WVPASS bup on - index src
+WVPASS bup on - save -ctn src src > get.log
+WVPASSEQ $(WVPASS cat get.log | WVPASS wc -l) 2
+tree_id=$(WVPASS awk 'FNR == 1' get.log) || exit $?
+commit_id=$(WVPASS awk 'FNR == 2' get.log) || exit $?
+WVPASS git ls-tree "$tree_id"
+WVPASS git cat-file commit "$commit_id" | head -n 1 \
+    | WVPASS grep "^tree $tree_id\$"
+
+WVPASS bup restore -C restore "src/latest/$(pwd)/src/."
+WVPASS compare-trees src/ restore/
+WVPASS rm -r restore
+
+WVSTART "split"
+WVPASS bup on - split -ctn baz src/baz > get.log
+tree_id=$(WVPASS awk 'FNR == 1' get.log) || exit $?
+commit_id=$(WVPASS awk 'FNR == 2' get.log) || exit $?
+WVPASS git ls-tree "$tree_id"
+WVPASS git cat-file commit "$commit_id" | head -n 1 \
+    | WVPASS grep "^tree $tree_id\$"
+WVPASS bup join baz > restore-baz
+WVPASS cmp src/baz restore-baz
+
+WVSTART "index-cache"
+# the 'a-zA-Z0-9_' is '\w' from python,
+# the trailing _ is because there's no dir specified
+# and that should thus be empty
+hostname=$(uname -n)
+idxcache=$(echo "$hostname" | sed 's/[^@a-zA-Z0-9_]/_/g')_
+# there should be an index-cache now
+for idx in "$tmpdir"/bup/objects/pack/*.idx ; do
+    cachedidx="$tmpdir/bup/index-cache/$idxcache/$(basename "$idx")"
+    WVPASS cmp "$idx" "$cachedidx"
+done
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-packsizelimit b/test/ext/test-packsizelimit
new file mode 100755 (executable)
index 0000000..f76e045
--- /dev/null
@@ -0,0 +1,30 @@
+#!/usr/bin/env bash
+. wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+WVSTART 'pack size limit'
+
+WVPASS bup init
+WVPASSEQ $(WVPASS find "$BUP_DIR"/objects/pack -name "*.pack" | wc -l) 0
+WVPASS bup random 50k | WVPASS bup split -n foo
+WVPASSEQ 1 $(WVPASS find "$BUP_DIR"/objects/pack/*.pack | wc -l)
+
+rm -rf "$BUP_DIR"
+WVPASS bup init
+WVPASS git config pack.packSizeLimit 10k
+WVPASSEQ $(WVPASS find "$BUP_DIR"/objects/pack -name "*.pack" | wc -l) 0
+WVPASS bup random 50k | WVPASS bup split -n foo
+WVPASS test $(WVPASS find "$BUP_DIR"/objects/pack/*.pack | wc -l) -gt 2
+
+WVPASS rm -r "$tmpdir"
diff --git a/test/ext/test-prune-older b/test/ext/test-prune-older
new file mode 100755 (executable)
index 0000000..d42c3fc
--- /dev/null
@@ -0,0 +1,219 @@
+#!/bin/sh
+"""": # -*-python-*-
+bup_python="$(dirname "$0")/../../dev/bup-python" || exit $?
+exec "$bup_python" "$0" ${1+"$@"}
+"""
+# end of bup preamble
+
+from __future__ import absolute_import, print_function
+from collections import defaultdict
+from difflib import unified_diff
+from itertools import chain, dropwhile, groupby, takewhile
+from os import chdir
+from os.path import abspath, dirname
+from random import choice, randint
+from shutil import copytree, rmtree
+from subprocess import PIPE
+from sys import stderr
+from time import localtime, strftime, time
+import os, random, sys
+
+# For buptest, wvtest, ...
+sys.path[:0] = (abspath(os.path.dirname(__file__) + '/../..'),)
+sys.path[:0] = (abspath(os.path.dirname(__file__) + '/../../test/lib'),)
+sys.path[:0] = [os.path.dirname(os.path.realpath(__file__)) + '/../../lib']
+
+from buptest import ex, exo, test_tempdir
+from wvtest import wvfail, wvpass, wvpasseq, wvpassne, wvstart
+
+from bup import compat
+from bup.compat import environ
+from bup.helpers import partition, period_as_secs, readpipe
+import bup.path
+
+
+def create_older_random_saves(n, start_utc, end_utc):
+    with open(b'foo', 'wb') as f:
+        pass
+    ex([b'git', b'add', b'foo'])
+    utcs = set()
+    while len(utcs) != n:
+        utcs.add(randint(start_utc, end_utc))
+    utcs = sorted(utcs)
+    for utc in utcs:
+        with open(b'foo', 'wb') as f:
+            f.write(b'%d\n' % utc)
+        ex([b'git', b'commit', b'--date', b'%d' % utc, b'-qam', b'%d' % utc])
+    ex([b'git', b'gc', b'--aggressive'])
+    return utcs
+
+# There is corresponding code in bup for some of this, but the
+# computation method is different here, in part so that the test can
+# provide a more effective cross-check.
+
+period_kinds = [b'all', b'dailies', b'monthlies', b'yearlies']
+period_scale = {b's': 1,
+                b'min': 60,
+                b'h': 60 * 60,
+                b'd': 60 * 60 * 24,
+                b'w': 60 * 60 * 24 * 7,
+                b'm': 60 * 60 * 24 * 31,
+                b'y': 60 * 60 * 24 * 366}
+period_scale_kinds = list(period_scale.keys())
+
+def expected_retentions(utcs, utc_start, spec):
+    if not spec:
+        return utcs
+    utcs = sorted(utcs, reverse=True)
+    period_start = dict(spec)
+    for kind, duration in compat.items(period_start):
+        period_start[kind] = utc_start - period_as_secs(duration)
+    period_start = defaultdict(lambda: float('inf'), period_start)
+
+    all = list(takewhile(lambda x: x >= period_start[b'all'], utcs))
+    utcs = list(dropwhile(lambda x: x >= period_start[b'all'], utcs))
+
+    matches = takewhile(lambda x: x >= period_start[b'dailies'], utcs)
+    dailies = [max(day_utcs) for yday, day_utcs
+               in groupby(matches, lambda x: localtime(x).tm_yday)]
+    utcs = list(dropwhile(lambda x: x >= period_start[b'dailies'], utcs))
+
+    matches = takewhile(lambda x: x >= period_start[b'monthlies'], utcs)
+    monthlies = [max(month_utcs) for month, month_utcs
+                 in groupby(matches, lambda x: localtime(x).tm_mon)]
+    utcs = dropwhile(lambda x: x >= period_start[b'monthlies'], utcs)
+
+    matches = takewhile(lambda x: x >= period_start[b'yearlies'], utcs)
+    yearlies = [max(year_utcs) for year, year_utcs
+                in groupby(matches, lambda x: localtime(x).tm_year)]
+
+    return chain(all, dailies, monthlies, yearlies)
+
+def period_spec(start_utc, end_utc):
+    global period_kinds, period_scale, period_scale_kinds
+    result = []
+    desired_specs = randint(1, 2 * len(period_kinds))
+    assert(desired_specs >= 1)  # At least one --keep argument is required
+    while len(result) < desired_specs:
+        period = None
+        if randint(1, 100) <= 5:
+            period = b'forever'
+        else:
+            assert(end_utc > start_utc)
+            period_secs = randint(1, end_utc - start_utc)
+            scale = choice(period_scale_kinds)
+            mag = int(float(period_secs) / period_scale[scale])
+            if mag != 0:
+                period = (b'%d' % mag) + scale
+        if period:
+            result += [(choice(period_kinds), period)]
+    return tuple(result)
+
+def unique_period_specs(n, start_utc, end_utc):
+    invocations = set()
+    while len(invocations) < n:
+        invocations.add(period_spec(start_utc, end_utc))
+    return tuple(invocations)
+
+def period_spec_to_period_args(spec):
+    return tuple(chain(*((b'--keep-' + kind + b'-for', period)
+                         for kind, period in spec)))
+
+def result_diffline(x):
+    return (b'%d %s\n'
+            % (x, strftime(' %Y-%m-%d-%H%M%S', localtime(x)).encode('ascii')))
+
+def check_prune_result(expected):
+    actual = sorted([int(x)
+                     for x in exo([b'git', b'log',
+                                   b'--pretty=format:%at']).out.splitlines()])
+    if expected != actual:
+        for x in expected:
+            print('ex:', x, strftime('%Y-%m-%d-%H%M%S', localtime(x)),
+                  file=stderr)
+        for line in unified_diff([result_diffline(x) for x in expected],
+                                 [result_diffline(x) for x in actual],
+                                 fromfile='expected', tofile='actual'):
+            sys.stderr.write(line)
+    wvpass(expected == actual)
+
+
+environ[b'GIT_AUTHOR_NAME'] = b'bup test'
+environ[b'GIT_COMMITTER_NAME'] = b'bup test'
+environ[b'GIT_AUTHOR_EMAIL'] = b'bup@a425bc70a02811e49bdf73ee56450e6f'
+environ[b'GIT_COMMITTER_EMAIL'] = b'bup@a425bc70a02811e49bdf73ee56450e6f'
+
+seed = int(environ.get(b'BUP_TEST_SEED', time()))
+random.seed(seed)
+print('random seed:', seed, file=stderr)
+
+save_population = int(environ.get(b'BUP_TEST_PRUNE_OLDER_SAVES', 2000))
+prune_cycles = int(environ.get(b'BUP_TEST_PRUNE_OLDER_CYCLES', 20))
+prune_gc_cycles = int(environ.get(b'BUP_TEST_PRUNE_OLDER_GC_CYCLES', 10))
+
+bup_cmd = bup.path.exe()
+
+with test_tempdir(b'prune-older-') as tmpdir:
+    environ[b'BUP_DIR'] = tmpdir + b'/work/.git'
+    environ[b'GIT_DIR'] = tmpdir + b'/work/.git'
+    now = int(time())
+    three_years_ago = now - (60 * 60 * 24 * 366 * 3)
+    chdir(tmpdir)
+    ex([b'git', b'init', b'work'])
+    ex([b'git', b'config', b'gc.autoDetach', b'false'])
+
+    wvstart('generating ' + str(save_population) + ' random saves')
+    chdir(tmpdir + b'/work')
+    save_utcs = create_older_random_saves(save_population, three_years_ago, now)
+    chdir(tmpdir)
+    test_set_hash = exo([b'git', b'show-ref', b'-s', b'master']).out.rstrip()
+    ls_saves = exo((bup_cmd, b'ls', b'master')).out.splitlines()
+    wvpasseq(save_population + 1, len(ls_saves))
+
+    wvstart('ensure everything kept, if no keep arguments')
+    ex([b'git', b'reset', b'--hard', test_set_hash])
+    proc = ex((bup_cmd,
+               b'prune-older', b'-v', b'--unsafe', b'--no-gc',
+               b'--wrt', b'%d' % now) \
+              + (b'master',),
+              stdout=None, stderr=PIPE, check=False)
+    wvpassne(proc.rc, 0)
+    wvpass(b'at least one keep argument is required' in proc.err)
+    check_prune_result(save_utcs)
+
+
+    wvstart('running %d generative no-gc tests on %d saves' % (prune_cycles,
+                                                               save_population))
+    for spec in unique_period_specs(prune_cycles,
+                                    # Make it more likely we'll have
+                                    # some outside the save range.
+                                    three_years_ago - period_scale[b'm'],
+                                    now):
+        ex([b'git', b'reset', b'--hard', test_set_hash])
+        expected = sorted(expected_retentions(save_utcs, now, spec))
+        ex((bup_cmd,
+            b'prune-older', b'-v', b'--unsafe', b'--no-gc', b'--wrt',
+            b'%d' % now) \
+           + period_spec_to_period_args(spec) \
+           + (b'master',))
+        check_prune_result(expected)
+
+
+    # More expensive because we have to recreate the repo each time
+    wvstart('running %d generative gc tests on %d saves' % (prune_gc_cycles,
+                                                            save_population))
+    ex([b'git', b'reset', b'--hard', test_set_hash])
+    copytree(b'work/.git', b'clean-test-repo', symlinks=True)
+    for spec in unique_period_specs(prune_gc_cycles,
+                                    # Make it more likely we'll have
+                                    # some outside the save range.
+                                    three_years_ago - period_scale[b'm'],
+                                    now):
+        rmtree(b'work/.git')
+        copytree(b'clean-test-repo', b'work/.git')
+        expected = sorted(expected_retentions(save_utcs, now, spec))
+        ex((bup_cmd,
+            b'prune-older', b'-v', b'--unsafe', b'--wrt', b'%d' % now) \
+           + period_spec_to_period_args(spec) \
+           + (b'master',))
+        check_prune_result(expected)
diff --git a/test/ext/test-redundant-saves.sh b/test/ext/test-redundant-saves.sh
new file mode 100755 (executable)
index 0000000..e89fbdb
--- /dev/null
@@ -0,0 +1,61 @@
+#!/usr/bin/env bash
+
+# Test that running save more than once with no other changes produces
+# the exact same tree.
+
+# Note: we can't compare the top-level hash (i.e. the output of "save
+# -t" because that currently pulls the metadata for unindexed parent
+# directories directly from the filesystem, and the relevant atimes
+# may change between runs.  So instead we extract the roots of the
+# indexed trees for comparison via dev/subtree-hash.
+
+. ./wvtest-bup.sh || exit $?
+
+set -o pipefail
+
+WVSTART 'all'
+
+top="$(pwd)"
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$BUP_DIR"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS mkdir -p "$tmpdir/src"
+WVPASS mkdir -p "$tmpdir/src/d"
+WVPASS mkdir -p "$tmpdir/src/d/e"
+WVPASS touch "$tmpdir/src/"{f,b,a,d}
+WVPASS touch "$tmpdir/src/d/z"
+
+WVPASS bup init
+WVPASS bup index -u "$tmpdir/src"
+
+declare -a indexed_top
+IFS=/
+indexed_top="${tmpdir##/}"
+indexed_top=(${indexed_top%%/})
+unset IFS
+
+tree1=$(WVPASS bup save -t "$tmpdir/src") || exit $?
+indexed_tree1="$(WVPASS dev/subtree-hash "$tree1" "${indexed_top[@]}" src)" \
+    || exit $?
+
+result="$(WVPASS cd "$tmpdir/src"; WVPASS bup index -m)" || exit $?
+WVPASSEQ "$result" ""
+
+tree2=$(WVPASS bup save -t "$tmpdir/src") || exit $?
+indexed_tree2="$(WVPASS dev/subtree-hash "$tree2" "${indexed_top[@]}" src)" \
+    || exit $?
+
+WVPASSEQ "$indexed_tree1" "$indexed_tree2"
+
+result="$(WVPASS bup index -s / | WVFAIL grep ^D)" || exit $?
+WVPASSEQ "$result" ""
+
+tree3=$(WVPASS bup save -t /) || exit $?
+indexed_tree3="$(WVPASS dev/subtree-hash "$tree3" "${indexed_top[@]}" src)" || exit $?
+WVPASSEQ "$indexed_tree1" "$indexed_tree3"
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-release-archive.sh b/test/ext/test-release-archive.sh
new file mode 100755 (executable)
index 0000000..4c8c378
--- /dev/null
@@ -0,0 +1,45 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+bup_make=$(< config/config.var/bup-make)
+
+WVPASS git status > /dev/null
+
+if ! git diff-index --quiet HEAD; then
+    WVDIE "uncommitted changes; cannot continue"
+fi
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+WVPASS git clone "$top" clone
+
+for ver in 11.11 11.11.11; do
+    WVSTART "version $ver"
+    WVPASS cd clone
+    WVPASS git tag "$ver"
+    WVPASS git archive --prefix=bup-"$ver"/ -o "$tmpdir"/bup-"$ver".tgz "$ver"
+    WVPASS cd "$tmpdir"
+    WVPASS tar xzf bup-"$ver".tgz
+    WVPASS cd bup-"$ver"
+    WVPASS "$bup_make"
+    WVPASSEQ "$ver" "$(./bup version)"
+    WVPASS cd "$tmpdir"
+done
+
+WVSTART 'make check in unpacked archive'
+WVPASS cd bup-11.11.11
+if ! "$bup_make" -j5 check > archive-tests.log 2>&1; then
+    cat archive-tests.log 1>&2
+    WVPASS false
+fi
+
+WVPASS cd "$top"
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-restore-map-owner.sh b/test/ext/test-restore-map-owner.sh
new file mode 100755 (executable)
index 0000000..348ce3c
--- /dev/null
@@ -0,0 +1,107 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+root_status="$(dev/root-status)" || exit $?
+
+if [ "$root_status" != root ]; then
+    echo 'Not root: skipping restore --map-* tests.'
+    exit 0 # FIXME: add WVSKIP.
+fi
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+uid=$(WVPASS id -u) || exit $?
+user=$(WVPASS id -un) || exit $?
+gid=$(WVPASS id -g) || exit $?
+group=$(WVPASS id -gn) || exit $?
+
+other_uinfo=$(WVPASS dev/id-other-than --user "$user") || exit $?
+other_user="${other_uinfo%%:*}"
+other_uid="${other_uinfo##*:}"
+
+other_ginfo=$(WVPASS dev/id-other-than --group "$group" 0) || exit $?
+other_group="${other_ginfo%%:*}"
+other_gid="${other_ginfo##*:}"
+
+WVPASS bup init
+WVPASS cd "$tmpdir"
+
+WVSTART "restore --map-user/group/uid/gid (control)"
+WVPASS mkdir src
+WVPASS touch src/foo
+# Some systems assign the parent dir group to new paths.
+WVPASS chgrp -R "$group" src
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS bup restore -C dest "src/latest/$(pwd)/src/"
+WVPASS bup xstat dest/foo > foo-xstat
+WVPASS grep -qE "^user: $user\$" foo-xstat
+WVPASS grep -qE "^uid: $uid\$" foo-xstat
+WVPASS grep -qE "^group: $group\$" foo-xstat
+WVPASS grep -qE "^gid: $gid\$" foo-xstat
+
+WVSTART "restore --map-user/group/uid/gid (user/group)"
+WVPASS rm -rf dest
+# Have to remap uid/gid too because we're root and 0 would win).
+WVPASS bup restore -C dest \
+    --map-uid "$uid=$other_uid" --map-gid "$gid=$other_gid" \
+    --map-user "$user=$other_user" --map-group "$group=$other_group" \
+    "src/latest/$(pwd)/src/"
+WVPASS bup xstat dest/foo > foo-xstat
+WVPASS grep -qE "^user: $other_user\$" foo-xstat
+WVPASS grep -qE "^uid: $other_uid\$" foo-xstat
+WVPASS grep -qE "^group: $other_group\$" foo-xstat
+WVPASS grep -qE "^gid: $other_gid\$" foo-xstat
+
+WVSTART "restore --map-user/group/uid/gid (user/group trumps uid/gid)"
+WVPASS rm -rf dest
+WVPASS bup restore -C dest \
+    --map-uid "$uid=$other_uid" --map-gid "$gid=$other_gid" \
+    "src/latest/$(pwd)/src/"
+# Should be no changes.
+WVPASS bup xstat dest/foo > foo-xstat
+WVPASS grep -qE "^user: $user\$" foo-xstat
+WVPASS grep -qE "^uid: $uid\$" foo-xstat
+WVPASS grep -qE "^group: $group\$" foo-xstat
+WVPASS grep -qE "^gid: $gid\$" foo-xstat
+
+WVSTART "restore --map-user/group/uid/gid (uid/gid)"
+WVPASS rm -rf dest
+WVPASS bup restore -C dest \
+    --map-user "$user=" --map-group "$group=" \
+    --map-uid "$uid=$other_uid" --map-gid "$gid=$other_gid" \
+    "src/latest/$(pwd)/src/"
+WVPASS bup xstat dest/foo > foo-xstat
+WVPASS grep -qE "^user: $other_user\$" foo-xstat
+WVPASS grep -qE "^uid: $other_uid\$" foo-xstat
+WVPASS grep -qE "^group: $other_group\$" foo-xstat
+WVPASS grep -qE "^gid: $other_gid\$" foo-xstat
+
+has_uid_gid_0=$(WVPASS bup-cfg-py -c "
+import grp, pwd
+try:
+  pwd.getpwuid(0)
+  grp.getgrgid(0)
+  print('yes')
+except KeyError as ex:
+  pass
+") || exit $?
+if [ "$has_uid_gid_0" == yes ]
+then
+    WVSTART "restore --map-user/group/uid/gid (zero uid/gid trumps all)"
+    WVPASS rm -rf dest
+    WVPASS bup restore -C dest \
+        --map-user "$user=$other_user" --map-group "$group=$other_group" \
+        --map-uid "$uid=0" --map-gid "$gid=0" \
+        "src/latest/$(pwd)/src/"
+    WVPASS bup xstat dest/foo > foo-xstat
+    WVPASS grep -qE "^uid: 0\$" foo-xstat
+    WVPASS grep -qE "^gid: 0\$" foo-xstat
+
+    WVPASS rm -rf "$tmpdir"
+fi
diff --git a/test/ext/test-restore-single-file.sh b/test/ext/test-restore-single-file.sh
new file mode 100755 (executable)
index 0000000..c151327
--- /dev/null
@@ -0,0 +1,26 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+
+set -o pipefail
+
+WVSTART 'all'
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS mkdir "$tmpdir/foo"
+WVPASS mkdir "$tmpdir/foo/bar" # Make sure a dir sorts before baz (regression test).
+WVPASS touch "$tmpdir/foo/baz"
+WVPASS WVPASS bup init
+WVPASS WVPASS bup index "$tmpdir/foo"
+WVPASS bup save -n foo "$tmpdir/foo"
+# Make sure the timestamps will differ if metadata isn't being restored.
+WVPASS bup tick
+WVPASS bup restore -C "$tmpdir/restore" "foo/latest/$tmpdir/foo/baz"
+WVPASS "$top/dev/compare-trees" "$tmpdir/foo/baz" "$tmpdir/restore/baz"
+
+WVPASS rm -rf "$tmpdir"
+
diff --git a/test/ext/test-rm-between-index-and-save.sh b/test/ext/test-rm-between-index-and-save.sh
new file mode 100755 (executable)
index 0000000..67c5b8a
--- /dev/null
@@ -0,0 +1,78 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+D="$tmpdir/data"
+
+bup() { "$top/bup" "$@"; }
+
+WVSTART "remove file"
+# Fixed in commit 8585613c1f45f3e20feec00b24fc7e3a948fa23e ("Store
+# metadata in the index....")
+WVPASS mkdir "$D"
+WVPASS bup init
+WVPASS echo "content" > "$D"/foo
+WVPASS echo "content" > "$D"/bar
+WVPASS bup tick
+WVPASS bup index -ux "$D"
+WVPASS bup save -n save-fail-missing "$D"
+WVPASS echo "content" > "$D"/baz
+WVPASS bup tick
+WVPASS bup index -ux "$D"
+WVPASS rm "$D"/foo
+# When "bup tick" is removed above, this may fail (complete with warning),
+# since the ctime/mtime of "foo" might be pushed back:
+WVPASS bup save -n save-fail-missing "$D"
+# when the save-call failed, foo is missing from output, since only
+# then bup notices, that it was removed:
+WVPASSEQ "$(bup ls -A save-fail-missing/latest/$TOP/$D/)" "bar
+baz
+foo"
+# index/save again
+WVPASS bup tick
+WVPASS bup index -ux "$D"
+WVPASS bup save -n save-fail-missing "$D"
+# now foo is gone:
+WVPASSEQ "$(bup ls -A save-fail-missing/latest/$TOP/$D/)" "bar
+baz"
+
+
+# TODO: Test for racecondition between reading a file and reading its metadata?
+
+WVSTART "remove dir"
+WVPASS rm -r "$D"
+WVPASS mkdir "$D"
+WVPASS rm -r "$BUP_DIR"
+WVPASS bup init
+WVPASS mkdir "$D"/foo
+WVPASS mkdir "$D"/bar
+WVPASS bup tick
+WVPASS bup index -ux "$D"
+WVPASS bup save -n save-fail-missing "$D"
+WVPASS touch "$D"/bar
+WVPASS mkdir "$D"/baz
+WVPASS bup tick
+WVPASS bup index -ux "$D"
+WVPASS rmdir "$D"/foo
+# with directories, bup notices that foo is missing, so it fails
+# (complete with delayed error)
+WVFAIL bup save -n save-fail-missing "$D"
+# ...but foo is still saved since it was just fine in the index
+WVPASSEQ "$(bup ls -AF save-fail-missing/latest/$TOP/$D/)" "bar/
+baz/
+foo/"
+# Index again:
+WVPASS bup tick
+WVPASS bup index -ux "$D"
+# no non-zero-exitcode anymore:
+WVPASS bup save -n save-fail-missing "$D"
+# foo is now gone
+WVPASSEQ "$(bup ls -AF save-fail-missing/latest/$TOP/$D/)" "bar/
+baz/"
+
+WVPASS rm -rf "$tmpdir"
+
diff --git a/test/ext/test-rm.sh b/test/ext/test-rm.sh
new file mode 100755 (executable)
index 0000000..3aca68d
--- /dev/null
@@ -0,0 +1,256 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. ./dev/lib.sh || exit $?
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+
+bup() { "$top/bup" "$@"; }
+compare-trees() { "$top/dev/compare-trees" "$@"; }
+
+wv_matches_rx()
+{
+    local caller_file=${BASH_SOURCE[0]}
+    local caller_line=${BASH_LINENO[0]}
+    local src="$caller_file:$caller_line"
+    if test $# -ne 2; then
+        echo "! $src wv_matches_rx requires 2 arguments FAILED" 1>&2
+        return
+    fi
+    local str="$1"
+    local rx="$2"
+    echo "Matching:" 1>&2 || exit $?
+    echo "$str" | sed 's/^\(.*\)/  \1/' 1>&2 || exit $?
+    echo "Against:" 1>&2 || exit $?
+    echo "$rx" | sed 's/^\(.*\)/  \1/' 1>&2 || exit $?
+    if [[ "$str" =~ ^${rx}$ ]]; then
+        echo "! $src regex matches ok" 1>&2 || exit $?
+    else
+        echo "! $src regex doesn't match FAILED" 1>&2 || exit $?
+    fi
+}
+
+
+WVPASS bup init
+WVPASS cd "$tmpdir"
+
+
+WVSTART "rm /foo (lone branch)"
+WVPASS mkdir src src/foo
+WVPASS echo twisty-maze > src/1
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS "$top"/dev/sync-tree bup/ bup-baseline/
+# FIXME: test -n
+WVPASS bup tick # Make sure we always get the timestamp changes below
+WVPASS bup rm --unsafe /src
+observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
+wv_matches_rx "$observed" \
+'\*deleting[ ]+logs/refs/heads/src
+\*deleting[ ]+refs/heads/src(
+\.d\.\.t\.\.\.[.]*[ ]+\./)?
+\.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
+\.d\.\.t\.\.\.[.]*[ ]+refs/heads/(
+>f\+\+\+\+\+\+\+\+\+[ ]+packed-refs)?'
+
+
+WVSTART "rm /foo (one of many)"
+WVPASS rm -rf bup
+WVPASS mv bup-baseline bup
+WVPASS echo twisty-maze > src/2
+WVPASS bup index src
+WVPASS bup save -n src-2 src
+WVPASS echo twisty-maze > src/3
+WVPASS bup index src
+WVPASS bup save -n src-3 src
+WVPASS "$top"/dev/sync-tree bup/ bup-baseline/
+WVPASS bup tick # Make sure we always get the timestamp changes below
+WVPASS bup rm --unsafe /src
+observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
+wv_matches_rx "$observed" \
+"\*deleting[ ]+logs/refs/heads/src
+\*deleting[ ]+refs/heads/src(
+\.d\.\.t\.\.\.[.]*[ ]+\./)?
+\.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
+\.d\.\.t\.\.\.[.]*[ ]+refs/heads/(
+>f\+\+\+\+\+\+\+\+\+[ ]+packed-refs)?"
+
+
+WVSTART "rm /foo /bar (multiple of many)"
+WVPASS rm -rf bup
+WVPASS mv bup-baseline bup
+WVPASS echo twisty-maze > src/4
+WVPASS bup index src
+WVPASS bup save -n src-4 src
+WVPASS echo twisty-maze > src/5
+WVPASS bup index src
+WVPASS bup save -n src-5 src
+WVPASS "$top"/dev/sync-tree bup/ bup-baseline/
+WVPASS bup tick # Make sure we always get the timestamp changes below
+WVPASS bup rm --unsafe /src-2 /src-4
+observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
+wv_matches_rx "$observed" \
+"\*deleting[ ]+logs/refs/heads/src-2
+\*deleting[ ]+logs/refs/heads/src-4
+\*deleting[ ]+refs/heads/src-2
+\*deleting[ ]+refs/heads/src-4(
+\.d\.\.t\.\.\.[.]*[ ]+\./)?
+\.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
+\.d\.\.t\.\.\.[.]*[ ]+refs/heads/(
+>f\+\+\+\+\+\+\+\+\+[ ]+packed-refs)?"
+
+
+WVSTART "rm /foo /bar (all)"
+WVPASS rm -rf bup
+WVPASS mv bup-baseline bup
+WVPASS "$top"/dev/sync-tree bup/ bup-baseline/
+WVPASS bup tick # Make sure we always get the timestamp changes below
+WVPASS bup rm --unsafe /src /src-2 /src-3 /src-4 /src-5
+observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
+wv_matches_rx "$observed" \
+"\*deleting[ ]+logs/refs/heads/src
+\*deleting[ ]+logs/refs/heads/src-2
+\*deleting[ ]+logs/refs/heads/src-3
+\*deleting[ ]+logs/refs/heads/src-4
+\*deleting[ ]+logs/refs/heads/src-5
+\*deleting[ ]+refs/heads/src
+\*deleting[ ]+refs/heads/src-2
+\*deleting[ ]+refs/heads/src-3
+\*deleting[ ]+refs/heads/src-4
+\*deleting[ ]+refs/heads/src-5(
+\.d\.\.t\.\.\.[.]*[ ]+\./)?
+\.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
+\.d\.\.t\.\.\.[.]*[ ]+refs/heads/(
+>f\+\+\+\+\+\+\+\+\+[ ]+packed-refs)?"
+
+
+WVSTART "rm /foo/bar (lone save - equivalent to rm /foo)"
+WVPASS rm -rf bup bup-baseline src
+WVPASS bup init
+WVPASS mkdir src
+WVPASS echo twisty-maze > src/1
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS bup ls src > tmp-ls
+save1="$(WVPASS head -n 1 tmp-ls)" || exit $?
+WVPASS "$top"/dev/sync-tree bup/ bup-baseline/
+WVPASS bup tick # Make sure we always get the timestamp changes below
+WVFAIL bup rm --unsafe /src/latest
+WVPASS bup rm --unsafe /src/"$save1"
+observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
+wv_matches_rx "$observed" \
+"\*deleting[ ]+logs/refs/heads/src
+\*deleting[ ]+refs/heads/src(
+\.d\.\.t\.\.\.[.]*[ ]+\./)?
+\.d\.\.t\.\.\.[.]*[ ]+logs/refs/heads/
+\.d\.\.t\.\.\.[.]*[ ]+refs/heads/(
+>f\+\+\+\+\+\+\+\+\+[ ]+packed-refs)?"
+
+
+verify-changes-caused-by-rewriting-save()
+{
+    local before="$1" after="$2" tmpdir
+    tmpdir="$(WVPASS wvmktempdir)" || exit $?
+    (WVPASS cd "$before" && WVPASS find . | WVPASS sort) \
+        > "$tmpdir/before" || exit $?
+    (WVPASS cd "$after" && WVPASS find . | WVPASS sort) \
+        > "$tmpdir/after" || exit $?
+    local new_paths new_idx new_pack observed
+    new_paths="$(WVPASS comm -13 "$tmpdir/before" "$tmpdir/after")" || exit $?
+    new_idx="$(echo "$new_paths" | WVPASS grep -E '^\./objects/pack/pack-.*\.idx$' | cut -b 3-)" || exit $?
+    new_pack="$(echo "$new_paths" | WVPASS grep -E '^\./objects/pack/pack-.*\.pack$' | cut -b 3-)" || exit $?
+    wv_matches_rx "$(compare-trees "$after/" "$before/")" \
+">fcst\.\.\.[.]*[ ]+logs/refs/heads/src
+\.d\.\.t\.\.\.[.]*[ ]+objects/
+\.d\.\.t\.\.\.[.]*[ ]+objects/pack/
+>fcst\.\.\.[.]*[ ]+objects/pack/bup\.bloom
+>f\+\+\+\+\+\+\+[+]*[ ]+$new_idx
+>f\+\+\+\+\+\+\+[+]*[ ]+$new_pack
+\.d\.\.t\.\.\.[.]*[ ]+refs/heads/
+>fc\.t\.\.\.[.]*[ ]+refs/heads/src"
+    WVPASS rm -rf "$tmpdir"
+}
+
+commit-hash-n()
+{
+    local n="$1" repo="$2" branch="$3"
+    GIT_DIR="$repo" WVPASS git rev-list --reverse "$branch" \
+        | WVPASS awk "FNR == $n"
+}
+
+rm-safe-cinfo()
+{
+    local n="$1" repo="$2" branch="$3" hash
+    hash="$(commit-hash-n "$n" "$repo" "$branch")" || exit $?
+    local fmt='Tree: %T%n'
+    fmt="${fmt}Author: %an <%ae> %ai%n"
+    fmt="${fmt}Committer: %cn <%ce> %ci%n"
+    fmt="${fmt}%n%s%n%b"
+    GIT_DIR="$repo" WVPASS git log -n1 --pretty=format:"$fmt" "$hash"
+}
+
+
+WVSTART 'rm /foo/BAR (setup)'
+WVPASS rm -rf bup bup-baseline src
+WVPASS bup init
+WVPASS mkdir src
+WVPASS echo twisty-maze > src/1
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS echo twisty-maze > src/2
+WVPASS bup index src
+WVPASS bup tick
+WVPASS bup save -n src src
+WVPASS echo twisty-maze > src/3
+WVPASS bup index src
+WVPASS bup tick
+WVPASS bup save -n src src
+WVPASS mv bup bup-baseline
+WVPASS bup tick # Make sure we always get the timestamp changes below
+
+
+WVSTART "rm /foo/BAR (first of many)"
+WVPASS "$top"/dev/sync-tree bup-baseline/ bup/
+WVPASS bup ls src > tmp-ls
+victim="$(WVPASS head -n 1 tmp-ls)" || exit $?
+WVPASS bup rm --unsafe /src/"$victim"
+verify-changes-caused-by-rewriting-save bup-baseline bup
+observed=$(WVPASS git rev-list src | WVPASS wc -l) || exit $?
+WVPASSEQ 2 $observed
+WVPASSEQ "$(rm-safe-cinfo 1 bup src)" "$(rm-safe-cinfo 2 bup-baseline src)"
+WVPASSEQ "$(rm-safe-cinfo 2 bup src)" "$(rm-safe-cinfo 3 bup-baseline src)"
+
+
+WVSTART "rm /foo/BAR (one of many)"
+WVPASS "$top"/dev/sync-tree bup-baseline/ bup/
+victim="$(WVPASS bup ls src | tail -n +2 | head -n 1)" || exit $?
+WVPASS bup rm --unsafe /src/"$victim"
+verify-changes-caused-by-rewriting-save bup-baseline bup
+observed=$(git rev-list src | wc -l) || exit $?
+WVPASSEQ 2 $observed
+WVPASSEQ "$(commit-hash-n 1 bup src)" "$(commit-hash-n 1 bup-baseline src)"
+WVPASSEQ "$(rm-safe-cinfo 2 bup src)" "$(rm-safe-cinfo 3 bup-baseline src)"
+
+
+WVSTART "rm /foo/BAR (last of many)"
+WVPASS "$top"/dev/sync-tree bup-baseline/ bup/
+victim="$(WVPASS bup ls src | tail -n 2 | head -n 1)" || exit $?
+WVPASS bup rm --unsafe -vv /src/"$victim"
+observed="$(compare-trees bup/ bup-baseline/ | LC_ALL=C sort)" || exit $?
+wv_matches_rx "$observed" \
+"\.d\.\.t\.\.\.[.]*[ ]+refs/heads/
+>fc\.t\.\.\.[.]*[ ]+refs/heads/src
+>fcst\.\.\.[.]*[ ]+logs/refs/heads/src"
+observed=$(git rev-list src | wc -l) || exit $?
+WVPASSEQ 2 $observed
+WVPASSEQ "$(commit-hash-n 1 bup src)" "$(commit-hash-n 1 bup-baseline src)"
+WVPASSEQ "$(commit-hash-n 2 bup src)" "$(commit-hash-n 2 bup-baseline src)"
+
+
+# FIXME: test that committer changes when rewriting, when appropriate
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-save-creates-no-unrefs.sh b/test/ext/test-save-creates-no-unrefs.sh
new file mode 100755 (executable)
index 0000000..38d9064
--- /dev/null
@@ -0,0 +1,22 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+
+WVSTART 'all'
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$BUP_DIR"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS mkdir -p "$tmpdir/src"
+WVPASS touch "$tmpdir/src/foo"
+WVPASS bup init
+WVPASS bup index "$tmpdir/src"
+WVPASS bup save -n src "$tmpdir/src"
+WVPASSEQ "$(git fsck --unreachable)" ""
+WVPASS bup save -n src "$tmpdir/src"
+WVPASSEQ "$(git fsck --unreachable)" ""
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-save-errors b/test/ext/test-save-errors
new file mode 100755 (executable)
index 0000000..7b65f16
--- /dev/null
@@ -0,0 +1,141 @@
+#!/usr/bin/env bash
+. wvtest.sh
+. wvtest-bup.sh
+. dev/lib.sh
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+# necessary for 0 == 1970-01-01 00:00
+export TZ=UTC
+
+WVSTART "init"
+WVPASS bup init
+
+mkdir "$tmpdir/save"
+for f in $(seq 9) ; do
+    touch -t 200${f}01010000 "$tmpdir/save/$f"
+done
+mkdir "$tmpdir/save/a"
+touch -t 199901010000 "$tmpdir/save/a/1"
+
+WVSTART "metadata read error for a file"
+WVPASS bup index "$tmpdir/save"
+
+# now do a hack to inject save errors while reading metadata
+# essentially, we create a bup-save command for ourselves
+# that gets an error for the .../5 file in metadata.from_path()
+cat > "$tmpdir/bup-save" << EOF
+#!/usr/bin/env $top/dev/bup-python
+from bup import metadata
+
+orig_from_path = metadata.from_path
+def from_path(path, *args, **kw):
+    if path.endswith(b'/5'):
+        raise IOError('intentionally failing metadata read for .../5')
+    return orig_from_path(path, *args, **kw)
+metadata.from_path = from_path
+
+exec(open("$top/lib/cmd/bup-save", "rb").read())
+EOF
+chmod +x "$tmpdir/bup-save"
+
+# use it to save the data
+"$tmpdir/bup-save" -n test "$tmpdir/save"
+
+# this should work anyway
+WVPASS bup ls -l "test/latest/$tmpdir/save"
+# also check the *right* data was returned
+lsout="$(bup ls -l "test/latest/$tmpdir/save")"
+for f in 1 2 3 4   6 7 8 9 ; do
+    if ! echo "$lsout" | grep "200${f}-01-01 00:00 $f" ; then
+        WVFAIL echo incorrect date for $f
+    fi
+done
+# and ensure we actually failed, and the above script/hack didn't break
+if ! echo "$lsout" | grep "1970-01-01 00:00 5" ; then
+    WVFAIL echo unexpected date for file 5
+fi
+
+
+WVSTART "metadata read error for a folder"
+WVPASS bup index --clear
+WVPASS bup index "$tmpdir/save"
+
+cat > "$tmpdir/bup-save" << EOF
+#!/usr/bin/env $top/dev/bup-python
+from bup import metadata
+
+orig_from_path = metadata.from_path
+def from_path(path, *args, **kw):
+    if path.endswith(b'/a'):
+        raise IOError('intentionally failing metadata read for .../a')
+    return orig_from_path(path, *args, **kw)
+metadata.from_path = from_path
+
+exec(open("$top/lib/cmd/bup-save", "rb").read())
+EOF
+chmod +x "$tmpdir/bup-save"
+
+# use it to save the data
+"$tmpdir/bup-save" -n test "$tmpdir/save"
+
+# this should work anyway
+WVPASS bup ls -l "test/latest/$tmpdir/save"
+if ! bup ls -l "test/latest/$tmpdir/save/a" | grep '1999-01-01 00:00 1' ; then
+    WVFAIL unexpected date for file a/1
+fi
+# and ensure we actually failed, and the above script/hack didn't break
+if ! bup ls -l "test/latest/$tmpdir/save" | grep "1970-01-01 00:00 a" ; then
+    WVFAIL unexpected date for directory a
+fi
+
+
+WVSTART "duplicate entries"
+WVPASS bup index --clear
+WVPASS bup index "$tmpdir/save"
+
+cat > "$tmpdir/bup-save" << EOF
+#!/usr/bin/env $top/dev/bup-python
+from bup import index
+
+Reader = index.Reader
+class DupReader(index.Reader):
+    def filter(self, *args, **kw):
+        for transname, ent in Reader.filter(self, *args, **kw):
+            # duplicate a file and a folder
+            if ent.name.endswith(b'/5') or ent.name.endswith(b'/a/'):
+                yield transname, ent
+            yield transname, ent
+index.Reader = DupReader
+
+exec(open("$top/lib/cmd/bup-save", "rb").read())
+EOF
+chmod +x "$tmpdir/bup-save"
+
+# use it to save the data
+"$tmpdir/bup-save" -n test "$tmpdir/save"
+
+# this should work
+WVPASS bup ls -l "test/latest/$tmpdir/save"
+
+# check that there are no duplicates
+lsout=$(bup ls -l "test/latest/$tmpdir/save")
+WVPASSEQ "$(echo "$lsout" | sort | uniq -d)" ""
+
+# and we should get the *right* data for each entry
+for f in $(seq 9) ; do
+    if ! echo "$lsout" | grep "200${f}-01-01 00:00 $f" ; then
+        WVFAIL echo incorrect metadata for $f
+    fi
+done
+
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-save-restore b/test/ext/test-save-restore
new file mode 100755 (executable)
index 0000000..48c9e0d
--- /dev/null
@@ -0,0 +1,158 @@
+#!/usr/bin/env bash
+. wvtest.sh
+. wvtest-bup.sh
+. dev/lib.sh
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+validate-local-and-remote-restore()
+{
+    local src="$1" dest="$2" cmp_src="$3" cmp_dest="$4"
+    force-delete "$dest"
+    WVPASS bup restore -C "$dest" "$src"
+    WVPASS "$top/dev/compare-trees" "$cmp_src" "$cmp_dest"
+    force-delete "$dest"
+    WVPASS bup restore -r ":$BUP_DIR" -C "$dest" "$src"
+    WVPASS "$top/dev/compare-trees" "$cmp_src" "$cmp_dest"
+}
+
+
+WVPASS cd "$tmpdir"
+
+WVSTART "init"
+WVPASS bup init
+D=bupdata.tmp
+WVPASS force-delete $D
+WVPASS mkdir $D
+WVPASS touch $D/a
+WVPASS bup random 128k >$D/b
+WVPASS mkdir $D/d $D/d/e
+WVPASS bup random 512 >$D/f
+WVPASS touch $D/d/z
+WVPASS touch $D/d/z
+WVPASS bup index $D
+WVPASS bup save -t $D
+
+
+WVSTART "restore"
+WVPASS force-delete buprestore.tmp
+WVFAIL bup restore boink
+WVPASS touch "$tmpdir/$D/$D"
+WVPASS bup index -u "$tmpdir/$D"
+WVPASS bup save -n master /
+WVPASS bup restore -C buprestore.tmp "/master/latest/$tmpdir/$D"
+WVPASSEQ "$(ls buprestore.tmp)" "bupdata.tmp"
+WVPASS force-delete buprestore.tmp
+WVPASS bup restore -C buprestore.tmp "/master/latest/$tmpdir/$D/"
+WVPASS touch $D/non-existent-file buprestore.tmp/non-existent-file # else diff fails
+WVPASS diff -ur $D/ buprestore.tmp/
+WVPASS force-delete buprestore.tmp
+WVPASS echo -n "" | WVPASS bup split -n split_empty_string.tmp
+WVPASS bup restore -C buprestore.tmp split_empty_string.tmp/latest/
+WVPASSEQ "$(cat buprestore.tmp/data)" ""
+
+
+(
+    tmp=testrestore.tmp
+    WVPASS force-delete $tmp
+    WVPASS mkdir $tmp
+    export BUP_DIR="$(pwd)/$tmp/bup"
+    WVPASS WVPASS bup init
+    WVPASS mkdir -p $tmp/src/x/y/z
+    WVPASS bup random 8k > $tmp/src/x/y/random-1
+    WVPASS bup random 8k > $tmp/src/x/y/z/random-2
+    WVPASS bup index -u $tmp/src
+    WVPASS bup save --strip -n foo $tmp/src
+
+    WVSTART "restore /foo/latest"
+    validate-local-and-remote-restore \
+        /foo/latest  "$tmp/restore" \
+        "$tmp/src/" "$tmp/restore/latest/"
+
+    WVSTART "restore /foo/latest/."
+    WVPASS force-delete "$tmp/restore"
+    validate-local-and-remote-restore \
+        /foo/latest/.  "$tmp"/restore \
+        "$tmp"/src/ "$tmp"/restore
+
+    WVSTART "restore /foo/latest/x"
+    WVPASS force-delete "$tmp/restore"
+    validate-local-and-remote-restore \
+        /foo/latest/x  "$tmp"/restore \
+        "$tmp"/src/x/ "$tmp"/restore/x/
+
+    WVSTART "restore /foo/latest/x/"
+    WVPASS force-delete "$tmp/restore"  
+    WVPASS bup restore -C "$tmp"/restore /foo/latest/x/
+    for x in "$tmp"/src/x/*; do
+        WVPASS "$top/dev/compare-trees" "$x/" "$tmp/restore/$(basename $x)"
+    done
+    WVPASS force-delete "$tmp/restore"  
+    WVPASS bup restore -r ":$BUP_DIR" -C "$tmp"/restore /foo/latest/x/
+    for x in "$tmp"/src/x/*; do
+        WVPASS "$top/dev/compare-trees" "$x/" "$tmp/restore/$(basename $x)"
+    done
+
+    WVSTART "restore /foo/latest/x/."
+    WVPASS force-delete "$tmp/restore"
+    validate-local-and-remote-restore \
+        /foo/latest/x/.  "$tmp"/restore \
+        "$tmp"/src/x/ "$tmp"/restore/
+) || exit $?
+
+
+WVSTART "save (no index)"
+(
+    tmp=save-no-index.tmp
+    WVPASS force-delete $tmp
+    WVPASS mkdir $tmp
+    export BUP_DIR="$(WVPASS pwd)/$tmp/bup" || exit $?
+    WVPASS bup init
+    WVFAIL bup save -n nothing /
+    WVPASS rm -r "$tmp"
+) || exit $?
+
+
+WVSTART "save disjoint top-level directories"
+(
+    # Resolve any symlinks involving the top top-level dirs.
+    real_pwd="$(WVPASS resolve-parent .)" || exit $?
+    real_tmp="$(WVPASS resolve-parent /tmp/.)" || exit $?
+    pwd_top="$(echo $real_pwd | WVPASS awk -F "/" '{print $2}')" || exit $?
+    tmp_top="$(echo $real_tmp | WVPASS awk -F "/" '{print $2}')" || exit $?
+
+    if [ "$pwd_top" = "$tmp_top" ]; then
+        echo "(running from within /$tmp_top; skipping test)" 1>&2
+        exit 0
+    fi
+    D=bupdata.tmp
+    WVPASS force-delete $D
+    WVPASS mkdir -p $D/x
+    WVPASS date > $D/x/1
+    tmpdir2="$(WVPASS mktemp -d $real_tmp/bup-test-XXXXXXX)" || exit $?
+    cleanup() { WVPASS rm -r "$tmpdir2"; }
+    WVPASS trap cleanup EXIT
+    WVPASS date > "$tmpdir2/2"
+
+    export BUP_DIR="$tmpdir/bup"
+    WVPASS test -d "$BUP_DIR" && WVPASS rm -r "$BUP_DIR"
+
+    WVPASS bup init
+    WVPASS bup index -vu $(pwd)/$D/x "$tmpdir2"
+    WVPASS bup save -t -n src $(pwd)/$D/x "$tmpdir2"
+
+    # For now, assume that "ls -a" and "sort" use the same order.
+    actual="$(WVPASS bup ls -AF src/latest)" || exit $?
+    expected="$(echo -e "$pwd_top/\n$tmp_top/" | WVPASS sort)" || exit $?
+    WVPASSEQ "$actual" "$expected"
+) || exit $?
+
+
+WVPASS cd "$top"
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-save-restore-excludes.sh b/test/ext/test-save-restore-excludes.sh
new file mode 100755 (executable)
index 0000000..39ce969
--- /dev/null
@@ -0,0 +1,303 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+
+WVSTART "index excludes bupdir"
+WVPASS force-delete src "$BUP_DIR"
+WVPASS bup init
+WVPASS mkdir src
+WVPASS touch src/a
+WVPASS bup random 128k >src/b
+WVPASS mkdir src/d src/d/e
+WVPASS bup random 512 >src/f
+WVPASS bup index -ux src
+WVPASS bup save -n exclude-bupdir src
+WVPASSEQ "$(bup ls -AF "exclude-bupdir/latest/$tmpdir/src/")" "a
+b
+d/
+f"
+
+
+WVSTART "index --exclude"
+WVPASS force-delete src "$BUP_DIR"
+WVPASS bup init
+WVPASS mkdir src
+WVPASS touch src/a
+WVPASS bup random 128k >src/b
+WVPASS mkdir src/d src/d/e
+WVPASS bup random 512 >src/f
+WVPASS bup random 512 >src/j
+WVPASS bup index -ux --exclude src/d --exclude src/j src
+WVPASS bup save -n exclude src
+WVPASSEQ "$(bup ls "exclude/latest/$tmpdir/src/")" "a
+b
+f"
+WVPASS mkdir src/g src/h
+WVPASS bup index -ux --exclude src/d --exclude $tmpdir/src/g --exclude src/h \
+    --exclude "$tmpdir/src/j" src
+WVPASS bup save -n exclude src
+WVPASSEQ "$(bup ls "exclude/latest/$tmpdir/src/")" "a
+b
+f"
+
+
+WVSTART "index --exclude-from"
+WVPASS force-delete src "$BUP_DIR"
+WVPASS bup init
+WVPASS mkdir src
+WVPASS echo "src/d
+ $tmpdir/src/g
+src/h
+src/i" > exclude-list
+WVPASS touch src/a
+WVPASS bup random 128k >src/b
+WVPASS mkdir src/d src/d/e
+WVPASS bup random 512 >src/f
+WVPASS mkdir src/g src/h
+WVPASS bup random 128k > src/i
+WVPASS bup index -ux --exclude-from exclude-list src
+WVPASS bup save -n exclude-from src
+WVPASSEQ "$(bup ls "exclude-from/latest/$tmpdir/src/")" "a
+b
+f"
+WVPASS rm exclude-list
+
+
+# bup index --exclude-rx ...
+# ==========================
+
+WVSTART "index --exclude-rx '^/foo' (root anchor)"
+WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
+WVPASS bup init
+WVPASS mkdir src
+WVPASS touch src/a
+WVPASS touch src/b
+WVPASS mkdir src/sub1
+WVPASS mkdir src/sub2
+WVPASS touch src/sub1/a
+WVPASS touch src/sub2/b
+WVPASS bup index -u src --exclude-rx "^$(pwd)/src/sub1/"
+WVPASS bup save --strip -n bupdir src
+WVPASS bup restore -C buprestore.tmp /bupdir/latest/
+actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
+WVPASSEQ "$actual" ".
+./a
+./b
+./sub2
+./sub2/b"
+
+WVSTART "index --exclude-rx '/foo$' (non-dir, tail anchor)"
+WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
+WVPASS bup init
+WVPASS mkdir src
+WVPASS touch src/a
+WVPASS touch src/b
+WVPASS touch src/foo
+WVPASS mkdir src/sub
+WVPASS mkdir src/sub/foo
+WVPASS touch src/sub/foo/a
+WVPASS bup index -u src --exclude-rx '/foo$'
+WVPASS bup save --strip -n bupdir src
+WVPASS bup restore -C buprestore.tmp /bupdir/latest/
+actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
+WVPASSEQ "$actual" ".
+./a
+./b
+./sub
+./sub/foo
+./sub/foo/a"
+
+WVSTART "index --exclude-rx '/foo/$' (dir, tail anchor)"
+WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
+WVPASS bup init
+WVPASS mkdir src
+WVPASS touch src/a
+WVPASS touch src/b
+WVPASS touch src/foo
+WVPASS mkdir src/sub
+WVPASS mkdir src/sub/foo
+WVPASS touch src/sub/foo/a
+WVPASS bup index -u src --exclude-rx '/foo/$'
+WVPASS bup save --strip -n bupdir src
+WVPASS bup restore -C buprestore.tmp /bupdir/latest/
+actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
+WVPASSEQ "$actual" ".
+./a
+./b
+./foo
+./sub"
+
+WVSTART "index --exclude-rx '/foo/.' (dir content)"
+WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
+WVPASS bup init
+WVPASS mkdir src
+WVPASS touch src/a
+WVPASS touch src/b
+WVPASS touch src/foo
+WVPASS mkdir src/sub
+WVPASS mkdir src/sub/foo
+WVPASS touch src/sub/foo/a
+WVPASS bup index -u src --exclude-rx '/foo/.'
+WVPASS bup save --strip -n bupdir src
+WVPASS bup restore -C buprestore.tmp /bupdir/latest/
+actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
+WVPASSEQ "$actual" ".
+./a
+./b
+./foo
+./sub
+./sub/foo"
+
+
+# bup index --exclude-rx-from ...
+# ===============================
+WVSTART "index --exclude-rx-from"
+WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
+WVPASS bup init
+WVPASS mkdir src
+WVPASS touch src/a
+WVPASS touch src/b
+WVPASS mkdir src/sub1
+WVPASS mkdir src/sub2
+WVPASS touch src/sub1/a
+WVPASS touch src/sub2/b
+# exclude-rx-file includes blank lines to check that we ignore them.
+WVPASS echo "^$(pwd)/src/sub1/
+
+" > exclude-rx-file
+WVPASS bup index -u src --exclude-rx-from exclude-rx-file
+WVPASS bup save --strip -n bupdir src
+WVPASS bup restore -C buprestore.tmp /bupdir/latest/
+actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
+WVPASSEQ "$actual" ".
+./a
+./b
+./sub2
+./sub2/b"
+
+
+# bup restore --exclude-rx ...
+# ============================
+
+WVSTART "restore --exclude-rx '^/foo' (root anchor)"
+WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
+WVPASS bup init
+WVPASS mkdir src
+WVPASS touch src/a
+WVPASS touch src/b
+WVPASS mkdir src/sub1
+WVPASS mkdir src/sub2
+WVPASS touch src/sub1/a
+WVPASS touch src/sub2/b
+WVPASS bup index -u src
+WVPASS bup save --strip -n bupdir src
+WVPASS bup restore -C buprestore.tmp --exclude-rx "^/sub1/" /bupdir/latest/
+actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
+WVPASSEQ "$actual" ".
+./a
+./b
+./sub2
+./sub2/b"
+
+WVSTART "restore --exclude-rx '/foo$' (non-dir, tail anchor)"
+WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
+WVPASS bup init
+WVPASS mkdir src
+WVPASS touch src/a
+WVPASS touch src/b
+WVPASS touch src/foo
+WVPASS mkdir src/sub
+WVPASS mkdir src/sub/foo
+WVPASS touch src/sub/foo/a
+WVPASS bup index -u src
+WVPASS bup save --strip -n bupdir src
+WVPASS bup restore -C buprestore.tmp --exclude-rx '/foo$' /bupdir/latest/
+actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
+WVPASSEQ "$actual" ".
+./a
+./b
+./sub
+./sub/foo
+./sub/foo/a"
+
+WVSTART "restore --exclude-rx '/foo/$' (dir, tail anchor)"
+WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
+WVPASS bup init
+WVPASS mkdir src
+WVPASS touch src/a
+WVPASS touch src/b
+WVPASS touch src/foo
+WVPASS mkdir src/sub
+WVPASS mkdir src/sub/foo
+WVPASS touch src/sub/foo/a
+WVPASS bup index -u src
+WVPASS bup save --strip -n bupdir src
+WVPASS bup restore -C buprestore.tmp --exclude-rx '/foo/$' /bupdir/latest/
+actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
+WVPASSEQ "$actual" ".
+./a
+./b
+./foo
+./sub"
+
+WVSTART "restore --exclude-rx '/foo/.' (dir content)"
+WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
+WVPASS bup init
+WVPASS mkdir src
+WVPASS touch src/a
+WVPASS touch src/b
+WVPASS touch src/foo
+WVPASS mkdir src/sub
+WVPASS mkdir src/sub/foo
+WVPASS touch src/sub/foo/a
+WVPASS bup index -u src
+WVPASS bup save --strip -n bupdir src
+WVPASS bup restore -C buprestore.tmp --exclude-rx '/foo/.' /bupdir/latest/
+actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
+WVPASSEQ "$actual" ".
+./a
+./b
+./foo
+./sub
+./sub/foo"
+
+
+# bup restore --exclude-rx-from ...
+# =================================
+
+WVSTART "restore --exclude-rx-from"
+WVPASS rm -rf src "$BUP_DIR" buprestore.tmp
+WVPASS bup init
+WVPASS mkdir src
+WVPASS touch src/a
+WVPASS touch src/b
+WVPASS mkdir src/sub1
+WVPASS mkdir src/sub2
+WVPASS touch src/sub1/a
+WVPASS touch src/sub2/b
+WVPASS bup index -u src
+WVPASS bup save --strip -n bupdir src
+WVPASS echo "^/sub1/" > exclude-rx-file
+WVPASS bup restore -C buprestore.tmp \
+    --exclude-rx-from exclude-rx-file /bupdir/latest/
+actual="$(WVPASS cd buprestore.tmp; WVPASS find . | WVPASS sort)" || exit $?
+WVPASSEQ "$actual" ".
+./a
+./b
+./sub2
+./sub2/b"
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-save-smaller b/test/ext/test-save-smaller
new file mode 100755 (executable)
index 0000000..1f497b7
--- /dev/null
@@ -0,0 +1,57 @@
+#!/usr/bin/env bash
+. wvtest.sh
+. wvtest-bup.sh
+. dev/lib.sh
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+WVSTART "init"
+WVPASS bup init
+
+WVPASS mkdir "$tmpdir/save"
+WVPASS echo small0 > "$tmpdir/save/small"
+WVPASS echo bigbigbigbigbig01 > "$tmpdir/save/big1"
+big1sha="$(sha1sum < "$tmpdir/save/big1")"
+WVPASS bup index "$tmpdir/save"
+WVPASS bup save -vv -n test "$tmpdir/save"
+WVPASS mkdir "$tmpdir/restore1"
+WVPASS bup restore -v --outdir="$tmpdir/restore1/" "/test/latest$tmpdir/save/"
+WVPASS cmp "$tmpdir/restore1/small" "$tmpdir/save/small"
+WVPASS cmp "$tmpdir/restore1/big1" "$tmpdir/save/big1"
+
+WVSTART "save --smaller"
+WVPASS echo bigbigbigbigbig02 > "$tmpdir/save/big1"
+WVPASS echo bigbigbigbigbig03 > "$tmpdir/save/big2"
+WVPASS bup index "$tmpdir/save"
+WVPASS bup save -vv -n test --smaller=10 "$tmpdir/save"
+WVPASS mkdir "$tmpdir/restore2"
+WVPASS bup restore -v --outdir="$tmpdir/restore2/" "/test/latest$tmpdir/save/"
+WVPASS cmp "$tmpdir/restore2/small" "$tmpdir/save/small"
+# (per the original DESIGN document, we should've had the old version
+# of the modified large file, but really that isn't implemented)
+# must _not_ have this file at all
+WVFAIL test -f "$tmpdir/restore2/big1"
+# and not the new one either
+WVFAIL test -f "$tmpdir/restore2/big2"
+
+WVSTART "index --fake-valid / save"
+WVPASS echo bigbigbigbigbig02 > "$tmpdir/save/big1"
+WVPASS echo bigbigbigbigbig03 > "$tmpdir/save/big2"
+WVPASS bup index "$tmpdir/save"
+WVPASS bup index --fake-valid "$tmpdir/save/big1" "$tmpdir/save/big2"
+WVPASS bup save -vv -n test "$tmpdir/save"
+WVPASS mkdir "$tmpdir/restore3"
+WVPASS bup restore -v --outdir="$tmpdir/restore3/" "/test/latest$tmpdir/save/"
+WVPASS cmp "$tmpdir/restore3/small" "$tmpdir/save/small"
+WVPASSEQ "$(sha1sum < "$tmpdir/restore3/big1")" "$big1sha"
+WVPASS cmp "$tmpdir/restore3/big2" "$tmpdir/save/big2"
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-save-strip-graft.sh b/test/ext/test-save-strip-graft.sh
new file mode 100755 (executable)
index 0000000..78b79fe
--- /dev/null
@@ -0,0 +1,161 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+compare-trees() { "$top/dev/compare-trees" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+
+WVSTART "save --strip"
+WVPASS force-delete "$BUP_DIR" src restore
+WVPASS bup init
+WVPASS mkdir -p src/x/y/z
+WVPASS bup random 8k > src/x/y/random-1
+WVPASS bup random 8k > src/x/y/z/random-2
+WVPASS bup index -u src
+WVPASS bup save --strip -n foo src/x/y
+WVPASS bup restore -C restore /foo/latest
+WVPASS compare-trees src/x/y/ restore/latest/
+
+
+WVSTART "save --strip-path (relative)"
+WVPASS force-delete "$BUP_DIR" src restore
+WVPASS bup init
+WVPASS mkdir -p src/x/y/z
+WVPASS bup random 8k > src/x/y/random-1
+WVPASS bup random 8k > src/x/y/z/random-2
+WVPASS bup index -u src
+WVPASS bup save --strip-path src -n foo src/x
+WVPASS bup restore -C restore /foo/latest
+WVPASS compare-trees src/ restore/latest/
+
+
+WVSTART "save --strip-path (absolute)"
+WVPASS force-delete "$BUP_DIR" src restore
+WVPASS bup init
+WVPASS mkdir -p src/x/y/z
+WVPASS bup random 8k > src/x/y/random-1
+WVPASS bup random 8k > src/x/y/z/random-2
+WVPASS bup index -u src
+WVPASS bup save --strip-path "$tmpdir" -n foo src
+WVPASS bup restore -C restore /foo/latest
+WVPASS compare-trees src/ "restore/latest/src/"
+
+
+WVSTART "save --strip-path (no match)"
+if test $(WVPASS path-filesystems . | WVPASS sort -u | WVPASS wc -l) -ne 1
+then
+    # Skip the test because the attempt to restore parent dirs to the
+    # current filesystem may fail -- i.e. running from
+    # /foo/ext4/bar/btrfs will fail when bup tries to restore linux
+    # attrs above btrfs to the restore tree *inside* btrfs.
+    # FIXME: add WVSKIP
+    echo "(running from tree with mixed filesystems; skipping test)" 1>&2
+    exit 0
+else
+    WVPASS force-delete "$BUP_DIR" src restore
+    WVPASS bup init
+    WVPASS mkdir -p src/x/y/z
+    WVPASS bup random 8k > src/x/y/random-1
+    WVPASS bup random 8k > src/x/y/z/random-2
+    WVPASS bup index -u src
+    WVPASS bup save --strip-path foo -n foo src/x
+    WVPASS bup restore -C restore /foo/latest
+    WVPASS compare-trees src/ "restore/latest/$tmpdir/src/"
+fi
+
+
+WVSTART "save --graft (empty graft points disallowed)"
+WVPASS force-delete "$BUP_DIR" src restore
+WVPASS bup init
+WVPASS mkdir src
+WVFAIL bup save --graft =/grafted -n graft-point-absolute src 2>&1 \
+    | WVPASS grep 'error: a graft point cannot be empty'
+WVFAIL bup save --graft $top/$tmp= -n graft-point-absolute src 2>&1 \
+    | WVPASS grep 'error: a graft point cannot be empty'
+
+
+WVSTART "save --graft /x/y=/a/b (relative paths)"
+WVPASS force-delete "$BUP_DIR" src restore
+WVPASS bup init
+WVPASS mkdir -p src/x/y/z
+WVPASS bup random 8k > src/x/y/random-1
+WVPASS bup random 8k > src/x/y/z/random-2
+WVPASS bup index -u src
+WVPASS bup save --graft src=x -n foo src
+WVPASS bup restore -C restore /foo/latest
+WVPASS compare-trees src/ "restore/latest/$tmpdir/x/"
+
+
+WVSTART "save --graft /x/y=/a/b (matching structure)"
+WVPASS force-delete "$BUP_DIR" src restore
+WVPASS bup init
+WVPASS mkdir -p src/x/y/z
+WVPASS bup random 8k > src/x/y/random-1
+WVPASS bup random 8k > src/x/y/z/random-2
+WVPASS bup index -u src
+WVPASS bup save -v --graft "$tmpdir/src/x/y=$tmpdir/src/a/b" -n foo src/x/y
+WVPASS bup restore -C restore /foo/latest
+WVPASS compare-trees src/x/y/ "restore/latest/$tmpdir/src/a/b/"
+
+
+WVSTART "save --graft /x/y=/a (shorter target)"
+WVPASS force-delete "$BUP_DIR" src restore
+WVPASS bup init
+WVPASS mkdir -p src/x/y/z
+WVPASS bup random 8k > src/x/y/random-1
+WVPASS bup random 8k > src/x/y/z/random-2
+WVPASS bup index -u src
+WVPASS bup save -v --graft "$tmpdir/src/x/y=/a" -n foo src/x/y
+WVPASS bup restore -C restore /foo/latest
+WVPASS compare-trees src/x/y/ "restore/latest/a/"
+
+
+WVSTART "save --graft /x=/a/b (longer target)"
+WVPASS force-delete "$BUP_DIR" src restore
+WVPASS bup init
+WVPASS mkdir -p src/x/y/z
+WVPASS bup random 8k > src/x/y/random-1
+WVPASS bup random 8k > src/x/y/z/random-2
+WVPASS bup index -u src
+WVPASS bup save -v --graft "$tmpdir/src=$tmpdir/src/a/b/c" -n foo src
+WVPASS bup restore -C restore /foo/latest
+WVPASS compare-trees src/ "restore/latest/$tmpdir/src/a/b/c/"
+
+
+WVSTART "save --graft /x=/ (root target)"
+WVPASS force-delete "$BUP_DIR" src restore
+WVPASS bup init
+WVPASS mkdir -p src/x/y/z
+WVPASS bup random 8k > src/x/y/random-1
+WVPASS bup random 8k > src/x/y/z/random-2
+WVPASS bup index -u src
+WVPASS bup save -v --graft "$tmpdir/src/x=/" -n foo src/x
+WVPASS bup restore -C restore /foo/latest
+WVPASS compare-trees src/x/ "restore/latest/"
+
+
+#WVSTART "save --graft /=/x/ (root source)"
+# FIXME: Not tested for now -- will require cleverness, or caution as root.
+
+
+WVSTART "save collision"
+WVPASS force-delete "$BUP_DIR" src restore
+WVPASS bup init
+WVPASS mkdir -p src/x/1 src/y/1
+WVPASS bup index -u src
+WVFAIL bup save --strip -n foo src/x src/y 2> tmp-err.log
+WVPASS grep -F "error: ignoring duplicate path 1 in /" tmp-err.log
+
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-save-with-valid-parent.sh b/test/ext/test-save-with-valid-parent.sh
new file mode 100755 (executable)
index 0000000..53c7e1b
--- /dev/null
@@ -0,0 +1,40 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+compare-trees() { "$top/dev/compare-trees" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+# Make sure that we can explicitly save a path whose parent is up to
+# date.
+
+WVSTART "save path with up to date parent"
+WVPASS bup init
+
+WVPASS mkdir -p src/a src/b
+WVPASS touch src/a/1 src/b/2
+WVPASS bup index -u src
+WVPASS bup save -n src src
+
+WVPASS bup save -n src src/b
+WVPASS bup restore -C restore "src/latest/$(pwd)/"
+WVPASS test ! -e restore/src/a
+WVPASS "$top/dev/compare-trees" -c src/b/ restore/src/b/
+
+WVPASS bup save -n src src/a/1
+WVPASS rm -r restore
+WVPASS bup restore -C restore "src/latest/$(pwd)/"
+WVPASS test ! -e restore/src/b
+WVPASS "$top/dev/compare-trees" -c src/a/ restore/src/a/
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-sparse-files.sh b/test/ext/test-sparse-files.sh
new file mode 100755 (executable)
index 0000000..c000784
--- /dev/null
@@ -0,0 +1,160 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+mb=1048576
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+readonly mb top tmpdir
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+# The 3MB guess is semi-arbitrary, but we've been informed that
+# Lustre, for example, uses 1MB, so guess higher than that, at least.
+block_size=$(bup-cfg-py -c \
+  "import os; print(getattr(os.stat('.'), 'st_blksize', 0)) or $mb * 3") \
+    || exit $?
+data_size=$((block_size * 10))
+readonly block_size data_size
+
+WVPASS dd if=/dev/zero of=test-sparse-probe seek="$data_size" bs=1 count=1
+probe_size=$(WVPASS du -k -s test-sparse-probe | WVPASS cut -f1) || exit $?
+if [ "$probe_size" -ge "$((data_size / 1024))" ]; then
+    WVSTART "no sparse support detected -- skipping tests"
+    exit 0
+fi
+
+WVSTART "sparse restore on $(current-filesystem), assuming ${block_size}B blocks"
+
+WVPASS bup init
+WVPASS mkdir src
+
+WVPASS dd if=/dev/zero of=src/foo seek="$data_size" bs=1 count=1
+WVPASS bup index src
+WVPASS bup save -n src src
+
+WVSTART "sparse file restore (all sparse)"
+WVPASS bup restore -C restore "src/latest/$(pwd)/"
+restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
+WVPASS [ "$restore_size" -ge "$((data_size / 1024))" ]
+WVPASS "$top/dev/compare-trees" -c src/ restore/src/
+
+WVSTART "sparse file restore --no-sparse (all sparse)"
+WVPASS rm -r restore
+WVPASS bup restore --no-sparse -C restore "src/latest/$(pwd)/"
+restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
+WVPASS [ "$restore_size" -ge "$((data_size / 1024))" ]
+WVPASS "$top/dev/compare-trees" -c src/ restore/src/
+
+WVSTART "sparse file restore --sparse (all sparse)"
+WVPASS rm -r restore
+WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
+restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
+WVPASS [ "$restore_size" -le "$((3 * (block_size / 1024)))" ]
+WVPASS "$top/dev/compare-trees" -c src/ restore/src/
+
+WVSTART "sparse file restore --sparse (sparse end)"
+WVPASS echo "start" > src/foo
+WVPASS dd if=/dev/zero of=src/foo seek="$data_size" bs=1 count=1 conv=notrunc
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS rm -r restore
+WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
+restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
+WVPASS [ "$restore_size" -le "$((3 * (block_size / 1024)))" ]
+WVPASS "$top/dev/compare-trees" -c src/ restore/src/
+
+WVSTART "sparse file restore --sparse (sparse middle)"
+WVPASS echo "end" >> src/foo
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS rm -r restore
+WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
+restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
+WVPASS [ "$restore_size" -le "$((5 * (block_size / 1024)))" ]
+WVPASS "$top/dev/compare-trees" -c src/ restore/src/
+
+WVSTART "sparse file restore --sparse (bracketed zero run in buf)"
+WVPASS echo 'x' > src/foo
+WVPASS dd if=/dev/zero bs=1 count=512 >> src/foo
+WVPASS echo 'y' >> src/foo
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS rm -r restore
+WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
+WVPASS "$top/dev/compare-trees" -c src/ restore/src/
+
+WVSTART "sparse file restore --sparse (sparse start)"
+WVPASS dd if=/dev/zero of=src/foo seek="$data_size" bs=1 count=1
+WVPASS echo "end" >> src/foo
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS rm -r restore
+WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
+restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
+WVPASS [ "$restore_size" -le "$((5 * (block_size / 1024)))" ]
+WVPASS "$top/dev/compare-trees" -c src/ restore/src/
+
+WVSTART "sparse file restore --sparse (sparse start and end)"
+WVPASS dd if=/dev/zero of=src/foo seek="$data_size" bs=1 count=1
+WVPASS echo "middle" >> src/foo
+WVPASS dd if=/dev/zero of=src/foo seek=$((2 * data_size)) bs=1 count=1 conv=notrunc
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS rm -r restore
+WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
+restore_size=$(WVPASS du -k -s restore/src/foo | WVPASS cut -f1) || exit $?
+WVPASS [ "$restore_size" -le "$((5 * (block_size / 1024)))" ]
+WVPASS "$top/dev/compare-trees" -c src/ restore/src/
+
+if test "$block_size" -gt $mb; then
+    random_size="$block_size"
+else
+    random_size=1M
+fi
+WVSTART "sparse file restore --sparse (random $random_size)"
+WVPASS bup random --seed "$RANDOM" 1M > src/foo
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS rm -r restore
+WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
+WVPASS "$top/dev/compare-trees" -c src/ restore/src/
+
+WVSTART "sparse file restore --sparse (random sparse regions)"
+WVPASS rm -rf "$BUP_DIR" src
+WVPASS bup init
+WVPASS mkdir src
+for sparse_dataset in 0 1 2 3 4 5 6 7 8 9
+do
+    WVPASS "$top/dev/sparse-test-data" "src/foo-$sparse_dataset"
+done
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS rm -r restore
+WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
+WVPASS "$top/dev/compare-trees" -c src/ restore/src/
+
+WVSTART "sparse file restore --sparse (short zero runs around boundary)"
+WVPASS bup-cfg-py > src/foo <<EOF
+from sys import stdout
+stdout.write("x" * 65535 + "\0")
+stdout.write("\0" + "x" * 65535)
+stdout.write("\0" + "x" * 65534 + "\0")
+stdout.write("x" * 65536)
+stdout.write("\0")
+EOF
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS rm -r restore
+WVPASS bup restore --sparse -C restore "src/latest/$(pwd)/"
+WVPASS "$top/dev/compare-trees" -c src/ restore/src/
+
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-split-join.sh b/test/ext/test-split-join.sh
new file mode 100755 (executable)
index 0000000..548f110
--- /dev/null
@@ -0,0 +1,96 @@
+#!/usr/bin/env bash
+. wvtest.sh
+. wvtest-bup.sh
+. dev/lib.sh
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+WVPASS bup init
+
+WVSTART "split --noop"
+WVPASS bup split --noop <"$top/test/testfile1" >noop.tmp
+WVPASSEQ '' "$(<noop.tmp)"
+WVPASS bup split --noop -b <"$top/test/testfile1" >tags1n.tmp
+WVPASS bup split --noop -t <"$top/test/testfile2" >tags2tn.tmp
+WVPASSEQ $(find "$BUP_DIR/objects/pack" -name '*.pack' | wc -l) 0
+
+WVSTART "split"
+WVPASS echo a >a.tmp
+WVPASS echo b >b.tmp
+WVPASS bup split -b a.tmp >taga.tmp
+WVPASS bup split -b b.tmp >tagb.tmp
+WVPASS cat a.tmp b.tmp | WVPASS bup split -b >tagab.tmp
+WVPASSEQ $(cat taga.tmp | wc -l) 1
+WVPASSEQ $(cat tagb.tmp | wc -l) 1
+WVPASSEQ $(cat tagab.tmp | wc -l) 1
+WVPASSEQ $(cat tag[ab].tmp | wc -l) 2
+WVPASSEQ "$(bup split -b a.tmp b.tmp)" "$(cat tagab.tmp)"
+WVPASSEQ "$(bup split -b --keep-boundaries a.tmp b.tmp)" "$(cat tag[ab].tmp)"
+WVPASSEQ "$(cat tag[ab].tmp | bup split -b --keep-boundaries --git-ids)" \
+         "$(cat tag[ab].tmp)"
+WVPASSEQ "$(cat tag[ab].tmp | bup split -b --git-ids)" \
+         "$(cat tagab.tmp)"
+WVPASS bup split --bench -b <"$top/test/testfile1" >tags1.tmp
+WVPASS bup split -vvvv -b "$top/test/testfile2" >tags2.tmp
+WVPASS echo -n "" | WVPASS bup split -n split_empty_string.tmp
+WVPASS bup margin
+WVPASS bup midx -f
+WVPASS bup midx --check -a
+WVPASS bup midx -o "$BUP_DIR/objects/pack/test1.midx" \
+       "$BUP_DIR"/objects/pack/*.idx
+WVPASS bup midx --check -a
+WVPASS bup midx -o "$BUP_DIR"/objects/pack/test1.midx \
+       "$BUP_DIR"/objects/pack/*.idx \
+       "$BUP_DIR"/objects/pack/*.idx
+WVPASS bup midx --check -a
+all=$(echo "$BUP_DIR"/objects/pack/*.idx "$BUP_DIR"/objects/pack/*.midx)
+WVPASS bup midx -o "$BUP_DIR"/objects/pack/zzz.midx $all
+WVPASS bup tick
+WVPASS bup midx -o "$BUP_DIR"/objects/pack/yyy.midx $all
+WVPASS bup midx -a
+WVPASSEQ "$(echo "$BUP_DIR"/objects/pack/*.midx)" \
+       ""$BUP_DIR"/objects/pack/yyy.midx"
+WVPASS bup margin
+WVPASS bup split -t "$top/test/testfile2" >tags2t.tmp
+WVPASS bup split -t "$top/test/testfile2" --fanout 3 >tags2tf.tmp
+WVPASS bup split -r "$BUP_DIR" -c "$top/test/testfile2" >tags2c.tmp
+WVPASS bup split -r ":$BUP_DIR" -c "$top/test/testfile2" >tags2c.tmp
+WVPASS ls -lR \
+    | WVPASS bup split -r ":$BUP_DIR" -c --fanout 3 --max-pack-objects 3 -n lslr \
+    || exit $?
+WVPASS bup ls
+WVFAIL bup ls /does-not-exist
+WVPASS bup ls /lslr
+WVPASS bup ls /lslr/latest
+WVPASS bup ls /lslr/latest/
+#WVPASS bup ls /lslr/1971-01-01   # all dates always exist
+WVFAIL diff -u tags1.tmp tags2.tmp
+WVPASS diff -u tags1.tmp tags1n.tmp
+WVPASS diff -u tags2t.tmp tags2tn.tmp
+
+# fanout must be different from non-fanout
+WVFAIL diff tags2t.tmp tags2tf.tmp
+WVPASS wc -c "$top/test/testfile1" "$top/test/testfile2"
+WVPASS wc -l tags1.tmp tags2.tmp
+
+WVSTART "join"
+WVPASS bup join $(cat tags1.tmp) >out1.tmp
+WVPASS bup join <tags2.tmp >out2.tmp
+WVPASS bup join <tags2t.tmp -o out2t.tmp
+WVPASS bup join -r "$BUP_DIR" <tags2c.tmp >out2c.tmp
+WVPASS bup join -r ":$BUP_DIR" <tags2c.tmp >out2c.tmp
+WVPASS diff -u "$top/test/testfile1" out1.tmp
+WVPASS diff -u "$top/test/testfile2" out2.tmp
+WVPASS diff -u "$top/test/testfile2" out2t.tmp
+WVPASS diff -u "$top/test/testfile2" out2c.tmp
+WVPASSEQ "$(bup join split_empty_string.tmp)" ""
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-tz.sh b/test/ext/test-tz.sh
new file mode 100755 (executable)
index 0000000..4b566b1
--- /dev/null
@@ -0,0 +1,32 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVSTART "half hour TZ"
+
+export TZ=ACDT-10:30
+
+WVPASS bup init
+WVPASS cd "$tmpdir"
+
+WVPASS mkdir src
+WVPASS bup index src
+WVPASS bup save -n src -d 1420164180 src
+
+WVPASSEQ "$(WVPASS git cat-file commit src | sed -ne 's/^author .*> //p')" \
+"1420164180 +1030"
+
+WVPASSEQ "$(WVPASS bup ls /src)" \
+"2015-01-02-123300
+latest"
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/ext/test-web.sh b/test/ext/test-web.sh
new file mode 100755 (executable)
index 0000000..eab092c
--- /dev/null
@@ -0,0 +1,72 @@
+#!/usr/bin/env bash
+. wvtest-bup.sh || exit $?
+. dev/lib.sh || exit $?
+
+set -o pipefail
+
+TOP="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+bup()
+{
+    "$TOP/bup" "$@"
+}
+
+wait-for-server-start()
+{
+    curl --unix-socket ./socket http://localhost/
+    curl_status=$?
+    while test $curl_status -eq 7; do
+        sleep 0.2
+        curl --unix-socket ./socket http://localhost/
+        curl_status=$?
+    done
+    WVPASSEQ $curl_status 0
+}
+
+WVPASS cd "$tmpdir"
+
+# FIXME: add WVSKIP
+if test -z "$(type -p curl)"; then
+    WVSTART 'curl does not appear to be installed; skipping  test'
+    exit 0
+fi
+    
+WVPASS bup-cfg-py -c "import socket as s; s.socket(s.AF_UNIX).bind('socket')"
+curl -s --unix-socket ./socket http://localhost/foo
+if test $? -ne 7; then
+    WVSTART 'curl does not appear to support --unix-socket; skipping test'
+    exit 0
+fi
+
+if ! bup-python -c 'import tornado' 2> /dev/null; then
+    WVSTART 'unable to import tornado; skipping test'
+    exit 0
+fi
+
+WVSTART 'web'
+WVPASS bup init
+WVPASS mkdir src
+WVPASS echo '¡excitement!' > src/data
+WVPASS echo -e 'whee \x80\x90\xff' > "$(echo -ne 'src/whee \x80\x90\xff')"
+WVPASS bup index src
+WVPASS bup save -n '¡excitement!' --strip src
+
+"$TOP/bup" web unix://socket &
+web_pid=$!
+wait-for-server-start
+
+WVPASS curl --unix-socket ./socket \
+       'http://localhost/%C2%A1excitement%21/latest/data' > result
+WVPASS curl --unix-socket ./socket \
+       'http://localhost/%C2%A1excitement%21/latest/whee%20%80%90%ff' > result2
+WVPASSEQ "$(curl --unix-socket ./socket http://localhost/static/styles.css)" \
+         "$(cat "$TOP/lib/web/static/styles.css")"
+
+WVPASSEQ '¡excitement!' "$(cat result)"
+WVPASS cmp "$(echo -ne 'src/whee \x80\x90\xff')" result2
+WVPASS kill -s TERM "$web_pid"
+WVPASS wait "$web_pid"
+
+WVPASS rm -r "$tmpdir"
diff --git a/test/ext/test-xdev.sh b/test/ext/test-xdev.sh
new file mode 100755 (executable)
index 0000000..78861a9
--- /dev/null
@@ -0,0 +1,156 @@
+#!/usr/bin/env bash
+. ./wvtest-bup.sh || exit $?
+
+set -o pipefail
+
+root_status="$(dev/root-status)" || exit $?
+
+if [ "$root_status" != root ]; then
+    WVSTART 'not root: skipping tests'
+    exit 0 # FIXME: add WVSKIP.
+fi
+
+if ! modprobe loop; then
+    WVSTART 'unable to load loopback module; skipping tests' 1>&2
+    exit 0
+fi
+
+# These tests are only likely to work under Linux for now
+# (patches welcome).
+if ! [[ $(uname) =~ Linux ]]; then
+    WVSTART 'not Linux: skipping tests'
+    exit 0 # FIXME: add WVSKIP.
+fi
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+
+export BUP_DIR="$tmpdir/bup"
+export GIT_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS bup init
+WVPASS pushd "$tmpdir"
+
+WVSTART 'drecurse'
+
+WVPASS dd if=/dev/zero of=testfs-1.img bs=1M count=32
+WVPASS dd if=/dev/zero of=testfs-2.img bs=1M count=32
+WVPASS mkfs -F testfs-1.img # Don't care what type (though must have symlinks)
+WVPASS mkfs -F testfs-2.img # Don't care what type (though must have symlinks)
+WVPASS mkdir -p src/mnt-1/hidden-1 src/mnt-2/hidden-2
+WVPASS mount -o loop testfs-1.img src/mnt-1
+WVPASS mount -o loop testfs-2.img src/mnt-2
+
+WVPASS touch src/1
+
+WVPASS mkdir -p src/mnt-1/x
+WVPASS touch src/mnt-1/2 src/mnt-1/x/3
+
+WVPASS touch src/mnt-2/4
+
+(WVPASS cd src && WVPASS ln -s mnt-2 mnt-link)
+(WVPASS cd src && WVPASS ln -s . top)
+
+WVPASSEQ "$(bup drecurse src | grep -vF lost+found)" "src/top
+src/mnt-link
+src/mnt-2/4
+src/mnt-2/
+src/mnt-1/x/3
+src/mnt-1/x/
+src/mnt-1/2
+src/mnt-1/
+src/1
+src/"
+
+WVPASSEQ "$(bup drecurse -x src)" "src/top
+src/mnt-link
+src/mnt-2/
+src/mnt-1/
+src/1
+src/"
+
+WVSTART 'index/save/restore'
+
+WVPASS bup index src
+WVPASS bup save -n src src
+WVPASS mkdir src-restore
+WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
+WVPASS test -d src-restore/src
+WVPASS "$top/dev/compare-trees" -c src/ src-restore/src/
+
+# Test -x when none of the mount points are explicitly indexed
+WVPASS rm -r "$BUP_DIR" src-restore
+WVPASS bup init
+WVPASS bup index -x src
+WVPASS bup save -n src src
+WVPASS mkdir src-restore
+WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
+WVPASS test -d src-restore/src
+WVPASSEQ "$(cd src-restore/src && find . -not -name lost+found | LC_ALL=C sort)" \
+".
+./1
+./mnt-1
+./mnt-2
+./mnt-link
+./top"
+
+# Test -x when a mount point is explicitly indexed.  This should
+# include the mount.
+WVPASS rm -r "$BUP_DIR" src-restore
+WVPASS bup init
+WVPASS bup index -x src src/mnt-2
+WVPASS bup save -n src src
+WVPASS mkdir src-restore
+WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
+WVPASS test -d src-restore/src
+WVPASSEQ "$(cd src-restore/src && find . -not -name lost+found | LC_ALL=C sort)" \
+".
+./1
+./mnt-1
+./mnt-2
+./mnt-2/4
+./mnt-link
+./top"
+
+# Test -x when a direct link to a mount point is explicitly indexed.
+# This should *not* include the mount.
+WVPASS rm -r "$BUP_DIR" src-restore
+WVPASS bup init
+WVPASS bup index -x src src/mnt-link
+WVPASS bup save -n src src
+WVPASS mkdir src-restore
+WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
+WVPASS test -d src-restore/src
+WVPASSEQ "$(cd src-restore/src && find . -not -name lost+found | LC_ALL=C sort)" \
+".
+./1
+./mnt-1
+./mnt-2
+./mnt-link
+./top"
+
+# Test -x when a path that resolves to a mount point is explicitly
+# indexed (i.e. dir symlnks that redirect the leaf to a mount point).
+# This should include the mount.
+WVPASS rm -r "$BUP_DIR" src-restore
+WVPASS bup init
+WVPASS bup index -x src src/top/top/mnt-2
+WVPASS bup save -n src src
+WVPASS mkdir src-restore
+WVPASS bup restore -C src-restore "/src/latest$(pwd)/"
+WVPASS test -d src-restore/src
+WVPASSEQ "$(cd src-restore/src && find . -not -name lost+found | LC_ALL=C sort)" \
+".
+./1
+./mnt-1
+./mnt-2
+./mnt-2/4
+./mnt-link
+./top"
+
+WVPASS cd "$top"
+WVPASS umount "$tmpdir/src/mnt-1"
+WVPASS umount "$tmpdir/src/mnt-2"
+WVPASS rm -r "$tmpdir"
diff --git a/test/ext/test.sh b/test/ext/test.sh
new file mode 100755 (executable)
index 0000000..5fb96be
--- /dev/null
@@ -0,0 +1,132 @@
+#!/usr/bin/env bash
+. wvtest.sh
+. wvtest-bup.sh
+. dev/lib.sh
+
+set -o pipefail
+
+top="$(WVPASS pwd)" || exit $?
+tmpdir="$(WVPASS wvmktempdir)" || exit $?
+export BUP_DIR="$tmpdir/bup"
+
+bup() { "$top/bup" "$@"; }
+
+WVPASS cd "$tmpdir"
+
+WVSTART "init"
+WVPASS bup init
+D=bupdata.tmp
+WVPASS force-delete $D
+WVPASS mkdir $D
+WVPASS touch $D/a
+WVPASS bup random 128k >$D/b
+WVPASS mkdir $D/d $D/d/e
+WVPASS bup random 512 >$D/f
+WVPASS touch $D/d/z
+WVPASS touch $D/d/z
+WVPASS bup index $D
+WVPASS bup save -t $D
+
+
+WVSTART "bloom"
+WVPASS bup bloom -c $(ls -1 "$BUP_DIR"/objects/pack/*.idx|head -n1)
+WVPASS rm "$BUP_DIR"/objects/pack/bup.bloom
+WVPASS bup bloom -k 4
+WVPASS bup bloom -c $(ls -1 "$BUP_DIR"/objects/pack/*.idx|head -n1)
+WVPASS bup bloom -d "$BUP_DIR"/objects/pack --ruin --force
+WVFAIL bup bloom -c $(ls -1 "$BUP_DIR"/objects/pack/*.idx|head -n1)
+WVPASS bup bloom --force -k 5
+WVPASS bup bloom -c $(ls -1 "$BUP_DIR"/objects/pack/*.idx|head -n1)
+
+
+WVSTART "memtest"
+WVPASS bup memtest -c1 -n100
+WVPASS bup memtest -c1 -n100 --existing
+
+
+WVSTART "save/git-fsck"
+(
+    WVPASS cd "$BUP_DIR"
+    #git repack -Ad
+    #git prune
+    WVPASS bup random 4k | WVPASS bup split -b
+    (WVPASS cd "$top/test/sampledata" && WVPASS bup save -vvn master /) || exit $?
+    result="$(LC_ALL=C git fsck --full --strict 2>&1)" || exit $?
+    n=$(echo "$result" |
+        WVFAIL egrep -v 'dangling (commit|tree|blob)' |
+        WVPASS tee -a /dev/stderr |
+        WVPASS wc -l) || exit $?
+    WVPASS [ "$n" -eq 0 ]
+) || exit $?
+
+
+WVSTART "ftp"
+WVPASS bup ftp "cat /master/latest/$tmpdir/$D/b" >$D/b.new
+WVPASS bup ftp "cat /master/latest/$tmpdir/$D/f" >$D/f.new
+WVPASS bup ftp "cat /master/latest/$tmpdir/$D/f"{,} >$D/f2.new
+WVPASS bup ftp "cat /master/latest/$tmpdir/$D/a" >$D/a.new
+WVPASSEQ "$(sha1sum <$D/b)" "$(sha1sum <$D/b.new)"
+WVPASSEQ "$(sha1sum <$D/f)" "$(sha1sum <$D/f.new)"
+WVPASSEQ "$(cat $D/f.new{,} | sha1sum)" "$(sha1sum <$D/f2.new)"
+WVPASSEQ "$(sha1sum <$D/a)" "$(sha1sum <$D/a.new)"
+
+
+WVSTART "tag"
+WVFAIL bup tag -d v0.n 2>/dev/null
+WVFAIL bup tag v0.n non-existant 2>/dev/null
+WVPASSEQ "$(bup tag)" ""
+WVPASS bup tag v0.1 master
+WVPASSEQ "$(bup tag)" "v0.1"
+WVFAIL bup tag v0.1 master
+WVPASS bup tag -f v0.1 master
+WVPASS bup tag -d v0.1
+WVPASS bup tag -f -d v0.1
+WVFAIL bup tag -d v0.1
+
+
+WVSTART "indexfile"
+D=indexfile.tmp
+INDEXFILE=tmpindexfile.tmp
+WVPASS rm -f $INDEXFILE
+WVPASS force-delete $D
+WVPASS mkdir $D
+export BUP_DIR="$D/.bup"
+WVPASS bup init
+WVPASS touch $D/a
+WVPASS touch $D/b
+WVPASS mkdir $D/c
+WVPASS bup index -ux $D
+WVPASS bup save --strip -n bupdir $D
+WVPASSEQ "$(bup ls -F bupdir/latest/)" "a
+b
+c/"
+WVPASS bup index -f $INDEXFILE --exclude=$D/c -ux $D
+WVPASS bup save --strip -n indexfile -f $INDEXFILE $D
+WVPASSEQ "$(bup ls indexfile/latest/)" "a
+b"
+
+
+WVSTART "import-rsnapshot"
+D=rsnapshot.tmp
+export BUP_DIR="$tmpdir/$D/.bup"
+WVPASS force-delete $D
+WVPASS mkdir $D
+WVPASS bup init
+WVPASS mkdir -p $D/hourly.0/buptest/a
+WVPASS touch $D/hourly.0/buptest/a/b
+WVPASS mkdir -p $D/hourly.0/buptest/c/d
+WVPASS touch $D/hourly.0/buptest/c/d/e
+WVPASS true
+WVPASS bup import-rsnapshot $D/
+WVPASSEQ "$(bup ls -F buptest/latest/)" "a/
+c/"
+
+
+WVSTART features
+expect_py_ver=$(LC_CTYPE=C "$top/config/bin/python" \
+                        -c 'import platform; print(platform.python_version())') \
+    || exit $?
+actual_py_ver=$(bup features | grep Python: | sed -Ee 's/ +Python: //') || exit $?
+WVPASSEQ "$expect_py_ver" "$actual_py_ver"
+
+WVPASS rm -rf "$tmpdir"
diff --git a/test/int/__init__.py b/test/int/__init__.py
new file mode 100644 (file)
index 0000000..580ba19
--- /dev/null
@@ -0,0 +1,5 @@
+
+from __future__ import absolute_import
+import sys
+
+sys.path[:0] = ['../..']
diff --git a/test/int/tbloom.py b/test/int/tbloom.py
new file mode 100644 (file)
index 0000000..3fa9f35
--- /dev/null
@@ -0,0 +1,61 @@
+
+from __future__ import absolute_import, print_function
+import errno, platform, tempfile
+
+from wvtest import *
+
+from bup import bloom
+from bup.helpers import mkdirp
+from buptest import no_lingering_errors, test_tempdir
+
+
+@wvtest
+def test_bloom():
+    with no_lingering_errors():
+        with test_tempdir(b'bup-tbloom-') as tmpdir:
+            hashes = [os.urandom(20) for i in range(100)]
+            class Idx:
+                pass
+            ix = Idx()
+            ix.name = b'dummy.idx'
+            ix.shatable = b''.join(hashes)
+            for k in (4, 5):
+                b = bloom.create(tmpdir + b'/pybuptest.bloom', expected=100, k=k)
+                b.add_idx(ix)
+                WVPASSLT(b.pfalse_positive(), .1)
+                b.close()
+                b = bloom.ShaBloom(tmpdir + b'/pybuptest.bloom')
+                all_present = True
+                for h in hashes:
+                    all_present &= (b.exists(h) or False)
+                WVPASS(all_present)
+                false_positives = 0
+                for h in [os.urandom(20) for i in range(1000)]:
+                    if b.exists(h):
+                        false_positives += 1
+                WVPASSLT(false_positives, 5)
+                os.unlink(tmpdir + b'/pybuptest.bloom')
+
+            tf = tempfile.TemporaryFile(dir=tmpdir)
+            b = bloom.create(b'bup.bloom', f=tf, expected=100)
+            WVPASSEQ(b.rwfile, tf)
+            WVPASSEQ(b.k, 5)
+
+            # Test large (~1GiB) filter.  This may fail on s390 (31-bit
+            # architecture), and anywhere else where the address space is
+            # sufficiently limited.
+            tf = tempfile.TemporaryFile(dir=tmpdir)
+            skip_test = False
+            try:
+                b = bloom.create(b'bup.bloom', f=tf, expected=2**28,
+                                 delaywrite=False)
+            except EnvironmentError as ex:
+                (ptr_width, linkage) = platform.architecture()
+                if ptr_width == '32bit' and ex.errno == errno.ENOMEM:
+                    WVMSG('skipping large bloom filter test (mmap probably failed) '
+                          + str(ex))
+                    skip_test = True
+                else:
+                    raise
+            if not skip_test:
+                WVPASSEQ(b.k, 4)
diff --git a/test/int/tclient.py b/test/int/tclient.py
new file mode 100644 (file)
index 0000000..2eca440
--- /dev/null
@@ -0,0 +1,188 @@
+
+from __future__ import absolute_import
+import sys, os, stat, time, random, subprocess, glob
+
+from wvtest import *
+
+from bup import client, git, path
+from bup.compat import bytes_from_uint, environ, range
+from bup.helpers import mkdirp
+from buptest import no_lingering_errors, test_tempdir
+
+
+def randbytes(sz):
+    s = b''
+    for i in range(sz):
+        s += bytes_from_uint(random.randrange(0,256))
+    return s
+
+
+s1 = randbytes(10000)
+s2 = randbytes(10000)
+s3 = randbytes(10000)
+
+IDX_PAT = b'/*.idx'
+    
+
+@wvtest
+def test_server_split_with_indexes():
+    with no_lingering_errors():
+        with test_tempdir(b'bup-tclient-') as tmpdir:
+            environ[b'BUP_DIR'] = bupdir = tmpdir
+            git.init_repo(bupdir)
+            lw = git.PackWriter()
+            c = client.Client(bupdir, create=True)
+            rw = c.new_packwriter()
+
+            lw.new_blob(s1)
+            lw.close()
+
+            rw.new_blob(s2)
+            rw.breakpoint()
+            rw.new_blob(s1)
+            rw.close()
+    
+
+@wvtest
+def test_multiple_suggestions():
+    with no_lingering_errors():
+        with test_tempdir(b'bup-tclient-') as tmpdir:
+            environ[b'BUP_DIR'] = bupdir = tmpdir
+            git.init_repo(bupdir)
+
+            lw = git.PackWriter()
+            lw.new_blob(s1)
+            lw.close()
+            lw = git.PackWriter()
+            lw.new_blob(s2)
+            lw.close()
+            WVPASSEQ(len(glob.glob(git.repo(b'objects/pack'+IDX_PAT))), 2)
+
+            c = client.Client(bupdir, create=True)
+            WVPASSEQ(len(glob.glob(c.cachedir+IDX_PAT)), 0)
+            rw = c.new_packwriter()
+            s1sha = rw.new_blob(s1)
+            WVPASS(rw.exists(s1sha))
+            s2sha = rw.new_blob(s2)
+
+            # This is a little hacky, but ensures that we test the
+            # code under test. First, flush to ensure that we've
+            # actually sent all the command ('receive-objects-v2')
+            # and their data to the server. This may be needed if
+            # the output buffer size is bigger than the data (both
+            # command and objects) we're writing. To see the need
+            # for this, change the object sizes at the beginning
+            # of this file to be very small (e.g. 10 instead of 10k)
+            c.conn.outp.flush()
+
+            # Then, check if we've already received the idx files.
+            # This may happen if we're preempted just after writing
+            # the data, then the server runs and suggests, and only
+            # then we continue in PackWriter_Remote::_raw_write()
+            # and check the has_input(), in that case we'll receive
+            # the idx still in the rw.new_blob() calls above.
+            #
+            # In most cases though, that doesn't happen, and we'll
+            # get past the has_input() check before the server has
+            # a chance to respond - it has to actually hash the new
+            # object here, so it takes some time. So also break out
+            # of the loop if the server has sent something on the
+            # connection.
+            #
+            # Finally, abort this after a little while (about one
+            # second) just in case something's actually broken.
+            n = 0
+            while (len(glob.glob(c.cachedir+IDX_PAT)) < 2 and
+                   not c.conn.has_input() and n < 10):
+                time.sleep(0.1)
+                n += 1
+            WVPASS(len(glob.glob(c.cachedir+IDX_PAT)) == 2 or c.conn.has_input())
+            rw.new_blob(s2)
+            WVPASS(rw.objcache.exists(s1sha))
+            WVPASS(rw.objcache.exists(s2sha))
+            rw.new_blob(s3)
+            WVPASSEQ(len(glob.glob(c.cachedir+IDX_PAT)), 2)
+            rw.close()
+            WVPASSEQ(len(glob.glob(c.cachedir+IDX_PAT)), 3)
+
+
+@wvtest
+def test_dumb_client_server():
+    with no_lingering_errors():
+        with test_tempdir(b'bup-tclient-') as tmpdir:
+            environ[b'BUP_DIR'] = bupdir = tmpdir
+            git.init_repo(bupdir)
+            open(git.repo(b'bup-dumb-server'), 'w').close()
+
+            lw = git.PackWriter()
+            lw.new_blob(s1)
+            lw.close()
+
+            c = client.Client(bupdir, create=True)
+            rw = c.new_packwriter()
+            WVPASSEQ(len(glob.glob(c.cachedir+IDX_PAT)), 1)
+            rw.new_blob(s1)
+            WVPASSEQ(len(glob.glob(c.cachedir+IDX_PAT)), 1)
+            rw.new_blob(s2)
+            rw.close()
+            WVPASSEQ(len(glob.glob(c.cachedir+IDX_PAT)), 2)
+
+
+@wvtest
+def test_midx_refreshing():
+    with no_lingering_errors():
+        with test_tempdir(b'bup-tclient-') as tmpdir:
+            environ[b'BUP_DIR'] = bupdir = tmpdir
+            git.init_repo(bupdir)
+            c = client.Client(bupdir, create=True)
+            rw = c.new_packwriter()
+            rw.new_blob(s1)
+            p1base = rw.breakpoint()
+            p1name = os.path.join(c.cachedir, p1base)
+            s1sha = rw.new_blob(s1)  # should not be written; it's already in p1
+            s2sha = rw.new_blob(s2)
+            p2base = rw.close()
+            p2name = os.path.join(c.cachedir, p2base)
+            del rw
+
+            pi = git.PackIdxList(bupdir + b'/objects/pack')
+            WVPASSEQ(len(pi.packs), 2)
+            pi.refresh()
+            WVPASSEQ(len(pi.packs), 2)
+            WVPASSEQ(sorted([os.path.basename(i.name) for i in pi.packs]),
+                     sorted([p1base, p2base]))
+
+            p1 = git.open_idx(p1name)
+            WVPASS(p1.exists(s1sha))
+            p2 = git.open_idx(p2name)
+            WVFAIL(p2.exists(s1sha))
+            WVPASS(p2.exists(s2sha))
+
+            subprocess.call([path.exe(), b'midx', b'-f'])
+            pi.refresh()
+            WVPASSEQ(len(pi.packs), 1)
+            pi.refresh(skip_midx=True)
+            WVPASSEQ(len(pi.packs), 2)
+            pi.refresh(skip_midx=False)
+            WVPASSEQ(len(pi.packs), 1)
+
+
+@wvtest
+def test_remote_parsing():
+    with no_lingering_errors():
+        tests = (
+            (b':/bup', (b'file', None, None, b'/bup')),
+            (b'file:///bup', (b'file', None, None, b'/bup')),
+            (b'192.168.1.1:/bup', (b'ssh', b'192.168.1.1', None, b'/bup')),
+            (b'ssh://192.168.1.1:2222/bup', (b'ssh', b'192.168.1.1', b'2222', b'/bup')),
+            (b'ssh://[ff:fe::1]:2222/bup', (b'ssh', b'ff:fe::1', b'2222', b'/bup')),
+            (b'bup://foo.com:1950', (b'bup', b'foo.com', b'1950', None)),
+            (b'bup://foo.com:1950/bup', (b'bup', b'foo.com', b'1950', b'/bup')),
+            (b'bup://[ff:fe::1]/bup', (b'bup', b'ff:fe::1', None, b'/bup')),)
+        for remote, values in tests:
+            WVPASSEQ(client.parse_remote(remote), values)
+        try:
+            client.parse_remote(b'http://asdf.com/bup')
+            WVFAIL()
+        except client.ClientError:
+            WVPASS()
diff --git a/test/int/tcompat.py b/test/int/tcompat.py
new file mode 100644 (file)
index 0000000..039eb12
--- /dev/null
@@ -0,0 +1,32 @@
+
+from __future__ import absolute_import, print_function
+
+from wvtest import *
+
+from bup.compat import pending_raise
+
+@wvtest
+def test_pending_raise():
+    outer = Exception('outer')
+    inner = Exception('inner')
+
+    try:
+        try:
+            raise outer
+        except Exception as ex:
+            with pending_raise(ex):
+                pass
+    except Exception as ex:
+        WVPASSEQ(outer, ex)
+        WVPASSEQ(None, getattr(outer, '__context__', None))
+
+    try:
+        try:
+            raise outer
+        except Exception as ex:
+            with pending_raise(ex):
+                raise inner
+    except Exception as ex:
+        WVPASSEQ(inner, ex)
+        WVPASSEQ(None, getattr(outer, '__context__', None))
+        WVPASSEQ(outer, getattr(inner, '__context__', None))
diff --git a/test/int/tgit.py b/test/int/tgit.py
new file mode 100644 (file)
index 0000000..09faa2e
--- /dev/null
@@ -0,0 +1,547 @@
+
+from __future__ import absolute_import, print_function
+from binascii import hexlify, unhexlify
+from subprocess import check_call
+import struct, os, time
+
+from wvtest import *
+
+from bup import git, path
+from bup.compat import bytes_from_byte, environ, range
+from bup.helpers import localtime, log, mkdirp, readpipe
+from buptest import no_lingering_errors, test_tempdir
+
+
+bup_exe = path.exe()
+
+
+def exc(*cmd):
+    print(repr(cmd), file=sys.stderr)
+    check_call(cmd)
+
+
+def exo(*cmd):
+    print(repr(cmd), file=sys.stderr)
+    return readpipe(cmd)
+
+
+@wvtest
+def test_git_version_detection():
+    with no_lingering_errors():
+        # Test version types from git's tag history
+        for expected, ver in \
+            (('insufficient', b'git version 0.99'),
+             ('insufficient', b'git version 0.99.1'),
+             ('insufficient', b'git version 0.99.7a'),
+             ('insufficient', b'git version 1.0rc1'),
+             ('insufficient', b'git version 1.0.1'),
+             ('insufficient', b'git version 1.4.2.1'),
+             ('insufficient', b'git version 1.5.5'),
+             ('insufficient', b'git version 1.5.6-rc0'),
+             ('suitable', b'git version 1.5.6'),
+             ('suitable', b'git version 1.5.6.1'),
+             ('suitable', b'git version 2.14.0-rc0'),
+             ('suitable', b'git version 2.14.0 (something ...)'),
+             ('suitable', b'git version 111.222.333.444-rc555'),
+             ('unrecognized', b'huh?')):
+            WVMSG('Checking version validation: %r' % ver)
+            WVPASSEQ(expected, git.is_suitable_git(ver_str=ver))
+            try:
+                if expected == 'insufficient':
+                    WVEXCEPT(SystemExit, git.require_suitable_git, ver)
+                elif expected == 'suitable':
+                    git.require_suitable_git(ver_str=ver)
+                elif expected == 'unrecognized':
+                    WVEXCEPT(git.GitError, git.require_suitable_git, ver)
+                else:
+                    WVPASS(False)
+            finally:
+                git._git_great = None
+            try:
+                environ[b'BUP_GIT_VERSION_IS_FINE'] = b'true'
+                git.require_suitable_git(ver_str=ver)
+            finally:
+                del environ[b'BUP_GIT_VERSION_IS_FINE']
+                git._git_great = None
+
+
+@wvtest
+def testmangle():
+    with no_lingering_errors():
+        afile  = 0o100644
+        afile2 = 0o100770
+        alink  = 0o120000
+        adir   = 0o040000
+        adir2  = 0o040777
+        WVPASSEQ(git.mangle_name(b'a', adir2, adir), b'a')
+        WVPASSEQ(git.mangle_name(b'.bup', adir2, adir), b'.bup.bupl')
+        WVPASSEQ(git.mangle_name(b'a.bupa', adir2, adir), b'a.bupa.bupl')
+        WVPASSEQ(git.mangle_name(b'b.bup', alink, alink), b'b.bup.bupl')
+        WVPASSEQ(git.mangle_name(b'b.bu', alink, alink), b'b.bu')
+        WVPASSEQ(git.mangle_name(b'f', afile, afile2), b'f')
+        WVPASSEQ(git.mangle_name(b'f.bup', afile, afile2), b'f.bup.bupl')
+        WVPASSEQ(git.mangle_name(b'f.bup', afile, adir), b'f.bup.bup')
+        WVPASSEQ(git.mangle_name(b'f', afile, adir), b'f.bup')
+
+        WVPASSEQ(git.demangle_name(b'f.bup', afile), (b'f', git.BUP_CHUNKED))
+        WVPASSEQ(git.demangle_name(b'f.bupl', afile), (b'f', git.BUP_NORMAL))
+        WVPASSEQ(git.demangle_name(b'f.bup.bupl', afile), (b'f.bup', git.BUP_NORMAL))
+
+        WVPASSEQ(git.demangle_name(b'.bupm', afile), (b'', git.BUP_NORMAL))
+        WVPASSEQ(git.demangle_name(b'.bupm', adir), (b'', git.BUP_CHUNKED))
+
+        # for safety, we ignore .bup? suffixes we don't recognize.  Future
+        # versions might implement a .bup[a-z] extension as something other
+        # than BUP_NORMAL.
+        WVPASSEQ(git.demangle_name(b'f.bupa', afile), (b'f.bupa', git.BUP_NORMAL))
+
+
+@wvtest
+def testencode():
+    with no_lingering_errors():
+        s = b'hello world'
+        looseb = b''.join(git._encode_looseobj(b'blob', s))
+        looset = b''.join(git._encode_looseobj(b'tree', s))
+        loosec = b''.join(git._encode_looseobj(b'commit', s))
+        packb = b''.join(git._encode_packobj(b'blob', s))
+        packt = b''.join(git._encode_packobj(b'tree', s))
+        packc = b''.join(git._encode_packobj(b'commit', s))
+        packlb = b''.join(git._encode_packobj(b'blob', s * 200))
+        WVPASSEQ(git._decode_looseobj(looseb), (b'blob', s))
+        WVPASSEQ(git._decode_looseobj(looset), (b'tree', s))
+        WVPASSEQ(git._decode_looseobj(loosec), (b'commit', s))
+        WVPASSEQ(git._decode_packobj(packb), (b'blob', s))
+        WVPASSEQ(git._decode_packobj(packt), (b'tree', s))
+        WVPASSEQ(git._decode_packobj(packc), (b'commit', s))
+        WVPASSEQ(git._decode_packobj(packlb), (b'blob', s * 200))
+        for i in range(10):
+            WVPASS(git._encode_looseobj(b'blob', s, compression_level=i))
+        def encode_pobj(n):
+            return b''.join(git._encode_packobj(b'blob', s, compression_level=n))
+        WVEXCEPT(ValueError, encode_pobj, -1)
+        WVEXCEPT(ValueError, encode_pobj, 10)
+        WVEXCEPT(ValueError, encode_pobj, b'x')
+
+
+@wvtest
+def testpacks():
+    with no_lingering_errors():
+        with test_tempdir(b'bup-tgit-') as tmpdir:
+            environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
+            git.init_repo(bupdir)
+            git.verbose = 1
+
+            w = git.PackWriter()
+            w.new_blob(os.urandom(100))
+            w.new_blob(os.urandom(100))
+            w.abort()
+
+            w = git.PackWriter()
+            hashes = []
+            nobj = 1000
+            for i in range(nobj):
+                hashes.append(w.new_blob(b'%d' % i))
+            log('\n')
+            nameprefix = w.close()
+            print(repr(nameprefix))
+            WVPASS(os.path.exists(nameprefix + b'.pack'))
+            WVPASS(os.path.exists(nameprefix + b'.idx'))
+
+            r = git.open_idx(nameprefix + b'.idx')
+            print(repr(r.fanout))
+
+            for i in range(nobj):
+                WVPASS(r.find_offset(hashes[i]) > 0)
+            WVPASS(r.exists(hashes[99]))
+            WVFAIL(r.exists(b'\0'*20))
+
+            pi = iter(r)
+            for h in sorted(hashes):
+                WVPASSEQ(hexlify(next(pi)), hexlify(h))
+
+            WVFAIL(r.find_offset(b'\0'*20))
+
+            r = git.PackIdxList(bupdir + b'/objects/pack')
+            WVPASS(r.exists(hashes[5]))
+            WVPASS(r.exists(hashes[6]))
+            WVFAIL(r.exists(b'\0'*20))
+
+
+@wvtest
+def test_pack_name_lookup():
+    with no_lingering_errors():
+        with test_tempdir(b'bup-tgit-') as tmpdir:
+            environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
+            git.init_repo(bupdir)
+            git.verbose = 1
+            packdir = git.repo(b'objects/pack')
+
+            idxnames = []
+            hashes = []
+
+            for start in range(0,28,2):
+                w = git.PackWriter()
+                for i in range(start, start+2):
+                    hashes.append(w.new_blob(b'%d' % i))
+                log('\n')
+                idxnames.append(os.path.basename(w.close() + b'.idx'))
+
+            r = git.PackIdxList(packdir)
+            WVPASSEQ(len(r.packs), 2)
+            for e,idxname in enumerate(idxnames):
+                for i in range(e*2, (e+1)*2):
+                    WVPASSEQ(idxname, r.exists(hashes[i], want_source=True))
+
+
+@wvtest
+def test_long_index():
+    with no_lingering_errors():
+        with test_tempdir(b'bup-tgit-') as tmpdir:
+            environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
+            git.init_repo(bupdir)
+            idx = git.PackIdxV2Writer()
+            obj_bin = struct.pack('!IIIII',
+                    0x00112233, 0x44556677, 0x88990011, 0x22334455, 0x66778899)
+            obj2_bin = struct.pack('!IIIII',
+                    0x11223344, 0x55667788, 0x99001122, 0x33445566, 0x77889900)
+            obj3_bin = struct.pack('!IIIII',
+                    0x22334455, 0x66778899, 0x00112233, 0x44556677, 0x88990011)
+            pack_bin = struct.pack('!IIIII',
+                    0x99887766, 0x55443322, 0x11009988, 0x77665544, 0x33221100)
+            idx.add(obj_bin, 1, 0xfffffffff)
+            idx.add(obj2_bin, 2, 0xffffffffff)
+            idx.add(obj3_bin, 3, 0xff)
+            name = tmpdir + b'/tmp.idx'
+            r = idx.write(name, pack_bin)
+            i = git.PackIdxV2(name, open(name, 'rb'))
+            WVPASSEQ(i.find_offset(obj_bin), 0xfffffffff)
+            WVPASSEQ(i.find_offset(obj2_bin), 0xffffffffff)
+            WVPASSEQ(i.find_offset(obj3_bin), 0xff)
+
+
+@wvtest
+def test_check_repo_or_die():
+    with no_lingering_errors():
+        with test_tempdir(b'bup-tgit-') as tmpdir:
+            environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
+            orig_cwd = os.getcwd()
+            try:
+                os.chdir(tmpdir)
+                git.init_repo(bupdir)
+                git.check_repo_or_die()
+                # if we reach this point the call above passed
+                WVPASS('check_repo_or_die')
+
+                os.rename(bupdir + b'/objects/pack',
+                          bupdir + b'/objects/pack.tmp')
+                open(bupdir + b'/objects/pack', 'w').close()
+                try:
+                    git.check_repo_or_die()
+                except SystemExit as e:
+                    WVPASSEQ(e.code, 14)
+                else:
+                    WVFAIL()
+                os.unlink(bupdir + b'/objects/pack')
+                os.rename(bupdir + b'/objects/pack.tmp',
+                          bupdir + b'/objects/pack')
+
+                try:
+                    git.check_repo_or_die(b'nonexistantbup.tmp')
+                except SystemExit as e:
+                    WVPASSEQ(e.code, 15)
+                else:
+                    WVFAIL()
+            finally:
+                os.chdir(orig_cwd)
+
+
+@wvtest
+def test_commit_parsing():
+
+    def restore_env_var(name, val):
+        if val is None:
+            del environ[name]
+        else:
+            environ[name] = val
+
+    def showval(commit, val):
+        return readpipe([b'git', b'show', b'-s',
+                         b'--pretty=format:%s' % val, commit]).strip()
+
+    with no_lingering_errors():
+        with test_tempdir(b'bup-tgit-') as tmpdir:
+            orig_cwd = os.getcwd()
+            workdir = tmpdir + b'/work'
+            repodir = workdir + b'/.git'
+            orig_author_name = environ.get(b'GIT_AUTHOR_NAME')
+            orig_author_email = environ.get(b'GIT_AUTHOR_EMAIL')
+            orig_committer_name = environ.get(b'GIT_COMMITTER_NAME')
+            orig_committer_email = environ.get(b'GIT_COMMITTER_EMAIL')
+            environ[b'GIT_AUTHOR_NAME'] = b'bup test'
+            environ[b'GIT_COMMITTER_NAME'] = environ[b'GIT_AUTHOR_NAME']
+            environ[b'GIT_AUTHOR_EMAIL'] = b'bup@a425bc70a02811e49bdf73ee56450e6f'
+            environ[b'GIT_COMMITTER_EMAIL'] = environ[b'GIT_AUTHOR_EMAIL']
+            try:
+                readpipe([b'git', b'init', workdir])
+                environ[b'GIT_DIR'] = environ[b'BUP_DIR'] = repodir
+                git.check_repo_or_die(repodir)
+                os.chdir(workdir)
+                with open('foo', 'w') as f:
+                    print('bar', file=f)
+                readpipe([b'git', b'add', b'.'])
+                readpipe([b'git', b'commit', b'-am', b'Do something',
+                          b'--author', b'Someone <someone@somewhere>',
+                          b'--date', b'Sat Oct 3 19:48:49 2009 -0400'])
+                commit = readpipe([b'git', b'show-ref', b'-s', b'master']).strip()
+                parents = showval(commit, b'%P')
+                tree = showval(commit, b'%T')
+                cname = showval(commit, b'%cn')
+                cmail = showval(commit, b'%ce')
+                cdate = showval(commit, b'%ct')
+                coffs = showval(commit, b'%ci')
+                coffs = coffs[-5:]
+                coff = (int(coffs[-4:-2]) * 60 * 60) + (int(coffs[-2:]) * 60)
+                if bytes_from_byte(coffs[-5]) == b'-':
+                    coff = - coff
+                commit_items = git.get_commit_items(commit, git.cp())
+                WVPASSEQ(commit_items.parents, [])
+                WVPASSEQ(commit_items.tree, tree)
+                WVPASSEQ(commit_items.author_name, b'Someone')
+                WVPASSEQ(commit_items.author_mail, b'someone@somewhere')
+                WVPASSEQ(commit_items.author_sec, 1254613729)
+                WVPASSEQ(commit_items.author_offset, -(4 * 60 * 60))
+                WVPASSEQ(commit_items.committer_name, cname)
+                WVPASSEQ(commit_items.committer_mail, cmail)
+                WVPASSEQ(commit_items.committer_sec, int(cdate))
+                WVPASSEQ(commit_items.committer_offset, coff)
+                WVPASSEQ(commit_items.message, b'Do something\n')
+                with open(b'bar', 'wb') as f:
+                    f.write(b'baz\n')
+                readpipe([b'git', b'add', '.'])
+                readpipe([b'git', b'commit', b'-am', b'Do something else'])
+                child = readpipe([b'git', b'show-ref', b'-s', b'master']).strip()
+                parents = showval(child, b'%P')
+                commit_items = git.get_commit_items(child, git.cp())
+                WVPASSEQ(commit_items.parents, [commit])
+            finally:
+                os.chdir(orig_cwd)
+                restore_env_var(b'GIT_AUTHOR_NAME', orig_author_name)
+                restore_env_var(b'GIT_AUTHOR_EMAIL', orig_author_email)
+                restore_env_var(b'GIT_COMMITTER_NAME', orig_committer_name)
+                restore_env_var(b'GIT_COMMITTER_EMAIL', orig_committer_email)
+
+
+@wvtest
+def test_new_commit():
+    with no_lingering_errors():
+        with test_tempdir(b'bup-tgit-') as tmpdir:
+            environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
+            git.init_repo(bupdir)
+            git.verbose = 1
+
+            w = git.PackWriter()
+            tree = os.urandom(20)
+            parent = os.urandom(20)
+            author_name = b'Author'
+            author_mail = b'author@somewhere'
+            adate_sec = 1439657836
+            cdate_sec = adate_sec + 1
+            committer_name = b'Committer'
+            committer_mail = b'committer@somewhere'
+            adate_tz_sec = cdate_tz_sec = None
+            commit = w.new_commit(tree, parent,
+                                  b'%s <%s>' % (author_name, author_mail),
+                                  adate_sec, adate_tz_sec,
+                                  b'%s <%s>' % (committer_name, committer_mail),
+                                  cdate_sec, cdate_tz_sec,
+                                  b'There is a small mailbox here')
+            adate_tz_sec = -60 * 60
+            cdate_tz_sec = 120 * 60
+            commit_off = w.new_commit(tree, parent,
+                                      b'%s <%s>' % (author_name, author_mail),
+                                      adate_sec, adate_tz_sec,
+                                      b'%s <%s>' % (committer_name, committer_mail),
+                                      cdate_sec, cdate_tz_sec,
+                                      b'There is a small mailbox here')
+            w.close()
+
+            commit_items = git.get_commit_items(hexlify(commit), git.cp())
+            local_author_offset = localtime(adate_sec).tm_gmtoff
+            local_committer_offset = localtime(cdate_sec).tm_gmtoff
+            WVPASSEQ(tree, unhexlify(commit_items.tree))
+            WVPASSEQ(1, len(commit_items.parents))
+            WVPASSEQ(parent, unhexlify(commit_items.parents[0]))
+            WVPASSEQ(author_name, commit_items.author_name)
+            WVPASSEQ(author_mail, commit_items.author_mail)
+            WVPASSEQ(adate_sec, commit_items.author_sec)
+            WVPASSEQ(local_author_offset, commit_items.author_offset)
+            WVPASSEQ(committer_name, commit_items.committer_name)
+            WVPASSEQ(committer_mail, commit_items.committer_mail)
+            WVPASSEQ(cdate_sec, commit_items.committer_sec)
+            WVPASSEQ(local_committer_offset, commit_items.committer_offset)
+
+            commit_items = git.get_commit_items(hexlify(commit_off), git.cp())
+            WVPASSEQ(tree, unhexlify(commit_items.tree))
+            WVPASSEQ(1, len(commit_items.parents))
+            WVPASSEQ(parent, unhexlify(commit_items.parents[0]))
+            WVPASSEQ(author_name, commit_items.author_name)
+            WVPASSEQ(author_mail, commit_items.author_mail)
+            WVPASSEQ(adate_sec, commit_items.author_sec)
+            WVPASSEQ(adate_tz_sec, commit_items.author_offset)
+            WVPASSEQ(committer_name, commit_items.committer_name)
+            WVPASSEQ(committer_mail, commit_items.committer_mail)
+            WVPASSEQ(cdate_sec, commit_items.committer_sec)
+            WVPASSEQ(cdate_tz_sec, commit_items.committer_offset)
+
+
+@wvtest
+def test_list_refs():
+    with no_lingering_errors():
+        with test_tempdir(b'bup-tgit-') as tmpdir:
+            environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
+            src = tmpdir + b'/src'
+            mkdirp(src)
+            with open(src + b'/1', 'wb+') as f:
+                f.write(b'something\n')
+            with open(src + b'/2', 'wb+') as f:
+                f.write(b'something else\n')
+            git.init_repo(bupdir)
+            emptyset = frozenset()
+            WVPASSEQ(frozenset(git.list_refs()), emptyset)
+            WVPASSEQ(frozenset(git.list_refs(limit_to_tags=True)), emptyset)
+            WVPASSEQ(frozenset(git.list_refs(limit_to_heads=True)), emptyset)
+            exc(bup_exe, b'index', src)
+            exc(bup_exe, b'save', b'-n', b'src', b'--strip', src)
+            src_hash = exo(b'git', b'--git-dir', bupdir,
+                           b'rev-parse', b'src').strip().split(b'\n')
+            assert(len(src_hash) == 1)
+            src_hash = unhexlify(src_hash[0])
+            tree_hash = unhexlify(exo(b'git', b'--git-dir', bupdir,
+                                      b'rev-parse',
+                                      b'src:').strip().split(b'\n')[0])
+            blob_hash = unhexlify(exo(b'git', b'--git-dir', bupdir,
+                                      b'rev-parse',
+                                      b'src:1').strip().split(b'\n')[0])
+            WVPASSEQ(frozenset(git.list_refs()),
+                     frozenset([(b'refs/heads/src', src_hash)]))
+            WVPASSEQ(frozenset(git.list_refs(limit_to_tags=True)), emptyset)
+            WVPASSEQ(frozenset(git.list_refs(limit_to_heads=True)),
+                     frozenset([(b'refs/heads/src', src_hash)]))
+            exc(b'git', b'--git-dir', bupdir, b'tag', b'commit-tag', b'src')
+            WVPASSEQ(frozenset(git.list_refs()),
+                     frozenset([(b'refs/heads/src', src_hash),
+                                (b'refs/tags/commit-tag', src_hash)]))
+            WVPASSEQ(frozenset(git.list_refs(limit_to_tags=True)),
+                     frozenset([(b'refs/tags/commit-tag', src_hash)]))
+            WVPASSEQ(frozenset(git.list_refs(limit_to_heads=True)),
+                     frozenset([(b'refs/heads/src', src_hash)]))
+            exc(b'git', b'--git-dir', bupdir, b'tag', b'tree-tag', b'src:')
+            exc(b'git', b'--git-dir', bupdir, b'tag', b'blob-tag', b'src:1')
+            os.unlink(bupdir + b'/refs/heads/src')
+            expected_tags = frozenset([(b'refs/tags/commit-tag', src_hash),
+                                       (b'refs/tags/tree-tag', tree_hash),
+                                       (b'refs/tags/blob-tag', blob_hash)])
+            WVPASSEQ(frozenset(git.list_refs()), expected_tags)
+            WVPASSEQ(frozenset(git.list_refs(limit_to_heads=True)), frozenset([]))
+            WVPASSEQ(frozenset(git.list_refs(limit_to_tags=True)), expected_tags)
+
+
+@wvtest
+def test__git_date_str():
+    with no_lingering_errors():
+        WVPASSEQ(b'0 +0000', git._git_date_str(0, 0))
+        WVPASSEQ(b'0 -0130', git._git_date_str(0, -90 * 60))
+        WVPASSEQ(b'0 +0130', git._git_date_str(0, 90 * 60))
+
+
+@wvtest
+def test_cat_pipe():
+    with no_lingering_errors():
+        with test_tempdir(b'bup-tgit-') as tmpdir:
+            environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
+            src = tmpdir + b'/src'
+            mkdirp(src)
+            with open(src + b'/1', 'wb+') as f:
+                f.write(b'something\n')
+            with open(src + b'/2', 'wb+') as f:
+                f.write(b'something else\n')
+            git.init_repo(bupdir)
+            exc(bup_exe, b'index', src)
+            oidx = exo(bup_exe, b'save', b'-cn', b'src', b'--strip',
+                       src).strip()
+            typ = exo(b'git', b'--git-dir', bupdir,
+                      b'cat-file', b'-t', b'src').strip()
+            size = int(exo(b'git', b'--git-dir', bupdir,
+                               b'cat-file', b'-s', b'src'))
+            it = git.cp().get(b'src')
+            get_info = next(it)
+            for buf in next(it):
+                pass
+            WVPASSEQ((oidx, typ, size), get_info)
+
+def _create_idx(d, i):
+    idx = git.PackIdxV2Writer()
+    # add 255 vaguely reasonable entries
+    for s in range(255):
+        idx.add(struct.pack('18xBB', i, s), s, 100 * s)
+    packbin = struct.pack('B19x', i)
+    packname = os.path.join(d, b'pack-%s.idx' % hexlify(packbin))
+    idx.write(packname, packbin)
+
+@wvtest
+def test_midx_close():
+    fddir = b'/proc/self/fd'
+    try:
+        os.listdir(fddir)
+    except Exception:
+        # not supported, not Linux, I guess
+        return
+
+    def openfiles():
+        for fd in os.listdir(fddir):
+            try:
+                yield os.readlink(os.path.join(fddir, fd))
+            except OSError:
+                pass
+
+    def force_midx(objdir):
+        args = [path.exe(), b'midx', b'--auto', b'--dir', objdir]
+        check_call(args)
+
+    with no_lingering_errors(), \
+         test_tempdir(b'bup-tgit-') as tmpdir:
+        environ[b'BUP_DIR'] = bupdir = tmpdir + b'/bup'
+        git.init_repo(bupdir)
+        # create a few dummy idxes
+        for i in range(10):
+            _create_idx(tmpdir, i)
+        git.auto_midx(tmpdir)
+        l = git.PackIdxList(tmpdir)
+        # this doesn't exist (yet)
+        WVPASSEQ(None, l.exists(struct.pack('18xBB', 10, 0)))
+        for i in range(10, 15):
+            _create_idx(tmpdir, i)
+        # delete the midx ...
+        # TODO: why do we need to? git.auto_midx() below doesn't?!
+        for fn in os.listdir(tmpdir):
+            if fn.endswith(b'.midx'):
+                os.unlink(os.path.join(tmpdir, fn))
+        # and make a new one
+        git.auto_midx(tmpdir)
+        # check it still doesn't exist - we haven't refreshed
+        WVPASSEQ(None, l.exists(struct.pack('18xBB', 10, 0)))
+        # check that we still have the midx open, this really
+        # just checks more for the kernel API ('deleted' string)
+        for fn in openfiles():
+            if not b'midx-' in fn:
+                continue
+            WVPASSEQ(True, b'deleted' in fn)
+        # refresh the PackIdxList
+        l.refresh()
+        # and check that an object in pack 10 exists now
+        WVPASSEQ(True, l.exists(struct.pack('18xBB', 10, 0)))
+        for fn in openfiles():
+            if not b'midx-' in fn:
+                continue
+            # check that we don't have it open anymore
+            WVPASSEQ(False, b'deleted' in fn)
diff --git a/test/int/thashsplit.py b/test/int/thashsplit.py
new file mode 100644 (file)
index 0000000..fc6a9ab
--- /dev/null
@@ -0,0 +1,139 @@
+
+from __future__ import absolute_import
+from io import BytesIO
+
+from wvtest import *
+
+from bup import hashsplit, _helpers, helpers
+from bup.compat import byte_int, bytes_from_uint
+from buptest import no_lingering_errors
+
+
+def nr_regions(x, max_count=None):
+    return list(hashsplit._nonresident_page_regions(bytearray(x), 1, max_count))
+
+
+@wvtest
+def test_nonresident_page_regions():
+    with no_lingering_errors():
+        WVPASSEQ(nr_regions([]), [])
+        WVPASSEQ(nr_regions([1]), [])
+        WVPASSEQ(nr_regions([0]), [(0, 1)])
+        WVPASSEQ(nr_regions([1, 0]), [(1, 1)])
+        WVPASSEQ(nr_regions([0, 0]), [(0, 2)])
+        WVPASSEQ(nr_regions([1, 0, 1]), [(1, 1)])
+        WVPASSEQ(nr_regions([1, 0, 0]), [(1, 2)])
+        WVPASSEQ(nr_regions([0, 1, 0]), [(0, 1), (2, 1)])
+        WVPASSEQ(nr_regions([0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0]),
+                 [(0, 2), (5, 3), (9, 2)])
+        WVPASSEQ(nr_regions([2, 42, 3, 101]), [(0, 2)])
+        # Test limit
+        WVPASSEQ(nr_regions([0, 0, 0], None), [(0, 3)])
+        WVPASSEQ(nr_regions([0, 0, 0], 1), [(0, 1), (1, 1), (2, 1)])
+        WVPASSEQ(nr_regions([0, 0, 0], 2), [(0, 2), (2, 1)])
+        WVPASSEQ(nr_regions([0, 0, 0], 3), [(0, 3)])
+        WVPASSEQ(nr_regions([0, 0, 0], 4), [(0, 3)])
+        WVPASSEQ(nr_regions([0, 0, 1], None), [(0, 2)])
+        WVPASSEQ(nr_regions([0, 0, 1], 1), [(0, 1), (1, 1)])
+        WVPASSEQ(nr_regions([0, 0, 1], 2), [(0, 2)])
+        WVPASSEQ(nr_regions([0, 0, 1], 3), [(0, 2)])
+        WVPASSEQ(nr_regions([1, 0, 0], None), [(1, 2)])
+        WVPASSEQ(nr_regions([1, 0, 0], 1), [(1, 1), (2, 1)])
+        WVPASSEQ(nr_regions([1, 0, 0], 2), [(1, 2)])
+        WVPASSEQ(nr_regions([1, 0, 0], 3), [(1, 2)])
+        WVPASSEQ(nr_regions([1, 0, 0, 0, 1], None), [(1, 3)])
+        WVPASSEQ(nr_regions([1, 0, 0, 0, 1], 1), [(1, 1), (2, 1), (3, 1)])
+        WVPASSEQ(nr_regions([1, 0, 0, 0, 1], 2), [(1, 2), (3, 1)])
+        WVPASSEQ(nr_regions([1, 0, 0, 0, 1], 3), [(1, 3)])
+        WVPASSEQ(nr_regions([1, 0, 0, 0, 1], 4), [(1, 3)])
+
+
+@wvtest
+def test_uncache_ours_upto():
+    history = []
+    def mock_fadvise_pages_done(f, ofs, len):
+        history.append((f, ofs, len))
+
+    with no_lingering_errors():
+        uncache_upto = hashsplit._uncache_ours_upto
+        page_size = helpers.sc_page_size
+        orig_pages_done = hashsplit._fadvise_pages_done
+        try:
+            hashsplit._fadvise_pages_done = mock_fadvise_pages_done
+            history = []
+            uncache_upto(42, 0, (0, 1), iter([]))
+            WVPASSEQ([], history)
+            uncache_upto(42, page_size, (0, 1), iter([]))
+            WVPASSEQ([(42, 0, 1)], history)
+            history = []
+            uncache_upto(42, page_size, (0, 3), iter([(5, 2)]))
+            WVPASSEQ([], history)
+            uncache_upto(42, 2 * page_size, (0, 3), iter([(5, 2)]))
+            WVPASSEQ([], history)
+            uncache_upto(42, 3 * page_size, (0, 3), iter([(5, 2)]))
+            WVPASSEQ([(42, 0, 3)], history)
+            history = []
+            uncache_upto(42, 5 * page_size, (0, 3), iter([(5, 2)]))
+            WVPASSEQ([(42, 0, 3)], history)
+            history = []
+            uncache_upto(42, 6 * page_size, (0, 3), iter([(5, 2)]))
+            WVPASSEQ([(42, 0, 3)], history)
+            history = []
+            uncache_upto(42, 7 * page_size, (0, 3), iter([(5, 2)]))
+            WVPASSEQ([(42, 0, 3), (42, 5, 2)], history)
+        finally:
+            hashsplit._fadvise_pages_done = orig_pages_done
+
+
+@wvtest
+def test_rolling_sums():
+    with no_lingering_errors():
+        WVPASS(_helpers.selftest())
+
+@wvtest
+def test_fanout_behaviour():
+
+    # Drop in replacement for bupsplit, but splitting if the int value of a
+    # byte >= BUP_BLOBBITS
+    basebits = _helpers.blobbits()
+    def splitbuf(buf):
+        ofs = 0
+        for b in buf:
+            b = byte_int(b)
+            ofs += 1
+            if b >= basebits:
+                return ofs, b
+        return 0, 0
+
+    with no_lingering_errors():
+        old_splitbuf = _helpers.splitbuf
+        _helpers.splitbuf = splitbuf
+        old_BLOB_MAX = hashsplit.BLOB_MAX
+        hashsplit.BLOB_MAX = 4
+        old_BLOB_READ_SIZE = hashsplit.BLOB_READ_SIZE
+        hashsplit.BLOB_READ_SIZE = 10
+        old_fanout = hashsplit.fanout
+        hashsplit.fanout = 2
+
+        levels = lambda f: [(len(b), l) for b, l in
+            hashsplit.hashsplit_iter([f], True, None)]
+        # Return a string of n null bytes
+        z = lambda n: b'\x00' * n
+        # Return a byte which will be split with a level of n
+        sb = lambda n: bytes_from_uint(basebits + n)
+
+        split_never = BytesIO(z(16))
+        split_first = BytesIO(z(1) + sb(3) + z(14))
+        split_end   = BytesIO(z(13) + sb(1) + z(2))
+        split_many  = BytesIO(sb(1) + z(3) + sb(2) + z(4) +
+                              sb(0) + z(4) + sb(5) + z(1))
+        WVPASSEQ(levels(split_never), [(4, 0), (4, 0), (4, 0), (4, 0)])
+        WVPASSEQ(levels(split_first), [(2, 3), (4, 0), (4, 0), (4, 0), (2, 0)])
+        WVPASSEQ(levels(split_end), [(4, 0), (4, 0), (4, 0), (2, 1), (2, 0)])
+        WVPASSEQ(levels(split_many),
+            [(1, 1), (4, 2), (4, 0), (1, 0), (4, 0), (1, 5), (1, 0)])
+
+        _helpers.splitbuf = old_splitbuf
+        hashsplit.BLOB_MAX = old_BLOB_MAX
+        hashsplit.BLOB_READ_SIZE = old_BLOB_READ_SIZE
+        hashsplit.fanout = old_fanout
diff --git a/test/int/thelpers.py b/test/int/thelpers.py
new file mode 100644 (file)
index 0000000..0a03ff3
--- /dev/null
@@ -0,0 +1,256 @@
+
+from __future__ import absolute_import
+from time import tzset
+import math, os, os.path, re, subprocess
+from bup import helpers
+
+from wvtest import *
+
+from bup.compat import bytes_from_byte, bytes_from_uint, environ
+from bup.helpers import (atomically_replaced_file, batchpipe, detect_fakeroot,
+                         grafted_path_components, mkdirp, parse_num,
+                         path_components, readpipe, stripped_path_components,
+                         shstr,
+                         utc_offset_str)
+from buptest import no_lingering_errors, test_tempdir
+import bup._helpers as _helpers
+
+
+@wvtest
+def test_parse_num():
+    with no_lingering_errors():
+        pn = parse_num
+        WVPASSEQ(pn(b'1'), 1)
+        WVPASSEQ(pn('1'), 1)
+        WVPASSEQ(pn('0'), 0)
+        WVPASSEQ(pn('1.5k'), 1536)
+        WVPASSEQ(pn('2 gb'), 2*1024*1024*1024)
+        WVPASSEQ(pn('1e+9 k'), 1000000000 * 1024)
+        WVPASSEQ(pn('-3e-3mb'), int(-0.003 * 1024 * 1024))
+
+@wvtest
+def test_detect_fakeroot():
+    with no_lingering_errors():
+        if b'FAKEROOTKEY' in environ:
+            WVPASS(detect_fakeroot())
+        else:
+            WVPASS(not detect_fakeroot())
+
+@wvtest
+def test_path_components():
+    with no_lingering_errors():
+        WVPASSEQ(path_components(b'/'), [(b'', b'/')])
+        WVPASSEQ(path_components(b'/foo'), [(b'', b'/'), (b'foo', b'/foo')])
+        WVPASSEQ(path_components(b'/foo/'), [(b'', b'/'), (b'foo', b'/foo')])
+        WVPASSEQ(path_components(b'/foo/bar'),
+                 [(b'', b'/'), (b'foo', b'/foo'), (b'bar', b'/foo/bar')])
+        WVEXCEPT(Exception, path_components, b'foo')
+
+
+@wvtest
+def test_stripped_path_components():
+    with no_lingering_errors():
+        WVPASSEQ(stripped_path_components(b'/', []), [(b'', b'/')])
+        WVPASSEQ(stripped_path_components(b'/', [b'']), [(b'', b'/')])
+        WVPASSEQ(stripped_path_components(b'/', [b'/']), [(b'', b'/')])
+        WVPASSEQ(stripped_path_components(b'/foo', [b'/']),
+                 [(b'', b'/'), (b'foo', b'/foo')])
+        WVPASSEQ(stripped_path_components(b'/', [b'/foo']), [(b'', b'/')])
+        WVPASSEQ(stripped_path_components(b'/foo', [b'/bar']),
+                 [(b'', b'/'), (b'foo', b'/foo')])
+        WVPASSEQ(stripped_path_components(b'/foo', [b'/foo']), [(b'', b'/foo')])
+        WVPASSEQ(stripped_path_components(b'/foo/bar', [b'/foo']),
+                 [(b'', b'/foo'), (b'bar', b'/foo/bar')])
+        WVPASSEQ(stripped_path_components(b'/foo/bar', [b'/bar', b'/foo', b'/baz']),
+                 [(b'', b'/foo'), (b'bar', b'/foo/bar')])
+        WVPASSEQ(stripped_path_components(b'/foo/bar/baz', [b'/foo/bar/baz']),
+                 [(b'', b'/foo/bar/baz')])
+        WVEXCEPT(Exception, stripped_path_components, b'foo', [])
+
+
+@wvtest
+def test_grafted_path_components():
+    with no_lingering_errors():
+        WVPASSEQ(grafted_path_components([(b'/chroot', b'/')], b'/foo'),
+                 [(b'', b'/'), (b'foo', b'/foo')])
+        WVPASSEQ(grafted_path_components([(b'/foo/bar', b'/')],
+                                         b'/foo/bar/baz/bax'),
+                 [(b'', b'/foo/bar'),
+                  (b'baz', b'/foo/bar/baz'),
+                  (b'bax', b'/foo/bar/baz/bax')])
+        WVPASSEQ(grafted_path_components([(b'/foo/bar/baz', b'/bax')],
+                                         b'/foo/bar/baz/1/2'),
+                 [(b'', None),
+                  (b'bax', b'/foo/bar/baz'),
+                  (b'1', b'/foo/bar/baz/1'),
+                  (b'2', b'/foo/bar/baz/1/2')])
+        WVPASSEQ(grafted_path_components([(b'/foo', b'/bar/baz/bax')],
+                                         b'/foo/bar'),
+                 [(b'', None),
+                  (b'bar', None),
+                  (b'baz', None),
+                  (b'bax', b'/foo'),
+                  (b'bar', b'/foo/bar')])
+        WVPASSEQ(grafted_path_components([(b'/foo/bar/baz', b'/a/b/c')],
+                                         b'/foo/bar/baz'),
+                 [(b'', None), (b'a', None), (b'b', None), (b'c', b'/foo/bar/baz')])
+        WVPASSEQ(grafted_path_components([(b'/', b'/a/b/c/')], b'/foo/bar'),
+                 [(b'', None), (b'a', None), (b'b', None), (b'c', b'/'),
+                  (b'foo', b'/foo'), (b'bar', b'/foo/bar')])
+        WVEXCEPT(Exception, grafted_path_components, b'foo', [])
+
+
+@wvtest
+def test_shstr():
+    with no_lingering_errors():
+        # Do nothing for strings and bytes
+        WVPASSEQ(shstr(b''), b'')
+        WVPASSEQ(shstr(b'1'), b'1')
+        WVPASSEQ(shstr(b'1 2'), b'1 2')
+        WVPASSEQ(shstr(b"1'2"), b"1'2")
+        WVPASSEQ(shstr(''), '')
+        WVPASSEQ(shstr('1'), '1')
+        WVPASSEQ(shstr('1 2'), '1 2')
+        WVPASSEQ(shstr("1'2"), "1'2")
+
+        # Escape parts of sequences
+        WVPASSEQ(shstr((b'1 2', b'3')), b"'1 2' 3")
+        WVPASSEQ(shstr((b"1'2", b'3')), b"'1'\"'\"'2' 3")
+        WVPASSEQ(shstr((b"'1", b'3')), b"''\"'\"'1' 3")
+        WVPASSEQ(shstr(('1 2', '3')), "'1 2' 3")
+        WVPASSEQ(shstr(("1'2", '3')), "'1'\"'\"'2' 3")
+        WVPASSEQ(shstr(("'1", '3')), "''\"'\"'1' 3")
+
+
+@wvtest
+def test_readpipe():
+    with no_lingering_errors():
+        x = readpipe([b'echo', b'42'])
+        WVPASSEQ(x, b'42\n')
+        try:
+            readpipe([b'bash', b'-c', b'exit 42'])
+        except Exception as ex:
+            rx = '^subprocess b?"bash -c \'exit 42\'" failed with status 42$'
+            if not re.match(rx, str(ex)):
+                WVPASSEQ(str(ex), rx)
+
+
+@wvtest
+def test_batchpipe():
+    with no_lingering_errors():
+        for chunk in batchpipe([b'echo'], []):
+            WVPASS(False)
+        out = b''
+        for chunk in batchpipe([b'echo'], [b'42']):
+            out += chunk
+        WVPASSEQ(out, b'42\n')
+        try:
+            batchpipe([b'bash', b'-c'], [b'exit 42'])
+        except Exception as ex:
+            WVPASSEQ(str(ex),
+                     "subprocess 'bash -c exit 42' failed with status 42")
+        args = [str(x) for x in range(6)]
+        # Force batchpipe to break the args into batches of 3.  This
+        # approach assumes all args are the same length.
+        arg_max = \
+            helpers._argmax_base([b'echo']) + helpers._argmax_args_size(args[:3])
+        batches = batchpipe(['echo'], args, arg_max=arg_max)
+        WVPASSEQ(next(batches), b'0 1 2\n')
+        WVPASSEQ(next(batches), b'3 4 5\n')
+        WVPASSEQ(next(batches, None), None)
+        batches = batchpipe([b'echo'], [str(x) for x in range(5)], arg_max=arg_max)
+        WVPASSEQ(next(batches), b'0 1 2\n')
+        WVPASSEQ(next(batches), b'3 4\n')
+        WVPASSEQ(next(batches, None), None)
+
+
+@wvtest
+def test_atomically_replaced_file():
+    with no_lingering_errors():
+        with test_tempdir(b'bup-thelper-') as tmpdir:
+            target_file = os.path.join(tmpdir, b'test-atomic-write')
+
+            with atomically_replaced_file(target_file, mode='w') as f:
+                f.write('asdf')
+                WVPASSEQ(f.mode, 'w')
+            f = open(target_file, 'r')
+            WVPASSEQ(f.read(), 'asdf')
+
+            try:
+                with atomically_replaced_file(target_file, mode='w') as f:
+                    f.write('wxyz')
+                    raise Exception()
+            except:
+                pass
+            with open(target_file) as f:
+                WVPASSEQ(f.read(), 'asdf')
+
+            with atomically_replaced_file(target_file, mode='wb') as f:
+                f.write(os.urandom(20))
+                WVPASSEQ(f.mode, 'wb')
+
+
+def set_tz(tz):
+    if not tz:
+        del environ[b'TZ']
+    else:
+        environ[b'TZ'] = tz
+    tzset()
+
+
+@wvtest
+def test_utc_offset_str():
+    with no_lingering_errors():
+        tz = environ.get(b'TZ')
+        tzset()
+        try:
+            set_tz(b'FOO+0:00')
+            WVPASSEQ(utc_offset_str(0), b'+0000')
+            set_tz(b'FOO+1:00')
+            WVPASSEQ(utc_offset_str(0), b'-0100')
+            set_tz(b'FOO-1:00')
+            WVPASSEQ(utc_offset_str(0), b'+0100')
+            set_tz(b'FOO+3:3')
+            WVPASSEQ(utc_offset_str(0), b'-0303')
+            set_tz(b'FOO-3:3')
+            WVPASSEQ(utc_offset_str(0), b'+0303')
+            # Offset is not an integer number of minutes
+            set_tz(b'FOO+3:3:3')
+            WVPASSEQ(utc_offset_str(1), b'-0303')
+            set_tz(b'FOO-3:3:3')
+            WVPASSEQ(utc_offset_str(1), b'+0303')
+            WVPASSEQ(utc_offset_str(314159), b'+0303')
+        finally:
+            if tz:
+                set_tz(tz)
+            else:
+                try:
+                    set_tz(None)
+                except KeyError:
+                    pass
+
+@wvtest
+def test_valid_save_name():
+    with no_lingering_errors():
+        valid = helpers.valid_save_name
+        WVPASS(valid(b'x'))
+        WVPASS(valid(b'x@'))
+        WVFAIL(valid(b'@'))
+        WVFAIL(valid(b'/'))
+        WVFAIL(valid(b'/foo'))
+        WVFAIL(valid(b'foo/'))
+        WVFAIL(valid(b'/foo/'))
+        WVFAIL(valid(b'foo//bar'))
+        WVFAIL(valid(b'.'))
+        WVFAIL(valid(b'bar.'))
+        WVFAIL(valid(b'foo@{'))
+        for x in b' ~^:?*[\\':
+            WVFAIL(valid(b'foo' + bytes_from_byte(x)))
+        for i in range(20):
+            WVFAIL(valid(b'foo' + bytes_from_uint(i)))
+        WVFAIL(valid(b'foo' + bytes_from_uint(0x7f)))
+        WVFAIL(valid(b'foo..bar'))
+        WVFAIL(valid(b'bar.lock/baz'))
+        WVFAIL(valid(b'foo/bar.lock/baz'))
+        WVFAIL(valid(b'.bar/baz'))
+        WVFAIL(valid(b'foo/.bar/baz'))
diff --git a/test/int/tindex.py b/test/int/tindex.py
new file mode 100644 (file)
index 0000000..5f66f0f
--- /dev/null
@@ -0,0 +1,184 @@
+
+from __future__ import absolute_import, print_function
+import os, time
+
+from wvtest import *
+
+from bup import index, metadata
+from bup.compat import fsencode
+from bup.helpers import mkdirp, resolve_parent
+from buptest import no_lingering_errors, test_tempdir
+import bup.xstat as xstat
+
+
+lib_t_dir = os.path.dirname(fsencode(__file__))
+
+
+@wvtest
+def index_basic():
+    with no_lingering_errors():
+        cd = os.path.realpath(b'../')
+        WVPASS(cd)
+        sd = os.path.realpath(cd + b'/sampledata')
+        WVPASSEQ(resolve_parent(cd + b'/sampledata'), sd)
+        WVPASSEQ(os.path.realpath(cd + b'/sampledata/x'), sd + b'/x')
+        WVPASSEQ(os.path.realpath(cd + b'/sampledata/var/abs-symlink'),
+                 sd + b'/var/abs-symlink-target')
+        WVPASSEQ(resolve_parent(cd + b'/sampledata/var/abs-symlink'),
+                 sd + b'/var/abs-symlink')
+
+
+@wvtest
+def index_writer():
+    with no_lingering_errors():
+        with test_tempdir(b'bup-tindex-') as tmpdir:
+            orig_cwd = os.getcwd()
+            try:
+                os.chdir(tmpdir)
+                ds = xstat.stat(b'.')
+                fs = xstat.stat(lib_t_dir + b'/tindex.py')
+                ms = index.MetaStoreWriter(b'index.meta.tmp');
+                tmax = (time.time() - 1) * 10**9
+                w = index.Writer(b'index.tmp', ms, tmax)
+                w.add(b'/var/tmp/sporky', fs, 0)
+                w.add(b'/etc/passwd', fs, 0)
+                w.add(b'/etc/', ds, 0)
+                w.add(b'/', ds, 0)
+                ms.close()
+                w.close()
+            finally:
+                os.chdir(orig_cwd)
+
+
+def dump(m):
+    for e in list(m):
+        print('%s%s %s' % (e.is_valid() and ' ' or 'M',
+                           e.is_fake() and 'F' or ' ',
+                           e.name))
+
+def fake_validate(*l):
+    for i in l:
+        for e in i:
+            e.validate(0o100644, index.FAKE_SHA)
+            e.repack()
+
+def eget(l, ename):
+    for e in l:
+        if e.name == ename:
+            return e
+
+@wvtest
+def index_negative_timestamps():
+    with no_lingering_errors():
+        with test_tempdir(b'bup-tindex-') as tmpdir:
+            # Makes 'foo' exist
+            foopath = tmpdir + b'/foo'
+            f = open(foopath, 'wb')
+            f.close()
+
+            # Dec 31, 1969
+            os.utime(foopath, (-86400, -86400))
+            ns_per_sec = 10**9
+            tmax = (time.time() - 1) * ns_per_sec
+            e = index.BlankNewEntry(foopath, 0, tmax)
+            e.update_from_stat(xstat.stat(foopath), 0)
+            WVPASS(e.packed())
+
+            # Jun 10, 1893
+            os.utime(foopath, (-0x80000000, -0x80000000))
+            e = index.BlankNewEntry(foopath, 0, tmax)
+            e.update_from_stat(xstat.stat(foopath), 0)
+            WVPASS(e.packed())
+
+
+@wvtest
+def index_dirty():
+    with no_lingering_errors():
+        with test_tempdir(b'bup-tindex-') as tmpdir:
+            orig_cwd = os.getcwd()
+            try:
+                os.chdir(tmpdir)
+                default_meta = metadata.Metadata()
+                ms1 = index.MetaStoreWriter(b'index.meta.tmp')
+                ms2 = index.MetaStoreWriter(b'index2.meta.tmp')
+                ms3 = index.MetaStoreWriter(b'index3.meta.tmp')
+                meta_ofs1 = ms1.store(default_meta)
+                meta_ofs2 = ms2.store(default_meta)
+                meta_ofs3 = ms3.store(default_meta)
+
+                ds = xstat.stat(lib_t_dir)
+                fs = xstat.stat(lib_t_dir + b'/tindex.py')
+                tmax = (time.time() - 1) * 10**9
+
+                w1 = index.Writer(b'index.tmp', ms1, tmax)
+                w1.add(b'/a/b/x', fs, meta_ofs1)
+                w1.add(b'/a/b/c', fs, meta_ofs1)
+                w1.add(b'/a/b/', ds, meta_ofs1)
+                w1.add(b'/a/', ds, meta_ofs1)
+                #w1.close()
+                WVPASS()
+
+                w2 = index.Writer(b'index2.tmp', ms2, tmax)
+                w2.add(b'/a/b/n/2', fs, meta_ofs2)
+                #w2.close()
+                WVPASS()
+
+                w3 = index.Writer(b'index3.tmp', ms3, tmax)
+                w3.add(b'/a/c/n/3', fs, meta_ofs3)
+                #w3.close()
+                WVPASS()
+
+                r1 = w1.new_reader()
+                r2 = w2.new_reader()
+                r3 = w3.new_reader()
+                WVPASS()
+
+                r1all = [e.name for e in r1]
+                WVPASSEQ(r1all,
+                         [b'/a/b/x', b'/a/b/c', b'/a/b/', b'/a/', b'/'])
+                r2all = [e.name for e in r2]
+                WVPASSEQ(r2all,
+                         [b'/a/b/n/2', b'/a/b/n/', b'/a/b/', b'/a/', b'/'])
+                r3all = [e.name for e in r3]
+                WVPASSEQ(r3all,
+                         [b'/a/c/n/3', b'/a/c/n/', b'/a/c/', b'/a/', b'/'])
+                all = [e.name for e in index.merge(r2, r1, r3)]
+                WVPASSEQ(all,
+                         [b'/a/c/n/3', b'/a/c/n/', b'/a/c/',
+                          b'/a/b/x', b'/a/b/n/2', b'/a/b/n/', b'/a/b/c',
+                          b'/a/b/', b'/a/', b'/'])
+                fake_validate(r1)
+                dump(r1)
+
+                print([hex(e.flags) for e in r1])
+                WVPASSEQ([e.name for e in r1 if e.is_valid()], r1all)
+                WVPASSEQ([e.name for e in r1 if not e.is_valid()], [])
+                WVPASSEQ([e.name for e in index.merge(r2, r1, r3) if not e.is_valid()],
+                         [b'/a/c/n/3', b'/a/c/n/', b'/a/c/',
+                          b'/a/b/n/2', b'/a/b/n/', b'/a/b/', b'/a/', b'/'])
+
+                expect_invalid = [b'/'] + r2all + r3all
+                expect_real = (set(r1all) - set(r2all) - set(r3all)) \
+                                | set([b'/a/b/n/2', b'/a/c/n/3'])
+                dump(index.merge(r2, r1, r3))
+                for e in index.merge(r2, r1, r3):
+                    print(e.name, hex(e.flags), e.ctime)
+                    eiv = e.name in expect_invalid
+                    er  = e.name in expect_real
+                    WVPASSEQ(eiv, not e.is_valid())
+                    WVPASSEQ(er, e.is_real())
+                fake_validate(r2, r3)
+                dump(index.merge(r2, r1, r3))
+                WVPASSEQ([e.name for e in index.merge(r2, r1, r3) if not e.is_valid()], [])
+
+                e = eget(index.merge(r2, r1, r3), b'/a/b/c')
+                e.invalidate()
+                e.repack()
+                dump(index.merge(r2, r1, r3))
+                WVPASSEQ([e.name for e in index.merge(r2, r1, r3) if not e.is_valid()],
+                         [b'/a/b/c', b'/a/b/', b'/a/', b'/'])
+                w1.close()
+                w2.close()
+                w3.close()
+            finally:
+                os.chdir(orig_cwd)
diff --git a/test/int/tmetadata.py b/test/int/tmetadata.py
new file mode 100644 (file)
index 0000000..398e0ba
--- /dev/null
@@ -0,0 +1,319 @@
+
+from __future__ import absolute_import, print_function
+import errno, glob, grp, pwd, stat, tempfile, subprocess
+
+from wvtest import *
+
+from bup import git, metadata
+from bup import vfs
+from bup.compat import range
+from bup.helpers import clear_errors, detect_fakeroot, is_superuser, resolve_parent
+from bup.repo import LocalRepo
+from bup.xstat import utime, lutime
+from buptest import no_lingering_errors, test_tempdir
+import bup.helpers as helpers
+
+
+top_dir = b'../..'
+bup_path = top_dir + b'/bup'
+start_dir = os.getcwd()
+
+
+def ex(*cmd):
+    try:
+        cmd_str = b' '.join(cmd)
+        print(cmd_str, file=sys.stderr)
+        rc = subprocess.call(cmd)
+        if rc < 0:
+            print('terminated by signal', - rc, file=sys.stderr)
+            sys.exit(1)
+        elif rc > 0:
+            print('returned exit status', rc, file=sys.stderr)
+            sys.exit(1)
+    except OSError as e:
+        print('subprocess call failed:', e, file=sys.stderr)
+        sys.exit(1)
+
+
+def setup_testfs():
+    assert(sys.platform.startswith('linux'))
+    # Set up testfs with user_xattr, etc.
+    if subprocess.call([b'modprobe', b'loop']) != 0:
+        return False
+    subprocess.call([b'umount', b'testfs'])
+    ex(b'dd', b'if=/dev/zero', b'of=testfs.img', b'bs=1M', b'count=32')
+    ex(b'mke2fs', b'-F', b'-j', b'-m', b'0', b'testfs.img')
+    ex(b'rm', b'-rf', b'testfs')
+    os.mkdir(b'testfs')
+    ex(b'mount', b'-o', b'loop,acl,user_xattr', b'testfs.img', b'testfs')
+    # Hide, so that tests can't create risks.
+    os.chown(b'testfs', 0, 0)
+    os.chmod(b'testfs', 0o700)
+    return True
+
+
+def cleanup_testfs():
+    subprocess.call([b'umount', b'testfs'])
+    helpers.unlink(b'testfs.img')
+
+
+@wvtest
+def test_clean_up_archive_path():
+    with no_lingering_errors():
+        cleanup = metadata._clean_up_path_for_archive
+        WVPASSEQ(cleanup(b'foo'), b'foo')
+        WVPASSEQ(cleanup(b'/foo'), b'foo')
+        WVPASSEQ(cleanup(b'///foo'), b'foo')
+        WVPASSEQ(cleanup(b'/foo/bar'), b'foo/bar')
+        WVPASSEQ(cleanup(b'foo/./bar'), b'foo/bar')
+        WVPASSEQ(cleanup(b'/foo/./bar'), b'foo/bar')
+        WVPASSEQ(cleanup(b'/foo/./bar/././baz'), b'foo/bar/baz')
+        WVPASSEQ(cleanup(b'/foo/./bar///././baz'), b'foo/bar/baz')
+        WVPASSEQ(cleanup(b'//./foo/./bar///././baz/.///'), b'foo/bar/baz/')
+        WVPASSEQ(cleanup(b'./foo/./.bar'), b'foo/.bar')
+        WVPASSEQ(cleanup(b'./foo/.'), b'foo')
+        WVPASSEQ(cleanup(b'./foo/..'), b'.')
+        WVPASSEQ(cleanup(b'//./..//.../..//.'), b'.')
+        WVPASSEQ(cleanup(b'//./..//..././/.'), b'...')
+        WVPASSEQ(cleanup(b'/////.'), b'.')
+        WVPASSEQ(cleanup(b'/../'), b'.')
+        WVPASSEQ(cleanup(b''), b'.')
+
+
+@wvtest
+def test_risky_path():
+    with no_lingering_errors():
+        risky = metadata._risky_path
+        WVPASS(risky(b'/foo'))
+        WVPASS(risky(b'///foo'))
+        WVPASS(risky(b'/../foo'))
+        WVPASS(risky(b'../foo'))
+        WVPASS(risky(b'foo/..'))
+        WVPASS(risky(b'foo/../'))
+        WVPASS(risky(b'foo/../bar'))
+        WVFAIL(risky(b'foo'))
+        WVFAIL(risky(b'foo/'))
+        WVFAIL(risky(b'foo///'))
+        WVFAIL(risky(b'./foo'))
+        WVFAIL(risky(b'foo/.'))
+        WVFAIL(risky(b'./foo/.'))
+        WVFAIL(risky(b'foo/bar'))
+        WVFAIL(risky(b'foo/./bar'))
+
+
+@wvtest
+def test_clean_up_extract_path():
+    with no_lingering_errors():
+        cleanup = metadata._clean_up_extract_path
+        WVPASSEQ(cleanup(b'/foo'), b'foo')
+        WVPASSEQ(cleanup(b'///foo'), b'foo')
+        WVFAIL(cleanup(b'/../foo'))
+        WVFAIL(cleanup(b'../foo'))
+        WVFAIL(cleanup(b'foo/..'))
+        WVFAIL(cleanup(b'foo/../'))
+        WVFAIL(cleanup(b'foo/../bar'))
+        WVPASSEQ(cleanup(b'foo'), b'foo')
+        WVPASSEQ(cleanup(b'foo/'), b'foo/')
+        WVPASSEQ(cleanup(b'foo///'), b'foo///')
+        WVPASSEQ(cleanup(b'./foo'), b'./foo')
+        WVPASSEQ(cleanup(b'foo/.'), b'foo/.')
+        WVPASSEQ(cleanup(b'./foo/.'), b'./foo/.')
+        WVPASSEQ(cleanup(b'foo/bar'), b'foo/bar')
+        WVPASSEQ(cleanup(b'foo/./bar'), b'foo/./bar')
+        WVPASSEQ(cleanup(b'/'), b'.')
+        WVPASSEQ(cleanup(b'./'), b'./')
+        WVPASSEQ(cleanup(b'///foo/bar'), b'foo/bar')
+        WVPASSEQ(cleanup(b'///foo/bar'), b'foo/bar')
+
+
+@wvtest
+def test_metadata_method():
+    with no_lingering_errors():
+        with test_tempdir(b'bup-tmetadata-') as tmpdir:
+            bup_dir = tmpdir + b'/bup'
+            data_path = tmpdir + b'/foo'
+            os.mkdir(data_path)
+            ex(b'touch', data_path + b'/file')
+            ex(b'ln', b'-s', b'file', data_path + b'/symlink')
+            test_time1 = 13 * 1000000000
+            test_time2 = 42 * 1000000000
+            utime(data_path + b'/file', (0, test_time1))
+            lutime(data_path + b'/symlink', (0, 0))
+            utime(data_path, (0, test_time2))
+            ex(bup_path, b'-d', bup_dir, b'init')
+            ex(bup_path, b'-d', bup_dir, b'index', b'-v', data_path)
+            ex(bup_path, b'-d', bup_dir, b'save', b'-tvvn', b'test', data_path)
+            git.check_repo_or_die(bup_dir)
+            repo = LocalRepo()
+            resolved = vfs.resolve(repo,
+                                   b'/test/latest' + resolve_parent(data_path),
+                                   follow=False)
+            leaf_name, leaf_item = resolved[-1]
+            m = leaf_item.meta
+            WVPASS(m.mtime == test_time2)
+            WVPASS(leaf_name == b'foo')
+            contents = tuple(vfs.contents(repo, leaf_item))
+            WVPASS(len(contents) == 3)
+            WVPASSEQ(frozenset(name for name, item in contents),
+                     frozenset((b'.', b'file', b'symlink')))
+            for name, item in contents:
+                if name == b'file':
+                    m = item.meta
+                    WVPASS(m.mtime == test_time1)
+                elif name == b'symlink':
+                    m = item.meta
+                    WVPASSEQ(m.symlink_target, b'file')
+                    WVPASSEQ(m.size, 4)
+                    WVPASSEQ(m.mtime, 0)
+
+
+def _first_err():
+    if helpers.saved_errors:
+        return str(helpers.saved_errors[0])
+    return ''
+
+
+@wvtest
+def test_from_path_error():
+    if is_superuser() or detect_fakeroot():
+        return
+    with no_lingering_errors():
+        with test_tempdir(b'bup-tmetadata-') as tmpdir:
+            path = tmpdir + b'/foo'
+            os.mkdir(path)
+            m = metadata.from_path(path, archive_path=path, save_symlinks=True)
+            WVPASSEQ(m.path, path)
+            os.chmod(path, 0o000)
+            metadata.from_path(path, archive_path=path, save_symlinks=True)
+            if metadata.get_linux_file_attr:
+                print('saved_errors:', helpers.saved_errors, file=sys.stderr)
+                WVPASS(len(helpers.saved_errors) == 1)
+                errmsg = _first_err()
+                WVPASS(errmsg.startswith('read Linux attr'))
+                clear_errors()
+
+
+def _linux_attr_supported(path):
+    # Expects path to denote a regular file or a directory.
+    if not metadata.get_linux_file_attr:
+        return False
+    try:
+        metadata.get_linux_file_attr(path)
+    except OSError as e:
+        if e.errno in (errno.ENOTTY, errno.ENOSYS, errno.EOPNOTSUPP):
+            return False
+        else:
+            raise
+    return True
+
+
+@wvtest
+def test_apply_to_path_restricted_access():
+    if is_superuser() or detect_fakeroot():
+        return
+    if sys.platform.startswith('cygwin'):
+        return # chmod 000 isn't effective.
+    with no_lingering_errors():
+        with test_tempdir(b'bup-tmetadata-') as tmpdir:
+            parent = tmpdir + b'/foo'
+            path = parent + b'/bar'
+            os.mkdir(parent)
+            os.mkdir(path)
+            clear_errors()
+            if metadata.xattr:
+                try:
+                    metadata.xattr.set(path, b'user.buptest', b'bup')
+                except:
+                    print("failed to set test xattr")
+                    # ignore any failures here - maybe FS cannot do it
+                    pass
+            m = metadata.from_path(path, archive_path=path, save_symlinks=True)
+            WVPASSEQ(m.path, path)
+            os.chmod(parent, 0o000)
+            m.apply_to_path(path)
+            print('saved_errors:', helpers.saved_errors, file=sys.stderr)
+            expected_errors = ['utime: ']
+            if m.linux_attr and _linux_attr_supported(tmpdir):
+                expected_errors.append('Linux chattr: ')
+            if metadata.xattr and m.linux_xattr:
+                expected_errors.append("xattr.set ")
+            WVPASS(len(helpers.saved_errors) == len(expected_errors))
+            for i in range(len(expected_errors)):
+                WVPASS(str(helpers.saved_errors[i]).startswith(expected_errors[i]))
+            clear_errors()
+
+
+@wvtest
+def test_restore_over_existing_target():
+    with no_lingering_errors():
+        with test_tempdir(b'bup-tmetadata-') as tmpdir:
+            path = tmpdir + b'/foo'
+            os.mkdir(path)
+            dir_m = metadata.from_path(path, archive_path=path, save_symlinks=True)
+            os.rmdir(path)
+            open(path, 'w').close()
+            file_m = metadata.from_path(path, archive_path=path, save_symlinks=True)
+            # Restore dir over file.
+            WVPASSEQ(dir_m.create_path(path, create_symlinks=True), None)
+            WVPASS(stat.S_ISDIR(os.stat(path).st_mode))
+            # Restore dir over dir.
+            WVPASSEQ(dir_m.create_path(path, create_symlinks=True), None)
+            WVPASS(stat.S_ISDIR(os.stat(path).st_mode))
+            # Restore file over dir.
+            WVPASSEQ(file_m.create_path(path, create_symlinks=True), None)
+            WVPASS(stat.S_ISREG(os.stat(path).st_mode))
+            # Restore file over file.
+            WVPASSEQ(file_m.create_path(path, create_symlinks=True), None)
+            WVPASS(stat.S_ISREG(os.stat(path).st_mode))
+            # Restore file over non-empty dir.
+            os.remove(path)
+            os.mkdir(path)
+            open(path + b'/bar', 'w').close()
+            WVEXCEPT(Exception, file_m.create_path, path, create_symlinks=True)
+            # Restore dir over non-empty dir.
+            os.remove(path + b'/bar')
+            os.mkdir(path + b'/bar')
+            WVEXCEPT(Exception, dir_m.create_path, path, create_symlinks=True)
+
+
+from bup.metadata import read_acl
+if not read_acl:
+    @wvtest
+    def POSIX1E_ACL_SUPPORT_IS_MISSING():
+        pass
+
+
+from bup.metadata import xattr
+if xattr:
+    def remove_selinux(attrs):
+        return list(filter(lambda i: not i in (b'security.selinux', ),
+                           attrs))
+
+    @wvtest
+    def test_handling_of_incorrect_existing_linux_xattrs():
+        if not is_superuser() or detect_fakeroot():
+            WVMSG('skipping test -- not superuser')
+            return
+        if not setup_testfs():
+            WVMSG('unable to load loop module; skipping dependent tests')
+            return
+        for f in glob.glob(b'testfs/*'):
+            ex(b'rm', b'-rf', f)
+        path = b'testfs/foo'
+        open(path, 'w').close()
+        xattr.set(path, b'foo', b'bar', namespace=xattr.NS_USER)
+        m = metadata.from_path(path, archive_path=path, save_symlinks=True)
+        xattr.set(path, b'baz', b'bax', namespace=xattr.NS_USER)
+        m.apply_to_path(path, restore_numeric_ids=False)
+        WVPASSEQ(remove_selinux(xattr.list(path)), [b'user.foo'])
+        WVPASSEQ(xattr.get(path, b'user.foo'), b'bar')
+        xattr.set(path, b'foo', b'baz', namespace=xattr.NS_USER)
+        m.apply_to_path(path, restore_numeric_ids=False)
+        WVPASSEQ(remove_selinux(xattr.list(path)), [b'user.foo'])
+        WVPASSEQ(xattr.get(path, b'user.foo'), b'bar')
+        xattr.remove(path, b'foo', namespace=xattr.NS_USER)
+        m.apply_to_path(path, restore_numeric_ids=False)
+        WVPASSEQ(remove_selinux(xattr.list(path)), [b'user.foo'])
+        WVPASSEQ(xattr.get(path, b'user.foo'), b'bar')
+        os.chdir(start_dir)
+        cleanup_testfs()
diff --git a/test/int/toptions.py b/test/int/toptions.py
new file mode 100644 (file)
index 0000000..1b60554
--- /dev/null
@@ -0,0 +1,111 @@
+
+from __future__ import absolute_import
+
+from wvtest import *
+
+from bup import options
+from buptest import no_lingering_errors
+
+
+@wvtest
+def test_optdict():
+    with no_lingering_errors():
+        d = options.OptDict({
+            'x': ('x', False),
+            'y': ('y', False),
+            'z': ('z', False),
+            'other_thing': ('other_thing', False),
+            'no_other_thing': ('other_thing', True),
+            'no_z': ('z', True),
+            'no_smart': ('smart', True),
+            'smart': ('smart', False),
+            'stupid': ('smart', True),
+            'no_smart': ('smart', False),
+        })
+        WVPASS('foo')
+        d['x'] = 5
+        d['y'] = 4
+        d['z'] = 99
+        d['no_other_thing'] = 5
+        WVPASSEQ(d.x, 5)
+        WVPASSEQ(d.y, 4)
+        WVPASSEQ(d.z, 99)
+        WVPASSEQ(d.no_z, False)
+        WVPASSEQ(d.no_other_thing, True)
+        WVEXCEPT(KeyError, lambda: d.p)
+
+
+invalid_optspec0 = """
+"""
+
+
+invalid_optspec1 = """
+prog <whatever>
+"""
+
+
+invalid_optspec2 = """
+--
+x,y
+"""
+
+
+@wvtest
+def test_invalid_optspec():
+    with no_lingering_errors():
+        WVPASS(options.Options(invalid_optspec0).parse([]))
+        WVPASS(options.Options(invalid_optspec1).parse([]))
+        WVPASS(options.Options(invalid_optspec2).parse([]))
+
+
+optspec = """
+prog <optionset> [stuff...]
+prog [-t] <boggle>
+--
+t       test
+q,quiet   quiet
+l,longoption=   long option with parameters and a really really long description that will require wrapping
+p= short option with parameters
+onlylong  long option with no short
+neveropt never called options
+deftest1=  a default option with default [1]
+deftest2=  a default option with [1] default [2]
+deftest3=  a default option with [3] no actual default
+deftest4=  a default option with [[square]]
+deftest5=  a default option with "correct" [[square]
+s,smart,no-stupid  disable stupidity
+x,extended,no-simple   extended mode [2]
+#,compress=  set compression level [5]
+"""
+
+@wvtest
+def test_options():
+    with no_lingering_errors():
+        o = options.Options(optspec)
+        (opt,flags,extra) = o.parse(['-tttqp', 7, '--longoption', '19',
+                                     'hanky', '--onlylong', '-7'])
+        WVPASSEQ(flags[0], ('-t', ''))
+        WVPASSEQ(flags[1], ('-t', ''))
+        WVPASSEQ(flags[2], ('-t', ''))
+        WVPASSEQ(flags[3], ('-q', ''))
+        WVPASSEQ(flags[4], ('-p', 7))
+        WVPASSEQ(flags[5], ('--longoption', '19'))
+        WVPASSEQ(extra, ['hanky'])
+        WVPASSEQ((opt.t, opt.q, opt.p, opt.l, opt.onlylong,
+                  opt.neveropt), (3,1,7,19,1,None))
+        WVPASSEQ((opt.deftest1, opt.deftest2, opt.deftest3, opt.deftest4,
+                  opt.deftest5), (1,2,None,None,'[square'))
+        WVPASSEQ((opt.stupid, opt.no_stupid), (True, None))
+        WVPASSEQ((opt.smart, opt.no_smart), (None, True))
+        WVPASSEQ((opt.x, opt.extended, opt.no_simple), (2,2,2))
+        WVPASSEQ((opt.no_x, opt.no_extended, opt.simple), (False,False,False))
+        WVPASSEQ(opt['#'], 7)
+        WVPASSEQ(opt.compress, 7)
+
+        (opt,flags,extra) = o.parse(['--onlylong', '-t', '--no-onlylong',
+                                     '--smart', '--simple'])
+        WVPASSEQ((opt.t, opt.q, opt.onlylong), (1, None, 0))
+        WVPASSEQ((opt.stupid, opt.no_stupid), (False, True))
+        WVPASSEQ((opt.smart, opt.no_smart), (True, False))
+        WVPASSEQ((opt.x, opt.extended, opt.no_simple), (0,0,0))
+        WVPASSEQ((opt.no_x, opt.no_extended, opt.simple), (True,True,True))
diff --git a/test/int/tresolve.py b/test/int/tresolve.py
new file mode 100644 (file)
index 0000000..3296dfa
--- /dev/null
@@ -0,0 +1,334 @@
+
+from __future__ import absolute_import, print_function
+from binascii import unhexlify
+from errno import ELOOP, ENOTDIR
+from os import symlink
+from stat import S_IFDIR
+from sys import stderr
+from time import localtime, strftime
+
+from wvtest import *
+
+from bup import git, path, vfs
+from bup.compat import environ
+from bup.io import path_msg
+from bup.metadata import Metadata
+from bup.repo import LocalRepo, RemoteRepo
+from buptest import ex, exo, no_lingering_errors, test_tempdir
+from buptest.vfs import tree_dict
+
+bup_path = path.exe()
+
+## The clear_cache() calls below are to make sure that the test starts
+## from a known state since at the moment the cache entry for a given
+## item (like a commit) can change.  For example, its meta value might
+## be promoted from a mode to a Metadata instance once the tree it
+## refers to is traversed.
+
+def prep_and_test_repo(name, create_repo, test_repo):
+    with no_lingering_errors():
+        with test_tempdir(b'bup-t' + name) as tmpdir:
+            bup_dir = tmpdir + b'/bup'
+            environ[b'GIT_DIR'] = bup_dir
+            environ[b'BUP_DIR'] = bup_dir
+            ex((bup_path, b'init'))
+            git.repodir = bup_dir
+            with create_repo(bup_dir) as repo:
+                test_repo(repo, tmpdir)
+
+# Currently, we just test through the repos since LocalRepo resolve is
+# just a straight redirection to vfs.resolve.
+
+def test_resolve(repo, tmpdir):
+        data_path = tmpdir + b'/src'
+        resolve = repo.resolve
+        save_time = 100000
+        save_time_str = strftime('%Y-%m-%d-%H%M%S', localtime(save_time)).encode('ascii')
+        os.mkdir(data_path)
+        os.mkdir(data_path + b'/dir')
+        with open(data_path + b'/file', 'wb+') as tmpfile:
+            tmpfile.write(b'canary\n')
+        symlink(b'file', data_path + b'/file-symlink')
+        symlink(b'dir', data_path + b'/dir-symlink')
+        symlink(b'not-there', data_path + b'/bad-symlink')
+        ex((bup_path, b'index', b'-v', data_path))
+        ex((bup_path, b'save', b'-d', b'%d' % save_time, b'-tvvn', b'test',
+            b'--strip', data_path))
+        ex((bup_path, b'tag', b'test-tag', b'test'))
+
+        tip_hash = exo((b'git', b'show-ref', b'refs/heads/test'))[0]
+        tip_oidx = tip_hash.strip().split()[0]
+        tip_oid = unhexlify(tip_oidx)
+        tip_tree_oidx = exo((b'git', b'log', b'--pretty=%T', b'-n1',
+                             tip_oidx))[0].strip()
+        tip_tree_oid = unhexlify(tip_tree_oidx)
+        tip_tree = tree_dict(repo, tip_tree_oid)
+        test_revlist_w_meta = vfs.RevList(meta=tip_tree[b'.'].meta,
+                                          oid=tip_oid)
+        expected_latest_item = vfs.Commit(meta=S_IFDIR | 0o755,
+                                          oid=tip_tree_oid,
+                                          coid=tip_oid)
+        expected_latest_item_w_meta = vfs.Commit(meta=tip_tree[b'.'].meta,
+                                                 oid=tip_tree_oid,
+                                                 coid=tip_oid)
+        expected_latest_link = vfs.FakeLink(meta=vfs.default_symlink_mode,
+                                            target=save_time_str)
+        expected_test_tag_item = expected_latest_item
+
+        wvstart('resolve: /')
+        vfs.clear_cache()
+        res = resolve(b'/')
+        wvpasseq(1, len(res))
+        wvpasseq(((b'', vfs._root),), res)
+        ignore, root_item = res[0]
+        root_content = frozenset(vfs.contents(repo, root_item))
+        wvpasseq(frozenset([(b'.', root_item),
+                            (b'.tag', vfs._tags),
+                            (b'test', test_revlist_w_meta)]),
+                 root_content)
+        for path in (b'//', b'/.', b'/./', b'/..', b'/../',
+                     b'/test/latest/dir/../../..',
+                     b'/test/latest/dir/../../../',
+                     b'/test/latest/dir/../../../.',
+                     b'/test/latest/dir/../../..//',
+                     b'/test//latest/dir/../../..',
+                     b'/test/./latest/dir/../../..',
+                     b'/test/././latest/dir/../../..',
+                     b'/test/.//./latest/dir/../../..',
+                     b'/test//.//.//latest/dir/../../..'
+                     b'/test//./latest/dir/../../..'):
+            wvstart('resolve: ' + path_msg(path))
+            vfs.clear_cache()
+            res = resolve(path)
+            wvpasseq(((b'', vfs._root),), res)
+
+        wvstart('resolve: /.tag')
+        vfs.clear_cache()
+        res = resolve(b'/.tag')
+        wvpasseq(2, len(res))
+        wvpasseq(((b'', vfs._root), (b'.tag', vfs._tags)),
+                 res)
+        ignore, tag_item = res[1]
+        tag_content = frozenset(vfs.contents(repo, tag_item))
+        wvpasseq(frozenset([(b'.', tag_item),
+                            (b'test-tag', expected_test_tag_item)]),
+                 tag_content)
+
+        wvstart('resolve: /test')
+        vfs.clear_cache()
+        res = resolve(b'/test')
+        wvpasseq(2, len(res))
+        wvpasseq(((b'', vfs._root), (b'test', test_revlist_w_meta)), res)
+        ignore, test_item = res[1]
+        test_content = frozenset(vfs.contents(repo, test_item))
+        # latest has metadata here due to caching
+        wvpasseq(frozenset([(b'.', test_revlist_w_meta),
+                            (save_time_str, expected_latest_item_w_meta),
+                            (b'latest', expected_latest_link)]),
+                 test_content)
+
+        wvstart('resolve: /test/latest')
+        vfs.clear_cache()
+        res = resolve(b'/test/latest')
+        wvpasseq(3, len(res))
+        expected_latest_item_w_meta = vfs.Commit(meta=tip_tree[b'.'].meta,
+                                                 oid=tip_tree_oid,
+                                                 coid=tip_oid)
+        expected = ((b'', vfs._root),
+                    (b'test', test_revlist_w_meta),
+                    (save_time_str, expected_latest_item_w_meta))
+        wvpasseq(expected, res)
+        ignore, latest_item = res[2]
+        latest_content = frozenset(vfs.contents(repo, latest_item))
+        expected = frozenset((x.name, vfs.Item(oid=x.oid, meta=x.meta))
+                             for x in (tip_tree[name]
+                                       for name in (b'.',
+                                                    b'bad-symlink',
+                                                    b'dir',
+                                                    b'dir-symlink',
+                                                    b'file',
+                                                    b'file-symlink')))
+        wvpasseq(expected, latest_content)
+
+        wvstart('resolve: /test/latest/file')
+        vfs.clear_cache()
+        res = resolve(b'/test/latest/file')
+        wvpasseq(4, len(res))
+        expected_file_item_w_meta = vfs.Item(meta=tip_tree[b'file'].meta,
+                                             oid=tip_tree[b'file'].oid)
+        expected = ((b'', vfs._root),
+                    (b'test', test_revlist_w_meta),
+                    (save_time_str, expected_latest_item_w_meta),
+                    (b'file', expected_file_item_w_meta))
+        wvpasseq(expected, res)
+
+        wvstart('resolve: /test/latest/bad-symlink')
+        vfs.clear_cache()
+        res = resolve(b'/test/latest/bad-symlink')
+        wvpasseq(4, len(res))
+        expected = ((b'', vfs._root),
+                    (b'test', test_revlist_w_meta),
+                    (save_time_str, expected_latest_item_w_meta),
+                    (b'not-there', None))
+        wvpasseq(expected, res)
+
+        wvstart('resolve nofollow: /test/latest/bad-symlink')
+        vfs.clear_cache()
+        res = resolve(b'/test/latest/bad-symlink', follow=False)
+        wvpasseq(4, len(res))
+        bad_symlink_value = tip_tree[b'bad-symlink']
+        expected_bad_symlink_item_w_meta = vfs.Item(meta=bad_symlink_value.meta,
+                                                    oid=bad_symlink_value.oid)
+        expected = ((b'', vfs._root),
+                    (b'test', test_revlist_w_meta),
+                    (save_time_str, expected_latest_item_w_meta),
+                    (b'bad-symlink', expected_bad_symlink_item_w_meta))
+        wvpasseq(expected, res)
+
+        wvstart('resolve: /test/latest/file-symlink')
+        vfs.clear_cache()
+        res = resolve(b'/test/latest/file-symlink')
+        wvpasseq(4, len(res))
+        expected = ((b'', vfs._root),
+                    (b'test', test_revlist_w_meta),
+                    (save_time_str, expected_latest_item_w_meta),
+                    (b'file', expected_file_item_w_meta))
+        wvpasseq(expected, res)
+
+        wvstart('resolve nofollow: /test/latest/file-symlink')
+        vfs.clear_cache()
+        res = resolve(b'/test/latest/file-symlink', follow=False)
+        wvpasseq(4, len(res))
+        file_symlink_value = tip_tree[b'file-symlink']
+        expected_file_symlink_item_w_meta = vfs.Item(meta=file_symlink_value.meta,
+                                                     oid=file_symlink_value.oid)
+        expected = ((b'', vfs._root),
+                    (b'test', test_revlist_w_meta),
+                    (save_time_str, expected_latest_item_w_meta),
+                    (b'file-symlink', expected_file_symlink_item_w_meta))
+        wvpasseq(expected, res)
+
+        wvstart('resolve: /test/latest/missing')
+        vfs.clear_cache()
+        res = resolve(b'/test/latest/missing')
+        wvpasseq(4, len(res))
+        name, item = res[-1]
+        wvpasseq(b'missing', name)
+        wvpass(item is None)
+
+        for path in (b'/test/latest/file/',
+                     b'/test/latest/file/.',
+                     b'/test/latest/file/..',
+                     b'/test/latest/file/../',
+                     b'/test/latest/file/../.',
+                     b'/test/latest/file/../..',
+                     b'/test/latest/file/foo'):
+            wvstart('resolve: ' + path_msg(path))
+            vfs.clear_cache()
+            try:
+                resolve(path)
+            except vfs.IOError as res_ex:
+                wvpasseq(ENOTDIR, res_ex.errno)
+                wvpasseq([b'', b'test', save_time_str, b'file'],
+                         [name for name, item in res_ex.terminus])
+
+        for path in (b'/test/latest/file-symlink/',
+                     b'/test/latest/file-symlink/.',
+                     b'/test/latest/file-symlink/..',
+                     b'/test/latest/file-symlink/../',
+                     b'/test/latest/file-symlink/../.',
+                     b'/test/latest/file-symlink/../..'):
+            wvstart('resolve nofollow: ' + path_msg(path))
+            vfs.clear_cache()
+            try:
+                resolve(path, follow=False)
+            except vfs.IOError as res_ex:
+                wvpasseq(ENOTDIR, res_ex.errno)
+                wvpasseq([b'', b'test', save_time_str, b'file'],
+                         [name for name, item in res_ex.terminus])
+
+        wvstart('resolve: non-directory parent')
+        vfs.clear_cache()
+        file_res = resolve(b'/test/latest/file')
+        try:
+            resolve(b'foo', parent=file_res)
+        except vfs.IOError as res_ex:
+            wvpasseq(ENOTDIR, res_ex.errno)
+            wvpasseq(None, res_ex.terminus)
+
+        wvstart('resolve nofollow: /test/latest/dir-symlink')
+        vfs.clear_cache()
+        res = resolve(b'/test/latest/dir-symlink', follow=False)
+        wvpasseq(4, len(res))
+        dir_symlink_value = tip_tree[b'dir-symlink']
+        expected_dir_symlink_item_w_meta = vfs.Item(meta=dir_symlink_value.meta,
+                                                     oid=dir_symlink_value.oid)
+        expected = ((b'', vfs._root),
+                    (b'test', test_revlist_w_meta),
+                    (save_time_str, expected_latest_item_w_meta),
+                    (b'dir-symlink', expected_dir_symlink_item_w_meta))
+        wvpasseq(expected, res)
+
+        dir_value = tip_tree[b'dir']
+        expected_dir_item = vfs.Item(oid=dir_value.oid,
+                                     meta=tree_dict(repo, dir_value.oid)[b'.'].meta)
+        expected = ((b'', vfs._root),
+                    (b'test', test_revlist_w_meta),
+                    (save_time_str, expected_latest_item_w_meta),
+                    (b'dir', expected_dir_item))
+        def lresolve(*args, **keys):
+            return resolve(*args, **dict(keys, follow=False))
+        for resname, resolver in (('resolve', resolve),
+                                  ('resolve nofollow', lresolve)):
+            for path in (b'/test/latest/dir-symlink/',
+                         b'/test/latest/dir-symlink/.'):
+                wvstart(resname + ': ' + path_msg(path))
+                vfs.clear_cache()
+                res = resolver(path)
+                wvpasseq(4, len(res))
+                wvpasseq(expected, res)
+        wvstart('resolve: /test/latest/dir-symlink')
+        vfs.clear_cache()
+        res = resolve(path)
+        wvpasseq(4, len(res))
+        wvpasseq(expected, res)
+
+@wvtest
+def test_local_resolve():
+    prep_and_test_repo(b'local-vfs-resolve',
+                       lambda x: LocalRepo(repo_dir=x), test_resolve)
+
+@wvtest
+def test_remote_resolve():
+    prep_and_test_repo(b'remote-vfs-resolve',
+                       lambda x: RemoteRepo(x), test_resolve)
+
+def test_resolve_loop(repo, tmpdir):
+    data_path = tmpdir + b'/src'
+    os.mkdir(data_path)
+    symlink(b'loop', data_path + b'/loop')
+    ex((bup_path, b'init'))
+    ex((bup_path, b'index', b'-v', data_path))
+    save_utc = 100000
+    ex((bup_path, b'save', b'-d', b'%d' % save_utc, b'-tvvn', b'test', b'--strip',
+        data_path))
+    save_name = strftime('%Y-%m-%d-%H%M%S', localtime(save_utc)).encode('ascii')
+    try:
+        wvpasseq('this call should never return',
+                 repo.resolve(b'/test/%s/loop' % save_name))
+    except vfs.IOError as res_ex:
+        wvpasseq(ELOOP, res_ex.errno)
+        wvpasseq([b'', b'test', save_name, b'loop'],
+                 [name for name, item in res_ex.terminus])
+
+@wvtest
+def test_local_resolve_loop():
+    prep_and_test_repo(b'local-vfs-resolve-loop',
+                       lambda x: LocalRepo(x), test_resolve_loop)
+
+@wvtest
+def test_remote_resolve_loop():
+    prep_and_test_repo(b'remote-vfs-resolve-loop',
+                       lambda x: RemoteRepo(x), test_resolve_loop)
+
+# FIXME: add tests for the want_meta=False cases.
diff --git a/test/int/tshquote.py b/test/int/tshquote.py
new file mode 100644 (file)
index 0000000..8c85d4b
--- /dev/null
@@ -0,0 +1,55 @@
+
+from __future__ import absolute_import
+
+from wvtest import *
+
+from bup import shquote
+from buptest import no_lingering_errors
+
+
+def qst(line):
+    return [word for offset,word in shquote.quotesplit(line)]
+
+@wvtest
+def test_shquote():
+    with no_lingering_errors():
+        WVPASSEQ(qst(b"""  this is    basic \t\n\r text  """),
+                 [b'this', b'is', b'basic', b'text'])
+        WVPASSEQ(qst(br""" \"x\" "help" 'yelp' """), [b'"x"', b'help', b'yelp'])
+        WVPASSEQ(qst(br""" "'\"\"'" '\"\'' """), [b"'\"\"'", b'\\"\''])
+
+        WVPASSEQ(shquote.quotesplit(b'  this is "unfinished'),
+                 [(2, b'this'), (7, b'is'), (10, b'unfinished')])
+
+        WVPASSEQ(shquote.quotesplit(b'"silly"\'will'),
+                 [(0, b'silly'), (7, b'will')])
+
+        WVPASSEQ(shquote.unfinished_word(b'this is a "billy" "goat'),
+                 (b'"', b'goat'))
+        WVPASSEQ(shquote.unfinished_word(b"'x"),
+                 (b"'", b'x'))
+        WVPASSEQ(shquote.unfinished_word(b"abra cadabra "),
+                 (None, b''))
+        WVPASSEQ(shquote.unfinished_word(b"abra cadabra"),
+                 (None, b'cadabra'))
+
+        qtype, word = shquote.unfinished_word(b"this is /usr/loc")
+        WVPASSEQ(shquote.what_to_add(qtype, word, b"/usr/local", True),
+                 b"al")
+        qtype, word = shquote.unfinished_word(b"this is '/usr/loc")
+        WVPASSEQ(shquote.what_to_add(qtype, word, b"/usr/local", True),
+                 b"al'")
+        qtype, word = shquote.unfinished_word(b"this is \"/usr/loc")
+        WVPASSEQ(shquote.what_to_add(qtype, word, b"/usr/local", True),
+                 b"al\"")
+        qtype, word = shquote.unfinished_word(b"this is \"/usr/loc")
+        WVPASSEQ(shquote.what_to_add(qtype, word, b"/usr/local", False),
+                 b"al")
+        qtype, word = shquote.unfinished_word(b"this is \\ hammer\\ \"")
+        WVPASSEQ(word, b' hammer "')
+        WVPASSEQ(shquote.what_to_add(qtype, word, b" hammer \"time\"", True),
+                 b"time\\\"")
+
+        WVPASSEQ(shquote.quotify_list([b'a', b'', b'"word"', b"'third'", b"'",
+                                       b"x y"]),
+                 b"a '' '\"word\"' \"'third'\" \"'\" 'x y'")
diff --git a/test/int/tvfs.py b/test/int/tvfs.py
new file mode 100644 (file)
index 0000000..a7d3b21
--- /dev/null
@@ -0,0 +1,401 @@
+
+from __future__ import absolute_import, print_function
+from binascii import unhexlify
+from collections import namedtuple
+from errno import ELOOP, ENOTDIR
+from io import BytesIO
+from os import symlink
+from random import Random, randint
+from stat import S_IFDIR, S_IFLNK, S_IFREG, S_ISDIR, S_ISREG
+from sys import stderr
+from time import localtime, strftime, tzset
+
+from wvtest import *
+
+from bup._helpers import write_random
+from bup import git, metadata, vfs
+from bup.compat import environ, fsencode, items, range
+from bup.git import BUP_CHUNKED
+from bup.helpers import exc, shstr
+from bup.metadata import Metadata
+from bup.repo import LocalRepo
+from buptest import ex, exo, no_lingering_errors, test_tempdir
+from buptest.vfs import tree_dict
+
+top_dir = b'../..'
+bup_path = top_dir + b'/bup'
+start_dir = os.getcwd()
+
+def ex(cmd, **kwargs):
+    print(shstr(cmd), file=stderr)
+    return exc(cmd, **kwargs)
+
+@wvtest
+def test_default_modes():
+    wvpasseq(S_IFREG | 0o644, vfs.default_file_mode)
+    wvpasseq(S_IFDIR | 0o755, vfs.default_dir_mode)
+    wvpasseq(S_IFLNK | 0o755, vfs.default_symlink_mode)
+
+@wvtest
+def test_cache_behavior():
+    orig_max = vfs._cache_max_items
+    try:
+        vfs._cache_max_items = 2
+        vfs.clear_cache()
+        wvpasseq({}, vfs._cache)
+        wvpasseq([], vfs._cache_keys)
+        wvfail(vfs._cache_keys)
+        wvexcept(Exception, vfs.cache_notice, b'x', 1)
+        key_0 = b'itm:' + b'\0' * 20
+        key_1 = b'itm:' + b'\1' * 20
+        key_2 = b'itm:' + b'\2' * 20
+        vfs.cache_notice(key_0, b'something')
+        wvpasseq({key_0 : b'something'}, vfs._cache)
+        wvpasseq([key_0], vfs._cache_keys)
+        vfs.cache_notice(key_1, b'something else')
+        wvpasseq({key_0 : b'something', key_1 : b'something else'}, vfs._cache)
+        wvpasseq(frozenset([key_0, key_1]), frozenset(vfs._cache_keys))
+        vfs.cache_notice(key_2, b'and also')
+        wvpasseq(2, len(vfs._cache))
+        wvpass(frozenset(items(vfs._cache))
+               < frozenset(items({key_0 : b'something',
+                                  key_1 : b'something else',
+                                  key_2 : b'and also'})))
+        wvpasseq(2, len(vfs._cache_keys))
+        wvpass(frozenset(vfs._cache_keys) < frozenset([key_0, key_1, key_2]))
+        vfs.clear_cache()
+        wvpasseq({}, vfs._cache)
+        wvpasseq([], vfs._cache_keys)
+    finally:
+        vfs._cache_max_items = orig_max
+        vfs.clear_cache()
+
+## The clear_cache() calls below are to make sure that the test starts
+## from a known state since at the moment the cache entry for a given
+## item (like a commit) can change.  For example, its meta value might
+## be promoted from a mode to a Metadata instance once the tree it
+## refers to is traversed.
+
+def run_augment_item_meta_tests(repo,
+                                file_path, file_size,
+                                link_path, link_target):
+    _, file_item = vfs.resolve(repo, file_path)[-1]
+    _, link_item = vfs.resolve(repo, link_path, follow=False)[-1]
+    wvpass(isinstance(file_item.meta, Metadata))
+    wvpass(isinstance(link_item.meta, Metadata))
+    # Note: normally, modifying item.meta values is forbidden
+    file_item.meta.size = file_item.meta.size or vfs.item_size(repo, file_item)
+    link_item.meta.size = link_item.meta.size or vfs.item_size(repo, link_item)
+
+    ## Ensure a fully populated item is left alone
+    augmented = vfs.augment_item_meta(repo, file_item)
+    wvpass(augmented is file_item)
+    wvpass(augmented.meta is file_item.meta)
+    augmented = vfs.augment_item_meta(repo, file_item, include_size=True)
+    wvpass(augmented is file_item)
+    wvpass(augmented.meta is file_item.meta)
+
+    ## Ensure a missing size is handled poperly
+    file_item.meta.size = None
+    augmented = vfs.augment_item_meta(repo, file_item)
+    wvpass(augmented is file_item)
+    wvpass(augmented.meta is file_item.meta)
+    augmented = vfs.augment_item_meta(repo, file_item, include_size=True)
+    wvpass(augmented is not file_item)
+    wvpasseq(file_size, augmented.meta.size)
+
+    ## Ensure a meta mode is handled properly
+    mode_item = file_item._replace(meta=vfs.default_file_mode)
+    augmented = vfs.augment_item_meta(repo, mode_item)
+    augmented_w_size = vfs.augment_item_meta(repo, mode_item, include_size=True)
+    for item in (augmented, augmented_w_size):
+        meta = item.meta
+        wvpass(item is not file_item)
+        wvpass(isinstance(meta, Metadata))
+        wvpasseq(vfs.default_file_mode, meta.mode)
+        wvpasseq((None, None, 0, 0, 0),
+                 (meta.uid, meta.gid, meta.atime, meta.mtime, meta.ctime))
+    wvpass(augmented.meta.size is None)
+    wvpasseq(file_size, augmented_w_size.meta.size)
+
+    ## Ensure symlinks are handled properly
+    mode_item = link_item._replace(meta=vfs.default_symlink_mode)
+    augmented = vfs.augment_item_meta(repo, mode_item)
+    wvpass(augmented is not mode_item)
+    wvpass(isinstance(augmented.meta, Metadata))
+    wvpasseq(link_target, augmented.meta.symlink_target)
+    wvpasseq(len(link_target), augmented.meta.size)
+    augmented = vfs.augment_item_meta(repo, mode_item, include_size=True)
+    wvpass(augmented is not mode_item)
+    wvpass(isinstance(augmented.meta, Metadata))
+    wvpasseq(link_target, augmented.meta.symlink_target)
+    wvpasseq(len(link_target), augmented.meta.size)
+
+
+@wvtest
+def test_item_mode():
+    with no_lingering_errors():
+        mode = S_IFDIR | 0o755
+        meta = metadata.from_path(b'.')
+        oid = b'\0' * 20
+        wvpasseq(mode, vfs.item_mode(vfs.Item(oid=oid, meta=mode)))
+        wvpasseq(meta.mode, vfs.item_mode(vfs.Item(oid=oid, meta=meta)))
+
+@wvtest
+def test_reverse_suffix_duplicates():
+    suffix = lambda x: tuple(vfs._reverse_suffix_duplicates(x))
+    wvpasseq((b'x',), suffix((b'x',)))
+    wvpasseq((b'x', b'y'), suffix((b'x', b'y')))
+    wvpasseq((b'x-1', b'x-0'), suffix((b'x',) * 2))
+    wvpasseq([b'x-%02d' % n for n in reversed(range(11))],
+             list(suffix((b'x',) * 11)))
+    wvpasseq((b'x-1', b'x-0', b'y'), suffix((b'x', b'x', b'y')))
+    wvpasseq((b'x', b'y-1', b'y-0'), suffix((b'x', b'y', b'y')))
+    wvpasseq((b'x', b'y-1', b'y-0', b'z'), suffix((b'x', b'y', b'y', b'z')))
+
+@wvtest
+def test_misc():
+    with no_lingering_errors():
+        with test_tempdir(b'bup-tvfs-') as tmpdir:
+            bup_dir = tmpdir + b'/bup'
+            environ[b'GIT_DIR'] = bup_dir
+            environ[b'BUP_DIR'] = bup_dir
+            git.repodir = bup_dir
+            data_path = tmpdir + b'/src'
+            os.mkdir(data_path)
+            with open(data_path + b'/file', 'wb+') as tmpfile:
+                tmpfile.write(b'canary\n')
+            symlink(b'file', data_path + b'/symlink')
+            ex((bup_path, b'init'))
+            ex((bup_path, b'index', b'-v', data_path))
+            ex((bup_path, b'save', b'-d', b'100000', b'-tvvn', b'test',
+                b'--strip', data_path))
+            repo = LocalRepo()
+
+            wvstart('readlink')
+            ls_tree = exo((b'git', b'ls-tree', b'test', b'symlink')).out
+            mode, typ, oidx, name = ls_tree.strip().split(None, 3)
+            assert name == b'symlink'
+            link_item = vfs.Item(oid=unhexlify(oidx), meta=int(mode, 8))
+            wvpasseq(b'file', vfs.readlink(repo, link_item))
+
+            ls_tree = exo((b'git', b'ls-tree', b'test', b'file')).out
+            mode, typ, oidx, name = ls_tree.strip().split(None, 3)
+            assert name == b'file'
+            file_item = vfs.Item(oid=unhexlify(oidx), meta=int(mode, 8))
+            wvexcept(Exception, vfs.readlink, repo, file_item)
+
+            wvstart('item_size')
+            wvpasseq(4, vfs.item_size(repo, link_item))
+            wvpasseq(7, vfs.item_size(repo, file_item))
+            meta = metadata.from_path(fsencode(__file__))
+            meta.size = 42
+            fake_item = file_item._replace(meta=meta)
+            wvpasseq(42, vfs.item_size(repo, fake_item))
+
+            _, fakelink_item = vfs.resolve(repo, b'/test/latest', follow=False)[-1]
+            wvpasseq(17, vfs.item_size(repo, fakelink_item))
+
+            wvstart('augment_item_meta')
+            run_augment_item_meta_tests(repo,
+                                        b'/test/latest/file', 7,
+                                        b'/test/latest/symlink', b'file')
+
+            wvstart('copy_item')
+            # FIXME: this caused StopIteration
+            #_, file_item = vfs.resolve(repo, '/file')[-1]
+            _, file_item = vfs.resolve(repo, b'/test/latest/file')[-1]
+            file_copy = vfs.copy_item(file_item)
+            wvpass(file_copy is not file_item)
+            wvpass(file_copy.meta is not file_item.meta)
+            wvpass(isinstance(file_copy, tuple))
+            wvpass(file_item.meta.user)
+            wvpass(file_copy.meta.user)
+            file_copy.meta.user = None
+            wvpass(file_item.meta.user)
+
+def write_sized_random_content(parent_dir, size, seed):
+    verbose = 0
+    with open(b'%s/%d' % (parent_dir, size), 'wb') as f:
+        write_random(f.fileno(), size, seed, verbose)
+
+def validate_vfs_streaming_read(repo, item, expected_path, read_sizes):
+    for read_size in read_sizes:
+        with open(expected_path, 'rb') as expected:
+            with vfs.fopen(repo, item) as actual:
+                ex_buf = expected.read(read_size)
+                act_buf = actual.read(read_size)
+                while ex_buf and act_buf:
+                    wvpassge(read_size, len(ex_buf))
+                    wvpassge(read_size, len(act_buf))
+                    wvpasseq(len(ex_buf), len(act_buf))
+                    wvpass(ex_buf == act_buf)
+                    ex_buf = expected.read(read_size)
+                    act_buf = actual.read(read_size)
+                wvpasseq(b'', ex_buf)
+                wvpasseq(b'', act_buf)
+
+def validate_vfs_seeking_read(repo, item, expected_path, read_sizes):
+    def read_act(act_pos):
+        with vfs.fopen(repo, item) as actual:
+            actual.seek(act_pos)
+            wvpasseq(act_pos, actual.tell())
+            act_buf = actual.read(read_size)
+            act_pos += len(act_buf)
+            wvpasseq(act_pos, actual.tell())
+            return act_pos, act_buf
+
+    for read_size in read_sizes:
+        with open(expected_path, 'rb') as expected:
+                ex_buf = expected.read(read_size)
+                act_buf = None
+                act_pos = 0
+                while ex_buf:
+                    act_pos, act_buf = read_act(act_pos)
+                    wvpassge(read_size, len(ex_buf))
+                    wvpassge(read_size, len(act_buf))
+                    wvpasseq(len(ex_buf), len(act_buf))
+                    wvpass(ex_buf == act_buf)
+                    if not act_buf:
+                        break
+                    ex_buf = expected.read(read_size)
+                else:  # hit expected eof first
+                    act_pos, act_buf = read_act(act_pos)
+                wvpasseq(b'', ex_buf)
+                wvpasseq(b'', act_buf)
+
+@wvtest
+def test_read_and_seek():
+    # Write a set of randomly sized files containing random data whose
+    # names are their sizes, and then verify that what we get back
+    # from the vfs when seeking and reading with various block sizes
+    # matches the original content.
+    with no_lingering_errors():
+        with test_tempdir(b'bup-tvfs-read-') as tmpdir:
+            resolve = vfs.resolve
+            bup_dir = tmpdir + b'/bup'
+            environ[b'GIT_DIR'] = bup_dir
+            environ[b'BUP_DIR'] = bup_dir
+            git.repodir = bup_dir
+            repo = LocalRepo()
+            data_path = tmpdir + b'/src'
+            os.mkdir(data_path)
+            seed = randint(-(1 << 31), (1 << 31) - 1)
+            rand = Random()
+            rand.seed(seed)
+            print('test_read seed:', seed, file=sys.stderr)
+            max_size = 2 * 1024 * 1024
+            sizes = set((rand.randint(1, max_size) for _ in range(5)))
+            sizes.add(1)
+            sizes.add(max_size)
+            for size in sizes:
+                write_sized_random_content(data_path, size, seed)
+            ex((bup_path, b'init'))
+            ex((bup_path, b'index', b'-v', data_path))
+            ex((bup_path, b'save', b'-d', b'100000', b'-tvvn', b'test',
+                b'--strip', data_path))
+            read_sizes = set((rand.randint(1, max_size) for _ in range(10)))
+            sizes.add(1)
+            sizes.add(max_size)
+            print('test_read src sizes:', sizes, file=sys.stderr)
+            print('test_read read sizes:', read_sizes, file=sys.stderr)
+            for size in sizes:
+                res = resolve(repo, b'/test/latest/' + str(size).encode('ascii'))
+                _, item = res[-1]
+                wvpasseq(size, vfs.item_size(repo, res[-1][1]))
+                validate_vfs_streaming_read(repo, item,
+                                            b'%s/%d' % (data_path, size),
+                                            read_sizes)
+                validate_vfs_seeking_read(repo, item,
+                                          b'%s/%d' % (data_path, size),
+                                          read_sizes)
+
+@wvtest
+def test_contents_with_mismatched_bupm_git_ordering():
+    with no_lingering_errors():
+        with test_tempdir(b'bup-tvfs-') as tmpdir:
+            bup_dir = tmpdir + b'/bup'
+            environ[b'GIT_DIR'] = bup_dir
+            environ[b'BUP_DIR'] = bup_dir
+            git.repodir = bup_dir
+            data_path = tmpdir + b'/src'
+            os.mkdir(data_path)
+            os.mkdir(data_path + b'/foo')
+            with open(data_path + b'/foo.', 'wb+') as tmpfile:
+                tmpfile.write(b'canary\n')
+            ex((bup_path, b'init'))
+            ex((bup_path, b'index', b'-v', data_path))
+            save_utc = 100000
+            save_name = strftime('%Y-%m-%d-%H%M%S', localtime(save_utc)).encode('ascii')
+            ex((bup_path, b'save', b'-tvvn', b'test', b'-d', b'%d' % save_utc,
+                b'--strip', data_path))
+            repo = LocalRepo()
+            tip_sref = exo((b'git', b'show-ref', b'refs/heads/test')).out
+            tip_oidx = tip_sref.strip().split()[0]
+            tip_tree_oidx = exo((b'git', b'log', b'--pretty=%T', b'-n1',
+                                 tip_oidx)).out.strip()
+            tip_tree_oid = unhexlify(tip_tree_oidx)
+            tip_tree = tree_dict(repo, tip_tree_oid)
+
+            name, item = vfs.resolve(repo, b'/test/latest')[2]
+            wvpasseq(save_name, name)
+            expected = frozenset((x.name, vfs.Item(oid=x.oid, meta=x.meta))
+                                 for x in (tip_tree[name]
+                                           for name in (b'.', b'foo', b'foo.')))
+            contents = tuple(vfs.contents(repo, item))
+            wvpasseq(expected, frozenset(contents))
+            # Spot check, in case tree_dict shares too much code with the vfs
+            name, item = next(((n, i) for n, i in contents if n == b'foo'))
+            wvpass(S_ISDIR(item.meta))
+            name, item = next(((n, i) for n, i in contents if n == b'foo.'))
+            wvpass(S_ISREG(item.meta.mode))
+
+@wvtest
+def test_duplicate_save_dates():
+    with no_lingering_errors():
+        with test_tempdir(b'bup-tvfs-') as tmpdir:
+            bup_dir = tmpdir + b'/bup'
+            environ[b'GIT_DIR'] = bup_dir
+            environ[b'BUP_DIR'] = bup_dir
+            environ[b'TZ'] = b'UTC'
+            tzset()
+            git.repodir = bup_dir
+            data_path = tmpdir + b'/src'
+            os.mkdir(data_path)
+            with open(data_path + b'/file', 'wb+') as tmpfile:
+                tmpfile.write(b'canary\n')
+            ex((b'env',))
+            ex((bup_path, b'init'))
+            ex((bup_path, b'index', b'-v', data_path))
+            for i in range(11):
+                ex((bup_path, b'save', b'-d', b'100000', b'-n', b'test',
+                    data_path))
+            repo = LocalRepo()
+            res = vfs.resolve(repo, b'/test')
+            wvpasseq(2, len(res))
+            name, revlist = res[-1]
+            wvpasseq(b'test', name)
+            wvpasseq((b'.',
+                      b'1970-01-02-034640-00',
+                      b'1970-01-02-034640-01',
+                      b'1970-01-02-034640-02',
+                      b'1970-01-02-034640-03',
+                      b'1970-01-02-034640-04',
+                      b'1970-01-02-034640-05',
+                      b'1970-01-02-034640-06',
+                      b'1970-01-02-034640-07',
+                      b'1970-01-02-034640-08',
+                      b'1970-01-02-034640-09',
+                      b'1970-01-02-034640-10',
+                      b'latest'),
+                     tuple(sorted(x[0] for x in vfs.contents(repo, revlist))))
+
+@wvtest
+def test_item_read_write():
+    with no_lingering_errors():
+        x = vfs.Root(meta=13)
+        stream = BytesIO()
+        vfs.write_item(stream, x)
+        print('stream:', repr(stream.getvalue()), stream.tell(), file=sys.stderr)
+        stream.seek(0)
+        wvpasseq(x, vfs.read_item(stream))
diff --git a/test/int/tvint.py b/test/int/tvint.py
new file mode 100644 (file)
index 0000000..6bee0f3
--- /dev/null
@@ -0,0 +1,95 @@
+
+from __future__ import absolute_import
+from io import BytesIO
+
+from wvtest import *
+
+from bup import vint
+from buptest import no_lingering_errors
+
+
+def encode_and_decode_vuint(x):
+    f = BytesIO()
+    vint.write_vuint(f, x)
+    return vint.read_vuint(BytesIO(f.getvalue()))
+
+
+@wvtest
+def test_vuint():
+    with no_lingering_errors():
+        for x in (0, 1, 42, 128, 10**16):
+            WVPASSEQ(encode_and_decode_vuint(x), x)
+        WVEXCEPT(Exception, vint.write_vuint, BytesIO(), -1)
+        WVEXCEPT(EOFError, vint.read_vuint, BytesIO())
+
+
+def encode_and_decode_vint(x):
+    f = BytesIO()
+    vint.write_vint(f, x)
+    return vint.read_vint(BytesIO(f.getvalue()))
+
+
+@wvtest
+def test_vint():
+    with no_lingering_errors():
+        values = (0, 1, 42, 64, 10**16)
+        for x in values:
+            WVPASSEQ(encode_and_decode_vint(x), x)
+        for x in [-x for x in values]:
+            WVPASSEQ(encode_and_decode_vint(x), x)
+        WVEXCEPT(EOFError, vint.read_vint, BytesIO())
+        WVEXCEPT(EOFError, vint.read_vint, BytesIO(b"\x80\x80"))
+
+
+def encode_and_decode_bvec(x):
+    f = BytesIO()
+    vint.write_bvec(f, x)
+    return vint.read_bvec(BytesIO(f.getvalue()))
+
+
+@wvtest
+def test_bvec():
+    with no_lingering_errors():
+        values = (b'', b'x', b'foo', b'\0', b'\0foo', b'foo\0bar\0')
+        for x in values:
+            WVPASSEQ(encode_and_decode_bvec(x), x)
+        WVEXCEPT(EOFError, vint.read_bvec, BytesIO())
+        outf = BytesIO()
+        for x in (b'foo', b'bar', b'baz', b'bax'):
+            vint.write_bvec(outf, x)
+        inf = BytesIO(outf.getvalue())
+        WVPASSEQ(vint.read_bvec(inf), b'foo')
+        WVPASSEQ(vint.read_bvec(inf), b'bar')
+        vint.skip_bvec(inf)
+        WVPASSEQ(vint.read_bvec(inf), b'bax')
+
+
+def pack_and_unpack(types, *values):
+    data = vint.pack(types, *values)
+    return vint.unpack(types, data)
+
+
+@wvtest
+def test_pack_and_unpack():
+    with no_lingering_errors():
+        tests = [('', []),
+                 ('s', [b'foo']),
+                 ('ss', [b'foo', b'bar']),
+                 ('sV', [b'foo', 0]),
+                 ('sv', [b'foo', -1]),
+                 ('V', [0]),
+                 ('Vs', [0, b'foo']),
+                 ('VV', [0, 1]),
+                 ('Vv', [0, -1]),
+                 ('v', [0]),
+                 ('vs', [0, b'foo']),
+                 ('vV', [0, 1]),
+                 ('vv', [0, -1])]
+        for test in tests:
+            (types, values) = test
+            WVPASSEQ(pack_and_unpack(types, *values), values)
+        WVEXCEPT(Exception, vint.pack, 's')
+        WVEXCEPT(Exception, vint.pack, 's', 'foo', 'bar')
+        WVEXCEPT(Exception, vint.pack, 'x', 1)
+        WVEXCEPT(Exception, vint.unpack, 's', '')
+        WVEXCEPT(Exception, vint.unpack, 'x', '')
diff --git a/test/int/txstat.py b/test/int/txstat.py
new file mode 100644 (file)
index 0000000..d002a36
--- /dev/null
@@ -0,0 +1,117 @@
+
+from __future__ import absolute_import
+import math, tempfile, subprocess
+
+from wvtest import *
+
+import bup._helpers as _helpers
+from bup import xstat
+from buptest import no_lingering_errors, test_tempdir
+
+
+@wvtest
+def test_fstime():
+    with no_lingering_errors():
+        WVPASSEQ(xstat.timespec_to_nsecs((0, 0)), 0)
+        WVPASSEQ(xstat.timespec_to_nsecs((1, 0)), 10**9)
+        WVPASSEQ(xstat.timespec_to_nsecs((0, 10**9 / 2)), 500000000)
+        WVPASSEQ(xstat.timespec_to_nsecs((1, 10**9 / 2)), 1500000000)
+        WVPASSEQ(xstat.timespec_to_nsecs((-1, 0)), -10**9)
+        WVPASSEQ(xstat.timespec_to_nsecs((-1, 10**9 / 2)), -500000000)
+        WVPASSEQ(xstat.timespec_to_nsecs((-2, 10**9 / 2)), -1500000000)
+        WVPASSEQ(xstat.timespec_to_nsecs((0, -1)), -1)
+        WVPASSEQ(type(xstat.timespec_to_nsecs((2, 22222222))), type(0))
+        WVPASSEQ(type(xstat.timespec_to_nsecs((-2, 22222222))), type(0))
+
+        WVPASSEQ(xstat.nsecs_to_timespec(0), (0, 0))
+        WVPASSEQ(xstat.nsecs_to_timespec(10**9), (1, 0))
+        WVPASSEQ(xstat.nsecs_to_timespec(500000000), (0, 10**9 / 2))
+        WVPASSEQ(xstat.nsecs_to_timespec(1500000000), (1, 10**9 / 2))
+        WVPASSEQ(xstat.nsecs_to_timespec(-10**9), (-1, 0))
+        WVPASSEQ(xstat.nsecs_to_timespec(-500000000), (-1, 10**9 / 2))
+        WVPASSEQ(xstat.nsecs_to_timespec(-1500000000), (-2, 10**9 / 2))
+        x = xstat.nsecs_to_timespec(1977777778)
+        WVPASSEQ(type(x[0]), type(0))
+        WVPASSEQ(type(x[1]), type(0))
+        x = xstat.nsecs_to_timespec(-1977777778)
+        WVPASSEQ(type(x[0]), type(0))
+        WVPASSEQ(type(x[1]), type(0))
+
+        WVPASSEQ(xstat.nsecs_to_timeval(0), (0, 0))
+        WVPASSEQ(xstat.nsecs_to_timeval(10**9), (1, 0))
+        WVPASSEQ(xstat.nsecs_to_timeval(500000000), (0, (10**9 / 2) / 1000))
+        WVPASSEQ(xstat.nsecs_to_timeval(1500000000), (1, (10**9 / 2) / 1000))
+        WVPASSEQ(xstat.nsecs_to_timeval(-10**9), (-1, 0))
+        WVPASSEQ(xstat.nsecs_to_timeval(-500000000), (-1, (10**9 / 2) / 1000))
+        WVPASSEQ(xstat.nsecs_to_timeval(-1500000000), (-2, (10**9 / 2) / 1000))
+        x = xstat.nsecs_to_timeval(1977777778)
+        WVPASSEQ(type(x[0]), type(0))
+        WVPASSEQ(type(x[1]), type(0))
+        x = xstat.nsecs_to_timeval(-1977777778)
+        WVPASSEQ(type(x[0]), type(0))
+        WVPASSEQ(type(x[1]), type(0))
+
+        WVPASSEQ(xstat.fstime_floor_secs(0), 0)
+        WVPASSEQ(xstat.fstime_floor_secs(10**9 / 2), 0)
+        WVPASSEQ(xstat.fstime_floor_secs(10**9), 1)
+        WVPASSEQ(xstat.fstime_floor_secs(-10**9 / 2), -1)
+        WVPASSEQ(xstat.fstime_floor_secs(-10**9), -1)
+        WVPASSEQ(type(xstat.fstime_floor_secs(10**9 / 2)), type(0))
+        WVPASSEQ(type(xstat.fstime_floor_secs(-10**9 / 2)), type(0))
+
+
+@wvtest
+def test_bup_utimensat():
+    if not xstat._bup_utimensat:
+        return
+    with no_lingering_errors():
+        with test_tempdir(b'bup-txstat-') as tmpdir:
+            path = tmpdir + b'/foo'
+            open(path, 'w').close()
+            frac_ts = (0, 10**9 // 2)
+            xstat._bup_utimensat(_helpers.AT_FDCWD, path, (frac_ts, frac_ts), 0)
+            st = _helpers.stat(path)
+            atime_ts = st[8]
+            mtime_ts = st[9]
+            WVPASSEQ(atime_ts[0], 0)
+            WVPASS(atime_ts[1] == 0 or atime_ts[1] == frac_ts[1])
+            WVPASSEQ(mtime_ts[0], 0)
+            WVPASS(mtime_ts[1] == 0 or mtime_ts[1] == frac_ts[1])
+
+
+@wvtest
+def test_bup_utimes():
+    if not xstat._bup_utimes:
+        return
+    with no_lingering_errors():
+        with test_tempdir(b'bup-txstat-') as tmpdir:
+            path = tmpdir + b'/foo'
+            open(path, 'w').close()
+            frac_ts = (0, 10**6 // 2)
+            xstat._bup_utimes(path, (frac_ts, frac_ts))
+            st = _helpers.stat(path)
+            atime_ts = st[8]
+            mtime_ts = st[9]
+            WVPASSEQ(atime_ts[0], 0)
+            WVPASS(atime_ts[1] == 0 or atime_ts[1] == frac_ts[1] * 1000)
+            WVPASSEQ(mtime_ts[0], 0)
+            WVPASS(mtime_ts[1] == 0 or mtime_ts[1] == frac_ts[1] * 1000)
+
+
+@wvtest
+def test_bup_lutimes():
+    if not xstat._bup_lutimes:
+        return
+    with no_lingering_errors():
+        with test_tempdir(b'bup-txstat-') as tmpdir:
+            path = tmpdir + b'/foo'
+            open(path, 'w').close()
+            frac_ts = (0, 10**6 // 2)
+            xstat._bup_lutimes(path, (frac_ts, frac_ts))
+            st = _helpers.stat(path)
+            atime_ts = st[8]
+            mtime_ts = st[9]
+            WVPASSEQ(atime_ts[0], 0)
+            WVPASS(atime_ts[1] == 0 or atime_ts[1] == frac_ts[1] * 1000)
+            WVPASSEQ(mtime_ts[0], 0)
+            WVPASS(mtime_ts[1] == 0 or mtime_ts[1] == frac_ts[1] * 1000)
diff --git a/test/lib/buptest/__init__.py b/test/lib/buptest/__init__.py
new file mode 100644 (file)
index 0000000..5b7bf13
--- /dev/null
@@ -0,0 +1,104 @@
+
+from __future__ import absolute_import, print_function
+from collections import namedtuple
+from contextlib import contextmanager
+from os.path import abspath, basename, dirname, realpath
+from pipes import quote
+from subprocess import PIPE, Popen
+from traceback import extract_stack
+import errno, os, subprocess, sys, tempfile
+
+from wvtest import WVPASSEQ, wvfailure_count
+
+from bup import helpers
+from bup.compat import fsencode, str_type
+from bup.io import byte_stream
+
+
+@contextmanager
+def no_lingering_errors():
+    def fail_if_errors():
+        if helpers.saved_errors:
+            bt = extract_stack()
+            src_file, src_line, src_func, src_txt = bt[-4]
+            msg = 'saved_errors ' + repr(helpers.saved_errors)
+            print('! %-70s %s' % ('%s:%-4d %s' % (basename(src_file),
+                                                  src_line,
+                                                  msg),
+                                  'FAILED'))
+            sys.stdout.flush()
+    fail_if_errors()
+    helpers.clear_errors()
+    yield
+    fail_if_errors()
+    helpers.clear_errors()
+
+
+# Assumes (of course) this file is at the top-level of the source tree
+_bup_tmp = realpath(dirname(fsencode(__file__))) + b'/test/tmp'
+try:
+    os.makedirs(_bup_tmp)
+except OSError as e:
+    if e.errno != errno.EEXIST:
+        raise
+
+
+@contextmanager
+def test_tempdir(prefix):
+    initial_failures = wvfailure_count()
+    tmpdir = tempfile.mkdtemp(dir=_bup_tmp, prefix=prefix)
+    yield tmpdir
+    if wvfailure_count() == initial_failures:
+        subprocess.call(['chmod', '-R', 'u+rwX', tmpdir])
+        subprocess.call(['rm', '-rf', tmpdir])
+
+
+ex_res = namedtuple('SubprocResult', ['out', 'err', 'proc', 'rc'])
+
+def run(cmd, check=True, input=None, **kwargs):
+    """Run a subprocess as per subprocess.Popen(cmd, **kwargs) followed by
+    communicate(input=input).  If check is true, then throw an
+    exception if the subprocess exits with non-zero status.  Return a
+    SubprocResult tuple.
+
+    """
+    if input:
+        assert 'stdin' not in kwargs
+        kwargs['stdin'] = PIPE
+    p = Popen(cmd, **kwargs)
+    out, err = p.communicate(input=input)
+    if check and p.returncode != 0:
+        raise Exception('subprocess %r failed with status %d%s'
+                        % (cmd, p.returncode,
+                           (', stderr: %r' % err) if err else ''))
+    return ex_res(out=out, err=err, proc=p, rc=p.returncode)
+
+def logcmd(cmd):
+    s = helpers.shstr(cmd)
+    if isinstance(cmd, str_type):
+        print(s, file=sys.stderr)
+    else:
+        # bytes - for now just escape it
+        print(s.decode(errors='backslashreplace'), file=sys.stderr)
+
+def ex(cmd, **kwargs):
+    """Print cmd to stderr and then run it as per ex(...).
+    Print the subprocess stderr to stderr if stderr=PIPE and there's
+    any data.
+    """
+    logcmd(cmd)
+    result = run(cmd, **kwargs)
+    if result.err:
+        sys.stderr.flush()
+        byte_stream(sys.stderr).write(result.err)
+    return result
+
+def exo(cmd, **kwargs):
+    """Print cmd to stderr and then run it as per ex(..., stdout=PIPE).
+    Print the subprocess stderr to stderr if stderr=PIPE and there's
+    any data.
+
+    """
+    assert 'stdout' not in kwargs
+    kwargs['stdout'] = PIPE
+    return ex(cmd, **kwargs)
diff --git a/test/lib/buptest/vfs.py b/test/lib/buptest/vfs.py
new file mode 100644 (file)
index 0000000..db2e9f4
--- /dev/null
@@ -0,0 +1,47 @@
+
+from __future__ import absolute_import, print_function
+from collections import namedtuple
+from stat import S_ISDIR
+
+from bup import vfs
+from bup.metadata import Metadata
+from bup.git import BUP_CHUNKED
+
+TreeDictValue = namedtuple('TreeDictValue', ('name', 'oid', 'meta'))
+
+def tree_items(repo, oid):
+    """Yield (name, entry_oid, meta) for each entry in oid.  meta will be
+    a Metadata object for any non-directories and for '.', otherwise
+    None.
+
+    """
+    # This is a simpler approach than the one in the vfs, used to
+    # cross-check its behavior.
+    tree_data, bupm_oid = vfs.tree_data_and_bupm(repo, oid)
+    bupm = vfs._FileReader(repo, bupm_oid) if bupm_oid else None
+    try:
+        maybe_meta = lambda : Metadata.read(bupm) if bupm else None
+        m = maybe_meta()
+        if m and m.size is None:
+            m.size = 0
+        yield TreeDictValue(name=b'.', oid=oid, meta=m)
+        tree_ents = vfs.ordered_tree_entries(tree_data, bupm=True)
+        for name, mangled_name, kind, gitmode, sub_oid in tree_ents:
+            if mangled_name == b'.bupm':
+                continue
+            assert name != b'.'
+            if S_ISDIR(gitmode):
+                if kind == BUP_CHUNKED:
+                    yield TreeDictValue(name=name, oid=sub_oid,
+                                        meta=maybe_meta())
+                else:
+                    yield TreeDictValue(name=name, oid=sub_oid,
+                                        meta=vfs.default_dir_mode)
+            else:
+                yield TreeDictValue(name=name, oid=sub_oid, meta=maybe_meta())
+    finally:
+        if bupm:
+            bupm.close()
+
+def tree_dict(repo, oid):
+    return dict((x.name, x) for x in tree_items(repo, oid))
diff --git a/test/sampledata/b2/foozy b/test/sampledata/b2/foozy
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/test/sampledata/b2/foozy2 b/test/sampledata/b2/foozy2
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/test/sampledata/x b/test/sampledata/x
new file mode 100644 (file)
index 0000000..bd5e1be
--- /dev/null
@@ -0,0 +1 @@
+Sun Jan  3 01:54:26 EST 2010
diff --git a/test/sampledata/y-2000 b/test/sampledata/y-2000
new file mode 100644 (file)
index 0000000..db94cc3
--- /dev/null
@@ -0,0 +1,2 @@
+this file should come *before* y/ in the sort order, because of that
+trailing slash.
diff --git a/test/sampledata/y/testfile1 b/test/sampledata/y/testfile1
new file mode 100644 (file)
index 0000000..31ee979
--- /dev/null
@@ -0,0 +1,5580 @@
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg bcgvbaf, qerphefr
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc qerphefr <cngu>
+--
+k,kqri,bar-svyr-flfgrz   qba'g pebff svyrflfgrz obhaqnevrf
+d,dhvrg  qba'g npghnyyl cevag svyranzrf
+cebsvyr  eha haqre gur clguba cebsvyre
+"""
+b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar svyranzr rkcrpgrq")
+
+vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
+vs bcg.cebsvyr:
+    vzcbeg pCebsvyr
+    qrs qb_vg():
+        sbe v va vg:
+            cnff
+    pCebsvyr.eha('qb_vg()')
+ryfr:
+    vs bcg.dhvrg:
+        sbe v va vg:
+            cnff
+    ryfr:
+        sbe (anzr,fg) va vg:
+            cevag anzr
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+o,oybof    bhgchg n frevrf bs oybo vqf
+g,gerr     bhgchg n gerr vq
+p,pbzzvg   bhgchg n pbzzvg vq
+a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
+A,abbc     qba'g npghnyyl fnir gur qngn naljurer
+d,dhvrg    qba'g cevag cebterff zrffntrf
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+pbcl       whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
+orapu      cevag orapuznex gvzvatf gb fgqree
+znk-cnpx-fvmr=  znkvzhz olgrf va n fvatyr cnpx
+znk-cnpx-bowrpgf=  znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
+snabhg=  znkvzhz ahzore bs oybof va n fvatyr gerr
+"""
+b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
+        bcg.abbc be bcg.pbcl):
+    b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
+vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be 
+                               bcg.pbzzvg be bcg.anzr):
+    b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
+
+vs bcg.ireobfr >= 2:
+    tvg.ireobfr = bcg.ireobfr - 1
+    bcg.orapu = 1
+vs bcg.znk_cnpx_fvmr:
+    unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
+vs bcg.znk_cnpx_bowrpgf:
+    unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
+vs bcg.snabhg:
+    unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
+vs bcg.oybof:
+    unfufcyvg.snabhg = 0
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+fgneg_gvzr = gvzr.gvzr()
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.abbc be bcg.pbcl:
+    pyv = j = byqers = Abar
+ryvs bcg.erzbgr be vf_erirefr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+    j = pyv.arj_cnpxjevgre()
+ryfr:
+    pyv = Abar
+    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+    j = tvg.CnpxJevgre()
+
+svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
+vs j:
+    funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
+    gerr = j.arj_gerr(funyvfg)
+ryfr:
+    ynfg = 0
+    sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
+        unfufcyvg.gbgny_fcyvg += yra(oybo)
+        vs bcg.pbcl:
+            flf.fgqbhg.jevgr(fge(oybo))
+        zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
+        vs abg bcg.dhvrg naq ynfg != zrtf:
+            cebterff('%q Zolgrf ernq\e' % zrtf)
+            ynfg = zrtf
+    cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
+
+vs bcg.ireobfr:
+    ybt('\a')
+vs bcg.oybof:
+    sbe (zbqr,anzr,ova) va funyvfg:
+        cevag ova.rapbqr('urk')
+vs bcg.gerr:
+    cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+    zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+    vs bcg.pbzzvg:
+        cevag pbzzvg.rapbqr('urk')
+
+vs j:
+    j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
+        
+vs bcg.anzr:
+    vs pyv:
+        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+    ryfr:
+        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+    pyv.pybfr()
+
+frpf = gvzr.gvzr() - fgneg_gvzr
+fvmr = unfufcyvg.gbgny_fcyvg
+vs bcg.orapu:
+    ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
+        % (fvmr/1024., frpf, fvmr/1024./frpf))
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, fgehpg, zznc
+sebz ohc vzcbeg tvg, bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs f_sebz_olgrf(olgrf):
+    pyvfg = [pue(o) sbe o va olgrf]
+    erghea ''.wbva(pyvfg)
+
+
+qrs ercbeg(pbhag):
+    svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
+    q = {}
+    sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
+        y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
+        q[y[0]] = y[1]
+    vs pbhag >= 0:
+        r1 = pbhag
+        svryqf = [q[x] sbe x va svryqf]
+    ryfr:
+        r1 = ''
+    cevag ('%9f  ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
+    flf.fgqbhg.syhfu()
+
+
+bcgfcrp = """
+ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
+--
+a,ahzore=  ahzore bs bowrpgf cre plpyr
+p,plpyrf=  ahzore bs plpyrf gb eha
+vtaber-zvqk  vtaber .zvqk svyrf, hfr bayl .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+tvg.vtaber_zvqk = bcg.vtaber_zvqk
+
+tvg.purpx_ercb_be_qvr()
+z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+
+plpyrf = bcg.plpyrf be 100
+ahzore = bcg.ahzore be 10000
+
+ercbeg(-1)
+s = bcra('/qri/henaqbz')
+n = zznc.zznc(-1, 20)
+ercbeg(0)
+sbe p va kenatr(plpyrf):
+    sbe a va kenatr(ahzore):
+        o = s.ernq(3)
+        vs 0:
+            olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
+            olgrf[2] &= 0ks0
+            ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
+        ryfr:
+            n[0:2] = o[0:2]
+            n[2] = pue(beq(o[2]) & 0ks0)
+            ova = fge(n[0:20])
+        #cevag ova.rapbqr('urk')
+        z.rkvfgf(ova)
+    ercbeg((p+1)*ahzore)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+qrs cevag_abqr(grkg, a):
+    cersvk = ''
+    vs bcg.unfu:
+        cersvk += "%f " % a.unfu.rapbqr('urk')
+    vs fgng.F_VFQVE(a.zbqr):
+        cevag '%f%f/' % (cersvk, grkg)
+    ryvs fgng.F_VFYAX(a.zbqr):
+        cevag '%f%f@' % (cersvk, grkg)
+    ryfr:
+        cevag '%f%f' % (cersvk, grkg)
+
+
+bcgfcrp = """
+ohc yf <qvef...>
+--
+f,unfu   fubj unfu sbe rnpu svyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+
+vs abg rkgen:
+    rkgen = ['/']
+
+erg = 0
+sbe q va rkgen:
+    gel:
+        a = gbc.yerfbyir(q)
+        vs fgng.F_VFQVE(a.zbqr):
+            sbe fho va a:
+                cevag_abqr(fho.anzr, fho)
+        ryfr:
+            cevag_abqr(q, a)
+    rkprcg isf.AbqrReebe, r:
+        ybt('reebe: %f\a' % r)
+        erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
+sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
+sebz ohc.urycref vzcbeg *
+
+qrs abqr_anzr(grkg, a):
+    vs fgng.F_VFQVE(a.zbqr):
+        erghea '%f/' % grkg
+    ryvs fgng.F_VFYAX(a.zbqr):
+        erghea '%f@' % grkg
+    ryfr:
+        erghea '%f' % grkg
+
+
+qrs qb_yf(cngu, a):
+    y = []
+    vs fgng.F_VFQVE(a.zbqr):
+        sbe fho va a:
+            y.nccraq(abqr_anzr(fho.anzr, fho))
+    ryfr:
+        y.nccraq(abqr_anzr(cngu, a))
+    cevag pbyhzangr(y, '')
+    
+
+qrs jevgr_gb_svyr(vas, bhgs):
+    sbe oybo va puhaxlernqre(vas):
+        bhgs.jevgr(oybo)
+    
+
+qrs vachgvgre():
+    vs bf.vfnggl(flf.fgqva.svyrab()):
+        juvyr 1:
+            gel:
+                lvryq enj_vachg('ohc> ')
+            rkprcg RBSReebe:
+                oernx
+    ryfr:
+        sbe yvar va flf.fgqva:
+            lvryq yvar
+
+
+qrs _pbzcyrgre_trg_fhof(yvar):
+    (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
+    (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
+    #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
+    a = cjq.erfbyir(qve)
+    fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
+                       a.fhof()))
+    erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
+
+
+_ynfg_yvar = Abar
+_ynfg_erf = Abar
+qrs pbzcyrgre(grkg, fgngr):
+    tybony _ynfg_yvar
+    tybony _ynfg_erf
+    gel:
+        yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
+        vs _ynfg_yvar != yvar:
+            _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
+            _ynfg_yvar = yvar
+        (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
+        vs fgngr < yra(fhof):
+            fa = fhof[fgngr]
+            fa1 = fa.erfbyir('')  # qrers flzyvaxf
+            shyyanzr = bf.cngu.wbva(qve, fa.anzr)
+            vs fgng.F_VFQVE(fa1.zbqr):
+                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
+                                          grezvangr=Snyfr)
+            ryfr:
+                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
+                                          grezvangr=Gehr) + ' '
+            erghea grkg + erg
+    rkprcg Rkprcgvba, r:
+        ybt('\areebe va pbzcyrgvba: %f\a' % r)
+
+            
+bcgfcrp = """
+ohc sgc
+"""
+b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+gbc = isf.ErsYvfg(Abar)
+cjq = gbc
+
+vs rkgen:
+    yvarf = rkgen
+ryfr:
+    ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
+    ernqyvar.frg_pbzcyrgre(pbzcyrgre)
+    ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
+    yvarf = vachgvgre()
+
+sbe yvar va yvarf:
+    vs abg yvar.fgevc():
+        pbagvahr
+    jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
+    pzq = jbeqf[0].ybjre()
+    #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
+    gel:
+        vs pzq == 'yf':
+            sbe cnez va (jbeqf[1:] be ['.']):
+                qb_yf(cnez, cjq.erfbyir(cnez))
+        ryvs pzq == 'pq':
+            sbe cnez va jbeqf[1:]:
+                cjq = cjq.erfbyir(cnez)
+        ryvs pzq == 'cjq':
+            cevag cjq.shyyanzr()
+        ryvs pzq == 'png':
+            sbe cnez va jbeqf[1:]:
+                jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
+        ryvs pzq == 'trg':
+            vs yra(jbeqf) abg va [2,3]:
+                envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
+            eanzr = jbeqf[1]
+            (qve,onfr) = bf.cngu.fcyvg(eanzr)
+            yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
+            vas = cjq.erfbyir(eanzr).bcra()
+            ybt('Fnivat %e\a' % yanzr)
+            jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
+        ryvs pzq == 'ztrg':
+            sbe cnez va jbeqf[1:]:
+                (qve,onfr) = bf.cngu.fcyvg(cnez)
+                sbe a va cjq.erfbyir(qve).fhof():
+                    vs sazngpu.sazngpu(a.anzr, onfr):
+                        gel:
+                            ybt('Fnivat %e\a' % a.anzr)
+                            vas = a.bcra()
+                            bhgs = bcra(a.anzr, 'jo')
+                            jevgr_gb_svyr(vas, bhgs)
+                            bhgs.pybfr()
+                        rkprcg Rkprcgvba, r:
+                            ybt('  reebe: %f\a' % r)
+        ryvs pzq == 'uryc' be pzq == '?':
+            ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
+        ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
+            oernx
+        ryfr:
+            envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
+    rkprcg Rkprcgvba, r:
+        ybt('reebe: %f\a' % r)
+        #envfr
+#!/hfe/ova/rai clguba
+vzcbeg flf, zznc
+sebz ohc vzcbeg bcgvbaf, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc enaqbz [-F frrq] <ahzolgrf>
+--
+F,frrq=   bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
+s,sbepr   cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
+"""
+b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+gbgny = cnefr_ahz(rkgen[0])
+
+vs bcg.sbepr be (abg bf.vfnggl(1) naq
+                 abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
+    _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
+ryfr:
+    ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc uryc <pbzznaq>
+"""
+b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) == 0:
+    # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
+    bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
+ryvs yra(rkgen) == 1:
+    qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
+    rkr = flf.neti[0]
+    (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
+    znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
+    t = tybo.tybo(znacngu)
+    vs t:
+        bf.rkrpic('zna', ['zna', '-y', t[0]])
+    ryfr:
+        bf.rkrpic('zna', ['zna', qbpanzr])
+ryfr:
+    b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+
+pynff Fgng(shfr.Fgng):
+    qrs __vavg__(frys):
+        frys.fg_zbqr = 0
+        frys.fg_vab = 0
+        frys.fg_qri = 0
+        frys.fg_ayvax = 0
+        frys.fg_hvq = 0
+        frys.fg_tvq = 0
+        frys.fg_fvmr = 0
+        frys.fg_ngvzr = 0
+        frys.fg_zgvzr = 0
+        frys.fg_pgvzr = 0
+        frys.fg_oybpxf = 0
+        frys.fg_oyxfvmr = 0
+        frys.fg_eqri = 0
+
+
+pnpur = {}
+qrs pnpur_trg(gbc, cngu):
+    cnegf = cngu.fcyvg('/')
+    pnpur[('',)] = gbc
+    p = Abar
+    znk = yra(cnegf)
+    #ybt('pnpur: %e\a' % pnpur.xrlf())
+    sbe v va enatr(znk):
+        cer = cnegf[:znk-v]
+        #ybt('pnpur gelvat: %e\a' % cer)
+        p = pnpur.trg(ghcyr(cer))
+        vs p:
+            erfg = cnegf[znk-v:]
+            sbe e va erfg:
+                #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
+                p = p.yerfbyir(e)
+                xrl = ghcyr(cer + [e])
+                #ybt('fnivat: %e\a' % (xrl,))
+                pnpur[xrl] = p
+            oernx
+    nffreg(p)
+    erghea p
+        
+    
+
+pynff OhcSf(shfr.Shfr):
+    qrs __vavg__(frys, gbc):
+        shfr.Shfr.__vavg__(frys)
+        frys.gbc = gbc
+    
+    qrs trgngge(frys, cngu):
+        ybt('--trgngge(%e)\a' % cngu)
+        gel:
+            abqr = pnpur_trg(frys.gbc, cngu)
+            fg = Fgng()
+            fg.fg_zbqr = abqr.zbqr
+            fg.fg_ayvax = abqr.ayvaxf()
+            fg.fg_fvmr = abqr.fvmr()
+            fg.fg_zgvzr = abqr.zgvzr
+            fg.fg_pgvzr = abqr.pgvzr
+            fg.fg_ngvzr = abqr.ngvzr
+            erghea fg
+        rkprcg isf.AbFhpuSvyr:
+            erghea -reeab.RABRAG
+
+    qrs ernqqve(frys, cngu, bssfrg):
+        ybt('--ernqqve(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        lvryq shfr.Qveragel('.')
+        lvryq shfr.Qveragel('..')
+        sbe fho va abqr.fhof():
+            lvryq shfr.Qveragel(fho.anzr)
+
+    qrs ernqyvax(frys, cngu):
+        ybt('--ernqyvax(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        erghea abqr.ernqyvax()
+
+    qrs bcra(frys, cngu, syntf):
+        ybt('--bcra(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
+        vs (syntf & nppzbqr) != bf.B_EQBAYL:
+            erghea -reeab.RNPPRF
+        abqr.bcra()
+
+    qrs eryrnfr(frys, cngu, syntf):
+        ybt('--eryrnfr(%e)\a' % cngu)
+
+    qrs ernq(frys, cngu, fvmr, bssfrg):
+        ybt('--ernq(%e)\a' % cngu)
+        a = pnpur_trg(frys.gbc, cngu)
+        b = a.bcra()
+        b.frrx(bssfrg)
+        erghea b.ernq(fvmr)
+
+
+vs abg unfngge(shfr, '__irefvba__'):
+    envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
+shfr.shfr_clguba_ncv = (0, 2)
+
+
+bcgfcrp = """
+ohc shfr [-q] [-s] <zbhagcbvag>
+--
+q,qroht   vapernfr qroht yriry
+s,sbertebhaq  eha va sbertebhaq
+"""
+b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+s = OhcSf(gbc)
+s.shfr_netf.zbhagcbvag = rkgen[0]
+vs bcg.qroht:
+    s.shfr_netf.nqq('qroht')
+vs bcg.sbertebhaq:
+    s.shfr_netf.frgzbq('sbertebhaq')
+cevag s.zhygvguernqrq
+s.zhygvguernqrq = Snyfr
+
+s.znva()
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+
+vs bcg.erzbgr:
+    tvg.vavg_ercb()  # ybpny ercb
+    tvg.purpx_ercb_be_qvr()
+    pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
+    pyv.pybfr()
+ryfr:
+    tvg.vavg_ercb()
+#!/hfe/ova/rai clguba
+vzcbeg flf, zngu, fgehpg, tybo
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+CNTR_FVMR=4096
+FUN_CRE_CNTR=CNTR_FVMR/200.
+
+
+qrs zretr(vqkyvfg, ovgf, gnoyr):
+    pbhag = 0
+    sbe r va tvg.vqkzretr(vqkyvfg):
+        pbhag += 1
+        cersvk = tvg.rkgenpg_ovgf(r, ovgf)
+        gnoyr[cersvk] = pbhag
+        lvryq r
+
+
+qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
+    vs abg bhgsvyranzr:
+        nffreg(bhgqve)
+        fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
+        bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
+    
+    vac = []
+    gbgny = 0
+    sbe anzr va vasvyranzrf:
+        vk = tvg.CnpxVqk(anzr)
+        vac.nccraq(vk)
+        gbgny += yra(vk)
+
+    ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
+    vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
+       be (bcg.sbepr naq abg gbgny):
+        ybt('zvqk: abguvat gb qb.\a')
+        erghea
+
+    cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
+    ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
+    ragevrf = 2**ovgf
+    ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
+    
+    gnoyr = [0]*ragevrf
+
+    gel:
+        bf.hayvax(bhgsvyranzr)
+    rkprcg BFReebe:
+        cnff
+    s = bcra(bhgsvyranzr + '.gzc', 'j+')
+    s.jevgr('ZVQK\0\0\0\2')
+    s.jevgr(fgehpg.cnpx('!V', ovgf))
+    nffreg(s.gryy() == 12)
+    s.jevgr('\0'*4*ragevrf)
+    
+    sbe r va zretr(vac, ovgf, gnoyr):
+        s.jevgr(r)
+        
+    s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
+
+    s.frrx(12)
+    s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
+    s.pybfr()
+    bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
+
+    # guvf vf whfg sbe grfgvat
+    vs 0:
+        c = tvg.CnpxZvqk(bhgsvyranzr)
+        nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
+        cevag c.vqkanzrf
+        nffreg(yra(c) == gbgny)
+        cv = vgre(c)
+        sbe v va zretr(vac, gbgny, ovgf, gnoyr):
+            nffreg(v == cv.arkg())
+            nffreg(c.rkvfgf(v))
+
+    cevag bhgsvyranzr
+
+bcgfcrp = """
+ohc zvqk [bcgvbaf...] <vqkanzrf...>
+--
+b,bhgchg=  bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
+n,nhgb     nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
+s,sbepr    nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen naq (bcg.nhgb be bcg.sbepr):
+    b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
+
+tvg.purpx_ercb_be_qvr()
+
+vs rkgen:
+    qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
+ryvs bcg.nhgb be bcg.sbepr:
+    cnguf = [tvg.ercb('bowrpgf/cnpx')]
+    cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
+    sbe cngu va cnguf:
+        ybt('zvqk: fpnaavat %f\a' % cngu)
+        vs bcg.sbepr:
+            qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
+        ryvs bcg.nhgb:
+            z = tvg.CnpxVqkYvfg(cngu)
+            arrqrq = {}
+            sbe cnpx va z.cnpxf:  # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
+                vs cnpx.anzr.raqfjvgu('.vqk'):
+                    arrqrq[cnpx.anzr] = 1
+            qry z
+            qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
+        ybt('\a')
+ryfr:
+    b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, enaqbz
+sebz ohc vzcbeg bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs enaqoybpx(a):
+    y = []
+    sbe v va kenatr(a):
+        y.nccraq(pue(enaqbz.enaqenatr(0,256)))
+    erghea ''.wbva(y)
+
+
+bcgfcrp = """
+ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
+--
+   JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
+a,ahz=   ahzore bs oybpxf gb qnzntr
+f,fvmr=  znkvzhz fvmr bs rnpu qnzntrq oybpx
+creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
+rdhny    fcernq qnzntr rirayl guebhtubhg gur svyr
+F,frrq=  enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
+"""
+b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg rkgen:
+    b.sngny('svyranzrf rkcrpgrq')
+
+vs bcg.frrq != Abar:
+    enaqbz.frrq(bcg.frrq)
+
+sbe anzr va rkgen:
+    ybt('Qnzntvat "%f"...\a' % anzr)
+    s = bcra(anzr, 'e+o')
+    fg = bf.sfgng(s.svyrab())
+    fvmr = fg.fg_fvmr
+    vs bcg.creprag be bcg.fvmr:
+        zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
+        zf2 = bcg.fvmr be fvmr
+        znkfvmr = zva(zf1, zf2)
+    ryfr:
+        znkfvmr = 1
+    puhaxf = bcg.ahz be 10
+    puhaxfvmr = fvmr/puhaxf
+    sbe e va enatr(puhaxf):
+        fm = enaqbz.enaqenatr(1, znkfvmr+1)
+        vs fm > fvmr:
+            fm = fvmr
+        vs bcg.rdhny:
+            bsf = e*puhaxfvmr
+        ryfr:
+            bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
+        ybt('  %6q olgrf ng %q\a' % (fm, bsf))
+        s.frrx(bsf)
+        s.jevgr(enaqoybpx(fm))
+    s.pybfr()
+#!/hfe/ova/rai clguba
+vzcbeg flf, fgehpg, zznc
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+fhfcraqrq_j = Abar
+
+
+qrs vavg_qve(pbaa, net):
+    tvg.vavg_ercb(net)
+    ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
+    pbaa.bx()
+
+
+qrs frg_qve(pbaa, net):
+    tvg.purpx_ercb_be_qvr(net)
+    ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
+    pbaa.bx()
+
+    
+qrs yvfg_vaqrkrf(pbaa, whax):
+    tvg.purpx_ercb_be_qvr()
+    sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
+        vs s.raqfjvgu('.vqk'):
+            pbaa.jevgr('%f\a' % s)
+    pbaa.bx()
+
+
+qrs fraq_vaqrk(pbaa, anzr):
+    tvg.purpx_ercb_be_qvr()
+    nffreg(anzr.svaq('/') < 0)
+    nffreg(anzr.raqfjvgu('.vqk'))
+    vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
+    pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
+    pbaa.jevgr(vqk.znc)
+    pbaa.bx()
+
+
+qrs erprvir_bowrpgf(pbaa, whax):
+    tybony fhfcraqrq_j
+    tvg.purpx_ercb_be_qvr()
+    fhttrfgrq = {}
+    vs fhfcraqrq_j:
+        j = fhfcraqrq_j
+        fhfcraqrq_j = Abar
+    ryfr:
+        j = tvg.CnpxJevgre()
+    juvyr 1:
+        af = pbaa.ernq(4)
+        vs abg af:
+            j.nobeg()
+            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
+        a = fgehpg.hacnpx('!V', af)[0]
+        #ybt('rkcrpgvat %q olgrf\a' % a)
+        vs abg a:
+            ybt('ohc freire: erprvirq %q bowrpg%f.\a' 
+                % (j.pbhag, j.pbhag!=1 naq "f" be ''))
+            shyycngu = j.pybfr()
+            vs shyycngu:
+                (qve, anzr) = bf.cngu.fcyvg(shyycngu)
+                pbaa.jevgr('%f.vqk\a' % anzr)
+            pbaa.bx()
+            erghea
+        ryvs a == 0kssssssss:
+            ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
+            fhfcraqrq_j = j
+            pbaa.bx()
+            erghea
+            
+        ohs = pbaa.ernq(a)  # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
+        #ybt('ernq %q olgrf\a' % a)
+        vs yra(ohs) < a:
+            j.nobeg()
+            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
+                            % (a, yra(ohs)))
+        (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
+        fun = tvg.pnyp_unfu(glcr, pbagrag)
+        byqcnpx = j.rkvfgf(fun)
+        # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
+        # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
+        # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
+        # ba gur freire fvqr.
+        vs abg fhttrfgrq naq \
+          byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
+            # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
+            # ng guvf ynlre.  Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
+            # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
+            # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
+            # znxr gur svyrf ovttre.  Guvf zrgubq vf pregnvayl abg irel
+            # rssvpvrag.
+            j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
+            byqcnpx = j.bowpnpur.rkvfgf(fun)
+            ybt('arj fhttrfgvba: %e\a' % byqcnpx)
+            nffreg(byqcnpx)
+            nffreg(byqcnpx != Gehr)
+            nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
+            j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
+        vs abg fhttrfgrq naq byqcnpx:
+            nffreg(byqcnpx.raqfjvgu('.vqk'))
+            (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
+            vs abg (anzr va fhttrfgrq):
+                ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
+                pbaa.jevgr('vaqrk %f\a' % anzr)
+                fhttrfgrq[anzr] = 1
+        ryfr:
+            j._enj_jevgr([ohs])
+    # ABGERNPURQ
+
+
+qrs ernq_ers(pbaa, ersanzr):
+    tvg.purpx_ercb_be_qvr()
+    e = tvg.ernq_ers(ersanzr)
+    pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
+    pbaa.bx()
+
+
+qrs hcqngr_ers(pbaa, ersanzr):
+    tvg.purpx_ercb_be_qvr()
+    arjiny = pbaa.ernqyvar().fgevc()
+    byqiny = pbaa.ernqyvar().fgevc()
+    tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
+    pbaa.bx()
+
+
+qrs png(pbaa, vq):
+    tvg.purpx_ercb_be_qvr()
+    gel:
+        sbe oybo va tvg.png(vq):
+            pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
+            pbaa.jevgr(oybo)
+    rkprcg XrlReebe, r:
+        ybt('freire: reebe: %f\a' % r)
+        pbaa.jevgr('\0\0\0\0')
+        pbaa.reebe(r)
+    ryfr:
+        pbaa.jevgr('\0\0\0\0')
+        pbaa.bx()
+
+
+bcgfcrp = """
+ohc freire
+"""
+b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+ybt('ohc freire: ernqvat sebz fgqva.\a')
+
+pbzznaqf = {
+    'vavg-qve': vavg_qve,
+    'frg-qve': frg_qve,
+    'yvfg-vaqrkrf': yvfg_vaqrkrf,
+    'fraq-vaqrk': fraq_vaqrk,
+    'erprvir-bowrpgf': erprvir_bowrpgf,
+    'ernq-ers': ernq_ers,
+    'hcqngr-ers': hcqngr_ers,
+    'png': png,
+}
+
+# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
+# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
+pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
+ye = yvarernqre(pbaa)
+sbe _yvar va ye:
+    yvar = _yvar.fgevc()
+    vs abg yvar:
+        pbagvahr
+    ybt('ohc freire: pbzznaq: %e\a' % yvar)
+    jbeqf = yvar.fcyvg(' ', 1)
+    pzq = jbeqf[0]
+    erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
+    vs pzq == 'dhvg':
+        oernx
+    ryfr:
+        pzq = pbzznaqf.trg(pzq)
+        vs pzq:
+            pzq(pbaa, erfg)
+        ryfr:
+            envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
+
+ybt('ohc freire: qbar\a')
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+    rkgen = yvarernqre(flf.fgqva)
+
+erg = 0
+
+vs bcg.erzbgr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    png = pyv.png
+ryfr:
+    pc = tvg.PngCvcr()
+    png = pc.wbva
+
+sbe vq va rkgen:
+    gel:
+        sbe oybo va png(vq):
+            flf.fgqbhg.jevgr(oybo)
+    rkprcg XrlReebe, r:
+        flf.fgqbhg.syhfu()
+        ybt('reebe: %f\a' % r)
+        erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, reeab, fgng, gvzr, zngu
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc fnir [-gp] [-a anzr] <svyranzrf...>
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+g,gerr     bhgchg n gerr vq
+p,pbzzvg   bhgchg n pbzzvg vq
+a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+d,dhvrg    qba'g fubj cebterff zrgre
+fznyyre=   bayl onpx hc svyrf fznyyre guna a olgrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
+    b.sngny("hfr bar be zber bs -g, -p, -a")
+vs abg rkgen:
+    b.sngny("ab svyranzrf tvira")
+
+bcg.cebterff = (vfggl naq abg bcg.dhvrg)
+bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.erzbgr be vf_erirefr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+    j = pyv.arj_cnpxjevgre()
+ryfr:
+    pyv = Abar
+    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+    j = tvg.CnpxJevgre()
+
+unaqyr_pgey_p()
+
+
+qrs rngfynfu(qve):
+    vs qve.raqfjvgu('/'):
+        erghea qve[:-1]
+    ryfr:
+        erghea qve
+
+
+cnegf = ['']
+funyvfgf = [[]]
+
+qrs _chfu(cneg):
+    nffreg(cneg)
+    cnegf.nccraq(cneg)
+    funyvfgf.nccraq([])
+
+qrs _cbc(sbepr_gerr):
+    nffreg(yra(cnegf) >= 1)
+    cneg = cnegf.cbc()
+    funyvfg = funyvfgf.cbc()
+    gerr = sbepr_gerr be j.arj_gerr(funyvfg)
+    vs funyvfgf:
+        funyvfgf[-1].nccraq(('40000', cneg, gerr))
+    ryfr:  # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
+        funyvfgf.nccraq(funyvfg)
+    erghea gerr
+
+ynfgerznva = Abar
+qrs cebterff_ercbeg(a):
+    tybony pbhag, fhopbhag, ynfgerznva
+    fhopbhag += a
+    pp = pbhag + fhopbhag
+    cpg = gbgny naq (pp*100.0/gbgny) be 0
+    abj = gvzr.gvzr()
+    ryncfrq = abj - gfgneg
+    xcf = ryncfrq naq vag(pp/1024./ryncfrq)
+    xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
+    xcf = vag(xcf/xcf_senp)*xcf_senp
+    vs pp:
+        erznva = ryncfrq*1.0/pp * (gbgny-pp)
+    ryfr:
+        erznva = 0.0
+    vs (ynfgerznva naq (erznva > ynfgerznva)
+          naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
+        erznva = ynfgerznva
+    ryfr:
+        ynfgerznva = erznva
+    ubhef = vag(erznva/60/60)
+    zvaf = vag(erznva/60 - ubhef*60)
+    frpf = vag(erznva - ubhef*60*60 - zvaf*60)
+    vs ryncfrq < 30:
+        erznvafge = ''
+        xcffge = ''
+    ryfr:
+        xcffge = '%qx/f' % xcf
+        vs ubhef:
+            erznvafge = '%qu%qz' % (ubhef, zvaf)
+        ryvs zvaf:
+            erznvafge = '%qz%q' % (zvaf, frpf)
+        ryfr:
+            erznvafge = '%qf' % frpf
+    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
+             % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
+                erznvafge, xcffge))
+
+
+e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
+
+qrs nyernql_fnirq(rag):
+    erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
+
+qrs jnagerphefr_cer(rag):
+    erghea abg nyernql_fnirq(rag)
+
+qrs jnagerphefr_qhevat(rag):
+    erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
+
+gbgny = sgbgny = 0
+vs bcg.cebterff:
+    sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
+        vs abg (sgbgny % 10024):
+            cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
+        rkvfgf = rag.rkvfgf()
+        unfuinyvq = nyernql_fnirq(rag)
+        rag.frg_fun_zvffvat(abg unfuinyvq)
+        vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
+            vs rkvfgf naq abg unfuinyvq:
+                gbgny += rag.fvmr
+        sgbgny += 1
+    cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
+    unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
+
+gfgneg = gvzr.gvzr()
+pbhag = fhopbhag = spbhag = 0
+ynfgfxvc_anzr = Abar
+ynfgqve = ''
+sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
+    (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
+    rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
+    unfuinyvq = nyernql_fnirq(rag)
+    jnfzvffvat = rag.fun_zvffvat()
+    byqfvmr = rag.fvmr
+    vs bcg.ireobfr:
+        vs abg rkvfgf:
+            fgnghf = 'Q'
+        ryvs abg unfuinyvq:
+            vs rag.fun == vaqrk.RZCGL_FUN:
+                fgnghf = 'N'
+            ryfr:
+                fgnghf = 'Z'
+        ryfr:
+            fgnghf = ' '
+        vs bcg.ireobfr >= 2:
+            ybt('%f %-70f\a' % (fgnghf, rag.anzr))
+        ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
+            vs abg ynfgqve.fgnegfjvgu(qve):
+                ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
+            ynfgqve = qve
+
+    vs bcg.cebterff:
+        cebterff_ercbeg(0)
+    spbhag += 1
+    
+    vs abg rkvfgf:
+        pbagvahr
+    vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
+        vs rkvfgf naq abg unfuinyvq:
+            nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
+            ynfgfxvc_anzr = rag.anzr
+        pbagvahr
+
+    nffreg(qve.fgnegfjvgu('/'))
+    qvec = qve.fcyvg('/')
+    juvyr cnegf > qvec:
+        _cbc(sbepr_gerr = Abar)
+    vs qve != '/':
+        sbe cneg va qvec[yra(cnegf):]:
+            _chfu(cneg)
+
+    vs abg svyr:
+        # ab svyranzr cbegvba zrnaf guvf vf n fhoqve.  Ohg
+        # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
+        byqgerr = nyernql_fnirq(rag) # znl or Abar
+        arjgerr = _cbc(sbepr_gerr = byqgerr)
+        vs abg byqgerr:
+            vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
+                rag.vainyvqngr()
+            ryfr:
+                rag.inyvqngr(040000, arjgerr)
+            rag.ercnpx()
+        vs rkvfgf naq jnfzvffvat:
+            pbhag += byqfvmr
+        pbagvahr
+
+    # vg'f abg n qverpgbel
+    vq = Abar
+    vs unfuinyvq:
+        zbqr = '%b' % rag.tvgzbqr
+        vq = rag.fun
+        funyvfgf[-1].nccraq((zbqr, 
+                             tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+                             vq))
+    ryfr:
+        vs fgng.F_VFERT(rag.zbqr):
+            gel:
+                s = unfufcyvg.bcra_abngvzr(rag.anzr)
+            rkprcg VBReebe, r:
+                nqq_reebe(r)
+                ynfgfxvc_anzr = rag.anzr
+            rkprcg BFReebe, r:
+                nqq_reebe(r)
+                ynfgfxvc_anzr = rag.anzr
+            ryfr:
+                (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
+        ryfr:
+            vs fgng.F_VFQVE(rag.zbqr):
+                nffreg(0)  # unaqyrq nobir
+            ryvs fgng.F_VFYAX(rag.zbqr):
+                gel:
+                    ey = bf.ernqyvax(rag.anzr)
+                rkprcg BFReebe, r:
+                    nqq_reebe(r)
+                    ynfgfxvc_anzr = rag.anzr
+                rkprcg VBReebe, r:
+                    nqq_reebe(r)
+                    ynfgfxvc_anzr = rag.anzr
+                ryfr:
+                    (zbqr, vq) = ('120000', j.arj_oybo(ey))
+            ryfr:
+                nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
+                ynfgfxvc_anzr = rag.anzr
+        vs vq:
+            rag.inyvqngr(vag(zbqr, 8), vq)
+            rag.ercnpx()
+            funyvfgf[-1].nccraq((zbqr,
+                                 tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+                                 vq))
+    vs rkvfgf naq jnfzvffvat:
+        pbhag += byqfvmr
+        fhopbhag = 0
+
+
+vs bcg.cebterff:
+    cpg = gbgny naq pbhag*100.0/gbgny be 100
+    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar.    \a'
+             % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
+
+juvyr yra(cnegf) > 1:
+    _cbc(sbepr_gerr = Abar)
+nffreg(yra(funyvfgf) == 1)
+gerr = j.arj_gerr(funyvfgf[-1])
+vs bcg.gerr:
+    cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+    zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+    vs bcg.pbzzvg:
+        cevag pbzzvg.rapbqr('urk')
+
+j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
+        
+vs bcg.anzr:
+    vs pyv:
+        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+    ryfr:
+        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+    pyv.pybfr()
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc gvpx
+"""
+b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+g = gvzr.gvzr()
+gyrsg = 1 - (g - vag(g))
+gvzr.fyrrc(gyrsg)
+#!/hfe/ova/rai clguba
+vzcbeg bf, flf, fgng, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
+sebz ohc.urycref vzcbeg *
+
+
+qrs zretr_vaqrkrf(bhg, e1, e2):
+    sbe r va vaqrk.ZretrVgre([e1, e2]):
+        # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl?  Jura?
+        bhg.nqq_vkragel(r)
+
+
+pynff VgreUrycre:
+    qrs __vavg__(frys, y):
+        frys.v = vgre(y)
+        frys.phe = Abar
+        frys.arkg()
+
+    qrs arkg(frys):
+        gel:
+            frys.phe = frys.v.arkg()
+        rkprcg FgbcVgrengvba:
+            frys.phe = Abar
+        erghea frys.phe
+
+
+qrs purpx_vaqrk(ernqre):
+    gel:
+        ybt('purpx: purpxvat sbejneq vgrengvba...\a')
+        r = Abar
+        q = {}
+        sbe r va ernqre.sbejneq_vgre():
+            vs r.puvyqera_a:
+                vs bcg.ireobfr:
+                    ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
+                                            r.anzr))
+                nffreg(r.puvyqera_bsf)
+                nffreg(r.anzr.raqfjvgu('/'))
+                nffreg(abg q.trg(r.puvyqera_bsf))
+                q[r.puvyqera_bsf] = 1
+            vs r.syntf & vaqrk.VK_UNFUINYVQ:
+                nffreg(r.fun != vaqrk.RZCGL_FUN)
+                nffreg(r.tvgzbqr)
+        nffreg(abg r be r.anzr == '/')  # ynfg ragel vf *nyjnlf* /
+        ybt('purpx: purpxvat abezny vgrengvba...\a')
+        ynfg = Abar
+        sbe r va ernqre:
+            vs ynfg:
+                nffreg(ynfg > r.anzr)
+            ynfg = r.anzr
+    rkprcg:
+        ybt('vaqrk reebe! ng %e\a' % r)
+        envfr
+    ybt('purpx: cnffrq.\a')
+
+
+qrs hcqngr_vaqrk(gbc):
+    ev = vaqrk.Ernqre(vaqrksvyr)
+    jv = vaqrk.Jevgre(vaqrksvyr)
+    evt = VgreUrycre(ev.vgre(anzr=gbc))
+    gfgneg = vag(gvzr.gvzr())
+
+    unfutra = Abar
+    vs bcg.snxr_inyvq:
+        qrs unfutra(anzr):
+            erghea (0100644, vaqrk.SNXR_FUN)
+
+    gbgny = 0
+    sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
+        vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
+            flf.fgqbhg.jevgr('%f\a' % cngu)
+            flf.fgqbhg.syhfu()
+            cebterff('Vaqrkvat: %q\e' % gbgny)
+        ryvs abg (gbgny % 128):
+            cebterff('Vaqrkvat: %q\e' % gbgny)
+        gbgny += 1
+        juvyr evt.phe naq evt.phe.anzr > cngu:  # qryrgrq cnguf
+            vs evt.phe.rkvfgf():
+                evt.phe.frg_qryrgrq()
+                evt.phe.ercnpx()
+            evt.arkg()
+        vs evt.phe naq evt.phe.anzr == cngu:    # cnguf gung nyernql rkvfgrq
+            vs cfg:
+                evt.phe.sebz_fgng(cfg, gfgneg)
+            vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
+                vs unfutra:
+                    (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
+                    evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
+            vs bcg.snxr_vainyvq:
+                evt.phe.vainyvqngr()
+            evt.phe.ercnpx()
+            evt.arkg()
+        ryfr:  # arj cnguf
+            jv.nqq(cngu, cfg, unfutra = unfutra)
+    cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
+    
+    vs ev.rkvfgf():
+        ev.fnir()
+        jv.syhfu()
+        vs jv.pbhag:
+            je = jv.arj_ernqre()
+            vs bcg.purpx:
+                ybt('purpx: orsber zretvat: byqsvyr\a')
+                purpx_vaqrk(ev)
+                ybt('purpx: orsber zretvat: arjsvyr\a')
+                purpx_vaqrk(je)
+            zv = vaqrk.Jevgre(vaqrksvyr)
+            zretr_vaqrkrf(zv, ev, je)
+            ev.pybfr()
+            zv.pybfr()
+            je.pybfr()
+        jv.nobeg()
+    ryfr:
+        jv.pybfr()
+
+
+bcgfcrp = """
+ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
+--
+c,cevag    cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
+z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
+f,fgnghf   cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
+U,unfu     cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
+y,ybat     cevag zber vasbezngvba nobhg rnpu svyr
+h,hcqngr   (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
+k,kqri,bar-svyr-flfgrz  qba'g pebff svyrflfgrz obhaqnevrf
+snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
+snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
+purpx      pnershyyl purpx vaqrk svyr vagrtevgl
+s,vaqrksvyr=  gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+"""
+b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
+    b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
+vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
+    b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
+vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
+    b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
+
+tvg.purpx_ercb_be_qvr()
+vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
+
+unaqyr_pgey_p()
+
+vs bcg.purpx:
+    ybt('purpx: fgnegvat vavgvny purpx.\a')
+    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+cnguf = vaqrk.erqhpr_cnguf(rkgen)
+
+vs bcg.hcqngr:
+    vs abg cnguf:
+        b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
+    sbe (ec,cngu) va cnguf:
+        hcqngr_vaqrk(ec)
+
+vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
+    sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
+        vs (bcg.zbqvsvrq 
+            naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
+            pbagvahr
+        yvar = ''
+        vs bcg.fgnghf:
+            vs rag.vf_qryrgrq():
+                yvar += 'Q '
+            ryvs abg rag.vf_inyvq():
+                vs rag.fun == vaqrk.RZCGL_FUN:
+                    yvar += 'N '
+                ryfr:
+                    yvar += 'Z '
+            ryfr:
+                yvar += '  '
+        vs bcg.unfu:
+            yvar += rag.fun.rapbqr('urk') + ' '
+        vs bcg.ybat:
+            yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
+        cevag yvar + (anzr be './')
+
+vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
+    ybt('purpx: fgnegvat svany purpx.\a')
+    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg
+sebz ohc vzcbeg bcgvbaf, urycref
+
+bcgfcrp = """
+ohc eonpxhc-freire
+--
+    Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+# trg gur fhopbzznaq'f neti.
+# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
+# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
+# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
+ohs = flf.fgqva.ernq(4)
+fm = fgehpg.hacnpx('!V', ohs)[0]
+nffreg(fm > 0)
+nffreg(fm < 1000000)
+ohs = flf.fgqva.ernq(fm)
+nffreg(yra(ohs) == fm)
+neti = ohs.fcyvg('\0')
+
+# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
+# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
+# gb zvfhfr gurz.  Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
+# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
+#
+# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
+# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
+# fbpxrg.  Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
+# bs vg, ohg cebonoyl qvqa'g.  Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
+# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
+#
+# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
+# qrfpevcgbef.  Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
+# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
+bf.qhc2(0, 3)
+bf.qhc2(1, 4)
+bf.qhc2(2, 1)
+sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
+bf.qhc2(sq, 0)
+bf.pybfr(sq)
+
+bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
+bf.rkrpic(neti[0], neti)
+flf.rkvg(99)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo, fhocebprff, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+cne2_bx = 0
+ahyys = bcra('/qri/ahyy')
+
+qrs qroht(f):
+    vs bcg.ireobfr:
+        ybt(f)
+
+qrs eha(neti):
+    # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
+    # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
+    # rkrpvat sbe fbzr ernfba.  Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
+    # svefg.
+    sq = bf.qhc(2)  # pbcl fgqree
+    gel:
+        c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
+        erghea c.jnvg()
+    svanyyl:
+        bf.pybfr(sq)
+
+qrs cne2_frghc():
+    tybony cne2_bx
+    ei = 1
+    gel:
+        c = fhocebprff.Cbcra(['cne2', '--uryc'],
+                             fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
+        ei = c.jnvg()
+    rkprcg BFReebe:
+        ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
+    ryfr:
+        cne2_bx = 1
+
+qrs cnei(yiy):
+    vs bcg.ireobfr >= yiy:
+        vs vfggl:
+            erghea []
+        ryfr:
+            erghea ['-d']
+    ryfr:
+        erghea ['-dd']
+
+qrs cne2_trarengr(onfr):
+    erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
+               + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
+
+qrs cne2_irevsl(onfr):
+    erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
+
+qrs cne2_ercnve(onfr):
+    erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
+
+qrs dhvpx_irevsl(onfr):
+    s = bcra(onfr + '.cnpx', 'eo')
+    s.frrx(-20, 2)
+    jnagfhz = s.ernq(20)
+    nffreg(yra(jnagfhz) == 20)
+    s.frrx(0)
+    fhz = Fun1()
+    sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
+        fhz.hcqngr(o)
+    vs fhz.qvtrfg() != jnagfhz:
+        envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
+                                                  fhz.urkqvtrfg()))
+        
+
+qrs tvg_irevsl(onfr):
+    vs bcg.dhvpx:
+        gel:
+            dhvpx_irevsl(onfr)
+        rkprcg Rkprcgvba, r:
+            qroht('reebe: %f\a' % r)
+            erghea 1
+        erghea 0
+    ryfr:
+        erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
+    
+    
+qrs qb_cnpx(onfr, ynfg):
+    pbqr = 0
+    vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
+        ierfhyg = cne2_irevsl(onfr)
+        vs ierfhyg != 0:
+            vs bcg.ercnve:
+                eerfhyg = cne2_ercnve(onfr)
+                vs eerfhyg != 0:
+                    cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
+                    pbqr = eerfhyg
+                ryfr:
+                    cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
+                    pbqr = 100
+            ryfr:
+                cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
+                pbqr = ierfhyg
+        ryfr:
+            cevag '%f bx' % ynfg
+    ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
+        terfhyg = tvg_irevsl(onfr)
+        vs terfhyg != 0:
+            cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
+            pbqr = terfhyg
+        ryfr:
+            vs cne2_bx naq bcg.trarengr:
+                cerfhyg = cne2_trarengr(onfr)
+                vs cerfhyg != 0:
+                    cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
+                    pbqr = cerfhyg
+                ryfr:
+                    cevag '%f bx' % ynfg
+            ryfr:
+                cevag '%f bx' % ynfg
+    ryfr:
+        nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
+        qroht('    fxvccrq: cne2 svyr nyernql trarengrq.\a')
+    erghea pbqr
+
+
+bcgfcrp = """
+ohc sfpx [bcgvbaf...] [svyranzrf...]
+--
+e,ercnve    nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
+t,trarengr  trarengr nhgb-ercnve vasbezngvba hfvat cne2
+i,ireobfr   vapernfr ireobfvgl (pna or hfrq zber guna bapr)
+dhvpx       whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
+w,wbof=     eha 'a' wbof va cnenyyry
+cne2-bx     vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
+qvfnoyr-cne2  vtaber cne2 rira vs vg vf ninvynoyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+cne2_frghc()
+vs bcg.cne2_bx:
+    vs cne2_bx:
+        flf.rkvg(0)  # 'gehr' va fu
+    ryfr:
+        flf.rkvg(1)
+vs bcg.qvfnoyr_cne2:
+    cne2_bx = 0
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+    qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
+    rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
+
+pbqr = 0
+pbhag = 0
+bhgfgnaqvat = {}
+sbe anzr va rkgen:
+    vs anzr.raqfjvgu('.cnpx'):
+        onfr = anzr[:-5]
+    ryvs anzr.raqfjvgu('.vqk'):
+        onfr = anzr[:-4]
+    ryvs anzr.raqfjvgu('.cne2'):
+        onfr = anzr[:-5]
+    ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
+        onfr = anzr
+    ryfr:
+        envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
+    (qve,ynfg) = bf.cngu.fcyvg(onfr)
+    cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
+    vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
+        cne2_rkvfgf = 0
+    flf.fgqbhg.syhfu()
+    qroht('sfpx: purpxvat %f (%f)\a' 
+          % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
+    vs abg bcg.ireobfr:
+        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+    
+    vs abg bcg.wbof:
+        ap = qb_cnpx(onfr, ynfg)
+        pbqr = pbqr be ap
+        pbhag += 1
+    ryfr:
+        juvyr yra(bhgfgnaqvat) >= bcg.wbof:
+            (cvq,ap) = bf.jnvg()
+            ap >>= 8
+            vs cvq va bhgfgnaqvat:
+                qry bhgfgnaqvat[cvq]
+                pbqr = pbqr be ap
+                pbhag += 1
+        cvq = bf.sbex()
+        vs cvq:  # cnerag
+            bhgfgnaqvat[cvq] = 1
+        ryfr: # puvyq
+            gel:
+                flf.rkvg(qb_cnpx(onfr, ynfg))
+            rkprcg Rkprcgvba, r:
+                ybt('rkprcgvba: %e\a' % r)
+                flf.rkvg(99)
+                
+juvyr yra(bhgfgnaqvat):
+    (cvq,ap) = bf.jnvg()
+    ap >>= 8
+    vs cvq va bhgfgnaqvat:
+        qry bhgfgnaqvat[cvq]
+        pbqr = pbqr be ap
+        pbhag += 1
+    vs abg bcg.ireobfr:
+        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+vs abg bcg.ireobfr naq vfggl:
+    ybt('sfpx qbar.           \a')
+flf.rkvg(pbqr)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
+sebz ohc vzcbeg bcgvbaf, ffu
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc eonpxhc <ubfganzr> vaqrk ...
+ohc eonpxhc <ubfganzr> fnir ...
+ohc eonpxhc <ubfganzr> fcyvg ...
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs yra(rkgen) < 2:
+    b.sngny('nethzragf rkcrpgrq')
+
+pynff FvtRkprcgvba(Rkprcgvba):
+    qrs __vavg__(frys, fvtahz):
+        frys.fvtahz = fvtahz
+        Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
+qrs unaqyre(fvtahz, senzr):
+    envfr FvtRkprcgvba(fvtahz)
+
+fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
+fvtany.fvtany(fvtany.FVTVAG, unaqyre)
+
+fc = Abar
+c = Abar
+erg = 99
+
+gel:
+    ubfganzr = rkgen[0]
+    neti = rkgen[1:]
+    c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
+
+    netif = '\0'.wbva(['ohc'] + neti)
+    c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
+    c.fgqva.syhfu()
+
+    znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
+    fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
+
+    c.fgqva.pybfr()
+    c.fgqbhg.pybfr()
+
+svanyyl:
+    juvyr 1:
+        # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
+        # va pnfr bhe puvyq qbrfa'g qvr.
+        gel:
+            erg = c.jnvg()
+            fc.jnvg()
+            oernx
+        rkprcg FvtRkprcgvba, r:
+            ybt('\aohc eonpxhc: %f\a' % r)
+            bf.xvyy(c.cvq, r.fvtahz)
+            erg = 84
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc arjyvare
+"""
+b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+e = er.pbzcvyr(e'([\e\a])')
+ynfgyra = 0
+nyy = ''
+juvyr 1:
+    y = e.fcyvg(nyy, 1)
+    vs yra(y) <= 1:
+        gel:
+            o = bf.ernq(flf.fgqva.svyrab(), 4096)
+        rkprcg XrlobneqVagreehcg:
+            oernx
+        vs abg o:
+            oernx
+        nyy += o
+    ryfr:
+        nffreg(yra(y) == 3)
+        (yvar, fcyvgpune, nyy) = y
+        #fcyvgpune = '\a'
+        flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
+        vs fcyvgpune == '\e':
+            ynfgyra = yra(yvar)
+        ryfr:
+            ynfgyra = 0
+        flf.fgqbhg.syhfu()
+
+vs ynfgyra be nyy:
+    flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
+#!/hfe/ova/rai clguba
+vzcbeg flf
+sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc znetva
+"""
+b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+#tvg.vtaber_zvqk = 1
+
+zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+ynfg = '\0'*20
+ybatzngpu = 0
+sbe v va zv:
+    vs v == ynfg:
+        pbagvahr
+    #nffreg(fge(v) >= ynfg)
+    cz = _unfufcyvg.ovgzngpu(ynfg, v)
+    ybatzngpu = znk(ybatzngpu, cz)
+    ynfg = v
+cevag ybatzngpu
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg bcgvbaf, qerphefr
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc qerphefr <cngu>
+--
+k,kqri,bar-svyr-flfgrz   qba'g pebff svyrflfgrz obhaqnevrf
+d,dhvrg  qba'g npghnyyl cevag svyranzrf
+cebsvyr  eha haqre gur clguba cebsvyre
+"""
+b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar svyranzr rkcrpgrq")
+
+vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
+vs bcg.cebsvyr:
+    vzcbeg pCebsvyr
+    qrs qb_vg():
+        sbe v va vg:
+            cnff
+    pCebsvyr.eha('qb_vg()')
+ryfr:
+    vs bcg.dhvrg:
+        sbe v va vg:
+            cnff
+    ryfr:
+        sbe (anzr,fg) va vg:
+            cevag anzr
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+o,oybof    bhgchg n frevrf bs oybo vqf
+g,gerr     bhgchg n gerr vq
+p,pbzzvg   bhgchg n pbzzvg vq
+a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
+A,abbc     qba'g npghnyyl fnir gur qngn naljurer
+d,dhvrg    qba'g cevag cebterff zrffntrf
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+pbcl       whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
+orapu      cevag orapuznex gvzvatf gb fgqree
+znk-cnpx-fvmr=  znkvzhz olgrf va n fvatyr cnpx
+znk-cnpx-bowrpgf=  znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
+snabhg=  znkvzhz ahzore bs oybof va n fvatyr gerr
+"""
+b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
+        bcg.abbc be bcg.pbcl):
+    b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
+vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be 
+                               bcg.pbzzvg be bcg.anzr):
+    b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
+
+vs bcg.ireobfr >= 2:
+    tvg.ireobfr = bcg.ireobfr - 1
+    bcg.orapu = 1
+vs bcg.znk_cnpx_fvmr:
+    unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
+vs bcg.znk_cnpx_bowrpgf:
+    unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
+vs bcg.snabhg:
+    unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
+vs bcg.oybof:
+    unfufcyvg.snabhg = 0
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+fgneg_gvzr = gvzr.gvzr()
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.abbc be bcg.pbcl:
+    pyv = j = byqers = Abar
+ryvs bcg.erzbgr be vf_erirefr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+    j = pyv.arj_cnpxjevgre()
+ryfr:
+    pyv = Abar
+    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+    j = tvg.CnpxJevgre()
+
+svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
+vs j:
+    funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
+    gerr = j.arj_gerr(funyvfg)
+ryfr:
+    ynfg = 0
+    sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
+        unfufcyvg.gbgny_fcyvg += yra(oybo)
+        vs bcg.pbcl:
+            flf.fgqbhg.jevgr(fge(oybo))
+        zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
+        vs abg bcg.dhvrg naq ynfg != zrtf:
+            cebterff('%q Zolgrf ernq\e' % zrtf)
+            ynfg = zrtf
+    cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
+
+vs bcg.ireobfr:
+    ybt('\a')
+vs bcg.oybof:
+    sbe (zbqr,anzr,ova) va funyvfg:
+        cevag ova.rapbqr('urk')
+vs bcg.gerr:
+    cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+    zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+    vs bcg.pbzzvg:
+        cevag pbzzvg.rapbqr('urk')
+
+vs j:
+    j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
+        
+vs bcg.anzr:
+    vs pyv:
+        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+    ryfr:
+        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+    pyv.pybfr()
+
+frpf = gvzr.gvzr() - fgneg_gvzr
+fvmr = unfufcyvg.gbgny_fcyvg
+vs bcg.orapu:
+    ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
+        % (fvmr/1024., frpf, fvmr/1024./frpf))
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, fgehpg, zznc
+sebz ohc vzcbeg tvg, bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs f_sebz_olgrf(olgrf):
+    pyvfg = [pue(o) sbe o va olgrf]
+    erghea ''.wbva(pyvfg)
+
+
+qrs ercbeg(pbhag):
+    svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
+    q = {}
+    sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
+        y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
+        q[y[0]] = y[1]
+    vs pbhag >= 0:
+        r1 = pbhag
+        svryqf = [q[x] sbe x va svryqf]
+    ryfr:
+        r1 = ''
+    cevag ('%9f  ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
+    flf.fgqbhg.syhfu()
+
+
+bcgfcrp = """
+ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
+--
+a,ahzore=  ahzore bs bowrpgf cre plpyr
+p,plpyrf=  ahzore bs plpyrf gb eha
+vtaber-zvqk  vtaber .zvqk svyrf, hfr bayl .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+tvg.vtaber_zvqk = bcg.vtaber_zvqk
+
+tvg.purpx_ercb_be_qvr()
+z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+
+plpyrf = bcg.plpyrf be 100
+ahzore = bcg.ahzore be 10000
+
+ercbeg(-1)
+s = bcra('/qri/henaqbz')
+n = zznc.zznc(-1, 20)
+ercbeg(0)
+sbe p va kenatr(plpyrf):
+    sbe a va kenatr(ahzore):
+        o = s.ernq(3)
+        vs 0:
+            olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
+            olgrf[2] &= 0ks0
+            ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
+        ryfr:
+            n[0:2] = o[0:2]
+            n[2] = pue(beq(o[2]) & 0ks0)
+            ova = fge(n[0:20])
+        #cevag ova.rapbqr('urk')
+        z.rkvfgf(ova)
+    ercbeg((p+1)*ahzore)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+qrs cevag_abqr(grkg, a):
+    cersvk = ''
+    vs bcg.unfu:
+        cersvk += "%f " % a.unfu.rapbqr('urk')
+    vs fgng.F_VFQVE(a.zbqr):
+        cevag '%f%f/' % (cersvk, grkg)
+    ryvs fgng.F_VFYAX(a.zbqr):
+        cevag '%f%f@' % (cersvk, grkg)
+    ryfr:
+        cevag '%f%f' % (cersvk, grkg)
+
+
+bcgfcrp = """
+ohc yf <qvef...>
+--
+f,unfu   fubj unfu sbe rnpu svyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+
+vs abg rkgen:
+    rkgen = ['/']
+
+erg = 0
+sbe q va rkgen:
+    gel:
+        a = gbc.yerfbyir(q)
+        vs fgng.F_VFQVE(a.zbqr):
+            sbe fho va a:
+                cevag_abqr(fho.anzr, fho)
+        ryfr:
+            cevag_abqr(q, a)
+    rkprcg isf.AbqrReebe, r:
+        ybt('reebe: %f\a' % r)
+        erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
+sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
+sebz ohc.urycref vzcbeg *
+
+qrs abqr_anzr(grkg, a):
+    vs fgng.F_VFQVE(a.zbqr):
+        erghea '%f/' % grkg
+    ryvs fgng.F_VFYAX(a.zbqr):
+        erghea '%f@' % grkg
+    ryfr:
+        erghea '%f' % grkg
+
+
+qrs qb_yf(cngu, a):
+    y = []
+    vs fgng.F_VFQVE(a.zbqr):
+        sbe fho va a:
+            y.nccraq(abqr_anzr(fho.anzr, fho))
+    ryfr:
+        y.nccraq(abqr_anzr(cngu, a))
+    cevag pbyhzangr(y, '')
+    
+
+qrs jevgr_gb_svyr(vas, bhgs):
+    sbe oybo va puhaxlernqre(vas):
+        bhgs.jevgr(oybo)
+    
+
+qrs vachgvgre():
+    vs bf.vfnggl(flf.fgqva.svyrab()):
+        juvyr 1:
+            gel:
+                lvryq enj_vachg('ohc> ')
+            rkprcg RBSReebe:
+                oernx
+    ryfr:
+        sbe yvar va flf.fgqva:
+            lvryq yvar
+
+
+qrs _pbzcyrgre_trg_fhof(yvar):
+    (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
+    (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
+    #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
+    a = cjq.erfbyir(qve)
+    fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
+                       a.fhof()))
+    erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
+
+
+_ynfg_yvar = Abar
+_ynfg_erf = Abar
+qrs pbzcyrgre(grkg, fgngr):
+    tybony _ynfg_yvar
+    tybony _ynfg_erf
+    gel:
+        yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
+        vs _ynfg_yvar != yvar:
+            _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
+            _ynfg_yvar = yvar
+        (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
+        vs fgngr < yra(fhof):
+            fa = fhof[fgngr]
+            fa1 = fa.erfbyir('')  # qrers flzyvaxf
+            shyyanzr = bf.cngu.wbva(qve, fa.anzr)
+            vs fgng.F_VFQVE(fa1.zbqr):
+                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
+                                          grezvangr=Snyfr)
+            ryfr:
+                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
+                                          grezvangr=Gehr) + ' '
+            erghea grkg + erg
+    rkprcg Rkprcgvba, r:
+        ybt('\areebe va pbzcyrgvba: %f\a' % r)
+
+            
+bcgfcrp = """
+ohc sgc
+"""
+b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+gbc = isf.ErsYvfg(Abar)
+cjq = gbc
+
+vs rkgen:
+    yvarf = rkgen
+ryfr:
+    ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
+    ernqyvar.frg_pbzcyrgre(pbzcyrgre)
+    ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
+    yvarf = vachgvgre()
+
+sbe yvar va yvarf:
+    vs abg yvar.fgevc():
+        pbagvahr
+    jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
+    pzq = jbeqf[0].ybjre()
+    #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
+    gel:
+        vs pzq == 'yf':
+            sbe cnez va (jbeqf[1:] be ['.']):
+                qb_yf(cnez, cjq.erfbyir(cnez))
+        ryvs pzq == 'pq':
+            sbe cnez va jbeqf[1:]:
+                cjq = cjq.erfbyir(cnez)
+        ryvs pzq == 'cjq':
+            cevag cjq.shyyanzr()
+        ryvs pzq == 'png':
+            sbe cnez va jbeqf[1:]:
+                jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
+        ryvs pzq == 'trg':
+            vs yra(jbeqf) abg va [2,3]:
+                envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
+            eanzr = jbeqf[1]
+            (qve,onfr) = bf.cngu.fcyvg(eanzr)
+            yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
+            vas = cjq.erfbyir(eanzr).bcra()
+            ybt('Fnivat %e\a' % yanzr)
+            jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
+        ryvs pzq == 'ztrg':
+            sbe cnez va jbeqf[1:]:
+                (qve,onfr) = bf.cngu.fcyvg(cnez)
+                sbe a va cjq.erfbyir(qve).fhof():
+                    vs sazngpu.sazngpu(a.anzr, onfr):
+                        gel:
+                            ybt('Fnivat %e\a' % a.anzr)
+                            vas = a.bcra()
+                            bhgs = bcra(a.anzr, 'jo')
+                            jevgr_gb_svyr(vas, bhgs)
+                            bhgs.pybfr()
+                        rkprcg Rkprcgvba, r:
+                            ybt('  reebe: %f\a' % r)
+        ryvs pzq == 'uryc' be pzq == '?':
+            ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
+        ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
+            oernx
+        ryfr:
+            envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
+    rkprcg Rkprcgvba, r:
+        ybt('reebe: %f\a' % r)
+        #envfr
+#!/hfe/ova/rai clguba
+vzcbeg flf, zznc
+sebz ohc vzcbeg bcgvbaf, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc enaqbz [-F frrq] <ahzolgrf>
+--
+F,frrq=   bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
+s,sbepr   cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
+"""
+b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+gbgny = cnefr_ahz(rkgen[0])
+
+vs bcg.sbepr be (abg bf.vfnggl(1) naq
+                 abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
+    _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
+ryfr:
+    ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc uryc <pbzznaq>
+"""
+b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) == 0:
+    # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
+    bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
+ryvs yra(rkgen) == 1:
+    qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
+    rkr = flf.neti[0]
+    (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
+    znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
+    t = tybo.tybo(znacngu)
+    vs t:
+        bf.rkrpic('zna', ['zna', '-y', t[0]])
+    ryfr:
+        bf.rkrpic('zna', ['zna', qbpanzr])
+ryfr:
+    b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+
+pynff Fgng(shfr.Fgng):
+    qrs __vavg__(frys):
+        frys.fg_zbqr = 0
+        frys.fg_vab = 0
+        frys.fg_qri = 0
+        frys.fg_ayvax = 0
+        frys.fg_hvq = 0
+        frys.fg_tvq = 0
+        frys.fg_fvmr = 0
+        frys.fg_ngvzr = 0
+        frys.fg_zgvzr = 0
+        frys.fg_pgvzr = 0
+        frys.fg_oybpxf = 0
+        frys.fg_oyxfvmr = 0
+        frys.fg_eqri = 0
+
+
+pnpur = {}
+qrs pnpur_trg(gbc, cngu):
+    cnegf = cngu.fcyvg('/')
+    pnpur[('',)] = gbc
+    p = Abar
+    znk = yra(cnegf)
+    #ybt('pnpur: %e\a' % pnpur.xrlf())
+    sbe v va enatr(znk):
+        cer = cnegf[:znk-v]
+        #ybt('pnpur gelvat: %e\a' % cer)
+        p = pnpur.trg(ghcyr(cer))
+        vs p:
+            erfg = cnegf[znk-v:]
+            sbe e va erfg:
+                #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
+                p = p.yerfbyir(e)
+                xrl = ghcyr(cer + [e])
+                #ybt('fnivat: %e\a' % (xrl,))
+                pnpur[xrl] = p
+            oernx
+    nffreg(p)
+    erghea p
+        
+    
+
+pynff OhcSf(shfr.Shfr):
+    qrs __vavg__(frys, gbc):
+        shfr.Shfr.__vavg__(frys)
+        frys.gbc = gbc
+    
+    qrs trgngge(frys, cngu):
+        ybt('--trgngge(%e)\a' % cngu)
+        gel:
+            abqr = pnpur_trg(frys.gbc, cngu)
+            fg = Fgng()
+            fg.fg_zbqr = abqr.zbqr
+            fg.fg_ayvax = abqr.ayvaxf()
+            fg.fg_fvmr = abqr.fvmr()
+            fg.fg_zgvzr = abqr.zgvzr
+            fg.fg_pgvzr = abqr.pgvzr
+            fg.fg_ngvzr = abqr.ngvzr
+            erghea fg
+        rkprcg isf.AbFhpuSvyr:
+            erghea -reeab.RABRAG
+
+    qrs ernqqve(frys, cngu, bssfrg):
+        ybt('--ernqqve(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        lvryq shfr.Qveragel('.')
+        lvryq shfr.Qveragel('..')
+        sbe fho va abqr.fhof():
+            lvryq shfr.Qveragel(fho.anzr)
+
+    qrs ernqyvax(frys, cngu):
+        ybt('--ernqyvax(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        erghea abqr.ernqyvax()
+
+    qrs bcra(frys, cngu, syntf):
+        ybt('--bcra(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
+        vs (syntf & nppzbqr) != bf.B_EQBAYL:
+            erghea -reeab.RNPPRF
+        abqr.bcra()
+
+    qrs eryrnfr(frys, cngu, syntf):
+        ybt('--eryrnfr(%e)\a' % cngu)
+
+    qrs ernq(frys, cngu, fvmr, bssfrg):
+        ybt('--ernq(%e)\a' % cngu)
+        a = pnpur_trg(frys.gbc, cngu)
+        b = a.bcra()
+        b.frrx(bssfrg)
+        erghea b.ernq(fvmr)
+
+
+vs abg unfngge(shfr, '__irefvba__'):
+    envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
+shfr.shfr_clguba_ncv = (0, 2)
+
+
+bcgfcrp = """
+ohc shfr [-q] [-s] <zbhagcbvag>
+--
+q,qroht   vapernfr qroht yriry
+s,sbertebhaq  eha va sbertebhaq
+"""
+b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+s = OhcSf(gbc)
+s.shfr_netf.zbhagcbvag = rkgen[0]
+vs bcg.qroht:
+    s.shfr_netf.nqq('qroht')
+vs bcg.sbertebhaq:
+    s.shfr_netf.frgzbq('sbertebhaq')
+cevag s.zhygvguernqrq
+s.zhygvguernqrq = Snyfr
+
+s.znva()
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+
+vs bcg.erzbgr:
+    tvg.vavg_ercb()  # ybpny ercb
+    tvg.purpx_ercb_be_qvr()
+    pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
+    pyv.pybfr()
+ryfr:
+    tvg.vavg_ercb()
+#!/hfe/ova/rai clguba
+vzcbeg flf, zngu, fgehpg, tybo
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+CNTR_FVMR=4096
+FUN_CRE_CNTR=CNTR_FVMR/200.
+
+
+qrs zretr(vqkyvfg, ovgf, gnoyr):
+    pbhag = 0
+    sbe r va tvg.vqkzretr(vqkyvfg):
+        pbhag += 1
+        cersvk = tvg.rkgenpg_ovgf(r, ovgf)
+        gnoyr[cersvk] = pbhag
+        lvryq r
+
+
+qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
+    vs abg bhgsvyranzr:
+        nffreg(bhgqve)
+        fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
+        bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
+    
+    vac = []
+    gbgny = 0
+    sbe anzr va vasvyranzrf:
+        vk = tvg.CnpxVqk(anzr)
+        vac.nccraq(vk)
+        gbgny += yra(vk)
+
+    ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
+    vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
+       be (bcg.sbepr naq abg gbgny):
+        ybt('zvqk: abguvat gb qb.\a')
+        erghea
+
+    cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
+    ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
+    ragevrf = 2**ovgf
+    ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
+    
+    gnoyr = [0]*ragevrf
+
+    gel:
+        bf.hayvax(bhgsvyranzr)
+    rkprcg BFReebe:
+        cnff
+    s = bcra(bhgsvyranzr + '.gzc', 'j+')
+    s.jevgr('ZVQK\0\0\0\2')
+    s.jevgr(fgehpg.cnpx('!V', ovgf))
+    nffreg(s.gryy() == 12)
+    s.jevgr('\0'*4*ragevrf)
+    
+    sbe r va zretr(vac, ovgf, gnoyr):
+        s.jevgr(r)
+        
+    s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
+
+    s.frrx(12)
+    s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
+    s.pybfr()
+    bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
+
+    # guvf vf whfg sbe grfgvat
+    vs 0:
+        c = tvg.CnpxZvqk(bhgsvyranzr)
+        nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
+        cevag c.vqkanzrf
+        nffreg(yra(c) == gbgny)
+        cv = vgre(c)
+        sbe v va zretr(vac, gbgny, ovgf, gnoyr):
+            nffreg(v == cv.arkg())
+            nffreg(c.rkvfgf(v))
+
+    cevag bhgsvyranzr
+
+bcgfcrp = """
+ohc zvqk [bcgvbaf...] <vqkanzrf...>
+--
+b,bhgchg=  bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
+n,nhgb     nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
+s,sbepr    nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen naq (bcg.nhgb be bcg.sbepr):
+    b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
+
+tvg.purpx_ercb_be_qvr()
+
+vs rkgen:
+    qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
+ryvs bcg.nhgb be bcg.sbepr:
+    cnguf = [tvg.ercb('bowrpgf/cnpx')]
+    cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
+    sbe cngu va cnguf:
+        ybt('zvqk: fpnaavat %f\a' % cngu)
+        vs bcg.sbepr:
+            qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
+        ryvs bcg.nhgb:
+            z = tvg.CnpxVqkYvfg(cngu)
+            arrqrq = {}
+            sbe cnpx va z.cnpxf:  # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
+                vs cnpx.anzr.raqfjvgu('.vqk'):
+                    arrqrq[cnpx.anzr] = 1
+            qry z
+            qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
+        ybt('\a')
+ryfr:
+    b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, enaqbz
+sebz ohc vzcbeg bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs enaqoybpx(a):
+    y = []
+    sbe v va kenatr(a):
+        y.nccraq(pue(enaqbz.enaqenatr(0,256)))
+    erghea ''.wbva(y)
+
+
+bcgfcrp = """
+ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
+--
+   JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
+a,ahz=   ahzore bs oybpxf gb qnzntr
+f,fvmr=  znkvzhz fvmr bs rnpu qnzntrq oybpx
+creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
+rdhny    fcernq qnzntr rirayl guebhtubhg gur svyr
+F,frrq=  enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
+"""
+b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg rkgen:
+    b.sngny('svyranzrf rkcrpgrq')
+
+vs bcg.frrq != Abar:
+    enaqbz.frrq(bcg.frrq)
+
+sbe anzr va rkgen:
+    ybt('Qnzntvat "%f"...\a' % anzr)
+    s = bcra(anzr, 'e+o')
+    fg = bf.sfgng(s.svyrab())
+    fvmr = fg.fg_fvmr
+    vs bcg.creprag be bcg.fvmr:
+        zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
+        zf2 = bcg.fvmr be fvmr
+        znkfvmr = zva(zf1, zf2)
+    ryfr:
+        znkfvmr = 1
+    puhaxf = bcg.ahz be 10
+    puhaxfvmr = fvmr/puhaxf
+    sbe e va enatr(puhaxf):
+        fm = enaqbz.enaqenatr(1, znkfvmr+1)
+        vs fm > fvmr:
+            fm = fvmr
+        vs bcg.rdhny:
+            bsf = e*puhaxfvmr
+        ryfr:
+            bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
+        ybt('  %6q olgrf ng %q\a' % (fm, bsf))
+        s.frrx(bsf)
+        s.jevgr(enaqoybpx(fm))
+    s.pybfr()
+#!/hfe/ova/rai clguba
+vzcbeg flf, fgehpg, zznc
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+fhfcraqrq_j = Abar
+
+
+qrs vavg_qve(pbaa, net):
+    tvg.vavg_ercb(net)
+    ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
+    pbaa.bx()
+
+
+qrs frg_qve(pbaa, net):
+    tvg.purpx_ercb_be_qvr(net)
+    ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
+    pbaa.bx()
+
+    
+qrs yvfg_vaqrkrf(pbaa, whax):
+    tvg.purpx_ercb_be_qvr()
+    sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
+        vs s.raqfjvgu('.vqk'):
+            pbaa.jevgr('%f\a' % s)
+    pbaa.bx()
+
+
+qrs fraq_vaqrk(pbaa, anzr):
+    tvg.purpx_ercb_be_qvr()
+    nffreg(anzr.svaq('/') < 0)
+    nffreg(anzr.raqfjvgu('.vqk'))
+    vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
+    pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
+    pbaa.jevgr(vqk.znc)
+    pbaa.bx()
+
+
+qrs erprvir_bowrpgf(pbaa, whax):
+    tybony fhfcraqrq_j
+    tvg.purpx_ercb_be_qvr()
+    fhttrfgrq = {}
+    vs fhfcraqrq_j:
+        j = fhfcraqrq_j
+        fhfcraqrq_j = Abar
+    ryfr:
+        j = tvg.CnpxJevgre()
+    juvyr 1:
+        af = pbaa.ernq(4)
+        vs abg af:
+            j.nobeg()
+            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
+        a = fgehpg.hacnpx('!V', af)[0]
+        #ybt('rkcrpgvat %q olgrf\a' % a)
+        vs abg a:
+            ybt('ohc freire: erprvirq %q bowrpg%f.\a' 
+                % (j.pbhag, j.pbhag!=1 naq "f" be ''))
+            shyycngu = j.pybfr()
+            vs shyycngu:
+                (qve, anzr) = bf.cngu.fcyvg(shyycngu)
+                pbaa.jevgr('%f.vqk\a' % anzr)
+            pbaa.bx()
+            erghea
+        ryvs a == 0kssssssss:
+            ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
+            fhfcraqrq_j = j
+            pbaa.bx()
+            erghea
+            
+        ohs = pbaa.ernq(a)  # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
+        #ybt('ernq %q olgrf\a' % a)
+        vs yra(ohs) < a:
+            j.nobeg()
+            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
+                            % (a, yra(ohs)))
+        (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
+        fun = tvg.pnyp_unfu(glcr, pbagrag)
+        byqcnpx = j.rkvfgf(fun)
+        # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
+        # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
+        # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
+        # ba gur freire fvqr.
+        vs abg fhttrfgrq naq \
+          byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
+            # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
+            # ng guvf ynlre.  Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
+            # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
+            # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
+            # znxr gur svyrf ovttre.  Guvf zrgubq vf pregnvayl abg irel
+            # rssvpvrag.
+            j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
+            byqcnpx = j.bowpnpur.rkvfgf(fun)
+            ybt('arj fhttrfgvba: %e\a' % byqcnpx)
+            nffreg(byqcnpx)
+            nffreg(byqcnpx != Gehr)
+            nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
+            j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
+        vs abg fhttrfgrq naq byqcnpx:
+            nffreg(byqcnpx.raqfjvgu('.vqk'))
+            (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
+            vs abg (anzr va fhttrfgrq):
+                ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
+                pbaa.jevgr('vaqrk %f\a' % anzr)
+                fhttrfgrq[anzr] = 1
+        ryfr:
+            j._enj_jevgr([ohs])
+    # ABGERNPURQ
+
+
+qrs ernq_ers(pbaa, ersanzr):
+    tvg.purpx_ercb_be_qvr()
+    e = tvg.ernq_ers(ersanzr)
+    pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
+    pbaa.bx()
+
+
+qrs hcqngr_ers(pbaa, ersanzr):
+    tvg.purpx_ercb_be_qvr()
+    arjiny = pbaa.ernqyvar().fgevc()
+    byqiny = pbaa.ernqyvar().fgevc()
+    tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
+    pbaa.bx()
+
+
+qrs png(pbaa, vq):
+    tvg.purpx_ercb_be_qvr()
+    gel:
+        sbe oybo va tvg.png(vq):
+            pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
+            pbaa.jevgr(oybo)
+    rkprcg XrlReebe, r:
+        ybt('freire: reebe: %f\a' % r)
+        pbaa.jevgr('\0\0\0\0')
+        pbaa.reebe(r)
+    ryfr:
+        pbaa.jevgr('\0\0\0\0')
+        pbaa.bx()
+
+
+bcgfcrp = """
+ohc freire
+"""
+b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+ybt('ohc freire: ernqvat sebz fgqva.\a')
+
+pbzznaqf = {
+    'vavg-qve': vavg_qve,
+    'frg-qve': frg_qve,
+    'yvfg-vaqrkrf': yvfg_vaqrkrf,
+    'fraq-vaqrk': fraq_vaqrk,
+    'erprvir-bowrpgf': erprvir_bowrpgf,
+    'ernq-ers': ernq_ers,
+    'hcqngr-ers': hcqngr_ers,
+    'png': png,
+}
+
+# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
+# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
+pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
+ye = yvarernqre(pbaa)
+sbe _yvar va ye:
+    yvar = _yvar.fgevc()
+    vs abg yvar:
+        pbagvahr
+    ybt('ohc freire: pbzznaq: %e\a' % yvar)
+    jbeqf = yvar.fcyvg(' ', 1)
+    pzq = jbeqf[0]
+    erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
+    vs pzq == 'dhvg':
+        oernx
+    ryfr:
+        pzq = pbzznaqf.trg(pzq)
+        vs pzq:
+            pzq(pbaa, erfg)
+        ryfr:
+            envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
+
+ybt('ohc freire: qbar\a')
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+    rkgen = yvarernqre(flf.fgqva)
+
+erg = 0
+
+vs bcg.erzbgr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    png = pyv.png
+ryfr:
+    pc = tvg.PngCvcr()
+    png = pc.wbva
+
+sbe vq va rkgen:
+    gel:
+        sbe oybo va png(vq):
+            flf.fgqbhg.jevgr(oybo)
+    rkprcg XrlReebe, r:
+        flf.fgqbhg.syhfu()
+        ybt('reebe: %f\a' % r)
+        erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, reeab, fgng, gvzr, zngu
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc fnir [-gp] [-a anzr] <svyranzrf...>
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+g,gerr     bhgchg n gerr vq
+p,pbzzvg   bhgchg n pbzzvg vq
+a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+d,dhvrg    qba'g fubj cebterff zrgre
+fznyyre=   bayl onpx hc svyrf fznyyre guna a olgrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
+    b.sngny("hfr bar be zber bs -g, -p, -a")
+vs abg rkgen:
+    b.sngny("ab svyranzrf tvira")
+
+bcg.cebterff = (vfggl naq abg bcg.dhvrg)
+bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.erzbgr be vf_erirefr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+    j = pyv.arj_cnpxjevgre()
+ryfr:
+    pyv = Abar
+    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+    j = tvg.CnpxJevgre()
+
+unaqyr_pgey_p()
+
+
+qrs rngfynfu(qve):
+    vs qve.raqfjvgu('/'):
+        erghea qve[:-1]
+    ryfr:
+        erghea qve
+
+
+cnegf = ['']
+funyvfgf = [[]]
+
+qrs _chfu(cneg):
+    nffreg(cneg)
+    cnegf.nccraq(cneg)
+    funyvfgf.nccraq([])
+
+qrs _cbc(sbepr_gerr):
+    nffreg(yra(cnegf) >= 1)
+    cneg = cnegf.cbc()
+    funyvfg = funyvfgf.cbc()
+    gerr = sbepr_gerr be j.arj_gerr(funyvfg)
+    vs funyvfgf:
+        funyvfgf[-1].nccraq(('40000', cneg, gerr))
+    ryfr:  # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
+        funyvfgf.nccraq(funyvfg)
+    erghea gerr
+
+ynfgerznva = Abar
+qrs cebterff_ercbeg(a):
+    tybony pbhag, fhopbhag, ynfgerznva
+    fhopbhag += a
+    pp = pbhag + fhopbhag
+    cpg = gbgny naq (pp*100.0/gbgny) be 0
+    abj = gvzr.gvzr()
+    ryncfrq = abj - gfgneg
+    xcf = ryncfrq naq vag(pp/1024./ryncfrq)
+    xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
+    xcf = vag(xcf/xcf_senp)*xcf_senp
+    vs pp:
+        erznva = ryncfrq*1.0/pp * (gbgny-pp)
+    ryfr:
+        erznva = 0.0
+    vs (ynfgerznva naq (erznva > ynfgerznva)
+          naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
+        erznva = ynfgerznva
+    ryfr:
+        ynfgerznva = erznva
+    ubhef = vag(erznva/60/60)
+    zvaf = vag(erznva/60 - ubhef*60)
+    frpf = vag(erznva - ubhef*60*60 - zvaf*60)
+    vs ryncfrq < 30:
+        erznvafge = ''
+        xcffge = ''
+    ryfr:
+        xcffge = '%qx/f' % xcf
+        vs ubhef:
+            erznvafge = '%qu%qz' % (ubhef, zvaf)
+        ryvs zvaf:
+            erznvafge = '%qz%q' % (zvaf, frpf)
+        ryfr:
+            erznvafge = '%qf' % frpf
+    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
+             % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
+                erznvafge, xcffge))
+
+
+e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
+
+qrs nyernql_fnirq(rag):
+    erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
+
+qrs jnagerphefr_cer(rag):
+    erghea abg nyernql_fnirq(rag)
+
+qrs jnagerphefr_qhevat(rag):
+    erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
+
+gbgny = sgbgny = 0
+vs bcg.cebterff:
+    sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
+        vs abg (sgbgny % 10024):
+            cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
+        rkvfgf = rag.rkvfgf()
+        unfuinyvq = nyernql_fnirq(rag)
+        rag.frg_fun_zvffvat(abg unfuinyvq)
+        vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
+            vs rkvfgf naq abg unfuinyvq:
+                gbgny += rag.fvmr
+        sgbgny += 1
+    cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
+    unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
+
+gfgneg = gvzr.gvzr()
+pbhag = fhopbhag = spbhag = 0
+ynfgfxvc_anzr = Abar
+ynfgqve = ''
+sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
+    (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
+    rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
+    unfuinyvq = nyernql_fnirq(rag)
+    jnfzvffvat = rag.fun_zvffvat()
+    byqfvmr = rag.fvmr
+    vs bcg.ireobfr:
+        vs abg rkvfgf:
+            fgnghf = 'Q'
+        ryvs abg unfuinyvq:
+            vs rag.fun == vaqrk.RZCGL_FUN:
+                fgnghf = 'N'
+            ryfr:
+                fgnghf = 'Z'
+        ryfr:
+            fgnghf = ' '
+        vs bcg.ireobfr >= 2:
+            ybt('%f %-70f\a' % (fgnghf, rag.anzr))
+        ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
+            vs abg ynfgqve.fgnegfjvgu(qve):
+                ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
+            ynfgqve = qve
+
+    vs bcg.cebterff:
+        cebterff_ercbeg(0)
+    spbhag += 1
+    
+    vs abg rkvfgf:
+        pbagvahr
+    vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
+        vs rkvfgf naq abg unfuinyvq:
+            nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
+            ynfgfxvc_anzr = rag.anzr
+        pbagvahr
+
+    nffreg(qve.fgnegfjvgu('/'))
+    qvec = qve.fcyvg('/')
+    juvyr cnegf > qvec:
+        _cbc(sbepr_gerr = Abar)
+    vs qve != '/':
+        sbe cneg va qvec[yra(cnegf):]:
+            _chfu(cneg)
+
+    vs abg svyr:
+        # ab svyranzr cbegvba zrnaf guvf vf n fhoqve.  Ohg
+        # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
+        byqgerr = nyernql_fnirq(rag) # znl or Abar
+        arjgerr = _cbc(sbepr_gerr = byqgerr)
+        vs abg byqgerr:
+            vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
+                rag.vainyvqngr()
+            ryfr:
+                rag.inyvqngr(040000, arjgerr)
+            rag.ercnpx()
+        vs rkvfgf naq jnfzvffvat:
+            pbhag += byqfvmr
+        pbagvahr
+
+    # vg'f abg n qverpgbel
+    vq = Abar
+    vs unfuinyvq:
+        zbqr = '%b' % rag.tvgzbqr
+        vq = rag.fun
+        funyvfgf[-1].nccraq((zbqr, 
+                             tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+                             vq))
+    ryfr:
+        vs fgng.F_VFERT(rag.zbqr):
+            gel:
+                s = unfufcyvg.bcra_abngvzr(rag.anzr)
+            rkprcg VBReebe, r:
+                nqq_reebe(r)
+                ynfgfxvc_anzr = rag.anzr
+            rkprcg BFReebe, r:
+                nqq_reebe(r)
+                ynfgfxvc_anzr = rag.anzr
+            ryfr:
+                (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
+        ryfr:
+            vs fgng.F_VFQVE(rag.zbqr):
+                nffreg(0)  # unaqyrq nobir
+            ryvs fgng.F_VFYAX(rag.zbqr):
+                gel:
+                    ey = bf.ernqyvax(rag.anzr)
+                rkprcg BFReebe, r:
+                    nqq_reebe(r)
+                    ynfgfxvc_anzr = rag.anzr
+                rkprcg VBReebe, r:
+                    nqq_reebe(r)
+                    ynfgfxvc_anzr = rag.anzr
+                ryfr:
+                    (zbqr, vq) = ('120000', j.arj_oybo(ey))
+            ryfr:
+                nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
+                ynfgfxvc_anzr = rag.anzr
+        vs vq:
+            rag.inyvqngr(vag(zbqr, 8), vq)
+            rag.ercnpx()
+            funyvfgf[-1].nccraq((zbqr,
+                                 tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+                                 vq))
+    vs rkvfgf naq jnfzvffvat:
+        pbhag += byqfvmr
+        fhopbhag = 0
+
+
+vs bcg.cebterff:
+    cpg = gbgny naq pbhag*100.0/gbgny be 100
+    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar.    \a'
+             % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
+
+juvyr yra(cnegf) > 1:
+    _cbc(sbepr_gerr = Abar)
+nffreg(yra(funyvfgf) == 1)
+gerr = j.arj_gerr(funyvfgf[-1])
+vs bcg.gerr:
+    cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+    zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+    vs bcg.pbzzvg:
+        cevag pbzzvg.rapbqr('urk')
+
+j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
+        
+vs bcg.anzr:
+    vs pyv:
+        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+    ryfr:
+        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+    pyv.pybfr()
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc gvpx
+"""
+b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+g = gvzr.gvzr()
+gyrsg = 1 - (g - vag(g))
+gvzr.fyrrc(gyrsg)
+#!/hfe/ova/rai clguba
+vzcbeg bf, flf, fgng, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
+sebz ohc.urycref vzcbeg *
+
+
+qrs zretr_vaqrkrf(bhg, e1, e2):
+    sbe r va vaqrk.ZretrVgre([e1, e2]):
+        # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl?  Jura?
+        bhg.nqq_vkragel(r)
+
+
+pynff VgreUrycre:
+    qrs __vavg__(frys, y):
+        frys.v = vgre(y)
+        frys.phe = Abar
+        frys.arkg()
+
+    qrs arkg(frys):
+        gel:
+            frys.phe = frys.v.arkg()
+        rkprcg FgbcVgrengvba:
+            frys.phe = Abar
+        erghea frys.phe
+
+
+qrs purpx_vaqrk(ernqre):
+    gel:
+        ybt('purpx: purpxvat sbejneq vgrengvba...\a')
+        r = Abar
+        q = {}
+        sbe r va ernqre.sbejneq_vgre():
+            vs r.puvyqera_a:
+                vs bcg.ireobfr:
+                    ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
+                                            r.anzr))
+                nffreg(r.puvyqera_bsf)
+                nffreg(r.anzr.raqfjvgu('/'))
+                nffreg(abg q.trg(r.puvyqera_bsf))
+                q[r.puvyqera_bsf] = 1
+            vs r.syntf & vaqrk.VK_UNFUINYVQ:
+                nffreg(r.fun != vaqrk.RZCGL_FUN)
+                nffreg(r.tvgzbqr)
+        nffreg(abg r be r.anzr == '/')  # ynfg ragel vf *nyjnlf* /
+        ybt('purpx: purpxvat abezny vgrengvba...\a')
+        ynfg = Abar
+        sbe r va ernqre:
+            vs ynfg:
+                nffreg(ynfg > r.anzr)
+            ynfg = r.anzr
+    rkprcg:
+        ybt('vaqrk reebe! ng %e\a' % r)
+        envfr
+    ybt('purpx: cnffrq.\a')
+
+
+qrs hcqngr_vaqrk(gbc):
+    ev = vaqrk.Ernqre(vaqrksvyr)
+    jv = vaqrk.Jevgre(vaqrksvyr)
+    evt = VgreUrycre(ev.vgre(anzr=gbc))
+    gfgneg = vag(gvzr.gvzr())
+
+    unfutra = Abar
+    vs bcg.snxr_inyvq:
+        qrs unfutra(anzr):
+            erghea (0100644, vaqrk.SNXR_FUN)
+
+    gbgny = 0
+    sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
+        vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
+            flf.fgqbhg.jevgr('%f\a' % cngu)
+            flf.fgqbhg.syhfu()
+            cebterff('Vaqrkvat: %q\e' % gbgny)
+        ryvs abg (gbgny % 128):
+            cebterff('Vaqrkvat: %q\e' % gbgny)
+        gbgny += 1
+        juvyr evt.phe naq evt.phe.anzr > cngu:  # qryrgrq cnguf
+            vs evt.phe.rkvfgf():
+                evt.phe.frg_qryrgrq()
+                evt.phe.ercnpx()
+            evt.arkg()
+        vs evt.phe naq evt.phe.anzr == cngu:    # cnguf gung nyernql rkvfgrq
+            vs cfg:
+                evt.phe.sebz_fgng(cfg, gfgneg)
+            vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
+                vs unfutra:
+                    (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
+                    evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
+            vs bcg.snxr_vainyvq:
+                evt.phe.vainyvqngr()
+            evt.phe.ercnpx()
+            evt.arkg()
+        ryfr:  # arj cnguf
+            jv.nqq(cngu, cfg, unfutra = unfutra)
+    cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
+    
+    vs ev.rkvfgf():
+        ev.fnir()
+        jv.syhfu()
+        vs jv.pbhag:
+            je = jv.arj_ernqre()
+            vs bcg.purpx:
+                ybt('purpx: orsber zretvat: byqsvyr\a')
+                purpx_vaqrk(ev)
+                ybt('purpx: orsber zretvat: arjsvyr\a')
+                purpx_vaqrk(je)
+            zv = vaqrk.Jevgre(vaqrksvyr)
+            zretr_vaqrkrf(zv, ev, je)
+            ev.pybfr()
+            zv.pybfr()
+            je.pybfr()
+        jv.nobeg()
+    ryfr:
+        jv.pybfr()
+
+
+bcgfcrp = """
+ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
+--
+c,cevag    cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
+z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
+f,fgnghf   cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
+U,unfu     cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
+y,ybat     cevag zber vasbezngvba nobhg rnpu svyr
+h,hcqngr   (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
+k,kqri,bar-svyr-flfgrz  qba'g pebff svyrflfgrz obhaqnevrf
+snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
+snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
+purpx      pnershyyl purpx vaqrk svyr vagrtevgl
+s,vaqrksvyr=  gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+"""
+b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
+    b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
+vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
+    b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
+vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
+    b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
+
+tvg.purpx_ercb_be_qvr()
+vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
+
+unaqyr_pgey_p()
+
+vs bcg.purpx:
+    ybt('purpx: fgnegvat vavgvny purpx.\a')
+    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+cnguf = vaqrk.erqhpr_cnguf(rkgen)
+
+vs bcg.hcqngr:
+    vs abg cnguf:
+        b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
+    sbe (ec,cngu) va cnguf:
+        hcqngr_vaqrk(ec)
+
+vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
+    sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
+        vs (bcg.zbqvsvrq 
+            naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
+            pbagvahr
+        yvar = ''
+        vs bcg.fgnghf:
+            vs rag.vf_qryrgrq():
+                yvar += 'Q '
+            ryvs abg rag.vf_inyvq():
+                vs rag.fun == vaqrk.RZCGL_FUN:
+                    yvar += 'N '
+                ryfr:
+                    yvar += 'Z '
+            ryfr:
+                yvar += '  '
+        vs bcg.unfu:
+            yvar += rag.fun.rapbqr('urk') + ' '
+        vs bcg.ybat:
+            yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
+        cevag yvar + (anzr be './')
+
+vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
+    ybt('purpx: fgnegvat svany purpx.\a')
+    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg
+sebz ohc vzcbeg bcgvbaf, urycref
+
+bcgfcrp = """
+ohc eonpxhc-freire
+--
+    Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+# trg gur fhopbzznaq'f neti.
+# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
+# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
+# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
+ohs = flf.fgqva.ernq(4)
+fm = fgehpg.hacnpx('!V', ohs)[0]
+nffreg(fm > 0)
+nffreg(fm < 1000000)
+ohs = flf.fgqva.ernq(fm)
+nffreg(yra(ohs) == fm)
+neti = ohs.fcyvg('\0')
+
+# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
+# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
+# gb zvfhfr gurz.  Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
+# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
+#
+# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
+# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
+# fbpxrg.  Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
+# bs vg, ohg cebonoyl qvqa'g.  Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
+# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
+#
+# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
+# qrfpevcgbef.  Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
+# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
+bf.qhc2(0, 3)
+bf.qhc2(1, 4)
+bf.qhc2(2, 1)
+sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
+bf.qhc2(sq, 0)
+bf.pybfr(sq)
+
+bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
+bf.rkrpic(neti[0], neti)
+flf.rkvg(99)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo, fhocebprff, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+cne2_bx = 0
+ahyys = bcra('/qri/ahyy')
+
+qrs qroht(f):
+    vs bcg.ireobfr:
+        ybt(f)
+
+qrs eha(neti):
+    # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
+    # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
+    # rkrpvat sbe fbzr ernfba.  Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
+    # svefg.
+    sq = bf.qhc(2)  # pbcl fgqree
+    gel:
+        c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
+        erghea c.jnvg()
+    svanyyl:
+        bf.pybfr(sq)
+
+qrs cne2_frghc():
+    tybony cne2_bx
+    ei = 1
+    gel:
+        c = fhocebprff.Cbcra(['cne2', '--uryc'],
+                             fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
+        ei = c.jnvg()
+    rkprcg BFReebe:
+        ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
+    ryfr:
+        cne2_bx = 1
+
+qrs cnei(yiy):
+    vs bcg.ireobfr >= yiy:
+        vs vfggl:
+            erghea []
+        ryfr:
+            erghea ['-d']
+    ryfr:
+        erghea ['-dd']
+
+qrs cne2_trarengr(onfr):
+    erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
+               + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
+
+qrs cne2_irevsl(onfr):
+    erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
+
+qrs cne2_ercnve(onfr):
+    erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
+
+qrs dhvpx_irevsl(onfr):
+    s = bcra(onfr + '.cnpx', 'eo')
+    s.frrx(-20, 2)
+    jnagfhz = s.ernq(20)
+    nffreg(yra(jnagfhz) == 20)
+    s.frrx(0)
+    fhz = Fun1()
+    sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
+        fhz.hcqngr(o)
+    vs fhz.qvtrfg() != jnagfhz:
+        envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
+                                                  fhz.urkqvtrfg()))
+        
+
+qrs tvg_irevsl(onfr):
+    vs bcg.dhvpx:
+        gel:
+            dhvpx_irevsl(onfr)
+        rkprcg Rkprcgvba, r:
+            qroht('reebe: %f\a' % r)
+            erghea 1
+        erghea 0
+    ryfr:
+        erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
+    
+    
+qrs qb_cnpx(onfr, ynfg):
+    pbqr = 0
+    vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
+        ierfhyg = cne2_irevsl(onfr)
+        vs ierfhyg != 0:
+            vs bcg.ercnve:
+                eerfhyg = cne2_ercnve(onfr)
+                vs eerfhyg != 0:
+                    cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
+                    pbqr = eerfhyg
+                ryfr:
+                    cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
+                    pbqr = 100
+            ryfr:
+                cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
+                pbqr = ierfhyg
+        ryfr:
+            cevag '%f bx' % ynfg
+    ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
+        terfhyg = tvg_irevsl(onfr)
+        vs terfhyg != 0:
+            cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
+            pbqr = terfhyg
+        ryfr:
+            vs cne2_bx naq bcg.trarengr:
+                cerfhyg = cne2_trarengr(onfr)
+                vs cerfhyg != 0:
+                    cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
+                    pbqr = cerfhyg
+                ryfr:
+                    cevag '%f bx' % ynfg
+            ryfr:
+                cevag '%f bx' % ynfg
+    ryfr:
+        nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
+        qroht('    fxvccrq: cne2 svyr nyernql trarengrq.\a')
+    erghea pbqr
+
+
+bcgfcrp = """
+ohc sfpx [bcgvbaf...] [svyranzrf...]
+--
+e,ercnve    nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
+t,trarengr  trarengr nhgb-ercnve vasbezngvba hfvat cne2
+i,ireobfr   vapernfr ireobfvgl (pna or hfrq zber guna bapr)
+dhvpx       whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
+w,wbof=     eha 'a' wbof va cnenyyry
+cne2-bx     vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
+qvfnoyr-cne2  vtaber cne2 rira vs vg vf ninvynoyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+cne2_frghc()
+vs bcg.cne2_bx:
+    vs cne2_bx:
+        flf.rkvg(0)  # 'gehr' va fu
+    ryfr:
+        flf.rkvg(1)
+vs bcg.qvfnoyr_cne2:
+    cne2_bx = 0
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+    qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
+    rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
+
+pbqr = 0
+pbhag = 0
+bhgfgnaqvat = {}
+sbe anzr va rkgen:
+    vs anzr.raqfjvgu('.cnpx'):
+        onfr = anzr[:-5]
+    ryvs anzr.raqfjvgu('.vqk'):
+        onfr = anzr[:-4]
+    ryvs anzr.raqfjvgu('.cne2'):
+        onfr = anzr[:-5]
+    ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
+        onfr = anzr
+    ryfr:
+        envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
+    (qve,ynfg) = bf.cngu.fcyvg(onfr)
+    cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
+    vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
+        cne2_rkvfgf = 0
+    flf.fgqbhg.syhfu()
+    qroht('sfpx: purpxvat %f (%f)\a' 
+          % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
+    vs abg bcg.ireobfr:
+        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+    
+    vs abg bcg.wbof:
+        ap = qb_cnpx(onfr, ynfg)
+        pbqr = pbqr be ap
+        pbhag += 1
+    ryfr:
+        juvyr yra(bhgfgnaqvat) >= bcg.wbof:
+            (cvq,ap) = bf.jnvg()
+            ap >>= 8
+            vs cvq va bhgfgnaqvat:
+                qry bhgfgnaqvat[cvq]
+                pbqr = pbqr be ap
+                pbhag += 1
+        cvq = bf.sbex()
+        vs cvq:  # cnerag
+            bhgfgnaqvat[cvq] = 1
+        ryfr: # puvyq
+            gel:
+                flf.rkvg(qb_cnpx(onfr, ynfg))
+            rkprcg Rkprcgvba, r:
+                ybt('rkprcgvba: %e\a' % r)
+                flf.rkvg(99)
+                
+juvyr yra(bhgfgnaqvat):
+    (cvq,ap) = bf.jnvg()
+    ap >>= 8
+    vs cvq va bhgfgnaqvat:
+        qry bhgfgnaqvat[cvq]
+        pbqr = pbqr be ap
+        pbhag += 1
+    vs abg bcg.ireobfr:
+        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+vs abg bcg.ireobfr naq vfggl:
+    ybt('sfpx qbar.           \a')
+flf.rkvg(pbqr)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
+sebz ohc vzcbeg bcgvbaf, ffu
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc eonpxhc <ubfganzr> vaqrk ...
+ohc eonpxhc <ubfganzr> fnir ...
+ohc eonpxhc <ubfganzr> fcyvg ...
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs yra(rkgen) < 2:
+    b.sngny('nethzragf rkcrpgrq')
+
+pynff FvtRkprcgvba(Rkprcgvba):
+    qrs __vavg__(frys, fvtahz):
+        frys.fvtahz = fvtahz
+        Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
+qrs unaqyre(fvtahz, senzr):
+    envfr FvtRkprcgvba(fvtahz)
+
+fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
+fvtany.fvtany(fvtany.FVTVAG, unaqyre)
+
+fc = Abar
+c = Abar
+erg = 99
+
+gel:
+    ubfganzr = rkgen[0]
+    neti = rkgen[1:]
+    c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
+
+    netif = '\0'.wbva(['ohc'] + neti)
+    c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
+    c.fgqva.syhfu()
+
+    znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
+    fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
+
+    c.fgqva.pybfr()
+    c.fgqbhg.pybfr()
+
+svanyyl:
+    juvyr 1:
+        # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
+        # va pnfr bhe puvyq qbrfa'g qvr.
+        gel:
+            erg = c.jnvg()
+            fc.jnvg()
+            oernx
+        rkprcg FvtRkprcgvba, r:
+            ybt('\aohc eonpxhc: %f\a' % r)
+            bf.xvyy(c.cvq, r.fvtahz)
+            erg = 84
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc arjyvare
+"""
+b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+e = er.pbzcvyr(e'([\e\a])')
+ynfgyra = 0
+nyy = ''
+juvyr 1:
+    y = e.fcyvg(nyy, 1)
+    vs yra(y) <= 1:
+        gel:
+            o = bf.ernq(flf.fgqva.svyrab(), 4096)
+        rkprcg XrlobneqVagreehcg:
+            oernx
+        vs abg o:
+            oernx
+        nyy += o
+    ryfr:
+        nffreg(yra(y) == 3)
+        (yvar, fcyvgpune, nyy) = y
+        #fcyvgpune = '\a'
+        flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
+        vs fcyvgpune == '\e':
+            ynfgyra = yra(yvar)
+        ryfr:
+            ynfgyra = 0
+        flf.fgqbhg.syhfu()
+
+vs ynfgyra be nyy:
+    flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
+#!/hfe/ova/rai clguba
+vzcbeg flf
+sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc znetva
+"""
+b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+#tvg.vtaber_zvqk = 1
+
+zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+ynfg = '\0'*20
+ybatzngpu = 0
+sbe v va zv:
+    vs v == ynfg:
+        pbagvahr
+    #nffreg(fge(v) >= ynfg)
+    cz = _unfufcyvg.ovgzngpu(ynfg, v)
+    ybatzngpu = znk(ybatzngpu, cz)
+    ynfg = v
+cevag ybatzngpu
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg bcgvbaf, qerphefr
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc qerphefr <cngu>
+--
+k,kqri,bar-svyr-flfgrz   qba'g pebff svyrflfgrz obhaqnevrf
+d,dhvrg  qba'g npghnyyl cevag svyranzrf
+cebsvyr  eha haqre gur clguba cebsvyre
+"""
+b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar svyranzr rkcrpgrq")
+
+vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
+vs bcg.cebsvyr:
+    vzcbeg pCebsvyr
+    qrs qb_vg():
+        sbe v va vg:
+            cnff
+    pCebsvyr.eha('qb_vg()')
+ryfr:
+    vs bcg.dhvrg:
+        sbe v va vg:
+            cnff
+    ryfr:
+        sbe (anzr,fg) va vg:
+            cevag anzr
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+o,oybof    bhgchg n frevrf bs oybo vqf
+g,gerr     bhgchg n gerr vq
+p,pbzzvg   bhgchg n pbzzvg vq
+a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
+A,abbc     qba'g npghnyyl fnir gur qngn naljurer
+d,dhvrg    qba'g cevag cebterff zrffntrf
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+pbcl       whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
+orapu      cevag orapuznex gvzvatf gb fgqree
+znk-cnpx-fvmr=  znkvzhz olgrf va n fvatyr cnpx
+znk-cnpx-bowrpgf=  znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
+snabhg=  znkvzhz ahzore bs oybof va n fvatyr gerr
+"""
+b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
+        bcg.abbc be bcg.pbcl):
+    b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
+vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be 
+                               bcg.pbzzvg be bcg.anzr):
+    b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
+
+vs bcg.ireobfr >= 2:
+    tvg.ireobfr = bcg.ireobfr - 1
+    bcg.orapu = 1
+vs bcg.znk_cnpx_fvmr:
+    unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
+vs bcg.znk_cnpx_bowrpgf:
+    unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
+vs bcg.snabhg:
+    unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
+vs bcg.oybof:
+    unfufcyvg.snabhg = 0
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+fgneg_gvzr = gvzr.gvzr()
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.abbc be bcg.pbcl:
+    pyv = j = byqers = Abar
+ryvs bcg.erzbgr be vf_erirefr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+    j = pyv.arj_cnpxjevgre()
+ryfr:
+    pyv = Abar
+    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+    j = tvg.CnpxJevgre()
+
+svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
+vs j:
+    funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
+    gerr = j.arj_gerr(funyvfg)
+ryfr:
+    ynfg = 0
+    sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
+        unfufcyvg.gbgny_fcyvg += yra(oybo)
+        vs bcg.pbcl:
+            flf.fgqbhg.jevgr(fge(oybo))
+        zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
+        vs abg bcg.dhvrg naq ynfg != zrtf:
+            cebterff('%q Zolgrf ernq\e' % zrtf)
+            ynfg = zrtf
+    cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
+
+vs bcg.ireobfr:
+    ybt('\a')
+vs bcg.oybof:
+    sbe (zbqr,anzr,ova) va funyvfg:
+        cevag ova.rapbqr('urk')
+vs bcg.gerr:
+    cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+    zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+    vs bcg.pbzzvg:
+        cevag pbzzvg.rapbqr('urk')
+
+vs j:
+    j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
+        
+vs bcg.anzr:
+    vs pyv:
+        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+    ryfr:
+        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+    pyv.pybfr()
+
+frpf = gvzr.gvzr() - fgneg_gvzr
+fvmr = unfufcyvg.gbgny_fcyvg
+vs bcg.orapu:
+    ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
+        % (fvmr/1024., frpf, fvmr/1024./frpf))
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, fgehpg, zznc
+sebz ohc vzcbeg tvg, bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs f_sebz_olgrf(olgrf):
+    pyvfg = [pue(o) sbe o va olgrf]
+    erghea ''.wbva(pyvfg)
+
+
+qrs ercbeg(pbhag):
+    svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
+    q = {}
+    sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
+        y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
+        q[y[0]] = y[1]
+    vs pbhag >= 0:
+        r1 = pbhag
+        svryqf = [q[x] sbe x va svryqf]
+    ryfr:
+        r1 = ''
+    cevag ('%9f  ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
+    flf.fgqbhg.syhfu()
+
+
+bcgfcrp = """
+ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
+--
+a,ahzore=  ahzore bs bowrpgf cre plpyr
+p,plpyrf=  ahzore bs plpyrf gb eha
+vtaber-zvqk  vtaber .zvqk svyrf, hfr bayl .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+tvg.vtaber_zvqk = bcg.vtaber_zvqk
+
+tvg.purpx_ercb_be_qvr()
+z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+
+plpyrf = bcg.plpyrf be 100
+ahzore = bcg.ahzore be 10000
+
+ercbeg(-1)
+s = bcra('/qri/henaqbz')
+n = zznc.zznc(-1, 20)
+ercbeg(0)
+sbe p va kenatr(plpyrf):
+    sbe a va kenatr(ahzore):
+        o = s.ernq(3)
+        vs 0:
+            olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
+            olgrf[2] &= 0ks0
+            ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
+        ryfr:
+            n[0:2] = o[0:2]
+            n[2] = pue(beq(o[2]) & 0ks0)
+            ova = fge(n[0:20])
+        #cevag ova.rapbqr('urk')
+        z.rkvfgf(ova)
+    ercbeg((p+1)*ahzore)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+qrs cevag_abqr(grkg, a):
+    cersvk = ''
+    vs bcg.unfu:
+        cersvk += "%f " % a.unfu.rapbqr('urk')
+    vs fgng.F_VFQVE(a.zbqr):
+        cevag '%f%f/' % (cersvk, grkg)
+    ryvs fgng.F_VFYAX(a.zbqr):
+        cevag '%f%f@' % (cersvk, grkg)
+    ryfr:
+        cevag '%f%f' % (cersvk, grkg)
+
+
+bcgfcrp = """
+ohc yf <qvef...>
+--
+f,unfu   fubj unfu sbe rnpu svyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+
+vs abg rkgen:
+    rkgen = ['/']
+
+erg = 0
+sbe q va rkgen:
+    gel:
+        a = gbc.yerfbyir(q)
+        vs fgng.F_VFQVE(a.zbqr):
+            sbe fho va a:
+                cevag_abqr(fho.anzr, fho)
+        ryfr:
+            cevag_abqr(q, a)
+    rkprcg isf.AbqrReebe, r:
+        ybt('reebe: %f\a' % r)
+        erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
+sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
+sebz ohc.urycref vzcbeg *
+
+qrs abqr_anzr(grkg, a):
+    vs fgng.F_VFQVE(a.zbqr):
+        erghea '%f/' % grkg
+    ryvs fgng.F_VFYAX(a.zbqr):
+        erghea '%f@' % grkg
+    ryfr:
+        erghea '%f' % grkg
+
+
+qrs qb_yf(cngu, a):
+    y = []
+    vs fgng.F_VFQVE(a.zbqr):
+        sbe fho va a:
+            y.nccraq(abqr_anzr(fho.anzr, fho))
+    ryfr:
+        y.nccraq(abqr_anzr(cngu, a))
+    cevag pbyhzangr(y, '')
+    
+
+qrs jevgr_gb_svyr(vas, bhgs):
+    sbe oybo va puhaxlernqre(vas):
+        bhgs.jevgr(oybo)
+    
+
+qrs vachgvgre():
+    vs bf.vfnggl(flf.fgqva.svyrab()):
+        juvyr 1:
+            gel:
+                lvryq enj_vachg('ohc> ')
+            rkprcg RBSReebe:
+                oernx
+    ryfr:
+        sbe yvar va flf.fgqva:
+            lvryq yvar
+
+
+qrs _pbzcyrgre_trg_fhof(yvar):
+    (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
+    (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
+    #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
+    a = cjq.erfbyir(qve)
+    fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
+                       a.fhof()))
+    erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
+
+
+_ynfg_yvar = Abar
+_ynfg_erf = Abar
+qrs pbzcyrgre(grkg, fgngr):
+    tybony _ynfg_yvar
+    tybony _ynfg_erf
+    gel:
+        yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
+        vs _ynfg_yvar != yvar:
+            _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
+            _ynfg_yvar = yvar
+        (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
+        vs fgngr < yra(fhof):
+            fa = fhof[fgngr]
+            fa1 = fa.erfbyir('')  # qrers flzyvaxf
+            shyyanzr = bf.cngu.wbva(qve, fa.anzr)
+            vs fgng.F_VFQVE(fa1.zbqr):
+                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
+                                          grezvangr=Snyfr)
+            ryfr:
+                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
+                                          grezvangr=Gehr) + ' '
+            erghea grkg + erg
+    rkprcg Rkprcgvba, r:
+        ybt('\areebe va pbzcyrgvba: %f\a' % r)
+
+            
+bcgfcrp = """
+ohc sgc
+"""
+b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+gbc = isf.ErsYvfg(Abar)
+cjq = gbc
+
+vs rkgen:
+    yvarf = rkgen
+ryfr:
+    ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
+    ernqyvar.frg_pbzcyrgre(pbzcyrgre)
+    ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
+    yvarf = vachgvgre()
+
+sbe yvar va yvarf:
+    vs abg yvar.fgevc():
+        pbagvahr
+    jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
+    pzq = jbeqf[0].ybjre()
+    #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
+    gel:
+        vs pzq == 'yf':
+            sbe cnez va (jbeqf[1:] be ['.']):
+                qb_yf(cnez, cjq.erfbyir(cnez))
+        ryvs pzq == 'pq':
+            sbe cnez va jbeqf[1:]:
+                cjq = cjq.erfbyir(cnez)
+        ryvs pzq == 'cjq':
+            cevag cjq.shyyanzr()
+        ryvs pzq == 'png':
+            sbe cnez va jbeqf[1:]:
+                jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
+        ryvs pzq == 'trg':
+            vs yra(jbeqf) abg va [2,3]:
+                envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
+            eanzr = jbeqf[1]
+            (qve,onfr) = bf.cngu.fcyvg(eanzr)
+            yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
+            vas = cjq.erfbyir(eanzr).bcra()
+            ybt('Fnivat %e\a' % yanzr)
+            jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
+        ryvs pzq == 'ztrg':
+            sbe cnez va jbeqf[1:]:
+                (qve,onfr) = bf.cngu.fcyvg(cnez)
+                sbe a va cjq.erfbyir(qve).fhof():
+                    vs sazngpu.sazngpu(a.anzr, onfr):
+                        gel:
+                            ybt('Fnivat %e\a' % a.anzr)
+                            vas = a.bcra()
+                            bhgs = bcra(a.anzr, 'jo')
+                            jevgr_gb_svyr(vas, bhgs)
+                            bhgs.pybfr()
+                        rkprcg Rkprcgvba, r:
+                            ybt('  reebe: %f\a' % r)
+        ryvs pzq == 'uryc' be pzq == '?':
+            ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
+        ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
+            oernx
+        ryfr:
+            envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
+    rkprcg Rkprcgvba, r:
+        ybt('reebe: %f\a' % r)
+        #envfr
+#!/hfe/ova/rai clguba
+vzcbeg flf, zznc
+sebz ohc vzcbeg bcgvbaf, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc enaqbz [-F frrq] <ahzolgrf>
+--
+F,frrq=   bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
+s,sbepr   cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
+"""
+b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+gbgny = cnefr_ahz(rkgen[0])
+
+vs bcg.sbepr be (abg bf.vfnggl(1) naq
+                 abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
+    _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
+ryfr:
+    ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc uryc <pbzznaq>
+"""
+b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) == 0:
+    # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
+    bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
+ryvs yra(rkgen) == 1:
+    qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
+    rkr = flf.neti[0]
+    (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
+    znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
+    t = tybo.tybo(znacngu)
+    vs t:
+        bf.rkrpic('zna', ['zna', '-y', t[0]])
+    ryfr:
+        bf.rkrpic('zna', ['zna', qbpanzr])
+ryfr:
+    b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+
+pynff Fgng(shfr.Fgng):
+    qrs __vavg__(frys):
+        frys.fg_zbqr = 0
+        frys.fg_vab = 0
+        frys.fg_qri = 0
+        frys.fg_ayvax = 0
+        frys.fg_hvq = 0
+        frys.fg_tvq = 0
+        frys.fg_fvmr = 0
+        frys.fg_ngvzr = 0
+        frys.fg_zgvzr = 0
+        frys.fg_pgvzr = 0
+        frys.fg_oybpxf = 0
+        frys.fg_oyxfvmr = 0
+        frys.fg_eqri = 0
+
+
+pnpur = {}
+qrs pnpur_trg(gbc, cngu):
+    cnegf = cngu.fcyvg('/')
+    pnpur[('',)] = gbc
+    p = Abar
+    znk = yra(cnegf)
+    #ybt('pnpur: %e\a' % pnpur.xrlf())
+    sbe v va enatr(znk):
+        cer = cnegf[:znk-v]
+        #ybt('pnpur gelvat: %e\a' % cer)
+        p = pnpur.trg(ghcyr(cer))
+        vs p:
+            erfg = cnegf[znk-v:]
+            sbe e va erfg:
+                #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
+                p = p.yerfbyir(e)
+                xrl = ghcyr(cer + [e])
+                #ybt('fnivat: %e\a' % (xrl,))
+                pnpur[xrl] = p
+            oernx
+    nffreg(p)
+    erghea p
+        
+    
+
+pynff OhcSf(shfr.Shfr):
+    qrs __vavg__(frys, gbc):
+        shfr.Shfr.__vavg__(frys)
+        frys.gbc = gbc
+    
+    qrs trgngge(frys, cngu):
+        ybt('--trgngge(%e)\a' % cngu)
+        gel:
+            abqr = pnpur_trg(frys.gbc, cngu)
+            fg = Fgng()
+            fg.fg_zbqr = abqr.zbqr
+            fg.fg_ayvax = abqr.ayvaxf()
+            fg.fg_fvmr = abqr.fvmr()
+            fg.fg_zgvzr = abqr.zgvzr
+            fg.fg_pgvzr = abqr.pgvzr
+            fg.fg_ngvzr = abqr.ngvzr
+            erghea fg
+        rkprcg isf.AbFhpuSvyr:
+            erghea -reeab.RABRAG
+
+    qrs ernqqve(frys, cngu, bssfrg):
+        ybt('--ernqqve(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        lvryq shfr.Qveragel('.')
+        lvryq shfr.Qveragel('..')
+        sbe fho va abqr.fhof():
+            lvryq shfr.Qveragel(fho.anzr)
+
+    qrs ernqyvax(frys, cngu):
+        ybt('--ernqyvax(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        erghea abqr.ernqyvax()
+
+    qrs bcra(frys, cngu, syntf):
+        ybt('--bcra(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
+        vs (syntf & nppzbqr) != bf.B_EQBAYL:
+            erghea -reeab.RNPPRF
+        abqr.bcra()
+
+    qrs eryrnfr(frys, cngu, syntf):
+        ybt('--eryrnfr(%e)\a' % cngu)
+
+    qrs ernq(frys, cngu, fvmr, bssfrg):
+        ybt('--ernq(%e)\a' % cngu)
+        a = pnpur_trg(frys.gbc, cngu)
+        b = a.bcra()
+        b.frrx(bssfrg)
+        erghea b.ernq(fvmr)
+
+
+vs abg unfngge(shfr, '__irefvba__'):
+    envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
+shfr.shfr_clguba_ncv = (0, 2)
+
+
+bcgfcrp = """
+ohc shfr [-q] [-s] <zbhagcbvag>
+--
+q,qroht   vapernfr qroht yriry
+s,sbertebhaq  eha va sbertebhaq
+"""
+b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+s = OhcSf(gbc)
+s.shfr_netf.zbhagcbvag = rkgen[0]
+vs bcg.qroht:
+    s.shfr_netf.nqq('qroht')
+vs bcg.sbertebhaq:
+    s.shfr_netf.frgzbq('sbertebhaq')
+cevag s.zhygvguernqrq
+s.zhygvguernqrq = Snyfr
+
+s.znva()
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+
+vs bcg.erzbgr:
+    tvg.vavg_ercb()  # ybpny ercb
+    tvg.purpx_ercb_be_qvr()
+    pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
+    pyv.pybfr()
+ryfr:
+    tvg.vavg_ercb()
+#!/hfe/ova/rai clguba
+vzcbeg flf, zngu, fgehpg, tybo
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+CNTR_FVMR=4096
+FUN_CRE_CNTR=CNTR_FVMR/200.
+
+
+qrs zretr(vqkyvfg, ovgf, gnoyr):
+    pbhag = 0
+    sbe r va tvg.vqkzretr(vqkyvfg):
+        pbhag += 1
+        cersvk = tvg.rkgenpg_ovgf(r, ovgf)
+        gnoyr[cersvk] = pbhag
+        lvryq r
+
+
+qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
+    vs abg bhgsvyranzr:
+        nffreg(bhgqve)
+        fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
+        bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
+    
+    vac = []
+    gbgny = 0
+    sbe anzr va vasvyranzrf:
+        vk = tvg.CnpxVqk(anzr)
+        vac.nccraq(vk)
+        gbgny += yra(vk)
+
+    ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
+    vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
+       be (bcg.sbepr naq abg gbgny):
+        ybt('zvqk: abguvat gb qb.\a')
+        erghea
+
+    cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
+    ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
+    ragevrf = 2**ovgf
+    ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
+    
+    gnoyr = [0]*ragevrf
+
+    gel:
+        bf.hayvax(bhgsvyranzr)
+    rkprcg BFReebe:
+        cnff
+    s = bcra(bhgsvyranzr + '.gzc', 'j+')
+    s.jevgr('ZVQK\0\0\0\2')
+    s.jevgr(fgehpg.cnpx('!V', ovgf))
+    nffreg(s.gryy() == 12)
+    s.jevgr('\0'*4*ragevrf)
+    
+    sbe r va zretr(vac, ovgf, gnoyr):
+        s.jevgr(r)
+        
+    s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
+
+    s.frrx(12)
+    s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
+    s.pybfr()
+    bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
+
+    # guvf vf whfg sbe grfgvat
+    vs 0:
+        c = tvg.CnpxZvqk(bhgsvyranzr)
+        nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
+        cevag c.vqkanzrf
+        nffreg(yra(c) == gbgny)
+        cv = vgre(c)
+        sbe v va zretr(vac, gbgny, ovgf, gnoyr):
+            nffreg(v == cv.arkg())
+            nffreg(c.rkvfgf(v))
+
+    cevag bhgsvyranzr
+
+bcgfcrp = """
+ohc zvqk [bcgvbaf...] <vqkanzrf...>
+--
+b,bhgchg=  bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
+n,nhgb     nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
+s,sbepr    nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen naq (bcg.nhgb be bcg.sbepr):
+    b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
+
+tvg.purpx_ercb_be_qvr()
+
+vs rkgen:
+    qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
+ryvs bcg.nhgb be bcg.sbepr:
+    cnguf = [tvg.ercb('bowrpgf/cnpx')]
+    cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
+    sbe cngu va cnguf:
+        ybt('zvqk: fpnaavat %f\a' % cngu)
+        vs bcg.sbepr:
+            qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
+        ryvs bcg.nhgb:
+            z = tvg.CnpxVqkYvfg(cngu)
+            arrqrq = {}
+            sbe cnpx va z.cnpxf:  # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
+                vs cnpx.anzr.raqfjvgu('.vqk'):
+                    arrqrq[cnpx.anzr] = 1
+            qry z
+            qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
+        ybt('\a')
+ryfr:
+    b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, enaqbz
+sebz ohc vzcbeg bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs enaqoybpx(a):
+    y = []
+    sbe v va kenatr(a):
+        y.nccraq(pue(enaqbz.enaqenatr(0,256)))
+    erghea ''.wbva(y)
+
+
+bcgfcrp = """
+ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
+--
+   JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
+a,ahz=   ahzore bs oybpxf gb qnzntr
+f,fvmr=  znkvzhz fvmr bs rnpu qnzntrq oybpx
+creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
+rdhny    fcernq qnzntr rirayl guebhtubhg gur svyr
+F,frrq=  enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
+"""
+b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg rkgen:
+    b.sngny('svyranzrf rkcrpgrq')
+
+vs bcg.frrq != Abar:
+    enaqbz.frrq(bcg.frrq)
+
+sbe anzr va rkgen:
+    ybt('Qnzntvat "%f"...\a' % anzr)
+    s = bcra(anzr, 'e+o')
+    fg = bf.sfgng(s.svyrab())
+    fvmr = fg.fg_fvmr
+    vs bcg.creprag be bcg.fvmr:
+        zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
+        zf2 = bcg.fvmr be fvmr
+        znkfvmr = zva(zf1, zf2)
+    ryfr:
+        znkfvmr = 1
+    puhaxf = bcg.ahz be 10
+    puhaxfvmr = fvmr/puhaxf
+    sbe e va enatr(puhaxf):
+        fm = enaqbz.enaqenatr(1, znkfvmr+1)
+        vs fm > fvmr:
+            fm = fvmr
+        vs bcg.rdhny:
+            bsf = e*puhaxfvmr
+        ryfr:
+            bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
+        ybt('  %6q olgrf ng %q\a' % (fm, bsf))
+        s.frrx(bsf)
+        s.jevgr(enaqoybpx(fm))
+    s.pybfr()
+#!/hfe/ova/rai clguba
+vzcbeg flf, fgehpg, zznc
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+fhfcraqrq_j = Abar
+
+
+qrs vavg_qve(pbaa, net):
+    tvg.vavg_ercb(net)
+    ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
+    pbaa.bx()
+
+
+qrs frg_qve(pbaa, net):
+    tvg.purpx_ercb_be_qvr(net)
+    ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
+    pbaa.bx()
+
+    
+qrs yvfg_vaqrkrf(pbaa, whax):
+    tvg.purpx_ercb_be_qvr()
+    sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
+        vs s.raqfjvgu('.vqk'):
+            pbaa.jevgr('%f\a' % s)
+    pbaa.bx()
+
+
+qrs fraq_vaqrk(pbaa, anzr):
+    tvg.purpx_ercb_be_qvr()
+    nffreg(anzr.svaq('/') < 0)
+    nffreg(anzr.raqfjvgu('.vqk'))
+    vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
+    pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
+    pbaa.jevgr(vqk.znc)
+    pbaa.bx()
+
+
+qrs erprvir_bowrpgf(pbaa, whax):
+    tybony fhfcraqrq_j
+    tvg.purpx_ercb_be_qvr()
+    fhttrfgrq = {}
+    vs fhfcraqrq_j:
+        j = fhfcraqrq_j
+        fhfcraqrq_j = Abar
+    ryfr:
+        j = tvg.CnpxJevgre()
+    juvyr 1:
+        af = pbaa.ernq(4)
+        vs abg af:
+            j.nobeg()
+            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
+        a = fgehpg.hacnpx('!V', af)[0]
+        #ybt('rkcrpgvat %q olgrf\a' % a)
+        vs abg a:
+            ybt('ohc freire: erprvirq %q bowrpg%f.\a' 
+                % (j.pbhag, j.pbhag!=1 naq "f" be ''))
+            shyycngu = j.pybfr()
+            vs shyycngu:
+                (qve, anzr) = bf.cngu.fcyvg(shyycngu)
+                pbaa.jevgr('%f.vqk\a' % anzr)
+            pbaa.bx()
+            erghea
+        ryvs a == 0kssssssss:
+            ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
+            fhfcraqrq_j = j
+            pbaa.bx()
+            erghea
+            
+        ohs = pbaa.ernq(a)  # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
+        #ybt('ernq %q olgrf\a' % a)
+        vs yra(ohs) < a:
+            j.nobeg()
+            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
+                            % (a, yra(ohs)))
+        (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
+        fun = tvg.pnyp_unfu(glcr, pbagrag)
+        byqcnpx = j.rkvfgf(fun)
+        # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
+        # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
+        # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
+        # ba gur freire fvqr.
+        vs abg fhttrfgrq naq \
+          byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
+            # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
+            # ng guvf ynlre.  Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
+            # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
+            # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
+            # znxr gur svyrf ovttre.  Guvf zrgubq vf pregnvayl abg irel
+            # rssvpvrag.
+            j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
+            byqcnpx = j.bowpnpur.rkvfgf(fun)
+            ybt('arj fhttrfgvba: %e\a' % byqcnpx)
+            nffreg(byqcnpx)
+            nffreg(byqcnpx != Gehr)
+            nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
+            j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
+        vs abg fhttrfgrq naq byqcnpx:
+            nffreg(byqcnpx.raqfjvgu('.vqk'))
+            (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
+            vs abg (anzr va fhttrfgrq):
+                ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
+                pbaa.jevgr('vaqrk %f\a' % anzr)
+                fhttrfgrq[anzr] = 1
+        ryfr:
+            j._enj_jevgr([ohs])
+    # ABGERNPURQ
+
+
+qrs ernq_ers(pbaa, ersanzr):
+    tvg.purpx_ercb_be_qvr()
+    e = tvg.ernq_ers(ersanzr)
+    pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
+    pbaa.bx()
+
+
+qrs hcqngr_ers(pbaa, ersanzr):
+    tvg.purpx_ercb_be_qvr()
+    arjiny = pbaa.ernqyvar().fgevc()
+    byqiny = pbaa.ernqyvar().fgevc()
+    tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
+    pbaa.bx()
+
+
+qrs png(pbaa, vq):
+    tvg.purpx_ercb_be_qvr()
+    gel:
+        sbe oybo va tvg.png(vq):
+            pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
+            pbaa.jevgr(oybo)
+    rkprcg XrlReebe, r:
+        ybt('freire: reebe: %f\a' % r)
+        pbaa.jevgr('\0\0\0\0')
+        pbaa.reebe(r)
+    ryfr:
+        pbaa.jevgr('\0\0\0\0')
+        pbaa.bx()
+
+
+bcgfcrp = """
+ohc freire
+"""
+b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+ybt('ohc freire: ernqvat sebz fgqva.\a')
+
+pbzznaqf = {
+    'vavg-qve': vavg_qve,
+    'frg-qve': frg_qve,
+    'yvfg-vaqrkrf': yvfg_vaqrkrf,
+    'fraq-vaqrk': fraq_vaqrk,
+    'erprvir-bowrpgf': erprvir_bowrpgf,
+    'ernq-ers': ernq_ers,
+    'hcqngr-ers': hcqngr_ers,
+    'png': png,
+}
+
+# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
+# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
+pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
+ye = yvarernqre(pbaa)
+sbe _yvar va ye:
+    yvar = _yvar.fgevc()
+    vs abg yvar:
+        pbagvahr
+    ybt('ohc freire: pbzznaq: %e\a' % yvar)
+    jbeqf = yvar.fcyvg(' ', 1)
+    pzq = jbeqf[0]
+    erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
+    vs pzq == 'dhvg':
+        oernx
+    ryfr:
+        pzq = pbzznaqf.trg(pzq)
+        vs pzq:
+            pzq(pbaa, erfg)
+        ryfr:
+            envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
+
+ybt('ohc freire: qbar\a')
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+    rkgen = yvarernqre(flf.fgqva)
+
+erg = 0
+
+vs bcg.erzbgr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    png = pyv.png
+ryfr:
+    pc = tvg.PngCvcr()
+    png = pc.wbva
+
+sbe vq va rkgen:
+    gel:
+        sbe oybo va png(vq):
+            flf.fgqbhg.jevgr(oybo)
+    rkprcg XrlReebe, r:
+        flf.fgqbhg.syhfu()
+        ybt('reebe: %f\a' % r)
+        erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, reeab, fgng, gvzr, zngu
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc fnir [-gp] [-a anzr] <svyranzrf...>
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+g,gerr     bhgchg n gerr vq
+p,pbzzvg   bhgchg n pbzzvg vq
+a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+d,dhvrg    qba'g fubj cebterff zrgre
+fznyyre=   bayl onpx hc svyrf fznyyre guna a olgrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
+    b.sngny("hfr bar be zber bs -g, -p, -a")
+vs abg rkgen:
+    b.sngny("ab svyranzrf tvira")
+
+bcg.cebterff = (vfggl naq abg bcg.dhvrg)
+bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.erzbgr be vf_erirefr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+    j = pyv.arj_cnpxjevgre()
+ryfr:
+    pyv = Abar
+    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+    j = tvg.CnpxJevgre()
+
+unaqyr_pgey_p()
+
+
+qrs rngfynfu(qve):
+    vs qve.raqfjvgu('/'):
+        erghea qve[:-1]
+    ryfr:
+        erghea qve
+
+
+cnegf = ['']
+funyvfgf = [[]]
+
+qrs _chfu(cneg):
+    nffreg(cneg)
+    cnegf.nccraq(cneg)
+    funyvfgf.nccraq([])
+
+qrs _cbc(sbepr_gerr):
+    nffreg(yra(cnegf) >= 1)
+    cneg = cnegf.cbc()
+    funyvfg = funyvfgf.cbc()
+    gerr = sbepr_gerr be j.arj_gerr(funyvfg)
+    vs funyvfgf:
+        funyvfgf[-1].nccraq(('40000', cneg, gerr))
+    ryfr:  # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
+        funyvfgf.nccraq(funyvfg)
+    erghea gerr
+
+ynfgerznva = Abar
+qrs cebterff_ercbeg(a):
+    tybony pbhag, fhopbhag, ynfgerznva
+    fhopbhag += a
+    pp = pbhag + fhopbhag
+    cpg = gbgny naq (pp*100.0/gbgny) be 0
+    abj = gvzr.gvzr()
+    ryncfrq = abj - gfgneg
+    xcf = ryncfrq naq vag(pp/1024./ryncfrq)
+    xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
+    xcf = vag(xcf/xcf_senp)*xcf_senp
+    vs pp:
+        erznva = ryncfrq*1.0/pp * (gbgny-pp)
+    ryfr:
+        erznva = 0.0
+    vs (ynfgerznva naq (erznva > ynfgerznva)
+          naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
+        erznva = ynfgerznva
+    ryfr:
+        ynfgerznva = erznva
+    ubhef = vag(erznva/60/60)
+    zvaf = vag(erznva/60 - ubhef*60)
+    frpf = vag(erznva - ubhef*60*60 - zvaf*60)
+    vs ryncfrq < 30:
+        erznvafge = ''
+        xcffge = ''
+    ryfr:
+        xcffge = '%qx/f' % xcf
+        vs ubhef:
+            erznvafge = '%qu%qz' % (ubhef, zvaf)
+        ryvs zvaf:
+            erznvafge = '%qz%q' % (zvaf, frpf)
+        ryfr:
+            erznvafge = '%qf' % frpf
+    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
+             % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
+                erznvafge, xcffge))
+
+
+e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
+
+qrs nyernql_fnirq(rag):
+    erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
+
+qrs jnagerphefr_cer(rag):
+    erghea abg nyernql_fnirq(rag)
+
+qrs jnagerphefr_qhevat(rag):
+    erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
+
+gbgny = sgbgny = 0
+vs bcg.cebterff:
+    sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
+        vs abg (sgbgny % 10024):
+            cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
+        rkvfgf = rag.rkvfgf()
+        unfuinyvq = nyernql_fnirq(rag)
+        rag.frg_fun_zvffvat(abg unfuinyvq)
+        vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
+            vs rkvfgf naq abg unfuinyvq:
+                gbgny += rag.fvmr
+        sgbgny += 1
+    cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
+    unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
+
+gfgneg = gvzr.gvzr()
+pbhag = fhopbhag = spbhag = 0
+ynfgfxvc_anzr = Abar
+ynfgqve = ''
+sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
+    (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
+    rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
+    unfuinyvq = nyernql_fnirq(rag)
+    jnfzvffvat = rag.fun_zvffvat()
+    byqfvmr = rag.fvmr
+    vs bcg.ireobfr:
+        vs abg rkvfgf:
+            fgnghf = 'Q'
+        ryvs abg unfuinyvq:
+            vs rag.fun == vaqrk.RZCGL_FUN:
+                fgnghf = 'N'
+            ryfr:
+                fgnghf = 'Z'
+        ryfr:
+            fgnghf = ' '
+        vs bcg.ireobfr >= 2:
+            ybt('%f %-70f\a' % (fgnghf, rag.anzr))
+        ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
+            vs abg ynfgqve.fgnegfjvgu(qve):
+                ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
+            ynfgqve = qve
+
+    vs bcg.cebterff:
+        cebterff_ercbeg(0)
+    spbhag += 1
+    
+    vs abg rkvfgf:
+        pbagvahr
+    vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
+        vs rkvfgf naq abg unfuinyvq:
+            nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
+            ynfgfxvc_anzr = rag.anzr
+        pbagvahr
+
+    nffreg(qve.fgnegfjvgu('/'))
+    qvec = qve.fcyvg('/')
+    juvyr cnegf > qvec:
+        _cbc(sbepr_gerr = Abar)
+    vs qve != '/':
+        sbe cneg va qvec[yra(cnegf):]:
+            _chfu(cneg)
+
+    vs abg svyr:
+        # ab svyranzr cbegvba zrnaf guvf vf n fhoqve.  Ohg
+        # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
+        byqgerr = nyernql_fnirq(rag) # znl or Abar
+        arjgerr = _cbc(sbepr_gerr = byqgerr)
+        vs abg byqgerr:
+            vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
+                rag.vainyvqngr()
+            ryfr:
+                rag.inyvqngr(040000, arjgerr)
+            rag.ercnpx()
+        vs rkvfgf naq jnfzvffvat:
+            pbhag += byqfvmr
+        pbagvahr
+
+    # vg'f abg n qverpgbel
+    vq = Abar
+    vs unfuinyvq:
+        zbqr = '%b' % rag.tvgzbqr
+        vq = rag.fun
+        funyvfgf[-1].nccraq((zbqr, 
+                             tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+                             vq))
+    ryfr:
+        vs fgng.F_VFERT(rag.zbqr):
+            gel:
+                s = unfufcyvg.bcra_abngvzr(rag.anzr)
+            rkprcg VBReebe, r:
+                nqq_reebe(r)
+                ynfgfxvc_anzr = rag.anzr
+            rkprcg BFReebe, r:
+                nqq_reebe(r)
+                ynfgfxvc_anzr = rag.anzr
+            ryfr:
+                (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
+        ryfr:
+            vs fgng.F_VFQVE(rag.zbqr):
+                nffreg(0)  # unaqyrq nobir
+            ryvs fgng.F_VFYAX(rag.zbqr):
+                gel:
+                    ey = bf.ernqyvax(rag.anzr)
+                rkprcg BFReebe, r:
+                    nqq_reebe(r)
+                    ynfgfxvc_anzr = rag.anzr
+                rkprcg VBReebe, r:
+                    nqq_reebe(r)
+                    ynfgfxvc_anzr = rag.anzr
+                ryfr:
+                    (zbqr, vq) = ('120000', j.arj_oybo(ey))
+            ryfr:
+                nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
+                ynfgfxvc_anzr = rag.anzr
+        vs vq:
+            rag.inyvqngr(vag(zbqr, 8), vq)
+            rag.ercnpx()
+            funyvfgf[-1].nccraq((zbqr,
+                                 tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+                                 vq))
+    vs rkvfgf naq jnfzvffvat:
+        pbhag += byqfvmr
+        fhopbhag = 0
+
+
+vs bcg.cebterff:
+    cpg = gbgny naq pbhag*100.0/gbgny be 100
+    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar.    \a'
+             % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
+
+juvyr yra(cnegf) > 1:
+    _cbc(sbepr_gerr = Abar)
+nffreg(yra(funyvfgf) == 1)
+gerr = j.arj_gerr(funyvfgf[-1])
+vs bcg.gerr:
+    cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+    zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+    vs bcg.pbzzvg:
+        cevag pbzzvg.rapbqr('urk')
+
+j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
+        
+vs bcg.anzr:
+    vs pyv:
+        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+    ryfr:
+        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+    pyv.pybfr()
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc gvpx
+"""
+b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+g = gvzr.gvzr()
+gyrsg = 1 - (g - vag(g))
+gvzr.fyrrc(gyrsg)
+#!/hfe/ova/rai clguba
+vzcbeg bf, flf, fgng, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
+sebz ohc.urycref vzcbeg *
+
+
+qrs zretr_vaqrkrf(bhg, e1, e2):
+    sbe r va vaqrk.ZretrVgre([e1, e2]):
+        # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl?  Jura?
+        bhg.nqq_vkragel(r)
+
+
+pynff VgreUrycre:
+    qrs __vavg__(frys, y):
+        frys.v = vgre(y)
+        frys.phe = Abar
+        frys.arkg()
+
+    qrs arkg(frys):
+        gel:
+            frys.phe = frys.v.arkg()
+        rkprcg FgbcVgrengvba:
+            frys.phe = Abar
+        erghea frys.phe
+
+
+qrs purpx_vaqrk(ernqre):
+    gel:
+        ybt('purpx: purpxvat sbejneq vgrengvba...\a')
+        r = Abar
+        q = {}
+        sbe r va ernqre.sbejneq_vgre():
+            vs r.puvyqera_a:
+                vs bcg.ireobfr:
+                    ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
+                                            r.anzr))
+                nffreg(r.puvyqera_bsf)
+                nffreg(r.anzr.raqfjvgu('/'))
+                nffreg(abg q.trg(r.puvyqera_bsf))
+                q[r.puvyqera_bsf] = 1
+            vs r.syntf & vaqrk.VK_UNFUINYVQ:
+                nffreg(r.fun != vaqrk.RZCGL_FUN)
+                nffreg(r.tvgzbqr)
+        nffreg(abg r be r.anzr == '/')  # ynfg ragel vf *nyjnlf* /
+        ybt('purpx: purpxvat abezny vgrengvba...\a')
+        ynfg = Abar
+        sbe r va ernqre:
+            vs ynfg:
+                nffreg(ynfg > r.anzr)
+            ynfg = r.anzr
+    rkprcg:
+        ybt('vaqrk reebe! ng %e\a' % r)
+        envfr
+    ybt('purpx: cnffrq.\a')
+
+
+qrs hcqngr_vaqrk(gbc):
+    ev = vaqrk.Ernqre(vaqrksvyr)
+    jv = vaqrk.Jevgre(vaqrksvyr)
+    evt = VgreUrycre(ev.vgre(anzr=gbc))
+    gfgneg = vag(gvzr.gvzr())
+
+    unfutra = Abar
+    vs bcg.snxr_inyvq:
+        qrs unfutra(anzr):
+            erghea (0100644, vaqrk.SNXR_FUN)
+
+    gbgny = 0
+    sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
+        vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
+            flf.fgqbhg.jevgr('%f\a' % cngu)
+            flf.fgqbhg.syhfu()
+            cebterff('Vaqrkvat: %q\e' % gbgny)
+        ryvs abg (gbgny % 128):
+            cebterff('Vaqrkvat: %q\e' % gbgny)
+        gbgny += 1
+        juvyr evt.phe naq evt.phe.anzr > cngu:  # qryrgrq cnguf
+            vs evt.phe.rkvfgf():
+                evt.phe.frg_qryrgrq()
+                evt.phe.ercnpx()
+            evt.arkg()
+        vs evt.phe naq evt.phe.anzr == cngu:    # cnguf gung nyernql rkvfgrq
+            vs cfg:
+                evt.phe.sebz_fgng(cfg, gfgneg)
+            vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
+                vs unfutra:
+                    (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
+                    evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
+            vs bcg.snxr_vainyvq:
+                evt.phe.vainyvqngr()
+            evt.phe.ercnpx()
+            evt.arkg()
+        ryfr:  # arj cnguf
+            jv.nqq(cngu, cfg, unfutra = unfutra)
+    cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
+    
+    vs ev.rkvfgf():
+        ev.fnir()
+        jv.syhfu()
+        vs jv.pbhag:
+            je = jv.arj_ernqre()
+            vs bcg.purpx:
+                ybt('purpx: orsber zretvat: byqsvyr\a')
+                purpx_vaqrk(ev)
+                ybt('purpx: orsber zretvat: arjsvyr\a')
+                purpx_vaqrk(je)
+            zv = vaqrk.Jevgre(vaqrksvyr)
+            zretr_vaqrkrf(zv, ev, je)
+            ev.pybfr()
+            zv.pybfr()
+            je.pybfr()
+        jv.nobeg()
+    ryfr:
+        jv.pybfr()
+
+
+bcgfcrp = """
+ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
+--
+c,cevag    cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
+z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
+f,fgnghf   cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
+U,unfu     cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
+y,ybat     cevag zber vasbezngvba nobhg rnpu svyr
+h,hcqngr   (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
+k,kqri,bar-svyr-flfgrz  qba'g pebff svyrflfgrz obhaqnevrf
+snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
+snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
+purpx      pnershyyl purpx vaqrk svyr vagrtevgl
+s,vaqrksvyr=  gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+"""
+b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
+    b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
+vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
+    b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
+vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
+    b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
+
+tvg.purpx_ercb_be_qvr()
+vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
+
+unaqyr_pgey_p()
+
+vs bcg.purpx:
+    ybt('purpx: fgnegvat vavgvny purpx.\a')
+    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+cnguf = vaqrk.erqhpr_cnguf(rkgen)
+
+vs bcg.hcqngr:
+    vs abg cnguf:
+        b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
+    sbe (ec,cngu) va cnguf:
+        hcqngr_vaqrk(ec)
+
+vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
+    sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
+        vs (bcg.zbqvsvrq 
+            naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
+            pbagvahr
+        yvar = ''
+        vs bcg.fgnghf:
+            vs rag.vf_qryrgrq():
+                yvar += 'Q '
+            ryvs abg rag.vf_inyvq():
+                vs rag.fun == vaqrk.RZCGL_FUN:
+                    yvar += 'N '
+                ryfr:
+                    yvar += 'Z '
+            ryfr:
+                yvar += '  '
+        vs bcg.unfu:
+            yvar += rag.fun.rapbqr('urk') + ' '
+        vs bcg.ybat:
+            yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
+        cevag yvar + (anzr be './')
+
+vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
+    ybt('purpx: fgnegvat svany purpx.\a')
+    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg
+sebz ohc vzcbeg bcgvbaf, urycref
+
+bcgfcrp = """
+ohc eonpxhc-freire
+--
+    Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+# trg gur fhopbzznaq'f neti.
+# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
+# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
+# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
+ohs = flf.fgqva.ernq(4)
+fm = fgehpg.hacnpx('!V', ohs)[0]
+nffreg(fm > 0)
+nffreg(fm < 1000000)
+ohs = flf.fgqva.ernq(fm)
+nffreg(yra(ohs) == fm)
+neti = ohs.fcyvg('\0')
+
+# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
+# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
+# gb zvfhfr gurz.  Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
+# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
+#
+# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
+# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
+# fbpxrg.  Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
+# bs vg, ohg cebonoyl qvqa'g.  Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
+# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
+#
+# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
+# qrfpevcgbef.  Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
+# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
+bf.qhc2(0, 3)
+bf.qhc2(1, 4)
+bf.qhc2(2, 1)
+sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
+bf.qhc2(sq, 0)
+bf.pybfr(sq)
+
+bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
+bf.rkrpic(neti[0], neti)
+flf.rkvg(99)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo, fhocebprff, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+cne2_bx = 0
+ahyys = bcra('/qri/ahyy')
+
+qrs qroht(f):
+    vs bcg.ireobfr:
+        ybt(f)
+
+qrs eha(neti):
+    # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
+    # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
+    # rkrpvat sbe fbzr ernfba.  Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
+    # svefg.
+    sq = bf.qhc(2)  # pbcl fgqree
+    gel:
+        c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
+        erghea c.jnvg()
+    svanyyl:
+        bf.pybfr(sq)
+
+qrs cne2_frghc():
+    tybony cne2_bx
+    ei = 1
+    gel:
+        c = fhocebprff.Cbcra(['cne2', '--uryc'],
+                             fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
+        ei = c.jnvg()
+    rkprcg BFReebe:
+        ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
+    ryfr:
+        cne2_bx = 1
+
+qrs cnei(yiy):
+    vs bcg.ireobfr >= yiy:
+        vs vfggl:
+            erghea []
+        ryfr:
+            erghea ['-d']
+    ryfr:
+        erghea ['-dd']
+
+qrs cne2_trarengr(onfr):
+    erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
+               + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
+
+qrs cne2_irevsl(onfr):
+    erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
+
+qrs cne2_ercnve(onfr):
+    erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
+
+qrs dhvpx_irevsl(onfr):
+    s = bcra(onfr + '.cnpx', 'eo')
+    s.frrx(-20, 2)
+    jnagfhz = s.ernq(20)
+    nffreg(yra(jnagfhz) == 20)
+    s.frrx(0)
+    fhz = Fun1()
+    sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
+        fhz.hcqngr(o)
+    vs fhz.qvtrfg() != jnagfhz:
+        envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
+                                                  fhz.urkqvtrfg()))
+        
+
+qrs tvg_irevsl(onfr):
+    vs bcg.dhvpx:
+        gel:
+            dhvpx_irevsl(onfr)
+        rkprcg Rkprcgvba, r:
+            qroht('reebe: %f\a' % r)
+            erghea 1
+        erghea 0
+    ryfr:
+        erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
+    
+    
+qrs qb_cnpx(onfr, ynfg):
+    pbqr = 0
+    vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
+        ierfhyg = cne2_irevsl(onfr)
+        vs ierfhyg != 0:
+            vs bcg.ercnve:
+                eerfhyg = cne2_ercnve(onfr)
+                vs eerfhyg != 0:
+                    cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
+                    pbqr = eerfhyg
+                ryfr:
+                    cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
+                    pbqr = 100
+            ryfr:
+                cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
+                pbqr = ierfhyg
+        ryfr:
+            cevag '%f bx' % ynfg
+    ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
+        terfhyg = tvg_irevsl(onfr)
+        vs terfhyg != 0:
+            cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
+            pbqr = terfhyg
+        ryfr:
+            vs cne2_bx naq bcg.trarengr:
+                cerfhyg = cne2_trarengr(onfr)
+                vs cerfhyg != 0:
+                    cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
+                    pbqr = cerfhyg
+                ryfr:
+                    cevag '%f bx' % ynfg
+            ryfr:
+                cevag '%f bx' % ynfg
+    ryfr:
+        nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
+        qroht('    fxvccrq: cne2 svyr nyernql trarengrq.\a')
+    erghea pbqr
+
+
+bcgfcrp = """
+ohc sfpx [bcgvbaf...] [svyranzrf...]
+--
+e,ercnve    nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
+t,trarengr  trarengr nhgb-ercnve vasbezngvba hfvat cne2
+i,ireobfr   vapernfr ireobfvgl (pna or hfrq zber guna bapr)
+dhvpx       whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
+w,wbof=     eha 'a' wbof va cnenyyry
+cne2-bx     vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
+qvfnoyr-cne2  vtaber cne2 rira vs vg vf ninvynoyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+cne2_frghc()
+vs bcg.cne2_bx:
+    vs cne2_bx:
+        flf.rkvg(0)  # 'gehr' va fu
+    ryfr:
+        flf.rkvg(1)
+vs bcg.qvfnoyr_cne2:
+    cne2_bx = 0
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+    qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
+    rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
+
+pbqr = 0
+pbhag = 0
+bhgfgnaqvat = {}
+sbe anzr va rkgen:
+    vs anzr.raqfjvgu('.cnpx'):
+        onfr = anzr[:-5]
+    ryvs anzr.raqfjvgu('.vqk'):
+        onfr = anzr[:-4]
+    ryvs anzr.raqfjvgu('.cne2'):
+        onfr = anzr[:-5]
+    ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
+        onfr = anzr
+    ryfr:
+        envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
+    (qve,ynfg) = bf.cngu.fcyvg(onfr)
+    cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
+    vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
+        cne2_rkvfgf = 0
+    flf.fgqbhg.syhfu()
+    qroht('sfpx: purpxvat %f (%f)\a' 
+          % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
+    vs abg bcg.ireobfr:
+        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+    
+    vs abg bcg.wbof:
+        ap = qb_cnpx(onfr, ynfg)
+        pbqr = pbqr be ap
+        pbhag += 1
+    ryfr:
+        juvyr yra(bhgfgnaqvat) >= bcg.wbof:
+            (cvq,ap) = bf.jnvg()
+            ap >>= 8
+            vs cvq va bhgfgnaqvat:
+                qry bhgfgnaqvat[cvq]
+                pbqr = pbqr be ap
+                pbhag += 1
+        cvq = bf.sbex()
+        vs cvq:  # cnerag
+            bhgfgnaqvat[cvq] = 1
+        ryfr: # puvyq
+            gel:
+                flf.rkvg(qb_cnpx(onfr, ynfg))
+            rkprcg Rkprcgvba, r:
+                ybt('rkprcgvba: %e\a' % r)
+                flf.rkvg(99)
+                
+juvyr yra(bhgfgnaqvat):
+    (cvq,ap) = bf.jnvg()
+    ap >>= 8
+    vs cvq va bhgfgnaqvat:
+        qry bhgfgnaqvat[cvq]
+        pbqr = pbqr be ap
+        pbhag += 1
+    vs abg bcg.ireobfr:
+        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+vs abg bcg.ireobfr naq vfggl:
+    ybt('sfpx qbar.           \a')
+flf.rkvg(pbqr)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
+sebz ohc vzcbeg bcgvbaf, ffu
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc eonpxhc <ubfganzr> vaqrk ...
+ohc eonpxhc <ubfganzr> fnir ...
+ohc eonpxhc <ubfganzr> fcyvg ...
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs yra(rkgen) < 2:
+    b.sngny('nethzragf rkcrpgrq')
+
+pynff FvtRkprcgvba(Rkprcgvba):
+    qrs __vavg__(frys, fvtahz):
+        frys.fvtahz = fvtahz
+        Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
+qrs unaqyre(fvtahz, senzr):
+    envfr FvtRkprcgvba(fvtahz)
+
+fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
+fvtany.fvtany(fvtany.FVTVAG, unaqyre)
+
+fc = Abar
+c = Abar
+erg = 99
+
+gel:
+    ubfganzr = rkgen[0]
+    neti = rkgen[1:]
+    c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
+
+    netif = '\0'.wbva(['ohc'] + neti)
+    c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
+    c.fgqva.syhfu()
+
+    znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
+    fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
+
+    c.fgqva.pybfr()
+    c.fgqbhg.pybfr()
+
+svanyyl:
+    juvyr 1:
+        # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
+        # va pnfr bhe puvyq qbrfa'g qvr.
+        gel:
+            erg = c.jnvg()
+            fc.jnvg()
+            oernx
+        rkprcg FvtRkprcgvba, r:
+            ybt('\aohc eonpxhc: %f\a' % r)
+            bf.xvyy(c.cvq, r.fvtahz)
+            erg = 84
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc arjyvare
+"""
+b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+e = er.pbzcvyr(e'([\e\a])')
+ynfgyra = 0
+nyy = ''
+juvyr 1:
+    y = e.fcyvg(nyy, 1)
+    vs yra(y) <= 1:
+        gel:
+            o = bf.ernq(flf.fgqva.svyrab(), 4096)
+        rkprcg XrlobneqVagreehcg:
+            oernx
+        vs abg o:
+            oernx
+        nyy += o
+    ryfr:
+        nffreg(yra(y) == 3)
+        (yvar, fcyvgpune, nyy) = y
+        #fcyvgpune = '\a'
+        flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
+        vs fcyvgpune == '\e':
+            ynfgyra = yra(yvar)
+        ryfr:
+            ynfgyra = 0
+        flf.fgqbhg.syhfu()
+
+vs ynfgyra be nyy:
+    flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
+#!/hfe/ova/rai clguba
+vzcbeg flf
+sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc znetva
+"""
+b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+#tvg.vtaber_zvqk = 1
+
+zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+ynfg = '\0'*20
+ybatzngpu = 0
+sbe v va zv:
+    vs v == ynfg:
+        pbagvahr
+    #nffreg(fge(v) >= ynfg)
+    cz = _unfufcyvg.ovgzngpu(ynfg, v)
+    ybatzngpu = znk(ybatzngpu, cz)
+    ynfg = v
+cevag ybatzngpu
diff --git a/test/sampledata/y/text b/test/sampledata/y/text
new file mode 100644 (file)
index 0000000..d3c6dec
--- /dev/null
@@ -0,0 +1,3 @@
+this is a text file.
+
+See me be texty!
diff --git a/test/testfile1 b/test/testfile1
new file mode 100644 (file)
index 0000000..31ee979
--- /dev/null
@@ -0,0 +1,5580 @@
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg bcgvbaf, qerphefr
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc qerphefr <cngu>
+--
+k,kqri,bar-svyr-flfgrz   qba'g pebff svyrflfgrz obhaqnevrf
+d,dhvrg  qba'g npghnyyl cevag svyranzrf
+cebsvyr  eha haqre gur clguba cebsvyre
+"""
+b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar svyranzr rkcrpgrq")
+
+vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
+vs bcg.cebsvyr:
+    vzcbeg pCebsvyr
+    qrs qb_vg():
+        sbe v va vg:
+            cnff
+    pCebsvyr.eha('qb_vg()')
+ryfr:
+    vs bcg.dhvrg:
+        sbe v va vg:
+            cnff
+    ryfr:
+        sbe (anzr,fg) va vg:
+            cevag anzr
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+o,oybof    bhgchg n frevrf bs oybo vqf
+g,gerr     bhgchg n gerr vq
+p,pbzzvg   bhgchg n pbzzvg vq
+a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
+A,abbc     qba'g npghnyyl fnir gur qngn naljurer
+d,dhvrg    qba'g cevag cebterff zrffntrf
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+pbcl       whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
+orapu      cevag orapuznex gvzvatf gb fgqree
+znk-cnpx-fvmr=  znkvzhz olgrf va n fvatyr cnpx
+znk-cnpx-bowrpgf=  znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
+snabhg=  znkvzhz ahzore bs oybof va n fvatyr gerr
+"""
+b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
+        bcg.abbc be bcg.pbcl):
+    b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
+vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be 
+                               bcg.pbzzvg be bcg.anzr):
+    b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
+
+vs bcg.ireobfr >= 2:
+    tvg.ireobfr = bcg.ireobfr - 1
+    bcg.orapu = 1
+vs bcg.znk_cnpx_fvmr:
+    unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
+vs bcg.znk_cnpx_bowrpgf:
+    unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
+vs bcg.snabhg:
+    unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
+vs bcg.oybof:
+    unfufcyvg.snabhg = 0
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+fgneg_gvzr = gvzr.gvzr()
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.abbc be bcg.pbcl:
+    pyv = j = byqers = Abar
+ryvs bcg.erzbgr be vf_erirefr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+    j = pyv.arj_cnpxjevgre()
+ryfr:
+    pyv = Abar
+    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+    j = tvg.CnpxJevgre()
+
+svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
+vs j:
+    funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
+    gerr = j.arj_gerr(funyvfg)
+ryfr:
+    ynfg = 0
+    sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
+        unfufcyvg.gbgny_fcyvg += yra(oybo)
+        vs bcg.pbcl:
+            flf.fgqbhg.jevgr(fge(oybo))
+        zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
+        vs abg bcg.dhvrg naq ynfg != zrtf:
+            cebterff('%q Zolgrf ernq\e' % zrtf)
+            ynfg = zrtf
+    cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
+
+vs bcg.ireobfr:
+    ybt('\a')
+vs bcg.oybof:
+    sbe (zbqr,anzr,ova) va funyvfg:
+        cevag ova.rapbqr('urk')
+vs bcg.gerr:
+    cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+    zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+    vs bcg.pbzzvg:
+        cevag pbzzvg.rapbqr('urk')
+
+vs j:
+    j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
+        
+vs bcg.anzr:
+    vs pyv:
+        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+    ryfr:
+        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+    pyv.pybfr()
+
+frpf = gvzr.gvzr() - fgneg_gvzr
+fvmr = unfufcyvg.gbgny_fcyvg
+vs bcg.orapu:
+    ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
+        % (fvmr/1024., frpf, fvmr/1024./frpf))
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, fgehpg, zznc
+sebz ohc vzcbeg tvg, bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs f_sebz_olgrf(olgrf):
+    pyvfg = [pue(o) sbe o va olgrf]
+    erghea ''.wbva(pyvfg)
+
+
+qrs ercbeg(pbhag):
+    svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
+    q = {}
+    sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
+        y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
+        q[y[0]] = y[1]
+    vs pbhag >= 0:
+        r1 = pbhag
+        svryqf = [q[x] sbe x va svryqf]
+    ryfr:
+        r1 = ''
+    cevag ('%9f  ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
+    flf.fgqbhg.syhfu()
+
+
+bcgfcrp = """
+ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
+--
+a,ahzore=  ahzore bs bowrpgf cre plpyr
+p,plpyrf=  ahzore bs plpyrf gb eha
+vtaber-zvqk  vtaber .zvqk svyrf, hfr bayl .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+tvg.vtaber_zvqk = bcg.vtaber_zvqk
+
+tvg.purpx_ercb_be_qvr()
+z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+
+plpyrf = bcg.plpyrf be 100
+ahzore = bcg.ahzore be 10000
+
+ercbeg(-1)
+s = bcra('/qri/henaqbz')
+n = zznc.zznc(-1, 20)
+ercbeg(0)
+sbe p va kenatr(plpyrf):
+    sbe a va kenatr(ahzore):
+        o = s.ernq(3)
+        vs 0:
+            olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
+            olgrf[2] &= 0ks0
+            ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
+        ryfr:
+            n[0:2] = o[0:2]
+            n[2] = pue(beq(o[2]) & 0ks0)
+            ova = fge(n[0:20])
+        #cevag ova.rapbqr('urk')
+        z.rkvfgf(ova)
+    ercbeg((p+1)*ahzore)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+qrs cevag_abqr(grkg, a):
+    cersvk = ''
+    vs bcg.unfu:
+        cersvk += "%f " % a.unfu.rapbqr('urk')
+    vs fgng.F_VFQVE(a.zbqr):
+        cevag '%f%f/' % (cersvk, grkg)
+    ryvs fgng.F_VFYAX(a.zbqr):
+        cevag '%f%f@' % (cersvk, grkg)
+    ryfr:
+        cevag '%f%f' % (cersvk, grkg)
+
+
+bcgfcrp = """
+ohc yf <qvef...>
+--
+f,unfu   fubj unfu sbe rnpu svyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+
+vs abg rkgen:
+    rkgen = ['/']
+
+erg = 0
+sbe q va rkgen:
+    gel:
+        a = gbc.yerfbyir(q)
+        vs fgng.F_VFQVE(a.zbqr):
+            sbe fho va a:
+                cevag_abqr(fho.anzr, fho)
+        ryfr:
+            cevag_abqr(q, a)
+    rkprcg isf.AbqrReebe, r:
+        ybt('reebe: %f\a' % r)
+        erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
+sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
+sebz ohc.urycref vzcbeg *
+
+qrs abqr_anzr(grkg, a):
+    vs fgng.F_VFQVE(a.zbqr):
+        erghea '%f/' % grkg
+    ryvs fgng.F_VFYAX(a.zbqr):
+        erghea '%f@' % grkg
+    ryfr:
+        erghea '%f' % grkg
+
+
+qrs qb_yf(cngu, a):
+    y = []
+    vs fgng.F_VFQVE(a.zbqr):
+        sbe fho va a:
+            y.nccraq(abqr_anzr(fho.anzr, fho))
+    ryfr:
+        y.nccraq(abqr_anzr(cngu, a))
+    cevag pbyhzangr(y, '')
+    
+
+qrs jevgr_gb_svyr(vas, bhgs):
+    sbe oybo va puhaxlernqre(vas):
+        bhgs.jevgr(oybo)
+    
+
+qrs vachgvgre():
+    vs bf.vfnggl(flf.fgqva.svyrab()):
+        juvyr 1:
+            gel:
+                lvryq enj_vachg('ohc> ')
+            rkprcg RBSReebe:
+                oernx
+    ryfr:
+        sbe yvar va flf.fgqva:
+            lvryq yvar
+
+
+qrs _pbzcyrgre_trg_fhof(yvar):
+    (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
+    (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
+    #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
+    a = cjq.erfbyir(qve)
+    fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
+                       a.fhof()))
+    erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
+
+
+_ynfg_yvar = Abar
+_ynfg_erf = Abar
+qrs pbzcyrgre(grkg, fgngr):
+    tybony _ynfg_yvar
+    tybony _ynfg_erf
+    gel:
+        yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
+        vs _ynfg_yvar != yvar:
+            _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
+            _ynfg_yvar = yvar
+        (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
+        vs fgngr < yra(fhof):
+            fa = fhof[fgngr]
+            fa1 = fa.erfbyir('')  # qrers flzyvaxf
+            shyyanzr = bf.cngu.wbva(qve, fa.anzr)
+            vs fgng.F_VFQVE(fa1.zbqr):
+                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
+                                          grezvangr=Snyfr)
+            ryfr:
+                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
+                                          grezvangr=Gehr) + ' '
+            erghea grkg + erg
+    rkprcg Rkprcgvba, r:
+        ybt('\areebe va pbzcyrgvba: %f\a' % r)
+
+            
+bcgfcrp = """
+ohc sgc
+"""
+b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+gbc = isf.ErsYvfg(Abar)
+cjq = gbc
+
+vs rkgen:
+    yvarf = rkgen
+ryfr:
+    ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
+    ernqyvar.frg_pbzcyrgre(pbzcyrgre)
+    ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
+    yvarf = vachgvgre()
+
+sbe yvar va yvarf:
+    vs abg yvar.fgevc():
+        pbagvahr
+    jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
+    pzq = jbeqf[0].ybjre()
+    #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
+    gel:
+        vs pzq == 'yf':
+            sbe cnez va (jbeqf[1:] be ['.']):
+                qb_yf(cnez, cjq.erfbyir(cnez))
+        ryvs pzq == 'pq':
+            sbe cnez va jbeqf[1:]:
+                cjq = cjq.erfbyir(cnez)
+        ryvs pzq == 'cjq':
+            cevag cjq.shyyanzr()
+        ryvs pzq == 'png':
+            sbe cnez va jbeqf[1:]:
+                jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
+        ryvs pzq == 'trg':
+            vs yra(jbeqf) abg va [2,3]:
+                envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
+            eanzr = jbeqf[1]
+            (qve,onfr) = bf.cngu.fcyvg(eanzr)
+            yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
+            vas = cjq.erfbyir(eanzr).bcra()
+            ybt('Fnivat %e\a' % yanzr)
+            jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
+        ryvs pzq == 'ztrg':
+            sbe cnez va jbeqf[1:]:
+                (qve,onfr) = bf.cngu.fcyvg(cnez)
+                sbe a va cjq.erfbyir(qve).fhof():
+                    vs sazngpu.sazngpu(a.anzr, onfr):
+                        gel:
+                            ybt('Fnivat %e\a' % a.anzr)
+                            vas = a.bcra()
+                            bhgs = bcra(a.anzr, 'jo')
+                            jevgr_gb_svyr(vas, bhgs)
+                            bhgs.pybfr()
+                        rkprcg Rkprcgvba, r:
+                            ybt('  reebe: %f\a' % r)
+        ryvs pzq == 'uryc' be pzq == '?':
+            ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
+        ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
+            oernx
+        ryfr:
+            envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
+    rkprcg Rkprcgvba, r:
+        ybt('reebe: %f\a' % r)
+        #envfr
+#!/hfe/ova/rai clguba
+vzcbeg flf, zznc
+sebz ohc vzcbeg bcgvbaf, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc enaqbz [-F frrq] <ahzolgrf>
+--
+F,frrq=   bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
+s,sbepr   cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
+"""
+b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+gbgny = cnefr_ahz(rkgen[0])
+
+vs bcg.sbepr be (abg bf.vfnggl(1) naq
+                 abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
+    _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
+ryfr:
+    ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc uryc <pbzznaq>
+"""
+b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) == 0:
+    # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
+    bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
+ryvs yra(rkgen) == 1:
+    qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
+    rkr = flf.neti[0]
+    (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
+    znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
+    t = tybo.tybo(znacngu)
+    vs t:
+        bf.rkrpic('zna', ['zna', '-y', t[0]])
+    ryfr:
+        bf.rkrpic('zna', ['zna', qbpanzr])
+ryfr:
+    b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+
+pynff Fgng(shfr.Fgng):
+    qrs __vavg__(frys):
+        frys.fg_zbqr = 0
+        frys.fg_vab = 0
+        frys.fg_qri = 0
+        frys.fg_ayvax = 0
+        frys.fg_hvq = 0
+        frys.fg_tvq = 0
+        frys.fg_fvmr = 0
+        frys.fg_ngvzr = 0
+        frys.fg_zgvzr = 0
+        frys.fg_pgvzr = 0
+        frys.fg_oybpxf = 0
+        frys.fg_oyxfvmr = 0
+        frys.fg_eqri = 0
+
+
+pnpur = {}
+qrs pnpur_trg(gbc, cngu):
+    cnegf = cngu.fcyvg('/')
+    pnpur[('',)] = gbc
+    p = Abar
+    znk = yra(cnegf)
+    #ybt('pnpur: %e\a' % pnpur.xrlf())
+    sbe v va enatr(znk):
+        cer = cnegf[:znk-v]
+        #ybt('pnpur gelvat: %e\a' % cer)
+        p = pnpur.trg(ghcyr(cer))
+        vs p:
+            erfg = cnegf[znk-v:]
+            sbe e va erfg:
+                #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
+                p = p.yerfbyir(e)
+                xrl = ghcyr(cer + [e])
+                #ybt('fnivat: %e\a' % (xrl,))
+                pnpur[xrl] = p
+            oernx
+    nffreg(p)
+    erghea p
+        
+    
+
+pynff OhcSf(shfr.Shfr):
+    qrs __vavg__(frys, gbc):
+        shfr.Shfr.__vavg__(frys)
+        frys.gbc = gbc
+    
+    qrs trgngge(frys, cngu):
+        ybt('--trgngge(%e)\a' % cngu)
+        gel:
+            abqr = pnpur_trg(frys.gbc, cngu)
+            fg = Fgng()
+            fg.fg_zbqr = abqr.zbqr
+            fg.fg_ayvax = abqr.ayvaxf()
+            fg.fg_fvmr = abqr.fvmr()
+            fg.fg_zgvzr = abqr.zgvzr
+            fg.fg_pgvzr = abqr.pgvzr
+            fg.fg_ngvzr = abqr.ngvzr
+            erghea fg
+        rkprcg isf.AbFhpuSvyr:
+            erghea -reeab.RABRAG
+
+    qrs ernqqve(frys, cngu, bssfrg):
+        ybt('--ernqqve(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        lvryq shfr.Qveragel('.')
+        lvryq shfr.Qveragel('..')
+        sbe fho va abqr.fhof():
+            lvryq shfr.Qveragel(fho.anzr)
+
+    qrs ernqyvax(frys, cngu):
+        ybt('--ernqyvax(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        erghea abqr.ernqyvax()
+
+    qrs bcra(frys, cngu, syntf):
+        ybt('--bcra(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
+        vs (syntf & nppzbqr) != bf.B_EQBAYL:
+            erghea -reeab.RNPPRF
+        abqr.bcra()
+
+    qrs eryrnfr(frys, cngu, syntf):
+        ybt('--eryrnfr(%e)\a' % cngu)
+
+    qrs ernq(frys, cngu, fvmr, bssfrg):
+        ybt('--ernq(%e)\a' % cngu)
+        a = pnpur_trg(frys.gbc, cngu)
+        b = a.bcra()
+        b.frrx(bssfrg)
+        erghea b.ernq(fvmr)
+
+
+vs abg unfngge(shfr, '__irefvba__'):
+    envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
+shfr.shfr_clguba_ncv = (0, 2)
+
+
+bcgfcrp = """
+ohc shfr [-q] [-s] <zbhagcbvag>
+--
+q,qroht   vapernfr qroht yriry
+s,sbertebhaq  eha va sbertebhaq
+"""
+b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+s = OhcSf(gbc)
+s.shfr_netf.zbhagcbvag = rkgen[0]
+vs bcg.qroht:
+    s.shfr_netf.nqq('qroht')
+vs bcg.sbertebhaq:
+    s.shfr_netf.frgzbq('sbertebhaq')
+cevag s.zhygvguernqrq
+s.zhygvguernqrq = Snyfr
+
+s.znva()
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+
+vs bcg.erzbgr:
+    tvg.vavg_ercb()  # ybpny ercb
+    tvg.purpx_ercb_be_qvr()
+    pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
+    pyv.pybfr()
+ryfr:
+    tvg.vavg_ercb()
+#!/hfe/ova/rai clguba
+vzcbeg flf, zngu, fgehpg, tybo
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+CNTR_FVMR=4096
+FUN_CRE_CNTR=CNTR_FVMR/200.
+
+
+qrs zretr(vqkyvfg, ovgf, gnoyr):
+    pbhag = 0
+    sbe r va tvg.vqkzretr(vqkyvfg):
+        pbhag += 1
+        cersvk = tvg.rkgenpg_ovgf(r, ovgf)
+        gnoyr[cersvk] = pbhag
+        lvryq r
+
+
+qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
+    vs abg bhgsvyranzr:
+        nffreg(bhgqve)
+        fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
+        bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
+    
+    vac = []
+    gbgny = 0
+    sbe anzr va vasvyranzrf:
+        vk = tvg.CnpxVqk(anzr)
+        vac.nccraq(vk)
+        gbgny += yra(vk)
+
+    ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
+    vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
+       be (bcg.sbepr naq abg gbgny):
+        ybt('zvqk: abguvat gb qb.\a')
+        erghea
+
+    cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
+    ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
+    ragevrf = 2**ovgf
+    ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
+    
+    gnoyr = [0]*ragevrf
+
+    gel:
+        bf.hayvax(bhgsvyranzr)
+    rkprcg BFReebe:
+        cnff
+    s = bcra(bhgsvyranzr + '.gzc', 'j+')
+    s.jevgr('ZVQK\0\0\0\2')
+    s.jevgr(fgehpg.cnpx('!V', ovgf))
+    nffreg(s.gryy() == 12)
+    s.jevgr('\0'*4*ragevrf)
+    
+    sbe r va zretr(vac, ovgf, gnoyr):
+        s.jevgr(r)
+        
+    s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
+
+    s.frrx(12)
+    s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
+    s.pybfr()
+    bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
+
+    # guvf vf whfg sbe grfgvat
+    vs 0:
+        c = tvg.CnpxZvqk(bhgsvyranzr)
+        nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
+        cevag c.vqkanzrf
+        nffreg(yra(c) == gbgny)
+        cv = vgre(c)
+        sbe v va zretr(vac, gbgny, ovgf, gnoyr):
+            nffreg(v == cv.arkg())
+            nffreg(c.rkvfgf(v))
+
+    cevag bhgsvyranzr
+
+bcgfcrp = """
+ohc zvqk [bcgvbaf...] <vqkanzrf...>
+--
+b,bhgchg=  bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
+n,nhgb     nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
+s,sbepr    nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen naq (bcg.nhgb be bcg.sbepr):
+    b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
+
+tvg.purpx_ercb_be_qvr()
+
+vs rkgen:
+    qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
+ryvs bcg.nhgb be bcg.sbepr:
+    cnguf = [tvg.ercb('bowrpgf/cnpx')]
+    cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
+    sbe cngu va cnguf:
+        ybt('zvqk: fpnaavat %f\a' % cngu)
+        vs bcg.sbepr:
+            qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
+        ryvs bcg.nhgb:
+            z = tvg.CnpxVqkYvfg(cngu)
+            arrqrq = {}
+            sbe cnpx va z.cnpxf:  # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
+                vs cnpx.anzr.raqfjvgu('.vqk'):
+                    arrqrq[cnpx.anzr] = 1
+            qry z
+            qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
+        ybt('\a')
+ryfr:
+    b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, enaqbz
+sebz ohc vzcbeg bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs enaqoybpx(a):
+    y = []
+    sbe v va kenatr(a):
+        y.nccraq(pue(enaqbz.enaqenatr(0,256)))
+    erghea ''.wbva(y)
+
+
+bcgfcrp = """
+ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
+--
+   JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
+a,ahz=   ahzore bs oybpxf gb qnzntr
+f,fvmr=  znkvzhz fvmr bs rnpu qnzntrq oybpx
+creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
+rdhny    fcernq qnzntr rirayl guebhtubhg gur svyr
+F,frrq=  enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
+"""
+b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg rkgen:
+    b.sngny('svyranzrf rkcrpgrq')
+
+vs bcg.frrq != Abar:
+    enaqbz.frrq(bcg.frrq)
+
+sbe anzr va rkgen:
+    ybt('Qnzntvat "%f"...\a' % anzr)
+    s = bcra(anzr, 'e+o')
+    fg = bf.sfgng(s.svyrab())
+    fvmr = fg.fg_fvmr
+    vs bcg.creprag be bcg.fvmr:
+        zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
+        zf2 = bcg.fvmr be fvmr
+        znkfvmr = zva(zf1, zf2)
+    ryfr:
+        znkfvmr = 1
+    puhaxf = bcg.ahz be 10
+    puhaxfvmr = fvmr/puhaxf
+    sbe e va enatr(puhaxf):
+        fm = enaqbz.enaqenatr(1, znkfvmr+1)
+        vs fm > fvmr:
+            fm = fvmr
+        vs bcg.rdhny:
+            bsf = e*puhaxfvmr
+        ryfr:
+            bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
+        ybt('  %6q olgrf ng %q\a' % (fm, bsf))
+        s.frrx(bsf)
+        s.jevgr(enaqoybpx(fm))
+    s.pybfr()
+#!/hfe/ova/rai clguba
+vzcbeg flf, fgehpg, zznc
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+fhfcraqrq_j = Abar
+
+
+qrs vavg_qve(pbaa, net):
+    tvg.vavg_ercb(net)
+    ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
+    pbaa.bx()
+
+
+qrs frg_qve(pbaa, net):
+    tvg.purpx_ercb_be_qvr(net)
+    ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
+    pbaa.bx()
+
+    
+qrs yvfg_vaqrkrf(pbaa, whax):
+    tvg.purpx_ercb_be_qvr()
+    sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
+        vs s.raqfjvgu('.vqk'):
+            pbaa.jevgr('%f\a' % s)
+    pbaa.bx()
+
+
+qrs fraq_vaqrk(pbaa, anzr):
+    tvg.purpx_ercb_be_qvr()
+    nffreg(anzr.svaq('/') < 0)
+    nffreg(anzr.raqfjvgu('.vqk'))
+    vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
+    pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
+    pbaa.jevgr(vqk.znc)
+    pbaa.bx()
+
+
+qrs erprvir_bowrpgf(pbaa, whax):
+    tybony fhfcraqrq_j
+    tvg.purpx_ercb_be_qvr()
+    fhttrfgrq = {}
+    vs fhfcraqrq_j:
+        j = fhfcraqrq_j
+        fhfcraqrq_j = Abar
+    ryfr:
+        j = tvg.CnpxJevgre()
+    juvyr 1:
+        af = pbaa.ernq(4)
+        vs abg af:
+            j.nobeg()
+            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
+        a = fgehpg.hacnpx('!V', af)[0]
+        #ybt('rkcrpgvat %q olgrf\a' % a)
+        vs abg a:
+            ybt('ohc freire: erprvirq %q bowrpg%f.\a' 
+                % (j.pbhag, j.pbhag!=1 naq "f" be ''))
+            shyycngu = j.pybfr()
+            vs shyycngu:
+                (qve, anzr) = bf.cngu.fcyvg(shyycngu)
+                pbaa.jevgr('%f.vqk\a' % anzr)
+            pbaa.bx()
+            erghea
+        ryvs a == 0kssssssss:
+            ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
+            fhfcraqrq_j = j
+            pbaa.bx()
+            erghea
+            
+        ohs = pbaa.ernq(a)  # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
+        #ybt('ernq %q olgrf\a' % a)
+        vs yra(ohs) < a:
+            j.nobeg()
+            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
+                            % (a, yra(ohs)))
+        (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
+        fun = tvg.pnyp_unfu(glcr, pbagrag)
+        byqcnpx = j.rkvfgf(fun)
+        # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
+        # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
+        # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
+        # ba gur freire fvqr.
+        vs abg fhttrfgrq naq \
+          byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
+            # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
+            # ng guvf ynlre.  Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
+            # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
+            # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
+            # znxr gur svyrf ovttre.  Guvf zrgubq vf pregnvayl abg irel
+            # rssvpvrag.
+            j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
+            byqcnpx = j.bowpnpur.rkvfgf(fun)
+            ybt('arj fhttrfgvba: %e\a' % byqcnpx)
+            nffreg(byqcnpx)
+            nffreg(byqcnpx != Gehr)
+            nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
+            j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
+        vs abg fhttrfgrq naq byqcnpx:
+            nffreg(byqcnpx.raqfjvgu('.vqk'))
+            (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
+            vs abg (anzr va fhttrfgrq):
+                ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
+                pbaa.jevgr('vaqrk %f\a' % anzr)
+                fhttrfgrq[anzr] = 1
+        ryfr:
+            j._enj_jevgr([ohs])
+    # ABGERNPURQ
+
+
+qrs ernq_ers(pbaa, ersanzr):
+    tvg.purpx_ercb_be_qvr()
+    e = tvg.ernq_ers(ersanzr)
+    pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
+    pbaa.bx()
+
+
+qrs hcqngr_ers(pbaa, ersanzr):
+    tvg.purpx_ercb_be_qvr()
+    arjiny = pbaa.ernqyvar().fgevc()
+    byqiny = pbaa.ernqyvar().fgevc()
+    tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
+    pbaa.bx()
+
+
+qrs png(pbaa, vq):
+    tvg.purpx_ercb_be_qvr()
+    gel:
+        sbe oybo va tvg.png(vq):
+            pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
+            pbaa.jevgr(oybo)
+    rkprcg XrlReebe, r:
+        ybt('freire: reebe: %f\a' % r)
+        pbaa.jevgr('\0\0\0\0')
+        pbaa.reebe(r)
+    ryfr:
+        pbaa.jevgr('\0\0\0\0')
+        pbaa.bx()
+
+
+bcgfcrp = """
+ohc freire
+"""
+b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+ybt('ohc freire: ernqvat sebz fgqva.\a')
+
+pbzznaqf = {
+    'vavg-qve': vavg_qve,
+    'frg-qve': frg_qve,
+    'yvfg-vaqrkrf': yvfg_vaqrkrf,
+    'fraq-vaqrk': fraq_vaqrk,
+    'erprvir-bowrpgf': erprvir_bowrpgf,
+    'ernq-ers': ernq_ers,
+    'hcqngr-ers': hcqngr_ers,
+    'png': png,
+}
+
+# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
+# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
+pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
+ye = yvarernqre(pbaa)
+sbe _yvar va ye:
+    yvar = _yvar.fgevc()
+    vs abg yvar:
+        pbagvahr
+    ybt('ohc freire: pbzznaq: %e\a' % yvar)
+    jbeqf = yvar.fcyvg(' ', 1)
+    pzq = jbeqf[0]
+    erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
+    vs pzq == 'dhvg':
+        oernx
+    ryfr:
+        pzq = pbzznaqf.trg(pzq)
+        vs pzq:
+            pzq(pbaa, erfg)
+        ryfr:
+            envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
+
+ybt('ohc freire: qbar\a')
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+    rkgen = yvarernqre(flf.fgqva)
+
+erg = 0
+
+vs bcg.erzbgr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    png = pyv.png
+ryfr:
+    pc = tvg.PngCvcr()
+    png = pc.wbva
+
+sbe vq va rkgen:
+    gel:
+        sbe oybo va png(vq):
+            flf.fgqbhg.jevgr(oybo)
+    rkprcg XrlReebe, r:
+        flf.fgqbhg.syhfu()
+        ybt('reebe: %f\a' % r)
+        erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, reeab, fgng, gvzr, zngu
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc fnir [-gp] [-a anzr] <svyranzrf...>
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+g,gerr     bhgchg n gerr vq
+p,pbzzvg   bhgchg n pbzzvg vq
+a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+d,dhvrg    qba'g fubj cebterff zrgre
+fznyyre=   bayl onpx hc svyrf fznyyre guna a olgrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
+    b.sngny("hfr bar be zber bs -g, -p, -a")
+vs abg rkgen:
+    b.sngny("ab svyranzrf tvira")
+
+bcg.cebterff = (vfggl naq abg bcg.dhvrg)
+bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.erzbgr be vf_erirefr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+    j = pyv.arj_cnpxjevgre()
+ryfr:
+    pyv = Abar
+    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+    j = tvg.CnpxJevgre()
+
+unaqyr_pgey_p()
+
+
+qrs rngfynfu(qve):
+    vs qve.raqfjvgu('/'):
+        erghea qve[:-1]
+    ryfr:
+        erghea qve
+
+
+cnegf = ['']
+funyvfgf = [[]]
+
+qrs _chfu(cneg):
+    nffreg(cneg)
+    cnegf.nccraq(cneg)
+    funyvfgf.nccraq([])
+
+qrs _cbc(sbepr_gerr):
+    nffreg(yra(cnegf) >= 1)
+    cneg = cnegf.cbc()
+    funyvfg = funyvfgf.cbc()
+    gerr = sbepr_gerr be j.arj_gerr(funyvfg)
+    vs funyvfgf:
+        funyvfgf[-1].nccraq(('40000', cneg, gerr))
+    ryfr:  # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
+        funyvfgf.nccraq(funyvfg)
+    erghea gerr
+
+ynfgerznva = Abar
+qrs cebterff_ercbeg(a):
+    tybony pbhag, fhopbhag, ynfgerznva
+    fhopbhag += a
+    pp = pbhag + fhopbhag
+    cpg = gbgny naq (pp*100.0/gbgny) be 0
+    abj = gvzr.gvzr()
+    ryncfrq = abj - gfgneg
+    xcf = ryncfrq naq vag(pp/1024./ryncfrq)
+    xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
+    xcf = vag(xcf/xcf_senp)*xcf_senp
+    vs pp:
+        erznva = ryncfrq*1.0/pp * (gbgny-pp)
+    ryfr:
+        erznva = 0.0
+    vs (ynfgerznva naq (erznva > ynfgerznva)
+          naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
+        erznva = ynfgerznva
+    ryfr:
+        ynfgerznva = erznva
+    ubhef = vag(erznva/60/60)
+    zvaf = vag(erznva/60 - ubhef*60)
+    frpf = vag(erznva - ubhef*60*60 - zvaf*60)
+    vs ryncfrq < 30:
+        erznvafge = ''
+        xcffge = ''
+    ryfr:
+        xcffge = '%qx/f' % xcf
+        vs ubhef:
+            erznvafge = '%qu%qz' % (ubhef, zvaf)
+        ryvs zvaf:
+            erznvafge = '%qz%q' % (zvaf, frpf)
+        ryfr:
+            erznvafge = '%qf' % frpf
+    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
+             % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
+                erznvafge, xcffge))
+
+
+e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
+
+qrs nyernql_fnirq(rag):
+    erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
+
+qrs jnagerphefr_cer(rag):
+    erghea abg nyernql_fnirq(rag)
+
+qrs jnagerphefr_qhevat(rag):
+    erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
+
+gbgny = sgbgny = 0
+vs bcg.cebterff:
+    sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
+        vs abg (sgbgny % 10024):
+            cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
+        rkvfgf = rag.rkvfgf()
+        unfuinyvq = nyernql_fnirq(rag)
+        rag.frg_fun_zvffvat(abg unfuinyvq)
+        vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
+            vs rkvfgf naq abg unfuinyvq:
+                gbgny += rag.fvmr
+        sgbgny += 1
+    cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
+    unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
+
+gfgneg = gvzr.gvzr()
+pbhag = fhopbhag = spbhag = 0
+ynfgfxvc_anzr = Abar
+ynfgqve = ''
+sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
+    (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
+    rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
+    unfuinyvq = nyernql_fnirq(rag)
+    jnfzvffvat = rag.fun_zvffvat()
+    byqfvmr = rag.fvmr
+    vs bcg.ireobfr:
+        vs abg rkvfgf:
+            fgnghf = 'Q'
+        ryvs abg unfuinyvq:
+            vs rag.fun == vaqrk.RZCGL_FUN:
+                fgnghf = 'N'
+            ryfr:
+                fgnghf = 'Z'
+        ryfr:
+            fgnghf = ' '
+        vs bcg.ireobfr >= 2:
+            ybt('%f %-70f\a' % (fgnghf, rag.anzr))
+        ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
+            vs abg ynfgqve.fgnegfjvgu(qve):
+                ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
+            ynfgqve = qve
+
+    vs bcg.cebterff:
+        cebterff_ercbeg(0)
+    spbhag += 1
+    
+    vs abg rkvfgf:
+        pbagvahr
+    vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
+        vs rkvfgf naq abg unfuinyvq:
+            nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
+            ynfgfxvc_anzr = rag.anzr
+        pbagvahr
+
+    nffreg(qve.fgnegfjvgu('/'))
+    qvec = qve.fcyvg('/')
+    juvyr cnegf > qvec:
+        _cbc(sbepr_gerr = Abar)
+    vs qve != '/':
+        sbe cneg va qvec[yra(cnegf):]:
+            _chfu(cneg)
+
+    vs abg svyr:
+        # ab svyranzr cbegvba zrnaf guvf vf n fhoqve.  Ohg
+        # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
+        byqgerr = nyernql_fnirq(rag) # znl or Abar
+        arjgerr = _cbc(sbepr_gerr = byqgerr)
+        vs abg byqgerr:
+            vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
+                rag.vainyvqngr()
+            ryfr:
+                rag.inyvqngr(040000, arjgerr)
+            rag.ercnpx()
+        vs rkvfgf naq jnfzvffvat:
+            pbhag += byqfvmr
+        pbagvahr
+
+    # vg'f abg n qverpgbel
+    vq = Abar
+    vs unfuinyvq:
+        zbqr = '%b' % rag.tvgzbqr
+        vq = rag.fun
+        funyvfgf[-1].nccraq((zbqr, 
+                             tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+                             vq))
+    ryfr:
+        vs fgng.F_VFERT(rag.zbqr):
+            gel:
+                s = unfufcyvg.bcra_abngvzr(rag.anzr)
+            rkprcg VBReebe, r:
+                nqq_reebe(r)
+                ynfgfxvc_anzr = rag.anzr
+            rkprcg BFReebe, r:
+                nqq_reebe(r)
+                ynfgfxvc_anzr = rag.anzr
+            ryfr:
+                (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
+        ryfr:
+            vs fgng.F_VFQVE(rag.zbqr):
+                nffreg(0)  # unaqyrq nobir
+            ryvs fgng.F_VFYAX(rag.zbqr):
+                gel:
+                    ey = bf.ernqyvax(rag.anzr)
+                rkprcg BFReebe, r:
+                    nqq_reebe(r)
+                    ynfgfxvc_anzr = rag.anzr
+                rkprcg VBReebe, r:
+                    nqq_reebe(r)
+                    ynfgfxvc_anzr = rag.anzr
+                ryfr:
+                    (zbqr, vq) = ('120000', j.arj_oybo(ey))
+            ryfr:
+                nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
+                ynfgfxvc_anzr = rag.anzr
+        vs vq:
+            rag.inyvqngr(vag(zbqr, 8), vq)
+            rag.ercnpx()
+            funyvfgf[-1].nccraq((zbqr,
+                                 tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+                                 vq))
+    vs rkvfgf naq jnfzvffvat:
+        pbhag += byqfvmr
+        fhopbhag = 0
+
+
+vs bcg.cebterff:
+    cpg = gbgny naq pbhag*100.0/gbgny be 100
+    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar.    \a'
+             % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
+
+juvyr yra(cnegf) > 1:
+    _cbc(sbepr_gerr = Abar)
+nffreg(yra(funyvfgf) == 1)
+gerr = j.arj_gerr(funyvfgf[-1])
+vs bcg.gerr:
+    cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+    zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+    vs bcg.pbzzvg:
+        cevag pbzzvg.rapbqr('urk')
+
+j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
+        
+vs bcg.anzr:
+    vs pyv:
+        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+    ryfr:
+        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+    pyv.pybfr()
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc gvpx
+"""
+b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+g = gvzr.gvzr()
+gyrsg = 1 - (g - vag(g))
+gvzr.fyrrc(gyrsg)
+#!/hfe/ova/rai clguba
+vzcbeg bf, flf, fgng, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
+sebz ohc.urycref vzcbeg *
+
+
+qrs zretr_vaqrkrf(bhg, e1, e2):
+    sbe r va vaqrk.ZretrVgre([e1, e2]):
+        # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl?  Jura?
+        bhg.nqq_vkragel(r)
+
+
+pynff VgreUrycre:
+    qrs __vavg__(frys, y):
+        frys.v = vgre(y)
+        frys.phe = Abar
+        frys.arkg()
+
+    qrs arkg(frys):
+        gel:
+            frys.phe = frys.v.arkg()
+        rkprcg FgbcVgrengvba:
+            frys.phe = Abar
+        erghea frys.phe
+
+
+qrs purpx_vaqrk(ernqre):
+    gel:
+        ybt('purpx: purpxvat sbejneq vgrengvba...\a')
+        r = Abar
+        q = {}
+        sbe r va ernqre.sbejneq_vgre():
+            vs r.puvyqera_a:
+                vs bcg.ireobfr:
+                    ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
+                                            r.anzr))
+                nffreg(r.puvyqera_bsf)
+                nffreg(r.anzr.raqfjvgu('/'))
+                nffreg(abg q.trg(r.puvyqera_bsf))
+                q[r.puvyqera_bsf] = 1
+            vs r.syntf & vaqrk.VK_UNFUINYVQ:
+                nffreg(r.fun != vaqrk.RZCGL_FUN)
+                nffreg(r.tvgzbqr)
+        nffreg(abg r be r.anzr == '/')  # ynfg ragel vf *nyjnlf* /
+        ybt('purpx: purpxvat abezny vgrengvba...\a')
+        ynfg = Abar
+        sbe r va ernqre:
+            vs ynfg:
+                nffreg(ynfg > r.anzr)
+            ynfg = r.anzr
+    rkprcg:
+        ybt('vaqrk reebe! ng %e\a' % r)
+        envfr
+    ybt('purpx: cnffrq.\a')
+
+
+qrs hcqngr_vaqrk(gbc):
+    ev = vaqrk.Ernqre(vaqrksvyr)
+    jv = vaqrk.Jevgre(vaqrksvyr)
+    evt = VgreUrycre(ev.vgre(anzr=gbc))
+    gfgneg = vag(gvzr.gvzr())
+
+    unfutra = Abar
+    vs bcg.snxr_inyvq:
+        qrs unfutra(anzr):
+            erghea (0100644, vaqrk.SNXR_FUN)
+
+    gbgny = 0
+    sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
+        vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
+            flf.fgqbhg.jevgr('%f\a' % cngu)
+            flf.fgqbhg.syhfu()
+            cebterff('Vaqrkvat: %q\e' % gbgny)
+        ryvs abg (gbgny % 128):
+            cebterff('Vaqrkvat: %q\e' % gbgny)
+        gbgny += 1
+        juvyr evt.phe naq evt.phe.anzr > cngu:  # qryrgrq cnguf
+            vs evt.phe.rkvfgf():
+                evt.phe.frg_qryrgrq()
+                evt.phe.ercnpx()
+            evt.arkg()
+        vs evt.phe naq evt.phe.anzr == cngu:    # cnguf gung nyernql rkvfgrq
+            vs cfg:
+                evt.phe.sebz_fgng(cfg, gfgneg)
+            vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
+                vs unfutra:
+                    (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
+                    evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
+            vs bcg.snxr_vainyvq:
+                evt.phe.vainyvqngr()
+            evt.phe.ercnpx()
+            evt.arkg()
+        ryfr:  # arj cnguf
+            jv.nqq(cngu, cfg, unfutra = unfutra)
+    cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
+    
+    vs ev.rkvfgf():
+        ev.fnir()
+        jv.syhfu()
+        vs jv.pbhag:
+            je = jv.arj_ernqre()
+            vs bcg.purpx:
+                ybt('purpx: orsber zretvat: byqsvyr\a')
+                purpx_vaqrk(ev)
+                ybt('purpx: orsber zretvat: arjsvyr\a')
+                purpx_vaqrk(je)
+            zv = vaqrk.Jevgre(vaqrksvyr)
+            zretr_vaqrkrf(zv, ev, je)
+            ev.pybfr()
+            zv.pybfr()
+            je.pybfr()
+        jv.nobeg()
+    ryfr:
+        jv.pybfr()
+
+
+bcgfcrp = """
+ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
+--
+c,cevag    cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
+z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
+f,fgnghf   cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
+U,unfu     cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
+y,ybat     cevag zber vasbezngvba nobhg rnpu svyr
+h,hcqngr   (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
+k,kqri,bar-svyr-flfgrz  qba'g pebff svyrflfgrz obhaqnevrf
+snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
+snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
+purpx      pnershyyl purpx vaqrk svyr vagrtevgl
+s,vaqrksvyr=  gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+"""
+b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
+    b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
+vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
+    b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
+vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
+    b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
+
+tvg.purpx_ercb_be_qvr()
+vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
+
+unaqyr_pgey_p()
+
+vs bcg.purpx:
+    ybt('purpx: fgnegvat vavgvny purpx.\a')
+    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+cnguf = vaqrk.erqhpr_cnguf(rkgen)
+
+vs bcg.hcqngr:
+    vs abg cnguf:
+        b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
+    sbe (ec,cngu) va cnguf:
+        hcqngr_vaqrk(ec)
+
+vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
+    sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
+        vs (bcg.zbqvsvrq 
+            naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
+            pbagvahr
+        yvar = ''
+        vs bcg.fgnghf:
+            vs rag.vf_qryrgrq():
+                yvar += 'Q '
+            ryvs abg rag.vf_inyvq():
+                vs rag.fun == vaqrk.RZCGL_FUN:
+                    yvar += 'N '
+                ryfr:
+                    yvar += 'Z '
+            ryfr:
+                yvar += '  '
+        vs bcg.unfu:
+            yvar += rag.fun.rapbqr('urk') + ' '
+        vs bcg.ybat:
+            yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
+        cevag yvar + (anzr be './')
+
+vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
+    ybt('purpx: fgnegvat svany purpx.\a')
+    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg
+sebz ohc vzcbeg bcgvbaf, urycref
+
+bcgfcrp = """
+ohc eonpxhc-freire
+--
+    Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+# trg gur fhopbzznaq'f neti.
+# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
+# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
+# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
+ohs = flf.fgqva.ernq(4)
+fm = fgehpg.hacnpx('!V', ohs)[0]
+nffreg(fm > 0)
+nffreg(fm < 1000000)
+ohs = flf.fgqva.ernq(fm)
+nffreg(yra(ohs) == fm)
+neti = ohs.fcyvg('\0')
+
+# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
+# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
+# gb zvfhfr gurz.  Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
+# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
+#
+# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
+# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
+# fbpxrg.  Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
+# bs vg, ohg cebonoyl qvqa'g.  Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
+# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
+#
+# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
+# qrfpevcgbef.  Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
+# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
+bf.qhc2(0, 3)
+bf.qhc2(1, 4)
+bf.qhc2(2, 1)
+sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
+bf.qhc2(sq, 0)
+bf.pybfr(sq)
+
+bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
+bf.rkrpic(neti[0], neti)
+flf.rkvg(99)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo, fhocebprff, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+cne2_bx = 0
+ahyys = bcra('/qri/ahyy')
+
+qrs qroht(f):
+    vs bcg.ireobfr:
+        ybt(f)
+
+qrs eha(neti):
+    # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
+    # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
+    # rkrpvat sbe fbzr ernfba.  Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
+    # svefg.
+    sq = bf.qhc(2)  # pbcl fgqree
+    gel:
+        c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
+        erghea c.jnvg()
+    svanyyl:
+        bf.pybfr(sq)
+
+qrs cne2_frghc():
+    tybony cne2_bx
+    ei = 1
+    gel:
+        c = fhocebprff.Cbcra(['cne2', '--uryc'],
+                             fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
+        ei = c.jnvg()
+    rkprcg BFReebe:
+        ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
+    ryfr:
+        cne2_bx = 1
+
+qrs cnei(yiy):
+    vs bcg.ireobfr >= yiy:
+        vs vfggl:
+            erghea []
+        ryfr:
+            erghea ['-d']
+    ryfr:
+        erghea ['-dd']
+
+qrs cne2_trarengr(onfr):
+    erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
+               + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
+
+qrs cne2_irevsl(onfr):
+    erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
+
+qrs cne2_ercnve(onfr):
+    erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
+
+qrs dhvpx_irevsl(onfr):
+    s = bcra(onfr + '.cnpx', 'eo')
+    s.frrx(-20, 2)
+    jnagfhz = s.ernq(20)
+    nffreg(yra(jnagfhz) == 20)
+    s.frrx(0)
+    fhz = Fun1()
+    sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
+        fhz.hcqngr(o)
+    vs fhz.qvtrfg() != jnagfhz:
+        envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
+                                                  fhz.urkqvtrfg()))
+        
+
+qrs tvg_irevsl(onfr):
+    vs bcg.dhvpx:
+        gel:
+            dhvpx_irevsl(onfr)
+        rkprcg Rkprcgvba, r:
+            qroht('reebe: %f\a' % r)
+            erghea 1
+        erghea 0
+    ryfr:
+        erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
+    
+    
+qrs qb_cnpx(onfr, ynfg):
+    pbqr = 0
+    vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
+        ierfhyg = cne2_irevsl(onfr)
+        vs ierfhyg != 0:
+            vs bcg.ercnve:
+                eerfhyg = cne2_ercnve(onfr)
+                vs eerfhyg != 0:
+                    cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
+                    pbqr = eerfhyg
+                ryfr:
+                    cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
+                    pbqr = 100
+            ryfr:
+                cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
+                pbqr = ierfhyg
+        ryfr:
+            cevag '%f bx' % ynfg
+    ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
+        terfhyg = tvg_irevsl(onfr)
+        vs terfhyg != 0:
+            cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
+            pbqr = terfhyg
+        ryfr:
+            vs cne2_bx naq bcg.trarengr:
+                cerfhyg = cne2_trarengr(onfr)
+                vs cerfhyg != 0:
+                    cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
+                    pbqr = cerfhyg
+                ryfr:
+                    cevag '%f bx' % ynfg
+            ryfr:
+                cevag '%f bx' % ynfg
+    ryfr:
+        nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
+        qroht('    fxvccrq: cne2 svyr nyernql trarengrq.\a')
+    erghea pbqr
+
+
+bcgfcrp = """
+ohc sfpx [bcgvbaf...] [svyranzrf...]
+--
+e,ercnve    nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
+t,trarengr  trarengr nhgb-ercnve vasbezngvba hfvat cne2
+i,ireobfr   vapernfr ireobfvgl (pna or hfrq zber guna bapr)
+dhvpx       whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
+w,wbof=     eha 'a' wbof va cnenyyry
+cne2-bx     vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
+qvfnoyr-cne2  vtaber cne2 rira vs vg vf ninvynoyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+cne2_frghc()
+vs bcg.cne2_bx:
+    vs cne2_bx:
+        flf.rkvg(0)  # 'gehr' va fu
+    ryfr:
+        flf.rkvg(1)
+vs bcg.qvfnoyr_cne2:
+    cne2_bx = 0
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+    qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
+    rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
+
+pbqr = 0
+pbhag = 0
+bhgfgnaqvat = {}
+sbe anzr va rkgen:
+    vs anzr.raqfjvgu('.cnpx'):
+        onfr = anzr[:-5]
+    ryvs anzr.raqfjvgu('.vqk'):
+        onfr = anzr[:-4]
+    ryvs anzr.raqfjvgu('.cne2'):
+        onfr = anzr[:-5]
+    ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
+        onfr = anzr
+    ryfr:
+        envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
+    (qve,ynfg) = bf.cngu.fcyvg(onfr)
+    cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
+    vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
+        cne2_rkvfgf = 0
+    flf.fgqbhg.syhfu()
+    qroht('sfpx: purpxvat %f (%f)\a' 
+          % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
+    vs abg bcg.ireobfr:
+        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+    
+    vs abg bcg.wbof:
+        ap = qb_cnpx(onfr, ynfg)
+        pbqr = pbqr be ap
+        pbhag += 1
+    ryfr:
+        juvyr yra(bhgfgnaqvat) >= bcg.wbof:
+            (cvq,ap) = bf.jnvg()
+            ap >>= 8
+            vs cvq va bhgfgnaqvat:
+                qry bhgfgnaqvat[cvq]
+                pbqr = pbqr be ap
+                pbhag += 1
+        cvq = bf.sbex()
+        vs cvq:  # cnerag
+            bhgfgnaqvat[cvq] = 1
+        ryfr: # puvyq
+            gel:
+                flf.rkvg(qb_cnpx(onfr, ynfg))
+            rkprcg Rkprcgvba, r:
+                ybt('rkprcgvba: %e\a' % r)
+                flf.rkvg(99)
+                
+juvyr yra(bhgfgnaqvat):
+    (cvq,ap) = bf.jnvg()
+    ap >>= 8
+    vs cvq va bhgfgnaqvat:
+        qry bhgfgnaqvat[cvq]
+        pbqr = pbqr be ap
+        pbhag += 1
+    vs abg bcg.ireobfr:
+        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+vs abg bcg.ireobfr naq vfggl:
+    ybt('sfpx qbar.           \a')
+flf.rkvg(pbqr)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
+sebz ohc vzcbeg bcgvbaf, ffu
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc eonpxhc <ubfganzr> vaqrk ...
+ohc eonpxhc <ubfganzr> fnir ...
+ohc eonpxhc <ubfganzr> fcyvg ...
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs yra(rkgen) < 2:
+    b.sngny('nethzragf rkcrpgrq')
+
+pynff FvtRkprcgvba(Rkprcgvba):
+    qrs __vavg__(frys, fvtahz):
+        frys.fvtahz = fvtahz
+        Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
+qrs unaqyre(fvtahz, senzr):
+    envfr FvtRkprcgvba(fvtahz)
+
+fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
+fvtany.fvtany(fvtany.FVTVAG, unaqyre)
+
+fc = Abar
+c = Abar
+erg = 99
+
+gel:
+    ubfganzr = rkgen[0]
+    neti = rkgen[1:]
+    c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
+
+    netif = '\0'.wbva(['ohc'] + neti)
+    c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
+    c.fgqva.syhfu()
+
+    znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
+    fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
+
+    c.fgqva.pybfr()
+    c.fgqbhg.pybfr()
+
+svanyyl:
+    juvyr 1:
+        # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
+        # va pnfr bhe puvyq qbrfa'g qvr.
+        gel:
+            erg = c.jnvg()
+            fc.jnvg()
+            oernx
+        rkprcg FvtRkprcgvba, r:
+            ybt('\aohc eonpxhc: %f\a' % r)
+            bf.xvyy(c.cvq, r.fvtahz)
+            erg = 84
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc arjyvare
+"""
+b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+e = er.pbzcvyr(e'([\e\a])')
+ynfgyra = 0
+nyy = ''
+juvyr 1:
+    y = e.fcyvg(nyy, 1)
+    vs yra(y) <= 1:
+        gel:
+            o = bf.ernq(flf.fgqva.svyrab(), 4096)
+        rkprcg XrlobneqVagreehcg:
+            oernx
+        vs abg o:
+            oernx
+        nyy += o
+    ryfr:
+        nffreg(yra(y) == 3)
+        (yvar, fcyvgpune, nyy) = y
+        #fcyvgpune = '\a'
+        flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
+        vs fcyvgpune == '\e':
+            ynfgyra = yra(yvar)
+        ryfr:
+            ynfgyra = 0
+        flf.fgqbhg.syhfu()
+
+vs ynfgyra be nyy:
+    flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
+#!/hfe/ova/rai clguba
+vzcbeg flf
+sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc znetva
+"""
+b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+#tvg.vtaber_zvqk = 1
+
+zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+ynfg = '\0'*20
+ybatzngpu = 0
+sbe v va zv:
+    vs v == ynfg:
+        pbagvahr
+    #nffreg(fge(v) >= ynfg)
+    cz = _unfufcyvg.ovgzngpu(ynfg, v)
+    ybatzngpu = znk(ybatzngpu, cz)
+    ynfg = v
+cevag ybatzngpu
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg bcgvbaf, qerphefr
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc qerphefr <cngu>
+--
+k,kqri,bar-svyr-flfgrz   qba'g pebff svyrflfgrz obhaqnevrf
+d,dhvrg  qba'g npghnyyl cevag svyranzrf
+cebsvyr  eha haqre gur clguba cebsvyre
+"""
+b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar svyranzr rkcrpgrq")
+
+vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
+vs bcg.cebsvyr:
+    vzcbeg pCebsvyr
+    qrs qb_vg():
+        sbe v va vg:
+            cnff
+    pCebsvyr.eha('qb_vg()')
+ryfr:
+    vs bcg.dhvrg:
+        sbe v va vg:
+            cnff
+    ryfr:
+        sbe (anzr,fg) va vg:
+            cevag anzr
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+o,oybof    bhgchg n frevrf bs oybo vqf
+g,gerr     bhgchg n gerr vq
+p,pbzzvg   bhgchg n pbzzvg vq
+a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
+A,abbc     qba'g npghnyyl fnir gur qngn naljurer
+d,dhvrg    qba'g cevag cebterff zrffntrf
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+pbcl       whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
+orapu      cevag orapuznex gvzvatf gb fgqree
+znk-cnpx-fvmr=  znkvzhz olgrf va n fvatyr cnpx
+znk-cnpx-bowrpgf=  znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
+snabhg=  znkvzhz ahzore bs oybof va n fvatyr gerr
+"""
+b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
+        bcg.abbc be bcg.pbcl):
+    b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
+vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be 
+                               bcg.pbzzvg be bcg.anzr):
+    b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
+
+vs bcg.ireobfr >= 2:
+    tvg.ireobfr = bcg.ireobfr - 1
+    bcg.orapu = 1
+vs bcg.znk_cnpx_fvmr:
+    unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
+vs bcg.znk_cnpx_bowrpgf:
+    unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
+vs bcg.snabhg:
+    unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
+vs bcg.oybof:
+    unfufcyvg.snabhg = 0
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+fgneg_gvzr = gvzr.gvzr()
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.abbc be bcg.pbcl:
+    pyv = j = byqers = Abar
+ryvs bcg.erzbgr be vf_erirefr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+    j = pyv.arj_cnpxjevgre()
+ryfr:
+    pyv = Abar
+    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+    j = tvg.CnpxJevgre()
+
+svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
+vs j:
+    funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
+    gerr = j.arj_gerr(funyvfg)
+ryfr:
+    ynfg = 0
+    sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
+        unfufcyvg.gbgny_fcyvg += yra(oybo)
+        vs bcg.pbcl:
+            flf.fgqbhg.jevgr(fge(oybo))
+        zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
+        vs abg bcg.dhvrg naq ynfg != zrtf:
+            cebterff('%q Zolgrf ernq\e' % zrtf)
+            ynfg = zrtf
+    cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
+
+vs bcg.ireobfr:
+    ybt('\a')
+vs bcg.oybof:
+    sbe (zbqr,anzr,ova) va funyvfg:
+        cevag ova.rapbqr('urk')
+vs bcg.gerr:
+    cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+    zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+    vs bcg.pbzzvg:
+        cevag pbzzvg.rapbqr('urk')
+
+vs j:
+    j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
+        
+vs bcg.anzr:
+    vs pyv:
+        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+    ryfr:
+        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+    pyv.pybfr()
+
+frpf = gvzr.gvzr() - fgneg_gvzr
+fvmr = unfufcyvg.gbgny_fcyvg
+vs bcg.orapu:
+    ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
+        % (fvmr/1024., frpf, fvmr/1024./frpf))
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, fgehpg, zznc
+sebz ohc vzcbeg tvg, bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs f_sebz_olgrf(olgrf):
+    pyvfg = [pue(o) sbe o va olgrf]
+    erghea ''.wbva(pyvfg)
+
+
+qrs ercbeg(pbhag):
+    svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
+    q = {}
+    sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
+        y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
+        q[y[0]] = y[1]
+    vs pbhag >= 0:
+        r1 = pbhag
+        svryqf = [q[x] sbe x va svryqf]
+    ryfr:
+        r1 = ''
+    cevag ('%9f  ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
+    flf.fgqbhg.syhfu()
+
+
+bcgfcrp = """
+ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
+--
+a,ahzore=  ahzore bs bowrpgf cre plpyr
+p,plpyrf=  ahzore bs plpyrf gb eha
+vtaber-zvqk  vtaber .zvqk svyrf, hfr bayl .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+tvg.vtaber_zvqk = bcg.vtaber_zvqk
+
+tvg.purpx_ercb_be_qvr()
+z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+
+plpyrf = bcg.plpyrf be 100
+ahzore = bcg.ahzore be 10000
+
+ercbeg(-1)
+s = bcra('/qri/henaqbz')
+n = zznc.zznc(-1, 20)
+ercbeg(0)
+sbe p va kenatr(plpyrf):
+    sbe a va kenatr(ahzore):
+        o = s.ernq(3)
+        vs 0:
+            olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
+            olgrf[2] &= 0ks0
+            ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
+        ryfr:
+            n[0:2] = o[0:2]
+            n[2] = pue(beq(o[2]) & 0ks0)
+            ova = fge(n[0:20])
+        #cevag ova.rapbqr('urk')
+        z.rkvfgf(ova)
+    ercbeg((p+1)*ahzore)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+qrs cevag_abqr(grkg, a):
+    cersvk = ''
+    vs bcg.unfu:
+        cersvk += "%f " % a.unfu.rapbqr('urk')
+    vs fgng.F_VFQVE(a.zbqr):
+        cevag '%f%f/' % (cersvk, grkg)
+    ryvs fgng.F_VFYAX(a.zbqr):
+        cevag '%f%f@' % (cersvk, grkg)
+    ryfr:
+        cevag '%f%f' % (cersvk, grkg)
+
+
+bcgfcrp = """
+ohc yf <qvef...>
+--
+f,unfu   fubj unfu sbe rnpu svyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+
+vs abg rkgen:
+    rkgen = ['/']
+
+erg = 0
+sbe q va rkgen:
+    gel:
+        a = gbc.yerfbyir(q)
+        vs fgng.F_VFQVE(a.zbqr):
+            sbe fho va a:
+                cevag_abqr(fho.anzr, fho)
+        ryfr:
+            cevag_abqr(q, a)
+    rkprcg isf.AbqrReebe, r:
+        ybt('reebe: %f\a' % r)
+        erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
+sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
+sebz ohc.urycref vzcbeg *
+
+qrs abqr_anzr(grkg, a):
+    vs fgng.F_VFQVE(a.zbqr):
+        erghea '%f/' % grkg
+    ryvs fgng.F_VFYAX(a.zbqr):
+        erghea '%f@' % grkg
+    ryfr:
+        erghea '%f' % grkg
+
+
+qrs qb_yf(cngu, a):
+    y = []
+    vs fgng.F_VFQVE(a.zbqr):
+        sbe fho va a:
+            y.nccraq(abqr_anzr(fho.anzr, fho))
+    ryfr:
+        y.nccraq(abqr_anzr(cngu, a))
+    cevag pbyhzangr(y, '')
+    
+
+qrs jevgr_gb_svyr(vas, bhgs):
+    sbe oybo va puhaxlernqre(vas):
+        bhgs.jevgr(oybo)
+    
+
+qrs vachgvgre():
+    vs bf.vfnggl(flf.fgqva.svyrab()):
+        juvyr 1:
+            gel:
+                lvryq enj_vachg('ohc> ')
+            rkprcg RBSReebe:
+                oernx
+    ryfr:
+        sbe yvar va flf.fgqva:
+            lvryq yvar
+
+
+qrs _pbzcyrgre_trg_fhof(yvar):
+    (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
+    (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
+    #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
+    a = cjq.erfbyir(qve)
+    fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
+                       a.fhof()))
+    erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
+
+
+_ynfg_yvar = Abar
+_ynfg_erf = Abar
+qrs pbzcyrgre(grkg, fgngr):
+    tybony _ynfg_yvar
+    tybony _ynfg_erf
+    gel:
+        yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
+        vs _ynfg_yvar != yvar:
+            _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
+            _ynfg_yvar = yvar
+        (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
+        vs fgngr < yra(fhof):
+            fa = fhof[fgngr]
+            fa1 = fa.erfbyir('')  # qrers flzyvaxf
+            shyyanzr = bf.cngu.wbva(qve, fa.anzr)
+            vs fgng.F_VFQVE(fa1.zbqr):
+                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
+                                          grezvangr=Snyfr)
+            ryfr:
+                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
+                                          grezvangr=Gehr) + ' '
+            erghea grkg + erg
+    rkprcg Rkprcgvba, r:
+        ybt('\areebe va pbzcyrgvba: %f\a' % r)
+
+            
+bcgfcrp = """
+ohc sgc
+"""
+b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+gbc = isf.ErsYvfg(Abar)
+cjq = gbc
+
+vs rkgen:
+    yvarf = rkgen
+ryfr:
+    ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
+    ernqyvar.frg_pbzcyrgre(pbzcyrgre)
+    ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
+    yvarf = vachgvgre()
+
+sbe yvar va yvarf:
+    vs abg yvar.fgevc():
+        pbagvahr
+    jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
+    pzq = jbeqf[0].ybjre()
+    #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
+    gel:
+        vs pzq == 'yf':
+            sbe cnez va (jbeqf[1:] be ['.']):
+                qb_yf(cnez, cjq.erfbyir(cnez))
+        ryvs pzq == 'pq':
+            sbe cnez va jbeqf[1:]:
+                cjq = cjq.erfbyir(cnez)
+        ryvs pzq == 'cjq':
+            cevag cjq.shyyanzr()
+        ryvs pzq == 'png':
+            sbe cnez va jbeqf[1:]:
+                jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
+        ryvs pzq == 'trg':
+            vs yra(jbeqf) abg va [2,3]:
+                envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
+            eanzr = jbeqf[1]
+            (qve,onfr) = bf.cngu.fcyvg(eanzr)
+            yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
+            vas = cjq.erfbyir(eanzr).bcra()
+            ybt('Fnivat %e\a' % yanzr)
+            jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
+        ryvs pzq == 'ztrg':
+            sbe cnez va jbeqf[1:]:
+                (qve,onfr) = bf.cngu.fcyvg(cnez)
+                sbe a va cjq.erfbyir(qve).fhof():
+                    vs sazngpu.sazngpu(a.anzr, onfr):
+                        gel:
+                            ybt('Fnivat %e\a' % a.anzr)
+                            vas = a.bcra()
+                            bhgs = bcra(a.anzr, 'jo')
+                            jevgr_gb_svyr(vas, bhgs)
+                            bhgs.pybfr()
+                        rkprcg Rkprcgvba, r:
+                            ybt('  reebe: %f\a' % r)
+        ryvs pzq == 'uryc' be pzq == '?':
+            ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
+        ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
+            oernx
+        ryfr:
+            envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
+    rkprcg Rkprcgvba, r:
+        ybt('reebe: %f\a' % r)
+        #envfr
+#!/hfe/ova/rai clguba
+vzcbeg flf, zznc
+sebz ohc vzcbeg bcgvbaf, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc enaqbz [-F frrq] <ahzolgrf>
+--
+F,frrq=   bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
+s,sbepr   cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
+"""
+b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+gbgny = cnefr_ahz(rkgen[0])
+
+vs bcg.sbepr be (abg bf.vfnggl(1) naq
+                 abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
+    _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
+ryfr:
+    ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc uryc <pbzznaq>
+"""
+b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) == 0:
+    # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
+    bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
+ryvs yra(rkgen) == 1:
+    qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
+    rkr = flf.neti[0]
+    (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
+    znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
+    t = tybo.tybo(znacngu)
+    vs t:
+        bf.rkrpic('zna', ['zna', '-y', t[0]])
+    ryfr:
+        bf.rkrpic('zna', ['zna', qbpanzr])
+ryfr:
+    b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+
+pynff Fgng(shfr.Fgng):
+    qrs __vavg__(frys):
+        frys.fg_zbqr = 0
+        frys.fg_vab = 0
+        frys.fg_qri = 0
+        frys.fg_ayvax = 0
+        frys.fg_hvq = 0
+        frys.fg_tvq = 0
+        frys.fg_fvmr = 0
+        frys.fg_ngvzr = 0
+        frys.fg_zgvzr = 0
+        frys.fg_pgvzr = 0
+        frys.fg_oybpxf = 0
+        frys.fg_oyxfvmr = 0
+        frys.fg_eqri = 0
+
+
+pnpur = {}
+qrs pnpur_trg(gbc, cngu):
+    cnegf = cngu.fcyvg('/')
+    pnpur[('',)] = gbc
+    p = Abar
+    znk = yra(cnegf)
+    #ybt('pnpur: %e\a' % pnpur.xrlf())
+    sbe v va enatr(znk):
+        cer = cnegf[:znk-v]
+        #ybt('pnpur gelvat: %e\a' % cer)
+        p = pnpur.trg(ghcyr(cer))
+        vs p:
+            erfg = cnegf[znk-v:]
+            sbe e va erfg:
+                #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
+                p = p.yerfbyir(e)
+                xrl = ghcyr(cer + [e])
+                #ybt('fnivat: %e\a' % (xrl,))
+                pnpur[xrl] = p
+            oernx
+    nffreg(p)
+    erghea p
+        
+    
+
+pynff OhcSf(shfr.Shfr):
+    qrs __vavg__(frys, gbc):
+        shfr.Shfr.__vavg__(frys)
+        frys.gbc = gbc
+    
+    qrs trgngge(frys, cngu):
+        ybt('--trgngge(%e)\a' % cngu)
+        gel:
+            abqr = pnpur_trg(frys.gbc, cngu)
+            fg = Fgng()
+            fg.fg_zbqr = abqr.zbqr
+            fg.fg_ayvax = abqr.ayvaxf()
+            fg.fg_fvmr = abqr.fvmr()
+            fg.fg_zgvzr = abqr.zgvzr
+            fg.fg_pgvzr = abqr.pgvzr
+            fg.fg_ngvzr = abqr.ngvzr
+            erghea fg
+        rkprcg isf.AbFhpuSvyr:
+            erghea -reeab.RABRAG
+
+    qrs ernqqve(frys, cngu, bssfrg):
+        ybt('--ernqqve(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        lvryq shfr.Qveragel('.')
+        lvryq shfr.Qveragel('..')
+        sbe fho va abqr.fhof():
+            lvryq shfr.Qveragel(fho.anzr)
+
+    qrs ernqyvax(frys, cngu):
+        ybt('--ernqyvax(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        erghea abqr.ernqyvax()
+
+    qrs bcra(frys, cngu, syntf):
+        ybt('--bcra(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
+        vs (syntf & nppzbqr) != bf.B_EQBAYL:
+            erghea -reeab.RNPPRF
+        abqr.bcra()
+
+    qrs eryrnfr(frys, cngu, syntf):
+        ybt('--eryrnfr(%e)\a' % cngu)
+
+    qrs ernq(frys, cngu, fvmr, bssfrg):
+        ybt('--ernq(%e)\a' % cngu)
+        a = pnpur_trg(frys.gbc, cngu)
+        b = a.bcra()
+        b.frrx(bssfrg)
+        erghea b.ernq(fvmr)
+
+
+vs abg unfngge(shfr, '__irefvba__'):
+    envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
+shfr.shfr_clguba_ncv = (0, 2)
+
+
+bcgfcrp = """
+ohc shfr [-q] [-s] <zbhagcbvag>
+--
+q,qroht   vapernfr qroht yriry
+s,sbertebhaq  eha va sbertebhaq
+"""
+b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+s = OhcSf(gbc)
+s.shfr_netf.zbhagcbvag = rkgen[0]
+vs bcg.qroht:
+    s.shfr_netf.nqq('qroht')
+vs bcg.sbertebhaq:
+    s.shfr_netf.frgzbq('sbertebhaq')
+cevag s.zhygvguernqrq
+s.zhygvguernqrq = Snyfr
+
+s.znva()
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+
+vs bcg.erzbgr:
+    tvg.vavg_ercb()  # ybpny ercb
+    tvg.purpx_ercb_be_qvr()
+    pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
+    pyv.pybfr()
+ryfr:
+    tvg.vavg_ercb()
+#!/hfe/ova/rai clguba
+vzcbeg flf, zngu, fgehpg, tybo
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+CNTR_FVMR=4096
+FUN_CRE_CNTR=CNTR_FVMR/200.
+
+
+qrs zretr(vqkyvfg, ovgf, gnoyr):
+    pbhag = 0
+    sbe r va tvg.vqkzretr(vqkyvfg):
+        pbhag += 1
+        cersvk = tvg.rkgenpg_ovgf(r, ovgf)
+        gnoyr[cersvk] = pbhag
+        lvryq r
+
+
+qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
+    vs abg bhgsvyranzr:
+        nffreg(bhgqve)
+        fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
+        bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
+    
+    vac = []
+    gbgny = 0
+    sbe anzr va vasvyranzrf:
+        vk = tvg.CnpxVqk(anzr)
+        vac.nccraq(vk)
+        gbgny += yra(vk)
+
+    ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
+    vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
+       be (bcg.sbepr naq abg gbgny):
+        ybt('zvqk: abguvat gb qb.\a')
+        erghea
+
+    cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
+    ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
+    ragevrf = 2**ovgf
+    ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
+    
+    gnoyr = [0]*ragevrf
+
+    gel:
+        bf.hayvax(bhgsvyranzr)
+    rkprcg BFReebe:
+        cnff
+    s = bcra(bhgsvyranzr + '.gzc', 'j+')
+    s.jevgr('ZVQK\0\0\0\2')
+    s.jevgr(fgehpg.cnpx('!V', ovgf))
+    nffreg(s.gryy() == 12)
+    s.jevgr('\0'*4*ragevrf)
+    
+    sbe r va zretr(vac, ovgf, gnoyr):
+        s.jevgr(r)
+        
+    s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
+
+    s.frrx(12)
+    s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
+    s.pybfr()
+    bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
+
+    # guvf vf whfg sbe grfgvat
+    vs 0:
+        c = tvg.CnpxZvqk(bhgsvyranzr)
+        nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
+        cevag c.vqkanzrf
+        nffreg(yra(c) == gbgny)
+        cv = vgre(c)
+        sbe v va zretr(vac, gbgny, ovgf, gnoyr):
+            nffreg(v == cv.arkg())
+            nffreg(c.rkvfgf(v))
+
+    cevag bhgsvyranzr
+
+bcgfcrp = """
+ohc zvqk [bcgvbaf...] <vqkanzrf...>
+--
+b,bhgchg=  bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
+n,nhgb     nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
+s,sbepr    nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen naq (bcg.nhgb be bcg.sbepr):
+    b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
+
+tvg.purpx_ercb_be_qvr()
+
+vs rkgen:
+    qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
+ryvs bcg.nhgb be bcg.sbepr:
+    cnguf = [tvg.ercb('bowrpgf/cnpx')]
+    cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
+    sbe cngu va cnguf:
+        ybt('zvqk: fpnaavat %f\a' % cngu)
+        vs bcg.sbepr:
+            qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
+        ryvs bcg.nhgb:
+            z = tvg.CnpxVqkYvfg(cngu)
+            arrqrq = {}
+            sbe cnpx va z.cnpxf:  # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
+                vs cnpx.anzr.raqfjvgu('.vqk'):
+                    arrqrq[cnpx.anzr] = 1
+            qry z
+            qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
+        ybt('\a')
+ryfr:
+    b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, enaqbz
+sebz ohc vzcbeg bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs enaqoybpx(a):
+    y = []
+    sbe v va kenatr(a):
+        y.nccraq(pue(enaqbz.enaqenatr(0,256)))
+    erghea ''.wbva(y)
+
+
+bcgfcrp = """
+ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
+--
+   JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
+a,ahz=   ahzore bs oybpxf gb qnzntr
+f,fvmr=  znkvzhz fvmr bs rnpu qnzntrq oybpx
+creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
+rdhny    fcernq qnzntr rirayl guebhtubhg gur svyr
+F,frrq=  enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
+"""
+b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg rkgen:
+    b.sngny('svyranzrf rkcrpgrq')
+
+vs bcg.frrq != Abar:
+    enaqbz.frrq(bcg.frrq)
+
+sbe anzr va rkgen:
+    ybt('Qnzntvat "%f"...\a' % anzr)
+    s = bcra(anzr, 'e+o')
+    fg = bf.sfgng(s.svyrab())
+    fvmr = fg.fg_fvmr
+    vs bcg.creprag be bcg.fvmr:
+        zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
+        zf2 = bcg.fvmr be fvmr
+        znkfvmr = zva(zf1, zf2)
+    ryfr:
+        znkfvmr = 1
+    puhaxf = bcg.ahz be 10
+    puhaxfvmr = fvmr/puhaxf
+    sbe e va enatr(puhaxf):
+        fm = enaqbz.enaqenatr(1, znkfvmr+1)
+        vs fm > fvmr:
+            fm = fvmr
+        vs bcg.rdhny:
+            bsf = e*puhaxfvmr
+        ryfr:
+            bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
+        ybt('  %6q olgrf ng %q\a' % (fm, bsf))
+        s.frrx(bsf)
+        s.jevgr(enaqoybpx(fm))
+    s.pybfr()
+#!/hfe/ova/rai clguba
+vzcbeg flf, fgehpg, zznc
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+fhfcraqrq_j = Abar
+
+
+qrs vavg_qve(pbaa, net):
+    tvg.vavg_ercb(net)
+    ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
+    pbaa.bx()
+
+
+qrs frg_qve(pbaa, net):
+    tvg.purpx_ercb_be_qvr(net)
+    ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
+    pbaa.bx()
+
+    
+qrs yvfg_vaqrkrf(pbaa, whax):
+    tvg.purpx_ercb_be_qvr()
+    sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
+        vs s.raqfjvgu('.vqk'):
+            pbaa.jevgr('%f\a' % s)
+    pbaa.bx()
+
+
+qrs fraq_vaqrk(pbaa, anzr):
+    tvg.purpx_ercb_be_qvr()
+    nffreg(anzr.svaq('/') < 0)
+    nffreg(anzr.raqfjvgu('.vqk'))
+    vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
+    pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
+    pbaa.jevgr(vqk.znc)
+    pbaa.bx()
+
+
+qrs erprvir_bowrpgf(pbaa, whax):
+    tybony fhfcraqrq_j
+    tvg.purpx_ercb_be_qvr()
+    fhttrfgrq = {}
+    vs fhfcraqrq_j:
+        j = fhfcraqrq_j
+        fhfcraqrq_j = Abar
+    ryfr:
+        j = tvg.CnpxJevgre()
+    juvyr 1:
+        af = pbaa.ernq(4)
+        vs abg af:
+            j.nobeg()
+            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
+        a = fgehpg.hacnpx('!V', af)[0]
+        #ybt('rkcrpgvat %q olgrf\a' % a)
+        vs abg a:
+            ybt('ohc freire: erprvirq %q bowrpg%f.\a' 
+                % (j.pbhag, j.pbhag!=1 naq "f" be ''))
+            shyycngu = j.pybfr()
+            vs shyycngu:
+                (qve, anzr) = bf.cngu.fcyvg(shyycngu)
+                pbaa.jevgr('%f.vqk\a' % anzr)
+            pbaa.bx()
+            erghea
+        ryvs a == 0kssssssss:
+            ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
+            fhfcraqrq_j = j
+            pbaa.bx()
+            erghea
+            
+        ohs = pbaa.ernq(a)  # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
+        #ybt('ernq %q olgrf\a' % a)
+        vs yra(ohs) < a:
+            j.nobeg()
+            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
+                            % (a, yra(ohs)))
+        (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
+        fun = tvg.pnyp_unfu(glcr, pbagrag)
+        byqcnpx = j.rkvfgf(fun)
+        # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
+        # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
+        # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
+        # ba gur freire fvqr.
+        vs abg fhttrfgrq naq \
+          byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
+            # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
+            # ng guvf ynlre.  Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
+            # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
+            # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
+            # znxr gur svyrf ovttre.  Guvf zrgubq vf pregnvayl abg irel
+            # rssvpvrag.
+            j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
+            byqcnpx = j.bowpnpur.rkvfgf(fun)
+            ybt('arj fhttrfgvba: %e\a' % byqcnpx)
+            nffreg(byqcnpx)
+            nffreg(byqcnpx != Gehr)
+            nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
+            j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
+        vs abg fhttrfgrq naq byqcnpx:
+            nffreg(byqcnpx.raqfjvgu('.vqk'))
+            (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
+            vs abg (anzr va fhttrfgrq):
+                ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
+                pbaa.jevgr('vaqrk %f\a' % anzr)
+                fhttrfgrq[anzr] = 1
+        ryfr:
+            j._enj_jevgr([ohs])
+    # ABGERNPURQ
+
+
+qrs ernq_ers(pbaa, ersanzr):
+    tvg.purpx_ercb_be_qvr()
+    e = tvg.ernq_ers(ersanzr)
+    pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
+    pbaa.bx()
+
+
+qrs hcqngr_ers(pbaa, ersanzr):
+    tvg.purpx_ercb_be_qvr()
+    arjiny = pbaa.ernqyvar().fgevc()
+    byqiny = pbaa.ernqyvar().fgevc()
+    tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
+    pbaa.bx()
+
+
+qrs png(pbaa, vq):
+    tvg.purpx_ercb_be_qvr()
+    gel:
+        sbe oybo va tvg.png(vq):
+            pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
+            pbaa.jevgr(oybo)
+    rkprcg XrlReebe, r:
+        ybt('freire: reebe: %f\a' % r)
+        pbaa.jevgr('\0\0\0\0')
+        pbaa.reebe(r)
+    ryfr:
+        pbaa.jevgr('\0\0\0\0')
+        pbaa.bx()
+
+
+bcgfcrp = """
+ohc freire
+"""
+b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+ybt('ohc freire: ernqvat sebz fgqva.\a')
+
+pbzznaqf = {
+    'vavg-qve': vavg_qve,
+    'frg-qve': frg_qve,
+    'yvfg-vaqrkrf': yvfg_vaqrkrf,
+    'fraq-vaqrk': fraq_vaqrk,
+    'erprvir-bowrpgf': erprvir_bowrpgf,
+    'ernq-ers': ernq_ers,
+    'hcqngr-ers': hcqngr_ers,
+    'png': png,
+}
+
+# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
+# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
+pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
+ye = yvarernqre(pbaa)
+sbe _yvar va ye:
+    yvar = _yvar.fgevc()
+    vs abg yvar:
+        pbagvahr
+    ybt('ohc freire: pbzznaq: %e\a' % yvar)
+    jbeqf = yvar.fcyvg(' ', 1)
+    pzq = jbeqf[0]
+    erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
+    vs pzq == 'dhvg':
+        oernx
+    ryfr:
+        pzq = pbzznaqf.trg(pzq)
+        vs pzq:
+            pzq(pbaa, erfg)
+        ryfr:
+            envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
+
+ybt('ohc freire: qbar\a')
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+    rkgen = yvarernqre(flf.fgqva)
+
+erg = 0
+
+vs bcg.erzbgr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    png = pyv.png
+ryfr:
+    pc = tvg.PngCvcr()
+    png = pc.wbva
+
+sbe vq va rkgen:
+    gel:
+        sbe oybo va png(vq):
+            flf.fgqbhg.jevgr(oybo)
+    rkprcg XrlReebe, r:
+        flf.fgqbhg.syhfu()
+        ybt('reebe: %f\a' % r)
+        erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, reeab, fgng, gvzr, zngu
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc fnir [-gp] [-a anzr] <svyranzrf...>
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+g,gerr     bhgchg n gerr vq
+p,pbzzvg   bhgchg n pbzzvg vq
+a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+d,dhvrg    qba'g fubj cebterff zrgre
+fznyyre=   bayl onpx hc svyrf fznyyre guna a olgrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
+    b.sngny("hfr bar be zber bs -g, -p, -a")
+vs abg rkgen:
+    b.sngny("ab svyranzrf tvira")
+
+bcg.cebterff = (vfggl naq abg bcg.dhvrg)
+bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.erzbgr be vf_erirefr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+    j = pyv.arj_cnpxjevgre()
+ryfr:
+    pyv = Abar
+    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+    j = tvg.CnpxJevgre()
+
+unaqyr_pgey_p()
+
+
+qrs rngfynfu(qve):
+    vs qve.raqfjvgu('/'):
+        erghea qve[:-1]
+    ryfr:
+        erghea qve
+
+
+cnegf = ['']
+funyvfgf = [[]]
+
+qrs _chfu(cneg):
+    nffreg(cneg)
+    cnegf.nccraq(cneg)
+    funyvfgf.nccraq([])
+
+qrs _cbc(sbepr_gerr):
+    nffreg(yra(cnegf) >= 1)
+    cneg = cnegf.cbc()
+    funyvfg = funyvfgf.cbc()
+    gerr = sbepr_gerr be j.arj_gerr(funyvfg)
+    vs funyvfgf:
+        funyvfgf[-1].nccraq(('40000', cneg, gerr))
+    ryfr:  # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
+        funyvfgf.nccraq(funyvfg)
+    erghea gerr
+
+ynfgerznva = Abar
+qrs cebterff_ercbeg(a):
+    tybony pbhag, fhopbhag, ynfgerznva
+    fhopbhag += a
+    pp = pbhag + fhopbhag
+    cpg = gbgny naq (pp*100.0/gbgny) be 0
+    abj = gvzr.gvzr()
+    ryncfrq = abj - gfgneg
+    xcf = ryncfrq naq vag(pp/1024./ryncfrq)
+    xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
+    xcf = vag(xcf/xcf_senp)*xcf_senp
+    vs pp:
+        erznva = ryncfrq*1.0/pp * (gbgny-pp)
+    ryfr:
+        erznva = 0.0
+    vs (ynfgerznva naq (erznva > ynfgerznva)
+          naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
+        erznva = ynfgerznva
+    ryfr:
+        ynfgerznva = erznva
+    ubhef = vag(erznva/60/60)
+    zvaf = vag(erznva/60 - ubhef*60)
+    frpf = vag(erznva - ubhef*60*60 - zvaf*60)
+    vs ryncfrq < 30:
+        erznvafge = ''
+        xcffge = ''
+    ryfr:
+        xcffge = '%qx/f' % xcf
+        vs ubhef:
+            erznvafge = '%qu%qz' % (ubhef, zvaf)
+        ryvs zvaf:
+            erznvafge = '%qz%q' % (zvaf, frpf)
+        ryfr:
+            erznvafge = '%qf' % frpf
+    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
+             % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
+                erznvafge, xcffge))
+
+
+e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
+
+qrs nyernql_fnirq(rag):
+    erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
+
+qrs jnagerphefr_cer(rag):
+    erghea abg nyernql_fnirq(rag)
+
+qrs jnagerphefr_qhevat(rag):
+    erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
+
+gbgny = sgbgny = 0
+vs bcg.cebterff:
+    sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
+        vs abg (sgbgny % 10024):
+            cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
+        rkvfgf = rag.rkvfgf()
+        unfuinyvq = nyernql_fnirq(rag)
+        rag.frg_fun_zvffvat(abg unfuinyvq)
+        vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
+            vs rkvfgf naq abg unfuinyvq:
+                gbgny += rag.fvmr
+        sgbgny += 1
+    cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
+    unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
+
+gfgneg = gvzr.gvzr()
+pbhag = fhopbhag = spbhag = 0
+ynfgfxvc_anzr = Abar
+ynfgqve = ''
+sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
+    (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
+    rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
+    unfuinyvq = nyernql_fnirq(rag)
+    jnfzvffvat = rag.fun_zvffvat()
+    byqfvmr = rag.fvmr
+    vs bcg.ireobfr:
+        vs abg rkvfgf:
+            fgnghf = 'Q'
+        ryvs abg unfuinyvq:
+            vs rag.fun == vaqrk.RZCGL_FUN:
+                fgnghf = 'N'
+            ryfr:
+                fgnghf = 'Z'
+        ryfr:
+            fgnghf = ' '
+        vs bcg.ireobfr >= 2:
+            ybt('%f %-70f\a' % (fgnghf, rag.anzr))
+        ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
+            vs abg ynfgqve.fgnegfjvgu(qve):
+                ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
+            ynfgqve = qve
+
+    vs bcg.cebterff:
+        cebterff_ercbeg(0)
+    spbhag += 1
+    
+    vs abg rkvfgf:
+        pbagvahr
+    vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
+        vs rkvfgf naq abg unfuinyvq:
+            nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
+            ynfgfxvc_anzr = rag.anzr
+        pbagvahr
+
+    nffreg(qve.fgnegfjvgu('/'))
+    qvec = qve.fcyvg('/')
+    juvyr cnegf > qvec:
+        _cbc(sbepr_gerr = Abar)
+    vs qve != '/':
+        sbe cneg va qvec[yra(cnegf):]:
+            _chfu(cneg)
+
+    vs abg svyr:
+        # ab svyranzr cbegvba zrnaf guvf vf n fhoqve.  Ohg
+        # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
+        byqgerr = nyernql_fnirq(rag) # znl or Abar
+        arjgerr = _cbc(sbepr_gerr = byqgerr)
+        vs abg byqgerr:
+            vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
+                rag.vainyvqngr()
+            ryfr:
+                rag.inyvqngr(040000, arjgerr)
+            rag.ercnpx()
+        vs rkvfgf naq jnfzvffvat:
+            pbhag += byqfvmr
+        pbagvahr
+
+    # vg'f abg n qverpgbel
+    vq = Abar
+    vs unfuinyvq:
+        zbqr = '%b' % rag.tvgzbqr
+        vq = rag.fun
+        funyvfgf[-1].nccraq((zbqr, 
+                             tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+                             vq))
+    ryfr:
+        vs fgng.F_VFERT(rag.zbqr):
+            gel:
+                s = unfufcyvg.bcra_abngvzr(rag.anzr)
+            rkprcg VBReebe, r:
+                nqq_reebe(r)
+                ynfgfxvc_anzr = rag.anzr
+            rkprcg BFReebe, r:
+                nqq_reebe(r)
+                ynfgfxvc_anzr = rag.anzr
+            ryfr:
+                (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
+        ryfr:
+            vs fgng.F_VFQVE(rag.zbqr):
+                nffreg(0)  # unaqyrq nobir
+            ryvs fgng.F_VFYAX(rag.zbqr):
+                gel:
+                    ey = bf.ernqyvax(rag.anzr)
+                rkprcg BFReebe, r:
+                    nqq_reebe(r)
+                    ynfgfxvc_anzr = rag.anzr
+                rkprcg VBReebe, r:
+                    nqq_reebe(r)
+                    ynfgfxvc_anzr = rag.anzr
+                ryfr:
+                    (zbqr, vq) = ('120000', j.arj_oybo(ey))
+            ryfr:
+                nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
+                ynfgfxvc_anzr = rag.anzr
+        vs vq:
+            rag.inyvqngr(vag(zbqr, 8), vq)
+            rag.ercnpx()
+            funyvfgf[-1].nccraq((zbqr,
+                                 tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+                                 vq))
+    vs rkvfgf naq jnfzvffvat:
+        pbhag += byqfvmr
+        fhopbhag = 0
+
+
+vs bcg.cebterff:
+    cpg = gbgny naq pbhag*100.0/gbgny be 100
+    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar.    \a'
+             % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
+
+juvyr yra(cnegf) > 1:
+    _cbc(sbepr_gerr = Abar)
+nffreg(yra(funyvfgf) == 1)
+gerr = j.arj_gerr(funyvfgf[-1])
+vs bcg.gerr:
+    cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+    zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+    vs bcg.pbzzvg:
+        cevag pbzzvg.rapbqr('urk')
+
+j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
+        
+vs bcg.anzr:
+    vs pyv:
+        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+    ryfr:
+        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+    pyv.pybfr()
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc gvpx
+"""
+b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+g = gvzr.gvzr()
+gyrsg = 1 - (g - vag(g))
+gvzr.fyrrc(gyrsg)
+#!/hfe/ova/rai clguba
+vzcbeg bf, flf, fgng, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
+sebz ohc.urycref vzcbeg *
+
+
+qrs zretr_vaqrkrf(bhg, e1, e2):
+    sbe r va vaqrk.ZretrVgre([e1, e2]):
+        # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl?  Jura?
+        bhg.nqq_vkragel(r)
+
+
+pynff VgreUrycre:
+    qrs __vavg__(frys, y):
+        frys.v = vgre(y)
+        frys.phe = Abar
+        frys.arkg()
+
+    qrs arkg(frys):
+        gel:
+            frys.phe = frys.v.arkg()
+        rkprcg FgbcVgrengvba:
+            frys.phe = Abar
+        erghea frys.phe
+
+
+qrs purpx_vaqrk(ernqre):
+    gel:
+        ybt('purpx: purpxvat sbejneq vgrengvba...\a')
+        r = Abar
+        q = {}
+        sbe r va ernqre.sbejneq_vgre():
+            vs r.puvyqera_a:
+                vs bcg.ireobfr:
+                    ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
+                                            r.anzr))
+                nffreg(r.puvyqera_bsf)
+                nffreg(r.anzr.raqfjvgu('/'))
+                nffreg(abg q.trg(r.puvyqera_bsf))
+                q[r.puvyqera_bsf] = 1
+            vs r.syntf & vaqrk.VK_UNFUINYVQ:
+                nffreg(r.fun != vaqrk.RZCGL_FUN)
+                nffreg(r.tvgzbqr)
+        nffreg(abg r be r.anzr == '/')  # ynfg ragel vf *nyjnlf* /
+        ybt('purpx: purpxvat abezny vgrengvba...\a')
+        ynfg = Abar
+        sbe r va ernqre:
+            vs ynfg:
+                nffreg(ynfg > r.anzr)
+            ynfg = r.anzr
+    rkprcg:
+        ybt('vaqrk reebe! ng %e\a' % r)
+        envfr
+    ybt('purpx: cnffrq.\a')
+
+
+qrs hcqngr_vaqrk(gbc):
+    ev = vaqrk.Ernqre(vaqrksvyr)
+    jv = vaqrk.Jevgre(vaqrksvyr)
+    evt = VgreUrycre(ev.vgre(anzr=gbc))
+    gfgneg = vag(gvzr.gvzr())
+
+    unfutra = Abar
+    vs bcg.snxr_inyvq:
+        qrs unfutra(anzr):
+            erghea (0100644, vaqrk.SNXR_FUN)
+
+    gbgny = 0
+    sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
+        vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
+            flf.fgqbhg.jevgr('%f\a' % cngu)
+            flf.fgqbhg.syhfu()
+            cebterff('Vaqrkvat: %q\e' % gbgny)
+        ryvs abg (gbgny % 128):
+            cebterff('Vaqrkvat: %q\e' % gbgny)
+        gbgny += 1
+        juvyr evt.phe naq evt.phe.anzr > cngu:  # qryrgrq cnguf
+            vs evt.phe.rkvfgf():
+                evt.phe.frg_qryrgrq()
+                evt.phe.ercnpx()
+            evt.arkg()
+        vs evt.phe naq evt.phe.anzr == cngu:    # cnguf gung nyernql rkvfgrq
+            vs cfg:
+                evt.phe.sebz_fgng(cfg, gfgneg)
+            vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
+                vs unfutra:
+                    (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
+                    evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
+            vs bcg.snxr_vainyvq:
+                evt.phe.vainyvqngr()
+            evt.phe.ercnpx()
+            evt.arkg()
+        ryfr:  # arj cnguf
+            jv.nqq(cngu, cfg, unfutra = unfutra)
+    cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
+    
+    vs ev.rkvfgf():
+        ev.fnir()
+        jv.syhfu()
+        vs jv.pbhag:
+            je = jv.arj_ernqre()
+            vs bcg.purpx:
+                ybt('purpx: orsber zretvat: byqsvyr\a')
+                purpx_vaqrk(ev)
+                ybt('purpx: orsber zretvat: arjsvyr\a')
+                purpx_vaqrk(je)
+            zv = vaqrk.Jevgre(vaqrksvyr)
+            zretr_vaqrkrf(zv, ev, je)
+            ev.pybfr()
+            zv.pybfr()
+            je.pybfr()
+        jv.nobeg()
+    ryfr:
+        jv.pybfr()
+
+
+bcgfcrp = """
+ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
+--
+c,cevag    cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
+z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
+f,fgnghf   cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
+U,unfu     cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
+y,ybat     cevag zber vasbezngvba nobhg rnpu svyr
+h,hcqngr   (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
+k,kqri,bar-svyr-flfgrz  qba'g pebff svyrflfgrz obhaqnevrf
+snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
+snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
+purpx      pnershyyl purpx vaqrk svyr vagrtevgl
+s,vaqrksvyr=  gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+"""
+b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
+    b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
+vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
+    b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
+vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
+    b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
+
+tvg.purpx_ercb_be_qvr()
+vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
+
+unaqyr_pgey_p()
+
+vs bcg.purpx:
+    ybt('purpx: fgnegvat vavgvny purpx.\a')
+    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+cnguf = vaqrk.erqhpr_cnguf(rkgen)
+
+vs bcg.hcqngr:
+    vs abg cnguf:
+        b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
+    sbe (ec,cngu) va cnguf:
+        hcqngr_vaqrk(ec)
+
+vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
+    sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
+        vs (bcg.zbqvsvrq 
+            naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
+            pbagvahr
+        yvar = ''
+        vs bcg.fgnghf:
+            vs rag.vf_qryrgrq():
+                yvar += 'Q '
+            ryvs abg rag.vf_inyvq():
+                vs rag.fun == vaqrk.RZCGL_FUN:
+                    yvar += 'N '
+                ryfr:
+                    yvar += 'Z '
+            ryfr:
+                yvar += '  '
+        vs bcg.unfu:
+            yvar += rag.fun.rapbqr('urk') + ' '
+        vs bcg.ybat:
+            yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
+        cevag yvar + (anzr be './')
+
+vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
+    ybt('purpx: fgnegvat svany purpx.\a')
+    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg
+sebz ohc vzcbeg bcgvbaf, urycref
+
+bcgfcrp = """
+ohc eonpxhc-freire
+--
+    Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+# trg gur fhopbzznaq'f neti.
+# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
+# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
+# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
+ohs = flf.fgqva.ernq(4)
+fm = fgehpg.hacnpx('!V', ohs)[0]
+nffreg(fm > 0)
+nffreg(fm < 1000000)
+ohs = flf.fgqva.ernq(fm)
+nffreg(yra(ohs) == fm)
+neti = ohs.fcyvg('\0')
+
+# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
+# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
+# gb zvfhfr gurz.  Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
+# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
+#
+# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
+# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
+# fbpxrg.  Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
+# bs vg, ohg cebonoyl qvqa'g.  Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
+# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
+#
+# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
+# qrfpevcgbef.  Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
+# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
+bf.qhc2(0, 3)
+bf.qhc2(1, 4)
+bf.qhc2(2, 1)
+sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
+bf.qhc2(sq, 0)
+bf.pybfr(sq)
+
+bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
+bf.rkrpic(neti[0], neti)
+flf.rkvg(99)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo, fhocebprff, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+cne2_bx = 0
+ahyys = bcra('/qri/ahyy')
+
+qrs qroht(f):
+    vs bcg.ireobfr:
+        ybt(f)
+
+qrs eha(neti):
+    # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
+    # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
+    # rkrpvat sbe fbzr ernfba.  Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
+    # svefg.
+    sq = bf.qhc(2)  # pbcl fgqree
+    gel:
+        c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
+        erghea c.jnvg()
+    svanyyl:
+        bf.pybfr(sq)
+
+qrs cne2_frghc():
+    tybony cne2_bx
+    ei = 1
+    gel:
+        c = fhocebprff.Cbcra(['cne2', '--uryc'],
+                             fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
+        ei = c.jnvg()
+    rkprcg BFReebe:
+        ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
+    ryfr:
+        cne2_bx = 1
+
+qrs cnei(yiy):
+    vs bcg.ireobfr >= yiy:
+        vs vfggl:
+            erghea []
+        ryfr:
+            erghea ['-d']
+    ryfr:
+        erghea ['-dd']
+
+qrs cne2_trarengr(onfr):
+    erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
+               + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
+
+qrs cne2_irevsl(onfr):
+    erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
+
+qrs cne2_ercnve(onfr):
+    erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
+
+qrs dhvpx_irevsl(onfr):
+    s = bcra(onfr + '.cnpx', 'eo')
+    s.frrx(-20, 2)
+    jnagfhz = s.ernq(20)
+    nffreg(yra(jnagfhz) == 20)
+    s.frrx(0)
+    fhz = Fun1()
+    sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
+        fhz.hcqngr(o)
+    vs fhz.qvtrfg() != jnagfhz:
+        envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
+                                                  fhz.urkqvtrfg()))
+        
+
+qrs tvg_irevsl(onfr):
+    vs bcg.dhvpx:
+        gel:
+            dhvpx_irevsl(onfr)
+        rkprcg Rkprcgvba, r:
+            qroht('reebe: %f\a' % r)
+            erghea 1
+        erghea 0
+    ryfr:
+        erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
+    
+    
+qrs qb_cnpx(onfr, ynfg):
+    pbqr = 0
+    vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
+        ierfhyg = cne2_irevsl(onfr)
+        vs ierfhyg != 0:
+            vs bcg.ercnve:
+                eerfhyg = cne2_ercnve(onfr)
+                vs eerfhyg != 0:
+                    cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
+                    pbqr = eerfhyg
+                ryfr:
+                    cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
+                    pbqr = 100
+            ryfr:
+                cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
+                pbqr = ierfhyg
+        ryfr:
+            cevag '%f bx' % ynfg
+    ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
+        terfhyg = tvg_irevsl(onfr)
+        vs terfhyg != 0:
+            cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
+            pbqr = terfhyg
+        ryfr:
+            vs cne2_bx naq bcg.trarengr:
+                cerfhyg = cne2_trarengr(onfr)
+                vs cerfhyg != 0:
+                    cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
+                    pbqr = cerfhyg
+                ryfr:
+                    cevag '%f bx' % ynfg
+            ryfr:
+                cevag '%f bx' % ynfg
+    ryfr:
+        nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
+        qroht('    fxvccrq: cne2 svyr nyernql trarengrq.\a')
+    erghea pbqr
+
+
+bcgfcrp = """
+ohc sfpx [bcgvbaf...] [svyranzrf...]
+--
+e,ercnve    nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
+t,trarengr  trarengr nhgb-ercnve vasbezngvba hfvat cne2
+i,ireobfr   vapernfr ireobfvgl (pna or hfrq zber guna bapr)
+dhvpx       whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
+w,wbof=     eha 'a' wbof va cnenyyry
+cne2-bx     vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
+qvfnoyr-cne2  vtaber cne2 rira vs vg vf ninvynoyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+cne2_frghc()
+vs bcg.cne2_bx:
+    vs cne2_bx:
+        flf.rkvg(0)  # 'gehr' va fu
+    ryfr:
+        flf.rkvg(1)
+vs bcg.qvfnoyr_cne2:
+    cne2_bx = 0
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+    qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
+    rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
+
+pbqr = 0
+pbhag = 0
+bhgfgnaqvat = {}
+sbe anzr va rkgen:
+    vs anzr.raqfjvgu('.cnpx'):
+        onfr = anzr[:-5]
+    ryvs anzr.raqfjvgu('.vqk'):
+        onfr = anzr[:-4]
+    ryvs anzr.raqfjvgu('.cne2'):
+        onfr = anzr[:-5]
+    ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
+        onfr = anzr
+    ryfr:
+        envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
+    (qve,ynfg) = bf.cngu.fcyvg(onfr)
+    cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
+    vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
+        cne2_rkvfgf = 0
+    flf.fgqbhg.syhfu()
+    qroht('sfpx: purpxvat %f (%f)\a' 
+          % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
+    vs abg bcg.ireobfr:
+        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+    
+    vs abg bcg.wbof:
+        ap = qb_cnpx(onfr, ynfg)
+        pbqr = pbqr be ap
+        pbhag += 1
+    ryfr:
+        juvyr yra(bhgfgnaqvat) >= bcg.wbof:
+            (cvq,ap) = bf.jnvg()
+            ap >>= 8
+            vs cvq va bhgfgnaqvat:
+                qry bhgfgnaqvat[cvq]
+                pbqr = pbqr be ap
+                pbhag += 1
+        cvq = bf.sbex()
+        vs cvq:  # cnerag
+            bhgfgnaqvat[cvq] = 1
+        ryfr: # puvyq
+            gel:
+                flf.rkvg(qb_cnpx(onfr, ynfg))
+            rkprcg Rkprcgvba, r:
+                ybt('rkprcgvba: %e\a' % r)
+                flf.rkvg(99)
+                
+juvyr yra(bhgfgnaqvat):
+    (cvq,ap) = bf.jnvg()
+    ap >>= 8
+    vs cvq va bhgfgnaqvat:
+        qry bhgfgnaqvat[cvq]
+        pbqr = pbqr be ap
+        pbhag += 1
+    vs abg bcg.ireobfr:
+        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+vs abg bcg.ireobfr naq vfggl:
+    ybt('sfpx qbar.           \a')
+flf.rkvg(pbqr)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
+sebz ohc vzcbeg bcgvbaf, ffu
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc eonpxhc <ubfganzr> vaqrk ...
+ohc eonpxhc <ubfganzr> fnir ...
+ohc eonpxhc <ubfganzr> fcyvg ...
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs yra(rkgen) < 2:
+    b.sngny('nethzragf rkcrpgrq')
+
+pynff FvtRkprcgvba(Rkprcgvba):
+    qrs __vavg__(frys, fvtahz):
+        frys.fvtahz = fvtahz
+        Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
+qrs unaqyre(fvtahz, senzr):
+    envfr FvtRkprcgvba(fvtahz)
+
+fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
+fvtany.fvtany(fvtany.FVTVAG, unaqyre)
+
+fc = Abar
+c = Abar
+erg = 99
+
+gel:
+    ubfganzr = rkgen[0]
+    neti = rkgen[1:]
+    c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
+
+    netif = '\0'.wbva(['ohc'] + neti)
+    c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
+    c.fgqva.syhfu()
+
+    znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
+    fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
+
+    c.fgqva.pybfr()
+    c.fgqbhg.pybfr()
+
+svanyyl:
+    juvyr 1:
+        # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
+        # va pnfr bhe puvyq qbrfa'g qvr.
+        gel:
+            erg = c.jnvg()
+            fc.jnvg()
+            oernx
+        rkprcg FvtRkprcgvba, r:
+            ybt('\aohc eonpxhc: %f\a' % r)
+            bf.xvyy(c.cvq, r.fvtahz)
+            erg = 84
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc arjyvare
+"""
+b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+e = er.pbzcvyr(e'([\e\a])')
+ynfgyra = 0
+nyy = ''
+juvyr 1:
+    y = e.fcyvg(nyy, 1)
+    vs yra(y) <= 1:
+        gel:
+            o = bf.ernq(flf.fgqva.svyrab(), 4096)
+        rkprcg XrlobneqVagreehcg:
+            oernx
+        vs abg o:
+            oernx
+        nyy += o
+    ryfr:
+        nffreg(yra(y) == 3)
+        (yvar, fcyvgpune, nyy) = y
+        #fcyvgpune = '\a'
+        flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
+        vs fcyvgpune == '\e':
+            ynfgyra = yra(yvar)
+        ryfr:
+            ynfgyra = 0
+        flf.fgqbhg.syhfu()
+
+vs ynfgyra be nyy:
+    flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
+#!/hfe/ova/rai clguba
+vzcbeg flf
+sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc znetva
+"""
+b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+#tvg.vtaber_zvqk = 1
+
+zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+ynfg = '\0'*20
+ybatzngpu = 0
+sbe v va zv:
+    vs v == ynfg:
+        pbagvahr
+    #nffreg(fge(v) >= ynfg)
+    cz = _unfufcyvg.ovgzngpu(ynfg, v)
+    ybatzngpu = znk(ybatzngpu, cz)
+    ynfg = v
+cevag ybatzngpu
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg bcgvbaf, qerphefr
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc qerphefr <cngu>
+--
+k,kqri,bar-svyr-flfgrz   qba'g pebff svyrflfgrz obhaqnevrf
+d,dhvrg  qba'g npghnyyl cevag svyranzrf
+cebsvyr  eha haqre gur clguba cebsvyre
+"""
+b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar svyranzr rkcrpgrq")
+
+vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
+vs bcg.cebsvyr:
+    vzcbeg pCebsvyr
+    qrs qb_vg():
+        sbe v va vg:
+            cnff
+    pCebsvyr.eha('qb_vg()')
+ryfr:
+    vs bcg.dhvrg:
+        sbe v va vg:
+            cnff
+    ryfr:
+        sbe (anzr,fg) va vg:
+            cevag anzr
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+o,oybof    bhgchg n frevrf bs oybo vqf
+g,gerr     bhgchg n gerr vq
+p,pbzzvg   bhgchg n pbzzvg vq
+a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
+A,abbc     qba'g npghnyyl fnir gur qngn naljurer
+d,dhvrg    qba'g cevag cebterff zrffntrf
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+pbcl       whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
+orapu      cevag orapuznex gvzvatf gb fgqree
+znk-cnpx-fvmr=  znkvzhz olgrf va n fvatyr cnpx
+znk-cnpx-bowrpgf=  znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
+snabhg=  znkvzhz ahzore bs oybof va n fvatyr gerr
+"""
+b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
+        bcg.abbc be bcg.pbcl):
+    b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
+vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be 
+                               bcg.pbzzvg be bcg.anzr):
+    b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
+
+vs bcg.ireobfr >= 2:
+    tvg.ireobfr = bcg.ireobfr - 1
+    bcg.orapu = 1
+vs bcg.znk_cnpx_fvmr:
+    unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
+vs bcg.znk_cnpx_bowrpgf:
+    unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
+vs bcg.snabhg:
+    unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
+vs bcg.oybof:
+    unfufcyvg.snabhg = 0
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+fgneg_gvzr = gvzr.gvzr()
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.abbc be bcg.pbcl:
+    pyv = j = byqers = Abar
+ryvs bcg.erzbgr be vf_erirefr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+    j = pyv.arj_cnpxjevgre()
+ryfr:
+    pyv = Abar
+    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+    j = tvg.CnpxJevgre()
+
+svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
+vs j:
+    funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
+    gerr = j.arj_gerr(funyvfg)
+ryfr:
+    ynfg = 0
+    sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
+        unfufcyvg.gbgny_fcyvg += yra(oybo)
+        vs bcg.pbcl:
+            flf.fgqbhg.jevgr(fge(oybo))
+        zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
+        vs abg bcg.dhvrg naq ynfg != zrtf:
+            cebterff('%q Zolgrf ernq\e' % zrtf)
+            ynfg = zrtf
+    cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
+
+vs bcg.ireobfr:
+    ybt('\a')
+vs bcg.oybof:
+    sbe (zbqr,anzr,ova) va funyvfg:
+        cevag ova.rapbqr('urk')
+vs bcg.gerr:
+    cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+    zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+    vs bcg.pbzzvg:
+        cevag pbzzvg.rapbqr('urk')
+
+vs j:
+    j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
+        
+vs bcg.anzr:
+    vs pyv:
+        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+    ryfr:
+        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+    pyv.pybfr()
+
+frpf = gvzr.gvzr() - fgneg_gvzr
+fvmr = unfufcyvg.gbgny_fcyvg
+vs bcg.orapu:
+    ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
+        % (fvmr/1024., frpf, fvmr/1024./frpf))
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, fgehpg, zznc
+sebz ohc vzcbeg tvg, bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs f_sebz_olgrf(olgrf):
+    pyvfg = [pue(o) sbe o va olgrf]
+    erghea ''.wbva(pyvfg)
+
+
+qrs ercbeg(pbhag):
+    svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
+    q = {}
+    sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
+        y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
+        q[y[0]] = y[1]
+    vs pbhag >= 0:
+        r1 = pbhag
+        svryqf = [q[x] sbe x va svryqf]
+    ryfr:
+        r1 = ''
+    cevag ('%9f  ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
+    flf.fgqbhg.syhfu()
+
+
+bcgfcrp = """
+ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
+--
+a,ahzore=  ahzore bs bowrpgf cre plpyr
+p,plpyrf=  ahzore bs plpyrf gb eha
+vtaber-zvqk  vtaber .zvqk svyrf, hfr bayl .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+tvg.vtaber_zvqk = bcg.vtaber_zvqk
+
+tvg.purpx_ercb_be_qvr()
+z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+
+plpyrf = bcg.plpyrf be 100
+ahzore = bcg.ahzore be 10000
+
+ercbeg(-1)
+s = bcra('/qri/henaqbz')
+n = zznc.zznc(-1, 20)
+ercbeg(0)
+sbe p va kenatr(plpyrf):
+    sbe a va kenatr(ahzore):
+        o = s.ernq(3)
+        vs 0:
+            olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
+            olgrf[2] &= 0ks0
+            ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
+        ryfr:
+            n[0:2] = o[0:2]
+            n[2] = pue(beq(o[2]) & 0ks0)
+            ova = fge(n[0:20])
+        #cevag ova.rapbqr('urk')
+        z.rkvfgf(ova)
+    ercbeg((p+1)*ahzore)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+qrs cevag_abqr(grkg, a):
+    cersvk = ''
+    vs bcg.unfu:
+        cersvk += "%f " % a.unfu.rapbqr('urk')
+    vs fgng.F_VFQVE(a.zbqr):
+        cevag '%f%f/' % (cersvk, grkg)
+    ryvs fgng.F_VFYAX(a.zbqr):
+        cevag '%f%f@' % (cersvk, grkg)
+    ryfr:
+        cevag '%f%f' % (cersvk, grkg)
+
+
+bcgfcrp = """
+ohc yf <qvef...>
+--
+f,unfu   fubj unfu sbe rnpu svyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+
+vs abg rkgen:
+    rkgen = ['/']
+
+erg = 0
+sbe q va rkgen:
+    gel:
+        a = gbc.yerfbyir(q)
+        vs fgng.F_VFQVE(a.zbqr):
+            sbe fho va a:
+                cevag_abqr(fho.anzr, fho)
+        ryfr:
+            cevag_abqr(q, a)
+    rkprcg isf.AbqrReebe, r:
+        ybt('reebe: %f\a' % r)
+        erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
+sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
+sebz ohc.urycref vzcbeg *
+
+qrs abqr_anzr(grkg, a):
+    vs fgng.F_VFQVE(a.zbqr):
+        erghea '%f/' % grkg
+    ryvs fgng.F_VFYAX(a.zbqr):
+        erghea '%f@' % grkg
+    ryfr:
+        erghea '%f' % grkg
+
+
+qrs qb_yf(cngu, a):
+    y = []
+    vs fgng.F_VFQVE(a.zbqr):
+        sbe fho va a:
+            y.nccraq(abqr_anzr(fho.anzr, fho))
+    ryfr:
+        y.nccraq(abqr_anzr(cngu, a))
+    cevag pbyhzangr(y, '')
+    
+
+qrs jevgr_gb_svyr(vas, bhgs):
+    sbe oybo va puhaxlernqre(vas):
+        bhgs.jevgr(oybo)
+    
+
+qrs vachgvgre():
+    vs bf.vfnggl(flf.fgqva.svyrab()):
+        juvyr 1:
+            gel:
+                lvryq enj_vachg('ohc> ')
+            rkprcg RBSReebe:
+                oernx
+    ryfr:
+        sbe yvar va flf.fgqva:
+            lvryq yvar
+
+
+qrs _pbzcyrgre_trg_fhof(yvar):
+    (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
+    (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
+    #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
+    a = cjq.erfbyir(qve)
+    fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
+                       a.fhof()))
+    erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
+
+
+_ynfg_yvar = Abar
+_ynfg_erf = Abar
+qrs pbzcyrgre(grkg, fgngr):
+    tybony _ynfg_yvar
+    tybony _ynfg_erf
+    gel:
+        yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
+        vs _ynfg_yvar != yvar:
+            _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
+            _ynfg_yvar = yvar
+        (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
+        vs fgngr < yra(fhof):
+            fa = fhof[fgngr]
+            fa1 = fa.erfbyir('')  # qrers flzyvaxf
+            shyyanzr = bf.cngu.wbva(qve, fa.anzr)
+            vs fgng.F_VFQVE(fa1.zbqr):
+                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
+                                          grezvangr=Snyfr)
+            ryfr:
+                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
+                                          grezvangr=Gehr) + ' '
+            erghea grkg + erg
+    rkprcg Rkprcgvba, r:
+        ybt('\areebe va pbzcyrgvba: %f\a' % r)
+
+            
+bcgfcrp = """
+ohc sgc
+"""
+b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+gbc = isf.ErsYvfg(Abar)
+cjq = gbc
+
+vs rkgen:
+    yvarf = rkgen
+ryfr:
+    ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
+    ernqyvar.frg_pbzcyrgre(pbzcyrgre)
+    ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
+    yvarf = vachgvgre()
+
+sbe yvar va yvarf:
+    vs abg yvar.fgevc():
+        pbagvahr
+    jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
+    pzq = jbeqf[0].ybjre()
+    #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
+    gel:
+        vs pzq == 'yf':
+            sbe cnez va (jbeqf[1:] be ['.']):
+                qb_yf(cnez, cjq.erfbyir(cnez))
+        ryvs pzq == 'pq':
+            sbe cnez va jbeqf[1:]:
+                cjq = cjq.erfbyir(cnez)
+        ryvs pzq == 'cjq':
+            cevag cjq.shyyanzr()
+        ryvs pzq == 'png':
+            sbe cnez va jbeqf[1:]:
+                jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
+        ryvs pzq == 'trg':
+            vs yra(jbeqf) abg va [2,3]:
+                envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
+            eanzr = jbeqf[1]
+            (qve,onfr) = bf.cngu.fcyvg(eanzr)
+            yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
+            vas = cjq.erfbyir(eanzr).bcra()
+            ybt('Fnivat %e\a' % yanzr)
+            jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
+        ryvs pzq == 'ztrg':
+            sbe cnez va jbeqf[1:]:
+                (qve,onfr) = bf.cngu.fcyvg(cnez)
+                sbe a va cjq.erfbyir(qve).fhof():
+                    vs sazngpu.sazngpu(a.anzr, onfr):
+                        gel:
+                            ybt('Fnivat %e\a' % a.anzr)
+                            vas = a.bcra()
+                            bhgs = bcra(a.anzr, 'jo')
+                            jevgr_gb_svyr(vas, bhgs)
+                            bhgs.pybfr()
+                        rkprcg Rkprcgvba, r:
+                            ybt('  reebe: %f\a' % r)
+        ryvs pzq == 'uryc' be pzq == '?':
+            ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
+        ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
+            oernx
+        ryfr:
+            envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
+    rkprcg Rkprcgvba, r:
+        ybt('reebe: %f\a' % r)
+        #envfr
+#!/hfe/ova/rai clguba
+vzcbeg flf, zznc
+sebz ohc vzcbeg bcgvbaf, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc enaqbz [-F frrq] <ahzolgrf>
+--
+F,frrq=   bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
+s,sbepr   cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
+"""
+b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+gbgny = cnefr_ahz(rkgen[0])
+
+vs bcg.sbepr be (abg bf.vfnggl(1) naq
+                 abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
+    _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
+ryfr:
+    ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc uryc <pbzznaq>
+"""
+b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) == 0:
+    # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
+    bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
+ryvs yra(rkgen) == 1:
+    qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
+    rkr = flf.neti[0]
+    (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
+    znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
+    t = tybo.tybo(znacngu)
+    vs t:
+        bf.rkrpic('zna', ['zna', '-y', t[0]])
+    ryfr:
+        bf.rkrpic('zna', ['zna', qbpanzr])
+ryfr:
+    b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+
+pynff Fgng(shfr.Fgng):
+    qrs __vavg__(frys):
+        frys.fg_zbqr = 0
+        frys.fg_vab = 0
+        frys.fg_qri = 0
+        frys.fg_ayvax = 0
+        frys.fg_hvq = 0
+        frys.fg_tvq = 0
+        frys.fg_fvmr = 0
+        frys.fg_ngvzr = 0
+        frys.fg_zgvzr = 0
+        frys.fg_pgvzr = 0
+        frys.fg_oybpxf = 0
+        frys.fg_oyxfvmr = 0
+        frys.fg_eqri = 0
+
+
+pnpur = {}
+qrs pnpur_trg(gbc, cngu):
+    cnegf = cngu.fcyvg('/')
+    pnpur[('',)] = gbc
+    p = Abar
+    znk = yra(cnegf)
+    #ybt('pnpur: %e\a' % pnpur.xrlf())
+    sbe v va enatr(znk):
+        cer = cnegf[:znk-v]
+        #ybt('pnpur gelvat: %e\a' % cer)
+        p = pnpur.trg(ghcyr(cer))
+        vs p:
+            erfg = cnegf[znk-v:]
+            sbe e va erfg:
+                #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
+                p = p.yerfbyir(e)
+                xrl = ghcyr(cer + [e])
+                #ybt('fnivat: %e\a' % (xrl,))
+                pnpur[xrl] = p
+            oernx
+    nffreg(p)
+    erghea p
+        
+    
+
+pynff OhcSf(shfr.Shfr):
+    qrs __vavg__(frys, gbc):
+        shfr.Shfr.__vavg__(frys)
+        frys.gbc = gbc
+    
+    qrs trgngge(frys, cngu):
+        ybt('--trgngge(%e)\a' % cngu)
+        gel:
+            abqr = pnpur_trg(frys.gbc, cngu)
+            fg = Fgng()
+            fg.fg_zbqr = abqr.zbqr
+            fg.fg_ayvax = abqr.ayvaxf()
+            fg.fg_fvmr = abqr.fvmr()
+            fg.fg_zgvzr = abqr.zgvzr
+            fg.fg_pgvzr = abqr.pgvzr
+            fg.fg_ngvzr = abqr.ngvzr
+            erghea fg
+        rkprcg isf.AbFhpuSvyr:
+            erghea -reeab.RABRAG
+
+    qrs ernqqve(frys, cngu, bssfrg):
+        ybt('--ernqqve(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        lvryq shfr.Qveragel('.')
+        lvryq shfr.Qveragel('..')
+        sbe fho va abqr.fhof():
+            lvryq shfr.Qveragel(fho.anzr)
+
+    qrs ernqyvax(frys, cngu):
+        ybt('--ernqyvax(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        erghea abqr.ernqyvax()
+
+    qrs bcra(frys, cngu, syntf):
+        ybt('--bcra(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
+        vs (syntf & nppzbqr) != bf.B_EQBAYL:
+            erghea -reeab.RNPPRF
+        abqr.bcra()
+
+    qrs eryrnfr(frys, cngu, syntf):
+        ybt('--eryrnfr(%e)\a' % cngu)
+
+    qrs ernq(frys, cngu, fvmr, bssfrg):
+        ybt('--ernq(%e)\a' % cngu)
+        a = pnpur_trg(frys.gbc, cngu)
+        b = a.bcra()
+        b.frrx(bssfrg)
+        erghea b.ernq(fvmr)
+
+
+vs abg unfngge(shfr, '__irefvba__'):
+    envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
+shfr.shfr_clguba_ncv = (0, 2)
+
+
+bcgfcrp = """
+ohc shfr [-q] [-s] <zbhagcbvag>
+--
+q,qroht   vapernfr qroht yriry
+s,sbertebhaq  eha va sbertebhaq
+"""
+b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+s = OhcSf(gbc)
+s.shfr_netf.zbhagcbvag = rkgen[0]
+vs bcg.qroht:
+    s.shfr_netf.nqq('qroht')
+vs bcg.sbertebhaq:
+    s.shfr_netf.frgzbq('sbertebhaq')
+cevag s.zhygvguernqrq
+s.zhygvguernqrq = Snyfr
+
+s.znva()
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+
+vs bcg.erzbgr:
+    tvg.vavg_ercb()  # ybpny ercb
+    tvg.purpx_ercb_be_qvr()
+    pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
+    pyv.pybfr()
+ryfr:
+    tvg.vavg_ercb()
+#!/hfe/ova/rai clguba
+vzcbeg flf, zngu, fgehpg, tybo
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+CNTR_FVMR=4096
+FUN_CRE_CNTR=CNTR_FVMR/200.
+
+
+qrs zretr(vqkyvfg, ovgf, gnoyr):
+    pbhag = 0
+    sbe r va tvg.vqkzretr(vqkyvfg):
+        pbhag += 1
+        cersvk = tvg.rkgenpg_ovgf(r, ovgf)
+        gnoyr[cersvk] = pbhag
+        lvryq r
+
+
+qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
+    vs abg bhgsvyranzr:
+        nffreg(bhgqve)
+        fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
+        bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
+    
+    vac = []
+    gbgny = 0
+    sbe anzr va vasvyranzrf:
+        vk = tvg.CnpxVqk(anzr)
+        vac.nccraq(vk)
+        gbgny += yra(vk)
+
+    ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
+    vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
+       be (bcg.sbepr naq abg gbgny):
+        ybt('zvqk: abguvat gb qb.\a')
+        erghea
+
+    cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
+    ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
+    ragevrf = 2**ovgf
+    ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
+    
+    gnoyr = [0]*ragevrf
+
+    gel:
+        bf.hayvax(bhgsvyranzr)
+    rkprcg BFReebe:
+        cnff
+    s = bcra(bhgsvyranzr + '.gzc', 'j+')
+    s.jevgr('ZVQK\0\0\0\2')
+    s.jevgr(fgehpg.cnpx('!V', ovgf))
+    nffreg(s.gryy() == 12)
+    s.jevgr('\0'*4*ragevrf)
+    
+    sbe r va zretr(vac, ovgf, gnoyr):
+        s.jevgr(r)
+        
+    s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
+
+    s.frrx(12)
+    s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
+    s.pybfr()
+    bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
+
+    # guvf vf whfg sbe grfgvat
+    vs 0:
+        c = tvg.CnpxZvqk(bhgsvyranzr)
+        nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
+        cevag c.vqkanzrf
+        nffreg(yra(c) == gbgny)
+        cv = vgre(c)
+        sbe v va zretr(vac, gbgny, ovgf, gnoyr):
+            nffreg(v == cv.arkg())
+            nffreg(c.rkvfgf(v))
+
+    cevag bhgsvyranzr
+
+bcgfcrp = """
+ohc zvqk [bcgvbaf...] <vqkanzrf...>
+--
+b,bhgchg=  bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
+n,nhgb     nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
+s,sbepr    nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen naq (bcg.nhgb be bcg.sbepr):
+    b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
+
+tvg.purpx_ercb_be_qvr()
+
+vs rkgen:
+    qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
+ryvs bcg.nhgb be bcg.sbepr:
+    cnguf = [tvg.ercb('bowrpgf/cnpx')]
+    cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
+    sbe cngu va cnguf:
+        ybt('zvqk: fpnaavat %f\a' % cngu)
+        vs bcg.sbepr:
+            qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
+        ryvs bcg.nhgb:
+            z = tvg.CnpxVqkYvfg(cngu)
+            arrqrq = {}
+            sbe cnpx va z.cnpxf:  # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
+                vs cnpx.anzr.raqfjvgu('.vqk'):
+                    arrqrq[cnpx.anzr] = 1
+            qry z
+            qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
+        ybt('\a')
+ryfr:
+    b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, enaqbz
+sebz ohc vzcbeg bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs enaqoybpx(a):
+    y = []
+    sbe v va kenatr(a):
+        y.nccraq(pue(enaqbz.enaqenatr(0,256)))
+    erghea ''.wbva(y)
+
+
+bcgfcrp = """
+ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
+--
+   JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
+a,ahz=   ahzore bs oybpxf gb qnzntr
+f,fvmr=  znkvzhz fvmr bs rnpu qnzntrq oybpx
+creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
+rdhny    fcernq qnzntr rirayl guebhtubhg gur svyr
+F,frrq=  enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
+"""
+b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg rkgen:
+    b.sngny('svyranzrf rkcrpgrq')
+
+vs bcg.frrq != Abar:
+    enaqbz.frrq(bcg.frrq)
+
+sbe anzr va rkgen:
+    ybt('Qnzntvat "%f"...\a' % anzr)
+    s = bcra(anzr, 'e+o')
+    fg = bf.sfgng(s.svyrab())
+    fvmr = fg.fg_fvmr
+    vs bcg.creprag be bcg.fvmr:
+        zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
+        zf2 = bcg.fvmr be fvmr
+        znkfvmr = zva(zf1, zf2)
+    ryfr:
+        znkfvmr = 1
+    puhaxf = bcg.ahz be 10
+    puhaxfvmr = fvmr/puhaxf
+    sbe e va enatr(puhaxf):
+        fm = enaqbz.enaqenatr(1, znkfvmr+1)
+        vs fm > fvmr:
+            fm = fvmr
+        vs bcg.rdhny:
+            bsf = e*puhaxfvmr
+        ryfr:
+            bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
+        ybt('  %6q olgrf ng %q\a' % (fm, bsf))
+        s.frrx(bsf)
+        s.jevgr(enaqoybpx(fm))
+    s.pybfr()
+#!/hfe/ova/rai clguba
+vzcbeg flf, fgehpg, zznc
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+fhfcraqrq_j = Abar
+
+
+qrs vavg_qve(pbaa, net):
+    tvg.vavg_ercb(net)
+    ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
+    pbaa.bx()
+
+
+qrs frg_qve(pbaa, net):
+    tvg.purpx_ercb_be_qvr(net)
+    ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
+    pbaa.bx()
+
+    
+qrs yvfg_vaqrkrf(pbaa, whax):
+    tvg.purpx_ercb_be_qvr()
+    sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
+        vs s.raqfjvgu('.vqk'):
+            pbaa.jevgr('%f\a' % s)
+    pbaa.bx()
+
+
+qrs fraq_vaqrk(pbaa, anzr):
+    tvg.purpx_ercb_be_qvr()
+    nffreg(anzr.svaq('/') < 0)
+    nffreg(anzr.raqfjvgu('.vqk'))
+    vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
+    pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
+    pbaa.jevgr(vqk.znc)
+    pbaa.bx()
+
+
+qrs erprvir_bowrpgf(pbaa, whax):
+    tybony fhfcraqrq_j
+    tvg.purpx_ercb_be_qvr()
+    fhttrfgrq = {}
+    vs fhfcraqrq_j:
+        j = fhfcraqrq_j
+        fhfcraqrq_j = Abar
+    ryfr:
+        j = tvg.CnpxJevgre()
+    juvyr 1:
+        af = pbaa.ernq(4)
+        vs abg af:
+            j.nobeg()
+            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
+        a = fgehpg.hacnpx('!V', af)[0]
+        #ybt('rkcrpgvat %q olgrf\a' % a)
+        vs abg a:
+            ybt('ohc freire: erprvirq %q bowrpg%f.\a' 
+                % (j.pbhag, j.pbhag!=1 naq "f" be ''))
+            shyycngu = j.pybfr()
+            vs shyycngu:
+                (qve, anzr) = bf.cngu.fcyvg(shyycngu)
+                pbaa.jevgr('%f.vqk\a' % anzr)
+            pbaa.bx()
+            erghea
+        ryvs a == 0kssssssss:
+            ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
+            fhfcraqrq_j = j
+            pbaa.bx()
+            erghea
+            
+        ohs = pbaa.ernq(a)  # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
+        #ybt('ernq %q olgrf\a' % a)
+        vs yra(ohs) < a:
+            j.nobeg()
+            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
+                            % (a, yra(ohs)))
+        (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
+        fun = tvg.pnyp_unfu(glcr, pbagrag)
+        byqcnpx = j.rkvfgf(fun)
+        # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
+        # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
+        # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
+        # ba gur freire fvqr.
+        vs abg fhttrfgrq naq \
+          byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
+            # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
+            # ng guvf ynlre.  Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
+            # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
+            # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
+            # znxr gur svyrf ovttre.  Guvf zrgubq vf pregnvayl abg irel
+            # rssvpvrag.
+            j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
+            byqcnpx = j.bowpnpur.rkvfgf(fun)
+            ybt('arj fhttrfgvba: %e\a' % byqcnpx)
+            nffreg(byqcnpx)
+            nffreg(byqcnpx != Gehr)
+            nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
+            j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
+        vs abg fhttrfgrq naq byqcnpx:
+            nffreg(byqcnpx.raqfjvgu('.vqk'))
+            (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
+            vs abg (anzr va fhttrfgrq):
+                ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
+                pbaa.jevgr('vaqrk %f\a' % anzr)
+                fhttrfgrq[anzr] = 1
+        ryfr:
+            j._enj_jevgr([ohs])
+    # ABGERNPURQ
+
+
+qrs ernq_ers(pbaa, ersanzr):
+    tvg.purpx_ercb_be_qvr()
+    e = tvg.ernq_ers(ersanzr)
+    pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
+    pbaa.bx()
+
+
+qrs hcqngr_ers(pbaa, ersanzr):
+    tvg.purpx_ercb_be_qvr()
+    arjiny = pbaa.ernqyvar().fgevc()
+    byqiny = pbaa.ernqyvar().fgevc()
+    tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
+    pbaa.bx()
+
+
+qrs png(pbaa, vq):
+    tvg.purpx_ercb_be_qvr()
+    gel:
+        sbe oybo va tvg.png(vq):
+            pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
+            pbaa.jevgr(oybo)
+    rkprcg XrlReebe, r:
+        ybt('freire: reebe: %f\a' % r)
+        pbaa.jevgr('\0\0\0\0')
+        pbaa.reebe(r)
+    ryfr:
+        pbaa.jevgr('\0\0\0\0')
+        pbaa.bx()
+
+
+bcgfcrp = """
+ohc freire
+"""
+b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+ybt('ohc freire: ernqvat sebz fgqva.\a')
+
+pbzznaqf = {
+    'vavg-qve': vavg_qve,
+    'frg-qve': frg_qve,
+    'yvfg-vaqrkrf': yvfg_vaqrkrf,
+    'fraq-vaqrk': fraq_vaqrk,
+    'erprvir-bowrpgf': erprvir_bowrpgf,
+    'ernq-ers': ernq_ers,
+    'hcqngr-ers': hcqngr_ers,
+    'png': png,
+}
+
+# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
+# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
+pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
+ye = yvarernqre(pbaa)
+sbe _yvar va ye:
+    yvar = _yvar.fgevc()
+    vs abg yvar:
+        pbagvahr
+    ybt('ohc freire: pbzznaq: %e\a' % yvar)
+    jbeqf = yvar.fcyvg(' ', 1)
+    pzq = jbeqf[0]
+    erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
+    vs pzq == 'dhvg':
+        oernx
+    ryfr:
+        pzq = pbzznaqf.trg(pzq)
+        vs pzq:
+            pzq(pbaa, erfg)
+        ryfr:
+            envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
+
+ybt('ohc freire: qbar\a')
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+    rkgen = yvarernqre(flf.fgqva)
+
+erg = 0
+
+vs bcg.erzbgr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    png = pyv.png
+ryfr:
+    pc = tvg.PngCvcr()
+    png = pc.wbva
+
+sbe vq va rkgen:
+    gel:
+        sbe oybo va png(vq):
+            flf.fgqbhg.jevgr(oybo)
+    rkprcg XrlReebe, r:
+        flf.fgqbhg.syhfu()
+        ybt('reebe: %f\a' % r)
+        erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, reeab, fgng, gvzr, zngu
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc fnir [-gp] [-a anzr] <svyranzrf...>
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+g,gerr     bhgchg n gerr vq
+p,pbzzvg   bhgchg n pbzzvg vq
+a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+d,dhvrg    qba'g fubj cebterff zrgre
+fznyyre=   bayl onpx hc svyrf fznyyre guna a olgrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
+    b.sngny("hfr bar be zber bs -g, -p, -a")
+vs abg rkgen:
+    b.sngny("ab svyranzrf tvira")
+
+bcg.cebterff = (vfggl naq abg bcg.dhvrg)
+bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.erzbgr be vf_erirefr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+    j = pyv.arj_cnpxjevgre()
+ryfr:
+    pyv = Abar
+    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+    j = tvg.CnpxJevgre()
+
+unaqyr_pgey_p()
+
+
+qrs rngfynfu(qve):
+    vs qve.raqfjvgu('/'):
+        erghea qve[:-1]
+    ryfr:
+        erghea qve
+
+
+cnegf = ['']
+funyvfgf = [[]]
+
+qrs _chfu(cneg):
+    nffreg(cneg)
+    cnegf.nccraq(cneg)
+    funyvfgf.nccraq([])
+
+qrs _cbc(sbepr_gerr):
+    nffreg(yra(cnegf) >= 1)
+    cneg = cnegf.cbc()
+    funyvfg = funyvfgf.cbc()
+    gerr = sbepr_gerr be j.arj_gerr(funyvfg)
+    vs funyvfgf:
+        funyvfgf[-1].nccraq(('40000', cneg, gerr))
+    ryfr:  # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
+        funyvfgf.nccraq(funyvfg)
+    erghea gerr
+
+ynfgerznva = Abar
+qrs cebterff_ercbeg(a):
+    tybony pbhag, fhopbhag, ynfgerznva
+    fhopbhag += a
+    pp = pbhag + fhopbhag
+    cpg = gbgny naq (pp*100.0/gbgny) be 0
+    abj = gvzr.gvzr()
+    ryncfrq = abj - gfgneg
+    xcf = ryncfrq naq vag(pp/1024./ryncfrq)
+    xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
+    xcf = vag(xcf/xcf_senp)*xcf_senp
+    vs pp:
+        erznva = ryncfrq*1.0/pp * (gbgny-pp)
+    ryfr:
+        erznva = 0.0
+    vs (ynfgerznva naq (erznva > ynfgerznva)
+          naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
+        erznva = ynfgerznva
+    ryfr:
+        ynfgerznva = erznva
+    ubhef = vag(erznva/60/60)
+    zvaf = vag(erznva/60 - ubhef*60)
+    frpf = vag(erznva - ubhef*60*60 - zvaf*60)
+    vs ryncfrq < 30:
+        erznvafge = ''
+        xcffge = ''
+    ryfr:
+        xcffge = '%qx/f' % xcf
+        vs ubhef:
+            erznvafge = '%qu%qz' % (ubhef, zvaf)
+        ryvs zvaf:
+            erznvafge = '%qz%q' % (zvaf, frpf)
+        ryfr:
+            erznvafge = '%qf' % frpf
+    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
+             % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
+                erznvafge, xcffge))
+
+
+e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
+
+qrs nyernql_fnirq(rag):
+    erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
+
+qrs jnagerphefr_cer(rag):
+    erghea abg nyernql_fnirq(rag)
+
+qrs jnagerphefr_qhevat(rag):
+    erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
+
+gbgny = sgbgny = 0
+vs bcg.cebterff:
+    sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
+        vs abg (sgbgny % 10024):
+            cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
+        rkvfgf = rag.rkvfgf()
+        unfuinyvq = nyernql_fnirq(rag)
+        rag.frg_fun_zvffvat(abg unfuinyvq)
+        vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
+            vs rkvfgf naq abg unfuinyvq:
+                gbgny += rag.fvmr
+        sgbgny += 1
+    cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
+    unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
+
+gfgneg = gvzr.gvzr()
+pbhag = fhopbhag = spbhag = 0
+ynfgfxvc_anzr = Abar
+ynfgqve = ''
+sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
+    (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
+    rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
+    unfuinyvq = nyernql_fnirq(rag)
+    jnfzvffvat = rag.fun_zvffvat()
+    byqfvmr = rag.fvmr
+    vs bcg.ireobfr:
+        vs abg rkvfgf:
+            fgnghf = 'Q'
+        ryvs abg unfuinyvq:
+            vs rag.fun == vaqrk.RZCGL_FUN:
+                fgnghf = 'N'
+            ryfr:
+                fgnghf = 'Z'
+        ryfr:
+            fgnghf = ' '
+        vs bcg.ireobfr >= 2:
+            ybt('%f %-70f\a' % (fgnghf, rag.anzr))
+        ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
+            vs abg ynfgqve.fgnegfjvgu(qve):
+                ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
+            ynfgqve = qve
+
+    vs bcg.cebterff:
+        cebterff_ercbeg(0)
+    spbhag += 1
+    
+    vs abg rkvfgf:
+        pbagvahr
+    vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
+        vs rkvfgf naq abg unfuinyvq:
+            nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
+            ynfgfxvc_anzr = rag.anzr
+        pbagvahr
+
+    nffreg(qve.fgnegfjvgu('/'))
+    qvec = qve.fcyvg('/')
+    juvyr cnegf > qvec:
+        _cbc(sbepr_gerr = Abar)
+    vs qve != '/':
+        sbe cneg va qvec[yra(cnegf):]:
+            _chfu(cneg)
+
+    vs abg svyr:
+        # ab svyranzr cbegvba zrnaf guvf vf n fhoqve.  Ohg
+        # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
+        byqgerr = nyernql_fnirq(rag) # znl or Abar
+        arjgerr = _cbc(sbepr_gerr = byqgerr)
+        vs abg byqgerr:
+            vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
+                rag.vainyvqngr()
+            ryfr:
+                rag.inyvqngr(040000, arjgerr)
+            rag.ercnpx()
+        vs rkvfgf naq jnfzvffvat:
+            pbhag += byqfvmr
+        pbagvahr
+
+    # vg'f abg n qverpgbel
+    vq = Abar
+    vs unfuinyvq:
+        zbqr = '%b' % rag.tvgzbqr
+        vq = rag.fun
+        funyvfgf[-1].nccraq((zbqr, 
+                             tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+                             vq))
+    ryfr:
+        vs fgng.F_VFERT(rag.zbqr):
+            gel:
+                s = unfufcyvg.bcra_abngvzr(rag.anzr)
+            rkprcg VBReebe, r:
+                nqq_reebe(r)
+                ynfgfxvc_anzr = rag.anzr
+            rkprcg BFReebe, r:
+                nqq_reebe(r)
+                ynfgfxvc_anzr = rag.anzr
+            ryfr:
+                (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
+        ryfr:
+            vs fgng.F_VFQVE(rag.zbqr):
+                nffreg(0)  # unaqyrq nobir
+            ryvs fgng.F_VFYAX(rag.zbqr):
+                gel:
+                    ey = bf.ernqyvax(rag.anzr)
+                rkprcg BFReebe, r:
+                    nqq_reebe(r)
+                    ynfgfxvc_anzr = rag.anzr
+                rkprcg VBReebe, r:
+                    nqq_reebe(r)
+                    ynfgfxvc_anzr = rag.anzr
+                ryfr:
+                    (zbqr, vq) = ('120000', j.arj_oybo(ey))
+            ryfr:
+                nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
+                ynfgfxvc_anzr = rag.anzr
+        vs vq:
+            rag.inyvqngr(vag(zbqr, 8), vq)
+            rag.ercnpx()
+            funyvfgf[-1].nccraq((zbqr,
+                                 tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+                                 vq))
+    vs rkvfgf naq jnfzvffvat:
+        pbhag += byqfvmr
+        fhopbhag = 0
+
+
+vs bcg.cebterff:
+    cpg = gbgny naq pbhag*100.0/gbgny be 100
+    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar.    \a'
+             % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
+
+juvyr yra(cnegf) > 1:
+    _cbc(sbepr_gerr = Abar)
+nffreg(yra(funyvfgf) == 1)
+gerr = j.arj_gerr(funyvfgf[-1])
+vs bcg.gerr:
+    cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+    zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+    vs bcg.pbzzvg:
+        cevag pbzzvg.rapbqr('urk')
+
+j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
+        
+vs bcg.anzr:
+    vs pyv:
+        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+    ryfr:
+        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+    pyv.pybfr()
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc gvpx
+"""
+b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+g = gvzr.gvzr()
+gyrsg = 1 - (g - vag(g))
+gvzr.fyrrc(gyrsg)
+#!/hfe/ova/rai clguba
+vzcbeg bf, flf, fgng, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
+sebz ohc.urycref vzcbeg *
+
+
+qrs zretr_vaqrkrf(bhg, e1, e2):
+    sbe r va vaqrk.ZretrVgre([e1, e2]):
+        # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl?  Jura?
+        bhg.nqq_vkragel(r)
+
+
+pynff VgreUrycre:
+    qrs __vavg__(frys, y):
+        frys.v = vgre(y)
+        frys.phe = Abar
+        frys.arkg()
+
+    qrs arkg(frys):
+        gel:
+            frys.phe = frys.v.arkg()
+        rkprcg FgbcVgrengvba:
+            frys.phe = Abar
+        erghea frys.phe
+
+
+qrs purpx_vaqrk(ernqre):
+    gel:
+        ybt('purpx: purpxvat sbejneq vgrengvba...\a')
+        r = Abar
+        q = {}
+        sbe r va ernqre.sbejneq_vgre():
+            vs r.puvyqera_a:
+                vs bcg.ireobfr:
+                    ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
+                                            r.anzr))
+                nffreg(r.puvyqera_bsf)
+                nffreg(r.anzr.raqfjvgu('/'))
+                nffreg(abg q.trg(r.puvyqera_bsf))
+                q[r.puvyqera_bsf] = 1
+            vs r.syntf & vaqrk.VK_UNFUINYVQ:
+                nffreg(r.fun != vaqrk.RZCGL_FUN)
+                nffreg(r.tvgzbqr)
+        nffreg(abg r be r.anzr == '/')  # ynfg ragel vf *nyjnlf* /
+        ybt('purpx: purpxvat abezny vgrengvba...\a')
+        ynfg = Abar
+        sbe r va ernqre:
+            vs ynfg:
+                nffreg(ynfg > r.anzr)
+            ynfg = r.anzr
+    rkprcg:
+        ybt('vaqrk reebe! ng %e\a' % r)
+        envfr
+    ybt('purpx: cnffrq.\a')
+
+
+qrs hcqngr_vaqrk(gbc):
+    ev = vaqrk.Ernqre(vaqrksvyr)
+    jv = vaqrk.Jevgre(vaqrksvyr)
+    evt = VgreUrycre(ev.vgre(anzr=gbc))
+    gfgneg = vag(gvzr.gvzr())
+
+    unfutra = Abar
+    vs bcg.snxr_inyvq:
+        qrs unfutra(anzr):
+            erghea (0100644, vaqrk.SNXR_FUN)
+
+    gbgny = 0
+    sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
+        vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
+            flf.fgqbhg.jevgr('%f\a' % cngu)
+            flf.fgqbhg.syhfu()
+            cebterff('Vaqrkvat: %q\e' % gbgny)
+        ryvs abg (gbgny % 128):
+            cebterff('Vaqrkvat: %q\e' % gbgny)
+        gbgny += 1
+        juvyr evt.phe naq evt.phe.anzr > cngu:  # qryrgrq cnguf
+            vs evt.phe.rkvfgf():
+                evt.phe.frg_qryrgrq()
+                evt.phe.ercnpx()
+            evt.arkg()
+        vs evt.phe naq evt.phe.anzr == cngu:    # cnguf gung nyernql rkvfgrq
+            vs cfg:
+                evt.phe.sebz_fgng(cfg, gfgneg)
+            vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
+                vs unfutra:
+                    (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
+                    evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
+            vs bcg.snxr_vainyvq:
+                evt.phe.vainyvqngr()
+            evt.phe.ercnpx()
+            evt.arkg()
+        ryfr:  # arj cnguf
+            jv.nqq(cngu, cfg, unfutra = unfutra)
+    cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
+    
+    vs ev.rkvfgf():
+        ev.fnir()
+        jv.syhfu()
+        vs jv.pbhag:
+            je = jv.arj_ernqre()
+            vs bcg.purpx:
+                ybt('purpx: orsber zretvat: byqsvyr\a')
+                purpx_vaqrk(ev)
+                ybt('purpx: orsber zretvat: arjsvyr\a')
+                purpx_vaqrk(je)
+            zv = vaqrk.Jevgre(vaqrksvyr)
+            zretr_vaqrkrf(zv, ev, je)
+            ev.pybfr()
+            zv.pybfr()
+            je.pybfr()
+        jv.nobeg()
+    ryfr:
+        jv.pybfr()
+
+
+bcgfcrp = """
+ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
+--
+c,cevag    cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
+z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
+f,fgnghf   cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
+U,unfu     cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
+y,ybat     cevag zber vasbezngvba nobhg rnpu svyr
+h,hcqngr   (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
+k,kqri,bar-svyr-flfgrz  qba'g pebff svyrflfgrz obhaqnevrf
+snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
+snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
+purpx      pnershyyl purpx vaqrk svyr vagrtevgl
+s,vaqrksvyr=  gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+"""
+b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
+    b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
+vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
+    b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
+vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
+    b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
+
+tvg.purpx_ercb_be_qvr()
+vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
+
+unaqyr_pgey_p()
+
+vs bcg.purpx:
+    ybt('purpx: fgnegvat vavgvny purpx.\a')
+    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+cnguf = vaqrk.erqhpr_cnguf(rkgen)
+
+vs bcg.hcqngr:
+    vs abg cnguf:
+        b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
+    sbe (ec,cngu) va cnguf:
+        hcqngr_vaqrk(ec)
+
+vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
+    sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
+        vs (bcg.zbqvsvrq 
+            naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
+            pbagvahr
+        yvar = ''
+        vs bcg.fgnghf:
+            vs rag.vf_qryrgrq():
+                yvar += 'Q '
+            ryvs abg rag.vf_inyvq():
+                vs rag.fun == vaqrk.RZCGL_FUN:
+                    yvar += 'N '
+                ryfr:
+                    yvar += 'Z '
+            ryfr:
+                yvar += '  '
+        vs bcg.unfu:
+            yvar += rag.fun.rapbqr('urk') + ' '
+        vs bcg.ybat:
+            yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
+        cevag yvar + (anzr be './')
+
+vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
+    ybt('purpx: fgnegvat svany purpx.\a')
+    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg
+sebz ohc vzcbeg bcgvbaf, urycref
+
+bcgfcrp = """
+ohc eonpxhc-freire
+--
+    Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+# trg gur fhopbzznaq'f neti.
+# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
+# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
+# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
+ohs = flf.fgqva.ernq(4)
+fm = fgehpg.hacnpx('!V', ohs)[0]
+nffreg(fm > 0)
+nffreg(fm < 1000000)
+ohs = flf.fgqva.ernq(fm)
+nffreg(yra(ohs) == fm)
+neti = ohs.fcyvg('\0')
+
+# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
+# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
+# gb zvfhfr gurz.  Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
+# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
+#
+# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
+# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
+# fbpxrg.  Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
+# bs vg, ohg cebonoyl qvqa'g.  Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
+# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
+#
+# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
+# qrfpevcgbef.  Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
+# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
+bf.qhc2(0, 3)
+bf.qhc2(1, 4)
+bf.qhc2(2, 1)
+sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
+bf.qhc2(sq, 0)
+bf.pybfr(sq)
+
+bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
+bf.rkrpic(neti[0], neti)
+flf.rkvg(99)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo, fhocebprff, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+cne2_bx = 0
+ahyys = bcra('/qri/ahyy')
+
+qrs qroht(f):
+    vs bcg.ireobfr:
+        ybt(f)
+
+qrs eha(neti):
+    # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
+    # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
+    # rkrpvat sbe fbzr ernfba.  Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
+    # svefg.
+    sq = bf.qhc(2)  # pbcl fgqree
+    gel:
+        c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
+        erghea c.jnvg()
+    svanyyl:
+        bf.pybfr(sq)
+
+qrs cne2_frghc():
+    tybony cne2_bx
+    ei = 1
+    gel:
+        c = fhocebprff.Cbcra(['cne2', '--uryc'],
+                             fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
+        ei = c.jnvg()
+    rkprcg BFReebe:
+        ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
+    ryfr:
+        cne2_bx = 1
+
+qrs cnei(yiy):
+    vs bcg.ireobfr >= yiy:
+        vs vfggl:
+            erghea []
+        ryfr:
+            erghea ['-d']
+    ryfr:
+        erghea ['-dd']
+
+qrs cne2_trarengr(onfr):
+    erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
+               + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
+
+qrs cne2_irevsl(onfr):
+    erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
+
+qrs cne2_ercnve(onfr):
+    erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
+
+qrs dhvpx_irevsl(onfr):
+    s = bcra(onfr + '.cnpx', 'eo')
+    s.frrx(-20, 2)
+    jnagfhz = s.ernq(20)
+    nffreg(yra(jnagfhz) == 20)
+    s.frrx(0)
+    fhz = Fun1()
+    sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
+        fhz.hcqngr(o)
+    vs fhz.qvtrfg() != jnagfhz:
+        envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
+                                                  fhz.urkqvtrfg()))
+        
+
+qrs tvg_irevsl(onfr):
+    vs bcg.dhvpx:
+        gel:
+            dhvpx_irevsl(onfr)
+        rkprcg Rkprcgvba, r:
+            qroht('reebe: %f\a' % r)
+            erghea 1
+        erghea 0
+    ryfr:
+        erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
+    
+    
+qrs qb_cnpx(onfr, ynfg):
+    pbqr = 0
+    vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
+        ierfhyg = cne2_irevsl(onfr)
+        vs ierfhyg != 0:
+            vs bcg.ercnve:
+                eerfhyg = cne2_ercnve(onfr)
+                vs eerfhyg != 0:
+                    cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
+                    pbqr = eerfhyg
+                ryfr:
+                    cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
+                    pbqr = 100
+            ryfr:
+                cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
+                pbqr = ierfhyg
+        ryfr:
+            cevag '%f bx' % ynfg
+    ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
+        terfhyg = tvg_irevsl(onfr)
+        vs terfhyg != 0:
+            cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
+            pbqr = terfhyg
+        ryfr:
+            vs cne2_bx naq bcg.trarengr:
+                cerfhyg = cne2_trarengr(onfr)
+                vs cerfhyg != 0:
+                    cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
+                    pbqr = cerfhyg
+                ryfr:
+                    cevag '%f bx' % ynfg
+            ryfr:
+                cevag '%f bx' % ynfg
+    ryfr:
+        nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
+        qroht('    fxvccrq: cne2 svyr nyernql trarengrq.\a')
+    erghea pbqr
+
+
+bcgfcrp = """
+ohc sfpx [bcgvbaf...] [svyranzrf...]
+--
+e,ercnve    nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
+t,trarengr  trarengr nhgb-ercnve vasbezngvba hfvat cne2
+i,ireobfr   vapernfr ireobfvgl (pna or hfrq zber guna bapr)
+dhvpx       whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
+w,wbof=     eha 'a' wbof va cnenyyry
+cne2-bx     vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
+qvfnoyr-cne2  vtaber cne2 rira vs vg vf ninvynoyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+cne2_frghc()
+vs bcg.cne2_bx:
+    vs cne2_bx:
+        flf.rkvg(0)  # 'gehr' va fu
+    ryfr:
+        flf.rkvg(1)
+vs bcg.qvfnoyr_cne2:
+    cne2_bx = 0
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+    qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
+    rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
+
+pbqr = 0
+pbhag = 0
+bhgfgnaqvat = {}
+sbe anzr va rkgen:
+    vs anzr.raqfjvgu('.cnpx'):
+        onfr = anzr[:-5]
+    ryvs anzr.raqfjvgu('.vqk'):
+        onfr = anzr[:-4]
+    ryvs anzr.raqfjvgu('.cne2'):
+        onfr = anzr[:-5]
+    ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
+        onfr = anzr
+    ryfr:
+        envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
+    (qve,ynfg) = bf.cngu.fcyvg(onfr)
+    cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
+    vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
+        cne2_rkvfgf = 0
+    flf.fgqbhg.syhfu()
+    qroht('sfpx: purpxvat %f (%f)\a' 
+          % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
+    vs abg bcg.ireobfr:
+        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+    
+    vs abg bcg.wbof:
+        ap = qb_cnpx(onfr, ynfg)
+        pbqr = pbqr be ap
+        pbhag += 1
+    ryfr:
+        juvyr yra(bhgfgnaqvat) >= bcg.wbof:
+            (cvq,ap) = bf.jnvg()
+            ap >>= 8
+            vs cvq va bhgfgnaqvat:
+                qry bhgfgnaqvat[cvq]
+                pbqr = pbqr be ap
+                pbhag += 1
+        cvq = bf.sbex()
+        vs cvq:  # cnerag
+            bhgfgnaqvat[cvq] = 1
+        ryfr: # puvyq
+            gel:
+                flf.rkvg(qb_cnpx(onfr, ynfg))
+            rkprcg Rkprcgvba, r:
+                ybt('rkprcgvba: %e\a' % r)
+                flf.rkvg(99)
+                
+juvyr yra(bhgfgnaqvat):
+    (cvq,ap) = bf.jnvg()
+    ap >>= 8
+    vs cvq va bhgfgnaqvat:
+        qry bhgfgnaqvat[cvq]
+        pbqr = pbqr be ap
+        pbhag += 1
+    vs abg bcg.ireobfr:
+        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+vs abg bcg.ireobfr naq vfggl:
+    ybt('sfpx qbar.           \a')
+flf.rkvg(pbqr)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
+sebz ohc vzcbeg bcgvbaf, ffu
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc eonpxhc <ubfganzr> vaqrk ...
+ohc eonpxhc <ubfganzr> fnir ...
+ohc eonpxhc <ubfganzr> fcyvg ...
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs yra(rkgen) < 2:
+    b.sngny('nethzragf rkcrpgrq')
+
+pynff FvtRkprcgvba(Rkprcgvba):
+    qrs __vavg__(frys, fvtahz):
+        frys.fvtahz = fvtahz
+        Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
+qrs unaqyre(fvtahz, senzr):
+    envfr FvtRkprcgvba(fvtahz)
+
+fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
+fvtany.fvtany(fvtany.FVTVAG, unaqyre)
+
+fc = Abar
+c = Abar
+erg = 99
+
+gel:
+    ubfganzr = rkgen[0]
+    neti = rkgen[1:]
+    c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
+
+    netif = '\0'.wbva(['ohc'] + neti)
+    c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
+    c.fgqva.syhfu()
+
+    znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
+    fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
+
+    c.fgqva.pybfr()
+    c.fgqbhg.pybfr()
+
+svanyyl:
+    juvyr 1:
+        # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
+        # va pnfr bhe puvyq qbrfa'g qvr.
+        gel:
+            erg = c.jnvg()
+            fc.jnvg()
+            oernx
+        rkprcg FvtRkprcgvba, r:
+            ybt('\aohc eonpxhc: %f\a' % r)
+            bf.xvyy(c.cvq, r.fvtahz)
+            erg = 84
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc arjyvare
+"""
+b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+e = er.pbzcvyr(e'([\e\a])')
+ynfgyra = 0
+nyy = ''
+juvyr 1:
+    y = e.fcyvg(nyy, 1)
+    vs yra(y) <= 1:
+        gel:
+            o = bf.ernq(flf.fgqva.svyrab(), 4096)
+        rkprcg XrlobneqVagreehcg:
+            oernx
+        vs abg o:
+            oernx
+        nyy += o
+    ryfr:
+        nffreg(yra(y) == 3)
+        (yvar, fcyvgpune, nyy) = y
+        #fcyvgpune = '\a'
+        flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
+        vs fcyvgpune == '\e':
+            ynfgyra = yra(yvar)
+        ryfr:
+            ynfgyra = 0
+        flf.fgqbhg.syhfu()
+
+vs ynfgyra be nyy:
+    flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
+#!/hfe/ova/rai clguba
+vzcbeg flf
+sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc znetva
+"""
+b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+#tvg.vtaber_zvqk = 1
+
+zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+ynfg = '\0'*20
+ybatzngpu = 0
+sbe v va zv:
+    vs v == ynfg:
+        pbagvahr
+    #nffreg(fge(v) >= ynfg)
+    cz = _unfufcyvg.ovgzngpu(ynfg, v)
+    ybatzngpu = znk(ybatzngpu, cz)
+    ynfg = v
+cevag ybatzngpu
diff --git a/test/testfile2 b/test/testfile2
new file mode 100644 (file)
index 0000000..f57a3e5
--- /dev/null
@@ -0,0 +1,5580 @@
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg bcgvbaf, qerphefr
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc qerphefr <cngu>
+--
+k,kqri,bar-svyr-flfgrz   qba'g pebff svyrflfgrz obhaqnevrf
+d,dhvrg  qba'g npghnyyl cevag svyranzrf
+cebsvyr  eha haqre gur clguba cebsvyre
+"""
+b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar svyranzr rkcrpgrq")
+
+vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
+vs bcg.cebsvyr:
+    vzcbeg pCebsvyr
+    qrs qb_vg():
+        sbe v va vg:
+            cnff
+    pCebsvyr.eha('qb_vg()')
+ryfr:
+    vs bcg.dhvrg:
+        sbe v va vg:
+            cnff
+    ryfr:
+        sbe (anzr,fg) va vg:
+            cevag anzr
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+o,oybof    bhgchg n frevrf bs oybo vqf
+g,gerr     bhgchg n gerr vq
+p,pbzzvg   bhgchg n pbzzvg vq
+a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
+A,abbc     qba'g npghnyyl fnir gur qngn naljurer
+d,dhvrg    qba'g cevag cebterff zrffntrf
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+pbcl       whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
+orapu      cevag orapuznex gvzvatf gb fgqree
+znk-cnpx-fvmr=  znkvzhz olgrf va n fvatyr cnpx
+znk-cnpx-bowrpgf=  znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
+snabhg=  znkvzhz ahzore bs oybof va n fvatyr gerr
+"""
+b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
+        bcg.abbc be bcg.pbcl):
+    b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
+vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be 
+                               bcg.pbzzvg be bcg.anzr):
+    b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
+
+vs bcg.ireobfr >= 2:
+    tvg.ireobfr = bcg.ireobfr - 1
+    bcg.orapu = 1
+vs bcg.znk_cnpx_fvmr:
+    unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
+vs bcg.znk_cnpx_bowrpgf:
+    unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
+vs bcg.snabhg:
+    unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
+vs bcg.oybof:
+    unfufcyvg.snabhg = 0
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+fgneg_gvzr = gvzr.gvzr()
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.abbc be bcg.pbcl:
+    pyv = j = byqers = Abar
+ryvs bcg.erzbgr be vf_erirefr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+    j = pyv.arj_cnpxjevgre()
+ryfr:
+    pyv = Abar
+    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+    j = tvg.CnpxJevgre()
+
+svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
+vs j:
+    funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
+    gerr = j.arj_gerr(funyvfg)
+ryfr:
+    ynfg = 0
+    sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
+        unfufcyvg.gbgny_fcyvg += yra(oybo)
+        vs bcg.pbcl:
+            flf.fgqbhg.jevgr(fge(oybo))
+        zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
+        vs abg bcg.dhvrg naq ynfg != zrtf:
+            cebterff('%q Zolgrf ernq\e' % zrtf)
+            ynfg = zrtf
+    cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
+
+vs bcg.ireobfr:
+    ybt('\a')
+vs bcg.oybof:
+    sbe (zbqr,anzr,ova) va funyvfg:
+        cevag ova.rapbqr('urk')
+vs bcg.gerr:
+    cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+    zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+    vs bcg.pbzzvg:
+        cevag pbzzvg.rapbqr('urk')
+
+vs j:
+    j.pwba vf punatvat fbzr enaqbz olgrf urer naq gurers
+        
+vs bcg.anzr:
+    vs pyv:
+        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+    ryfr:
+        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+    pyv.pybfr()
+
+frpf = gvzr.gvzr() - fgneg_gvzr
+fvmr = unfufcyvg.gbgny_fcyvg
+vs bcg.orapu:
+    ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
+        % (fvmr/1024., frpf, fvmr/1024./frpf))
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, fgehpg, zznc
+sebz ohc vzcbeg tvg, bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs f_sebz_olgrf(olgrf):
+    pyvfg = [pue(o) sbe o va olgrf]
+    erghea ''.wbva(pyvfg)
+
+
+qrs ercbeg(pbhag):
+    svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
+    q = {}
+    sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
+        y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
+        q[y[0]] = y[1]
+    vs pbhag >= 0:
+        r1 = pbhag
+        svryqf = [q[x] sbe x va svryqf]
+    ryfr:
+        r1 = ''
+    cevag ('%9f  ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
+    flf.fgqbhg.syhfu()
+
+
+bcgfcrp = """
+ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
+--
+a,ahzore=  ahzore bs bowrpgf cre plpyr
+p,plpyrf=  ahzore bs plpyrf gb eha
+vtaber-zvqk  vtaber .zvqk svyrf, hfr bayl .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+tvg.vtaber_zvqk = bcg.vtaber_zvqk
+
+tvg.purpx_ercb_be_qvr()
+z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+
+plpyrf = bcg.plpyrf be 100
+ahzore = bcg.ahzore be 10000
+
+ercbeg(-1)
+s = bcra('/qri/henaqbz')
+n = zznc.zznc(-1, 20)
+ercbeg(0)
+sbe p va kenatr(plpyrf):
+    sbe a va kenatr(ahzore):
+        o = s.ernq(3)
+        vs 0:
+            olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
+            olgrf[2] &= 0ks0
+            ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
+        ryfr:
+            n[0:2] = o[0:2]
+            n[2] = pue(beq(o[2]) & 0ks0)
+            ova = fge(n[0:20])
+        #cevag ova.rapbqr('urk')
+        z.rkvfgf(ova)
+    ercbeg((p+1)*ahzore)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+qrs cevag_abqr(grkg, a):
+    cersvk = ''
+    vs bcg.unfu:
+        cersvk += "%f " % a.unfu.rapbqr('urk')
+    vs fgng.F_VFQVE(a.zbqr):
+        cevag '%f%f/' % (cersvk, grkg)
+    ryvs fgng.F_VFYAX(a.zbqr):
+        cevag '%f%f@' % (cersvk, grkg)
+    ryfr:
+        cevag '%f%f' % (cersvk, grkg)
+
+
+bcgfcrp = """
+ohc yf <qvef...>
+--
+f,unfu   fubj unfu sbe rnpu svyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+
+vs abg rkgen:
+    rkgen = ['/']
+
+erg = 0
+sbe q va rkgen:
+    gel:
+        a = gbc.yerfbyir(q)
+        vs fgng.F_VFQVE(a.zbqr):
+            sbe fho va a:
+                cevag_abqr(fho.anzr, fho)
+        ryfr:
+            cevag_abqr(q, a)
+    rkprcg isf.AbqrReebe, r:
+        ybt('reebe: %f\a' % r)
+        erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
+sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
+sebz ohc.urycref vzcbeg *
+
+qrs abqr_anzr(grkg, a):
+    vs fgng.F_VFQVE(a.zbqr):
+        erghea '%f/' % grkg
+    ryvs fgng.F_VFYAX(a.zbqr):
+        erghea '%f@' % grkg
+    ryfr:
+        erghea '%f' % grkg
+
+
+qrs qb_yf(cngu, a):
+    y = []
+    vs fgng.F_VFQVE(a.zbqr):
+        sbe fho va a:
+            y.nccraq(abqr_anzr(fho.anzr, fho))
+    ryfr:
+        y.nccraq(abqr_anzr(cngu, a))
+    cevag pbyhzangr(y, '')
+    
+
+qrs jevgr_gb_svyr(vas, bhgs):
+    sbe oybo va puhaxlernqre(vas):
+        bhgs.jevgr(oybo)
+    
+
+qrs vachgvgre():
+    vs bf.vfnggl(flf.fgqva.svyrab()):
+        juvyr 1:
+            gel:
+                lvryq enj_vachg('ohc> ')
+            rkprcg RBSReebe:
+                oernx
+    ryfr:
+        sbe yvar va flf.fgqva:
+            lvryq yvar
+
+
+qrs _pbzcyrgre_trg_fhof(yvar):
+    (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
+    (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
+    #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
+    a = cjq.erfbyir(qve)
+    fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
+                       a.fhof()))
+    erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
+
+
+_ynfg_yvar = Abar
+_ynfg_erf = Abar
+qrs pbzcyrgre(grkg, fgngr):
+    tybony _ynfg_yvar
+    tybony _ynfg_erf
+    gel:
+        yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
+        vs _ynfg_yvar != yvar:
+            _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
+            _ynfg_yvar = yvar
+        (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
+        vs fgngr < yra(fhof):
+            fa = fhof[fgngr]
+            fa1 = fa.erfbyir('')  # qrers flzyvaxf
+            shyyanzr = bf.cngu.wbva(qve, fa.anzr)
+            vs fgng.F_VFQVE(fa1.zbqr):
+                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
+                                          grezvangr=Snyfr)
+            ryfr:
+                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
+                                          grezvangr=Gehr) + ' '
+            erghea grkg + erg
+    rkprcg Rkprcgvba, r:
+        ybt('\areebe va pbzcyrgvba: %f\a' % r)
+
+            
+bcgfcrp = """
+ohc sgc
+"""
+b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+gbc = isf.ErsYvfg(Abar)
+cjq = gbc
+
+vs rkgen:
+    yvarf = rkgen
+ryfr:
+    ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
+    ernqyvar.frg_pbzcyrgre(pbzcyrgre)
+    ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
+    yvarf = vachgvgre()
+
+sbe yvar va yvarf:
+    vs abg yvar.fgevc():
+        pbagvahr
+    jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
+    pzq = jbeqf[0].ybjre()
+    #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
+    gel:
+        vs pzq == 'yf':
+            sbe cnez va (jbeqf[1:] be ['.']):
+                qb_yf(cnez, cjq.erfbyir(cnez))
+        ryvs pzq == 'pq':
+            sbe cnez va jbeqf[1:]:
+                cjq = cjq.erfbyir(cnez)
+        ryvs pzq == 'cjq':
+            cevag cjq.shyyanzr()
+        ryvs pzq == 'png':
+            sbe cnez va jbeqf[1:]:
+                jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
+        ryvs pzq == 'trg':
+            vs yra(jbeqf) abg va [2,3]:
+                envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
+            eanzr = jbeqf[1]
+            (qve,onfr) = bf.cngu.fcyvg(eanzr)
+            yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
+            vas = cjq.erfbyir(eanzr).bcra()
+            ybt('Fnivat %e\a' % yanzr)
+            jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
+        ryvs pzq == 'ztrg':
+            sbe cnez va jbeqf[1:]:
+                (qve,onfr) = bf.cngu.fcyvg(cnez)
+                sbe a va cjq.erfbyir(qve).fhof():
+                    vs sazngpu.sazngpu(a.anzr, onfr):
+                        gel:
+                            ybt('Fnivat %e\a' % a.anzr)
+                            vas = a.bcra()
+                            bhgs = bcra(a.anzr, 'jo')
+                            jevgr_gb_svyr(vas, bhgs)
+                            bhgs.pybfr()
+                        rkprcg Rkprcgvba, r:
+                            ybt('  reebe: %f\a' % r)
+        ryvs pzq == 'uryc' be pzq == '?':
+            ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
+        ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
+            oernx
+        ryfr:
+            envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
+    rkprcg Rkprcgvba, r:
+        ybt('reebe: %f\a' % r)
+        #envfr
+#!/hfe/ova/rai clguba
+vzcbeg flf, zznc
+sebz ohc vzcbeg bcgvbaf, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc enaqbz [-F frrq] <ahzolgrf>
+--
+F,frrq=   bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
+s,sbepr   cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
+"""
+b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+gbgny = cnefr_ahz(rkgen[0])
+
+vs bcg.sbepr be (abg bf.vfnggl(1) naq
+                 abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
+    _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
+ryfr:
+    ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc uryc <pbzznaq>
+"""
+b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) == 0:
+    # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
+    bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
+ryvs yra(rkgen) == 1:
+    qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
+    rkr = flf.neti[0]
+    (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
+    znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
+    t = tybo.tybo(znacngu)
+    vs t:
+        bf.rkrpic('zna', ['zna', '-y', t[0]])
+    ryfr:
+        bf.rkrpic('zna', ['zna', qbpanzr])
+ryfr:
+    b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+
+pynff Fgng(shfr.Fgng):
+    qrs __vavg__(frys):
+        frys.fg_zbqr = 0
+        frys.fg_vab = 0
+        frys.fg_qri = 0
+        frys.fg_ayvax = 0
+        frys.fg_hvq = 0
+        frys.fg_tvq = 0
+        frys.fg_fvmr = 0
+        frys.fg_ngvzr = 0
+        frys.fg_zgvzr = 0
+        frys.fg_pgvzr = 0
+        frys.fg_oybpxf = 0
+        frys.fg_oyxfvmr = 0
+        frys.fg_eqri = 0
+
+
+pnpur = {}
+qrs pnpur_trg(gbc, cngu):
+    cnegf = cngu.fcyvg('/')
+    pnpur[('',)] = gbc
+    p = Abar
+    znk = yra(cnegf)
+    #ybt('pnpur: %e\a' % pnpur.xrlf())
+    sbe v va enatr(znk):
+        cer = cnegf[:znk-v]
+        #ybt('pnpur gelvat: %e\a' % cer)
+        p = pnpur.trg(ghcyr(cer))
+        vs p:
+            erfg = cnegf[znk-v:]
+            sbe e va erfg:
+                #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
+                p = p.yerfbyir(e)
+                xrl = ghcyr(cer + [e])
+                #ybt('fnivat: %e\a' % (xrl,))
+                pnpur[xrl] = p
+            oernx
+    nffreg(p)
+    erghea p
+        
+    
+
+pynff OhcSf(shfr.Shfr):
+    qrs __vavg__(frys, gbc):
+        shfr.Shfr.__vavg__(frys)
+        frys.gbc = gbc
+    
+    qrs trgngge(frys, cngu):
+        ybt('--trgngge(%e)\a' % cngu)
+        gel:
+            abqr = pnpur_trg(frys.gbc, cngu)
+            fg = Fgng()
+            fg.fg_zbqr = abqr.zbqr
+            fg.fg_ayvax = abqr.ayvaxf()
+            fg.fg_fvmr = abqr.fvmr()
+            fg.fg_zgvzr = abqr.zgvzr
+            fg.fg_pgvzr = abqr.pgvzr
+            fg.fg_ngvzr = abqr.ngvzr
+            erghea fg
+        rkprcg isf.AbFhpuSvyr:
+            erghea -reeab.RABRAG
+
+    qrs ernqqve(frys, cngu, bssfrg):
+        ybt('--ernqqve(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        lvryq shfr.Qveragel('.')
+        lvryq shfr.Qveragel('..')
+        sbe fho va abqr.fhof():
+            lvryq shfr.Qveragel(fho.anzr)
+
+    qrs ernqyvax(frys, cngu):
+        ybt('--ernqyvax(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        erghea abqr.ernqyvax()
+
+    qrs bcra(frys, cngu, syntf):
+        ybt('--bcra(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
+        vs (syntf & nppzbqr) != bf.B_EQBAYL:
+            erghea -reeab.RNPPRF
+        abqr.bcra()
+
+    qrs eryrnfr(frys, cngu, syntf):
+        ybt('--eryrnfr(%e)\a' % cngu)
+
+    qrs ernq(frys, cngu, fvmr, bssfrg):
+        ybt('--ernq(%e)\a' % cngu)
+        a = pnpur_trg(frys.gbc, cngu)
+        b = a.bcra()
+        b.frrx(bssfrg)
+        erghea b.ernq(fvmr)
+
+
+vs abg unfngge(shfr, '__irefvba__'):
+    envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
+shfr.shfr_clguba_ncv = (0, 2)
+
+
+bcgfcrp = """
+ohc shfr [-q] [-s] <zbhagcbvag>
+--
+q,qroht   vapernfr qroht yriry
+s,sbertebhaq  eha va sbertebhaq
+"""
+b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+s = OhcSf(gbc)
+s.shfr_netf.zbhagcbvag = rkgen[0]
+vs bcg.qroht:
+    s.shfr_netf.nqq('qroht')
+vs bcg.sbertebhaq:
+    s.shfr_netf.frgzbq('sbertebhaq')
+cevag s.zhygvguernqrq
+s.zhygvguernqrq = Snyfr
+
+s.znva()
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+
+vs bcg.erzbgr:
+    tvg.vavg_ercb()  # ybpny ercb
+    tvg.purpx_ercb_be_qvr()
+    pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
+    pyv.pybfr()
+ryfr:
+    tvg.vavg_ercb()
+#!/hfe/ova/rai clguba
+vzcbeg flf, zngu, fgehpg, tybo
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+CNTR_FVMR=4096
+FUN_CRE_CNTR=CNTR_FVMR/200.
+
+
+qrs zretr(vqkyvfg, ovgf, gnoyr):
+    pbhag = 0
+    sbe r va tvg.vqkzretr(vqkyvfg):
+        pbhag += 1
+        cersvk = tvg.rkgenpg_ovgf(r, ovgf)
+        gnoyr[cersvk] = pbhag
+        lvryq r
+
+
+qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
+    vs abg bhgsvyranzr:
+        nffreg(bhgqve)
+        fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
+        bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
+    
+    vac = []
+    gbgny = 0
+    sbe anzr va vasvyranzrf:
+        vk = tvg.CnpxVqk(anzr)
+        vac.nccraq(vk)
+        gbgny += yra(vk)
+
+    ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
+    vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
+       be (bcg.sbepr naq abg gbgny):
+        ybt('zvqk: abguvat gb qb.\a')
+        erghea
+
+    cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
+    ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
+    ragevrf = 2**ovgf
+    ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
+    
+    gnoyr = [0]*ragevrf
+
+    gel:
+        bf.hayvax(bhgsvyranzr)
+    rkprcg BFReebe:
+        cnff
+    s = bcra(bhgsvyranzr + '.gzc', 'j+')
+    s.jevgr('ZVQK\0\0\0\2')
+    s.jevgr(fgehpg.cnpx('!V', ovgf))
+    nffreg(s.gryy() == 12)
+    s.jevgr('\0'*4*ragevrf)
+    
+    sbe r va zretr(vac, ovgf, gnoyr):
+        s.jevgr(r)
+        
+    s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
+
+    s.frrx(12)
+    s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
+    s.pybfr()
+    bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
+
+    # guvf vf whfg sbe grfgvat
+    vs 0:
+        c = tvg.CnpxZvqk(bhgsvyranzr)
+        nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
+        cevag c.vqkanzrf
+        nffreg(yra(c) == gbgny)
+        cv = vgre(c)
+        sbe v va zretr(vac, gbgny, ovgf, gnoyr):
+            nffreg(v == cv.arkg())
+            nffreg(c.rkvfgf(v))
+
+    cevag bhgsvyranzr
+
+bcgfcrp = """
+ohc zvqk [bcgvbaf...] <vqkanzrf...>
+--
+b,bhgchg=  bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
+n,nhgb     nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
+s,sbepr    nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen naq (bcg.nhgb be bcg.sbepr):
+    b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
+
+tvg.purpx_ercb_be_qvr()
+
+vs rkgen:
+    qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
+ryvs bcg.nhgb be bcg.sbepr:
+    cnguf = [tvg.ercb('bowrpgf/cnpx')]
+    cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
+    sbe cngu va cnguf:
+        ybt('zvqk: fpnaavat %f\a' % cngu)
+        vs bcg.sbepr:
+            qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
+        ryvs bcg.nhgb:
+            z = tvg.CnpxVqkYvfg(cngu)
+            arrqrq = {}
+            sbe cnpx va z.cnpxf:  # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
+                vs cnpx.anzr.raqfjvgu('.vqk'):
+                    arrqrq[cnpx.anzr] = 1
+            qry z
+            qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
+        ybt('\a')
+ryfr:
+    b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, enaqbz
+sebz ohc vzcbeg bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs enaqoybpx(a):
+    y = []
+    sbe v va kenatr(a):
+        y.nccraq(pue(enaqbz.enaqenatr(0,256)))
+    erghea ''.wbva(y)
+
+
+bcgfcrp = """
+ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
+--
+   JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
+a,ahz=   ahzore bs oybpxf gb qnzntr
+f,fvmr=  znkvzhz fvmr bs rnpu qnzntrq oybpx
+creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
+rdhny    fcernq qnzntr rirayl guebhtubhg gur svyr
+F,frrq=  enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
+"""
+b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg rkgen:
+    b.sngny('svyranzrf rkcrpgrq')
+
+vs bcg.frrq != Abar:
+    enaqbz.frrq(bcg.frrq)
+
+sbe anzr va rkgen:
+    ybt('Qnzntvat "%f"...\a' % anzr)
+    s = bcra(anzr, 'e+o')
+    fg = bf.sfgng(s.svyrab())
+    fvmr = fg.fg_fvmr
+    vs bcg.creprag be bcg.fvmr:
+        zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
+        zf2 = bcg.fvmr be fvmr
+        znkfvmr = zva(zf1, zf2)
+    ryfr:
+        znkfvmr = 1
+    puhaxf = bcg.ahz be 10
+    puhaxfvmr = fvmr/puhaxf
+    sbe e va enatr(puhaxf):
+        fm = enaqbz.enaqenatr(1, znkfvmr+1)
+        vs fm > fvmr:
+            fm = fvmr
+        vs bcg.rdhny:
+            bsf = e*puhaxfvmr
+        ryfr:
+            bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
+        ybt('  %6q olgrf ng %q\a' % (fm, bsf))
+        s.frrx(bsf)
+        s.jevgr(enaqoybpx(fm))
+    s.pybfr()
+#!/hfe/ova/rai clguba
+vzcbeg flf, fgehpg, zznc
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+fhfcraqrq_j = Abar
+
+
+qrs vavg_qve(pbaa, net):
+    tvg.vavg_ercb(net)
+    ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
+    pbaa.bx()
+
+
+qrs frg_qve(pbaa, net):
+    tvg.purpx_ercb_be_qvr(net)
+    ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
+    pbaa.bx()
+
+    
+qrs yvfg_vaqrkrf(pbaa, whax):
+    tvg.purpx_ercb_be_qvr()
+    sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
+        vs s.raqfjvgu('.vqk'):
+            pbaa.jevgr('%f\a' % s)
+    pbaa.bx()
+
+
+qrs fraq_vaqrk(pbaa, anzr):
+    tvg.purpx_ercb_be_qvr()
+    nffreg(anzr.svaq('/') < 0)
+    nffreg(anzr.raqfjvgu('.vqk'))
+    vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
+    pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
+    pbaa.jevgr(vqk.znc)
+    pbaa.bx()
+
+
+qrs erprvir_bowrpgf(pbaa, whax):
+    tybony fhfcraqrq_j
+    tvg.purpx_ercb_be_qvr()
+    fhttrfgrq = {}
+    vs fhfcraqrq_j:
+        j = fhfcraqrq_j
+        fhfcraqrq_j = Abar
+    ryfr:
+        j = tvg.CnpxJevgre()
+    juvyr 1:
+        af = pbaa.ernq(4)
+        vs abg af:
+            j.nobeg()
+            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
+        a = fgehpg.hacnpx('!V', af)[0]
+        #ybt('rkcrpgvat %q olgrf\a' % a)
+        vs abg a:
+            ybt('ohc freire: erprvirq %q bowrpg%f.\a' 
+                % (j.pbhag, j.pbhag!=1 naq "f" be ''))
+            shyycngu = j.pybfr()
+            vs shyycngu:
+                (qve, anzr) = bf.cngu.fcyvg(shyycngu)
+                pbaa.jevgr('%f.vqk\a' % anzr)
+            pbaa.bx()
+            erghea
+        ryvs a == 0kssssssss:
+            ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
+            fhfcraqrq_j = j
+            pbaa.bx()
+            erghea
+            
+        ohs = pbaa.ernq(a)  # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
+        #ybt('ernq %q olgrf\a' % a)
+        vs yra(ohs) < a:
+            j.nobeg()
+            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
+                            % (a, yra(ohs)))
+        (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
+        fun = tvg.pnyp_unfu(glcr, pbagrag)
+        byqcnpx = j.rkvfgf(fun)
+        # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
+        # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
+        # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
+        # ba gur freire fvqr.
+        vs abg fhttrfgrq naq \
+          byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
+            # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
+            # ng guvf ynlre.  Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
+            # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
+            # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
+            # znxr gur svyrf ovttre.  Guvf zrgubq vf pregnvayl abg irel
+            # rssvpvrag.
+            j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
+            byqcnpx = j.bowpnpur.rkvfgf(fun)
+            ybt('arj fhttrfgvba: %e\a' % byqcnpx)
+            nffreg(byqcnpx)
+            nffreg(byqcnpx != Gehr)
+            nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
+            j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
+        vs abg fhttrfgrq naq byqcnpx:
+            nffreg(byqcnpx.raqfjvgu('.vqk'))
+            (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
+            vs abg (anzr va fhttrfgrq):
+                ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
+                pbaa.jevgr('vaqrk %f\a' % anzr)
+                fhttrfgrq[anzr] = 1
+        ryfr:
+            j._enj_jevgr([ohs])
+    # ABGERNPURQ
+
+
+qrs ernq_ers(pbaa, ersanzr):
+    tvg.purpx_ercb_be_qvr()
+    e = tvg.ernq_ers(ersanzr)
+    pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
+    pbaa.bx()
+
+
+qrs hcqngr_ers(pbaa, ersanzr):
+    tvg.purpx_ercb_be_qvr()
+    arjiny = pbaa.ernqyvar().fgevc()
+    byqiny = pbaa.ernqyvar().fgevc()
+    tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
+    pbaa.bx()
+
+
+qrs png(pbaa, vq):
+    tvg.purpx_ercb_be_qvr()
+    gel:
+        sbe oybo va tvg.png(vq):
+            pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
+            pbaa.jevgr(oybo)
+    rkprcg XrlReebe, r:
+        ybt('freire: reebe: %f\a' % r)
+        pbaa.jevgr('\0\0\0\0')
+        pbaa.reebe(r)
+    ryfr:
+        pbaa.jevgr('\0\0\0\0')
+        pbaa.bx()
+
+
+bcgfcrp = """
+ohc freire
+"""
+b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+ybt('ohc freire: ernqvat sebz fgqva.\a')
+
+pbzznaqf = {
+    'vavg-qve': vavg_qve,
+    'frg-qve': frg_qve,
+    'yvfg-vaqrkrf': yvfg_vaqrkrf,
+    'fraq-vaqrk': fraq_vaqrk,
+    'erprvir-bowrpgf': erprvir_bowrpgf,
+    'ernq-ers': ernq_ers,
+    'hcqngr-ers': hcqngr_ers,
+    'png': png,
+}
+
+# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
+# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
+pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
+ye = yvarernqre(pbaa)
+sbe _yvar va ye:
+    yvar = _yvar.fgevc()
+    vs abg yvar:
+        pbagvahr
+    ybt('ohc freire: pbzznaq: %e\a' % yvar)
+    jbeqf = yvar.fcyvg(' ', 1)
+    pzq = jbeqf[0]
+    erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
+    vs pzq == 'dhvg':
+        oernx
+    ryfr:
+        pzq = pbzznaqf.trg(pzq)
+        vs pzq:
+            pzq(pbaa, erfg)
+        ryfr:
+            envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
+
+ybt('ohc freire: qbar\a')
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+    rkgen = yvarernqre(flf.fgqva)
+
+erg = 0
+
+vs bcg.erzbgr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    png = pyv.png
+ryfr:
+    pc = tvg.PngCvcr()
+    png = pc.wbva
+
+sbe vq va rkgen:
+    gel:
+        sbe oybo va png(vq):
+            flf.fgqbhg.jevgr(oybo)
+    rkprcg XrlReebe, r:
+        flf.fgqbhg.syhfu()
+        ybt('reebe: %f\a' % r)
+        erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, reeab, fgng, gvzr, zngu
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc fnir [-gp] [-a anzr] <svyranzrf...>
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+g,gerr     bhgchg n gerr vq
+p,pbzzvg   bhgchg n pbzzvg vq
+a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+d,dhvrg    qba'g fubj cebterff zrgre
+fznyyre=   bayl onpx hc svyrf fznyyre guna a olgrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
+    b.sngny("hfr bar be zber bs -g, -p, -a")
+vs abg rkgen:
+    b.sngny("ab svyranzrf tvira")
+
+bcg.cebterff = (vfggl naq abg bcg.dhvrg)
+bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.erzbgr be vf_erirefr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+    j = pyv.arj_cnpxjevgre()
+ryfr:
+    pyv = Abar
+    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+    j = tvg.CnpxJevgre()
+
+unaqyr_pgey_p()
+
+
+qrs rngfynfu(qve):
+    vs qve.raqfjvgu('/'):
+        erghea qve[:-1]
+    ryfr:
+        erghea qve
+
+
+cnegf = ['']
+funyvfgf = [[]]
+
+qrs _chfu(cneg):
+    nffreg(cneg)
+    cnegf.nccraq(cneg)
+    funyvfgf.nccraq([])
+
+qrs _cbc(sbepr_gerr):
+    nffreg(yra(cnegf) >= 1)
+    cneg = cnegf.cbc()
+    funyvfg = funyvfgf.cbc()
+    gerr = sbepr_gerr be j.arj_gerr(funyvfg)
+    vs funyvfgf:
+        funyvfgf[-1].nccraq(('40000', cneg, gerr))
+    ryfr:  # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
+        funyvfgf.nccraq(funyvfg)
+    erghea gerr
+
+ynfgerznva = Abar
+qrs cebterff_ercbeg(a):
+    tybony pbhag, fhopbhag, ynfgerznva
+    fhopbhag += a
+    pp = pbhag + fhopbhag
+    cpg = gbgny naq (pp*100.0/gbgny) be 0
+    abj = gvzr.gvzr()
+    ryncfrq = abj - gfgneg
+    xcf = ryncfrq naq vag(pp/1024./ryncfrq)
+    xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
+    xcf = vag(xcf/xcf_senp)*xcf_senp
+    vs pp:
+        erznva = ryncfrq*1.0/pp * (gbgny-pp)
+    ryfr:
+        erznva = 0.0
+    vs (ynfgerznva naq (erznva > ynfgerznva)
+          naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
+        erznva = ynfgerznva
+    ryfr:
+        ynfgerznva = erznva
+    ubhef = vag(erznva/60/60)
+    zvaf = vag(erznva/60 - ubhef*60)
+    frpf = vag(erznva - ubhef*60*60 - zvaf*60)
+    vs ryncfrq < 30:
+        erznvafge = ''
+        xcffge = ''
+    ryfr:
+        xcffge = '%qx/f' % xcf
+        vs ubhef:
+            erznvafge = '%qu%qz' % (ubhef, zvaf)
+        ryvs zvaf:
+            erznvafge = '%qz%q' % (zvaf, frpf)
+        ryfr:
+            erznvafge = '%qf' % frpf
+    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
+             % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
+                erznvafge, xcffge))
+
+
+e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
+
+qrs nyernql_fnirq(rag):
+    erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
+
+qrs jnagerphefr_cer(rag):
+    erghea abg nyernql_fnirq(rag)
+
+qrs jnagerphefr_qhevat(rag):
+    erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
+
+gbgny = sgbgny = 0
+vs bcg.cebterff:
+    sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
+        vs abg (sgbgny % 10024):
+            cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
+        rkvfgf = rag.rkvfgf()
+        unfuinyvq = nyernql_fnirq(rag)
+        rag.frg_fun_zvffvat(abg unfuinyvq)
+        vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
+            vs rkvfgf naq abg unfuinyvq:
+                gbgny += rag.fvmr
+        sgbgny += 1
+    cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
+    unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
+
+gfgneg = gvzr.gvzr()
+pbhag = fhopbhag = spbhag = 0
+ynfgfxvc_anzr = Abar
+ynfgqve = ''
+sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
+    (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
+    rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
+    unfuinyvq = nyernql_fnirq(rag)
+    jnfzvffvat = rag.fun_zvffvat()
+    byqfvmr = rag.fvmr
+    vs bcg.ireobfr:
+        vs abg rkvfgf:
+            fgnghf = 'Q'
+        ryvs abg unfuinyvq:
+            vs rag.fun == vaqrk.RZCGL_FUN:
+                fgnghf = 'N'
+            ryfr:
+                fgnghf = 'Z'
+        ryfr:
+            fgnghf = ' '
+        vs bcg.ireobfr >= 2:
+            ybt('%f %-70f\a' % (fgnghf, rag.anzr))
+        ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
+            vs abg ynfgqve.fgnegfjvgu(qve):
+                ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
+            ynfgqve = qve
+
+    vs bcg.cebterff:
+        cebterff_ercbeg(0)
+    spbhag += 1
+    
+    vs abg rkvfgf:
+        pbagvahr
+    vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
+        vs rkvfgf naq abg unfuinyvq:
+            nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
+            ynfgfxvc_anzr = rag.anzr
+        pbagvahr
+
+    nffreg(qve.fgnegfjvgu('/'))
+    qvec = qve.fcyvg('/')
+    juvyr cnegf > qvec:
+        _cbc(sbepr_gerr = Abar)
+    vs qve != '/':
+        sbe cneg va qvec[yra(cnegf):]:
+            _chfu(cneg)
+
+    vs abg svyr:
+        # ab svyranzr cbegvba zrnaf guvf vf n fhoqve.  Ohg
+        # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
+        byqgerr = nyernql_fnirq(rag) # znl or Abar
+        arjgerr = _cbc(sbepr_gerr = byqgerr)
+        vs abg byqgerr:
+            vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
+                rag.vainyvqngr()
+            ryfr:
+                rag.inyvqngr(040000, arjgerr)
+            rag.ercnpx()
+        vs rkvfgf naq jnfzvffvat:
+            pbhag += byqfvmr
+        pbagvahr
+
+    # vg'f abg n qverpgbel
+    vq = Abar
+    vs unfuinyvq:
+        zbqr = '%b' % rag.tvgzbqr
+        vq = rag.fun
+        funyvfgf[-1].nccraq((zbqr, 
+                             tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+                             vq))
+    ryfr:
+        vs fgng.F_VFERT(rag.zbqr):
+            gel:
+                s = unfufcyvg.bcra_abngvzr(rag.anzr)
+            rkprcg VBReebe, r:
+                nqq_reebe(r)
+                ynfgfxvc_anzr = rag.anzr
+            rkprcg BFReebe, r:
+                nqq_reebe(r)
+                ynfgfxvc_anzr = rag.anzr
+            ryfr:
+                (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
+        ryfr:
+            vs fgng.F_VFQVE(rag.zbqr):
+                nffreg(0)  # unaqyrq nobir
+            ryvs fgng.F_VFYAX(rag.zbqr):
+                gel:
+                    ey = bf.ernqyvax(rag.anzr)
+                rkprcg BFReebe, r:
+                    nqq_reebe(r)
+                    ynfgfxvc_anzr = rag.anzr
+                rkprcg VBReebe, r:
+                    nqq_reebe(r)
+                    ynfgfxvc_anzr = rag.anzr
+                ryfr:
+                    (zbqr, vq) = ('120000', j.arj_oybo(ey))
+            ryfr:
+                nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
+                ynfgfxvc_anzr = rag.anzr
+        vs vq:
+            rag.inyvqngr(vag(zbqr, 8), vq)
+            rag.ercnpx()
+            funyvfgf[-1].nccraq((zbqr,
+                                 tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+                                 vq))
+    vs rkvfgf naq jnfzvffvat:
+        pbhag += byqfvmr
+        fhopbhag = 0
+
+
+vs bcg.cebterff:
+    cpg = gbgny naq pbhag*100.0/gbgny be 100
+    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar.    \a'
+             % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
+
+juvyr yra(cnegf) > 1:
+    _cbc(sbepr_gerr = Abar)
+nffreg(yra(funyvfgf) == 1)
+gerr = j.arj_gerr(funyvfgf[-1])
+vs bcg.gerr:
+    cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+    zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+    vs bcg.pbzzvg:
+        cevag pbzzvg.rapbqr('urk')
+
+j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
+        
+vs bcg.anzr:
+    vs pyv:
+        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+    ryfr:
+        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+    pyv.pybfr()
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc gvpx
+"""
+b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+g = gvzr.gvzr()
+gyrsg = 1 - (g - vag(g))
+gvzr.fyrrc(gyrsg)
+#!/hfe/ova/rai clguba
+vzcbeg bf, flf, fgng, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
+sebz ohc.urycref vzcbeg *
+
+
+qrs zretr_vaqrkrf(bhg, e1, e2):
+    sbe r va vaqrk.ZretrVgre([e1, e2]):
+        # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl?  Jura?
+        bhg.nqq_vkragel(r)
+
+
+pynff VgreUrycre:
+    qrs __vavg__(frys, y):
+        frys.v = vgre(y)
+        frys.phe = Abar
+        frys.arkg()
+
+    qrs arkg(frys):
+        gel:
+            frys.phe = frys.v.arkg()
+        rkprcg FgbcVgrengvba:
+            frys.phe = Abar
+        erghea frys.phe
+
+
+qrs purpx_vaqrk(ernqre):
+    gel:
+        ybt('purpx: purpxvat sbejneq vgrengvba...\a')
+        r = Abar
+        q = {}
+        sbe r va ernqre.sbejneq_vgre():
+            vs r.puvyqera_a:
+                vs bcg.ireobfr:
+                    ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
+                                            r.anzr))
+                nffreg(r.puvyqera_bsf)
+                nffreg(r.anzr.raqfjvgu('/'))
+                nffreg(abg q.trg(r.puvyqera_bsf))
+                q[r.puvyqera_bsf] = 1
+            vs r.syntf & vaqrk.VK_UNFUINYVQ:
+                nffreg(r.fun != vaqrk.RZCGL_FUN)
+                nffreg(r.tvgzbqr)
+        nffreg(abg r be r.anzr == '/')  # ynfg ragel vf *nyjnlf* /
+        ybt('purpx: purpxvat abezny vgrengvba...\a')
+        ynfg = Abar
+        sbe r va ernqre:
+            vs ynfg:
+                nffreg(ynfg > r.anzr)
+            ynfg = r.anzr
+    rkprcg:
+        ybt('vaqrk reebe! ng %e\a' % r)
+        envfr
+    ybt('purpx: cnffrq.\a')
+
+
+qrs hcqngr_vaqrk(gbc):
+    ev = vaqrk.Ernqre(vaqrksvyr)
+    jv = vaqrk.Jevgre(vaqrksvyr)
+    evt = VgreUrycre(ev.vgre(anzr=gbc))
+    gfgneg = vag(gvzr.gvzr())
+
+    unfutra = Abar
+    vs bcg.snxr_inyvq:
+        qrs unfutra(anzr):
+            erghea (0100644, vaqrk.SNXR_FUN)
+
+    gbgny = 0
+    sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
+        vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
+            flf.fgqbhg.jevgr('%f\a' % cngu)
+            flf.fgqbhg.syhfu()
+            cebterff('Vaqrkvat: %q\e' % gbgny)
+        ryvs abg (gbgny % 128):
+            cebterff('Vaqrkvat: %q\e' % gbgny)
+        gbgny += 1
+        juvyr evt.phe naq evt.phe.anzr > cngu:  # qryrgrq cnguf
+            vs evt.phe.rkvfgf():
+                evt.phe.frg_qryrgrq()
+                evt.phe.ercnpx()
+            evt.arkg()
+        vs evt.phe naq evt.phe.anzr == cngu:    # cnguf gung nyernql rkvfgrq
+            vs cfg:
+                evt.phe.sebz_fgng(cfg, gfgneg)
+            vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
+                vs unfutra:
+                    (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
+                    evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
+            vs bcg.snxr_vainyvq:
+                evt.phe.vainyvqngr()
+            evt.phe.ercnpx()
+            evt.arkg()
+        ryfr:  # arj cnguf
+            jv.nqq(cngu, cfg, unfutra = unfutra)
+    cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
+    
+    vs ev.rkvfgf():
+        ev.fnir()
+        jv.syhfu()
+        vs jv.pbhag:
+            je = jv.arj_ernqre()
+            vs bcg.purpx:
+                ybt('purpx: orsber zretvat: byqsvyr\a')
+                purpx_vaqrk(ev)
+                ybt('purpx: orsber zretvat: arjsvyr\a')
+                purpx_vaqrk(je)
+            zv = vaqrk.Jevgre(vaqrksvyr)
+            zretr_vaqrkrf(zv, ev, je)
+            ev.pybfr()
+            zv.pybfr()
+            je.pybfr()
+        jv.nobeg()
+    ryfr:
+        jv.pybfr()
+
+
+bcgfcrp = """
+ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
+--
+c,cevag    cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
+z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
+f,fgnghf   cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
+U,unfu     cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
+y,ybat     cevag zber vasbezngvba nobhg rnpu svyr
+h,hcqngr   (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
+k,kqri,bar-svyr-flfgrz  qba'g pebff svyrflfgrz obhaqnevrf
+snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
+snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
+purpx      pnershyyl purpx vaqrk svyr vagrtevgl
+s,vaqrksvyr=  gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+"""
+b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
+    b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
+vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
+    b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
+vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
+    b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
+
+tvg.purpx_ercb_be_qvr()
+vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
+
+unaqyr_pgey_p()
+
+vs bcg.purpx:
+    ybt('purpx: fgnegvat vavgvny purpx.\a')
+    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+cnguf = vaqrk.erqhpr_cnguf(rkgen)
+
+vs bcg.hcqngr:
+    vs abg cnguf:
+        b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
+    sbe (ec,cngu) va cnguf:
+        hcqngr_vaqrk(ec)
+
+vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
+    sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
+        vs (bcg.zbqvsvrq 
+            naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
+            pbagvahr
+        yvar = ''
+        vs bcg.fgnghf:
+            vs rag.vf_qryrgrq():
+                yvar += 'Q '
+            ryvs abg rag.vf_inyvq():
+                vs rag.fun == vaqrk.RZCGL_FUN:
+                    yvar += 'N '
+                ryfr:
+                    yvar += 'Z '
+            ryfr:
+                yvar += '  '
+        vs bcg.unfu:
+            yvar += rag.fun.rapbqr('urk') + ' '
+        vs bcg.ybat:
+            yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
+        cevag yvar + (anzr be './')
+
+vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
+    ybt('purpx: fgnegvat svany purpx.\a')
+    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg
+sebz ohc vzcbeg bcgvbaf, urycref
+
+bcgfcrp = """
+ohc eonpxhc-freire
+--
+    Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+# trg gur fhopbzznaq'f neti.
+# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
+# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
+# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
+ohs = flf.fgqva.ernq(4)
+fm = fgehpg.hacnpx('!V', ohs)[0]
+nffreg(fm > 0)
+nffreg(fm < 1000000)
+ohs = flf.fgqva.ernq(fm)
+nffreg(yra(ohs) == fm)
+neti = ohs.fcyvg('\0')
+
+# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
+# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
+# gb zvfhfr gurz.  Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
+# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
+#
+# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
+# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
+# fbpxrg.  Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
+# bs vg, ohg cebonoyl qvqa'g.  Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
+# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
+#
+# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
+# qrfpevcgbef.  Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
+# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
+bf.qhc2(0, 3)
+bf.qhc2(1, 4)
+bf.qhc2(2, 1)
+va nccebkvzngryl gur fnzr cynprEQBAYL)
+naq qvfgevo-0)
+hgvba nf(sq)
+
+va gur bevtvany grfg svyrfREFR'] = urycref.ubfganzr()
+bf.rkrpic(neti[0], neti)
+flf.rkvg(99)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo, fhocebprff, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+cne2_bx = 0
+ahyys = bcra('/qri/ahyy')
+
+qrs qroht(f):
+    vs bcg.ireobfr:
+        ybt(f)
+
+qrs eha(neti):
+    # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
+    # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
+    # rkrpvat sbe fbzr ernfba.  Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
+    # svefg.
+    sq = bf.qhc(2)  # pbcl fgqree
+    gel:
+        c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
+        erghea c.jnvg()
+    svanyyl:
+        bf.pybfr(sq)
+
+qrs cne2_frghc():
+    tybony cne2_bx
+    ei = 1
+    gel:
+        c = fhocebprff.Cbcra(['cne2', '--uryc'],
+                             fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
+        ei = c.jnvg()
+    rkprcg BFReebe:
+        ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
+    ryfr:
+        cne2_bx = 1
+
+qrs cnei(yiy):
+    vs bcg.ireobfr >= yiy:
+        vs vfggl:
+            erghea []
+        ryfr:
+            erghea ['-d']
+    ryfr:
+        erghea ['-dd']
+
+qrs cne2_trarengr(onfr):
+    erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
+               + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
+
+qrs cne2_irevsl(onfr):
+    erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
+
+qrs cne2_ercnve(onfr):
+    erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
+
+qrs dhvpx_irevsl(onfr):
+    s = bcra(onfr + '.cnpx', 'eo')
+    s.frrx(-20, 2)
+    jnagfhz = s.ernq(20)
+    nffreg(yra(jnagfhz) == 20)
+    s.frrx(0)
+    fhz = Fun1()
+    sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
+        fhz.hcqngr(o)
+    vs fhz.qvtrfg() != jnagfhz:
+        envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
+                                                  fhz.urkqvtrfg()))
+        
+
+qrs tvg_irevsl(onfr):
+    vs bcg.dhvpx:
+        gel:
+            dhvpx_irevsl(onfr)
+        rkprcg Rkprcgvba, r:
+            qroht('reebe: %f\a' % r)
+            erghea 1
+        erghea 0
+    ryfr:
+        erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
+    
+    
+qrs qb_cnpx(onfr, ynfg):
+    pbqr = 0
+    vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
+        ierfhyg = cne2_irevsl(onfr)
+        vs ierfhyg != 0:
+            vs bcg.ercnve:
+                eerfhyg = cne2_ercnve(onfr)
+                vs eerfhyg != 0:
+                    cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
+                    pbqr = eerfhyg
+                ryfr:
+                    cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
+                    pbqr = 100
+            ryfr:
+                cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
+                pbqr = ierfhyg
+        ryfr:
+            cevag '%f bx' % ynfg
+    ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
+        terfhyg = tvg_irevsl(onfr)
+        vs terfhyg != 0:
+            cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
+            pbqr = terfhyg
+        ryfr:
+            vs cne2_bx naq bcg.trarengr:
+                cerfhyg = cne2_trarengr(onfr)
+                vs cerfhyg != 0:
+                    cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
+                    pbqr = cerfhyg
+                ryfr:
+                    cevag '%f bx' % ynfg
+            ryfr:
+                cevag '%f bx' % ynfg
+    ryfr:
+        nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
+        qroht('    fxvccrq: cne2 svyr nyernql trarengrq.\a')
+    erghea pbqr
+
+
+bcgfcrp = """
+ohc sfpx [bcgvbaf...] [svyranzrf...]
+--
+e,ercnve    nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
+t,trarengr  trarengr nhgb-ercnve vasbezngvba hfvat cne2
+i,ireobfr   vapernfr ireobfvgl (pna or hfrq zber guna bapr)
+dhvpx       whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
+w,wbof=     eha 'a' wbof va cnenyyry
+cne2-bx     vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
+qvfnoyr-cne2  vtaber cne2 rira vs vg vf ninvynoyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+cne2_frghc()
+vs bcg.cne2_bx:
+    vs cne2_bx:
+        flf.rkvg(0)  # 'gehr' va fu
+    ryfr:
+        flf.rkvg(1)
+vs bcg.qvfnoyr_cne2:
+    cne2_bx = 0
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+    qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
+    rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
+
+pbqr = 0
+pbhag = 0
+bhgfgnaqvat = {}
+sbe anzr va rkgen:
+    vs anzr.raqfjvgu('.cnpx'):
+        onfr = anzr[:-5]
+    ryvs anzr.raqfjvgu('.vqk'):
+        onfr = anzr[:-4]
+    ryvs anzr.raqfjvgu('.cne2'):
+        onfr = anzr[:-5]
+    ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
+        onfr = anzr
+    ryfr:
+        envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
+    (qve,ynfg) = bf.cngu.fcyvg(onfr)
+    cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
+    vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
+        cne2_rkvfgf = 0
+    flf.fgqbhg.syhfu()
+    qroht('sfpx: purpxvat %f (%f)\a' 
+          % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
+    vs abg bcg.ireobfr:
+        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+    
+    vs abg bcg.wbof:
+        ap = qb_cnpx(onfr, ynfg)
+        pbqr = pbqr be ap
+        pbhag += 1
+    ryfr:
+        juvyr yra(bhgfgnaqvat) >= bcg.wbof:
+            (cvq,ap) = bf.jnvg()
+            ap >>= 8
+            vs cvq va bhgfgnaqvat:
+                qry bhgfgnaqvat[cvq]
+                pbqr = pbqr be ap
+                pbhag += 1
+        cvq = bf.sbex()
+        vs cvq:  # cnerag
+            bhgfgnaqvat[cvq] = 1
+        ryfr: # puvyq
+            gel:
+                flf.rkvg(qb_cnpx(onfr, ynfg))
+            rkprcg Rkprcgvba, r:
+                ybt('rkprcgvba: %e\a' % r)
+                flf.rkvg(99)
+                
+juvyr yra(bhgfgnaqvat):
+    (cvq,ap) = bf.jnvg()
+    ap >>= 8
+    vs cvq va bhgfgnaqvat:
+        qry bhgfgnaqvat[cvq]
+        pbqr = pbqr be ap
+        pbhag += 1
+    vs abg bcg.ireobfr:
+        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+vs abg bcg.ireobfr naq vfggl:
+    ybt('sfpx qbar.           \a')
+flf.rkvg(pbqr)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
+sebz ohc vzcbeg bcgvbaf, ffu
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc eonpxhc <ubfganzr> vaqrk ...
+ohc eonpxhc <ubfganzr> fnir ...
+ohc eonpxhc <ubfganzr> fcyvg ...
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs yra(rkgen) < 2:
+    b.sngny('nethzragf rkcrpgrq')
+
+pynff FvtRkprcgvba(Rkprcgvba):
+    qrs __vavg__(frys, fvtahz):
+        frys.fvtahz = fvtahz
+        Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
+qrs unaqyre(fvtahz, senzr):
+    envfr FvtRkprcgvba(fvtahz)
+
+fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
+fvtany.fvtany(fvtany.FVTVAG, unaqyre)
+
+fc = Abar
+c = Abar
+erg = 99
+
+gel:
+    ubfganzr = rkgen[0]
+    neti = rkgen[1:]
+    c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
+
+    netif = '\0'.wbva(['ohc'] + neti)
+    c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
+    c.fgqva.syhfu()
+
+    znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
+    fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
+
+    c.fgqva.pybfr()
+    c.fgqbhg.pybfr()
+
+svanyyl:
+    juvyr 1:
+        # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
+        # va pnfr bhe puvyq qbrfa'g qvr.
+        gel:
+            erg = c.jnvg()
+            fc.jnvg()
+            oernx
+        rkprcg FvtRkprcgvba, r:
+            ybt('\aohc eonpxhc: %f\a' % r)
+            bf.xvyy(c.cvq, r.fvtahz)
+            erg = 84
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc arjyvare
+"""
+b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+e = er.pbzcvyr(e'([\e\a])')
+ynfgyra = 0
+nyy = ''
+juvyr 1:
+    y = e.fcyvg(nyy, 1)
+    vs yra(y) <= 1:
+        gel:
+            o = bf.ernq(flf.fgqva.svyrab(), 4096)
+        rkprcg XrlobneqVagreehcg:
+            oernx
+        vs abg o:
+            oernx
+        nyy += o
+    ryfr:
+        nffreg(yra(y) == 3)
+        (yvar, fcyvgpune, nyy) = y
+        #fcyvgpune = '\a'
+        flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
+        vs fcyvgpune == '\e':
+            ynfgyra = yra(yvar)
+        ryfr:
+            ynfgyra = 0
+        flf.fgqbhg.syhfu()
+
+vs ynfgyra be nyy:
+    flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
+#!/hfe/ova/rai clguba
+vzcbeg flf
+sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc znetva
+"""
+b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+#tvg.vtaber_zvqk = 1
+
+zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+ynfg = '\0'*20
+ybatzngpu = 0
+sbe v va zv:
+    vs v == ynfg:
+        pbagvahr
+    #nffreg(fge(v) >= ynfg)
+    cz = _unfufcyvg.ovgzngpu(ynfg, v)
+    ybatzngpu = znk(ybatzngpu, cz)
+    ynfg = v
+cevag ybatzngpu
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg bcgvbaf, qerphefr
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc qerphefr <cngu>
+--
+k,kqri,bar-svyr-flfgrz   qba'g pebff svyrflfgrz obhaqnevrf
+d,dhvrg  qba'g npghnyyl cevag svyranzrf
+cebsvyr  eha haqre gur clguba cebsvyre
+"""
+b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar svyranzr rkcrpgrq")
+
+vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
+vs bcg.cebsvyr:
+    vzcbeg pCebsvyr
+    qrs qb_vg():
+        sbe v va vg:
+            cnff
+    pCebsvyr.eha('qb_vg()')
+ryfr:
+    vs bcg.dhvrg:
+        sbe v va vg:
+            cnff
+    ryfr:
+        sbe (anzr,fg) va vg:
+            cevag anzr
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+o,oybof    bhgchg n frevrf bs oybo vqf
+g,gerr     bhgchg n gerr vq
+p,pbzzvg   bhgchg n pbzzvg vq
+a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
+A,abbc     qba'g npghnyyl fnir gur qngn naljurer
+d,dhvrg    qba'g cevag cebterff zrffntrf
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+pbcl       whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
+orapu      cevag orapuznex gvzvatf gb fgqree
+znk-cnpx-fvmr=  znkvzhz olgrf va n fvatyr cnpx
+znk-cnpx-bowrpgf=  znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
+snabhg=  znkvzhz ahzore bs oybof va n fvatyr gerr
+"""
+b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
+        bcg.abbc be bcg.pbcl):
+    b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
+vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be 
+                               bcg.pbzzvg be bcg.anzr):
+    b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
+
+vs bcg.ireobfr >= 2:
+    tvg.ireobfr = bcg.ireobfr - 1
+    bcg.orapu = 1
+vs bcg.znk_cnpx_fvmr:
+    unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
+vs bcg.znk_cnpx_bowrpgf:
+    unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
+vs bcg.snabhg:
+    unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
+vs bcg.oybof:
+    unfufcyvg.snabhg = 0
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+fgneg_gvzr = gvzr.gvzr()
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.abbc be bcg.pbcl:
+    pyv = j = byqers = Abar
+ryvs bcg.erzbgr be vf_erirefr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+    j = pyv.arj_cnpxjevgre()
+ryfr:
+    pyv = Abar
+    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+    j = tvg.CnpxJevgre()
+
+svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
+vs j:
+    funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
+    gerr = j.arj_gerr(funyvfg)
+ryfr:
+    ynfg = 0
+    sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
+        unfufcyvg.gbgny_fcyvg += yra(oybo)
+        vs bcg.pbcl:
+            flf.fgqbhg.jevgr(fge(oybo))
+        zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
+        vs abg bcg.dhvrg naq ynfg != zrtf:
+            cebterff('%q Zolgrf ernq\e' % zrtf)
+            ynfg = zrtf
+    cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
+
+vs bcg.ireobfr:
+    ybt('\a')
+vs bcg.oybof:
+    sbe (zbqr,anzr,ova) va funyvfg:
+        cevag ova.rapbqr('urk')
+vs bcg.gerr:
+    cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+    zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+    vs bcg.pbzzvg:
+        cevag pbzzvg.rapbqr('urk')
+
+vs j:
+    j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
+        
+vs bcg.anzr:
+    vs pyv:
+        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+    ryfr:
+        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+    pyv.pybfr()
+
+frpf = gvzr.gvzr() - fgneg_gvzr
+fvmr = unfufcyvg.gbgny_fcyvg
+vs bcg.orapu:
+    ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
+        % (fvmr/1024., frpf, fvmr/1024./frpf))
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, fgehpg, zznc
+sebz ohc vzcbeg tvg, bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs f_sebz_olgrf(olgrf):
+    pyvfg = [pue(o) sbe o va olgrf]
+    erghea ''.wbva(pyvfg)
+
+
+qrs ercbeg(pbhag):
+    svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
+    q = {}
+    sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
+        y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
+        q[y[0]] = y[1]
+    vs pbhag >= 0:
+        r1 = pbhag
+        svryqf = [q[x] sbe x va svryqf]
+    ryfr:
+        r1 = ''
+    cevag ('%9f  ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
+    flf.fgqbhg.syhfu()
+
+
+bcgfcrp = """
+ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
+--
+a,ahzore=  ahzore bs bowrpgf cre plpyr
+p,plpyrf=  ahzore bs plpyrf gb eha
+vtaber-zvqk  vtaber .zvqk svyrf, hfr bayl .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+tvg.vtaber_zvqk = bcg.vtaber_zvqk
+
+tvg.purpx_ercb_be_qvr()
+z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+
+plpyrf = bcg.plpyrf be 100
+ahzore = bcg.ahzore be 10000
+
+ercbeg(-1)
+s = bcra('/qri/henaqbz')
+n = zznc.zznc(-1, 20)
+ercbeg(0)
+sbe p va kenatr(plpyrf):
+    sbe a va kenatr(ahzore):
+        o = s.ernq(3)
+        vs 0:
+            olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
+            olgrf[2] &= 0ks0
+            ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
+        ryfr:
+            n[0:2] = o[0:2]
+            n[2] = pue(beq(o[2]) & 0ks0)
+            ova = fge(n[0:20])
+        #cevag ova.rapbqr('urk')
+        z.rkvfgf(ova)
+    ercbeg((p+1)*ahzore)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+qrs cevag_abqr(grkg, a):
+    cersvk = ''
+    vs bcg.unfu:
+        cersvk += "%f " % a.unfu.rapbqr('urk')
+    vs fgng.F_VFQVE(a.zbqr):
+        cevag '%f%f/' % (cersvk, grkg)
+    ryvs fgng.F_VFYAX(a.zbqr):
+        cevag '%f%f@' % (cersvk, grkg)
+    ryfr:
+        cevag '%f%f' % (cersvk, grkg)
+
+
+bcgfcrp = """
+ohc yf <qvef...>
+--
+f,unfu   fubj unfu sbe rnpu svyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+
+vs abg rkgen:
+    rkgen = ['/']
+
+erg = 0
+sbe q va rkgen:
+    gel:
+        a = gbc.yerfbyir(q)
+        vs fgng.F_VFQVE(a.zbqr):
+            sbe fho va a:
+                cevag_abqr(fho.anzr, fho)
+        ryfr:
+            cevag_abqr(q, a)
+    rkprcg isf.AbqrReebe, r:
+        ybt('reebe: %f\a' % r)
+        erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
+sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
+sebz ohc.urycref vzcbeg *
+
+qrs abqr_anzr(grkg, a):
+    vs fgng.F_VFQVE(a.zbqr):
+        erghea '%f/' % grkg
+    ryvs fgng.F_VFYAX(a.zbqr):
+        erghea '%f@' % grkg
+    ryfr:
+        erghea '%f' % grkg
+
+
+qrs qb_yf(cngu, a):
+    y = []
+    vs fgng.F_VFQVE(a.zbqr):
+        sbe fho va a:
+            y.nccraq(abqr_anzr(fho.anzr, fho))
+    ryfr:
+        y.nccraq(abqr_anzr(cngu, a))
+    cevag pbyhzangr(y, '')
+    
+
+qrs jevgr_gb_svyr(vas, bhgs):
+    sbe oybo va puhaxlernqre(vas):
+        bhgs.jevgr(oybo)
+    
+
+qrs vachgvgre():
+    vs bf.vfnggl(flf.fgqva.svyrab()):
+        juvyr 1:
+            gel:
+                lvryq enj_vachg('ohc> ')
+            rkprcg RBSReebe:
+                oernx
+    ryfr:
+        sbe yvar va flf.fgqva:
+            lvryq yvar
+
+
+qrs _pbzcyrgre_trg_fhof(yvar):
+    (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
+    (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
+    #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
+    a = cjq.erfbyir(qve)
+    fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
+                       a.fhof()))
+    erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
+
+
+_ynfg_yvar = Abar
+_ynfg_erf = Abar
+qrs pbzcyrgre(grkg, fgngr):
+    tybony _ynfg_yvar
+    tybony _ynfg_erf
+    gel:
+        yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
+        vs _ynfg_yvar != yvar:
+            _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
+            _ynfg_yvar = yvar
+        (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
+        vs fgngr < yra(fhof):
+            fa = fhof[fgngr]
+            fa1 = fa.erfbyir('')  # qrers flzyvaxf
+            shyyanzr = bf.cngu.wbva(qve, fa.anzr)
+            vs fgng.F_VFQVE(fa1.zbqr):
+                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
+                                          grezvangr=Snyfr)
+            ryfr:
+                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
+                                          grezvangr=Gehr) + ' '
+            erghea grkg + erg
+    rkprcg Rkprcgvba, r:
+        ybt('\areebe va pbzcyrgvba: %f\a' % r)
+
+            
+bcgfcrp = """
+ohc sgc
+"""
+b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+gbc = isf.ErsYvfg(Abar)
+cjq = gbc
+
+vs rkgen:
+    yvarf = rkgen
+ryfr:
+    ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
+    ernqyvar.frg_pbzcyrgre(pbzcyrgre)
+    ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
+    yvarf = vachgvgre()
+
+sbe yvar va yvarf:
+    vs abg yvar.fgevc():
+        pbagvahr
+    jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
+    pzq = jbeqf[0].ybjre()
+    #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
+    gel:
+        vs pzq == 'yf':
+            sbe cnez va (jbeqf[1:] be ['.']):
+                qb_yf(cnez, cjq.erfbyir(cnez))
+        ryvs pzq == 'pq':
+            sbe cnez va jbeqf[1:]:
+                cjq = cjq.erfbyir(cnez)
+        ryvs pzq == 'cjq':
+            cevag cjq.shyyanzr()
+        ryvs pzq == 'png':
+            sbe cnez va jbeqf[1:]:
+                tvir be gnxr n ovgerfbyir(cnez).bcra(), flf.fgqbhg)
+        ryvs pzq == 'trg':
+            vs yra(jbeqf) abg va [2,3]:
+                envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
+            eanzr = jbeqf[1]
+            (qve,onfr) = bf.cngu.fcyvg(eanzr)
+            yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
+            vas = cjq.erfbyir(eanzr).bcra()
+            ybt('Fnivat %e\a' % yanzr)
+            jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
+        ryvs pzq == 'ztrg':
+            sbe cnez va jbeqf[1:]:
+                (qve,onfr) = bf.cngu.fcyvg(cnez)
+                sbe a va cjq.erfbyir(qve).fhof():
+                    vs sazngpu.sazngpu(a.anzr, onfr):
+                        gel:
+                            ybt('Fnivat %e\a' % a.anzr)
+                            vas = a.bcra()
+                            bhgs = bcra(a.anzr, 'jo')
+                            jevgr_gb_svyr(vas, bhgs)
+                            bhgs.pybfr()
+                        rkprcg Rkprcgvba, r:
+                            ybt('  reebe: %f\a' % r)
+        ryvs pzq == 'uryc' be pzq == '?':
+            ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
+        ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
+            oernx
+        ryfr:
+            envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
+    rkprcg Rkprcgvba, r:
+        ybt('reebe: %f\a' % r)
+        #envfr
+#!/hfe/ova/rai clguba
+vzcbeg flf, zznc
+sebz ohc vzcbeg bcgvbaf, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc enaqbz [-F frrq] <ahzolgrf>
+--
+F,frrq=   bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
+s,sbepr   cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
+"""
+b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+gbgny = cnefr_ahz(rkgen[0])
+
+vs bcg.sbepr be (abg bf.vfnggl(1) naq
+                 abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
+    _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
+ryfr:
+    ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc uryc <pbzznaq>
+"""
+b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) == 0:
+    # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
+    bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
+ryvs yra(rkgen) == 1:
+    qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
+    rkr = flf.neti[0]
+    (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
+    znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
+    t = tybo.tybo(znacngu)
+    vs t:
+        bf.rkrpic('zna', ['zna', '-y', t[0]])
+    ryfr:
+        bf.rkrpic('zna', ['zna', qbpanzr])
+ryfr:
+    b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+
+pynff Fgng(shfr.Fgng):
+    qrs __vavg__(frys):
+        frys.fg_zbqr = 0
+        frys.fg_vab = 0
+        frys.fg_qri = 0
+        frys.fg_ayvax = 0
+        frys.fg_hvq = 0
+        frys.fg_tvq = 0
+        frys.fg_fvmr = 0
+        frys.fg_ngvzr = 0
+        frys.fg_zgvzr = 0
+        frys.fg_pgvzr = 0
+        frys.fg_oybpxf = 0
+        frys.fg_oyxfvmr = 0
+        frys.fg_eqri = 0
+
+
+pnpur = {}
+qrs pnpur_trg(gbc, cngu):
+    cnegf = cngu.fcyvg('/')
+    pnpur[('',)] = gbc
+    p = Abar
+    znk = yra(cnegf)
+    #ybt('pnpur: %e\a' % pnpur.xrlf())
+    sbe v va enatr(znk):
+        cer = cnegf[:znk-v]
+        #ybt('pnpur gelvat: %e\a' % cer)
+        p = pnpur.trg(ghcyr(cer))
+        vs p:
+            erfg = cnegf[znk-v:]
+            sbe e va erfg:
+                #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
+                p = p.yerfbyir(e)
+                xrl = ghcyr(cer + [e])
+                #ybt('fnivat: %e\a' % (xrl,))
+                pnpur[xrl] = p
+            oernx
+    nffreg(p)
+    erghea p
+        
+    
+
+pynff OhcSf(shfr.Shfr):
+    qrs __vavg__(frys, gbc):
+        shfr.Shfr.__vavg__(frys)
+        frys.gbc = gbc
+    
+    qrs trgngge(frys, cngu):
+        ybt('--trgngge(%e)\a' % cngu)
+        gel:
+            abqr = pnpur_trg(frys.gbc, cngu)
+            fg = Fgng()
+            fg.fg_zbqr = abqr.zbqr
+            fg.fg_ayvax = abqr.ayvaxf()
+            fg.fg_fvmr = abqr.fvmr()
+            fg.fg_zgvzr = abqr.zgvzr
+            fg.fg_pgvzr = abqr.pgvzr
+            fg.fg_ngvzr = abqr.ngvzr
+            erghea fg
+        rkprcg isf.AbFhpuSvyr:
+            erghea -reeab.RABRAG
+
+    qrs ernqqve(frys, cngu, bssfrg):
+        ybt('--ernqqve(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        lvryq shfr.Qveragel('.')
+        lvryq shfr.Qveragel('..')
+        sbe fho va abqr.fhof():
+            lvryq shfr.Qveragel(fho.anzr)
+
+    qrs ernqyvax(frys, cngu):
+        ybt('--ernqyvax(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        erghea abqr.ernqyvax()
+
+    qrs bcra(frys, cngu, syntf):
+        ybt('--bcra(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
+        vs (syntf & nppzbqr) != bf.B_EQBAYL:
+            erghea -reeab.RNPPRF
+        abqr.bcra()
+
+    qrs eryrnfr(frys, cngu, syntf):
+        ybt('--eryrnfr(%e)\a' % cngu)
+
+    qrs ernq(frys, cngu, fvmr, bssfrg):
+        ybt('--ernq(%e)\a' % cngu)
+        a = pnpur_trg(frys.gbc, cngu)
+        b = a.bcra()
+        b.frrx(bssfrg)
+        erghea b.ernq(fvmr)
+
+
+vs abg unfngge(shfr, '__irefvba__'):
+    envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
+shfr.shfr_clguba_ncv = (0, 2)
+
+
+bcgfcrp = """
+ohc shfr [-q] [-s] <zbhagcbvag>
+--
+q,qroht   vapernfr qroht yriry
+s,sbertebhaq  eha va sbertebhaq
+"""
+b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+s = OhcSf(gbc)
+s.shfr_netf.zbhagcbvag = rkgen[0]
+vs bcg.qroht:
+    s.shfr_netf.nqq('qroht')
+vs bcg.sbertebhaq:
+    s.shfr_netf.frgzbq('sbertebhaq')
+cevag s.zhygvguernqrq
+s.zhygvguernqrq = Snyfr
+
+s.znva()
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+
+vs bcg.erzbgr:
+    tvg.vavg_ercb()  # ybpny ercb
+    tvg.purpx_ercb_be_qvr()
+    pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
+    pyv.pybfr()
+ryfr:
+    tvg.vavg_ercb()
+#!/hfe/ova/rai clguba
+vzcbeg flf, zngu, fgehpg, tybo
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+CNTR_FVMR=4096
+FUN_CRE_CNTR=CNTR_FVMR/200.
+
+
+qrs zretr(vqkyvfg, ovgf, gnoyr):
+    pbhag = 0
+    sbe r va tvg.vqkzretr(vqkyvfg):
+        pbhag += 1
+        cersvk = tvg.rkgenpg_ovgf(r, ovgf)
+        gnoyr[cersvk] = pbhag
+        lvryq r
+
+
+qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
+    vs abg bhgsvyranzr:
+        nffreg(bhgqve)
+        fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
+        bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
+    
+    vac = []
+    gbgny = 0
+    sbe anzr va vasvyranzrf:
+        vk = tvg.CnpxVqk(anzr)
+        vac.nccraq(vk)
+        gbgny += yra(vk)
+
+    ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
+    vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
+       be (bcg.sbepr naq abg gbgny):
+        ybt('zvqk: abguvat gb qb.\a')
+        erghea
+
+    cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
+    ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
+    ragevrf = 2**ovgf
+    ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
+    
+    gnoyr = [0]*ragevrf
+
+    gel:
+        bf.hayvax(bhgsvyranzr)
+    rkprcg BFReebe:
+        cnff
+    s = bcra(bhgsvyranzr + '.gzc', 'j+')
+    s.jevgr('ZVQK\0\0\0\2')
+    s.jevgr(fgehpg.cnpx('!V', ovgf))
+    nffreg(s.gryy() == 12)
+    s.jevgr('\0'*4*ragevrf)
+    
+    sbe r va zretr(vac, ovgf, gnoyr):
+        s.jevgr(r)
+        
+    s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
+
+    s.frrx(12)
+    s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
+    s.pybfr()
+    bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
+
+    # guvf vf whfg sbe grfgvat
+    vs 0:
+        c = tvg.CnpxZvqk(bhgsvyranzr)
+        nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
+        cevag c.vqkanzrf
+        nffreg(yra(c) == gbgny)
+        cv = vgre(c)
+        sbe v va zretr(vac, gbgny, ovgf, gnoyr):
+            nffreg(v == cv.arkg())
+            nffreg(c.rkvfgf(v))
+
+    cevag bhgsvyranzr
+
+bcgfcrp = """
+ohc zvqk [bcgvbaf...] <vqkanzrf...>
+--
+b,bhgchg=  bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
+n,nhgb     nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
+s,sbepr    nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen naq (bcg.nhgb be bcg.sbepr):
+    b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
+
+tvg.purpx_ercb_be_qvr()
+
+vs rkgen:
+    qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
+ryvs bcg.nhgb be bcg.sbepr:
+    cnguf = [tvg.ercb('bowrpgf/cnpx')]
+    cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
+    sbe cngu va cnguf:
+        ybt('zvqk: fpnaavat %f\a' % cngu)
+        vs bcg.sbepr:
+            qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
+        ryvs bcg.nhgb:
+            z = tvg.CnpxVqkYvfg(cngu)
+            arrqrq = {}
+            sbe cnpx va z.cnpxf:  # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
+                vs cnpx.anzr.raqfjvgu('.vqk'):
+                    arrqrq[cnpx.anzr] = 1
+            qry z
+            qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
+        ybt('\a')
+ryfr:
+    b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, enaqbz
+sebz ohc vzcbeg bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs enaqoybpx(a):
+    y = []
+    sbe v va kenatr(a):
+        y.nccraq(pue(enaqbz.enaqenatr(0,256)))
+    erghea ''.wbva(y)
+
+
+bcgfcrp = """
+ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
+--
+   JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
+a,ahz=   ahzore bs oybpxf gb qnzntr
+f,fvmr=  znkvzhz fvmr bs rnpu qnzntrq oybpx
+creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
+rdhny    fcernq qnzntr rirayl guebhtubhg gur svyr
+F,frrq=  enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
+"""
+b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg rkgen:
+    b.sngny('svyranzrf rkcrpgrq')
+
+vs bcg.frrq != Abar:
+    enaqbz.frrq(bcg.frrq)
+
+sbe anzr va rkgen:
+    ybt('Qnzntvat "%f"...\a' % anzr)
+    s = bcra(anzr, 'e+o')
+    fg = bf.sfgng(s.svyrab())
+    fvmr = fg.fg_fvmr
+    vs bcg.creprag be bcg.fvmr:
+        zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
+        zf2 = bcg.fvmr be fvmr
+        znkfvmr = zva(zf1, zf2)
+    ryfr:
+        znkfvmr = 1
+    puhaxf = bcg.ahz be 10
+    puhaxfvmr = fvmr/puhaxf
+    sbe e va enatr(puhaxf):
+        fm = enaqbz.enaqenatr(1, znkfvmr+1)
+        vs fm > fvmr:
+            fm = fvmr
+        vs bcg.rdhny:
+            bsf = e*puhaxfvmr
+        ryfr:
+            bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
+        ybt('  %6q olgrf ng %q\a' % (fm, bsf))
+        s.frrx(bsf)
+        s.jevgr(enaqoybpx(fm))
+    s.pybfr()
+#!/hfe/ova/rai clguba
+vzcbeg flf, fgehpg, zznc
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+fhfcraqrq_j = Abar
+
+
+qrs vavg_qve(pbaa, net):
+    tvg.vavg_ercb(net)
+    ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
+    pbaa.bx()
+
+
+qrs frg_qve(pbaa, net):
+    tvg.purpx_ercb_be_qvr(net)
+    ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
+    pbaa.bx()
+
+    
+qrs yvfg_vaqrkrf(pbaa, whax):
+    tvg.purpx_ercb_be_qvr()
+    sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
+        vs s.raqfjvgu('.vqk'):
+            pbaa.jevgr('%f\a' % s)
+    pbaa.bx()
+
+
+qrs fraq_vaqrk(pbaa, anzr):
+    tvg.purpx_ercb_be_qvr()
+    nffreg(anzr.svaq('/') < 0)
+    nffreg(anzr.raqfjvgu('.vqk'))
+    vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
+    pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
+    pbaa.jevgr(vqk.znc)
+    pbaa.bx()
+
+
+qrs erprvir_bowrpgf(pbaa, whax):
+    tybony fhfcraqrq_j
+    tvg.purpx_ercb_be_qvr()
+    fhttrfgrq = {}
+    vs fhfcraqrq_j:
+        j = fhfcraqrq_j
+        fhfcraqrq_j = Abar
+    ryfr:
+        j = tvg.CnpxJevgre()
+    juvyr 1:
+        af = pbaa.ernq(4)
+        vs abg af:
+            j.nobeg()
+            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
+        a = fgehpg.hacnpx('!V', af)[0]
+        #ybt('rkcrpgvat %q olgrf\a' % a)
+        vs abg a:
+            ybt('ohc freire: erprvirq %q bowrpg%f.\a' 
+                % (j.pbhag, j.pbhag!=1 naq "f" be ''))
+            shyycngu = j.pybfr()
+            vs shyycngu:
+                (qve, anzr) = bf.cngu.fcyvg(shyycngu)
+                pbaa.jevgr('%f.vqk\a' % anzr)
+            pbaa.bx()
+            erghea
+        ryvs a == 0kssssssss:
+            ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
+            fhfcraqrq_j = j
+            pbaa.bx()
+            erghea
+            
+        ohs = pbaa.ernq(a)  # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
+        #ybt('ernq %q olgrf\a' % a)
+        vs yra(ohs) < a:
+            j.nobeg()
+            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
+                            % (a, yra(ohs)))
+        (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
+        fun = tvg.pnyp_unfu(glcr, pbagrag)
+        byqcnpx = j.rkvfgf(fun)
+        # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
+        # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
+        # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
+        # ba gur freire fvqr.
+        vs abg fhttrfgrq naq \
+          byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
+            # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
+            # ng guvf ynlre.  Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
+            # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
+            # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
+            # znxr gur svyrf ovttre.  Guvf zrgubq vf pregnvayl abg irel
+            # rssvpvrag.
+            j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
+            byqcnpx = j.bowpnpur.rkvfgf(fun)
+            ybt('arj fhttrfgvba: %e\a' % byqcnpx)
+            nffreg(byqcnpx)
+            nffreg(byqcnpx != Gehr)
+            nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
+            j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
+        vs abg fhttrfgrq naq byqcnpx:
+            nffreg(byqcnpx.raqfjvgu('.vqk'))
+            (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
+            vs abg (anzr va fhttrfgrq):
+                ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
+                pbaa.jevgr('vaqrk %f\a' % anzr)
+                fhttrfgrq[anzr] = 1
+        ryfr:
+            j._enj_jevgr([ohs])
+    # ABGERNPURQ
+
+
+qrs ernq_ers(pbaa, ersanzr):
+    tvg.purpx_ercb_be_qvr()
+    e = tvg.ernq_ers(ersanzr)
+    pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
+    pbaa.bx()
+
+
+qrs hcqngr_ers(pbaa, ersanzr):
+    tvg.purpx_ercb_be_qvr()
+    arjiny = pbaa.ernqyvar().fgevc()
+    byqiny = pbaa.ernqyvar().fgevc()
+    tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
+    pbaa.bx()
+
+
+qrs png(pbaa, vq):
+    tvg.purpx_ercb_be_qvr()
+    gel:
+        sbe oybo va tvg.png(vq):
+            pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
+            pbaa.jevgr(oybo)
+    rkprcg XrlReebe, r:
+        ybt('freire: reebe: %f\a' % r)
+        pbaa.jevgr('\0\0\0\0')
+        pbaa.reebe(r)
+    ryfr:
+        pbaa.jevgr('\0\0\0\0')
+        pbaa.bx()
+
+
+bcgfcrp = """
+ohc freire
+"""
+b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+ybt('ohc freire: ernqvat sebz fgqva.\a')
+
+pbzznaqf = {
+    'vavg-qve': vavg_qve,
+    'frg-qve': frg_qve,
+    'yvfg-vaqrkrf': yvfg_vaqrkrf,
+    'fraq-vaqrk': fraq_vaqrk,
+    'erprvir-bowrpgf': erprvir_bowrpgf,
+    'ernq-ers': ernq_ers,
+    'hcqngr-ers': hcqngr_ers,
+    'png': png,
+}
+
+# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
+# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
+pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
+ye = yvarernqre(pbaa)
+sbe _yvar va ye:
+    yvar = _yvar.fgevc()
+    vs abg yvar:
+        pbagvahr
+    ybt('ohc freire: pbzznaq: %e\a' % yvar)
+    jbeqf = yvar.fcyvg(' ', 1)
+    pzq = jbeqf[0]
+    erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
+    vs pzq == 'dhvg':
+        oernx
+    ryfr:
+        pzq = pbzznaqf.trg(pzq)
+        vs pzq:
+            pzq(pbaa, erfg)
+        ryfr:
+            envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
+
+ybt('ohc freire: qbar\a')
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+    rkgen = yvarernqre(flf.fgqva)
+
+erg = 0
+
+vs bcg.erzbgr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    png = pyv.png
+ryfr:
+    pc = tvg.PngCvcr()
+    png = pc.wbva
+
+sbe vq va rkgen:
+    gel:
+        sbe oybo va png(vq):
+            flf.fgqbhg.jevgr(oybo)
+    rkprcg XrlReebe, r:
+        flf.fgqbhg.syhfu()
+        ybt('reebe: %f\a' % r)
+        erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, reeab, fgng, gvzr, zngu
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc fnir [-gp] [-a anzr] <svyranzrf...>
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+g,gerr     bhgchg n gerr vq
+p,pbzzvg   bhgchg n pbzzvg vq
+a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+d,dhvrg    qba'g fubj cebterff zrgre
+fznyyre=   bayl onpx hc svyrf fznyyre guna a olgrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
+    b.sngny("hfr bar be zber bs -g, -p, -a")
+vs abg rkgen:
+    b.sngny("ab svyranzrf tvira")
+
+bcg.cebterff = (vfggl naq abg bcg.dhvrg)
+bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.erzbgr be vf_erirefr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+    j = pyv.arj_cnpxjevgre()
+ryfr:
+    pyv = Abar
+    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+    j = tvg.CnpxJevgre()
+
+unaqyr_pgey_p()
+
+
+qrs rngfynfu(qve):
+    vs qve.raqfjvgu('/'):
+        erghea qve[:-1]
+    ryfr:
+        erghea qve
+
+
+cnegf = ['']
+funyvfgf = [[]]
+
+qrs _chfu(cneg):
+    nffreg(cneg)
+    cnegf.nccraq(cneg)
+    funyvfgf.nccraq([])
+
+qrs _cbc(sbepr_gerr):
+    nffreg(yra(cnegf) >= 1)
+    cneg = cnegf.cbc()
+    funyvfg = funyvfgf.cbc()
+    gerr = sbepr_gerr be j.arj_gerr(funyvfg)
+    vs funyvfgf:
+        funyvfgf[-1].nccraq(('40000', cneg, gerr))
+    ryfr:  # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
+        funyvfgf.nccraq(funyvfg)
+    erghea gerr
+
+ynfgerznva = Abar
+qrs cebterff_ercbeg(a):
+    tybony pbhag, fhopbhag, ynfgerznva
+    fhopbhag += a
+    pp = pbhag + fhopbhag
+    cpg = gbgny naq (pp*100.0/gbgny) be 0
+    abj = gvzr.gvzr()
+    ryncfrq = abj - gfgneg
+    xcf = ryncfrq naq vag(pp/1024./ryncfrq)
+    xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
+    xcf = vag(xcf/xcf_senp)*xcf_senp
+    vs pp:
+        erznva = ryncfrq*1.0/pp * (gbgny-pp)
+    ryfr:
+        erznva = 0.0
+    vs (ynfgerznva naq (erznva > ynfgerznva)
+          naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
+        erznva = ynfgerznva
+    ryfr:
+        ynfgerznva = erznva
+    ubhef = vag(erznva/60/60)
+    zvaf = vag(erznva/60 - ubhef*60)
+    frpf = vag(erznva - ubhef*60*60 - zvaf*60)
+    vs ryncfrq < 30:
+        erznvafge = ''
+        xcffge = ''
+    ryfr:
+        xcffge = '%qx/f' % xcf
+        vs ubhef:
+            erznvafge = '%qu%qz' % (ubhef, zvaf)
+        ryvs zvaf:
+            erznvafge = '%qz%q' % (zvaf, frpf)
+        ryfr:
+            erznvafge = '%qf' % frpf
+    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
+             % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
+                erznvafge, xcffge))
+
+
+e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
+
+qrs nyernql_fnirq(rag):
+    erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
+
+qrs jnagerphefr_cer(rag):
+    erghea abg nyernql_fnirq(rag)
+
+qrs jnagerphefr_qhevat(rag):
+    erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
+
+gbgny = sgbgny = 0
+vs bcg.cebterff:
+    sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
+        vs abg (sgbgny % 10024):
+            cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
+        rkvfgf = rag.rkvfgf()
+        unfuinyvq = nyernql_fnirq(rag)
+        rag.frg_fun_zvffvat(abg unfuinyvq)
+        vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
+            vs rkvfgf naq abg unfuinyvq:
+                gbgny += rag.fvmr
+        sgbgny += 1
+    cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
+    unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
+
+gfgneg = gvzr.gvzr()
+pbhag = fhopbhag = spbhag = 0
+ynfgfxvc_anzr = Abar
+ynfgqve = ''
+sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
+    (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
+    rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
+    unfuinyvq = nyernql_fnirq(rag)
+    jnfzvffvat = rag.fun_zvffvat()
+    byqfvmr = rag.fvmr
+    vs bcg.ireobfr:
+        vs abg rkvfgf:
+            fgnghf = 'Q'
+        ryvs abg unfuinyvq:
+            vs rag.fun == vaqrk.RZCGL_FUN:
+                fgnghf = 'N'
+            ryfr:
+                fgnghf = 'Z'
+        ryfr:
+            fgnghf = ' '
+        vs bcg.ireobfr >= 2:
+            ybt('%f %-70f\a' % (fgnghf, rag.anzr))
+        ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
+            vs abg ynfgqve.fgnegfjvgu(qve):
+                ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
+            ynfgqve = qve
+
+    vs bcg.cebterff:
+        cebterff_ercbeg(0)
+    spbhag += 1
+    
+    vs abg rkvfgf:
+        pbagvahr
+    vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
+        vs rkvfgf naq abg unfuinyvq:
+            nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
+            ynfgfxvc_anzr = rag.anzr
+        pbagvahr
+
+    nffreg(qve.fgnegfjvgu('/'))
+    qvec = qve.fcyvg('/')
+    juvyr cnegf > qvec:
+        _cbc(sbepr_gerr = Abar)
+    vs qve != '/':
+        sbe cneg va qvec[yra(cnegf):]:
+            _chfu(cneg)
+
+    vs abg svyr:
+        # ab svyranzr cbegvba zrnaf guvf vf n fhoqve.  Ohg
+        # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
+        byqgerr = nyernql_fnirq(rag) # znl or Abar
+        arjgerr = _cbc(sbepr_gerr = byqgerr)
+        vs abg byqgerr:
+            vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
+                rag.vainyvqngr()
+            ryfr:
+                rag.inyvqngr(040000, arjgerr)
+            rag.ercnpx()
+        vs rkvfgf naq jnfzvffvat:
+            pbhag += byqfvmr
+        pbagvahr
+
+    # vg'f abg n qverpgbel
+    vq = Abar
+    vs unfuinyvq:
+        zbqr = '%b' % rag.tvgzbqr
+        vq = rag.fun
+        funyvfgf[-1].nccraq((zbqr, 
+                             tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+                             vq))
+    ryfr:
+        vs fgng.F_VFERT(rag.zbqr):
+            gel:
+                s = unfufcyvg.bcra_abngvzr(rag.anzr)
+            rkprcg VBReebe, r:
+                nqq_reebe(r)
+                ynfgfxvc_anzr = rag.anzr
+            rkprcg BFReebe, r:
+                nqq_reebe(r)
+                ynfgfxvc_anzr = rag.anzr
+            ryfr:
+                (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
+        ryfr:
+            vs fgng.F_VFQVE(rag.zbqr):
+                nffreg(0)  # unaqyrq nobir
+            ryvs fgng.F_VFYAX(rag.zbqr):
+                gel:
+                    ey = bf.ernqyvax(rag.anzr)
+                rkprcg BFReebe, r:
+                    nqq_reebe(r)
+                    ynfgfxvc_anzr = rag.anzr
+                rkprcg VBReebe, r:
+                    nqq_reebe(r)
+                    ynfgfxvc_anzr = rag.anzr
+                ryfr:
+                    (zbqr, vq) = ('120000', j.arj_oybo(ey))
+            ryfr:
+                nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
+                ynfgfxvc_anzr = rag.anzr
+        vs vq:
+            rag.inyvqngr(vag(zbqr, 8), vq)
+            rag.ercnpx()
+            funyvfgf[-1].nccraq((zbqr,
+                                 tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+                                 vq))
+    vs rkvfgf naq jnfzvffvat:
+        pbhag += byqfvmr
+        fhopbhag = 0
+
+
+vs bcg.cebterff:
+    cpg = gbgny naq pbhag*100.0/gbgny be 100
+    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar.    \a'
+             % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
+
+juvyr yra(cnegf) > 1:
+    _cbc(sbepr_gerr = Abar)
+nffreg(yra(funyvfgf) == 1)
+gerr = j.arj_gerr(funyvfgf[-1])
+vs bcg.gerr:
+    cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+    zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+    vs bcg.pbzzvg:
+        cevag pbzzvg.rapbqr('urk')
+
+j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
+        
+vs bcg.anzr:
+    vs pyv:
+        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+    ryfr:
+        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+    pyv.pybfr()
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc gvpx
+"""
+b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+g = gvzr.gvzr()
+gyrsg = 1 - (g - vag(g))
+gvzr.fyrrc(gyrsg)
+#!/hfe/ova/rai clguba
+vzcbeg bf, flf, fgng, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
+sebz ohc.urycref vzcbeg *
+
+
+qrs zretr_vaqrkrf(bhg, e1, e2):
+    sbe r va vaqrk.ZretrVgre([e1, e2]):
+        # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl?  Jura?
+        bhg.nqq_vkragel(r)
+
+
+pynff VgreUrycre:
+    qrs __vavg__(frys, y):
+        frys.v = vgre(y)
+        frys.phe = Abar
+        frys.arkg()
+
+    qrs arkg(frys):
+        gel:
+            frys.phe = frys.v.arkg()
+        rkprcg FgbcVgrengvba:
+            frys.phe = Abar
+        erghea frys.phe
+
+
+qrs purpx_vaqrk(ernqre):
+    gel:
+        ybt('purpx: purpxvat sbejneq vgrengvba...\a')
+        r = Abar
+        q = {}
+        sbe r va ernqre.sbejneq_vgre():
+            vs r.puvyqera_a:
+                vs bcg.ireobfr:
+                    ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
+                                            r.anzr))
+                nffreg(r.puvyqera_bsf)
+                nffreg(r.anzr.raqfjvgu('/'))
+                nffreg(abg q.trg(r.puvyqera_bsf))
+                q[r.puvyqera_bsf] = 1
+            vs r.syntf & vaqrk.VK_UNFUINYVQ:
+                nffreg(r.fun != vaqrk.RZCGL_FUN)
+                nffreg(r.tvgzbqr)
+        nffreg(abg r be r.anzr == '/')  # ynfg ragel vf *nyjnlf* /
+        ybt('purpx: purpxvat abezny vgrengvba...\a')
+        ynfg = Abar
+        sbe r va ernqre:
+            vs ynfg:
+                nffreg(ynfg > r.anzr)
+            ynfg = r.anzr
+    rkprcg:
+        ybt('vaqrk reebe! ng %e\a' % r)
+        envfr
+    ybt('purpx: cnffrq.\a')
+
+
+qrs hcqngr_vaqrk(gbc):
+    ev = vaqrk.Ernqre(vaqrksvyr)
+    jv = vaqrk.Jevgre(vaqrksvyr)
+    evt = VgreUrycre(ev.vgre(anzr=gbc))
+    gfgneg = vag(gvzr.gvzr())
+
+    unfutra = Abar
+    vs bcg.snxr_inyvq:
+        qrs unfutra(anzr):
+            erghea (0100644, vaqrk.SNXR_FUN)
+
+    gbgny = 0
+    sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
+        vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
+            flf.fgqbhg.jevgr('%f\a' % cngu)
+            flf.fgqbhg.syhfu()
+            cebterff('Vaqrkvat: %q\e' % gbgny)
+        ryvs abg (gbgny % 128):
+            cebterff('Vaqrkvat: %q\e' % gbgny)
+        gbgny += 1
+        juvyr evt.phe naq evt.phe.anzr > cngu:  # qryrgrq cnguf
+            vs evt.phe.rkvfgf():
+                evt.phe.frg_qryrgrq()
+                evt.phe.ercnpx()
+            evt.arkg()
+        vs evt.phe naq evt.phe.anzr == cngu:    # cnguf gung nyernql rkvfgrq
+            vs cfg:
+                evt.phe.sebz_fgng(cfg, gfgneg)
+            vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
+                vs unfutra:
+                    (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
+                    evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
+            vs bcg.snxr_vainyvq:
+                evt.phe.vainyvqngr()
+            evt.phe.ercnpx()
+            evt.arkg()
+        ryfr:  # arj cnguf
+            jv.nqq(cngu, cfg, unfutra = unfutra)
+    cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
+    
+    vs ev.rkvfgf():
+        ev.fnir()
+        jv.syhfu()
+        vs jv.pbhag:
+            je = jv.arj_ernqre()
+            vs bcg.purpx:
+                ybt('purpx: orsber zretvat: byqsvyr\a')
+                purpx_vaqrk(ev)
+                ybt('purpx: orsber zretvat: arjsvyr\a')
+                purpx_vaqrk(je)
+            zv = vaqrk.Jevgre(vaqrksvyr)
+            zretr_vaqrkrf(zv, ev, je)
+            ev.pybfr()
+            zv.pybfr()
+            je.pybfr()
+        jv.nobeg()
+    ryfr:
+        jv.pybfr()
+
+
+bcgfcrp = """
+ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
+--
+c,cevag    cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
+z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
+f,fgnghf   cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
+U,unfu     cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
+y,ybat     cevag zber vasbezngvba nobhg rnpu svyr
+h,hcqngr   (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
+k,kqri,bar-svyr-flfgrz  qba'g pebff svyrflfgrz obhaqnevrf
+snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
+snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
+purpx      pnershyyl purpx vaqrk svyr vagrtevgl
+s,vaqrksvyr=  gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+"""
+b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
+    b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
+vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
+    b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
+vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
+    b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
+
+tvg.purpx_ercb_be_qvr()
+vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
+
+unaqyr_pgey_p()
+
+vs bcg.purpx:
+    ybt('purpx: fgnegvat vavgvny purpx.\a')
+    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+cnguf = vaqrk.erqhpr_cnguf(rkgen)
+
+vs bcg.hcqngr:
+    vs abg cnguf:
+        b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
+    sbe (ec,cngu) va cnguf:
+        hcqngr_vaqrk(ec)
+
+vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
+    sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
+        vs (bcg.zbqvsvrq 
+            naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
+            pbagvahr
+        yvar = ''
+        vs bcg.fgnghf:
+            vs rag.vf_qryrgrq():
+                yvar += 'Q '
+            ryvs abg rag.vf_inyvq():
+                vs rag.fun == vaqrk.RZCGL_FUN:
+                    yvar += 'N '
+                ryfr:
+                    yvar += 'Z '
+            ryfr:
+                yvar += '  '
+        vs bcg.unfu:
+            yvar += rag.fun.rapbqr('urk') + ' '
+        vs bcg.ybat:
+            yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
+        cevag yvar + (anzr be './')
+
+vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
+    ybt('purpx: fgnegvat svany purpx.\a')
+    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg
+sebz ohc vzcbeg bcgvbaf, urycref
+
+bcgfcrp = """
+ohc eonpxhc-freire
+--
+    Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+# trg gur fhopbzznaq'f neti.
+# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
+# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
+# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
+ohs = flf.fgqva.ernq(4)
+fm = fgehpg.hacnpx('!V', ohs)[0]
+nffreg(fm > 0)
+nffreg(fm < 1000000)
+ohs = flf.fgqva.ernq(fm)
+nffreg(yra(ohs) == fm)
+neti = ohs.fcyvg('\0')
+
+# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
+# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
+# gb zvfhfr gurz.  Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
+# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
+#
+# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
+# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
+# fbpxrg.  Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
+# bs vg, ohg cebonoyl qvqa'g.  Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
+# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
+#
+# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
+# qrfpevcgbef.  Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
+# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
+bf.qhc2(0, 3)
+bf.qhc2(1, 4)
+bf.qhc2(2, 1)
+sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
+bf.qhc2(sq, 0)
+bf.pybfr(sq)
+
+bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
+bf.rkrpic(neti[0], neti)
+flf.rkvg(99)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo, fhocebprff, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+cne2_bx = 0
+ahyys = bcra('/qri/ahyy')
+
+qrs qroht(f):
+    vs bcg.ireobfr:
+        ybt(f)
+
+qrs eha(neti):
+    # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
+    # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
+    # rkrpvat sbe fbzr ernfba.  Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
+    # svefg.
+    sq = bf.qhc(2)  # pbcl fgqree
+    gel:
+        c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
+        erghea c.jnvg()
+    svanyyl:
+        bf.pybfr(sq)
+
+qrs cne2_frghc():
+    tybony cne2_bx
+    ei = 1
+    gel:
+        c = fhocebprff.Cbcra(['cne2', '--uryc'],
+                             fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
+        ei = c.jnvg()
+    rkprcg BFReebe:
+        ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
+    ryfr:
+        cne2_bx = 1
+
+qrs cnei(yiy):
+    vs bcg.ireobfr >= yiy:
+        vs vfggl:
+            erghea []
+        ryfr:
+            erghea ['-d']
+    ryfr:
+        erghea ['-dd']
+
+qrs cne2_trarengr(onfr):
+    erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
+               + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
+
+qrs cne2_irevsl(onfr):
+    erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
+
+qrs cne2_ercnve(onfr):
+    erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
+
+qrs dhvpx_irevsl(onfr):
+    s = bcra(onfr + '.cnpx', 'eo')
+    s.frrx(-20, 2)
+    jnagfhz = s.ernq(20)
+    nffreg(yra(jnagfhz) == 20)
+    s.frrx(0)
+    fhz = Fun1()
+    sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
+        fhz.hcqngr(o)
+    vs fhz.qvtrfg() != jnagfhz:
+        envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
+                                                  fhz.urkqvtrfg()))
+        
+
+qrs tvg_irevsl(onfr):
+    vs bcg.dhvpx:
+        gel:
+            dhvpx_irevsl(onfr)
+        rkprcg Rkprcgvba, r:
+            qroht('reebe: %f\a' % r)
+            erghea 1
+        erghea 0
+    ryfr:
+        erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
+    
+    
+qrs qb_cnpx(onfr, ynfg):
+    pbqr = 0
+    vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
+        ierfhyg = cne2_irevsl(onfr)
+        vs ierfhyg != 0:
+            vs bcg.ercnve:
+                eerfhyg = cne2_ercnve(onfr)
+                vs eerfhyg != 0:
+                    cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
+                    pbqr = eerfhyg
+                ryfr:
+                    cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
+                    pbqr = 100
+            ryfr:
+                cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
+                pbqr = ierfhyg
+        ryfr:
+            cevag '%f bx' % ynfg
+    ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
+        terfhyg = tvg_irevsl(onfr)
+        vs terfhyg != 0:
+            cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
+            pbqr = terfhyg
+        ryfr:
+            vs cne2_bx naq bcg.trarengr:
+                cerfhyg = cne2_trarengr(onfr)
+                vs cerfhyg != 0:
+                    cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
+                    pbqr = cerfhyg
+                ryfr:
+                    cevag '%f bx' % ynfg
+            ryfr:
+                cevag '%f bx' % ynfg
+    ryfr:
+        nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
+        qroht('    fxvccrq: cne2 svyr nyernql trarengrq.\a')
+    erghea pbqr
+
+
+bcgfcrp = """
+ohc sfpx [bcgvbaf...] [svyranzrf...]
+--
+e,ercnve    nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
+t,trarengr  trarengr nhgb-ercnve vasbezngvba hfvat cne2
+i,ireobfr   vapernfr ireobfvgl (pna or hfrq zber guna bapr)
+dhvpx       whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
+w,wbof=     eha 'a' wbof va cnenyyry
+cne2-bx     vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
+qvfnoyr-cne2  vtaber cne2 rira vs vg vf ninvynoyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+cne2_frghc()
+vs bcg.cne2_bx:
+    vs cne2_bx:
+        flf.rkvg(0)  # 'gehr' va fu
+    ryfr:
+        flf.rkvg(1)
+vs bcg.qvfnoyr_cne2:
+    cne2_bx = 0
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+    qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
+    rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
+
+pbqr = 0
+pbhag = 0
+bhgfgnaqvat = {}
+sbe anzr va rkgen:
+    vs anzr.raqfjvgu('.cnpx'):
+        onfr = anzr[:-5]
+    ryvs anzr.raqfjvgu('.vqk'):
+        onfr = anzr[:-4]
+    ryvs anzr.raqfjvgu('.cne2'):
+        onfr = anzr[:-5]
+    ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
+        onfr = anzr
+    ryfr:
+        envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
+    (qve,ynfg) = bf.cngu.fcyvg(onfr)
+    cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
+    vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
+        cne2_rkvfgf = 0
+    flf.fgqbhg.syhfu()
+    qroht('sfpx: purpxvat %f (%f)\a' 
+          % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
+    vs abg bcg.ireobfr:
+        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+    
+    vs abg bcg.wbof:
+        ap = qb_cnpx(onfr, ynfg)
+        pbqr = pbqr be ap
+        pbhag += 1
+    ryfr:
+        juvyr yra(bhgfgnaqvat) >= bcg.wbof:
+            (cvq,ap) = bf.jnvg()
+            ap >>= 8
+            vs cvq va bhgfgnaqvat:
+                qry bhgfgnaqvat[cvq]
+                pbqr = pbqr be ap
+                pbhag += 1
+        cvq = bf.sbex()
+        vs cvq:  # cnerag
+            bhgfgnaqvat[cvq] = 1
+        ryfr: # puvyq
+            gel:
+                flf.rkvg(qb_cnpx(onfr, ynfg))
+            rkprcg Rkprcgvba, r:
+                ybt('rkprcgvba: %e\a' % r)
+                flf.rkvg(99)
+                
+juvyr yra(bhgfgnaqvat):
+    (cvq,ap) = bf.jnvg()
+    ap >>= 8
+    vs cvq va bhgfgnaqvat:
+        qry bhgfgnaqvat[cvq]
+        pbqr = pbqr be ap
+        pbhag += 1
+    vs abg bcg.ireobfr:
+        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+vs abg bcg.ireobfr naq vfggl:
+    ybt('sfpx qbar.           \a')
+flf.rkvg(pbqr)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
+sebz ohc vzcbeg bcgvbaf, ffu
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc eonpxhc <ubfganzr> vaqrk ...
+ohc eonpxhc <ubfganzr> fnir ...
+ohc eonpxhc <ubfganzr> fcyvg ...
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs yra(rkgen) < 2:
+    b.sngny('nethzragf rkcrpgrq')
+
+pynff FvtRkprcgvba(Rkprcgvba):
+    qrs __vavg__(frys, fvtahz):
+        frys.fvtahz = fvtahz
+        Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
+qrs unaqyre(fvtahz, senzr):
+    envfr FvtRkprcgvba(fvtahz)
+
+fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
+fvtany.fvtany(fvtany.FVTVAG, unaqyre)
+
+fc = Abar
+c = Abar
+erg = 99
+
+gel:
+    ubfganzr = rkgen[0]
+    neti = rkgen[1:]
+    c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
+
+    netif = '\0'.wbva(['ohc'] + neti)
+    c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
+    c.fgqva.syhfu()
+
+    znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
+    fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
+
+    c.fgqva.pybfr()
+    c.fgqbhg.pybfr()
+
+svanyyl:
+    juvyr 1:
+        # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
+        # va pnfr bhe puvyq qbrfa'g qvr.
+        gel:
+            erg = c.jnvg()
+            fc.jnvg()
+            oernx
+        rkprcg FvtRkprcgvba, r:
+            ybt('\aohc eonpxhc: %f\a' % r)
+            bf.xvyy(c.cvq, r.fvtahz)
+            erg = 84
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc arjyvare
+"""
+b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+e = er.pbzcvyr(e'([\e\a])')
+ynfgyra = 0
+nyy = ''
+juvyr 1:
+    y = e.fcyvg(nyy, 1)
+    vs yra(y) <= 1:
+        gel:
+            o = bf.ernq(flf.fgqva.svyrab(), 4096)
+        rkprcg XrlobneqVagreehcg:
+            oernx
+        vs abg o:
+            oernx
+        nyy += o
+    ryfr:
+        nffreg(yra(y) == 3)
+        (yvar, fcyvgpune, nyy) = y
+        #fcyvgpune = '\a'
+        flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
+        vs fcyvgpune == '\e':
+            ynfgyra = yra(yvar)
+        ryfr:
+            ynfgyra = 0
+        flf.fgqbhg.syhfu()
+
+vs ynfgyra be nyy:
+    flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
+#!/hfe/ova/rai clguba
+vzcbeg flf
+sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc znetva
+"""
+b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+#tvg.vtaber_zvqk = 1
+
+zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+ynfg = '\0'*20
+ybatzngpu = 0
+sbe v va zv:
+    vs v == ynfg:
+        pbagvahr
+    #nffreg(fge(v) >= ynfg)
+    cz = _unfufcyvg.ovgzngpu(ynfg, v)
+    ybatzngpu = znk(ybatzngpu, cz)
+    ynfg = v
+cevag ybatzngpu
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg bcgvbaf, qerphefr
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc qerphefr <cngu>
+--
+k,kqri,bar-svyr-flfgrz   qba'g pebff svyrflfgrz obhaqnevrf
+d,dhvrg  qba'g npghnyyl cevag svyranzrf
+cebsvyr  eha haqre gur clguba cebsvyre
+"""
+b = bcgvbaf.Bcgvbaf('ohc qerphefr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar svyranzr rkcrpgrq")
+
+vg = qerphefr.erphefvir_qveyvfg(rkgen, bcg.kqri)
+vs bcg.cebsvyr:
+    vzcbeg pCebsvyr
+    qrs qb_vg():
+        sbe v va vg:
+            cnff
+    pCebsvyr.eha('qb_vg()')
+ryfr:
+    vs bcg.dhvrg:
+        sbe v va vg:
+            cnff
+    ryfr:
+        sbe (anzr,fg) va vg:
+            cevag anzr
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc fcyvg [-gpo] [-a anzr] [--orapu] [svyranzrf...]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+o,oybof    bhgchg n frevrf bs oybo vqf
+g,gerr     bhgchg n gerr vq
+p,pbzzvg   bhgchg n pbzzvg vq
+a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
+A,abbc     qba'g npghnyyl fnir gur qngn naljurer
+d,dhvrg    qba'g cevag cebterff zrffntrf
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+pbcl       whfg pbcl vachg gb bhgchg, unfufcyvggvat nybat gur jnl
+orapu      cevag orapuznex gvzvatf gb fgqree
+znk-cnpx-fvmr=  znkvzhz olgrf va n fvatyr cnpx
+znk-cnpx-bowrpgf=  znkvzhz ahzore bs bowrpgf va n fvatyr cnpx
+snabhg=  znkvzhz ahzore bs oybof va n fvatyr gerr
+"""
+b = bcgvbaf.Bcgvbaf('ohc fcyvg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.oybof be bcg.gerr be bcg.pbzzvg be bcg.anzr be
+        bcg.abbc be bcg.pbcl):
+    b.sngny("hfr bar be zber bs -o, -g, -p, -a, -A, --pbcl")
+vs (bcg.abbc be bcg.pbcl) naq (bcg.oybof be bcg.gerr be 
+                               bcg.pbzzvg be bcg.anzr):
+    b.sngny('-A vf vapbzcngvoyr jvgu -o, -g, -p, -a')
+
+vs bcg.ireobfr >= 2:
+    tvg.ireobfr = bcg.ireobfr - 1
+    bcg.orapu = 1
+vs bcg.znk_cnpx_fvmr:
+    unfufcyvg.znk_cnpx_fvmr = cnefr_ahz(bcg.znk_cnpx_fvmr)
+vs bcg.znk_cnpx_bowrpgf:
+    unfufcyvg.znk_cnpx_bowrpgf = cnefr_ahz(bcg.znk_cnpx_bowrpgf)
+vs bcg.snabhg:
+    unfufcyvg.snabhg = cnefr_ahz(bcg.snabhg)
+vs bcg.oybof:
+    unfufcyvg.snabhg = 0
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+fgneg_gvzr = gvzr.gvzr()
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.abbc be bcg.pbcl:
+    pyv = j = byqers = Abar
+ryvs bcg.erzbgr be vf_erirefr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+    j = pyv.arj_cnpxjevgre()
+ryfr:
+    pyv = Abar
+    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+    j = tvg.CnpxJevgre()
+
+svyrf = rkgen naq (bcra(sa) sbe sa va rkgen) be [flf.fgqva]
+vs j:
+    funyvfg = unfufcyvg.fcyvg_gb_funyvfg(j, svyrf)
+    gerr = j.arj_gerr(funyvfg)
+ryfr:
+    ynfg = 0
+    sbe (oybo, ovgf) va unfufcyvg.unfufcyvg_vgre(svyrf):
+        unfufcyvg.gbgny_fcyvg += yra(oybo)
+        vs bcg.pbcl:
+            flf.fgqbhg.jevgr(fge(oybo))
+        zrtf = unfufcyvg.gbgny_fcyvg/1024/1024
+        vs abg bcg.dhvrg naq ynfg != zrtf:
+            cebterff('%q Zolgrf ernq\e' % zrtf)
+            ynfg = zrtf
+    cebterff('%q Zolgrf ernq, qbar.\a' % zrtf)
+
+vs bcg.ireobfr:
+    ybt('\a')
+vs bcg.oybof:
+    sbe (zbqr,anzr,ova) va funyvfg:
+        cevag ova.rapbqr('urk')
+vs bcg.gerr:
+    cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+    zft = 'ohc fcyvg\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+    vs bcg.pbzzvg:
+        cevag pbzzvg.rapbqr('urk')
+
+vs j:
+    j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
+        
+vs bcg.anzr:
+    vs pyv:
+        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+    ryfr:
+        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+    pyv.pybfr()
+
+frpf = gvzr.gvzr() - fgneg_gvzr
+fvmr = unfufcyvg.gbgny_fcyvg
+vs bcg.orapu:
+    ybt('\aohc: %.2sxolgrf va %.2s frpf = %.2s xolgrf/frp\a'
+        % (fvmr/1024., frpf, fvmr/1024./frpf))
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, fgehpg, zznc
+sebz ohc vzcbeg tvg, bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs f_sebz_olgrf(olgrf):
+    pyvfg = [pue(o) sbe o va olgrf]
+    erghea ''.wbva(pyvfg)
+
+
+qrs ercbeg(pbhag):
+    svryqf = ['IzFvmr', 'IzEFF', 'IzQngn', 'IzFgx']
+    q = {}
+    sbe yvar va bcra('/cebp/frys/fgnghf').ernqyvarf():
+        y = er.fcyvg(e':\f*', yvar.fgevc(), 1)
+        q[y[0]] = y[1]
+    vs pbhag >= 0:
+        r1 = pbhag
+        svryqf = [q[x] sbe x va svryqf]
+    ryfr:
+        r1 = ''
+    cevag ('%9f  ' + ('%10f ' * yra(svryqf))) % ghcyr([r1] + svryqf)
+    flf.fgqbhg.syhfu()
+
+
+bcgfcrp = """
+ohc zrzgrfg [-a ryrzragf] [-p plpyrf]
+--
+a,ahzore=  ahzore bs bowrpgf cre plpyr
+p,plpyrf=  ahzore bs plpyrf gb eha
+vtaber-zvqk  vtaber .zvqk svyrf, hfr bayl .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zrzgrfg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+tvg.vtaber_zvqk = bcg.vtaber_zvqk
+
+tvg.purpx_ercb_be_qvr()
+z = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+
+plpyrf = bcg.plpyrf be 100
+ahzore = bcg.ahzore be 10000
+
+ercbeg(-1)
+s = bcra('/qri/henaqbz')
+n = zznc.zznc(-1, 20)
+ercbeg(0)
+sbe p va kenatr(plpyrf):
+    sbe a va kenatr(ahzore):
+        o = s.ernq(3)
+        vs 0:
+            olgrf = yvfg(fgehpg.hacnpx('!OOO', o)) + [0]*17
+            olgrf[2] &= 0ks0
+            ova = fgehpg.cnpx('!20f', f_sebz_olgrf(olgrf))
+        ryfr:
+            n[0:2] = o[0:2]
+            n[2] = pue(beq(o[2]) & 0ks0)
+            ova = fge(n[0:20])
+        #cevag ova.rapbqr('urk')
+        z.rkvfgf(ova)
+    ercbeg((p+1)*ahzore)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+qrs cevag_abqr(grkg, a):
+    cersvk = ''
+    vs bcg.unfu:
+        cersvk += "%f " % a.unfu.rapbqr('urk')
+    vs fgng.F_VFQVE(a.zbqr):
+        cevag '%f%f/' % (cersvk, grkg)
+    ryvs fgng.F_VFYAX(a.zbqr):
+        cevag '%f%f@' % (cersvk, grkg)
+    ryfr:
+        cevag '%f%f' % (cersvk, grkg)
+
+
+bcgfcrp = """
+ohc yf <qvef...>
+--
+f,unfu   fubj unfu sbe rnpu svyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc yf', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+
+vs abg rkgen:
+    rkgen = ['/']
+
+erg = 0
+sbe q va rkgen:
+    gel:
+        a = gbc.yerfbyir(q)
+        vs fgng.F_VFQVE(a.zbqr):
+            sbe fho va a:
+                cevag_abqr(fho.anzr, fho)
+        ryfr:
+            cevag_abqr(q, a)
+    rkprcg isf.AbqrReebe, r:
+        ybt('reebe: %f\a' % r)
+        erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er, fgng, ernqyvar, sazngpu
+sebz ohc vzcbeg bcgvbaf, tvg, fudhbgr, isf
+sebz ohc.urycref vzcbeg *
+
+qrs abqr_anzr(grkg, a):
+    vs fgng.F_VFQVE(a.zbqr):
+        erghea '%f/' % grkg
+    ryvs fgng.F_VFYAX(a.zbqr):
+        erghea '%f@' % grkg
+    ryfr:
+        erghea '%f' % grkg
+
+
+qrs qb_yf(cngu, a):
+    y = []
+    vs fgng.F_VFQVE(a.zbqr):
+        sbe fho va a:
+            y.nccraq(abqr_anzr(fho.anzr, fho))
+    ryfr:
+        y.nccraq(abqr_anzr(cngu, a))
+    cevag pbyhzangr(y, '')
+    
+
+qrs jevgr_gb_svyr(vas, bhgs):
+    sbe oybo va puhaxlernqre(vas):
+        bhgs.jevgr(oybo)
+    
+
+qrs vachgvgre():
+    vs bf.vfnggl(flf.fgqva.svyrab()):
+        juvyr 1:
+            gel:
+                lvryq enj_vachg('ohc> ')
+            rkprcg RBSReebe:
+                oernx
+    ryfr:
+        sbe yvar va flf.fgqva:
+            lvryq yvar
+
+
+qrs _pbzcyrgre_trg_fhof(yvar):
+    (dglcr, ynfgjbeq) = fudhbgr.hasvavfurq_jbeq(yvar)
+    (qve,anzr) = bf.cngu.fcyvg(ynfgjbeq)
+    #ybt('\apbzcyrgre: %e %e %e\a' % (dglcr, ynfgjbeq, grkg))
+    a = cjq.erfbyir(qve)
+    fhof = yvfg(svygre(ynzoqn k: k.anzr.fgnegfjvgu(anzr),
+                       a.fhof()))
+    erghea (qve, anzr, dglcr, ynfgjbeq, fhof)
+
+
+_ynfg_yvar = Abar
+_ynfg_erf = Abar
+qrs pbzcyrgre(grkg, fgngr):
+    tybony _ynfg_yvar
+    tybony _ynfg_erf
+    gel:
+        yvar = ernqyvar.trg_yvar_ohssre()[:ernqyvar.trg_raqvqk()]
+        vs _ynfg_yvar != yvar:
+            _ynfg_erf = _pbzcyrgre_trg_fhof(yvar)
+            _ynfg_yvar = yvar
+        (qve, anzr, dglcr, ynfgjbeq, fhof) = _ynfg_erf
+        vs fgngr < yra(fhof):
+            fa = fhof[fgngr]
+            fa1 = fa.erfbyir('')  # qrers flzyvaxf
+            shyyanzr = bf.cngu.wbva(qve, fa.anzr)
+            vs fgng.F_VFQVE(fa1.zbqr):
+                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr+'/',
+                                          grezvangr=Snyfr)
+            ryfr:
+                erg = fudhbgr.jung_gb_nqq(dglcr, ynfgjbeq, shyyanzr,
+                                          grezvangr=Gehr) + ' '
+            erghea grkg + erg
+    rkprcg Rkprcgvba, r:
+        ybt('\areebe va pbzcyrgvba: %f\a' % r)
+
+            
+bcgfcrp = """
+ohc sgc
+"""
+b = bcgvbaf.Bcgvbaf('ohc sgc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+gbc = isf.ErsYvfg(Abar)
+cjq = gbc
+
+vs rkgen:
+    yvarf = rkgen
+ryfr:
+    ernqyvar.frg_pbzcyrgre_qryvzf(' \g\a\e/')
+    ernqyvar.frg_pbzcyrgre(pbzcyrgre)
+    ernqyvar.cnefr_naq_ovaq("gno: pbzcyrgr")
+    yvarf = vachgvgre()
+
+sbe yvar va yvarf:
+    vs abg yvar.fgevc():
+        pbagvahr
+    jbeqf = [jbeq sbe (jbeqfgneg,jbeq) va fudhbgr.dhbgrfcyvg(yvar)]
+    pzq = jbeqf[0].ybjre()
+    #ybt('rkrphgr: %e %e\a' % (pzq, cnez))
+    gel:
+        vs pzq == 'yf':
+            sbe cnez va (jbeqf[1:] be ['.']):
+                qb_yf(cnez, cjq.erfbyir(cnez))
+        ryvs pzq == 'pq':
+            sbe cnez va jbeqf[1:]:
+                cjq = cjq.erfbyir(cnez)
+        ryvs pzq == 'cjq':
+            cevag cjq.shyyanzr()
+        ryvs pzq == 'png':
+            sbe cnez va jbeqf[1:]:
+                jevgr_gb_svyr(cjq.erfbyir(cnez).bcra(), flf.fgqbhg)
+        ryvs pzq == 'trg':
+            vs yra(jbeqf) abg va [2,3]:
+                envfr Rkprcgvba('Hfntr: trg <svyranzr> [ybpnyanzr]')
+            eanzr = jbeqf[1]
+            (qve,onfr) = bf.cngu.fcyvg(eanzr)
+            yanzr = yra(jbeqf)>2 naq jbeqf[2] be onfr
+            vas = cjq.erfbyir(eanzr).bcra()
+            ybt('Fnivat %e\a' % yanzr)
+            jevgr_gb_svyr(vas, bcra(yanzr, 'jo'))
+        ryvs pzq == 'ztrg':
+            sbe cnez va jbeqf[1:]:
+                (qve,onfr) = bf.cngu.fcyvg(cnez)
+                sbe a va cjq.erfbyir(qve).fhof():
+                    vs sazngpu.sazngpu(a.anzr, onfr):
+                        gel:
+                            ybt('Fnivat %e\a' % a.anzr)
+                            vas = a.bcra()
+                            bhgs = bcra(a.anzr, 'jo')
+                            jevgr_gb_svyr(vas, bhgs)
+                            bhgs.pybfr()
+                        rkprcg Rkprcgvba, r:
+                            ybt('  reebe: %f\a' % r)
+        ryvs pzq == 'uryc' be pzq == '?':
+            ybt('Pbzznaqf: yf pq cjq png trg ztrg uryc dhvg\a')
+        ryvs pzq == 'dhvg' be pzq == 'rkvg' be pzq == 'olr':
+            oernx
+        ryfr:
+            envfr Rkprcgvba('ab fhpu pbzznaq %e' % pzq)
+    rkprcg Rkprcgvba, r:
+        ybt('reebe: %f\a' % r)
+        #envfr
+#!/hfe/ova/rai clguba
+vzcbeg flf, zznc
+sebz ohc vzcbeg bcgvbaf, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc enaqbz [-F frrq] <ahzolgrf>
+--
+F,frrq=   bcgvbany enaqbz ahzore frrq (qrsnhyg 1)
+s,sbepr   cevag enaqbz qngn gb fgqbhg rira vs vg'f n ggl
+"""
+b = bcgvbaf.Bcgvbaf('ohc enaqbz', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+gbgny = cnefr_ahz(rkgen[0])
+
+vs bcg.sbepr be (abg bf.vfnggl(1) naq
+                 abg ngbv(bf.raiveba.trg('OHC_SBEPR_GGL')) & 1):
+    _unfufcyvg.jevgr_enaqbz(flf.fgqbhg.svyrab(), gbgny, bcg.frrq be 0)
+ryfr:
+    ybt('reebe: abg jevgvat ovanel qngn gb n grezvany. Hfr -s gb sbepr.\a')
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc uryc <pbzznaq>
+"""
+b = bcgvbaf.Bcgvbaf('ohc uryc', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) == 0:
+    # gur jenccre cebtenz cebivqrf gur qrsnhyg hfntr fgevat
+    bf.rkrpic(bf.raiveba['OHC_ZNVA_RKR'], ['ohc'])
+ryvs yra(rkgen) == 1:
+    qbpanzr = (rkgen[0]=='ohc' naq 'ohc' be ('ohc-%f' % rkgen[0]))
+    rkr = flf.neti[0]
+    (rkrcngu, rkrsvyr) = bf.cngu.fcyvg(rkr)
+    znacngu = bf.cngu.wbva(rkrcngu, '../Qbphzragngvba/' + qbpanzr + '.[1-9]')
+    t = tybo.tybo(znacngu)
+    vs t:
+        bf.rkrpic('zna', ['zna', '-y', t[0]])
+    ryfr:
+        bf.rkrpic('zna', ['zna', qbpanzr])
+ryfr:
+    b.sngny("rknpgyl bar pbzznaq anzr rkcrpgrq")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgng, reeab, shfr, er, gvzr, grzcsvyr
+sebz ohc vzcbeg bcgvbaf, tvg, isf
+sebz ohc.urycref vzcbeg *
+
+
+pynff Fgng(shfr.Fgng):
+    qrs __vavg__(frys):
+        frys.fg_zbqr = 0
+        frys.fg_vab = 0
+        frys.fg_qri = 0
+        frys.fg_ayvax = 0
+        frys.fg_hvq = 0
+        frys.fg_tvq = 0
+        frys.fg_fvmr = 0
+        frys.fg_ngvzr = 0
+        frys.fg_zgvzr = 0
+        frys.fg_pgvzr = 0
+        frys.fg_oybpxf = 0
+        frys.fg_oyxfvmr = 0
+        frys.fg_eqri = 0
+
+
+pnpur = {}
+qrs pnpur_trg(gbc, cngu):
+    cnegf = cngu.fcyvg('/')
+    pnpur[('',)] = gbc
+    p = Abar
+    znk = yra(cnegf)
+    #ybt('pnpur: %e\a' % pnpur.xrlf())
+    sbe v va enatr(znk):
+        cer = cnegf[:znk-v]
+        #ybt('pnpur gelvat: %e\a' % cer)
+        p = pnpur.trg(ghcyr(cer))
+        vs p:
+            erfg = cnegf[znk-v:]
+            sbe e va erfg:
+                #ybt('erfbyivat %e sebz %e\a' % (e, p.shyyanzr()))
+                p = p.yerfbyir(e)
+                xrl = ghcyr(cer + [e])
+                #ybt('fnivat: %e\a' % (xrl,))
+                pnpur[xrl] = p
+            oernx
+    nffreg(p)
+    erghea p
+        
+    
+
+pynff OhcSf(shfr.Shfr):
+    qrs __vavg__(frys, gbc):
+        shfr.Shfr.__vavg__(frys)
+        frys.gbc = gbc
+    
+    qrs trgngge(frys, cngu):
+        ybt('--trgngge(%e)\a' % cngu)
+        gel:
+            abqr = pnpur_trg(frys.gbc, cngu)
+            fg = Fgng()
+            fg.fg_zbqr = abqr.zbqr
+            fg.fg_ayvax = abqr.ayvaxf()
+            fg.fg_fvmr = abqr.fvmr()
+            fg.fg_zgvzr = abqr.zgvzr
+            fg.fg_pgvzr = abqr.pgvzr
+            fg.fg_ngvzr = abqr.ngvzr
+            erghea fg
+        rkprcg isf.AbFhpuSvyr:
+            erghea -reeab.RABRAG
+
+    qrs ernqqve(frys, cngu, bssfrg):
+        ybt('--ernqqve(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        lvryq shfr.Qveragel('.')
+        lvryq shfr.Qveragel('..')
+        sbe fho va abqr.fhof():
+            lvryq shfr.Qveragel(fho.anzr)
+
+    qrs ernqyvax(frys, cngu):
+        ybt('--ernqyvax(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        erghea abqr.ernqyvax()
+
+    qrs bcra(frys, cngu, syntf):
+        ybt('--bcra(%e)\a' % cngu)
+        abqr = pnpur_trg(frys.gbc, cngu)
+        nppzbqr = bf.B_EQBAYL | bf.B_JEBAYL | bf.B_EQJE
+        vs (syntf & nppzbqr) != bf.B_EQBAYL:
+            erghea -reeab.RNPPRF
+        abqr.bcra()
+
+    qrs eryrnfr(frys, cngu, syntf):
+        ybt('--eryrnfr(%e)\a' % cngu)
+
+    qrs ernq(frys, cngu, fvmr, bssfrg):
+        ybt('--ernq(%e)\a' % cngu)
+        a = pnpur_trg(frys.gbc, cngu)
+        b = a.bcra()
+        b.frrx(bssfrg)
+        erghea b.ernq(fvmr)
+
+
+vs abg unfngge(shfr, '__irefvba__'):
+    envfr EhagvzrReebe, "lbhe shfr zbqhyr vf gbb byq sbe shfr.__irefvba__"
+shfr.shfr_clguba_ncv = (0, 2)
+
+
+bcgfcrp = """
+ohc shfr [-q] [-s] <zbhagcbvag>
+--
+q,qroht   vapernfr qroht yriry
+s,sbertebhaq  eha va sbertebhaq
+"""
+b = bcgvbaf.Bcgvbaf('ohc shfr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs yra(rkgen) != 1:
+    b.sngny("rknpgyl bar nethzrag rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+gbc = isf.ErsYvfg(Abar)
+s = OhcSf(gbc)
+s.shfr_netf.zbhagcbvag = rkgen[0]
+vs bcg.qroht:
+    s.shfr_netf.nqq('qroht')
+vs bcg.sbertebhaq:
+    s.shfr_netf.frgzbq('sbertebhaq')
+cevag s.zhygvguernqrq
+s.zhygvguernqrq = Snyfr
+
+s.znva()
+#!/hfe/ova/rai clguba
+sebz ohc vzcbeg tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+[OHC_QVE=...] ohc vavg [-e ubfg:cngu]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc vavg', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+
+vs bcg.erzbgr:
+    tvg.vavg_ercb()  # ybpny ercb
+    tvg.purpx_ercb_be_qvr()
+    pyv = pyvrag.Pyvrag(bcg.erzbgr, perngr=Gehr)
+    pyv.pybfr()
+ryfr:
+    tvg.vavg_ercb()
+#!/hfe/ova/rai clguba
+vzcbeg flf, zngu, fgehpg, tybo
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+CNTR_FVMR=4096
+FUN_CRE_CNTR=CNTR_FVMR/200.
+
+
+qrs zretr(vqkyvfg, ovgf, gnoyr):
+    pbhag = 0
+    sbe r va tvg.vqkzretr(vqkyvfg):
+        pbhag += 1
+        cersvk = tvg.rkgenpg_ovgf(r, ovgf)
+        gnoyr[cersvk] = pbhag
+        lvryq r
+
+
+qrs qb_zvqk(bhgqve, bhgsvyranzr, vasvyranzrf):
+    vs abg bhgsvyranzr:
+        nffreg(bhgqve)
+        fhz = Fun1('\0'.wbva(vasvyranzrf)).urkqvtrfg()
+        bhgsvyranzr = '%f/zvqk-%f.zvqk' % (bhgqve, fhz)
+    
+    vac = []
+    gbgny = 0
+    sbe anzr va vasvyranzrf:
+        vk = tvg.CnpxVqk(anzr)
+        vac.nccraq(vk)
+        gbgny += yra(vk)
+
+    ybt('Zretvat %q vaqrkrf (%q bowrpgf).\a' % (yra(vasvyranzrf), gbgny))
+    vs (abg bcg.sbepr naq (gbgny < 1024 naq yra(vasvyranzrf) < 3)) \
+       be (bcg.sbepr naq abg gbgny):
+        ybt('zvqk: abguvat gb qb.\a')
+        erghea
+
+    cntrf = vag(gbgny/FUN_CRE_CNTR) be 1
+    ovgf = vag(zngu.prvy(zngu.ybt(cntrf, 2)))
+    ragevrf = 2**ovgf
+    ybt('Gnoyr fvmr: %q (%q ovgf)\a' % (ragevrf*4, ovgf))
+    
+    gnoyr = [0]*ragevrf
+
+    gel:
+        bf.hayvax(bhgsvyranzr)
+    rkprcg BFReebe:
+        cnff
+    s = bcra(bhgsvyranzr + '.gzc', 'j+')
+    s.jevgr('ZVQK\0\0\0\2')
+    s.jevgr(fgehpg.cnpx('!V', ovgf))
+    nffreg(s.gryy() == 12)
+    s.jevgr('\0'*4*ragevrf)
+    
+    sbe r va zretr(vac, ovgf, gnoyr):
+        s.jevgr(r)
+        
+    s.jevgr('\0'.wbva(bf.cngu.onfranzr(c) sbe c va vasvyranzrf))
+
+    s.frrx(12)
+    s.jevgr(fgehpg.cnpx('!%qV' % ragevrf, *gnoyr))
+    s.pybfr()
+    bf.eranzr(bhgsvyranzr + '.gzc', bhgsvyranzr)
+
+    # guvf vf whfg sbe grfgvat
+    vs 0:
+        c = tvg.CnpxZvqk(bhgsvyranzr)
+        nffreg(yra(c.vqkanzrf) == yra(vasvyranzrf))
+        cevag c.vqkanzrf
+        nffreg(yra(c) == gbgny)
+        cv = vgre(c)
+        sbe v va zretr(vac, gbgny, ovgf, gnoyr):
+            nffreg(v == cv.arkg())
+            nffreg(c.rkvfgf(v))
+
+    cevag bhgsvyranzr
+
+bcgfcrp = """
+ohc zvqk [bcgvbaf...] <vqkanzrf...>
+--
+b,bhgchg=  bhgchg zvqk svyranzr (qrsnhyg: nhgb-trarengrq)
+n,nhgb     nhgbzngvpnyyl perngr .zvqk sebz nal havaqrkrq .vqk svyrf
+s,sbepr    nhgbzngvpnyyl perngr .zvqk sebz *nyy* .vqk svyrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc zvqk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen naq (bcg.nhgb be bcg.sbepr):
+    b.sngny("lbh pna'g hfr -s/-n naq nyfb cebivqr svyranzrf")
+
+tvg.purpx_ercb_be_qvr()
+
+vs rkgen:
+    qb_zvqk(tvg.ercb('bowrpgf/cnpx'), bcg.bhgchg, rkgen)
+ryvs bcg.nhgb be bcg.sbepr:
+    cnguf = [tvg.ercb('bowrpgf/cnpx')]
+    cnguf += tybo.tybo(tvg.ercb('vaqrk-pnpur/*/.'))
+    sbe cngu va cnguf:
+        ybt('zvqk: fpnaavat %f\a' % cngu)
+        vs bcg.sbepr:
+            qb_zvqk(cngu, bcg.bhgchg, tybo.tybo('%f/*.vqk' % cngu))
+        ryvs bcg.nhgb:
+            z = tvg.CnpxVqkYvfg(cngu)
+            arrqrq = {}
+            sbe cnpx va z.cnpxf:  # bayl .vqk svyrf jvgubhg n .zvqk ner bcra
+                vs cnpx.anzr.raqfjvgu('.vqk'):
+                    arrqrq[cnpx.anzr] = 1
+            qry z
+            qb_zvqk(cngu, bcg.bhgchg, arrqrq.xrlf())
+        ybt('\a')
+ryfr:
+    b.sngny("lbh zhfg hfr -s be -n be cebivqr vachg svyranzrf")
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, enaqbz
+sebz ohc vzcbeg bcgvbaf
+sebz ohc.urycref vzcbeg *
+
+
+qrs enaqoybpx(a):
+    y = []
+    sbe v va kenatr(a):
+        y.nccraq(pue(enaqbz.enaqenatr(0,256)))
+    erghea ''.wbva(y)
+
+
+bcgfcrp = """
+ohc qnzntr [-a pbhag] [-f znkfvmr] [-F frrq] <svyranzrf...>
+--
+   JNEAVAT: GUVF PBZZNAQ VF RKGERZRYL QNATREBHF
+a,ahz=   ahzore bs oybpxf gb qnzntr
+f,fvmr=  znkvzhz fvmr bs rnpu qnzntrq oybpx
+creprag= znkvzhz fvmr bs rnpu qnzntrq oybpx (nf n creprag bs ragver svyr)
+rdhny    fcernq qnzntr rirayl guebhtubhg gur svyr
+F,frrq=  enaqbz ahzore frrq (sbe ercrngnoyr grfgf)
+"""
+b = bcgvbaf.Bcgvbaf('ohc qnzntr', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg rkgen:
+    b.sngny('svyranzrf rkcrpgrq')
+
+vs bcg.frrq != Abar:
+    enaqbz.frrq(bcg.frrq)
+
+sbe anzr va rkgen:
+    ybt('Qnzntvat "%f"...\a' % anzr)
+    s = bcra(anzr, 'e+o')
+    fg = bf.sfgng(s.svyrab())
+    fvmr = fg.fg_fvmr
+    vs bcg.creprag be bcg.fvmr:
+        zf1 = vag(sybng(bcg.creprag be 0)/100.0*fvmr) be fvmr
+        zf2 = bcg.fvmr be fvmr
+        znkfvmr = zva(zf1, zf2)
+    ryfr:
+        znkfvmr = 1
+    puhaxf = bcg.ahz be 10
+    puhaxfvmr = fvmr/puhaxf
+    sbe e va enatr(puhaxf):
+        fm = enaqbz.enaqenatr(1, znkfvmr+1)
+        vs fm > fvmr:
+            fm = fvmr
+        vs bcg.rdhny:
+            bsf = e*puhaxfvmr
+        ryfr:
+            bsf = enaqbz.enaqenatr(0, fvmr - fm + 1)
+        ybt('  %6q olgrf ng %q\a' % (fm, bsf))
+        s.frrx(bsf)
+        s.jevgr(enaqoybpx(fm))
+    s.pybfr()
+#!/hfe/ova/rai clguba
+vzcbeg flf, fgehpg, zznc
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+fhfcraqrq_j = Abar
+
+
+qrs vavg_qve(pbaa, net):
+    tvg.vavg_ercb(net)
+    ybt('ohc freire: ohcqve vavgvnyvmrq: %e\a' % tvg.ercbqve)
+    pbaa.bx()
+
+
+qrs frg_qve(pbaa, net):
+    tvg.purpx_ercb_be_qvr(net)
+    ybt('ohc freire: ohcqve vf %e\a' % tvg.ercbqve)
+    pbaa.bx()
+
+    
+qrs yvfg_vaqrkrf(pbaa, whax):
+    tvg.purpx_ercb_be_qvr()
+    sbe s va bf.yvfgqve(tvg.ercb('bowrpgf/cnpx')):
+        vs s.raqfjvgu('.vqk'):
+            pbaa.jevgr('%f\a' % s)
+    pbaa.bx()
+
+
+qrs fraq_vaqrk(pbaa, anzr):
+    tvg.purpx_ercb_be_qvr()
+    nffreg(anzr.svaq('/') < 0)
+    nffreg(anzr.raqfjvgu('.vqk'))
+    vqk = tvg.CnpxVqk(tvg.ercb('bowrpgf/cnpx/%f' % anzr))
+    pbaa.jevgr(fgehpg.cnpx('!V', yra(vqk.znc)))
+    pbaa.jevgr(vqk.znc)
+    pbaa.bx()
+
+
+qrs erprvir_bowrpgf(pbaa, whax):
+    tybony fhfcraqrq_j
+    tvg.purpx_ercb_be_qvr()
+    fhttrfgrq = {}
+    vs fhfcraqrq_j:
+        j = fhfcraqrq_j
+        fhfcraqrq_j = Abar
+    ryfr:
+        j = tvg.CnpxJevgre()
+    juvyr 1:
+        af = pbaa.ernq(4)
+        vs abg af:
+            j.nobeg()
+            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq yratgu urnqre, tbg RBS\a')
+        a = fgehpg.hacnpx('!V', af)[0]
+        #ybt('rkcrpgvat %q olgrf\a' % a)
+        vs abg a:
+            ybt('ohc freire: erprvirq %q bowrpg%f.\a' 
+                % (j.pbhag, j.pbhag!=1 naq "f" be ''))
+            shyycngu = j.pybfr()
+            vs shyycngu:
+                (qve, anzr) = bf.cngu.fcyvg(shyycngu)
+                pbaa.jevgr('%f.vqk\a' % anzr)
+            pbaa.bx()
+            erghea
+        ryvs a == 0kssssssss:
+            ybt('ohc freire: erprvir-bowrpgf fhfcraqrq.\a')
+            fhfcraqrq_j = j
+            pbaa.bx()
+            erghea
+            
+        ohs = pbaa.ernq(a)  # bowrpg fvmrf va ohc ner ernfbanoyl fznyy
+        #ybt('ernq %q olgrf\a' % a)
+        vs yra(ohs) < a:
+            j.nobeg()
+            envfr Rkprcgvba('bowrpg ernq: rkcrpgrq %q olgrf, tbg %q\a'
+                            % (a, yra(ohs)))
+        (glcr, pbagrag) = tvg._qrpbqr_cnpxbow(ohs)
+        fun = tvg.pnyp_unfu(glcr, pbagrag)
+        byqcnpx = j.rkvfgf(fun)
+        # SVKZR: jr bayl fhttrfg n fvatyr vaqrk cre plpyr, orpnhfr gur pyvrag
+        # vf pheeragyl qhzo gb qbjaybnq zber guna bar cre plpyr naljnl.
+        # Npghnyyl jr fubhyq svk gur pyvrag, ohg guvf vf n zvabe bcgvzvmngvba
+        # ba gur freire fvqr.
+        vs abg fhttrfgrq naq \
+          byqcnpx naq (byqcnpx == Gehr be byqcnpx.raqfjvgu('.zvqk')):
+            # SVKZR: jr fubhyqa'g ernyyl unir gb xabj nobhg zvqk svyrf
+            # ng guvf ynlre.  Ohg rkvfgf() ba n zvqk qbrfa'g erghea gur
+            # cnpxanzr (fvapr vg qbrfa'g xabj)... cebonoyl jr fubhyq whfg
+            # svk gung qrsvpvrapl bs zvqk svyrf riraghnyyl, nygubhtu vg'yy
+            # znxr gur svyrf ovttre.  Guvf zrgubq vf pregnvayl abg irel
+            # rssvpvrag.
+            j.bowpnpur.erserfu(fxvc_zvqk = Gehr)
+            byqcnpx = j.bowpnpur.rkvfgf(fun)
+            ybt('arj fhttrfgvba: %e\a' % byqcnpx)
+            nffreg(byqcnpx)
+            nffreg(byqcnpx != Gehr)
+            nffreg(abg byqcnpx.raqfjvgu('.zvqk'))
+            j.bowpnpur.erserfu(fxvc_zvqk = Snyfr)
+        vs abg fhttrfgrq naq byqcnpx:
+            nffreg(byqcnpx.raqfjvgu('.vqk'))
+            (qve,anzr) = bf.cngu.fcyvg(byqcnpx)
+            vs abg (anzr va fhttrfgrq):
+                ybt("ohc freire: fhttrfgvat vaqrk %f\a" % anzr)
+                pbaa.jevgr('vaqrk %f\a' % anzr)
+                fhttrfgrq[anzr] = 1
+        ryfr:
+            j._enj_jevgr([ohs])
+    # ABGERNPURQ
+
+
+qrs ernq_ers(pbaa, ersanzr):
+    tvg.purpx_ercb_be_qvr()
+    e = tvg.ernq_ers(ersanzr)
+    pbaa.jevgr('%f\a' % (e be '').rapbqr('urk'))
+    pbaa.bx()
+
+
+qrs hcqngr_ers(pbaa, ersanzr):
+    tvg.purpx_ercb_be_qvr()
+    arjiny = pbaa.ernqyvar().fgevc()
+    byqiny = pbaa.ernqyvar().fgevc()
+    tvg.hcqngr_ers(ersanzr, arjiny.qrpbqr('urk'), byqiny.qrpbqr('urk'))
+    pbaa.bx()
+
+
+qrs png(pbaa, vq):
+    tvg.purpx_ercb_be_qvr()
+    gel:
+        sbe oybo va tvg.png(vq):
+            pbaa.jevgr(fgehpg.cnpx('!V', yra(oybo)))
+            pbaa.jevgr(oybo)
+    rkprcg XrlReebe, r:
+        ybt('freire: reebe: %f\a' % r)
+        pbaa.jevgr('\0\0\0\0')
+        pbaa.reebe(r)
+    ryfr:
+        pbaa.jevgr('\0\0\0\0')
+        pbaa.bx()
+
+
+bcgfcrp = """
+ohc freire
+"""
+b = bcgvbaf.Bcgvbaf('ohc freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+ybt('ohc freire: ernqvat sebz fgqva.\a')
+
+pbzznaqf = {
+    'vavg-qve': vavg_qve,
+    'frg-qve': frg_qve,
+    'yvfg-vaqrkrf': yvfg_vaqrkrf,
+    'fraq-vaqrk': fraq_vaqrk,
+    'erprvir-bowrpgf': erprvir_bowrpgf,
+    'ernq-ers': ernq_ers,
+    'hcqngr-ers': hcqngr_ers,
+    'png': png,
+}
+
+# SVKZR: guvf cebgbpby vf gbgnyyl ynzr naq abg ng nyy shgher-cebbs.
+# (Rfcrpvnyyl fvapr jr nobeg pbzcyrgryl nf fbba nf *nalguvat* onq unccraf)
+pbaa = Pbaa(flf.fgqva, flf.fgqbhg)
+ye = yvarernqre(pbaa)
+sbe _yvar va ye:
+    yvar = _yvar.fgevc()
+    vs abg yvar:
+        pbagvahr
+    ybt('ohc freire: pbzznaq: %e\a' % yvar)
+    jbeqf = yvar.fcyvg(' ', 1)
+    pzq = jbeqf[0]
+    erfg = yra(jbeqf)>1 naq jbeqf[1] be ''
+    vs pzq == 'dhvg':
+        oernx
+    ryfr:
+        pzq = pbzznaqf.trg(pzq)
+        vs pzq:
+            pzq(pbaa, erfg)
+        ryfr:
+            envfr Rkprcgvba('haxabja freire pbzznaq: %e\a' % yvar)
+
+ybt('ohc freire: qbar\a')
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr, fgehpg
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, pyvrag
+sebz ohc.urycref vzcbeg *
+sebz fhocebprff vzcbeg CVCR
+
+
+bcgfcrp = """
+ohc wbva [-e ubfg:cngu] [ersf be unfurf...]
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+"""
+b = bcgvbaf.Bcgvbaf('ohc wbva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+    rkgen = yvarernqre(flf.fgqva)
+
+erg = 0
+
+vs bcg.erzbgr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    png = pyv.png
+ryfr:
+    pc = tvg.PngCvcr()
+    png = pc.wbva
+
+sbe vq va rkgen:
+    gel:
+        sbe oybo va png(vq):
+            flf.fgqbhg.jevgr(oybo)
+    rkprcg XrlReebe, r:
+        flf.fgqbhg.syhfu()
+        ybt('reebe: %f\a' % r)
+        erg = 1
+
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, er, reeab, fgng, gvzr, zngu
+sebz ohc vzcbeg unfufcyvg, tvg, bcgvbaf, vaqrk, pyvrag
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc fnir [-gp] [-a anzr] <svyranzrf...>
+--
+e,erzbgr=  erzbgr ercbfvgbel cngu
+g,gerr     bhgchg n gerr vq
+p,pbzzvg   bhgchg n pbzzvg vq
+a,anzr=    anzr bs onpxhc frg gb hcqngr (vs nal)
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+d,dhvrg    qba'g fubj cebterff zrgre
+fznyyre=   bayl onpx hc svyrf fznyyre guna a olgrf
+"""
+b = bcgvbaf.Bcgvbaf('ohc fnir', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+tvg.purpx_ercb_be_qvr()
+vs abg (bcg.gerr be bcg.pbzzvg be bcg.anzr):
+    b.sngny("hfr bar be zber bs -g, -p, -a")
+vs abg rkgen:
+    b.sngny("ab svyranzrf tvira")
+
+bcg.cebterff = (vfggl naq abg bcg.dhvrg)
+bcg.fznyyre = cnefr_ahz(bcg.fznyyre be 0)
+
+vf_erirefr = bf.raiveba.trg('OHC_FREIRE_ERIREFR')
+vs vf_erirefr naq bcg.erzbgr:
+    b.sngny("qba'g hfr -e va erirefr zbqr; vg'f nhgbzngvp")
+
+ersanzr = bcg.anzr naq 'ersf/urnqf/%f' % bcg.anzr be Abar
+vs bcg.erzbgr be vf_erirefr:
+    pyv = pyvrag.Pyvrag(bcg.erzbgr)
+    byqers = ersanzr naq pyv.ernq_ers(ersanzr) be Abar
+    j = pyv.arj_cnpxjevgre()
+ryfr:
+    pyv = Abar
+    byqers = ersanzr naq tvg.ernq_ers(ersanzr) be Abar
+    j = tvg.CnpxJevgre()
+
+unaqyr_pgey_p()
+
+
+qrs rngfynfu(qve):
+    vs qve.raqfjvgu('/'):
+        erghea qve[:-1]
+    ryfr:
+        erghea qve
+
+
+cnegf = ['']
+funyvfgf = [[]]
+
+qrs _chfu(cneg):
+    nffreg(cneg)
+    cnegf.nccraq(cneg)
+    funyvfgf.nccraq([])
+
+qrs _cbc(sbepr_gerr):
+    nffreg(yra(cnegf) >= 1)
+    cneg = cnegf.cbc()
+    funyvfg = funyvfgf.cbc()
+    gerr = sbepr_gerr be j.arj_gerr(funyvfg)
+    vs funyvfgf:
+        funyvfgf[-1].nccraq(('40000', cneg, gerr))
+    ryfr:  # guvf jnf gur gbcyriry, fb chg vg onpx sbe fnavgl
+        funyvfgf.nccraq(funyvfg)
+    erghea gerr
+
+ynfgerznva = Abar
+qrs cebterff_ercbeg(a):
+    tybony pbhag, fhopbhag, ynfgerznva
+    fhopbhag += a
+    pp = pbhag + fhopbhag
+    cpg = gbgny naq (pp*100.0/gbgny) be 0
+    abj = gvzr.gvzr()
+    ryncfrq = abj - gfgneg
+    xcf = ryncfrq naq vag(pp/1024./ryncfrq)
+    xcf_senp = 10 ** vag(zngu.ybt(xcf+1, 10) - 1)
+    xcf = vag(xcf/xcf_senp)*xcf_senp
+    vs pp:
+        erznva = ryncfrq*1.0/pp * (gbgny-pp)
+    ryfr:
+        erznva = 0.0
+    vs (ynfgerznva naq (erznva > ynfgerznva)
+          naq ((erznva - ynfgerznva)/ynfgerznva < 0.05)):
+        erznva = ynfgerznva
+    ryfr:
+        ynfgerznva = erznva
+    ubhef = vag(erznva/60/60)
+    zvaf = vag(erznva/60 - ubhef*60)
+    frpf = vag(erznva - ubhef*60*60 - zvaf*60)
+    vs ryncfrq < 30:
+        erznvafge = ''
+        xcffge = ''
+    ryfr:
+        xcffge = '%qx/f' % xcf
+        vs ubhef:
+            erznvafge = '%qu%qz' % (ubhef, zvaf)
+        ryvs zvaf:
+            erznvafge = '%qz%q' % (zvaf, frpf)
+        ryfr:
+            erznvafge = '%qf' % frpf
+    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf) %f %f\e'
+             % (cpg, pp/1024, gbgny/1024, spbhag, sgbgny,
+                erznvafge, xcffge))
+
+
+e = vaqrk.Ernqre(tvg.ercb('ohcvaqrk'))
+
+qrs nyernql_fnirq(rag):
+    erghea rag.vf_inyvq() naq j.rkvfgf(rag.fun) naq rag.fun
+
+qrs jnagerphefr_cer(rag):
+    erghea abg nyernql_fnirq(rag)
+
+qrs jnagerphefr_qhevat(rag):
+    erghea abg nyernql_fnirq(rag) be rag.fun_zvffvat()
+
+gbgny = sgbgny = 0
+vs bcg.cebterff:
+    sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_cer):
+        vs abg (sgbgny % 10024):
+            cebterff('Ernqvat vaqrk: %q\e' % sgbgny)
+        rkvfgf = rag.rkvfgf()
+        unfuinyvq = nyernql_fnirq(rag)
+        rag.frg_fun_zvffvat(abg unfuinyvq)
+        vs abg bcg.fznyyre be rag.fvmr < bcg.fznyyre:
+            vs rkvfgf naq abg unfuinyvq:
+                gbgny += rag.fvmr
+        sgbgny += 1
+    cebterff('Ernqvat vaqrk: %q, qbar.\a' % sgbgny)
+    unfufcyvg.cebterff_pnyyonpx = cebterff_ercbeg
+
+gfgneg = gvzr.gvzr()
+pbhag = fhopbhag = spbhag = 0
+ynfgfxvc_anzr = Abar
+ynfgqve = ''
+sbe (genafanzr,rag) va e.svygre(rkgen, jnagerphefr=jnagerphefr_qhevat):
+    (qve, svyr) = bf.cngu.fcyvg(rag.anzr)
+    rkvfgf = (rag.syntf & vaqrk.VK_RKVFGF)
+    unfuinyvq = nyernql_fnirq(rag)
+    jnfzvffvat = rag.fun_zvffvat()
+    byqfvmr = rag.fvmr
+    vs bcg.ireobfr:
+        vs abg rkvfgf:
+            fgnghf = 'Q'
+        ryvs abg unfuinyvq:
+            vs rag.fun == vaqrk.RZCGL_FUN:
+                fgnghf = 'N'
+            ryfr:
+                fgnghf = 'Z'
+        ryfr:
+            fgnghf = ' '
+        vs bcg.ireobfr >= 2:
+            ybt('%f %-70f\a' % (fgnghf, rag.anzr))
+        ryvs abg fgng.F_VFQVE(rag.zbqr) naq ynfgqve != qve:
+            vs abg ynfgqve.fgnegfjvgu(qve):
+                ybt('%f %-70f\a' % (fgnghf, bf.cngu.wbva(qve, '')))
+            ynfgqve = qve
+
+    vs bcg.cebterff:
+        cebterff_ercbeg(0)
+    spbhag += 1
+    
+    vs abg rkvfgf:
+        pbagvahr
+    vs bcg.fznyyre naq rag.fvmr >= bcg.fznyyre:
+        vs rkvfgf naq abg unfuinyvq:
+            nqq_reebe('fxvccvat ynetr svyr "%f"' % rag.anzr)
+            ynfgfxvc_anzr = rag.anzr
+        pbagvahr
+
+    nffreg(qve.fgnegfjvgu('/'))
+    qvec = qve.fcyvg('/')
+    juvyr cnegf > qvec:
+        _cbc(sbepr_gerr = Abar)
+    vs qve != '/':
+        sbe cneg va qvec[yra(cnegf):]:
+            _chfu(cneg)
+
+    vs abg svyr:
+        # ab svyranzr cbegvba zrnaf guvf vf n fhoqve.  Ohg
+        # fho/cneragqverpgbevrf nyernql unaqyrq va gur cbc/chfu() cneg nobir.
+        byqgerr = nyernql_fnirq(rag) # znl or Abar
+        arjgerr = _cbc(sbepr_gerr = byqgerr)
+        vs abg byqgerr:
+            vs ynfgfxvc_anzr naq ynfgfxvc_anzr.fgnegfjvgu(rag.anzr):
+                rag.vainyvqngr()
+            ryfr:
+                rag.inyvqngr(040000, arjgerr)
+            rag.ercnpx()
+        vs rkvfgf naq jnfzvffvat:
+            pbhag += byqfvmr
+        pbagvahr
+
+    # vg'f abg n qverpgbel
+    vq = Abar
+    vs unfuinyvq:
+        zbqr = '%b' % rag.tvgzbqr
+        vq = rag.fun
+        funyvfgf[-1].nccraq((zbqr, 
+                             tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+                             vq))
+    ryfr:
+        vs fgng.F_VFERT(rag.zbqr):
+            gel:
+                s = unfufcyvg.bcra_abngvzr(rag.anzr)
+            rkprcg VBReebe, r:
+                nqq_reebe(r)
+                ynfgfxvc_anzr = rag.anzr
+            rkprcg BFReebe, r:
+                nqq_reebe(r)
+                ynfgfxvc_anzr = rag.anzr
+            ryfr:
+                (zbqr, vq) = unfufcyvg.fcyvg_gb_oybo_be_gerr(j, [s])
+        ryfr:
+            vs fgng.F_VFQVE(rag.zbqr):
+                nffreg(0)  # unaqyrq nobir
+            ryvs fgng.F_VFYAX(rag.zbqr):
+                gel:
+                    ey = bf.ernqyvax(rag.anzr)
+                rkprcg BFReebe, r:
+                    nqq_reebe(r)
+                    ynfgfxvc_anzr = rag.anzr
+                rkprcg VBReebe, r:
+                    nqq_reebe(r)
+                    ynfgfxvc_anzr = rag.anzr
+                ryfr:
+                    (zbqr, vq) = ('120000', j.arj_oybo(ey))
+            ryfr:
+                nqq_reebe(Rkprcgvba('fxvccvat fcrpvny svyr "%f"' % rag.anzr))
+                ynfgfxvc_anzr = rag.anzr
+        vs vq:
+            rag.inyvqngr(vag(zbqr, 8), vq)
+            rag.ercnpx()
+            funyvfgf[-1].nccraq((zbqr,
+                                 tvg.znatyr_anzr(svyr, rag.zbqr, rag.tvgzbqr),
+                                 vq))
+    vs rkvfgf naq jnfzvffvat:
+        pbhag += byqfvmr
+        fhopbhag = 0
+
+
+vs bcg.cebterff:
+    cpg = gbgny naq pbhag*100.0/gbgny be 100
+    cebterff('Fnivat: %.2s%% (%q/%qx, %q/%q svyrf), qbar.    \a'
+             % (cpg, pbhag/1024, gbgny/1024, spbhag, sgbgny))
+
+juvyr yra(cnegf) > 1:
+    _cbc(sbepr_gerr = Abar)
+nffreg(yra(funyvfgf) == 1)
+gerr = j.arj_gerr(funyvfgf[-1])
+vs bcg.gerr:
+    cevag gerr.rapbqr('urk')
+vs bcg.pbzzvg be bcg.anzr:
+    zft = 'ohc fnir\a\aTrarengrq ol pbzznaq:\a%e' % flf.neti
+    ers = bcg.anzr naq ('ersf/urnqf/%f' % bcg.anzr) be Abar
+    pbzzvg = j.arj_pbzzvg(byqers, gerr, zft)
+    vs bcg.pbzzvg:
+        cevag pbzzvg.rapbqr('urk')
+
+j.pybfr()  # zhfg pybfr orsber jr pna hcqngr gur ers
+        
+vs bcg.anzr:
+    vs pyv:
+        pyv.hcqngr_ers(ersanzr, pbzzvg, byqers)
+    ryfr:
+        tvg.hcqngr_ers(ersanzr, pbzzvg, byqers)
+
+vs pyv:
+    pyv.pybfr()
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq juvyr fnivat.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, gvzr
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc gvpx
+"""
+b = bcgvbaf.Bcgvbaf('ohc gvpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+g = gvzr.gvzr()
+gyrsg = 1 - (g - vag(g))
+gvzr.fyrrc(gyrsg)
+#!/hfe/ova/rai clguba
+vzcbeg bf, flf, fgng, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg, vaqrk, qerphefr
+sebz ohc.urycref vzcbeg *
+
+
+qrs zretr_vaqrkrf(bhg, e1, e2):
+    sbe r va vaqrk.ZretrVgre([e1, e2]):
+        # SVKZR: fubhyqa'g jr erzbir qryrgrq ragevrf riraghnyyl?  Jura?
+        bhg.nqq_vkragel(r)
+
+
+pynff VgreUrycre:
+    qrs __vavg__(frys, y):
+        frys.v = vgre(y)
+        frys.phe = Abar
+        frys.arkg()
+
+    qrs arkg(frys):
+        gel:
+            frys.phe = frys.v.arkg()
+        rkprcg FgbcVgrengvba:
+            frys.phe = Abar
+        erghea frys.phe
+
+
+qrs purpx_vaqrk(ernqre):
+    gel:
+        ybt('purpx: purpxvat sbejneq vgrengvba...\a')
+        r = Abar
+        q = {}
+        sbe r va ernqre.sbejneq_vgre():
+            vs r.puvyqera_a:
+                vs bcg.ireobfr:
+                    ybt('%08k+%-4q %e\a' % (r.puvyqera_bsf, r.puvyqera_a,
+                                            r.anzr))
+                nffreg(r.puvyqera_bsf)
+                nffreg(r.anzr.raqfjvgu('/'))
+                nffreg(abg q.trg(r.puvyqera_bsf))
+                q[r.puvyqera_bsf] = 1
+            vs r.syntf & vaqrk.VK_UNFUINYVQ:
+                nffreg(r.fun != vaqrk.RZCGL_FUN)
+                nffreg(r.tvgzbqr)
+        nffreg(abg r be r.anzr == '/')  # ynfg ragel vf *nyjnlf* /
+        ybt('purpx: purpxvat abezny vgrengvba...\a')
+        ynfg = Abar
+        sbe r va ernqre:
+            vs ynfg:
+                nffreg(ynfg > r.anzr)
+            ynfg = r.anzr
+    rkprcg:
+        ybt('vaqrk reebe! ng %e\a' % r)
+        envfr
+    ybt('purpx: cnffrq.\a')
+
+
+qrs hcqngr_vaqrk(gbc):
+    ev = vaqrk.Ernqre(vaqrksvyr)
+    jv = vaqrk.Jevgre(vaqrksvyr)
+    evt = VgreUrycre(ev.vgre(anzr=gbc))
+    gfgneg = vag(gvzr.gvzr())
+
+    unfutra = Abar
+    vs bcg.snxr_inyvq:
+        qrs unfutra(anzr):
+            erghea (0100644, vaqrk.SNXR_FUN)
+
+    gbgny = 0
+    sbe (cngu,cfg) va qerphefr.erphefvir_qveyvfg([gbc], kqri=bcg.kqri):
+        vs bcg.ireobfr>=2 be (bcg.ireobfr==1 naq fgng.F_VFQVE(cfg.fg_zbqr)):
+            flf.fgqbhg.jevgr('%f\a' % cngu)
+            flf.fgqbhg.syhfu()
+            cebterff('Vaqrkvat: %q\e' % gbgny)
+        ryvs abg (gbgny % 128):
+            cebterff('Vaqrkvat: %q\e' % gbgny)
+        gbgny += 1
+        juvyr evt.phe naq evt.phe.anzr > cngu:  # qryrgrq cnguf
+            vs evt.phe.rkvfgf():
+                evt.phe.frg_qryrgrq()
+                evt.phe.ercnpx()
+            evt.arkg()
+        vs evt.phe naq evt.phe.anzr == cngu:    # cnguf gung nyernql rkvfgrq
+            vs cfg:
+                evt.phe.sebz_fgng(cfg, gfgneg)
+            vs abg (evt.phe.syntf & vaqrk.VK_UNFUINYVQ):
+                vs unfutra:
+                    (evt.phe.tvgzbqr, evt.phe.fun) = unfutra(cngu)
+                    evt.phe.syntf |= vaqrk.VK_UNFUINYVQ
+            vs bcg.snxr_vainyvq:
+                evt.phe.vainyvqngr()
+            evt.phe.ercnpx()
+            evt.arkg()
+        ryfr:  # arj cnguf
+            jv.nqq(cngu, cfg, unfutra = unfutra)
+    cebterff('Vaqrkvat: %q, qbar.\a' % gbgny)
+    
+    vs ev.rkvfgf():
+        ev.fnir()
+        jv.syhfu()
+        vs jv.pbhag:
+            je = jv.arj_ernqre()
+            vs bcg.purpx:
+                ybt('purpx: orsber zretvat: byqsvyr\a')
+                purpx_vaqrk(ev)
+                ybt('purpx: orsber zretvat: arjsvyr\a')
+                purpx_vaqrk(je)
+            zv = vaqrk.Jevgre(vaqrksvyr)
+            zretr_vaqrkrf(zv, ev, je)
+            ev.pybfr()
+            zv.pybfr()
+            je.pybfr()
+        jv.nobeg()
+    ryfr:
+        jv.pybfr()
+
+
+bcgfcrp = """
+ohc vaqrk <-c|z|h> [bcgvbaf...] <svyranzrf...>
+--
+c,cevag    cevag gur vaqrk ragevrf sbe gur tvira anzrf (nyfb jbexf jvgu -h)
+z,zbqvsvrq cevag bayl nqqrq/qryrgrq/zbqvsvrq svyrf (vzcyvrf -c)
+f,fgnghf   cevag rnpu svyranzr jvgu n fgnghf pune (N/Z/Q) (vzcyvrf -c)
+U,unfu     cevag gur unfu sbe rnpu bowrpg arkg gb vgf anzr (vzcyvrf -c)
+y,ybat     cevag zber vasbezngvba nobhg rnpu svyr
+h,hcqngr   (erphefviryl) hcqngr gur vaqrk ragevrf sbe gur tvira svyranzrf
+k,kqri,bar-svyr-flfgrz  qba'g pebff svyrflfgrz obhaqnevrf
+snxr-inyvq znex nyy vaqrk ragevrf nf hc-gb-qngr rira vs gurl nera'g
+snxr-vainyvq znex nyy vaqrk ragevrf nf vainyvq
+purpx      pnershyyl purpx vaqrk svyr vagrtevgl
+s,vaqrksvyr=  gur anzr bs gur vaqrk svyr (qrsnhyg 'vaqrk')
+i,ireobfr  vapernfr ybt bhgchg (pna or hfrq zber guna bapr)
+"""
+b = bcgvbaf.Bcgvbaf('ohc vaqrk', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs abg (bcg.zbqvsvrq be bcg['cevag'] be bcg.fgnghf be bcg.hcqngr be bcg.purpx):
+    b.sngny('fhccyl bar be zber bs -c, -f, -z, -h, be --purpx')
+vs (bcg.snxr_inyvq be bcg.snxr_vainyvq) naq abg bcg.hcqngr:
+    b.sngny('--snxr-{va,}inyvq ner zrnavatyrff jvgubhg -h')
+vs bcg.snxr_inyvq naq bcg.snxr_vainyvq:
+    b.sngny('--snxr-inyvq vf vapbzcngvoyr jvgu --snxr-vainyvq')
+
+tvg.purpx_ercb_be_qvr()
+vaqrksvyr = bcg.vaqrksvyr be tvg.ercb('ohcvaqrk')
+
+unaqyr_pgey_p()
+
+vs bcg.purpx:
+    ybt('purpx: fgnegvat vavgvny purpx.\a')
+    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+cnguf = vaqrk.erqhpr_cnguf(rkgen)
+
+vs bcg.hcqngr:
+    vs abg cnguf:
+        b.sngny('hcqngr (-h) erdhrfgrq ohg ab cnguf tvira')
+    sbe (ec,cngu) va cnguf:
+        hcqngr_vaqrk(ec)
+
+vs bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq:
+    sbe (anzr, rag) va vaqrk.Ernqre(vaqrksvyr).svygre(rkgen be ['']):
+        vs (bcg.zbqvsvrq 
+            naq (rag.vf_inyvq() be rag.vf_qryrgrq() be abg rag.zbqr)):
+            pbagvahr
+        yvar = ''
+        vs bcg.fgnghf:
+            vs rag.vf_qryrgrq():
+                yvar += 'Q '
+            ryvs abg rag.vf_inyvq():
+                vs rag.fun == vaqrk.RZCGL_FUN:
+                    yvar += 'N '
+                ryfr:
+                    yvar += 'Z '
+            ryfr:
+                yvar += '  '
+        vs bcg.unfu:
+            yvar += rag.fun.rapbqr('urk') + ' '
+        vs bcg.ybat:
+            yvar += "%7f %7f " % (bpg(rag.zbqr), bpg(rag.tvgzbqr))
+        cevag yvar + (anzr be './')
+
+vs bcg.purpx naq (bcg['cevag'] be bcg.fgnghf be bcg.zbqvsvrq be bcg.hcqngr):
+    ybt('purpx: fgnegvat svany purpx.\a')
+    purpx_vaqrk(vaqrk.Ernqre(vaqrksvyr))
+
+vs fnirq_reebef:
+    ybt('JNEAVAT: %q reebef rapbhagrerq.\a' % yra(fnirq_reebef))
+    flf.rkvg(1)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg
+sebz ohc vzcbeg bcgvbaf, urycref
+
+bcgfcrp = """
+ohc eonpxhc-freire
+--
+    Guvf pbzznaq vf abg vagraqrq gb or eha znahnyyl.
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc-freire', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs rkgen:
+    b.sngny('ab nethzragf rkcrpgrq')
+
+# trg gur fhopbzznaq'f neti.
+# Abeznyyl jr pbhyq whfg cnff guvf ba gur pbzznaq yvar, ohg fvapr jr'yy bsgra
+# or trggvat pnyyrq ba gur bgure raq bs na ffu cvcr, juvpu graqf gb znatyr
+# neti (ol fraqvat vg ivn gur furyy), guvf jnl vf zhpu fnsre.
+ohs = flf.fgqva.ernq(4)
+fm = fgehpg.hacnpx('!V', ohs)[0]
+nffreg(fm > 0)
+nffreg(fm < 1000000)
+ohs = flf.fgqva.ernq(fm)
+nffreg(yra(ohs) == fm)
+neti = ohs.fcyvg('\0')
+
+# fgqva/fgqbhg ner fhccbfrqyl pbaarpgrq gb 'ohc freire' gung gur pnyyre
+# fgnegrq sbe hf (bsgra ba gur bgure raq bs na ffu ghaary), fb jr qba'g jnag
+# gb zvfhfr gurz.  Zbir gurz bhg bs gur jnl, gura ercynpr fgqbhg jvgu
+# n cbvagre gb fgqree va pnfr bhe fhopbzznaq jnagf gb qb fbzrguvat jvgu vg.
+#
+# Vg zvtug or avpr gb qb gur fnzr jvgu fgqva, ohg zl rkcrevzragf fubjrq gung
+# ffu frrzf gb znxr vgf puvyq'f fgqree n ernqnoyr-ohg-arire-ernqf-nalguvat
+# fbpxrg.  Gurl ernyyl fubhyq unir hfrq fuhgqbja(FUHG_JE) ba gur bgure raq
+# bs vg, ohg cebonoyl qvqa'g.  Naljnl, vg'f gbb zrffl, fb yrg'f whfg znxr fher
+# nalbar ernqvat sebz fgqva vf qvfnccbvagrq.
+#
+# (Lbh pna'g whfg yrnir fgqva/fgqbhg "abg bcra" ol pybfvat gur svyr
+# qrfpevcgbef.  Gura gur arkg svyr gung bcraf vf nhgbzngvpnyyl nffvtarq 0 be 1,
+# naq crbcyr *gelvat* gb ernq/jevgr fgqva/fgqbhg trg fperjrq.)
+bf.qhc2(0, 3)
+bf.qhc2(1, 4)
+bf.qhc2(2, 1)
+sq = bf.bcra('/qri/ahyy', bf.B_EQBAYL)
+bf.qhc2(sq, 0)
+bf.pybfr(sq)
+
+bf.raiveba['OHC_FREIRE_ERIREFR'] = urycref.ubfganzr()
+bf.rkrpic(neti[0], neti)
+flf.rkvg(99)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, tybo, fhocebprff, gvzr
+sebz ohc vzcbeg bcgvbaf, tvg
+sebz ohc.urycref vzcbeg *
+
+cne2_bx = 0
+ahyys = bcra('/qri/ahyy')
+
+qrs qroht(f):
+    vs bcg.ireobfr:
+        ybt(f)
+
+qrs eha(neti):
+    # ng yrnfg va clguba 2.5, hfvat "fgqbhg=2" be "fgqbhg=flf.fgqree" orybj
+    # qbrfa'g npghnyyl jbex, orpnhfr fhocebprff pybfrf sq #2 evtug orsber
+    # rkrpvat sbe fbzr ernfba.  Fb jr jbex nebhaq vg ol qhcyvpngvat gur sq
+    # svefg.
+    sq = bf.qhc(2)  # pbcl fgqree
+    gel:
+        c = fhocebprff.Cbcra(neti, fgqbhg=sq, pybfr_sqf=Snyfr)
+        erghea c.jnvg()
+    svanyyl:
+        bf.pybfr(sq)
+
+qrs cne2_frghc():
+    tybony cne2_bx
+    ei = 1
+    gel:
+        c = fhocebprff.Cbcra(['cne2', '--uryc'],
+                             fgqbhg=ahyys, fgqree=ahyys, fgqva=ahyys)
+        ei = c.jnvg()
+    rkprcg BFReebe:
+        ybt('sfpx: jneavat: cne2 abg sbhaq; qvfnoyvat erpbirel srngherf.\a')
+    ryfr:
+        cne2_bx = 1
+
+qrs cnei(yiy):
+    vs bcg.ireobfr >= yiy:
+        vs vfggl:
+            erghea []
+        ryfr:
+            erghea ['-d']
+    ryfr:
+        erghea ['-dd']
+
+qrs cne2_trarengr(onfr):
+    erghea eha(['cne2', 'perngr', '-a1', '-p200'] + cnei(2)
+               + ['--', onfr, onfr+'.cnpx', onfr+'.vqk'])
+
+qrs cne2_irevsl(onfr):
+    erghea eha(['cne2', 'irevsl'] + cnei(3) + ['--', onfr])
+
+qrs cne2_ercnve(onfr):
+    erghea eha(['cne2', 'ercnve'] + cnei(2) + ['--', onfr])
+
+qrs dhvpx_irevsl(onfr):
+    s = bcra(onfr + '.cnpx', 'eo')
+    s.frrx(-20, 2)
+    jnagfhz = s.ernq(20)
+    nffreg(yra(jnagfhz) == 20)
+    s.frrx(0)
+    fhz = Fun1()
+    sbe o va puhaxlernqre(s, bf.sfgng(s.svyrab()).fg_fvmr - 20):
+        fhz.hcqngr(o)
+    vs fhz.qvtrfg() != jnagfhz:
+        envfr InyhrReebe('rkcrpgrq %e, tbg %e' % (jnagfhz.rapbqr('urk'),
+                                                  fhz.urkqvtrfg()))
+        
+
+qrs tvg_irevsl(onfr):
+    vs bcg.dhvpx:
+        gel:
+            dhvpx_irevsl(onfr)
+        rkprcg Rkprcgvba, r:
+            qroht('reebe: %f\a' % r)
+            erghea 1
+        erghea 0
+    ryfr:
+        erghea eha(['tvg', 'irevsl-cnpx', '--', onfr])
+    
+    
+qrs qb_cnpx(onfr, ynfg):
+    pbqr = 0
+    vs cne2_bx naq cne2_rkvfgf naq (bcg.ercnve be abg bcg.trarengr):
+        ierfhyg = cne2_irevsl(onfr)
+        vs ierfhyg != 0:
+            vs bcg.ercnve:
+                eerfhyg = cne2_ercnve(onfr)
+                vs eerfhyg != 0:
+                    cevag '%f cne2 ercnve: snvyrq (%q)' % (ynfg, eerfhyg)
+                    pbqr = eerfhyg
+                ryfr:
+                    cevag '%f cne2 ercnve: fhpprrqrq (0)' % ynfg
+                    pbqr = 100
+            ryfr:
+                cevag '%f cne2 irevsl: snvyrq (%q)' % (ynfg, ierfhyg)
+                pbqr = ierfhyg
+        ryfr:
+            cevag '%f bx' % ynfg
+    ryvs abg bcg.trarengr be (cne2_bx naq abg cne2_rkvfgf):
+        terfhyg = tvg_irevsl(onfr)
+        vs terfhyg != 0:
+            cevag '%f tvg irevsl: snvyrq (%q)' % (ynfg, terfhyg)
+            pbqr = terfhyg
+        ryfr:
+            vs cne2_bx naq bcg.trarengr:
+                cerfhyg = cne2_trarengr(onfr)
+                vs cerfhyg != 0:
+                    cevag '%f cne2 perngr: snvyrq (%q)' % (ynfg, cerfhyg)
+                    pbqr = cerfhyg
+                ryfr:
+                    cevag '%f bx' % ynfg
+            ryfr:
+                cevag '%f bx' % ynfg
+    ryfr:
+        nffreg(bcg.trarengr naq (abg cne2_bx be cne2_rkvfgf))
+        qroht('    fxvccrq: cne2 svyr nyernql trarengrq.\a')
+    erghea pbqr
+
+
+bcgfcrp = """
+ohc sfpx [bcgvbaf...] [svyranzrf...]
+--
+e,ercnve    nggrzcg gb ercnve reebef hfvat cne2 (qnatrebhf!)
+t,trarengr  trarengr nhgb-ercnve vasbezngvba hfvat cne2
+i,ireobfr   vapernfr ireobfvgl (pna or hfrq zber guna bapr)
+dhvpx       whfg purpx cnpx fun1fhz, qba'g hfr tvg irevsl-cnpx
+w,wbof=     eha 'a' wbof va cnenyyry
+cne2-bx     vzzrqvngryl erghea 0 vs cne2 vf bx, 1 vs abg
+qvfnoyr-cne2  vtaber cne2 rira vs vg vf ninvynoyr
+"""
+b = bcgvbaf.Bcgvbaf('ohc sfpx', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+cne2_frghc()
+vs bcg.cne2_bx:
+    vs cne2_bx:
+        flf.rkvg(0)  # 'gehr' va fu
+    ryfr:
+        flf.rkvg(1)
+vs bcg.qvfnoyr_cne2:
+    cne2_bx = 0
+
+tvg.purpx_ercb_be_qvr()
+
+vs abg rkgen:
+    qroht('sfpx: Ab svyranzrf tvira: purpxvat nyy cnpxf.\a')
+    rkgen = tybo.tybo(tvg.ercb('bowrpgf/cnpx/*.cnpx'))
+
+pbqr = 0
+pbhag = 0
+bhgfgnaqvat = {}
+sbe anzr va rkgen:
+    vs anzr.raqfjvgu('.cnpx'):
+        onfr = anzr[:-5]
+    ryvs anzr.raqfjvgu('.vqk'):
+        onfr = anzr[:-4]
+    ryvs anzr.raqfjvgu('.cne2'):
+        onfr = anzr[:-5]
+    ryvs bf.cngu.rkvfgf(anzr + '.cnpx'):
+        onfr = anzr
+    ryfr:
+        envfr Rkprcgvba('%f vf abg n cnpx svyr!' % anzr)
+    (qve,ynfg) = bf.cngu.fcyvg(onfr)
+    cne2_rkvfgf = bf.cngu.rkvfgf(onfr + '.cne2')
+    vs cne2_rkvfgf naq bf.fgng(onfr + '.cne2').fg_fvmr == 0:
+        cne2_rkvfgf = 0
+    flf.fgqbhg.syhfu()
+    qroht('sfpx: purpxvat %f (%f)\a' 
+          % (ynfg, cne2_bx naq cne2_rkvfgf naq 'cne2' be 'tvg'))
+    vs abg bcg.ireobfr:
+        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+    
+    vs abg bcg.wbof:
+        ap = qb_cnpx(onfr, ynfg)
+        pbqr = pbqr be ap
+        pbhag += 1
+    ryfr:
+        juvyr yra(bhgfgnaqvat) >= bcg.wbof:
+            (cvq,ap) = bf.jnvg()
+            ap >>= 8
+            vs cvq va bhgfgnaqvat:
+                qry bhgfgnaqvat[cvq]
+                pbqr = pbqr be ap
+                pbhag += 1
+        cvq = bf.sbex()
+        vs cvq:  # cnerag
+            bhgfgnaqvat[cvq] = 1
+        ryfr: # puvyq
+            gel:
+                flf.rkvg(qb_cnpx(onfr, ynfg))
+            rkprcg Rkprcgvba, r:
+                ybt('rkprcgvba: %e\a' % r)
+                flf.rkvg(99)
+                
+juvyr yra(bhgfgnaqvat):
+    (cvq,ap) = bf.jnvg()
+    ap >>= 8
+    vs cvq va bhgfgnaqvat:
+        qry bhgfgnaqvat[cvq]
+        pbqr = pbqr be ap
+        pbhag += 1
+    vs abg bcg.ireobfr:
+        cebterff('sfpx (%q/%q)\e' % (pbhag, yra(rkgen)))
+
+vs abg bcg.ireobfr naq vfggl:
+    ybt('sfpx qbar.           \a')
+flf.rkvg(pbqr)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, fgehpg, trgbcg, fhocebprff, fvtany
+sebz ohc vzcbeg bcgvbaf, ffu
+sebz ohc.urycref vzcbeg *
+
+bcgfcrp = """
+ohc eonpxhc <ubfganzr> vaqrk ...
+ohc eonpxhc <ubfganzr> fnir ...
+ohc eonpxhc <ubfganzr> fcyvg ...
+"""
+b = bcgvbaf.Bcgvbaf('ohc eonpxhc', bcgfcrp, bcgshap=trgbcg.trgbcg)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+vs yra(rkgen) < 2:
+    b.sngny('nethzragf rkcrpgrq')
+
+pynff FvtRkprcgvba(Rkprcgvba):
+    qrs __vavg__(frys, fvtahz):
+        frys.fvtahz = fvtahz
+        Rkprcgvba.__vavg__(frys, 'fvtany %q erprvirq' % fvtahz)
+qrs unaqyre(fvtahz, senzr):
+    envfr FvtRkprcgvba(fvtahz)
+
+fvtany.fvtany(fvtany.FVTGREZ, unaqyre)
+fvtany.fvtany(fvtany.FVTVAG, unaqyre)
+
+fc = Abar
+c = Abar
+erg = 99
+
+gel:
+    ubfganzr = rkgen[0]
+    neti = rkgen[1:]
+    c = ffu.pbaarpg(ubfganzr, 'eonpxhc-freire')
+
+    netif = '\0'.wbva(['ohc'] + neti)
+    c.fgqva.jevgr(fgehpg.cnpx('!V', yra(netif)) + netif)
+    c.fgqva.syhfu()
+
+    znva_rkr = bf.raiveba.trg('OHC_ZNVA_RKR') be flf.neti[0]
+    fc = fhocebprff.Cbcra([znva_rkr, 'freire'], fgqva=c.fgqbhg, fgqbhg=c.fgqva)
+
+    c.fgqva.pybfr()
+    c.fgqbhg.pybfr()
+
+svanyyl:
+    juvyr 1:
+        # vs jr trg n fvtany juvyr jnvgvat, jr unir gb xrrc jnvgvat, whfg
+        # va pnfr bhe puvyq qbrfa'g qvr.
+        gel:
+            erg = c.jnvg()
+            fc.jnvg()
+            oernx
+        rkprcg FvtRkprcgvba, r:
+            ybt('\aohc eonpxhc: %f\a' % r)
+            bf.xvyy(c.cvq, r.fvtahz)
+            erg = 84
+flf.rkvg(erg)
+#!/hfe/ova/rai clguba
+vzcbeg flf, bf, er
+sebz ohc vzcbeg bcgvbaf
+
+bcgfcrp = """
+ohc arjyvare
+"""
+b = bcgvbaf.Bcgvbaf('ohc arjyvare', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+e = er.pbzcvyr(e'([\e\a])')
+ynfgyra = 0
+nyy = ''
+juvyr 1:
+    y = e.fcyvg(nyy, 1)
+    vs yra(y) <= 1:
+        gel:
+            o = bf.ernq(flf.fgqva.svyrab(), 4096)
+        rkprcg XrlobneqVagreehcg:
+            oernx
+        vs abg o:
+            oernx
+        nyy += o
+    ryfr:
+        nffreg(yra(y) == 3)
+        (yvar, fcyvgpune, nyy) = y
+        #fcyvgpune = '\a'
+        flf.fgqbhg.jevgr('%-*f%f' % (ynfgyra, yvar, fcyvgpune))
+        vs fcyvgpune == '\e':
+            ynfgyra = yra(yvar)
+        ryfr:
+            ynfgyra = 0
+        flf.fgqbhg.syhfu()
+
+vs ynfgyra be nyy:
+    flf.fgqbhg.jevgr('%-*f\a' % (ynfgyra, nyy))
+#!/hfe/ova/rai clguba
+vzcbeg flf
+sebz ohc vzcbeg bcgvbaf, tvg, _unfufcyvg
+sebz ohc.urycref vzcbeg *
+
+
+bcgfcrp = """
+ohc znetva
+"""
+b = bcgvbaf.Bcgvbaf('ohc znetva', bcgfcrp)
+(bcg, syntf, rkgen) = b.cnefr(flf.neti[1:])
+
+vs rkgen:
+    b.sngny("ab nethzragf rkcrpgrq")
+
+tvg.purpx_ercb_be_qvr()
+#tvg.vtaber_zvqk = 1
+
+zv = tvg.CnpxVqkYvfg(tvg.ercb('bowrpgf/cnpx'))
+ynfg = '\0'*20
+ybatzngpu = 0
+sbe v va zv:
+    vs v == ynfg:
+        pbagvahr
+    #nffreg(fge(v) >= ynfg)
+    cz = _unfufcyvg.ovgzngpu(ynfg, v)
+    ybatzngpu = znk(ybatzngpu, cz)
+    ynfg = v
+cevag ybatzngpu
index d7f0b48f5dfd4dfb4819de87829703a57315102b..b024fe17d7882513256f322129af131f1e8d1f13 100644 (file)
@@ -10,13 +10,13 @@ _wvtop="$(pwd)"
 wvmktempdir ()
 {
     local script_name="$(basename $0)"
-    mkdir -p "$_wvtop/t/tmp" || exit $?
-    mktemp -d "$_wvtop/t/tmp/$script_name-XXXXXXX" || exit $?
+    mkdir -p "$_wvtop/test/tmp" || exit $?
+    mktemp -d "$_wvtop/test/tmp/$script_name-XXXXXXX" || exit $?
 }
 
 wvmkmountpt ()
 {
     local script_name="$(basename $0)"
-    mkdir -p "$_wvtop/t/mnt" || exit $?
-    mktemp -d "$_wvtop/t/mnt/$script_name-XXXXXXX" || exit $?
+    mkdir -p "$_wvtop/test/mnt" || exit $?
+    mktemp -d "$_wvtop/test/mnt/$script_name-XXXXXXX" || exit $?
 }
index 9d3ee497ab715c8e2322c7e6a855d585f0679aee..8451b3e45378d0055f11534f321eebc657e70706 100755 (executable)
--- a/wvtest.py
+++ b/wvtest.py
@@ -22,6 +22,8 @@ import re
 import sys
 import traceback
 
+sys.path[:0] = [os.path.realpath('test/lib')]
+
 _start_dir = os.getcwd()
 
 # NOTE